Merge remote-tracking branch 'aosp/upstream-mirror' into aosp/master

Exempt-From-Owner-Approval:I need to be added to OWNERS list.

Test: m ANGLE
Change-Id: If68378bd88898adbd75ce51b154175a9e49b3790
diff --git a/.gitignore b/.gitignore
index 6d9040a..d37b797 100644
--- a/.gitignore
+++ b/.gitignore
@@ -93,3 +93,6 @@
 Release_x64/
 TestResults.qpa
 .idea/
+
+# Any temporary files will confuse code generation.
+!scripts/code_generation_hashes/*
diff --git a/Android.bp b/Android.bp
index 7f27048..cac04e5 100644
--- a/Android.bp
+++ b/Android.bp
@@ -16,7 +16,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -91,7 +91,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -176,7 +176,7 @@
         "-DANGLE_ENABLE_VULKAN",
         "-DANGLE_USE_ABSEIL",
         "-DANGLE_USE_CUSTOM_VULKAN_CMD_BUFFERS=1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -251,7 +251,7 @@
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
         "-DANGLE_USE_EGL_LOADER",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DEGL_EGLEXT_PROTOTYPES",
@@ -344,7 +344,7 @@
         "libnativewindow",
     ],
     srcs: [
-        "src/libEGL/libEGL.cpp",
+        "src/libEGL/libEGL_autogen.cpp",
     ],
     sdk_version: "28",
     cflags: [
@@ -355,7 +355,7 @@
         "-DANGLE_GLESV2_LIBRARY_NAME=\"libGLESv2_angle\"",
         "-DANGLE_USE_ABSEIL",
         "-DANGLE_USE_EGL_LOADER",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DEGLAPI=__attribute__((visibility(\"default\")))",
@@ -418,7 +418,6 @@
     defaults: [
         "angle_includes",
         "angle_libEGL_egl_loader",
-        "angle_system_utils",
         "angle_version",
     ],
 }
@@ -455,7 +454,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DEGL_EGLEXT_PROTOTYPES",
@@ -530,7 +529,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -596,7 +595,7 @@
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
         "-DANGLE_SHARED_LIBVULKAN=1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -698,7 +697,7 @@
         "-DANGLE_USE_ABSEIL",
         "-DANGLE_VK_LAYERS_DIR=\"angledata\"",
         "-DANGLE_VK_MOCK_ICD_JSON=\"angledata/VkICD_mock_icd.json\"",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -772,7 +771,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -833,7 +832,7 @@
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
         "-DANGLE_SHARED_LIBVULKAN=1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -917,7 +916,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -971,7 +970,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -1084,7 +1083,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DGLSLANG_ANGLE",
@@ -1150,7 +1149,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -1226,7 +1225,7 @@
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
         "-DANGLE_USE_ABSEIL",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -1378,7 +1377,7 @@
         "-DANGLE_SHARED_LIBVULKAN=1",
         "-DANGLE_USE_ABSEIL",
         "-DANGLE_USE_CUSTOM_VULKAN_CMD_BUFFERS=1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -1523,7 +1522,7 @@
         "-DANGLE_ENABLE_VULKAN",
         "-DANGLE_USE_ABSEIL",
         "-DANGLE_USE_CUSTOM_VULKAN_CMD_BUFFERS=1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -1621,7 +1620,7 @@
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
         "-DANGLE_USE_ABSEIL",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -1774,7 +1773,7 @@
         "src/compiler/translator/tree_ops/PruneEmptyCases.cpp",
         "src/compiler/translator/tree_ops/PruneNoOps.cpp",
         "src/compiler/translator/tree_ops/RecordConstantPrecision.cpp",
-        "src/compiler/translator/tree_ops/RecordUniformBlocksTranslatedToStructuredBuffers.cpp",
+        "src/compiler/translator/tree_ops/RecordUniformBlocksWithLargeArrayMember.cpp",
         "src/compiler/translator/tree_ops/RegenerateStructNames.cpp",
         "src/compiler/translator/tree_ops/RemoveArrayLengthMethod.cpp",
         "src/compiler/translator/tree_ops/RemoveAtomicCounterBuiltins.cpp",
@@ -1831,7 +1830,7 @@
         "-DANGLE_ENABLE_GLSL",
         "-DANGLE_ENABLE_VULKAN",
         "-DANGLE_USE_ABSEIL",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -1901,7 +1900,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -1985,7 +1984,7 @@
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
         "-DANGLE_USE_ABSEIL",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -2070,7 +2069,7 @@
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
         "-DANGLE_USE_ABSEIL",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -2157,7 +2156,7 @@
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
         "-DANGLE_USE_ABSEIL",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -2226,7 +2225,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -2307,7 +2306,7 @@
         "-DANGLE_ENABLE_VULKAN",
         "-DANGLE_USE_ABSEIL",
         "-DANGLE_USE_CUSTOM_VULKAN_CMD_BUFFERS=1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -2376,7 +2375,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -2452,7 +2451,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -2529,7 +2528,7 @@
                 "-DANDROID_NDK_VERSION_ROLL=r20_1",
                 "-DARMV8_OS_ANDROID",
                 "-DCRC32_ARMV8_CRC32",
-                "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+                "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
                 "-DCR_LIBCXX_REVISION=375504",
                 "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
                 "-DHAVE_SYS_UIO_H",
@@ -2574,7 +2573,7 @@
                 "-DANDROID_NDK_VERSION_ROLL=r20_1",
                 "-DARMV8_OS_ANDROID",
                 "-DCRC32_ARMV8_CRC32",
-                "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+                "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
                 "-DCR_LIBCXX_REVISION=375504",
                 "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
                 "-DHAVE_SYS_UIO_H",
@@ -2622,7 +2621,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -2678,7 +2677,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -2753,7 +2752,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -2825,7 +2824,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -2923,7 +2922,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -2992,78 +2991,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
-        "-DCR_LIBCXX_REVISION=375504",
-        "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
-        "-DHAVE_SYS_UIO_H",
-        "-DNDEBUG",
-        "-DNVALGRIND",
-        "-D_FORTIFY_SOURCE=2",
-        "-D_GNU_SOURCE",
-        "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
-        "-D_LIBCPP_ENABLE_NODISCARD",
-        "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
-        "-D__STDC_CONSTANT_MACROS",
-        "-D__STDC_FORMAT_MACROS",
-        "-Wno-builtin-assume-aligned-alignment",
-        "-Wno-builtin-macro-redefined",
-        "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
-        "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
-        "-Wno-implicit-int-float-conversion",
-        "-Wno-missing-field-initializers",
-        "-Wno-non-c-typedef-for-linkage",
-        "-Wno-psabi",
-        "-Wno-trigraphs",
-        "-Wno-undefined-var-template",
-        "-Wno-unknown-warning-option",
-        "-Wno-unneeded-internal-declaration",
-        "-Wno-unused-parameter",
-    ],
-    arch: {
-        x86_64: {
-            cflags: [
-                "-DANGLE_IS_64_BIT_CPU",
-                "-Wno-max-tokens",
-            ],
-        },
-        x86: {
-            cflags: [
-                "-DANGLE_IS_32_BIT_CPU",
-                "-Wno-max-tokens",
-            ],
-        },
-        arm: {
-            cflags: [
-                "-DANGLE_IS_32_BIT_CPU",
-            ],
-        },
-        arm64: {
-            cflags: [
-                "-DANGLE_IS_64_BIT_CPU",
-            ],
-        },
-    },
-}
-cc_defaults {
-    name: "angle_system_utils",
-    stl: "libc++_static",
-    local_include_dirs: [
-        "include/",
-        "src/",
-    ],
-    srcs: [
-        "src/common/system_utils.cpp",
-        "src/common/system_utils_linux.cpp",
-        "src/common/system_utils_posix.cpp",
-    ],
-    sdk_version: "28",
-    cflags: [
-        "-DANDROID",
-        "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -3130,7 +3058,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -3204,7 +3132,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -3266,7 +3194,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -3331,7 +3259,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -3395,7 +3323,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -3458,7 +3386,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -3524,7 +3452,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -3587,7 +3515,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -3656,7 +3584,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -3728,7 +3656,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -3803,7 +3731,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -3868,7 +3796,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -3929,7 +3857,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -3987,7 +3915,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -4050,7 +3978,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -4115,7 +4043,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -4173,7 +4101,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -4231,7 +4159,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -4293,7 +4221,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -4365,7 +4293,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -4433,7 +4361,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -4499,7 +4427,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -4557,7 +4485,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -4618,7 +4546,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -4677,7 +4605,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -4738,7 +4666,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -4800,7 +4728,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -4865,7 +4793,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -4938,7 +4866,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -4997,7 +4925,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -5063,7 +4991,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -5122,7 +5050,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -5191,7 +5119,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -5253,7 +5181,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -5314,7 +5242,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -5381,7 +5309,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -5462,7 +5390,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -5530,7 +5458,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -5592,7 +5520,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -5641,6 +5569,69 @@
     ],
 }
 cc_defaults {
+    name: "third_party_abseil_cpp_absl_hash_wyhash",
+    stl: "libc++_static",
+    local_include_dirs: [
+        "",
+        "third_party/abseil-cpp/",
+    ],
+    srcs: [
+        "third_party/abseil-cpp/absl/hash/internal/wyhash.cc",
+    ],
+    sdk_version: "28",
+    cflags: [
+        "-DABSL_ALLOCATOR_NOTHROW=1",
+        "-DANDROID",
+        "-DANDROID_NDK_VERSION_ROLL=r20_1",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
+        "-DCR_LIBCXX_REVISION=375504",
+        "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
+        "-DHAVE_SYS_UIO_H",
+        "-DNDEBUG",
+        "-DNVALGRIND",
+        "-D_GNU_SOURCE",
+        "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
+        "-D_LIBCPP_ENABLE_NODISCARD",
+        "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
+        "-Wno-builtin-assume-aligned-alignment",
+        "-Wno-builtin-macro-redefined",
+        "-Wno-c++11-narrowing",
+        "-Wno-deprecated-copy",
+        "-Wno-final-dtor-non-final-class",
+        "-Wno-ignored-pragma-optimize",
+        "-Wno-implicit-fallthrough",
+        "-Wno-implicit-int-float-conversion",
+        "-Wno-misleading-indentation",
+        "-Wno-missing-field-initializers",
+        "-Wno-non-c-typedef-for-linkage",
+        "-Wno-psabi",
+        "-Wno-sign-conversion",
+        "-Wno-trigraphs",
+        "-Wno-undefined-var-template",
+        "-Wno-unknown-warning-option",
+        "-Wno-unneeded-internal-declaration",
+        "-Wno-unused-parameter",
+        "-Wno-unused-variable",
+    ],
+    arch: {
+        x86_64: {
+            cflags: [
+                "-Wno-max-tokens",
+            ],
+        },
+        x86: {
+            cflags: [
+                "-Wno-max-tokens",
+            ],
+        },
+    },
+    defaults: [
+        "third_party_abseil_cpp_absl_base_config",
+        "third_party_abseil_cpp_absl_base_endian",
+        "third_party_abseil_cpp_absl_numeric_int128",
+    ],
+}
+cc_defaults {
     name: "third_party_abseil_cpp_absl_hash_city",
     stl: "libc++_static",
     local_include_dirs: [
@@ -5655,7 +5646,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -5715,7 +5706,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -5776,7 +5767,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -5835,7 +5826,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -5897,7 +5888,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -5961,7 +5952,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -6020,7 +6011,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -6079,7 +6070,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -6143,7 +6134,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -6205,7 +6196,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -6252,6 +6243,7 @@
         "third_party_abseil_cpp_absl_base_endian",
         "third_party_abseil_cpp_absl_container_fixed_array",
         "third_party_abseil_cpp_absl_hash_city",
+        "third_party_abseil_cpp_absl_hash_wyhash",
         "third_party_abseil_cpp_absl_meta_type_traits",
         "third_party_abseil_cpp_absl_numeric_int128",
         "third_party_abseil_cpp_absl_strings_strings",
@@ -6272,7 +6264,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -6333,7 +6325,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -6392,7 +6384,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -6452,7 +6444,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -6511,7 +6503,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -6572,7 +6564,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -6630,7 +6622,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -6688,7 +6680,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -6743,7 +6735,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -6801,7 +6793,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -6861,7 +6853,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -6955,6 +6947,9 @@
         "src/common/mathutil.cpp",
         "src/common/matrix_utils.cpp",
         "src/common/string_utils.cpp",
+        "src/common/system_utils.cpp",
+        "src/common/system_utils_linux.cpp",
+        "src/common/system_utils_posix.cpp",
         "src/common/third_party/base/anglebase/sha1.cc",
         "src/common/third_party/smhasher/src/PMurHash.cpp",
         "src/common/tls.cpp",
@@ -6967,7 +6962,7 @@
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
         "-DANGLE_USE_ABSEIL",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -7024,7 +7019,6 @@
     defaults: [
         "angle_abseil",
         "angle_includes",
-        "angle_system_utils",
         "angle_version",
         "angle_xxhash",
     ],
@@ -7147,24 +7141,9 @@
         "src/libANGLE/validationES32.cpp",
         "src/libANGLE/validationESEXT.cpp",
         "src/libANGLE/validationGL1.cpp",
-        "src/libANGLE/validationGL11.cpp",
-        "src/libANGLE/validationGL12.cpp",
-        "src/libANGLE/validationGL13.cpp",
-        "src/libANGLE/validationGL14.cpp",
-        "src/libANGLE/validationGL15.cpp",
         "src/libANGLE/validationGL2.cpp",
-        "src/libANGLE/validationGL21.cpp",
         "src/libANGLE/validationGL3.cpp",
-        "src/libANGLE/validationGL31.cpp",
-        "src/libANGLE/validationGL32.cpp",
-        "src/libANGLE/validationGL33.cpp",
         "src/libANGLE/validationGL4.cpp",
-        "src/libANGLE/validationGL41.cpp",
-        "src/libANGLE/validationGL42.cpp",
-        "src/libANGLE/validationGL43.cpp",
-        "src/libANGLE/validationGL44.cpp",
-        "src/libANGLE/validationGL45.cpp",
-        "src/libANGLE/validationGL46.cpp",
     ],
     sdk_version: "28",
     cflags: [
@@ -7177,7 +7156,7 @@
         "-DANGLE_SHARED_LIBVULKAN=1",
         "-DANGLE_USE_ABSEIL",
         "-DANGLE_USE_CUSTOM_VULKAN_CMD_BUFFERS=1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -7288,7 +7267,7 @@
         "-DANGLE_SHARED_LIBVULKAN=1",
         "-DANGLE_USE_ABSEIL",
         "-DANGLE_USE_CUSTOM_VULKAN_CMD_BUFFERS=1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -7359,7 +7338,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -7440,7 +7419,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r20_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -7529,8 +7508,10 @@
         "libvulkan",
     ],
     srcs: [
-        "src/libGLESv2/entry_points_egl.cpp",
-        "src/libGLESv2/entry_points_egl_ext.cpp",
+        "src/libGLESv2/egl_ext_stubs.cpp",
+        "src/libGLESv2/egl_stubs.cpp",
+        "src/libGLESv2/entry_points_egl_autogen.cpp",
+        "src/libGLESv2/entry_points_egl_ext_autogen.cpp",
         "src/libGLESv2/entry_points_gles_1_0_autogen.cpp",
         "src/libGLESv2/entry_points_gles_2_0_autogen.cpp",
         "src/libGLESv2/entry_points_gles_3_0_autogen.cpp",
@@ -7553,7 +7534,7 @@
         "-DANGLE_SHARED_LIBVULKAN=1",
         "-DANGLE_USE_ABSEIL",
         "-DANGLE_USE_CUSTOM_VULKAN_CMD_BUFFERS=1",
-        "-DCR_CLANG_REVISION=\"llvmorg-12-init-11780-g6ef07111-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-12-init-12923-g6ee22ca6-1\"",
         "-DCR_LIBCXX_REVISION=375504",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DEGL_EGLEXT_PROTOTYPES",
diff --git a/BUILD.gn b/BUILD.gn
index 58d38cb..c68a8e5 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -135,6 +135,10 @@
       defines += [ "ANGLE_VULKAN_DISPLAY_MODE_HEADLESS" ]
     }
   }
+
+  if (is_lsan) {
+    defines += [ "ANGLE_WITH_LSAN" ]
+  }
 }
 
 config("constructor_and_destructor_warnings") {
@@ -165,7 +169,6 @@
     cflags += [
       "-Wbad-function-cast",
       "-Wconditional-uninitialized",
-      "-Wdeprecated-copy",
       "-Wextra-semi-stmt",
       "-Wfloat-conversion",
       "-Winconsistent-missing-destructor-override",
@@ -175,8 +178,6 @@
       "-Wredundant-parens",
       "-Wreturn-std-move-in-c++11",
       "-Wshadow-field",
-      "-Wsuggest-destructor-override",
-      "-Wsuggest-override",
       "-Wtautological-type-limit-compare",
       "-Wundefined-reinterpret-cast",
       "-Wunneeded-internal-declaration",
@@ -190,6 +191,14 @@
       "-Wunreachable-code",
       "-Wshorten-64-to-32",
     ]
+    if (!use_xcode_clang) {
+      # Mac catalyst uses a clang version that doesn't have these.
+      cflags += [
+        "-Wdeprecated-copy",
+        "-Wsuggest-destructor-override",
+        "-Wsuggest-override",
+      ]
+    }
   }
 
   if (angle_is_winuwp) {
@@ -289,13 +298,6 @@
   }
 }
 
-angle_source_set("angle_system_utils") {
-  sources = angle_system_utils_sources
-  if (is_linux || is_chromeos) {
-    libs = [ "dl" ]
-  }
-}
-
 angle_source_set("xxhash") {
   sources = xxhash_sources
   if (is_clang) {
@@ -322,7 +324,6 @@
 
   public_deps = [
     ":angle_abseil",
-    ":angle_system_utils",
     ":angle_version",
     ":includes",
   ]
@@ -331,6 +332,10 @@
     all_dependent_configs = [ ":angle_disable_pool_alloc" ]
   }
 
+  if (is_linux || is_chromeos) {
+    libs = [ "dl" ]
+  }
+
   if (is_android && (angle_enable_gl || angle_enable_vulkan)) {
     # In API level 26 ANativeWindow APIs were moved from libandroid.so
     # into a separate library, libnativewindow.so
@@ -435,14 +440,23 @@
     libs += [ "pci" ]
   }
 
-  if (is_mac) {
-    sources += libangle_gpu_info_util_mac_sources
+  if (is_mac || is_ios) {
     frameworks = [
       "IOKit.framework",
       "CoreFoundation.framework",
       "CoreGraphics.framework",
-      "OpenGL.framework",
     ]
+    if (angle_enable_eagl) {
+      frameworks += [ "OpenGLES.framework" ]
+    } else if (angle_enable_cgl) {
+      frameworks += [ "OpenGL.framework" ]
+    }
+    if (is_mac || angle_enable_cgl) {
+      sources += libangle_gpu_info_util_mac_sources
+    }
+    if (is_ios && !angle_enable_cgl) {
+      sources += libangle_gpu_info_util_ios_sources
+    }
   }
 }
 
@@ -732,11 +746,11 @@
   }
 
   # Enable extra Chromium style warnings for libANGLE.
-  if (is_clang && angle_has_build) {
+  if (is_clang && angle_has_build && !use_xcode_clang) {
     suppressed_configs -= [ "//build/config/clang:find_bad_constructs" ]
   }
 
-  if (is_mac) {
+  if (is_mac || is_ios) {
     sources += libangle_mac_sources
   }
 
@@ -835,7 +849,7 @@
 }
 
 config("shared_library_public_config") {
-  if (is_mac && !is_component_build) {
+  if ((is_ios || is_mac) && !is_component_build) {
     # Executable targets that depend on the shared libraries below need to have
     # the rpath setup in non-component build configurations.
     ldflags = [
@@ -1048,12 +1062,11 @@
   }
 
   if (is_win) {
-    sources += [ "src/libEGL/libEGL.def" ]
+    sources += [ "src/libEGL/libEGL_autogen.def" ]
   }
 
   deps = [
     ":angle_common",
-    ":angle_system_utils",
     ":angle_version",
     ":libEGL_egl_loader",
   ]
@@ -1126,7 +1139,7 @@
       "${angle_jsoncpp_dir}:jsoncpp_config",
     ]
 
-    if (is_mac && !is_component_build) {
+    if ((is_ios || is_mac) && !is_component_build) {
       ldflags = [
         "-install_name",
         "@rpath/${target_name}.dylib",
diff --git a/DEPS b/DEPS
index 182c6d5..d1132f8 100644
--- a/DEPS
+++ b/DEPS
@@ -20,16 +20,16 @@
   'checkout_angle_internal': False,
 
   # Version of Chromium our Chromium-based DEPS are mirrored from.
-  'chromium_revision': '62214500294fa2ac3b972b8fcad6cee5022f1e95',
+  'chromium_revision': '2db43e774b6ebb919aea0872f02df8d6fe932848',
   # We never want to checkout chromium,
   # but need a dummy DEPS entry for the autoroller
   'dummy_checkout_chromium': False,
 
   # Current revision of VK-GL-CTS (a.k.a dEQP).
-  'vk_gl_cts_revision': '524e5bcfba33d1b8dede4b4ec1ec33d24ccf8d2c',
+  'vk_gl_cts_revision': '41331850eb212df08e010b4d861992fe0aae6222',
 
   # Current revision of glslang, the Khronos SPIRV compiler.
-  'glslang_revision': '142cb87f803d42f5ae3dd2da8dff4f19f6f15e8c',
+  'glslang_revision': 'c594de23cdd790d64ad5f9c8b059baae0ee2941d',
 
   # Current revision of googletest.
   # Note: this dep cannot be auto-rolled b/c of nesting.
@@ -78,44 +78,44 @@
   'vulkan_headers_revision': '30e70cbd9850560cb55bffadb8017e90c04c42f5',
 
   # Current revision of Khronos Vulkan-Loader.
-  'vulkan_loader_revision': 'b54d55122868fa614df4b387045188ee31f97c07',
+  'vulkan_loader_revision': '02a49daeeeceb077e5ab8c80e87c22dcbb4a102b',
 
   # Current revision of Khronos Vulkan-Tools.
-  'vulkan_tools_revision': '6ef69fbda85ba9a45602ac01cf96c59807561ee3',
+  'vulkan_tools_revision': '0e8c2a5ca5f302f0137550bca1d8557cbaf87ad7',
 
   # Current revision of Khronos Vulkan-ValidationLayers.
-  'vulkan_validation_revision': 'ec5cd38a0ca6824c1ee55ceeb796806412e3c10b',
+  'vulkan_validation_revision': 'ce0450b9e8e54f0b8c6fff185166e1e42e0cf7c2',
 
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': '6e44bd85f3a3d28755833326fdc599afdc6b4274',
+  'catapult_revision': 'd5e21940e048558fb675d0f14b49d638430c8279',
 
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling luci-go
   # and whatever else without interference from each other.
-  'luci_go': 'git_revision:1a022d3a4c50be4207ee93451255d71896416596',
+  'luci_go': 'git_revision:67aba6e3373bb0b9e3ef9871362045736cd29b6e',
 }
 
 deps = {
 
   'build': {
-    'url': '{chromium_git}/chromium/src/build.git@0e1eb49be66b859bf1cbbc4f08b971180c8bded6',
+    'url': '{chromium_git}/chromium/src/build.git@603673306a4c141aeeb27baa6f03b76d41bc13fc',
     'condition': 'not build_with_chromium',
   },
 
   'buildtools': {
-    'url': '{chromium_git}/chromium/src/buildtools.git@6302c1175607a436e18947a5abe9df2209e845fc',
+    'url': '{chromium_git}/chromium/src/buildtools.git@ea9f1f737564cdf5e51b63103de081f5772a6339',
     'condition': 'not build_with_chromium',
   },
 
   'testing': {
-    'url': '{chromium_git}/chromium/src/testing@a71d13aa1cae3d3653f23abf7121fa061560b5d9',
+    'url': '{chromium_git}/chromium/src/testing@19df48277a0a191d0aec34646e781a5899ca1f15',
     'condition': 'not build_with_chromium',
   },
 
   'third_party/abseil-cpp': {
-    'url': '{chromium_git}/chromium/src/third_party/abseil-cpp@207d48e407ee041bb2254d8246cd2031aa5e83e1',
+    'url': '{chromium_git}/chromium/src/third_party/abseil-cpp@dfe5e0a3af4f9337a241b269947f72e632eed78a',
     'condition': 'not build_with_chromium',
   },
 
@@ -170,7 +170,7 @@
 
   # libjpeg_turbo is used by glmark2.
   'third_party/libjpeg_turbo': {
-    'url': '{chromium_git}/chromium/deps/libjpeg_turbo.git@d5148db386ceb4a608058320071cbed890bd6ad2',
+    'url': '{chromium_git}/chromium/deps/libjpeg_turbo.git@e9a659a09e9600883e499c06ede04ba514d7f942',
     'condition': 'not build_with_chromium',
   },
 
@@ -190,12 +190,12 @@
   },
 
   'third_party/protobuf': {
-    'url': '{chromium_git}/chromium/src/third_party/protobuf@d2979b278f4139434a2cc16d833da2b28af5a847',
+    'url': '{chromium_git}/chromium/src/third_party/protobuf@129acc201e9479fd2b273c61a3cf94f8c3ce3852',
     'condition': 'not build_with_chromium',
   },
 
   'third_party/Python-Markdown': {
-    'url': '{chromium_git}/chromium/src/third_party/Python-Markdown@ad4fc19d612de0a3f6ea19441af703ff5a5223f3',
+    'url': '{chromium_git}/chromium/src/third_party/Python-Markdown@2bb7b23b6398f9e79bc2fa8c6bc64a3cf1613ebf',
     'condition': 'not build_with_chromium',
   },
 
@@ -241,7 +241,7 @@
   },
 
   'third_party/SwiftShader': {
-    'url': '{swiftshader_git}/SwiftShader@de9e649438ed3cc2ecf5c30ebf08f033d01270e6',
+    'url': '{swiftshader_git}/SwiftShader@d94a77b304f4fcb503ea037be3e5d7f2a371c4b6',
     'condition': 'not build_with_chromium',
   },
 
@@ -271,12 +271,12 @@
   },
 
   'third_party/zlib': {
-    'url': '{chromium_git}/chromium/src/third_party/zlib@e84c9a3fd75fdc39055b7ae27d6ec508e50bd39e',
+    'url': '{chromium_git}/chromium/src/third_party/zlib@2c183c9f93a328bfb3121284da13cf89a0f7e64a',
     'condition': 'not build_with_chromium',
   },
 
   'tools/clang': {
-    'url': '{chromium_git}/chromium/src/tools/clang.git@2d30d8744f8824a7a7a26d726f16d2caf88be9f2',
+    'url': '{chromium_git}/chromium/src/tools/clang.git@36810de98188eda7bdd6dd578cb5499d16f475b6',
     'condition': 'not build_with_chromium',
   },
 
@@ -311,7 +311,7 @@
   },
 
   'tools/mb': {
-    'url': '{chromium_git}/chromium/src/tools/mb@a63101d578bdfeffa4c420d7d89a1bef54ce77b2',
+    'url': '{chromium_git}/chromium/src/tools/mb@b07b7cb6aa202f85fa905594f47be62862bd96b1',
     'condition': 'not build_with_chromium',
   },
 
@@ -321,7 +321,7 @@
   },
 
   'tools/memory': {
-    'url': '{chromium_git}/chromium/src/tools/memory@f685c086bde38d670a7a3b30ebe1a076d404c140',
+    'url': '{chromium_git}/chromium/src/tools/memory@71214b910decfe2e7cfc8b0ffc072a1b97da2d36',
     'condition': 'not build_with_chromium',
   },
 
@@ -334,7 +334,7 @@
       'packages': [
         {
           'package': 'skia/tools/goldctl/linux-amd64',
-          'version': 'F1V3MxURYBy3ZkQCqWrW-_qo1aZFer1oyHdGOjT_CZoC',
+          'version': 'bTvIvWnbZxg0-7ukJDOeVphyUCuVIkxtui-gilfeBScC',
         },
       ],
       'dep_type': 'cipd',
@@ -345,7 +345,7 @@
       'packages': [
         {
           'package': 'skia/tools/goldctl/windows-amd64',
-          'version': 'qZ2Cb5DPSSKjIrxhfYGgVzooq2ElNVLxNOVjsMKgfV0C',
+          'version': '4UEZlBTjAOzFCQchRqtALQwJDyYXa9Sj_52oUhXmNkoC',
         },
       ],
       'dep_type': 'cipd',
@@ -356,7 +356,7 @@
       'packages': [
         {
           'package': 'skia/tools/goldctl/mac-amd64',
-          'version': 'Z_FxtkL4vnfqaGkZhy2qkTcVwRXIfMzIP0gDJO5O6HkC',
+          'version': '6s5TRj110nqaPlBS8YO4HN2dRmhheX7a-pp3YWURcnoC',
         },
       ],
       'dep_type': 'cipd',
diff --git a/doc/DevSetupAndroid.md b/doc/DevSetupAndroid.md
index 6139fc7..25df4b0 100644
--- a/doc/DevSetupAndroid.md
+++ b/doc/DevSetupAndroid.md
@@ -121,6 +121,8 @@
 adb shell settings put global angle_gl_driver_selection_values <driver 1>,<driver 2>,<driver 3>,...
 ```
 ## ANGLE for *all* OpenGL ES apps
+`Note: This method only works on a device with root access.`
+
 Enable:
 ```
 adb shell settings put global angle_gl_driver_all_angle 1
diff --git a/gni/angle.gni b/gni/angle.gni
index 3540819..87b9777 100644
--- a/gni/angle.gni
+++ b/gni/angle.gni
@@ -36,12 +36,14 @@
     is_ubsan = false
     is_tsan = false
     is_asan = false
+    is_lsan = false
     build_with_chromium = false
     dcheck_always_on = false
     angle_use_x11 = (is_linux || is_chromeos) && !is_ggp
     use_ozone = false
     ozone_platform_gbm = false
     use_fuzzing_engine = false
+    use_xcode_clang = false
   }
 
   declare_args() {
@@ -144,9 +146,17 @@
 
   # Disable performance counter output by default
   angle_enable_perf_counter_output = false
+
+  # We should use EAGL (ES) on iOS except on Mac Catalyst on Intel CPUs, which uses CGL (desktop GL).
+  angle_enable_eagl = angle_enable_gl && is_ios &&
+                      !(target_environment == "catalyst" &&
+                        (target_cpu == "x86" || target_cpu == "x64"))
 }
 
 declare_args() {
+  # TODO(jdarpinian): Support enabling CGL and EAGL at the same time using the soft linking code. Also support disabling both for Metal-only builds.
+  angle_enable_cgl = angle_enable_gl && !angle_enable_eagl && (is_mac || is_ios)
+
   angle_has_histograms = angle_has_build
 }
 
diff --git a/include/EGL/egl.h b/include/EGL/egl.h
index 9ef20d5..6e05b15 100644
--- a/include/EGL/egl.h
+++ b/include/EGL/egl.h
@@ -6,34 +6,15 @@
 #endif
 
 /*
-** Copyright (c) 2013-2017 The Khronos Group Inc.
+** Copyright 2013-2020 The Khronos Group Inc.
+** SPDX-License-Identifier: Apache-2.0
 **
-** Permission is hereby granted, free of charge, to any person obtaining a
-** copy of this software and/or associated documentation files (the
-** "Materials"), to deal in the Materials without restriction, including
-** without limitation the rights to use, copy, modify, merge, publish,
-** distribute, sublicense, and/or sell copies of the Materials, and to
-** permit persons to whom the Materials are furnished to do so, subject to
-** the following conditions:
-**
-** The above copyright notice and this permission notice shall be included
-** in all copies or substantial portions of the Materials.
-**
-** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
-*/
-/*
 ** This header is generated from the Khronos EGL XML API Registry.
 ** The current version of the Registry, generator scripts
 ** used to make the header, and the header can be found at
 **   http://www.khronos.org/registry/egl
 **
-** Khronos $Git commit SHA1: cb927ca98d $ on $Git commit date: 2019-08-08 01:05:38 -0700 $
+** Khronos $Git commit SHA1: 5a9a7e3fcb $ on $Git commit date: 2020-08-24 11:05:32 -0700 $
 */
 
 #include <EGL/eglplatform.h>
@@ -42,7 +23,7 @@
 #define EGL_EGL_PROTOTYPES 1
 #endif
 
-/* Generated on date 20190808 */
+/* Generated on date 20201001 */
 
 /* Generated C header for:
  * API: egl
diff --git a/include/EGL/eglext.h b/include/EGL/eglext.h
index c507f1e..7765187 100644
--- a/include/EGL/eglext.h
+++ b/include/EGL/eglext.h
@@ -6,39 +6,20 @@
 #endif
 
 /*
-** Copyright (c) 2013-2017 The Khronos Group Inc.
+** Copyright 2013-2020 The Khronos Group Inc.
+** SPDX-License-Identifier: Apache-2.0
 **
-** Permission is hereby granted, free of charge, to any person obtaining a
-** copy of this software and/or associated documentation files (the
-** "Materials"), to deal in the Materials without restriction, including
-** without limitation the rights to use, copy, modify, merge, publish,
-** distribute, sublicense, and/or sell copies of the Materials, and to
-** permit persons to whom the Materials are furnished to do so, subject to
-** the following conditions:
-**
-** The above copyright notice and this permission notice shall be included
-** in all copies or substantial portions of the Materials.
-**
-** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
-*/
-/*
 ** This header is generated from the Khronos EGL XML API Registry.
 ** The current version of the Registry, generator scripts
 ** used to make the header, and the header can be found at
 **   http://www.khronos.org/registry/egl
 **
-** Khronos $Git commit SHA1: cb927ca98d $ on $Git commit date: 2019-08-08 01:05:38 -0700 $
+** Khronos $Git commit SHA1: 5a9a7e3fcb $ on $Git commit date: 2020-08-24 11:05:32 -0700 $
 */
 
 #include <EGL/eglplatform.h>
 
-#define EGL_EGLEXT_VERSION 20190808
+#define EGL_EGLEXT_VERSION 20201001
 
 /* Generated C header for:
  * API: egl
@@ -443,9 +424,9 @@
 
 #ifndef EGL_KHR_swap_buffers_with_damage
 #define EGL_KHR_swap_buffers_with_damage 1
-typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSWITHDAMAGEKHRPROC) (EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSWITHDAMAGEKHRPROC) (EGLDisplay dpy, EGLSurface surface, const EGLint *rects, EGLint n_rects);
 #ifdef EGL_EGLEXT_PROTOTYPES
-EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffersWithDamageKHR (EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects);
+EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffersWithDamageKHR (EGLDisplay dpy, EGLSurface surface, const EGLint *rects, EGLint n_rects);
 #endif
 #endif /* EGL_KHR_swap_buffers_with_damage */
 
@@ -598,6 +579,12 @@
 #define EGL_FIXED_SIZE_ANGLE              0x3201
 #endif /* EGL_ANGLE_window_fixed_size */
 
+#ifndef EGL_ARM_image_format
+#define EGL_ARM_image_format 1
+#define EGL_COLOR_COMPONENT_TYPE_UNSIGNED_INTEGER_ARM 0x3287
+#define EGL_COLOR_COMPONENT_TYPE_INTEGER_ARM 0x3288
+#endif /* EGL_ARM_image_format */
+
 #ifndef EGL_ARM_implicit_external_sync
 #define EGL_ARM_implicit_external_sync 1
 #define EGL_SYNC_PRIOR_COMMANDS_IMPLICIT_EXTERNAL_ARM 0x328A
@@ -701,6 +688,11 @@
 #define EGL_EXT_device_query 1
 #endif /* EGL_EXT_device_query */
 
+#ifndef EGL_EXT_device_query_name
+#define EGL_EXT_device_query_name 1
+#define EGL_RENDERER_EXT                  0x335F
+#endif /* EGL_EXT_device_query_name */
+
 #ifndef EGL_EXT_gl_colorspace_bt2020_linear
 #define EGL_EXT_gl_colorspace_bt2020_linear 1
 #define EGL_GL_COLORSPACE_BT2020_LINEAR_EXT 0x333F
@@ -877,6 +869,12 @@
 #define EGL_PLATFORM_X11_SCREEN_EXT       0x31D6
 #endif /* EGL_EXT_platform_x11 */
 
+#ifndef EGL_EXT_platform_xcb
+#define EGL_EXT_platform_xcb 1
+#define EGL_PLATFORM_XCB_EXT              0x31DC
+#define EGL_PLATFORM_XCB_SCREEN_EXT       0x31DE
+#endif /* EGL_EXT_platform_xcb */
+
 #ifndef EGL_EXT_protected_content
 #define EGL_EXT_protected_content 1
 #define EGL_PROTECTED_CONTENT_EXT         0x32C0
@@ -917,9 +915,9 @@
 
 #ifndef EGL_EXT_swap_buffers_with_damage
 #define EGL_EXT_swap_buffers_with_damage 1
-typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC) (EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC) (EGLDisplay dpy, EGLSurface surface, const EGLint *rects, EGLint n_rects);
 #ifdef EGL_EGLEXT_PROTOTYPES
-EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffersWithDamageEXT (EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects);
+EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffersWithDamageEXT (EGLDisplay dpy, EGLSurface surface, const EGLint *rects, EGLint n_rects);
 #endif
 #endif /* EGL_EXT_swap_buffers_with_damage */
 
@@ -1143,6 +1141,24 @@
 #define EGL_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV 0x334C
 #endif /* EGL_NV_robustness_video_memory_purge */
 
+#ifndef EGL_NV_stream_consumer_eglimage
+#define EGL_NV_stream_consumer_eglimage 1
+#define EGL_STREAM_CONSUMER_IMAGE_NV      0x3373
+#define EGL_STREAM_IMAGE_ADD_NV           0x3374
+#define EGL_STREAM_IMAGE_REMOVE_NV        0x3375
+#define EGL_STREAM_IMAGE_AVAILABLE_NV     0x3376
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMIMAGECONSUMERCONNECTNVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLint num_modifiers, EGLuint64KHR *modifiers, EGLAttrib *attrib_list);
+typedef EGLint (EGLAPIENTRYP PFNEGLQUERYSTREAMCONSUMEREVENTNVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLTime timeout, EGLenum *event, EGLAttrib *aux);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMACQUIREIMAGENVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLImage *pImage, EGLSync sync);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMRELEASEIMAGENVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLImage image, EGLSync sync);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglStreamImageConsumerConnectNV (EGLDisplay dpy, EGLStreamKHR stream, EGLint num_modifiers, EGLuint64KHR *modifiers, EGLAttrib *attrib_list);
+EGLAPI EGLint EGLAPIENTRY eglQueryStreamConsumerEventNV (EGLDisplay dpy, EGLStreamKHR stream, EGLTime timeout, EGLenum *event, EGLAttrib *aux);
+EGLAPI EGLBoolean EGLAPIENTRY eglStreamAcquireImageNV (EGLDisplay dpy, EGLStreamKHR stream, EGLImage *pImage, EGLSync sync);
+EGLAPI EGLBoolean EGLAPIENTRY eglStreamReleaseImageNV (EGLDisplay dpy, EGLStreamKHR stream, EGLImage image, EGLSync sync);
+#endif
+#endif /* EGL_NV_stream_consumer_eglimage */
+
 #ifndef EGL_NV_stream_consumer_gltexture_yuv
 #define EGL_NV_stream_consumer_gltexture_yuv 1
 #define EGL_YUV_PLANE0_TEXTURE_UNIT_NV    0x332C
@@ -1362,6 +1378,40 @@
 #define EGL_NATIVE_SURFACE_TIZEN          0x32A1
 #endif /* EGL_TIZEN_image_native_surface */
 
+#ifndef EGL_WL_bind_wayland_display
+#define EGL_WL_bind_wayland_display 1
+#define PFNEGLBINDWAYLANDDISPLAYWL PFNEGLBINDWAYLANDDISPLAYWLPROC
+#define PFNEGLUNBINDWAYLANDDISPLAYWL PFNEGLUNBINDWAYLANDDISPLAYWLPROC
+#define PFNEGLQUERYWAYLANDBUFFERWL PFNEGLQUERYWAYLANDBUFFERWLPROC
+struct wl_display;
+struct wl_resource;
+#define EGL_WAYLAND_BUFFER_WL             0x31D5
+#define EGL_WAYLAND_PLANE_WL              0x31D6
+#define EGL_TEXTURE_Y_U_V_WL              0x31D7
+#define EGL_TEXTURE_Y_UV_WL               0x31D8
+#define EGL_TEXTURE_Y_XUXV_WL             0x31D9
+#define EGL_TEXTURE_EXTERNAL_WL           0x31DA
+#define EGL_WAYLAND_Y_INVERTED_WL         0x31DB
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLBINDWAYLANDDISPLAYWLPROC) (EGLDisplay dpy, struct wl_display *display);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLUNBINDWAYLANDDISPLAYWLPROC) (EGLDisplay dpy, struct wl_display *display);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYWAYLANDBUFFERWLPROC) (EGLDisplay dpy, struct wl_resource *buffer, EGLint attribute, EGLint *value);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglBindWaylandDisplayWL (EGLDisplay dpy, struct wl_display *display);
+EGLAPI EGLBoolean EGLAPIENTRY eglUnbindWaylandDisplayWL (EGLDisplay dpy, struct wl_display *display);
+EGLAPI EGLBoolean EGLAPIENTRY eglQueryWaylandBufferWL (EGLDisplay dpy, struct wl_resource *buffer, EGLint attribute, EGLint *value);
+#endif
+#endif /* EGL_WL_bind_wayland_display */
+
+#ifndef EGL_WL_create_wayland_buffer_from_image
+#define EGL_WL_create_wayland_buffer_from_image 1
+#define PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWL PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWLPROC
+struct wl_buffer;
+typedef struct wl_buffer *(EGLAPIENTRYP PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWLPROC) (EGLDisplay dpy, EGLImageKHR image);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI struct wl_buffer *EGLAPIENTRY eglCreateWaylandBufferFromImageWL (EGLDisplay dpy, EGLImageKHR image);
+#endif
+#endif /* EGL_WL_create_wayland_buffer_from_image */
+
 /* ANGLE EGL extensions */
 #include "eglext_angle.h"
 
diff --git a/include/EGL/eglext_angle.h b/include/EGL/eglext_angle.h
index c56213b..68c149c 100644
--- a/include/EGL/eglext_angle.h
+++ b/include/EGL/eglext_angle.h
@@ -204,12 +204,12 @@
 typedef EGLint (EGLAPIENTRYP PFNEGLPROGRAMCACHEGETATTRIBANGLEPROC) (EGLDisplay dpy, EGLenum attrib);
 typedef void (EGLAPIENTRYP PFNEGLPROGRAMCACHEQUERYANGLEPROC) (EGLDisplay dpy, EGLint index, void *key, EGLint *keysize, void *binary, EGLint *binarysize);
 typedef void (EGLAPIENTRYP PFNEGLPROGRAMCACHEPOPULATEANGLEPROC) (EGLDisplay dpy, const void *key, EGLint keysize, const void *binary, EGLint binarysize);
-typedef EGLint (EGLAPIENTRYP PFNEGLPROGRAMCACHERESIZEANGLEPROC) (EGLDisplay dpy, EGLint limit, EGLenum mode);
+typedef EGLint (EGLAPIENTRYP PFNEGLPROGRAMCACHERESIZEANGLEPROC) (EGLDisplay dpy, EGLint limit, EGLint mode);
 #ifdef EGL_EGLEXT_PROTOTYPES
 EGLAPI EGLint EGLAPIENTRY eglProgramCacheGetAttribANGLE(EGLDisplay dpy, EGLenum attrib);
 EGLAPI void EGLAPIENTRY eglProgramCacheQueryANGLE(EGLDisplay dpy, EGLint index, void *key, EGLint *keysize, void *binary, EGLint *binarysize);
 EGLAPI void EGLAPIENTRY eglProgramCachePopulateANGLE(EGLDisplay dpy, const void *key, EGLint keysize, const void *binary, EGLint binarysize);
-EGLAPI EGLint EGLAPIENTRY eglProgramCacheResizeANGLE(EGLDisplay dpy, EGLint limit, EGLenum mode);
+EGLAPI EGLint EGLAPIENTRY eglProgramCacheResizeANGLE(EGLDisplay dpy, EGLint limit, EGLint mode);
 #endif
 #endif /* EGL_ANGLE_program_cache_control */
 
diff --git a/include/EGL/eglplatform.h b/include/EGL/eglplatform.h
index d1cae17..9ebaf00 100644
--- a/include/EGL/eglplatform.h
+++ b/include/EGL/eglplatform.h
@@ -2,36 +2,17 @@
 #define __eglplatform_h_
 
 /*
-** Copyright (c) 2007-2016 The Khronos Group Inc.
-**
-** Permission is hereby granted, free of charge, to any person obtaining a
-** copy of this software and/or associated documentation files (the
-** "Materials"), to deal in the Materials without restriction, including
-** without limitation the rights to use, copy, modify, merge, publish,
-** distribute, sublicense, and/or sell copies of the Materials, and to
-** permit persons to whom the Materials are furnished to do so, subject to
-** the following conditions:
-**
-** The above copyright notice and this permission notice shall be included
-** in all copies or substantial portions of the Materials.
-**
-** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+** Copyright 2007-2020 The Khronos Group Inc.
+** SPDX-License-Identifier: Apache-2.0
 */
 
 /* Platform-specific types and definitions for egl.h
- * $Revision: 30994 $ on $Date: 2015-04-30 13:36:48 -0700 (Thu, 30 Apr 2015) $
  *
  * Adopters may modify khrplatform.h and this file to suit their platform.
  * You are encouraged to submit all modifications to the Khronos group so that
  * they can be included in future versions of this file.  Please submit changes
- * by sending them to the public Khronos Bugzilla (http://khronos.org/bugzilla)
- * by filing a bug against product "EGL" component "Registry".
+ * by filing an issue or pull request on the public Khronos EGL Registry, at
+ * https://www.github.com/KhronosGroup/EGL-Registry/
  */
 
 #include <KHR/khrplatform.h>
@@ -67,7 +48,13 @@
  * implementations.
  */
 
-#if defined(_WIN32) || defined(__VC32__) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) /* Win32 and WinCE */
+#if defined(EGL_NO_PLATFORM_SPECIFIC_TYPES)
+
+typedef void *EGLNativeDisplayType;
+typedef void *EGLNativePixmapType;
+typedef void *EGLNativeWindowType;
+
+#elif defined(_WIN32) || defined(__VC32__) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) /* Win32 and WinCE */
 #ifndef WIN32_LEAN_AND_MEAN
 #define WIN32_LEAN_AND_MEAN 1
 #endif
@@ -83,6 +70,12 @@
 typedef IInspectable* EGLNativeWindowType;
 #endif
 
+#elif defined(__EMSCRIPTEN__)
+
+typedef int EGLNativeDisplayType;
+typedef int EGLNativePixmapType;
+typedef int EGLNativeWindowType;
+
 #elif defined(__WINSCW__) || defined(__SYMBIAN32__)  /* Symbian */
 
 typedef int   EGLNativeDisplayType;
@@ -110,17 +103,17 @@
 typedef struct egl_native_pixmap_t*     EGLNativePixmapType;
 typedef struct ANativeWindow*           EGLNativeWindowType;
 
-#elif defined(USE_OZONE) || defined(USE_SYSTEM_EGL)
+#elif defined(USE_OZONE)
 
 typedef intptr_t EGLNativeDisplayType;
 typedef intptr_t EGLNativePixmapType;
 typedef intptr_t EGLNativeWindowType;
 
-#elif defined(__ggp__)
+#elif defined(__unix__) && defined(EGL_NO_X11)
 
-typedef intptr_t EGLNativeDisplayType;
-typedef intptr_t EGLNativePixmapType;
-typedef intptr_t EGLNativeWindowType;
+typedef void             *EGLNativeDisplayType;
+typedef khronos_uintptr_t EGLNativePixmapType;
+typedef khronos_uintptr_t EGLNativeWindowType;
 
 #elif defined(__unix__) || defined(USE_X11)
 
@@ -148,9 +141,9 @@
 
 #elif defined(__Fuchsia__)
 
-typedef int   EGLNativeDisplayType;
-typedef void *EGLNativePixmapType;
-typedef void *EGLNativeWindowType
+typedef void              *EGLNativeDisplayType;
+typedef khronos_uintptr_t  EGLNativePixmapType;
+typedef khronos_uintptr_t  EGLNativeWindowType;
 
 #else
 #error "Platform not recognized"
diff --git a/include/GLES2/gl2ext_explicit_context_autogen.inc b/include/GLES2/gl2ext_explicit_context_autogen.inc
index 48e8316..ed92953 100644
--- a/include/GLES2/gl2ext_explicit_context_autogen.inc
+++ b/include/GLES2/gl2ext_explicit_context_autogen.inc
@@ -223,6 +223,7 @@
 typedef GLenum (GL_APIENTRYP PFNGLGETGRAPHICSRESETSTATUSEXTCONTEXTANGLEPROC)(GLeglContext ctx);
 typedef void (GL_APIENTRYP PFNGLGETINTEGER64VEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum pname, GLint64 *data);
 typedef void (GL_APIENTRYP PFNGLGETMEMORYOBJECTPARAMETERIVEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint memoryObject, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETOBJECTLABELEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label);
 typedef void (GL_APIENTRYP PFNGLGETOBJECTLABELKHRCONTEXTANGLEPROC)(GLeglContext ctx, GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
 typedef void (GL_APIENTRYP PFNGLGETOBJECTPTRLABELKHRCONTEXTANGLEPROC)(GLeglContext ctx, const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);
 typedef void (GL_APIENTRYP PFNGLGETPOINTERVKHRCONTEXTANGLEPROC)(GLeglContext ctx, GLenum pname, void **params);
@@ -256,6 +257,7 @@
 typedef GLboolean (GL_APIENTRYP PFNGLISQUERYEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint id);
 typedef GLboolean (GL_APIENTRYP PFNGLISSEMAPHOREEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint semaphore);
 typedef GLboolean (GL_APIENTRYP PFNGLISVERTEXARRAYOESCONTEXTANGLEPROC)(GLeglContext ctx, GLuint array);
+typedef void (GL_APIENTRYP PFNGLLABELOBJECTEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum type, GLuint object, GLsizei length, const GLchar *label);
 typedef void *(GL_APIENTRYP PFNGLMAPBUFFEROESCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum access);
 typedef void *(GL_APIENTRYP PFNGLMAPBUFFERRANGEEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
 typedef void (GL_APIENTRYP PFNGLMAXSHADERCOMPILERTHREADSKHRCONTEXTANGLEPROC)(GLeglContext ctx, GLuint count);
@@ -651,6 +653,7 @@
 GL_APICALL GLenum GL_APIENTRY glGetGraphicsResetStatusEXTContextANGLE(GLeglContext ctx);
 GL_APICALL void GL_APIENTRY glGetInteger64vEXTContextANGLE(GLeglContext ctx, GLenum pname, GLint64 *data);
 GL_APICALL void GL_APIENTRY glGetMemoryObjectParameterivEXTContextANGLE(GLeglContext ctx, GLuint memoryObject, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetObjectLabelEXTContextANGLE(GLeglContext ctx, GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label);
 GL_APICALL void GL_APIENTRY glGetObjectLabelKHRContextANGLE(GLeglContext ctx, GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
 GL_APICALL void GL_APIENTRY glGetObjectPtrLabelKHRContextANGLE(GLeglContext ctx, const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);
 GL_APICALL void GL_APIENTRY glGetPointervKHRContextANGLE(GLeglContext ctx, GLenum pname, void **params);
@@ -684,6 +687,7 @@
 GL_APICALL GLboolean GL_APIENTRY glIsQueryEXTContextANGLE(GLeglContext ctx, GLuint id);
 GL_APICALL GLboolean GL_APIENTRY glIsSemaphoreEXTContextANGLE(GLeglContext ctx, GLuint semaphore);
 GL_APICALL GLboolean GL_APIENTRY glIsVertexArrayOESContextANGLE(GLeglContext ctx, GLuint array);
+GL_APICALL void GL_APIENTRY glLabelObjectEXTContextANGLE(GLeglContext ctx, GLenum type, GLuint object, GLsizei length, const GLchar *label);
 GL_APICALL void *GL_APIENTRY glMapBufferOESContextANGLE(GLeglContext ctx, GLenum target, GLenum access);
 GL_APICALL void *GL_APIENTRY glMapBufferRangeEXTContextANGLE(GLeglContext ctx, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
 GL_APICALL void GL_APIENTRY glMaxShaderCompilerThreadsKHRContextANGLE(GLeglContext ctx, GLuint count);
diff --git a/include/GLSLANG/ShaderLang.h b/include/GLSLANG/ShaderLang.h
index adca834..fe6edb8 100644
--- a/include/GLSLANG/ShaderLang.h
+++ b/include/GLSLANG/ShaderLang.h
@@ -26,7 +26,7 @@
 
 // Version number for shader translation API.
 // It is incremented every time the API changes.
-#define ANGLE_SH_VERSION 245
+#define ANGLE_SH_VERSION 246
 
 enum ShShaderSpec
 {
@@ -400,6 +400,8 @@
     int EXT_multisampled_render_to_texture2;
     int EXT_YUV_target;
     int EXT_geometry_shader;
+    int OES_shader_io_blocks;
+    int EXT_shader_io_blocks;
     int EXT_gpu_shader5;
     int EXT_shader_non_constant_global_initializers;
     int OES_texture_storage_multisample_2d_array;
@@ -757,6 +759,7 @@
 
 bool ShouldUniformBlockUseStructuredBuffer(const ShHandle handle,
                                            const std::string &uniformBlockName);
+const std::set<std::string> *GetSlowCompilingUniformBlockSet(const ShHandle handle);
 
 // Gives a map from uniform names to compiler-assigned registers in the default uniform block.
 // Note that the map contains also registers of samplers that have been extracted from structs.
@@ -813,8 +816,10 @@
 {
     LineRasterEmulation = 0,
     SurfaceRotation     = 1,
+    DrawableWidth       = 2,
+    DrawableHeight      = 3,
 
-    InvalidEnum = 2,
+    InvalidEnum = 4,
     EnumCount   = InvalidEnum,
 };
 
@@ -838,8 +843,9 @@
     LineRasterEmulation = 0,
     YFlip               = 1,
     Rotation            = 2,
+    DrawableSize        = 3,
 
-    InvalidEnum = 3,
+    InvalidEnum = 4,
     EnumCount   = InvalidEnum,
 };
 
diff --git a/include/GLSLANG/ShaderVars.h b/include/GLSLANG/ShaderVars.h
index 136113c..c8f1872 100644
--- a/include/GLSLANG/ShaderVars.h
+++ b/include/GLSLANG/ShaderVars.h
@@ -51,11 +51,6 @@
 {
     BLOCK_UNIFORM,
     BLOCK_BUFFER,
-
-    // Required in OpenGL ES 3.1 extension GL_OES_shader_io_blocks.
-    // TODO(jiawei.shao@intel.com): add BLOCK_OUT.
-    // Also used in GLSL
-    BLOCK_IN
 };
 
 // Base class for all variables defined in shaders, including Varyings, Uniforms, etc
@@ -158,7 +153,10 @@
     // necessarily active. GLES 3.0.5 section 2.12.6. GLES 3.1 section 7.3.1.
     bool active;
     std::vector<ShaderVariable> fields;
+    // Struct name is used for varyings of struct type.  Additionally, it's used with shader I/O
+    // blocks, in which case it contains the block name.
     std::string structName;
+    std::string mappedStructName;
 
     // Only applies to interface block fields. Kept here for simplicity.
     bool isRowMajorLayout;
@@ -166,10 +164,18 @@
     // VariableWithLocation
     int location;
 
+    // The location of inputs or outputs without location layout quailifer will be updated to '-1'.
+    // GLES Spec 3.1, Section 7.3. PROGRAM OBJECTS
+    // Not all active variables are assigned valid locations;
+    // the following variables will have an effective location of -1:
+    bool hasImplicitLocation;
+    void resetEffectiveLocation();
+    void updateEffectiveLocation(const sh::ShaderVariable &parent);
+
     // Uniform
     int binding;
     // Decide whether two uniforms are the same at shader link time,
-    // assuming one from vertex shader and the other from fragment shader.
+    // assuming they are from consecutive shader stages.
     // GLSL ES Spec 3.00.3, section 4.3.5.
     // GLSL ES Spec 3.10.4, section 4.4.5
     bool isSameUniformAtLinkTime(const ShaderVariable &other) const;
@@ -187,16 +193,16 @@
 
     // InterfaceBlockField
     // Decide whether two InterfaceBlock fields are the same at shader
-    // link time, assuming one from vertex shader and the other from
-    // fragment shader.
+    // link time, assuming they are from consecutive shader stages.
     // See GLSL ES Spec 3.00.3, sec 4.3.7.
     bool isSameInterfaceBlockFieldAtLinkTime(const ShaderVariable &other) const;
 
     // Varying
     InterpolationType interpolation;
     bool isInvariant;
+    bool isShaderIOBlock;
     // Decide whether two varyings are the same at shader link time,
-    // assuming one from vertex shader and the other from fragment shader.
+    // assuming they are from consecutive shader stages.
     // Invariance needs to match only in ESSL1. Relevant spec sections:
     // GLSL ES 3.00.4, sections 4.6.1 and 4.3.9.
     // GLSL ES 1.00.17, section 4.6.4.
@@ -204,6 +210,10 @@
     // Deprecated version of isSameVaryingAtLinkTime, which assumes ESSL1.
     bool isSameVaryingAtLinkTime(const ShaderVariable &other) const;
 
+    // Shader I/O blocks may match by block name or instance, based on whether both stages have an
+    // instance name or not.
+    bool isSameNameAtLinkTime(const ShaderVariable &other) const;
+
     // If the variable is a sampler that has ever been statically used with texelFetch
     bool texelFetchStaticUse;
 
diff --git a/include/platform/FeaturesVk.h b/include/platform/FeaturesVk.h
index 2adf1fb..0ef4e35 100644
--- a/include/platform/FeaturesVk.h
+++ b/include/platform/FeaturesVk.h
@@ -64,6 +64,13 @@
         "The point size range reported from the API is inconsistent with the actual behavior",
         &members, "http://anglebug.com/2970"};
 
+    // On some NVIDIA drivers the depth value is not clamped to [0,1] for floating point depth
+    // buffers. This is NVIDIA bug 3171019, see http://anglebug.com/3970 for details.
+    Feature depthClamping = {
+        "depth_clamping", FeatureCategory::VulkanWorkarounds,
+        "The depth value is not clamped to [0,1] for floating point depth buffers.", &members,
+        "http://anglebug.com/3970"};
+
     // On some android devices, the memory barrier between the compute shader that converts vertex
     // attributes and the vertex shader that reads from it is ineffective.  Only known workaround is
     // to perform a flush after the conversion.  http://anglebug.com/3016
@@ -293,6 +300,17 @@
         "Fill new allocations with non-zero values to flush out errors.", &members,
         "http://anglebug.com/4384"};
 
+    // Whether to log each callback from the VK_EXT_device_memory_report extension.  This feature is
+    // used for trying to debug GPU memory leaks.
+    Feature logMemoryReportCallbacks = {"logMemoryReportCallbacks", FeatureCategory::VulkanFeatures,
+                                        "Log each callback from VK_EXT_device_memory_report",
+                                        &members};
+
+    // Whether to log statistics from the VK_EXT_device_memory_report extension each eglSwapBuffer.
+    Feature logMemoryReportStats = {"logMemoryReportStats", FeatureCategory::VulkanFeatures,
+                                    "Log stats from VK_EXT_device_memory_report each swap",
+                                    &members};
+
     // Allocate a "shadow" buffer for GL buffer objects. For GPU-read only buffers
     // glMap* latency can be reduced by maintaining a copy of the buffer which is
     // writeable only by the CPU. We then return this shadow buffer on glMap* calls.
@@ -446,6 +464,14 @@
         "forceDriverUniformOverSpecConst", FeatureCategory::VulkanWorkarounds,
         "Forces using driver uniforms instead of specialization constants.", &members,
         "http://issuetracker.google.com/173636783"};
+
+    // Whether non-conformant configurations and extensions should be exposed.  When an extension is
+    // in development, or a GLES version is not supported on a device, we may still want to expose
+    // them for partial testing.  This feature is enabled by our test harness.
+    Feature exposeNonConformantExtensionsAndVersions = {
+        "exposeNonConformantExtensionsAndVersions", FeatureCategory::VulkanWorkarounds,
+        "Expose GLES versions and extensions that are not conformant.", &members,
+        "http://anglebug.com/5375"};
 };
 
 inline FeaturesVk::FeaturesVk()  = default;
diff --git a/infra/ANGLEWrangling.md b/infra/ANGLEWrangling.md
index 3cd2620..28a5ccf 100644
--- a/infra/ANGLEWrangling.md
+++ b/infra/ANGLEWrangling.md
@@ -92,6 +92,7 @@
  * [Vulkan-Loader into ANGLE](https://autoroll.skia.org/r/vulkan-loader-angle-autoroll)
  * [Vulkan-Headers into ANGLE](https://autoroll.skia.org/r/vulkan-headers-angle-autoroll)
  * [Vulkan-ValidationLayers into ANGLE](https://autoroll.skia.org/r/vulkan-validation-layers-angle-autoroll)
+ * [VK-GL-CTS into ANGLE](https://autoroll.skia.org/r/vk-gl-cts-angle-autoroll?tab=status)
 
 Please ensure these rollers are also healthy and unblocked. You can trigger manual rolls using the
 dashboards to land high-priority changes.
diff --git a/scripts/code_generation_hashes/ANGLE_shader_translator.json b/scripts/code_generation_hashes/ANGLE_shader_translator.json
index 7195e50..479aa20 100644
--- a/scripts/code_generation_hashes/ANGLE_shader_translator.json
+++ b/scripts/code_generation_hashes/ANGLE_shader_translator.json
@@ -6,11 +6,11 @@
   "src/compiler/translator/glslang.l":
     "a04170178bdc8511bff69ec4ff144576",
   "src/compiler/translator/glslang.y":
-    "d614cbc19923d104c98e3a5f8770b5be",
+    "1c7a2f4fa0f62ebc42f855bb8a8deeaf",
   "src/compiler/translator/glslang_lex_autogen.cpp":
     "5d6469e58f9855f93987b5ddbd663920",
   "src/compiler/translator/glslang_tab_autogen.cpp":
-    "a93ca4c95c635f4154e41586911d0182",
+    "821a6cccd98a7d89666bfb3fabee3585",
   "src/compiler/translator/glslang_tab_autogen.h":
     "840c12db9f7824afd05b5306c8816d95",
   "tools/flex-bison/linux/bison.sha1":
diff --git "a/scripts/code_generation_hashes/GL_CTS_\050dEQP\051_build_files.json" "b/scripts/code_generation_hashes/GL_CTS_\050dEQP\051_build_files.json"
index fa9d70c..b5e9d19 100644
--- "a/scripts/code_generation_hashes/GL_CTS_\050dEQP\051_build_files.json"
+++ "b/scripts/code_generation_hashes/GL_CTS_\050dEQP\051_build_files.json"
@@ -44,7 +44,7 @@
   "third_party/VK-GL-CTS/src/external/vulkancts/framework/vulkan/CMakeLists.txt":
     "7f90f08bea39abbd86db1503b716a536",
   "third_party/VK-GL-CTS/src/external/vulkancts/modules/vulkan/CMakeLists.txt":
-    "98f3ffc2ceaa64400cb02afd29a2d9c2",
+    "b6caf8c115087a940131e083047acd44",
   "third_party/VK-GL-CTS/src/external/vulkancts/modules/vulkan/amber/CMakeLists.txt":
     "e5a1fa5b0692ef46bd627cd1b35a9da6",
   "third_party/VK-GL-CTS/src/external/vulkancts/modules/vulkan/api/CMakeLists.txt":
@@ -84,7 +84,7 @@
   "third_party/VK-GL-CTS/src/external/vulkancts/modules/vulkan/multiview/CMakeLists.txt":
     "16a341e4f08e85adad6dbf0309883f5b",
   "third_party/VK-GL-CTS/src/external/vulkancts/modules/vulkan/pipeline/CMakeLists.txt":
-    "d6c5f7539eefcbf9615e5bb50d81a368",
+    "e0fca38f3aa8ab3e94fb0c8ff079aa4c",
   "third_party/VK-GL-CTS/src/external/vulkancts/modules/vulkan/postmortem/CMakeLists.txt":
     "7b1092fbc97773d8c7d2d3b56971f877",
   "third_party/VK-GL-CTS/src/external/vulkancts/modules/vulkan/protected_memory/CMakeLists.txt":
@@ -93,6 +93,10 @@
     "8eb77c8b1ebe7d533eee1404022da713",
   "third_party/VK-GL-CTS/src/external/vulkancts/modules/vulkan/rasterization/CMakeLists.txt":
     "13850a7e8d1f12fc9d1ba5b3314c54eb",
+  "third_party/VK-GL-CTS/src/external/vulkancts/modules/vulkan/ray_query/CMakeLists.txt":
+    "6f897d277516ca1a256b93f0c3b43b84",
+  "third_party/VK-GL-CTS/src/external/vulkancts/modules/vulkan/ray_tracing/CMakeLists.txt":
+    "bbbd0bf4d438eeefc323c416e257ac66",
   "third_party/VK-GL-CTS/src/external/vulkancts/modules/vulkan/renderpass/CMakeLists.txt":
     "154254ec9d21124a3ef46ad9e5cb1829",
   "third_party/VK-GL-CTS/src/external/vulkancts/modules/vulkan/robustness/CMakeLists.txt":
@@ -120,7 +124,7 @@
   "third_party/VK-GL-CTS/src/external/vulkancts/modules/vulkan/ubo/CMakeLists.txt":
     "566bed92705fb01686aea784e4d058d3",
   "third_party/VK-GL-CTS/src/external/vulkancts/modules/vulkan/util/CMakeLists.txt":
-    "fd82e3334d71e2b6ad9b126e7a910623",
+    "2304ee1e79f5e37035308f14191153c3",
   "third_party/VK-GL-CTS/src/external/vulkancts/modules/vulkan/wsi/CMakeLists.txt":
     "b1e33f9691258814d9a81dfd57faad13",
   "third_party/VK-GL-CTS/src/external/vulkancts/modules/vulkan/ycbcr/CMakeLists.txt":
diff --git a/scripts/code_generation_hashes/GL_EGL_WGL_loader.json b/scripts/code_generation_hashes/GL_EGL_WGL_loader.json
index f315471..cf9b405 100644
--- a/scripts/code_generation_hashes/GL_EGL_WGL_loader.json
+++ b/scripts/code_generation_hashes/GL_EGL_WGL_loader.json
@@ -1,8 +1,8 @@
 {
   "scripts/egl.xml":
-    "4e5911cfe91274cc5112ff2f70092376",
+    "013c552e6c523abdcf268268ea47e9fe",
   "scripts/egl_angle_ext.xml":
-    "087d6a3996a91fbb0b664cac57c50c4c",
+    "5bcc01462b355d933cf3ada15198fb68",
   "scripts/generate_loader.py":
     "ef16088fdf3e7e97132f7737d20f563a",
   "scripts/gl.xml":
@@ -10,7 +10,7 @@
   "scripts/gl_angle_ext.xml":
     "0b4f3476d76a5ccc40af342d6c08739d",
   "scripts/registry_xml.py":
-    "dd461cd58c29c1d65c21bad98783cfde",
+    "c0e4f66d64c111c8600770dc79bc50f9",
   "scripts/wgl.xml":
     "c36001431919e1c435f1215a85f7e1db",
   "src/libEGL/egl_loader_autogen.cpp":
@@ -22,17 +22,17 @@
   "src/tests/restricted_traces/trace_egl_loader_autogen.h":
     "6011fd4bc1c6977ae10c262cfe534691",
   "src/tests/restricted_traces/trace_gles_loader_autogen.cpp":
-    "b629a0844548db34a72eaf2aa8b3e00a",
+    "e604f35cfc5b704c93fb62d8ba272845",
   "src/tests/restricted_traces/trace_gles_loader_autogen.h":
-    "92c3f8b93719c3421564043851e63cc0",
+    "37ba8e8e44e56a2fb9fe1bf32f88e8e5",
   "util/egl_loader_autogen.cpp":
     "5898c23071036a307cfa74a82aeaefb3",
   "util/egl_loader_autogen.h":
     "f9087796b885ba3874a449ee5155f958",
   "util/gles_loader_autogen.cpp":
-    "17e97c12f7cb59b549d4702bf2e499be",
+    "5fc286a2ad5ca51ec0ef0c4951fb8d1b",
   "util/gles_loader_autogen.h":
-    "42b9a68a5c876ff63621bbed35c46aee",
+    "34691df8d28eba0ec37ca9b73f79c5d0",
   "util/windows/wgl_loader_autogen.cpp":
     "60a40fba3ffddd40063fe6131bc67ba5",
   "util/windows/wgl_loader_autogen.h":
diff --git a/scripts/code_generation_hashes/GL_EGL_entry_points.json b/scripts/code_generation_hashes/GL_EGL_entry_points.json
index 92afc0e..ffc15d8 100644
--- a/scripts/code_generation_hashes/GL_EGL_entry_points.json
+++ b/scripts/code_generation_hashes/GL_EGL_entry_points.json
@@ -1,62 +1,34 @@
 {
   "scripts/egl.xml":
-    "4e5911cfe91274cc5112ff2f70092376",
+    "013c552e6c523abdcf268268ea47e9fe",
   "scripts/egl_angle_ext.xml":
-    "087d6a3996a91fbb0b664cac57c50c4c",
+    "5bcc01462b355d933cf3ada15198fb68",
+  "scripts/entry_point_packed_egl_enums.json":
+    "0175304f39aec0f1816760c6460b6d62",
   "scripts/entry_point_packed_gl_enums.json":
     "846be5dc8cb36076207699b025633fcc",
   "scripts/generate_entry_points.py":
-    "f5a30660ec14edeff98a21a1038b02a7",
+    "5b3752c3e021d3a5cd76a6ccaf5263d7",
   "scripts/gl.xml":
     "f66967f3f3d696b5d8306fd80bbd49a8",
   "scripts/gl_angle_ext.xml":
     "0b4f3476d76a5ccc40af342d6c08739d",
   "scripts/registry_xml.py":
-    "dd461cd58c29c1d65c21bad98783cfde",
+    "c0e4f66d64c111c8600770dc79bc50f9",
   "scripts/wgl.xml":
     "c36001431919e1c435f1215a85f7e1db",
   "src/common/entry_points_enum_autogen.cpp":
-    "c2d9b042b091aa0f198d023547ee02b5",
+    "ba7e8e72365324bd5b1731c4fafc84c4",
   "src/common/entry_points_enum_autogen.h":
-    "88eaa3ca15b860b6ac223e4da540d3b2",
-  "src/libANGLE/Context_gl_1_0_autogen.h":
-    "fa315eea66889530dcca311d90490d3b",
-  "src/libANGLE/Context_gl_1_1_autogen.h":
-    "84e4bd8f13ae8274ae9072d761afd043",
-  "src/libANGLE/Context_gl_1_2_autogen.h":
-    "d51eeadcb8d4824e01db4c3bdcd19c64",
-  "src/libANGLE/Context_gl_1_3_autogen.h":
-    "4a126b1d10a5af02676e5f74494535a4",
-  "src/libANGLE/Context_gl_1_4_autogen.h":
-    "eca01aa547e2f24d2caeb945f2bca9c9",
-  "src/libANGLE/Context_gl_1_5_autogen.h":
-    "35533281995d8b77d0f3e13dad3aa101",
-  "src/libANGLE/Context_gl_2_0_autogen.h":
-    "1208793161611291014912e5340c9b93",
-  "src/libANGLE/Context_gl_2_1_autogen.h":
-    "c1c72e57fcacc8bfd3ae9c3471d9e95a",
-  "src/libANGLE/Context_gl_3_0_autogen.h":
-    "19f4ee6e5c2496522eb597e845e6e435",
-  "src/libANGLE/Context_gl_3_1_autogen.h":
-    "d1d4f7055bc57ff391b8cd6ad25b9d10",
-  "src/libANGLE/Context_gl_3_2_autogen.h":
-    "83fba660b460665d296a29de1db5dcf6",
-  "src/libANGLE/Context_gl_3_3_autogen.h":
-    "6e8d776e94883ab254a5c37db1330754",
-  "src/libANGLE/Context_gl_4_0_autogen.h":
-    "22267e42b16a48f21dadfff565d2a6f3",
-  "src/libANGLE/Context_gl_4_1_autogen.h":
-    "fe1e928d27ec166a507d4a59a85c196c",
-  "src/libANGLE/Context_gl_4_2_autogen.h":
-    "6a77d507af0454802201ca553f06cc0b",
-  "src/libANGLE/Context_gl_4_3_autogen.h":
-    "fbc402c961d759be5e221a84a9cb5d65",
-  "src/libANGLE/Context_gl_4_4_autogen.h":
-    "f723877386ca9277ac4acea820a0d7f1",
-  "src/libANGLE/Context_gl_4_5_autogen.h":
-    "f06e102c161b2804caaa943027f157ad",
-  "src/libANGLE/Context_gl_4_6_autogen.h":
-    "738e344919d9a867e8823cbf52d10394",
+    "ac1aae5c5b7abbc95fb7c996ea0bdeea",
+  "src/libANGLE/Context_gl_1_autogen.h":
+    "6be1391ee21b3754d9e9c512255d4c5d",
+  "src/libANGLE/Context_gl_2_autogen.h":
+    "d6e875a405946a968dc565e58c13c8c0",
+  "src/libANGLE/Context_gl_3_autogen.h":
+    "cf9b149f033b1349409c0b4ee4042bdd",
+  "src/libANGLE/Context_gl_4_autogen.h":
+    "9da23209dab55973211922dea50d7754",
   "src/libANGLE/Context_gles_1_0_autogen.h":
     "51fce95acbf8de72d21255adbbe0e8cd",
   "src/libANGLE/Context_gles_2_0_autogen.h":
@@ -68,37 +40,39 @@
   "src/libANGLE/Context_gles_3_2_autogen.h":
     "48567dca16fd881dfe6d61fee0e3106f",
   "src/libANGLE/Context_gles_ext_autogen.h":
-    "cc05cbb1ceb71c40f89ede91f394f682",
+    "c5e180aca6448e88a2901aa8f019c976",
   "src/libANGLE/capture_gles_1_0_autogen.cpp":
-    "1ee3e4aceb1afa9585aa458c600665a9",
+    "0655870b47c6839e46c4e8b0b89be1f9",
   "src/libANGLE/capture_gles_1_0_autogen.h":
     "546173090c85ad28a580ca76cd117484",
   "src/libANGLE/capture_gles_2_0_autogen.cpp":
-    "d512df459dbc2e61f26c2ebb5330eba8",
+    "78701e22a3fa82c18f02b3a1951f62bf",
   "src/libANGLE/capture_gles_2_0_autogen.h":
     "6985d5e3d0126bc8e02dd982267a904f",
   "src/libANGLE/capture_gles_3_0_autogen.cpp":
-    "6447ab4c579f717a25f86ce3815e49c3",
+    "b8809b1ebaa98564194144113e27a39d",
   "src/libANGLE/capture_gles_3_0_autogen.h":
     "b963fec070e0becdcf4af69216cd1c7b",
   "src/libANGLE/capture_gles_3_1_autogen.cpp":
-    "3cd86e846ed49e68f149805a0ddfea8d",
+    "af353035ef38dd953f35630fb6e1d3ae",
   "src/libANGLE/capture_gles_3_1_autogen.h":
     "3d363f4de97b47ecff61e29939dcf11a",
   "src/libANGLE/capture_gles_3_2_autogen.cpp":
-    "5b761dc394b15edeb077fa31faacf083",
+    "110d08a5368399511f8ef4f3aed5461b",
   "src/libANGLE/capture_gles_3_2_autogen.h":
     "3d8f561944c8e5c06c7c9e68559ff364",
   "src/libANGLE/capture_gles_ext_autogen.cpp":
-    "25fbe0477efc993f0b099a94aec01d71",
+    "c11e14ca97453d6bc6ccdd8a437d3d8a",
   "src/libANGLE/capture_gles_ext_autogen.h":
-    "fe9dea1c92340c144299530b8e96fe3c",
+    "e4c918da74efc2d0d7c054145b0af16d",
   "src/libANGLE/frame_capture_replay_autogen.cpp":
-    "09901bfdd8b16c9e888380179b53aa7a",
+    "e5492a4ebe8a616db1a4a9397c7fff1c",
   "src/libANGLE/frame_capture_utils_autogen.cpp":
     "442ed8cd644833c56ff5e50083e3d94d",
   "src/libANGLE/frame_capture_utils_autogen.h":
     "652b821a877d6eb2c62ba8d151157eea",
+  "src/libANGLE/validationEGL_autogen.h":
+    "3927fa260ad183fd9193d65b3f8d82c5",
   "src/libANGLE/validationES1_autogen.h":
     "c8edb0a5b26303bf7c4692b9d0b05c1f",
   "src/libANGLE/validationES2_autogen.h":
@@ -110,155 +84,83 @@
   "src/libANGLE/validationES3_autogen.h":
     "86ba503835328438158d9a464943f3bd",
   "src/libANGLE/validationESEXT_autogen.h":
-    "5849c361184e2b3e602a6b42e5bfbdc3",
-  "src/libANGLE/validationGL11_autogen.h":
-    "aadd145c1404de9c34d6b7c00404f10f",
-  "src/libANGLE/validationGL12_autogen.h":
-    "830d840fc8bb395161e630cc1018178b",
-  "src/libANGLE/validationGL13_autogen.h":
-    "27f2e9b41b8f2ef431312a148a75531a",
-  "src/libANGLE/validationGL14_autogen.h":
-    "bfea625a8bb8b8d1eeb41eb8ab30d4b4",
-  "src/libANGLE/validationGL15_autogen.h":
-    "a8e28b3bfe16fc58f4e404a73e590469",
+    "97f342523b2c32f4931ce4c2f1c5503a",
   "src/libANGLE/validationGL1_autogen.h":
-    "06018b9d3749bb65f59caa694175df98",
-  "src/libANGLE/validationGL21_autogen.h":
-    "e8fbcf4149d939eac029eab87d78a6ea",
+    "439f8ea26dc37ee6608100f4c6f9205c",
   "src/libANGLE/validationGL2_autogen.h":
-    "d4838ffcbbec95e59ce134c5fb203dc3",
-  "src/libANGLE/validationGL31_autogen.h":
-    "d37df5e87e5a43c169554bcff5225f2c",
-  "src/libANGLE/validationGL32_autogen.h":
-    "ba2884ada6a1576af332621af63faf0f",
-  "src/libANGLE/validationGL33_autogen.h":
-    "192adeb93d903c166bf36c847428a902",
+    "287405881447aff5c6c05d99799c0a63",
   "src/libANGLE/validationGL3_autogen.h":
-    "7cefaa9e5568cb86df01371ad5390a29",
-  "src/libANGLE/validationGL41_autogen.h":
-    "f92033868e2a6ecf707b730c70d44f2c",
-  "src/libANGLE/validationGL42_autogen.h":
-    "9bbc3bc1a2b89ca62bf219bc15903ec9",
-  "src/libANGLE/validationGL43_autogen.h":
-    "0d05f9873cb5c65b0c68a60423e9c724",
-  "src/libANGLE/validationGL44_autogen.h":
-    "658f2758447628218db4547a27210b0e",
-  "src/libANGLE/validationGL45_autogen.h":
-    "a0af5104f0d3949c9d945387d11e6302",
-  "src/libANGLE/validationGL46_autogen.h":
-    "46f74a3b19fd7e243ddd47a7478ae818",
+    "967a8367b8ed2330cd942f714840491e",
   "src/libANGLE/validationGL4_autogen.h":
-    "cbe3f917024a93a3adcbd2806f3e951f",
-  "src/libGL/entry_points_gl_1_0_autogen.cpp":
-    "cb974a5a4230f15b0de83a3f690dc481",
-  "src/libGL/entry_points_gl_1_0_autogen.h":
-    "4ff00afc21780bc6c138b5431a2d067c",
-  "src/libGL/entry_points_gl_1_1_autogen.cpp":
-    "25b8fa135fd328dc5781e7acac15f2c1",
-  "src/libGL/entry_points_gl_1_1_autogen.h":
-    "570a839bb336d8f5f83d3b50fe49411a",
-  "src/libGL/entry_points_gl_1_2_autogen.cpp":
-    "df1563b8fc606f9d4d7022e1ed2aa8ba",
-  "src/libGL/entry_points_gl_1_2_autogen.h":
-    "3f52187f299fe96672384e1646f4a1cb",
-  "src/libGL/entry_points_gl_1_3_autogen.cpp":
-    "d536065308f2b67bb043e04a70f31f6f",
-  "src/libGL/entry_points_gl_1_3_autogen.h":
-    "5ea36d869b82a824d5f290625c4ea052",
-  "src/libGL/entry_points_gl_1_4_autogen.cpp":
-    "489b169ac60632b44335e0ce3f20dd19",
-  "src/libGL/entry_points_gl_1_4_autogen.h":
-    "2c5d31ca248507a024e4724c74283ec4",
-  "src/libGL/entry_points_gl_1_5_autogen.cpp":
-    "c3b20077ff54e2148f687d4654364cd8",
-  "src/libGL/entry_points_gl_1_5_autogen.h":
-    "978457aa9a40e427846b6dea24608903",
-  "src/libGL/entry_points_gl_2_0_autogen.cpp":
-    "327055976b3009f2cffb4129efddaca5",
-  "src/libGL/entry_points_gl_2_0_autogen.h":
-    "41b0cd064167fac84bcdb1896a275b1b",
-  "src/libGL/entry_points_gl_2_1_autogen.cpp":
-    "a91d1832697d6ebd8789ff4831615b0a",
-  "src/libGL/entry_points_gl_2_1_autogen.h":
-    "1da48dec560ea5ff8cadf4d0b6bfde1c",
-  "src/libGL/entry_points_gl_3_0_autogen.cpp":
-    "100ea68ec10b12ae445683fa616e8ad4",
-  "src/libGL/entry_points_gl_3_0_autogen.h":
-    "0fad8005f23815beb8ee9b3797c00b83",
-  "src/libGL/entry_points_gl_3_1_autogen.cpp":
-    "fcfdbb2add1da66c7812c670fe1ff4bc",
-  "src/libGL/entry_points_gl_3_1_autogen.h":
-    "a68ff6c69f0ce95d9730e22bb4c63366",
-  "src/libGL/entry_points_gl_3_2_autogen.cpp":
-    "50befe764d78c30f1cbc4734dca23809",
-  "src/libGL/entry_points_gl_3_2_autogen.h":
-    "f162c4e93a64ab2e43048a0937f7c46f",
-  "src/libGL/entry_points_gl_3_3_autogen.cpp":
-    "ca18f0aebac8485a074174b758a854e5",
-  "src/libGL/entry_points_gl_3_3_autogen.h":
-    "51c0e4f074c85447f5d910c63b9ea61c",
-  "src/libGL/entry_points_gl_4_0_autogen.cpp":
-    "9f81556e90b50859614d69d7d0162c2d",
-  "src/libGL/entry_points_gl_4_0_autogen.h":
-    "35d611138951cebc29db99c9bf3a9e5f",
-  "src/libGL/entry_points_gl_4_1_autogen.cpp":
-    "c72f43ffdafddddaedbfc810c249ede5",
-  "src/libGL/entry_points_gl_4_1_autogen.h":
-    "beec6659a3a77695dad66df90717c6ba",
-  "src/libGL/entry_points_gl_4_2_autogen.cpp":
-    "cbc5d16252560a1102e8bbf8835d780c",
-  "src/libGL/entry_points_gl_4_2_autogen.h":
-    "a2cb2a48cceaf6131f96bf8ec556aa55",
-  "src/libGL/entry_points_gl_4_3_autogen.cpp":
-    "8fb2ed33a82ce2dfe4333305c63bd79c",
-  "src/libGL/entry_points_gl_4_3_autogen.h":
-    "abfa431742a2b643db21220944e10ab0",
-  "src/libGL/entry_points_gl_4_4_autogen.cpp":
-    "8565d56889a0ce6c087c2b6133fbd2fd",
-  "src/libGL/entry_points_gl_4_4_autogen.h":
-    "cdf1651f00d26db547b153afc09acc1c",
-  "src/libGL/entry_points_gl_4_5_autogen.cpp":
-    "dc051b47e0cf2c44bfb4a5177a6fdbef",
-  "src/libGL/entry_points_gl_4_5_autogen.h":
-    "9f5de9513c06b82aca60856860f7b716",
-  "src/libGL/entry_points_gl_4_6_autogen.cpp":
-    "7d3b31a7f6e1c457540f14669d7025f5",
-  "src/libGL/entry_points_gl_4_6_autogen.h":
-    "ee3150d4a8d267271a02e38e8feb923a",
+    "db77968c46394c58896f085265182ffa",
+  "src/libEGL/libEGL_autogen.cpp":
+    "01cc619c8493952c24f77ac4fa5d7d8a",
+  "src/libEGL/libEGL_autogen.def":
+    "3f504d6280dc1d847bc2dedc51fa2640",
+  "src/libGL/entry_points_gl_1_autogen.cpp":
+    "827d821f0407ac8d66f9ed50e4083bb7",
+  "src/libGL/entry_points_gl_1_autogen.h":
+    "26f196b4412e307437b84ac3381adc39",
+  "src/libGL/entry_points_gl_2_autogen.cpp":
+    "305ddc110465738e107ab07a37fab35e",
+  "src/libGL/entry_points_gl_2_autogen.h":
+    "d512384dffb856027ce8d540e9a123c4",
+  "src/libGL/entry_points_gl_3_autogen.cpp":
+    "b38fccb10394497cc85d5b3e67779370",
+  "src/libGL/entry_points_gl_3_autogen.h":
+    "8c86d5aa9a4e3e45e99739b6d9b112bd",
+  "src/libGL/entry_points_gl_4_autogen.cpp":
+    "cb37e88a5fdc673986d02feead963bdf",
+  "src/libGL/entry_points_gl_4_autogen.h":
+    "e97607aa7f86ce8797fd688d7f6e8337",
   "src/libGL/libGL_autogen.cpp":
-    "846fe3b32c9b0931ca2d749216131b00",
+    "7156393fba9b86b40e8d20c68d7a4013",
   "src/libGL/libGL_autogen.def":
     "2789d87b05eea9f53d52e2aff499b785",
+  "src/libGLESv2/egl_ext_stubs_autogen.h":
+    "2ef3b8d087f2a97f7270b96077c93856",
+  "src/libGLESv2/egl_get_labeled_object_data.json":
+    "2f4148b2ddf34e62670e32c5e6da4937",
+  "src/libGLESv2/egl_stubs_autogen.h":
+    "6439daa350c1663e71dd0af37dcc91df",
+  "src/libGLESv2/entry_points_egl_autogen.cpp":
+    "ba9796b20452dbbe4180480aae02b8a3",
+  "src/libGLESv2/entry_points_egl_autogen.h":
+    "3bc7a8df9deadd7cfd615d0cfad0c6a8",
+  "src/libGLESv2/entry_points_egl_ext_autogen.cpp":
+    "f6a18ab7478277d6c2f026684801af3a",
+  "src/libGLESv2/entry_points_egl_ext_autogen.h":
+    "5ae83ea21ee98991b68847f66793553f",
   "src/libGLESv2/entry_points_gles_1_0_autogen.cpp":
-    "3e96283f3ebd6428e0e7c04a7e38db14",
+    "7d62e6f5a013b303c11a6b78b39ff3fb",
   "src/libGLESv2/entry_points_gles_1_0_autogen.h":
     "899dcff9383465380f94fbdfe5bcf0a0",
   "src/libGLESv2/entry_points_gles_2_0_autogen.cpp":
-    "437816f35190f56d1a1658e79cdb60b0",
+    "f65e421cc249831c0da2c70836156a78",
   "src/libGLESv2/entry_points_gles_2_0_autogen.h":
     "26387e27cbddf5e34d6cd9f850cb8b64",
   "src/libGLESv2/entry_points_gles_3_0_autogen.cpp":
-    "39c316c6dbc9a9c2d1ea04bc6a73a4f6",
+    "c631759ce4615b8ec9465bf13870e8eb",
   "src/libGLESv2/entry_points_gles_3_0_autogen.h":
     "0d246024379fbf55b87204db5d6a37e3",
   "src/libGLESv2/entry_points_gles_3_1_autogen.cpp":
-    "3b1106dee3086c98baba6f54bd7f987c",
+    "12c36295425182cd450dfabc9ab0df3d",
   "src/libGLESv2/entry_points_gles_3_1_autogen.h":
     "69bae5c94ed4665836a8464b6c353f9a",
   "src/libGLESv2/entry_points_gles_3_2_autogen.cpp":
-    "c3a29c34f8cb1308ce156c948bf520ac",
+    "e7009132df507f893f95f70a44d06dae",
   "src/libGLESv2/entry_points_gles_3_2_autogen.h":
     "5798aa0a73af1d4ba5dfe99b6217a247",
   "src/libGLESv2/entry_points_gles_ext_autogen.cpp":
-    "e756ae01a0b54eaee4b222cac78c8e4c",
+    "01630db0c0407c4e44767b7e004178c7",
   "src/libGLESv2/entry_points_gles_ext_autogen.h":
-    "5076b144ea0e7acf77bd2a0078588716",
+    "226085c2c8c598d5aaf8c6e8e07007ef",
   "src/libGLESv2/libGLESv2_autogen.cpp":
-    "c8b16dee7bb5a913d422e65403d078ac",
+    "b3d62065b5740445ff0e79c3a8ba6dd8",
   "src/libGLESv2/libGLESv2_autogen.def":
-    "36ed25ccd57dd8c54dc3a1ee284614f5",
+    "dee15b1966bc64b81bedb773f748d04e",
   "src/libGLESv2/libGLESv2_no_capture_autogen.def":
-    "f93450c1f787f3da53f2525865568989",
+    "1f72ea902cd149f933352038c1532835",
   "src/libGLESv2/libGLESv2_with_capture_autogen.def":
-    "7b78ab59dd1fe360a5d3c1f513c7ce55"
+    "a1615ef4fd83c9356fc100983d69b101"
 }
\ No newline at end of file
diff --git a/scripts/code_generation_hashes/GLenum_value_to_string_map.json b/scripts/code_generation_hashes/GLenum_value_to_string_map.json
index bbb07c5..f060124 100644
--- a/scripts/code_generation_hashes/GLenum_value_to_string_map.json
+++ b/scripts/code_generation_hashes/GLenum_value_to_string_map.json
@@ -6,9 +6,9 @@
   "scripts/gl_angle_ext.xml":
     "0b4f3476d76a5ccc40af342d6c08739d",
   "scripts/registry_xml.py":
-    "dd461cd58c29c1d65c21bad98783cfde",
+    "c0e4f66d64c111c8600770dc79bc50f9",
   "src/libANGLE/gl_enum_utils_autogen.cpp":
-    "30ac2050cdc2b7fa0a42acc457e57059",
+    "f77ddeb3af9f5cea20ae7f0efb0a3ddc",
   "src/libANGLE/gl_enum_utils_autogen.h":
     "dd54f34be733affcb994fc315c3b972d"
 }
\ No newline at end of file
diff --git a/scripts/code_generation_hashes/Vulkan_internal_shader_programs.json b/scripts/code_generation_hashes/Vulkan_internal_shader_programs.json
index d466118..fa34d82 100644
--- a/scripts/code_generation_hashes/Vulkan_internal_shader_programs.json
+++ b/scripts/code_generation_hashes/Vulkan_internal_shader_programs.json
@@ -74,23 +74,23 @@
   "src/libANGLE/renderer/vulkan/shaders/gen/ConvertIndirectLineLoop.comp.00000000.inc":
     "e1eb4a5fac9fc74ecd3790b2f773dc08",
   "src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000000.inc":
-    "41cec7c18b88e60252f31e38a93ee8da",
+    "498380556bc1a01e1d3f8fbf5fbcaab0",
   "src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000001.inc":
-    "4bfbcfbda657a0db2467fd05e8a90ca3",
+    "f7ee2788aa5ec72436476d177062752f",
   "src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000002.inc":
-    "8f7200e0901cae98e68fef5448055f7d",
+    "8cb4e3453e7839ab19bc97d9bd58b5a3",
   "src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000003.inc":
-    "473ef011c869f13f49e95d7a5a8ce81e",
+    "c146975e8ec188e994368260a7b5e761",
   "src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000004.inc":
-    "f97185d954b735753ea4ab93851f03bf",
+    "d05233f650927f0fbc7de3bfe03a9548",
   "src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000005.inc":
-    "d0e1d3a317688d6d8e7ba2300a9a3434",
+    "04bb8f5760c14448c86ea6ba927cdf25",
   "src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000006.inc":
-    "df913989b39699e549ba9089190d358c",
+    "46d9a28b7a5c4a8f804e12e77c145104",
   "src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000007.inc":
-    "c9e0fad17170e97662b0fa0d37919ea3",
+    "2137dcf6b892b98a1cddbff2ff515dfd",
   "src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000008.inc":
-    "680d2865d4350c8f36fbbdaec1b43682",
+    "a66c0fd5341b7cb353ce2bdf717a430e",
   "src/libANGLE/renderer/vulkan/shaders/gen/FullScreenQuad.vert.00000000.inc":
     "a6f06ce133d1342fafed89305dd99bdd",
   "src/libANGLE/renderer/vulkan/shaders/gen/GenerateMipmap.comp.00000000.inc":
@@ -300,7 +300,7 @@
   "src/libANGLE/renderer/vulkan/shaders/src/ConvertIndirectLineLoop.comp.json":
     "c2c79c40b0fbcb4876637aa06e8aa919",
   "src/libANGLE/renderer/vulkan/shaders/src/ConvertVertex.comp":
-    "537e6cff8f9a0b6acdf1c9be5fdcef7c",
+    "d656da7733a59771d91b0511643cf9f7",
   "src/libANGLE/renderer/vulkan/shaders/src/ConvertVertex.comp.json":
     "f2abd98463e46c0af45e8a1a5e5af88f",
   "src/libANGLE/renderer/vulkan/shaders/src/FullScreenQuad.vert":
diff --git a/scripts/code_generation_hashes/packed_enum.json b/scripts/code_generation_hashes/packed_enum.json
index 685d346..f66104a 100644
--- a/scripts/code_generation_hashes/packed_enum.json
+++ b/scripts/code_generation_hashes/packed_enum.json
@@ -4,13 +4,13 @@
   "src/common/PackedEGLEnums_autogen.h":
     "085d82d2003f02345abc4986523127d4",
   "src/common/PackedGLEnums_autogen.cpp":
-    "1e1f2629f8212723659bb58bb0973968",
+    "d466b72e054f7a4b15dc033b0a10d3a0",
   "src/common/PackedGLEnums_autogen.h":
-    "6f731e9c90cbfc06d6193431ab4e2e11",
+    "432cef0647efc392813438f486991f1f",
   "src/common/gen_packed_gl_enums.py":
     "b3e96ea44f52ec23ee893bd843dfd2cb",
   "src/common/packed_egl_enums.json":
     "76e1b814421e121164d60a0d89cb16c1",
   "src/common/packed_gl_enums.json":
-    "a9ad05af71f6c8378147dc5e41728822"
+    "5e9956ad129fc6f2ed4ce5b8a094f157"
 }
\ No newline at end of file
diff --git a/scripts/code_generation_hashes/proc_table.json b/scripts/code_generation_hashes/proc_table.json
index 28e1901..435c7ce 100644
--- a/scripts/code_generation_hashes/proc_table.json
+++ b/scripts/code_generation_hashes/proc_table.json
@@ -1,20 +1,20 @@
 {
   "scripts/egl.xml":
-    "4e5911cfe91274cc5112ff2f70092376",
+    "013c552e6c523abdcf268268ea47e9fe",
   "scripts/egl_angle_ext.xml":
-    "087d6a3996a91fbb0b664cac57c50c4c",
+    "5bcc01462b355d933cf3ada15198fb68",
   "scripts/gen_proc_table.py":
-    "30317d8175c0dafe55c80e67a2d3aeae",
+    "1843f52355a9c573a4e39e33e3505c71",
   "scripts/gl.xml":
     "f66967f3f3d696b5d8306fd80bbd49a8",
   "scripts/gl_angle_ext.xml":
     "0b4f3476d76a5ccc40af342d6c08739d",
   "scripts/registry_xml.py":
-    "dd461cd58c29c1d65c21bad98783cfde",
+    "c0e4f66d64c111c8600770dc79bc50f9",
   "scripts/wgl.xml":
     "c36001431919e1c435f1215a85f7e1db",
   "src/libGL/proc_table_wgl_autogen.cpp":
-    "253f59ef3aa9ccfcab1364ae5101dbe2",
+    "d13cce0ddbd844c0b4812000c4f998f0",
   "src/libGLESv2/proc_table_egl_autogen.cpp":
-    "e1aac110ccb057658dc25c0de1949e86"
+    "18ef1c3470fc6af55b14fdd2b998c571"
 }
\ No newline at end of file
diff --git a/scripts/code_generation_hashes/restricted_traces.json b/scripts/code_generation_hashes/restricted_traces.json
index 825291b..27a98fd 100644
--- a/scripts/code_generation_hashes/restricted_traces.json
+++ b/scripts/code_generation_hashes/restricted_traces.json
@@ -1,6 +1,6 @@
 {
   "src/tests/restricted_traces/.gitignore":
-    "054f342c8cdd27f56ef17ab2b5948bc8",
+    "01e347f5fab1e4160328dc53fd14bba1",
   "src/tests/restricted_traces/angry_birds_2_1500.tar.gz.sha1":
     "2b5d6505d6a8b6f3bbfbad2c8405a89d",
   "src/tests/restricted_traces/arena_of_valor.tar.gz.sha1":
@@ -42,17 +42,19 @@
   "src/tests/restricted_traces/real_commando_secret_mission.tar.gz.sha1":
     "4b484dd9c53a79100ec13b6f1c86040d",
   "src/tests/restricted_traces/restricted_traces.json":
-    "dafaefb78963b377f2d54c97b12cc9fe",
+    "64dc4eb7406274b240d4fd7d62c8d999",
   "src/tests/restricted_traces/restricted_traces_autogen.cpp":
-    "18a6d71981b5dbe98bd96f1717fb1868",
+    "f48a37690e1595b744648151143c6921",
   "src/tests/restricted_traces/restricted_traces_autogen.gni":
-    "d28f9ac1b9e3285c57f491fea58395af",
+    "2ce04e7f9dabb575c030cb554bc01ca8",
   "src/tests/restricted_traces/restricted_traces_autogen.h":
-    "3f2c22b74d3d8ccea5ff3000115c88c9",
+    "07bdf473e90380c6f7b5c6e4238e1683",
   "src/tests/restricted_traces/temple_run_300.tar.gz.sha1":
     "0a08ce3df88cb358ccac3ac63ba04955",
   "src/tests/restricted_traces/trex_200.tar.gz.sha1":
     "c57dc6e28b1eaa1b3bb5dae54847966a",
+  "src/tests/restricted_traces/whatsapp.tar.gz.sha1":
+    "52603d1a43f9e501205d381c9254c07e",
   "src/tests/restricted_traces/world_of_tanks_blitz.tar.gz.sha1":
     "6cba9bb8542b71443f107952faddbe64"
 }
\ No newline at end of file
diff --git a/scripts/egl.xml b/scripts/egl.xml
index 157372c..4d27853 100644
--- a/scripts/egl.xml
+++ b/scripts/egl.xml
@@ -1,27 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <registry>
     <!--
-    Copyright (c) 2013-2017 The Khronos Group Inc.
-
-    Permission is hereby granted, free of charge, to any person obtaining a
-    copy of this software and/or associated documentation files (the
-    "Materials"), to deal in the Materials without restriction, including
-    without limitation the rights to use, copy, modify, merge, publish,
-    distribute, sublicense, and/or sell copies of the Materials, and to
-    permit persons to whom the Materials are furnished to do so, subject to
-    the following conditions:
-
-    The above copyright notice and this permission notice shall be included
-    in all copies or substantial portions of the Materials.
-
-    THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-    IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-    CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-    MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
-    -->
+    Copyright 2013-2020 The Khronos Group Inc.
+    SPDX-License-Identifier: Apache-2.0
+     -->
     <!--
     This file, egl.xml, is the EGL API Registry. The older ".spec" file
     format has been retired and will no longer be updated with new
@@ -49,6 +31,9 @@
         <type name="NativePixmapType" requires="eglplatform"/>
         <type name="NativeWindowType" requires="eglplatform"/>
         <type>struct <name>AHardwareBuffer</name>;</type>
+        <type>struct <name>wl_buffer</name>;</type>
+        <type>struct <name>wl_display</name>;</type>
+        <type>struct <name>wl_resource</name>;</type>
         <!-- Dummy placeholders for non-EGL types -->
         <type name="Bool"/>
             <!-- These are actual EGL types.  -->
@@ -89,7 +74,13 @@
     EGLint iHeight;
     EGLint iStride;
 };</type>
+        <!-- Backwards-compatibility hack: Downstream implementations shipped
+             incorrect function pointer names for some years. -->
         <type>typedef void (<apientry/> *<name>EGLDEBUGPROCKHR</name>)(EGLenum error,const char *command,EGLint messageType,EGLLabelKHR threadLabel,EGLLabelKHR objectLabel,const char* message);</type>
+        <type>#define <name>PFNEGLBINDWAYLANDDISPLAYWL</name> PFNEGLBINDWAYLANDDISPLAYWLPROC</type>
+        <type>#define <name>PFNEGLUNBINDWAYLANDDISPLAYWL</name> PFNEGLUNBINDWAYLANDDISPLAYWLPROC</type>
+        <type>#define <name>PFNEGLQUERYWAYLANDBUFFERWL</name> PFNEGLQUERYWAYLANDBUFFERWLPROC</type>
+        <type>#define <name>PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWL</name> PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWLPROC</type>
     </types>
 
     <!-- SECTION: EGL enumerant (token) definitions. -->
@@ -468,8 +459,20 @@
             <unused start="0x3111" end="0x311F"/>
     </enums>
 
-    <enums namespace="EGL" start="0x3120" end="0x312F" vendor="AMD" comment="Reserved for David Garcia (Khronos bug 5149)">
-            <unused start="0x3120" end="0x312F"/>
+    <enums namespace="EGL" start="0x3120" end="0x312F" vendor="QCOM" comment="EGL_QCOM_create_image">
+        <enum value="0x3120" name="EGL_NEW_IMAGE_QCOM"/>
+        <enum value="0x3121" name="EGL_IMAGE_FORMAT_QCOM"/>
+        <enum value="0x3122" name="EGL_FORMAT_RGBA_8888_QCOM"/>
+        <enum value="0x3123" name="EGL_FORMAT_RGB_565_QCOM"/>
+        <enum value="0x3124" name="EGL_FORMAT_YUYV_QCOM"/>
+        <enum value="0x3125" name="EGL_FORMAT_UYVY_QCOM"/>
+        <enum value="0x3126" name="EGL_FORMAT_YV12_QCOM"/>
+        <enum value="0x3127" name="EGL_FORMAT_NV21_QCOM"/>
+        <enum value="0x3128" name="EGL_FORMAT_NV12_TILED_QCOM"/>
+        <enum value="0x3129" name="EGL_FORMAT_BGRA_8888_QCOM"/>
+        <enum value="0x312A" name="EGL_FORMAT_BGRX_8888_QCOM"/>
+            <unused start="0x312B" end="0x312E"/>
+        <enum value="0x312F" name="EGL_FORMAT_RGBX_8888_QCOM"/>
     </enums>
 
     <enums namespace="EGL" start="0x3130" end="0x313F" vendor="NV" comment="Reserved for Greg Prisament (Khronos bug 5166)">
@@ -536,8 +539,23 @@
         <enum value="0x31BF" name="EGL_LOSE_CONTEXT_ON_RESET_EXT" alias="EGL_LOSE_CONTEXT_ON_RESET"/>
     </enums>
 
-    <enums namespace="EGL" start="0x31C0" end="0x31CF" vendor="QCOM" comment="Reserved for Maurice Ribble (Khronos bug 6644) - EGL_QCOM_create_image spec TBD">
-            <unused start="0x31C0" end="0x31CF"/>
+    <enums namespace="EGL" start="0x31C0" end="0x31CF" vendor="QCOM" comment="Reserved for Maurice Ribble (Khronos bug 6644) - EGL_QCOM_create_image spec">
+        <enum value="0x31C0" name="EGL_FORMAT_R8_QCOM"/>
+        <enum value="0x31C1" name="EGL_FORMAT_RG88_QCOM"/>
+        <enum value="0x31C2" name="EGL_FORMAT_NV12_QCOM"/>
+        <enum value="0x31C3" name="EGL_FORMAT_SRGBX_8888_QCOM"/>
+        <enum value="0x31C4" name="EGL_FORMAT_SRGBA_8888_QCOM"/>
+        <enum value="0x31C5" name="EGL_FORMAT_YVYU_QCOM"/>
+        <enum value="0x31C6" name="EGL_FORMAT_VYUY_QCOM"/>
+        <enum value="0x31C7" name="EGL_FORMAT_IYUV_QCOM"/>
+        <enum value="0x31C8" name="EGL_FORMAT_RGB_888_QCOM"/>
+        <enum value="0x31C9" name="EGL_FORMAT_RGBA_5551_QCOM"/>
+        <enum value="0x31CA" name="EGL_FORMAT_RGBA_4444_QCOM"/>
+        <enum value="0x31CB" name="EGL_FORMAT_R_16_FLOAT_QCOM"/>
+        <enum value="0x31CC" name="EGL_FORMAT_RG_1616_FLOAT_QCOM"/>
+        <enum value="0x31CD" name="EGL_FORMAT_RGBA_16_FLOAT_QCOM"/>
+        <enum value="0x31CE" name="EGL_FORMAT_RGBA_1010102_QCOM"/>
+        <enum value="0x31CF" name="EGL_FORMAT_FLAG_QCOM"/>
     </enums>
 
     <enums namespace="EGL" start="0x31D0" end="0x31DF" vendor="MESA" comment="Reserved for Kristian H&#248;gsberg (Khronos bug 6757)">
@@ -554,9 +572,26 @@
         <enum value="0x31D7" name="EGL_PLATFORM_GBM_MESA" alias="EGL_PLATFORM_GBM_KHR"/>
         <enum value="0x31D8" name="EGL_PLATFORM_WAYLAND_KHR"/>
         <enum value="0x31D8" name="EGL_PLATFORM_WAYLAND_EXT" alias="EGL_PLATFORM_WAYLAND_KHR"/>
-            <unused start="0x31D9" end="0x31DC"/>
+        <enum value="0x31DC" name="EGL_PLATFORM_XCB_EXT"/>
         <enum value="0x31DD" name="EGL_PLATFORM_SURFACELESS_MESA"/>
-            <unused start="0x31DE" end="0x31DF"/>
+        <enum value="0x31DE" name="EGL_PLATFORM_XCB_SCREEN_EXT"/>
+            <unused start="0x31DF" end="0x31DF"/>
+    </enums>
+
+    <!-- Due to an oversight in development, these enums alias the above MESA
+         vendor range for EGL the X11/GBM/Wayland/surfaceless platforms.
+         They are both currently in wide use and cannot be changed, however
+         the tokens cannot be used in the same contexts and the aliasing is
+         therefore harmless. Future Wayland tokens should not create further
+         aliasing in this range.-->
+    <enums namespace="EGL" start="0x31D5" end="0x31DB" vendor="WL" comment="EGL_WL_bind_wayland_display">
+        <enum value="0x31D5" name="EGL_WAYLAND_BUFFER_WL"/>
+        <enum value="0x31D6" name="EGL_WAYLAND_PLANE_WL"/>
+        <enum value="0x31D7" name="EGL_TEXTURE_Y_U_V_WL"/>
+        <enum value="0x31D8" name="EGL_TEXTURE_Y_UV_WL"/>
+        <enum value="0x31D9" name="EGL_TEXTURE_Y_XUXV_WL"/>
+        <enum value="0x31DA" name="EGL_TEXTURE_EXTERNAL_WL"/>
+        <enum value="0x31DB" name="EGL_WAYLAND_Y_INVERTED_WL"/>
     </enums>
 
     <enums namespace="EGL" start="0x31E0" end="0x31EF" vendor="HI" comment="Reserved for Mark Callow (Khronos bug 6799)">
@@ -617,7 +652,9 @@
         <enum value="0x322D" name="EGL_BAD_OUTPUT_LAYER_EXT"/>
         <enum value="0x322E" name="EGL_BAD_OUTPUT_PORT_EXT"/>
         <enum value="0x322F" name="EGL_SWAP_INTERVAL_EXT"/>
-            <unused start="0x3230" end="0x3232"/>
+        <enum value="0x3230" name="EGL_TRIPLE_BUFFER_NV"/>
+        <enum value="0x3231" name="EGL_QUADRUPLE_BUFFER_NV"/>
+            <unused start="0x3232"/>
         <enum value="0x3233" name="EGL_DRM_DEVICE_FILE_EXT"/>
         <enum value="0x3234" name="EGL_DRM_CRTC_EXT"/>
         <enum value="0x3235" name="EGL_DRM_PLANE_EXT"/>
@@ -690,7 +727,9 @@
         <enum value="0x3284" name="EGL_YUV_CHROMA_SITING_0_EXT"/>
         <enum value="0x3285" name="EGL_YUV_CHROMA_SITING_0_5_EXT"/>
         <enum value="0x3286" name="EGL_DISCARD_SAMPLES_ARM"/>
-            <unused start="0x3287" end="0x3289"/>
+        <enum value="0x3287" name="EGL_COLOR_COMPONENT_TYPE_UNSIGNED_INTEGER_ARM"/>
+        <enum value="0x3288" name="EGL_COLOR_COMPONENT_TYPE_INTEGER_ARM"/>
+            <unused start="0x3289" end="0x3289"/>
         <enum value="0x328A" name="EGL_SYNC_PRIOR_COMMANDS_IMPLICIT_EXTERNAL_ARM"/>
             <unused start="0x328B" end="0x328F"/>
     </enums>
@@ -705,8 +744,23 @@
             <unused start="0x32A2" end="0x32AF"/>
     </enums>
 
-    <enums namespace="EGL" start="0x32B0" end="0x32BF" vendor="QCOM" comment="Reserved for Jeff Vigil (Bug 10663) - EGL_QCOM_lock_image spec TBD">
-            <unused start="0x32B0" end="0x32BF"/>
+    <enums namespace="EGL" start="0x32B0" end="0x32BF" vendor="QCOM" comment="Reserved for Jeff Vigil (Bug 10663) - EGL_QCOM_lock_image2 spec">
+        <enum value="0x32B0" name="EGL_IMAGE_NUM_PLANES_QCOM"/>
+        <enum value="0x32B1" name="EGL_IMAGE_PLANE_PITCH_0_QCOM"/>
+        <enum value="0x32B2" name="EGL_IMAGE_PLANE_PITCH_1_QCOM"/>
+        <enum value="0x32B3" name="EGL_IMAGE_PLANE_PITCH_2_QCOM"/>
+        <enum value="0x32B4" name="EGL_IMAGE_PLANE_DEPTH_0_QCOM"/>
+        <enum value="0x32B5" name="EGL_IMAGE_PLANE_DEPTH_1_QCOM"/>
+        <enum value="0x32B6" name="EGL_IMAGE_PLANE_DEPTH_2_QCOM"/>
+        <enum value="0x32B7" name="EGL_IMAGE_PLANE_WIDTH_0_QCOM"/>
+        <enum value="0x32B8" name="EGL_IMAGE_PLANE_WIDTH_1_QCOM"/>
+        <enum value="0x32B9" name="EGL_IMAGE_PLANE_WIDTH_2_QCOM"/>
+        <enum value="0x32BA" name="EGL_IMAGE_PLANE_HEIGHT_0_QCOM"/>
+        <enum value="0x32BB" name="EGL_IMAGE_PLANE_HEIGHT_1_QCOM"/>
+        <enum value="0x32BC" name="EGL_IMAGE_PLANE_HEIGHT_2_QCOM"/>
+        <enum value="0x32BD" name="EGL_IMAGE_PLANE_POINTER_0_QCOM"/>
+        <enum value="0x32BE" name="EGL_IMAGE_PLANE_POINTER_1_QCOM"/>
+        <enum value="0x32BF" name="EGL_IMAGE_PLANE_POINTER_2_QCOM"/>
     </enums>
 
     <enums namespace="EGL" start="0x32C0" end="0x32CF" vendor="Vivante" comment="Reserved for Yanjun Zhang (Bug 11498)">
@@ -714,8 +768,10 @@
             <unused start="0x32C1" end="0x32CF"/>
     </enums>
 
-    <enums namespace="EGL" start="0x32D0" end="0x32EF" vendor="QCOM" comment="Reserved for Jeff Vigil (Bug 11735) - EGL_QCOM_gpu_perf spec TBD + Bug 12286 - EGL_QCOM_content_protection spec TBD">
-            <unused start="0x32D0" end="0x32EF"/>
+    <enums namespace="EGL" start="0x32D0" end="0x32EF" vendor="QCOM" comment="Reserved for Jeff Vigil (Bug 11735) - EGL_QCOM_gpu_perf spec">
+        <enum value="0x32D0" name="EGL_GPU_PERF_HINT_QCOM"/>
+        <enum value="0x32D1" name="EGL_HINT_PERSISTENT_QCOM"/>
+            <unused start="0x32D2" end="0x32EF"/>
     </enums>
 
     <enums namespace="EGL" start="0x32F0" end="0x32FF" vendor="BCOM" comment="Reserved for Gary Sweet, Broadcom (Bug 12870)">
@@ -797,14 +853,32 @@
         <enum value="0x3352" name="EGL_TRACK_REFERENCES_KHR"/>
             <unused start="0x3353" end="0x3356"/>
         <enum value="0x3357" name="EGL_CONTEXT_PRIORITY_REALTIME_NV"/>
-            <unused start="0x3358" end="0x335F"/>
+            <unused start="0x3358" end="0x335E"/>
+        <enum value="0x335F" name="EGL_RENDERER_EXT"/>
         <enum value="0x3360" name="EGL_CTA861_3_MAX_CONTENT_LIGHT_LEVEL_EXT"/>
         <enum value="0x3361" name="EGL_CTA861_3_MAX_FRAME_AVERAGE_LEVEL_EXT"/>
         <enum value="0x3362" name="EGL_GL_COLORSPACE_DISPLAY_P3_LINEAR_EXT"/>
         <enum value="0x3363" name="EGL_GL_COLORSPACE_DISPLAY_P3_EXT"/>
         <enum value="0x3364" name="EGL_SYNC_CLIENT_EXT"/>
         <enum value="0x3365" name="EGL_SYNC_CLIENT_SIGNAL_EXT"/>
-            <unused start="0x3366" end="0x339F"/>
+        <enum value="0x3366" name="EGL_STREAM_FRAME_ORIGIN_X_NV"/>
+        <enum value="0x3367" name="EGL_STREAM_FRAME_ORIGIN_Y_NV"/>
+        <enum value="0x3368" name="EGL_STREAM_FRAME_MAJOR_AXIS_NV"/>
+        <enum value="0x3369" name="EGL_CONSUMER_AUTO_ORIENTATION_NV"/>
+        <enum value="0x336A" name="EGL_PRODUCER_AUTO_ORIENTATION_NV"/>
+        <enum value="0x336B" name="EGL_LEFT_NV"/>
+        <enum value="0x336C" name="EGL_RIGHT_NV"/>
+        <enum value="0x336D" name="EGL_TOP_NV"/>
+        <enum value="0x336E" name="EGL_BOTTOM_NV"/>
+        <enum value="0x336F" name="EGL_X_AXIS_NV"/>
+        <enum value="0x3370" name="EGL_Y_AXIS_NV"/>
+        <enum value="0x3371" name="EGL_STREAM_DMA_NV"/>
+        <enum value="0x3372" name="EGL_STREAM_DMA_SERVER_NV"/>
+        <enum value="0x3373" name="EGL_STREAM_CONSUMER_IMAGE_NV"/>
+        <enum value="0x3374" name="EGL_STREAM_IMAGE_ADD_NV"/>
+        <enum value="0x3375" name="EGL_STREAM_IMAGE_REMOVE_NV"/>
+        <enum value="0x3376" name="EGL_STREAM_IMAGE_AVAILABLE_NV"/>
+            <unused start="0x3377" end="0x339F"/>
     </enums>
 
     <enums namespace="EGL" start="0x33A0" end="0x33AF" vendor="ANGLE" comment="Reserved for Shannon Woods (Bug 13175)">
@@ -834,8 +908,54 @@
             <unused start="0x33C0" end="0x33DF"/>
     </enums>
 
-    <enums namespace="EGL" start="0x33E0" end="0x342F" vendor="QCOM" comment="Reserved for Jeff Vigil (Bugs 10663,13364)">
-            <unused start="0x33E0" end="0x342F"/>
+    <enums namespace="EGL" start="0x33E0" end="0x342F" vendor="QCOM" comment="EGL_QCOM_create_image and EGL_QCOM_lock_image2">
+        <enum value="0x33E0" name="EGL_FORMAT_FLAG_UBWC_QCOM"/>
+        <enum value="0x33E1" name="EGL_FORMAT_FLAG_MACROTILE_QCOM"/>
+        <enum value="0x33E2" name="EGL_FORMAT_ASTC_4X4_QCOM"/>
+        <enum value="0x33E3" name="EGL_FORMAT_ASTC_5X4_QCOM"/>
+        <enum value="0x33E4" name="EGL_FORMAT_ASTC_5X5_QCOM"/>
+        <enum value="0x33E5" name="EGL_FORMAT_ASTC_6X5_QCOM"/>
+        <enum value="0x33E6" name="EGL_FORMAT_ASTC_6X6_QCOM"/>
+        <enum value="0x33E7" name="EGL_FORMAT_ASTC_8X5_QCOM"/>
+        <enum value="0x33E8" name="EGL_FORMAT_ASTC_8X6_QCOM"/>
+        <enum value="0x33E9" name="EGL_FORMAT_ASTC_8X8_QCOM"/>
+        <enum value="0x33EA" name="EGL_FORMAT_ASTC_10X5_QCOM"/>
+        <enum value="0x33EB" name="EGL_FORMAT_ASTC_10X6_QCOM"/>
+        <enum value="0x33EC" name="EGL_FORMAT_ASTC_10X8_QCOM"/>
+        <enum value="0x33ED" name="EGL_FORMAT_ASTC_10X10_QCOM"/>
+        <enum value="0x33EE" name="EGL_FORMAT_ASTC_12X10_QCOM"/>
+        <enum value="0x33EF" name="EGL_FORMAT_ASTC_12X12_QCOM"/>
+        <enum value="0x3400" name="EGL_FORMAT_ASTC_4X4_SRGB_QCOM"/>
+        <enum value="0x3401" name="EGL_FORMAT_ASTC_5X4_SRGB_QCOM"/>
+        <enum value="0x3402" name="EGL_FORMAT_ASTC_5X5_SRGB_QCOM"/>
+        <enum value="0x3403" name="EGL_FORMAT_ASTC_6X5_SRGB_QCOM"/>
+        <enum value="0x3404" name="EGL_FORMAT_ASTC_6X6_SRGB_QCOM"/>
+        <enum value="0x3405" name="EGL_FORMAT_ASTC_8X5_SRGB_QCOM"/>
+        <enum value="0x3406" name="EGL_FORMAT_ASTC_8X6_SRGB_QCOM"/>
+        <enum value="0x3407" name="EGL_FORMAT_ASTC_8X8_SRGB_QCOM"/>
+        <enum value="0x3408" name="EGL_FORMAT_ASTC_10X5_SRGB_QCOM"/>
+        <enum value="0x3409" name="EGL_FORMAT_ASTC_10X6_SRGB_QCOM"/>
+        <enum value="0x340A" name="EGL_FORMAT_ASTC_10X8_SRGB_QCOM"/>
+        <enum value="0x340B" name="EGL_FORMAT_ASTC_10X10_SRGB_QCOM"/>
+        <enum value="0x340C" name="EGL_FORMAT_ASTC_12X10_SRGB_QCOM"/>
+        <enum value="0x340D" name="EGL_FORMAT_ASTC_12X12_SRGB_QCOM"/>
+        <enum value="0x340E" name="EGL_FORMAT_TP10_QCOM"/>
+        <enum value="0x340F" name="EGL_FORMAT_NV12_Y_QCOM"/>
+        <enum value="0x3410" name="EGL_FORMAT_NV12_UV_QCOM"/>
+        <enum value="0x3411" name="EGL_FORMAT_NV21_VU_QCOM"/>
+        <enum value="0x3412" name="EGL_FORMAT_NV12_4R_QCOM"/>
+        <enum value="0x3413" name="EGL_FORMAT_NV12_4R_Y_QCOM"/>
+        <enum value="0x3414" name="EGL_FORMAT_NV12_4R_UV_QCOM"/>
+        <enum value="0x3415" name="EGL_FORMAT_P010_QCOM"/>
+        <enum value="0x3416" name="EGL_FORMAT_P010_Y_QCOM"/>
+        <enum value="0x3417" name="EGL_FORMAT_P010_UV_QCOM"/>
+        <enum value="0x3418" name="EGL_FORMAT_TP10_Y_QCOM"/>
+        <enum value="0x3419" name="EGL_FORMAT_TP10_UV_QCOM"/>
+            <unused start="0x341A" end="0x341F"/>
+        <enum value="0x3420" name="EGL_GENERIC_TOKEN_1_QCOM"/>
+        <enum value="0x3421" name="EGL_GENERIC_TOKEN_2_QCOM"/>
+        <enum value="0x3422" name="EGL_GENERIC_TOKEN_3_QCOM"/>
+            <unused start="0x3423" end="0x342F"/>
     </enums>
 
     <enums namespace="EGL" start="0x3430" end="0x343F" vendor="ANDROID" comment="Reserved for Pablo Ceballos (Bug 15874)">
@@ -893,6 +1013,17 @@
     <enums namespace="EGL" start="0x3480" end="0x348F" vendor="ANGLE" comment="Reserved for Courtney Goeltzenleuchter - ANGLE (gitlab EGL bug 7)">
             <unused start="0x3480" end="0x348F"/>
     </enums>
+    <enums namespace="EGL" start="0x3490" end="0x349F" vendor="EXT" comment="Reserved for Courtney Goeltzenleuchter - Android (gitlab EGL bug 69)">
+        <enum value="0x3490" name="EGL_GL_COLORSPACE_DISPLAY_P3_PASSTHROUGH_EXT"/>
+            <unused start="0x3491" end="0x349F"/>
+    </enums>
+    <enums namespace="EGL" start="0x34A0" end="0x34AF" vendor="ANGLE" comment="Reserved for Ken Russell - ANGLE (via github pull request)">
+            <unused start="0x34A0" end="0x34AF"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x34B0" end="0x34BF" vendor="ARM" comment="Reserved for Jan-Harald Fredriksen (via github pull request)">
+        <unused start="0x34B0" end="0x34BF"/>
+    </enums>
 
 <!-- Please remember that new enumerant allocations must be obtained by
      request to the Khronos API registrar (see comments at the top of this
@@ -903,8 +1034,8 @@
 
 <!-- Reservable for future use. To generate a new range, allocate multiples
      of 16 starting at the lowest available point in this block. -->
-    <enums namespace="EGL" start="0x3490" end="0x3FFF" vendor="KHR" comment="Reserved for future use">
-            <unused start="0x3490" end="0x3FFF"/>
+    <enums namespace="EGL" start="0x34C0" end="0x3FFF" vendor="KHR" comment="Reserved for future use">
+            <unused start="0x34C0" end="0x3FFF"/>
     </enums>
 
     <enums namespace="EGL" start="0x8F70" end="0x8F7F" vendor="HI" comment="For Mark Callow, Khronos bug 4055. Shared with GL.">
@@ -1224,6 +1355,14 @@
             <param><ptype>EGLNativeDisplayType</ptype> <name>display_id</name></param>
         </command>
         <command>
+            <proto>char *<name>eglGetDisplayDriverConfig</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+        </command>
+        <command>
+            <proto>const char *<name>eglGetDisplayDriverName</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+        </command>
+        <command>
             <proto><ptype>EGLint</ptype> <name>eglGetError</name></proto>
         </command>
         <command>
@@ -1679,14 +1818,14 @@
             <proto><ptype>EGLBoolean</ptype> <name>eglSwapBuffersWithDamageEXT</name></proto>
             <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
             <param><ptype>EGLSurface</ptype> <name>surface</name></param>
-            <param><ptype>EGLint</ptype> *<name>rects</name></param>
+            <param>const <ptype>EGLint</ptype> *<name>rects</name></param>
             <param><ptype>EGLint</ptype> <name>n_rects</name></param>
         </command>
         <command>
             <proto><ptype>EGLBoolean</ptype> <name>eglSwapBuffersWithDamageKHR</name></proto>
             <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
             <param><ptype>EGLSurface</ptype> <name>surface</name></param>
-            <param><ptype>EGLint</ptype> *<name>rects</name></param>
+            <param>const <ptype>EGLint</ptype> *<name>rects</name></param>
             <param><ptype>EGLint</ptype> <name>n_rects</name></param>
         </command>
         <command>
@@ -1783,6 +1922,58 @@
             <param><ptype>EGLint</ptype> <name>external_win_id</name></param>
             <param><ptype>EGLint</ptype> <name>policy</name></param>
         </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglBindWaylandDisplayWL</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param>struct <ptype>wl_display</ptype> *<name>display</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglUnbindWaylandDisplayWL</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param>struct <ptype>wl_display</ptype> *<name>display</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglQueryWaylandBufferWL</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param>struct <ptype>wl_resource</ptype> *<name>buffer</name></param>
+            <param><ptype>EGLint</ptype> <name>attribute</name></param>
+            <param><ptype>EGLint</ptype> *<name>value</name></param>
+        </command>
+        <command>
+            <proto>struct <ptype>wl_buffer</ptype> *<name>eglCreateWaylandBufferFromImageWL</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLImageKHR</ptype> <name>image</name></param>
+        </command>
+        <command>
+             <proto><ptype>EGLBoolean</ptype> <name>eglStreamImageConsumerConnectNV</name></proto>
+             <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+             <param><ptype>EGLStreamKHR</ptype> <name>stream</name></param>
+             <param><ptype>EGLint</ptype> <name>num_modifiers</name></param>
+             <param><ptype>EGLuint64KHR</ptype> *<name>modifiers</name></param>
+             <param><ptype>EGLAttrib</ptype> *<name>attrib_list</name></param>
+        </command>
+        <command>
+             <proto><ptype>EGLint</ptype> <name>eglQueryStreamConsumerEventNV</name></proto>
+             <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+             <param><ptype>EGLStreamKHR</ptype> <name>stream</name></param>
+             <param><ptype>EGLTime</ptype> <name>timeout</name></param>
+             <param><ptype>EGLenum</ptype> *<name>event</name></param>
+             <param><ptype>EGLAttrib</ptype> *<name>aux</name></param>
+        </command>
+        <command>
+             <proto><ptype>EGLBoolean</ptype> <name>eglStreamAcquireImageNV</name></proto>
+             <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+             <param><ptype>EGLStreamKHR</ptype> <name>stream</name></param>
+             <param><ptype>EGLImage</ptype> *<name>pImage</name></param>
+             <param><ptype>EGLSync</ptype> <name>sync</name></param>
+        </command>
+        <command>
+             <proto><ptype>EGLBoolean</ptype> <name>eglStreamReleaseImageNV</name></proto>
+             <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+             <param><ptype>EGLStreamKHR</ptype> <name>stream</name></param>
+             <param><ptype>EGLImage</ptype> <name>image</name></param>
+             <param><ptype>EGLSync</ptype> <name>sync</name></param>
+        </command>
     </commands>
 
     <!-- SECTION: EGL API interface definitions. -->
@@ -2127,21 +2318,12 @@
                 <enum name="EGL_RECORDABLE_ANDROID"/>
             </require>
         </extension>
+        <extension name="EGL_ANDROID_GLES_layers" supported="egl"/>
         <extension name="EGL_ANGLE_d3d_share_handle_client_buffer" supported="egl">
             <require>
                 <enum name="EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE"/>
             </require>
         </extension>
-        <extension name="EGL_ANGLE_display_semaphore_share_group" supported="egl">
-            <require>
-                <enum name="EGL_DISPLAY_SEMAPHORE_SHARE_GROUP_ANGLE"/>
-            </require>
-        </extension>
-        <extension name="EGL_ANGLE_display_texture_share_group" supported="egl">
-            <require>
-                <enum name="EGL_DISPLAY_TEXTURE_SHARE_GROUP_ANGLE"/>
-            </require>
-        </extension>
         <extension name="EGL_ANGLE_device_d3d" supported="egl">
             <require>
                 <enum name="EGL_D3D9_DEVICE_ANGLE"/>
@@ -2261,6 +2443,11 @@
                 <enum name="EGL_GL_COLORSPACE_DISPLAY_P3_EXT"/>
             </require>
         </extension>
+        <extension name="EGL_EXT_gl_colorspace_display_p3_passthrough" supported="egl">
+            <require>
+                <enum name="EGL_GL_COLORSPACE_DISPLAY_P3_PASSTHROUGH_EXT"/>
+            </require>
+        </extension>
         <extension name="EGL_EXT_image_dma_buf_import" supported="egl">
             <require>
                 <enum name="EGL_LINUX_DMA_BUF_EXT"/>
@@ -2377,6 +2564,12 @@
                 <enum name="EGL_PLATFORM_X11_SCREEN_EXT"/>
             </require>
         </extension>
+        <extension name="EGL_EXT_platform_xcb" supported="egl">
+            <require>
+                <enum name="EGL_PLATFORM_XCB_EXT"/>
+                <enum name="EGL_PLATFORM_XCB_SCREEN_EXT"/>
+            </require>
+        </extension>
         <extension name="EGL_EXT_protected_content" supported="egl">
             <require>
                 <enum name="EGL_PROTECTED_CONTENT_EXT"/>
@@ -2853,6 +3046,12 @@
                 <enum name="EGL_PLATFORM_SURFACELESS_MESA"/>
             </require>
         </extension>
+        <extension name="EGL_MESA_query_driver" supported="egl">
+            <require>
+                <command name="eglGetDisplayDriverConfig"/>
+                <command name="eglGetDisplayDriverName"/>
+            </require>
+        </extension>
         <extension name="EGL_NOK_swap_region" supported="egl">
             <require>
                 <command name="eglSwapBuffersRegionNOK"/>
@@ -2927,6 +3126,11 @@
                 <command name="eglPostSubBufferNV"/>
             </require>
         </extension>
+        <extension name="EGL_NV_quadruple_buffer" supported="egl">
+            <require>
+                <enum name="EGL_QUADRUPLE_BUFFER_NV"/>
+            </require>
+        </extension>
         <extension name="EGL_NV_robustness_video_memory_purge" supported="egl">
             <require>
                 <enum name="EGL_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV"/>
@@ -2967,6 +3171,24 @@
                 <enum name="EGL_STREAM_CROSS_SYSTEM_NV"/>
             </require>
         </extension>
+        <extension name="EGL_NV_stream_dma" supported="egl">
+            <require>
+                <enum name="EGL_STREAM_DMA_NV"/>
+                <enum name="EGL_STREAM_DMA_SERVER_NV"/>
+            </require>
+        </extension>
+         <extension name="EGL_NV_stream_consumer_eglimage" supported="egl">
+            <require>
+                <enum name="EGL_STREAM_CONSUMER_IMAGE_NV"/>
+                <enum name="EGL_STREAM_IMAGE_ADD_NV"/>
+                <enum name="EGL_STREAM_IMAGE_REMOVE_NV"/>
+                <enum name="EGL_STREAM_IMAGE_AVAILABLE_NV"/>
+                <command name="eglStreamImageConsumerConnectNV"/>
+                <command name="eglQueryStreamConsumerEventNV"/>
+                <command name="eglStreamAcquireImageNV"/>
+                <command name="eglStreamReleaseImageNV"/>
+            </require>
+        </extension>
         <extension name="EGL_NV_stream_fifo_next" supported="egl">
             <require>
                 <enum name="EGL_PENDING_FRAME_NV"/>
@@ -3084,6 +3306,11 @@
                 <command name="eglGetSystemTimeNV"/>
             </require>
         </extension>
+        <extension name="EGL_NV_triple_buffer" supported="egl">
+            <require>
+                <enum name="EGL_TRIPLE_BUFFER_NV"/>
+            </require>
+        </extension>
         <extension name="EGL_TIZEN_image_native_buffer" supported="egl">
             <require>
                 <enum name="EGL_NATIVE_BUFFER_TIZEN"/>
@@ -3128,5 +3355,55 @@
                 <enum name="EGL_FRONT_BUFFER_EXT"/>
             </require>
         </extension>
+        <extension name="EGL_NV_stream_origin" supported="egl">
+            <require>
+                <enum name="EGL_STREAM_FRAME_ORIGIN_X_NV"/>
+                <enum name="EGL_STREAM_FRAME_ORIGIN_Y_NV"/>
+                <enum name="EGL_STREAM_FRAME_MAJOR_AXIS_NV"/>
+                <enum name="EGL_CONSUMER_AUTO_ORIENTATION_NV"/>
+                <enum name="EGL_PRODUCER_AUTO_ORIENTATION_NV"/>
+                <enum name="EGL_LEFT_NV"/>
+                <enum name="EGL_RIGHT_NV"/>
+                <enum name="EGL_TOP_NV"/>
+                <enum name="EGL_BOTTOM_NV"/>
+                <enum name="EGL_X_AXIS_NV"/>
+                <enum name="EGL_Y_AXIS_NV"/>
+            </require>
+        </extension>
+        <extension name="EGL_WL_bind_wayland_display" supported="egl">
+            <require>
+                <enum name="EGL_WAYLAND_BUFFER_WL"/>
+                <enum name="EGL_WAYLAND_PLANE_WL"/>
+                <enum name="EGL_TEXTURE_Y_U_V_WL"/>
+                <enum name="EGL_TEXTURE_Y_UV_WL"/>
+                <enum name="EGL_TEXTURE_Y_XUXV_WL"/>
+                <enum name="EGL_TEXTURE_EXTERNAL_WL"/>
+                <enum name="EGL_WAYLAND_Y_INVERTED_WL"/>
+
+                <command name="eglBindWaylandDisplayWL"/>
+                <command name="eglUnbindWaylandDisplayWL"/>
+                <command name="eglQueryWaylandBufferWL"/>
+                <type name="PFNEGLBINDWAYLANDDISPLAYWL"/>
+                <type name="PFNEGLUNBINDWAYLANDDISPLAYWL"/>
+                <type name="PFNEGLQUERYWAYLANDBUFFERWL"/>
+            </require>
+        </extension>
+        <extension name="EGL_WL_create_wayland_buffer_from_image" supported="egl">
+            <require>
+                <command name="eglCreateWaylandBufferFromImageWL"/>
+                <type name="PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWL"/>
+            </require>
+        </extension>
+        <extension name="EGL_ARM_image_format" supported="egl">
+            <require>
+                <enum name="EGL_COLOR_COMPONENT_TYPE_UNSIGNED_INTEGER_ARM"/>
+                <enum name="EGL_COLOR_COMPONENT_TYPE_INTEGER_ARM"/>
+            </require>
+        </extension>
+        <extension name="EGL_EXT_device_query_name" supported="egl">
+            <require>
+                <enum name="EGL_RENDERER_EXT"/>
+            </require>
+        </extension>
     </extensions>
 </registry>
diff --git a/scripts/egl_angle_ext.xml b/scripts/egl_angle_ext.xml
index d164b16..1574a68 100644
--- a/scripts/egl_angle_ext.xml
+++ b/scripts/egl_angle_ext.xml
@@ -14,7 +14,7 @@
             <proto><ptype>EGLDeviceEXT</ptype> <name>eglCreateDeviceANGLE</name></proto>
             <param><ptype>EGLint</ptype> <name>device_type</name></param>
             <param>void *<name>native_device</name></param>
-            <param>const <ptype>EGLattrib</ptype> *<name>attrib_list</name></param>
+            <param>const <ptype>EGLAttrib</ptype> *<name>attrib_list</name></param>
         </command>
         <command>
             <proto><ptype>EGLBoolean</ptype> <name>eglReleaseDeviceANGLE</name></proto>
@@ -108,6 +108,12 @@
             <proto><pytpe>void</pytpe> <name>eglHandleGPUSwitchANGLE</name></proto>
             <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
         </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglQueryDisplayAttribANGLE</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLint</ptype> <name>attribute</name></param>
+            <param><ptype>EGLAttrib *</ptype> <name>value</name></param>
+        </command>
     </commands>
     <!-- SECTION: ANGLE extension interface definitions -->
     <extensions>
@@ -159,5 +165,15 @@
                 <command name="eglHandleGPUSwitchANGLE"/>
             </require>
         </extension>
+        <extension name="EGL_ANGLE_display_semaphore_share_group" supported="egl">
+            <require>
+                <enum name="EGL_DISPLAY_SEMAPHORE_SHARE_GROUP_ANGLE"/>
+            </require>
+        </extension>
+        <extension name="EGL_ANGLE_display_texture_share_group" supported="egl">
+            <require>
+                <enum name="EGL_DISPLAY_TEXTURE_SHARE_GROUP_ANGLE"/>
+            </require>
+        </extension>
     </extensions>
 </registry>
diff --git a/scripts/entry_point_packed_egl_enums.json b/scripts/entry_point_packed_egl_enums.json
new file mode 100644
index 0000000..c291ea9
--- /dev/null
+++ b/scripts/entry_point_packed_egl_enums.json
@@ -0,0 +1,72 @@
+{
+    "description": [
+        "Copyright 2020 The ANGLE Project Authors. All rights reserved.",
+        "Use of this source code is governed by a BSD-style license that can be",
+        "found in the LICENSE file.",
+        "",
+        "entry_point_packed_egl_enums.json: Metadata for packing entry point params.",
+        "",
+        "Note that all entry points have their suffixes stripped in this file.",
+        "These enums are used by generate_entry_points.py."
+    ],
+    "eglChooseConfig": {
+        "attrib_list": "const AttributeMap &"
+    },
+    "eglCreateContext": {
+        "attrib_list": "const AttributeMap &"
+    },
+    "eglCreateImage": {
+        "attrib_list": "const AttributeMap &"
+    },
+    "eglCreateNativeClientBuffer": {
+        "attrib_list": "const AttributeMap &"
+    },
+    "eglCreatePbufferSurface": {
+        "attrib_list": "const AttributeMap &"
+    },
+    "eglCreatePixmapSurface": {
+        "attrib_list": "const AttributeMap &"
+    },
+    "eglCreatePbufferFromClientBuffer": {
+        "attrib_list": "const AttributeMap &"
+    },
+    "eglCreatePlatformPixmapSurface": {
+        "attrib_list": "const AttributeMap &"
+    },
+    "eglCreatePlatformWindowSurface": {
+        "attrib_list": "const AttributeMap &"
+    },
+    "eglCreateStream": {
+        "attrib_list": "const AttributeMap &"
+    },
+    "eglCreateStreamProducerD3DTexture": {
+        "attrib_list": "const AttributeMap &"
+    },
+    "eglCreateSync": {
+        "attrib_list": "const AttributeMap &"
+    },
+    "eglCreateWindowSurface": {
+        "attrib_list": "const AttributeMap &"
+    },
+    "eglDebugMessageControl": {
+        "attrib_list": "const AttributeMap &"
+    },
+    "eglGetCompositorTimingSupported": {
+        "name": "CompositorTiming"
+    },
+    "eglGetFrameTimestampSupported": {
+        "timestamp": "Timestamp"
+    },
+    "eglGetPlatformDisplay": {
+        "attrib_list": "const AttributeMap &"
+    },
+    "eglLabelObject": {
+        "objectType": "ObjectType"
+    },
+    "eglStreamConsumerGLTextureExternalAttribsNV": {
+        "attrib_list": "const AttributeMap &"
+    },
+    "eglStreamPostD3DTexture": {
+        "attrib_list": "const AttributeMap &"
+    }
+}
\ No newline at end of file
diff --git a/scripts/gen_proc_table.py b/scripts/gen_proc_table.py
index 43e821d..8f51af4 100644
--- a/scripts/gen_proc_table.py
+++ b/scripts/gen_proc_table.py
@@ -47,8 +47,8 @@
 
 includes_gles = """#include "libGLESv2/proc_table_egl.h"
 
-#include "libGLESv2/entry_points_egl.h"
-#include "libGLESv2/entry_points_egl_ext.h"
+#include "libGLESv2/entry_points_egl_autogen.h"
+#include "libGLESv2/entry_points_egl_ext_autogen.h"
 #include "libGLESv2/entry_points_gles_1_0_autogen.h"
 #include "libGLESv2/entry_points_gles_2_0_autogen.h"
 #include "libGLESv2/entry_points_gles_3_0_autogen.h"
@@ -61,25 +61,10 @@
 includes_gl = """#include "libGL/proc_table_wgl.h"
 
 #include "libGL/entry_points_wgl.h"
-#include "libGL/entry_points_gl_1_0_autogen.h"
-#include "libGL/entry_points_gl_1_1_autogen.h"
-#include "libGL/entry_points_gl_1_2_autogen.h"
-#include "libGL/entry_points_gl_1_3_autogen.h"
-#include "libGL/entry_points_gl_1_4_autogen.h"
-#include "libGL/entry_points_gl_1_5_autogen.h"
-#include "libGL/entry_points_gl_2_0_autogen.h"
-#include "libGL/entry_points_gl_2_1_autogen.h"
-#include "libGL/entry_points_gl_3_0_autogen.h"
-#include "libGL/entry_points_gl_3_1_autogen.h"
-#include "libGL/entry_points_gl_3_2_autogen.h"
-#include "libGL/entry_points_gl_3_3_autogen.h"
-#include "libGL/entry_points_gl_4_0_autogen.h"
-#include "libGL/entry_points_gl_4_1_autogen.h"
-#include "libGL/entry_points_gl_4_2_autogen.h"
-#include "libGL/entry_points_gl_4_3_autogen.h"
-#include "libGL/entry_points_gl_4_4_autogen.h"
-#include "libGL/entry_points_gl_4_5_autogen.h"
-#include "libGL/entry_points_gl_4_6_autogen.h"
+#include "libGL/entry_points_gl_1_autogen.h"
+#include "libGL/entry_points_gl_2_autogen.h"
+#include "libGL/entry_points_gl_3_autogen.h"
+#include "libGL/entry_points_gl_4_autogen.h"
 #include "platform/PlatformMethods.h"
 """
 
@@ -87,6 +72,10 @@
 import angle_format
 
 
+def _get_annotations(versions):
+    return ["%d_%d" % version for version in versions]
+
+
 def main():
 
     # auto_script parameters.
@@ -104,8 +93,7 @@
 
     glesxml = registry_xml.RegistryXML('gl.xml', 'gl_angle_ext.xml')
 
-    for annotation in ["2_0", "3_0", "3_1", "3_2", "1_0"]:
-
+    for annotation in _get_annotations(registry_xml.GLES_VERSIONS):
         name_prefix = "GL_ES_VERSION_"
         if annotation[0] == '1':
             name_prefix = "GL_VERSION_ES_CM_"
@@ -128,8 +116,7 @@
 
     eglxml = registry_xml.RegistryXML('egl.xml', 'egl_angle_ext.xml')
 
-    for annotation in ["1_0", "1_1", "1_2", "1_3", "1_4", "1_5"]:
-
+    for annotation in _get_annotations(registry_xml.EGL_VERSIONS):
         name_prefix = "EGL_VERSION_"
         feature_name = "{}{}".format(name_prefix, annotation)
         eglxml.AddCommands(feature_name, annotation)
@@ -173,11 +160,7 @@
     # libGL proc table
     glxml = registry_xml.RegistryXML('gl.xml')
 
-    for annotation in [
-            "1_0", "1_1", "1_2", "1_3", "1_4", "1_5", "2_0", "2_1", "3_0", "3_1", "3_2", "3_3",
-            "4_0", "4_1", "4_2", "4_3", "4_4", "4_5", "4_6"
-    ]:
-
+    for annotation in _get_annotations(registry_xml.DESKTOP_GL_VERSIONS):
         name_prefix = "GL_VERSION_"
         feature_name = "{}{}".format(name_prefix, annotation)
         glxml.AddCommands(feature_name, annotation)
@@ -186,8 +169,7 @@
 
     wglxml = registry_xml.RegistryXML('wgl.xml')
 
-    for annotation in ["1_0"]:
-
+    for annotation in _get_annotations(registry_xml.WGL_VERSIONS):
         name_prefix = "WGL_VERSION_"
         feature_name = "{}{}".format(name_prefix, annotation)
         wglxml.AddCommands(feature_name, annotation)
diff --git a/scripts/generate_android_bp.py b/scripts/generate_android_bp.py
index dfa7d75..f633714 100644
--- a/scripts/generate_android_bp.py
+++ b/scripts/generate_android_bp.py
@@ -312,7 +312,7 @@
     return common_bp
 
 
-def library_target_to_blueprint(target, build_info):
+def library_target_to_blueprint(target, build_info, copy_to_vendor, relative_install_path):
     bps_for_abis = {}
     blueprint_type = ""
     for abi in abi_targets:
@@ -339,6 +339,11 @@
 
         bp['sdk_version'] = sdk_version
         bp['stl'] = stl
+        if copy_to_vendor:
+            bp['vendor'] = True
+        if relative_install_path is not None:
+            assert copy_to_vendor
+            bp['target'] = {'android': {'relative_install_path': relative_install_path}}
         bps_for_abis[abi] = bp
 
     common_bp = merge_bps(bps_for_abis)
@@ -441,11 +446,14 @@
     return blueprint_type, bp
 
 
-def gn_target_to_blueprint(target, build_info):
+def gn_target_to_blueprint(target, build_info, copy_to_vendor, relative_install_path):
     for abi in abi_targets:
         gn_type = build_info[abi][target]['type']
         if gn_type in blueprint_library_target_types:
-            return library_target_to_blueprint(target, build_info)
+            if copy_to_vendor and gn_type == 'shared_library':
+                return library_target_to_blueprint(target, build_info, True, relative_install_path)
+            else:
+                return library_target_to_blueprint(target, build_info, False, None)
         elif gn_type in blueprint_gen_types:
             return action_target_to_blueprint(target, build_info[abi])
         else:
@@ -481,7 +489,13 @@
             'gn_json_' + fixed_abi,
             help=fixed_abi +
             'gn desc in json format. Generated with \'gn desc <out_dir> --format=json "*"\'.')
+    parser.add_argument(
+        '--copy-to-vendor-partition',
+        help='whether the shared library target will copy to the vendor partition',
+        action='store_true',
+        default=False)
     args = vars(parser.parse_args())
+    copy_to_vendor = args['copy_to_vendor_partition']
 
     build_info = {}
     for abi in abi_targets:
@@ -498,7 +512,13 @@
 
     blueprint_targets = []
     for target in targets_to_write:
-        blueprint_targets.append(gn_target_to_blueprint(target, build_info))
+        blueprint_targets.append(
+            gn_target_to_blueprint(
+                target,
+                build_info,
+                copy_to_vendor,
+                relative_install_path='egl' if copy_to_vendor and
+                (target in root_targets) else None))
 
     # Add APKs with all of the root libraries
     blueprint_targets.append(('filegroup', {
diff --git a/scripts/generate_entry_points.py b/scripts/generate_entry_points.py
index db3cb14..ad65869 100755
--- a/scripts/generate_entry_points.py
+++ b/scripts/generate_entry_points.py
@@ -12,14 +12,22 @@
 from datetime import date
 import registry_xml
 
+# API types
+GL, GLES, WGL, EGL = ["GL", "GLES", "WGL", "EGL"]
+
+# Paths
+EGL_GET_LABELED_OBJECT_DATA_PATH = "../src/libGLESv2/egl_get_labeled_object_data.json"
+EGL_STUBS_HEADER_PATH = "../src/libGLESv2/egl_stubs_autogen.h"
+EGL_EXT_STUBS_HEADER_PATH = "../src/libGLESv2/egl_ext_stubs_autogen.h"
+
 # List of GLES1 extensions for which we don't need to add Context.h decls.
-gles1_no_context_decl_extensions = [
+GLES1_NO_CONTEXT_DECL_EXTENSIONS = [
     "GL_OES_framebuffer_object",
 ]
 
 # This is a list of exceptions for entry points which don't want to have
 # the EVENT macro. This is required for some debug marker entry points.
-no_event_marker_exceptions_list = sorted([
+NO_EVENT_MARKER_EXCEPTIONS_LIST = sorted([
     "glPushGroupMarkerEXT",
     "glPopGroupMarkerEXT",
     "glInsertEventMarkerEXT",
@@ -28,22 +36,19 @@
 # glRenderbufferStorageMultisampleEXT aliases glRenderbufferStorageMultisample on desktop GL, and is
 # marked as such in the registry.  However, that is not correct for GLES where this entry point
 # comes from GL_EXT_multisampled_render_to_texture which is never promoted to core GLES.
-aliasing_exceptions = [
+ALIASING_EXCEPTIONS = [
     'glRenderbufferStorageMultisampleEXT',
     'renderbufferStorageMultisampleEXT',
 ]
 
-
-def is_aliasing_excepted(cmd_name, is_gles):
-    return is_gles and cmd_name in aliasing_exceptions
-
 # Strip these suffixes from Context entry point names. NV is excluded (for now).
-strip_suffixes = ["ANGLE", "EXT", "KHR", "OES", "CHROMIUM", "OVR"]
+STRIP_SUFFIXES = ["ANDROID", "ANGLE", "EXT", "KHR", "OES", "CHROMIUM", "OVR"]
 
-template_entry_point_header = """// GENERATED FILE - DO NOT EDIT.
+TEMPLATE_ENTRY_POINT_HEADER = """\
+// GENERATED FILE - DO NOT EDIT.
 // Generated by {script_name} using data from {data_source_name}.
 //
-// Copyright {year} The ANGLE Project Authors. All rights reserved.
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
@@ -55,18 +60,19 @@
 
 {includes}
 
-namespace gl
+{ns}
 {{
 {entry_points}
-}}  // namespace gl
+}}  // {ns}
 
 #endif  // {lib}_ENTRY_POINTS_{annotation_upper}_AUTOGEN_H_
 """
 
-template_entry_point_source = """// GENERATED FILE - DO NOT EDIT.
+TEMPLATE_ENTRY_POINT_SOURCE = """\
+// GENERATED FILE - DO NOT EDIT.
 // Generated by {script_name} using data from {data_source_name}.
 //
-// Copyright {year} The ANGLE Project Authors. All rights reserved.
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
@@ -75,15 +81,16 @@
 
 {includes}
 
-namespace gl
+{ns}
 {{
-{entry_points}}}  // namespace gl
+{entry_points}}}  // {ns}
 """
 
-template_entry_points_enum_header = """// GENERATED FILE - DO NOT EDIT.
+TEMPLATE_ENTRY_POINTS_ENUM_HEADER = """\
+// GENERATED FILE - DO NOT EDIT.
 // Generated by {script_name} using data from {data_source_name}.
 //
-// Copyright {year} The ANGLE Project Authors. All rights reserved.
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
@@ -93,7 +100,7 @@
 #ifndef COMMON_ENTRYPOINTSENUM_AUTOGEN_H_
 #define COMMON_ENTRYPOINTSENUM_AUTOGEN_H_
 
-namespace gl
+namespace angle
 {{
 enum class EntryPoint
 {{
@@ -101,17 +108,19 @@
 }};
 
 const char *GetEntryPointName(EntryPoint ep);
-}}  // namespace gl
+}}  // namespace angle
 #endif  // COMMON_ENTRY_POINTS_ENUM_AUTOGEN_H_
 """
 
-template_entry_points_name_case = """        case EntryPoint::{enum}:
-            return "gl{enum}";"""
+TEMPLATE_ENTRY_POINTS_NAME_CASE = """\
+        case EntryPoint::{enum}:
+            return "{cmd}";"""
 
-template_entry_points_enum_source = """// GENERATED FILE - DO NOT EDIT.
+TEMPLATE_ENTRY_POINTS_ENUM_SOURCE = """\
+// GENERATED FILE - DO NOT EDIT.
 // Generated by {script_name} using data from {data_source_name}.
 //
-// Copyright {year} The ANGLE Project Authors. All rights reserved.
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
@@ -122,7 +131,7 @@
 
 #include "common/debug.h"
 
-namespace gl
+namespace angle
 {{
 const char *GetEntryPointName(EntryPoint ep)
 {{
@@ -134,17 +143,18 @@
             return "error";
     }}
 }}
-}}  // namespace gl
+}}  // namespace angle
 """
 
-template_lib_entry_point_source = """// GENERATED FILE - DO NOT EDIT.
+TEMPLATE_LIB_ENTRY_POINT_SOURCE = """\
+// GENERATED FILE - DO NOT EDIT.
 // Generated by {script_name} using data from {data_source_name}.
 //
-// Copyright {year} The ANGLE Project Authors. All rights reserved.
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// {lib_name}.cpp: Implements the exported {lib_description} functions.
+// {lib_name}_autogen.cpp: Implements the exported {lib_description} functions.
 
 {includes}
 extern "C" {{
@@ -152,12 +162,13 @@
 }} // extern "C"
 """
 
-template_entry_point_decl = """ANGLE_EXPORT {return_type}GL_APIENTRY {name}{explicit_context_suffix}({explicit_context_param}{explicit_context_comma}{params});"""
+TEMPLATE_ENTRY_POINT_DECL = """ANGLE_EXPORT {return_type}{api}APIENTRY {name}{explicit_context_suffix}({explicit_context_param}{explicit_context_comma}{params});"""
 
-template_entry_point_no_return = """void GL_APIENTRY {name}{explicit_context_suffix}({explicit_context_param}{explicit_context_comma}{params})
+TEMPLATE_GLES_ENTRY_POINT_NO_RETURN = """\
+void GL_APIENTRY {name}{explicit_context_suffix}({explicit_context_param}{explicit_context_comma}{params})
 {{
     Context *context = {context_getter};
-    {event_comment}EVENT(context, gl::EntryPoint::{name}, "gl{name}", "context = %d{comma_if_needed}{format_params}", CID(context){comma_if_needed}{pass_params});
+    {event_comment}EVENT(context, GL{name}, "context = %d{comma_if_needed}{format_params}", CID(context){comma_if_needed}{pass_params});
 
     if ({valid_context_check})
     {{{assert_explicit_context}{packed_gl_enum_conversions}
@@ -176,10 +187,11 @@
 }}
 """
 
-template_entry_point_with_return = """{return_type}GL_APIENTRY {name}{explicit_context_suffix}({explicit_context_param}{explicit_context_comma}{params})
+TEMPLATE_GLES_ENTRY_POINT_WITH_RETURN = """\
+{return_type}GL_APIENTRY {name}{explicit_context_suffix}({explicit_context_param}{explicit_context_comma}{params})
 {{
     Context *context = {context_getter};
-    {event_comment}EVENT(context, gl::EntryPoint::{name}, "gl{name}", "context = %d{comma_if_needed}{format_params}", CID(context){comma_if_needed}{pass_params});
+    {event_comment}EVENT(context, GL{name}, "context = %d{comma_if_needed}{format_params}", CID(context){comma_if_needed}{pass_params});
 
     {return_type} returnValue;
     if ({valid_context_check})
@@ -192,23 +204,96 @@
         }}
         else
         {{
-            returnValue = GetDefaultReturnValue<EntryPoint::{name}, {return_type}>();
-        }}
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GL{name}, {return_type}>();
+    }}
         ANGLE_CAPTURE({name}, isCallValid, {validate_params}, returnValue);
     }}
     else
     {{
         {constext_lost_error_generator}
-        returnValue = GetDefaultReturnValue<EntryPoint::{name}, {return_type}>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GL{name}, {return_type}>();
     }}
     return returnValue;
 }}
 """
 
-context_header = """// GENERATED FILE - DO NOT EDIT.
+TEMPLATE_EGL_ENTRY_POINT_NO_RETURN = """\
+void EGLAPIENTRY EGL_{name}({params})
+{{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT({name}, "{format_params}"{comma_if_needed}{pass_params});
+
+    Thread *thread = egl::GetCurrentThread();
+
+    {packed_gl_enum_conversions}
+
+    ANGLE_EGL_VALIDATE_VOID(thread, {name}, {labeled_object}, {internal_params});
+
+    {name}(thread{comma_if_needed}{internal_params});
+}}
+"""
+
+TEMPLATE_EGL_ENTRY_POINT_WITH_RETURN = """\
+{return_type}EGLAPIENTRY EGL_{name}({params})
+{{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT({name}, "{format_params}"{comma_if_needed}{pass_params});
+
+    Thread *thread = egl::GetCurrentThread();
+
+    {packed_gl_enum_conversions}
+
+    ANGLE_EGL_VALIDATE(thread, {name}, {labeled_object}, {return_type}{comma_if_needed}{internal_params});
+
+    return {name}(thread{comma_if_needed}{internal_params});
+}}
+"""
+
+TEMPLATE_EGL_STUBS_HEADER = """\
+// GENERATED FILE - DO NOT EDIT.
 // Generated by {script_name} using data from {data_source_name}.
 //
-// Copyright {year} The ANGLE Project Authors. All rights reserved.
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// {annotation_lower}_stubs_autogen.h: Stubs for {title} entry points.
+
+#ifndef LIBGLESV2_{annotation_upper}_STUBS_AUTOGEN_H_
+#define LIBGLESV2_{annotation_upper}_STUBS_AUTOGEN_H_
+
+#include <EGL/egl.h>
+#include <EGL/eglext.h>
+
+#include "common/PackedEGLEnums_autogen.h"
+
+namespace gl
+{{
+class Context;
+}}  // namespace gl
+
+namespace egl
+{{
+class AttributeMap;
+class Device;
+class Display;
+class Image;
+class Stream;
+class Surface;
+class Sync;
+class Thread;
+struct Config;
+
+{stubs}
+}}  // namespace egl
+#endif  // LIBGLESV2_{annotation_upper}_STUBS_AUTOGEN_H_
+"""
+
+CONTEXT_HEADER = """\
+// GENERATED FILE - DO NOT EDIT.
+// Generated by {script_name} using data from {data_source_name}.
+//
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
@@ -223,18 +308,28 @@
 #endif // ANGLE_CONTEXT_API_{version}_AUTOGEN_H_
 """
 
-context_decl_format = """    {return_type} {name_lower_no_suffix}({internal_params}){maybe_const}; \\"""
+CONTEXT_DECL_FORMAT = """    {return_type} {name_lower_no_suffix}({internal_params}){maybe_const}; \\"""
 
-libgles_entry_point_def = """{return_type}GL_APIENTRY gl{name}{explicit_context_suffix}({explicit_context_param}{explicit_context_comma}{params})
+TEMPLATE_GL_ENTRY_POINT_EXPORT = """\
+{return_type}GL_APIENTRY gl{name}{explicit_context_suffix}({explicit_context_param}{explicit_context_comma}{params})
 {{
     return gl::{name}{explicit_context_suffix}({explicit_context_internal_param}{explicit_context_comma}{internal_params});
 }}
 """
 
-template_glext_explicit_context_inc = """// GENERATED FILE - DO NOT EDIT.
+TEMPLATE_EGL_ENTRY_POINT_EXPORT = """\
+{return_type}EGLAPIENTRY egl{name}({params})
+{{
+    EnsureEGLLoaded();
+    return EGL_{name}({internal_params});
+}}
+"""
+
+TEMPLATE_GLEXT_EXPLICIT_CONTEXT_INC = """\
+// GENERATED FILE - DO NOT EDIT.
 // Generated by {script_name} using data from {data_source_name}.
 //
-// Copyright {year} The ANGLE Project Authors. All rights reserved.
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
@@ -247,13 +342,14 @@
 #endif
 """
 
-template_glext_function_pointer = """typedef {return_type}(GL_APIENTRYP PFN{name_upper}{explicit_context_suffix_upper}PROC)({explicit_context_param}{explicit_context_comma}{params});"""
-template_glext_function_prototype = """{apicall} {return_type}GL_APIENTRY {name}{explicit_context_suffix}({explicit_context_param}{explicit_context_comma}{params});"""
+TEMPLATE_GLEXT_FUNCTION_POINTER = """typedef {return_type}(GL_APIENTRYP PFN{name_upper}{explicit_context_suffix_upper}PROC)({explicit_context_param}{explicit_context_comma}{params});"""
+TEMPLATE_GLEXT_FUNCTION_PROTOTYPE = """{apicall} {return_type}GL_APIENTRY {name}{explicit_context_suffix}({explicit_context_param}{explicit_context_comma}{params});"""
 
-template_validation_header = """// GENERATED FILE - DO NOT EDIT.
+TEMPLATE_GL_VALIDATION_HEADER = """\
+// GENERATED FILE - DO NOT EDIT.
 // Generated by {script_name} using data from {data_source_name}.
 //
-// Copyright {year} The ANGLE Project Authors. All rights reserved.
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
@@ -275,18 +371,43 @@
 #endif  // LIBANGLE_VALIDATION_{annotation}_AUTOGEN_H_
 """
 
-template_capture_header = """// GENERATED FILE - DO NOT EDIT.
+TEMPLATE_EGL_VALIDATION_HEADER = """\
+// GENERATED FILE - DO NOT EDIT.
 // Generated by {script_name} using data from {data_source_name}.
 //
-// Copyright {year} The ANGLE Project Authors. All rights reserved.
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// capture_gles_{annotation}_autogen.h:
+// validation{annotation}_autogen.h:
+//   Validation functions for the {comment} entry points.
+
+#ifndef LIBANGLE_VALIDATION_{annotation}_AUTOGEN_H_
+#define LIBANGLE_VALIDATION_{annotation}_AUTOGEN_H_
+
+#include "libANGLE/validationEGL.h"
+
+namespace egl
+{{
+{prototypes}
+}}  // namespace egl
+
+#endif  // LIBANGLE_VALIDATION_{annotation}_AUTOGEN_H_
+"""
+
+TEMPLATE_CAPTURE_HEADER = """\
+// GENERATED FILE - DO NOT EDIT.
+// Generated by {script_name} using data from {data_source_name}.
+//
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// capture_gles_{annotation_lower}_autogen.h:
 //   Capture functions for the OpenGL ES {comment} entry points.
 
-#ifndef LIBANGLE_CAPTURE_GLES_{annotation}_AUTOGEN_H_
-#define LIBANGLE_CAPTURE_GLES_{annotation}_AUTOGEN_H_
+#ifndef LIBANGLE_CAPTURE_GLES_{annotation_upper}_AUTOGEN_H_
+#define LIBANGLE_CAPTURE_GLES_{annotation_upper}_AUTOGEN_H_
 
 #include "common/PackedEnums.h"
 #include "libANGLE/FrameCapture.h"
@@ -296,13 +417,14 @@
 {prototypes}
 }}  // namespace gl
 
-#endif  // LIBANGLE_CAPTURE_GLES_{annotation}_AUTOGEN_H_
+#endif  // LIBANGLE_CAPTURE_GLES_{annotation_upper}_AUTOGEN_H_
 """
 
-template_capture_source = """// GENERATED FILE - DO NOT EDIT.
+TEMPLATE_CAPTURE_SOURCE = """\
+// GENERATED FILE - DO NOT EDIT.
 // Generated by {script_name} using data from {data_source_name}.
 //
-// Copyright {year} The ANGLE Project Authors. All rights reserved.
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
@@ -324,7 +446,7 @@
 }}  // namespace gl
 """
 
-template_capture_method_with_return_value = """
+TEMPLATE_CAPTURE_METHOD_WITH_RETURN_VALUE = """
 CallCapture Capture{short_name}({params_with_type}, {return_value_type_original} returnValue)
 {{
     ParamBuffer paramBuffer;
@@ -335,26 +457,26 @@
     InitParamValue(ParamType::T{return_value_type_custom}, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::{short_name}, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GL{short_name}, std::move(paramBuffer));
 }}
 """
 
-template_capture_method_no_return_value = """
+TEMPLATE_CAPTURE_METHOD_NO_RETURN_VALUE = """
 CallCapture Capture{short_name}({params_with_type})
 {{
     ParamBuffer paramBuffer;
 
     {parameter_captures}
 
-    return CallCapture(gl::EntryPoint::{short_name}, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GL{short_name}, std::move(paramBuffer));
 }}
 """
 
-template_parameter_capture_value = """paramBuffer.addValueParam("{name}", ParamType::T{type}, {name});"""
+TEMPLATE_PARAMETER_CAPTURE_VALUE = """paramBuffer.addValueParam("{name}", ParamType::T{type}, {name});"""
 
-template_parameter_capture_gl_enum = """paramBuffer.addEnumParam("{name}", GLenumGroup::{group}, ParamType::T{type}, {name});"""
+TEMPLATE_PARAMETER_CAPTURE_GL_ENUM = """paramBuffer.addEnumParam("{name}", GLenumGroup::{group}, ParamType::T{type}, {name});"""
 
-template_parameter_capture_pointer = """
+TEMPLATE_PARAMETER_CAPTURE_POINTER = """
     if (isCallValid)
     {{
         ParamCapture {name}Param("{name}", ParamType::T{type});
@@ -370,12 +492,13 @@
     }}
 """
 
-template_parameter_capture_pointer_func = """void {name}({params});"""
+TEMPLATE_PARAMETER_CAPTURE_POINTER_FUNC = """void {name}({params});"""
 
-template_capture_replay_source = """// GENERATED FILE - DO NOT EDIT.
+TEMPLATE_CAPTURE_REPLAY_SOURCE = """\
+// GENERATED FILE - DO NOT EDIT.
 // Generated by {script_name} using data from {data_source_name}.
 //
-// Copyright {year} The ANGLE Project Authors. All rights reserved.
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
@@ -412,63 +535,82 @@
 
 """
 
-template_capture_replay_call_case = """case gl::EntryPoint::{entry_point}:
+TEMPLATE_CAPTURE_REPLAY_CALL_CASE = """case angle::EntryPoint::GL{entry_point}:
     context->{context_call}({param_value_access});break;"""
 
-static_cast_to_dict = {
-    "GLintptr": "unsigned long long",
-    "GLsizeiptr": "unsigned long long",
-    "GLuint64": "unsigned long long",
-}
+POINTER_FORMAT = "0x%016\" PRIxPTR \""
+UNSIGNED_LONG_LONG_FORMAT = "%llu"
+HEX_LONG_LONG_FORMAT = "0x%llX"
 
-reinterpret_cast_to_dict = {
-    "GLsync": "uintptr_t",
-    "GLDEBUGPROC": "uintptr_t",
-    "GLDEBUGPROCKHR": "uintptr_t",
-    "GLeglClientBufferEXT": "uintptr_t",
-    "GLeglImageOES": "uintptr_t",
-}
-
-format_dict = {
+FORMAT_DICT = {
     "GLbitfield": "%s",
     "GLboolean": "%s",
     "GLbyte": "%d",
     "GLclampx": "0x%X",
-    "GLDEBUGPROC": "0x%016\" PRIxPTR \"",
-    "GLDEBUGPROCKHR": "0x%016\" PRIxPTR \"",
+    "GLDEBUGPROC": POINTER_FORMAT,
+    "GLDEBUGPROCKHR": POINTER_FORMAT,
     "GLdouble": "%f",
-    "GLeglClientBufferEXT": "0x%016\" PRIxPTR \"",
-    "GLeglImageOES": "0x%016\" PRIxPTR \"",
+    "GLeglClientBufferEXT": POINTER_FORMAT,
+    "GLeglImageOES": POINTER_FORMAT,
     "GLenum": "%s",
     "GLfixed": "0x%X",
     "GLfloat": "%f",
     "GLint": "%d",
-    "GLintptr": "%llu",
+    "GLintptr": UNSIGNED_LONG_LONG_FORMAT,
     "GLshort": "%d",
     "GLsizei": "%d",
-    "GLsizeiptr": "%llu",
-    "GLsync": "0x%016\" PRIxPTR \"",
+    "GLsizeiptr": UNSIGNED_LONG_LONG_FORMAT,
+    "GLsync": POINTER_FORMAT,
     "GLubyte": "%d",
     "GLuint": "%u",
-    "GLuint64": "%llu",
+    "GLuint64": UNSIGNED_LONG_LONG_FORMAT,
     "GLushort": "%u",
     "int": "%d",
-    # WGL specific types
+    # EGL-specific types
+    "EGLConfig": POINTER_FORMAT,
+    "EGLContext": POINTER_FORMAT,
+    "EGLDisplay": POINTER_FORMAT,
+    "EGLSurface": POINTER_FORMAT,
+    "EGLSync": POINTER_FORMAT,
+    "EGLNativeDisplayType": POINTER_FORMAT,
+    "EGLNativePixmapType": POINTER_FORMAT,
+    "EGLNativeWindowType": POINTER_FORMAT,
+    "EGLClientBuffer": POINTER_FORMAT,
+    "EGLenum": "0x%X",
+    "EGLint": "%d",
+    "EGLImage": POINTER_FORMAT,
+    "EGLTime": UNSIGNED_LONG_LONG_FORMAT,
+    "EGLGetBlobFuncANDROID": POINTER_FORMAT,
+    "EGLSetBlobFuncANDROID": POINTER_FORMAT,
+    "EGLuint64KHR": UNSIGNED_LONG_LONG_FORMAT,
+    "EGLSyncKHR": POINTER_FORMAT,
+    "EGLnsecsANDROID": UNSIGNED_LONG_LONG_FORMAT,
+    "EGLDeviceEXT": POINTER_FORMAT,
+    "EGLDEBUGPROCKHR": POINTER_FORMAT,
+    "EGLObjectKHR": POINTER_FORMAT,
+    "EGLLabelKHR": POINTER_FORMAT,
+    "EGLTimeKHR": UNSIGNED_LONG_LONG_FORMAT,
+    "EGLImageKHR": POINTER_FORMAT,
+    "EGLStreamKHR": POINTER_FORMAT,
+    "EGLFrameTokenANGLE": HEX_LONG_LONG_FORMAT,
+    # WGL-specific types
     "BOOL": "%u",
-    "DWORD": "0x%016\" PRIxPTR \"",
+    "DWORD": POINTER_FORMAT,
     "FLOAT": "%f",
-    "HDC": "0x%016\" PRIxPTR \"",
-    "HENHMETAFILE": "0x%016\" PRIxPTR \"",
-    "HGLRC": "0x%016\" PRIxPTR \"",
-    "LPCSTR": "0x%016\" PRIxPTR \"",
-    "LPGLYPHMETRICSFLOAT": "0x%016\" PRIxPTR \"",
+    "HDC": POINTER_FORMAT,
+    "HENHMETAFILE": POINTER_FORMAT,
+    "HGLRC": POINTER_FORMAT,
+    "LPCSTR": POINTER_FORMAT,
+    "LPGLYPHMETRICSFLOAT": POINTER_FORMAT,
     "UINT": "%u",
 }
 
-template_header_includes = """#include <GLES{major}/gl{major}{minor}.h>
+TEMPLATE_HEADER_INCLUDES = """\
+#include <GLES{major}/gl{major}{minor}.h>
 #include <export.h>"""
 
-template_sources_includes = """#include "libGLESv2/entry_points_{header_version}_autogen.h"
+TEMPLATE_SOURCES_INCLUDES = """\
+#include "libGLESv2/entry_points_{header_version}_autogen.h"
 
 #include "common/entry_points_enum_autogen.h"
 #include "libANGLE/Context.h"
@@ -480,12 +622,35 @@
 #include "libGLESv2/global_state.h"
 """
 
-template_header_includes_gl32 = """#include <export.h>
-#include "angle_gl.h"
-
+GLES_EXT_HEADER_INCLUDES = TEMPLATE_HEADER_INCLUDES.format(
+    major="", minor="") + """
+#include <GLES/glext.h>
+#include <GLES2/gl2.h>
+#include <GLES2/gl2ext.h>
+#include <GLES3/gl32.h>
 """
 
-template_sources_includes_gl32 = """#include "libGL/entry_points_{}_autogen.h"
+GLES_EXT_SOURCE_INCLUDES = TEMPLATE_SOURCES_INCLUDES.format(
+    header_version="gles_ext", validation_header_version="ESEXT") + """
+#include "libANGLE/capture_gles_1_0_autogen.h"
+#include "libANGLE/capture_gles_2_0_autogen.h"
+#include "libANGLE/capture_gles_3_0_autogen.h"
+#include "libANGLE/capture_gles_3_1_autogen.h"
+#include "libANGLE/capture_gles_3_2_autogen.h"
+#include "libANGLE/validationES1.h"
+#include "libANGLE/validationES2.h"
+#include "libANGLE/validationES3.h"
+#include "libANGLE/validationES31.h"
+#include "libANGLE/validationES32.h"
+"""
+
+DESKTOP_GL_HEADER_INCLUDES = """\
+#include <export.h>
+#include "angle_gl.h"
+"""
+
+TEMPLATE_DESKTOP_GL_SOURCE_INCLUDES = """\
+#include "libGL/entry_points_{}_autogen.h"
 
 #include "libANGLE/Context.h"
 #include "libANGLE/Context.inl.h"
@@ -498,23 +663,136 @@
 #include "libANGLE/validationES31.h"
 #include "libANGLE/validationES32.h"
 #include "libANGLE/validationESEXT.h"
-#include "libANGLE/validationGL{}{}_autogen.h"
+#include "libANGLE/validationGL{}_autogen.h"
 #include "libANGLE/entry_points_utils.h"
 #include "libGLESv2/global_state.h"
 """
 
-template_event_comment = """// Don't run the EVENT() macro on the EXT_debug_marker entry points.
+EGL_HEADER_INCLUDES = """\
+#include <EGL/egl.h>
+#include <export.h>
+"""
+
+EGL_SOURCE_INCLUDES = """\
+#include "libGLESv2/entry_points_egl_autogen.h"
+
+#include "libANGLE/entry_points_utils.h"
+#include "libANGLE/validationEGL_autogen.h"
+#include "libGLESv2/egl_stubs_autogen.h"
+#include "libGLESv2/global_state.h"
+
+using namespace egl;
+"""
+
+EGL_EXT_HEADER_INCLUDES = """\
+#include <EGL/egl.h>
+#include <EGL/eglext.h>
+#include <export.h>
+"""
+
+EGL_EXT_SOURCE_INCLUDES = """\
+#include "libGLESv2/entry_points_egl_ext_autogen.h"
+
+#include "libANGLE/entry_points_utils.h"
+#include "libANGLE/validationEGL_autogen.h"
+#include "libGLESv2/egl_ext_stubs_autogen.h"
+#include "libGLESv2/global_state.h"
+
+using namespace egl;
+"""
+
+LIBGLESV2_EXPORT_INCLUDES = """
+#include "angle_gl.h"
+
+#include "libGLESv2/entry_points_gles_1_0_autogen.h"
+#include "libGLESv2/entry_points_gles_2_0_autogen.h"
+#include "libGLESv2/entry_points_gles_3_0_autogen.h"
+#include "libGLESv2/entry_points_gles_3_1_autogen.h"
+#include "libGLESv2/entry_points_gles_3_2_autogen.h"
+#include "libGLESv2/entry_points_gles_ext_autogen.h"
+
+#include "common/event_tracer.h"
+"""
+
+LIBGL_EXPORT_INCLUDES = """
+#include "angle_gl.h"
+
+#include "libGL/entry_points_gl_1_autogen.h"
+#include "libGL/entry_points_gl_2_autogen.h"
+#include "libGL/entry_points_gl_3_autogen.h"
+#include "libGL/entry_points_gl_4_autogen.h"
+
+#include "common/event_tracer.h"
+"""
+
+LIBEGL_EXPORT_INCLUDES_AND_PREAMBLE = """
+#include "anglebase/no_destructor.h"
+#include "common/system_utils.h"
+
+#include <memory>
+
+#if defined(ANGLE_USE_EGL_LOADER)
+#    include "libEGL/egl_loader_autogen.h"
+#else
+#    include "libGLESv2/entry_points_egl_autogen.h"
+#    include "libGLESv2/entry_points_egl_ext_autogen.h"
+#endif  // defined(ANGLE_USE_EGL_LOADER)
+
+namespace
+{
+#if defined(ANGLE_USE_EGL_LOADER)
+bool gLoaded = false;
+
+std::unique_ptr<angle::Library> &EntryPointsLib()
+{
+    static angle::base::NoDestructor<std::unique_ptr<angle::Library>> sEntryPointsLib;
+    return *sEntryPointsLib;
+}
+
+angle::GenericProc KHRONOS_APIENTRY GlobalLoad(const char *symbol)
+{
+    return reinterpret_cast<angle::GenericProc>(EntryPointsLib()->getSymbol(symbol));
+}
+
+void EnsureEGLLoaded()
+{
+    if (gLoaded)
+    {
+        return;
+    }
+
+    EntryPointsLib().reset(
+        angle::OpenSharedLibrary(ANGLE_GLESV2_LIBRARY_NAME, angle::SearchType::ApplicationDir));
+    angle::LoadEGL_EGL(GlobalLoad);
+    if (!EGL_GetPlatformDisplay)
+    {
+        fprintf(stderr, "Error loading EGL entry points.\\n");
+    }
+    else
+    {
+        gLoaded = true;
+    }
+}
+#else
+void EnsureEGLLoaded() {}
+#endif  // defined(ANGLE_USE_EGL_LOADER)
+}  // anonymous namespace
+"""
+
+TEMPLATE_EVENT_COMMENT = """\
+    // Don't run the EVENT() macro on the EXT_debug_marker entry points.
     // It can interfere with the debug events being set by the caller.
     // """
 
-template_capture_proto = "angle::CallCapture Capture%s(%s);"
+TEMPLATE_CAPTURE_PROTO = "angle::CallCapture Capture%s(%s);"
 
-template_validation_proto = "bool Validate%s(%s);"
+TEMPLATE_VALIDATION_PROTO = "bool Validate%s(%s);"
 
-template_windows_def_file = """; GENERATED FILE - DO NOT EDIT.
+TEMPLATE_WINDOWS_DEF_FILE = """\
+; GENERATED FILE - DO NOT EDIT.
 ; Generated by {script_name} using data from {data_source_name}.
 ;
-; Copyright {year} The ANGLE Project Authors. All rights reserved.
+; Copyright 2020 The ANGLE Project Authors. All rights reserved.
 ; Use of this source code is governed by a BSD-style license that can be
 ; found in the LICENSE file.
 LIBRARY {lib}
@@ -522,10 +800,11 @@
 {exports}
 """
 
-template_frame_capture_utils_header = """// GENERATED FILE - DO NOT EDIT.
+TEMPLATE_FRAME_CAPTURE_UTILS_HEADER = """\
+// GENERATED FILE - DO NOT EDIT.
 // Generated by {script_name} using data from {data_source_name}.
 //
-// Copyright {year} The ANGLE Project Authors. All rights reserved.
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
@@ -610,10 +889,11 @@
 #endif  // LIBANGLE_FRAME_CAPTURE_UTILS_AUTOGEN_H_
 """
 
-template_frame_capture_utils_source = """// GENERATED FILE - DO NOT EDIT.
+TEMPLATE_FRAME_CAPTURE_UTILS_SOURCE = """\
+// GENERATED FILE - DO NOT EDIT.
 // Generated by {script_name} using data from {data_source_name}.
 //
-// Copyright {year} The ANGLE Project Authors. All rights reserved.
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
@@ -671,46 +951,79 @@
 }}  // namespace angle
 """
 
-template_get_param_val_specialization = """template <>
+TEMPLATE_GET_PARAM_VAL_SPECIALIZATION = """\
+template <>
 inline {type} GetParamVal<ParamType::T{enum}, {type}>(const ParamValue &value)
 {{
     return value.{union_name};
 }}"""
 
-template_access_param_value_case = """        case ParamType::T{enum}:
-    return GetParamVal<ParamType::T{enum}, T>(value);"""
+TEMPLATE_ACCESS_PARAM_VALUE_CASE = """\
+        case ParamType::T{enum}:
+            return GetParamVal<ParamType::T{enum}, T>(value);"""
 
-template_set_param_val_specialization = """template <>
+TEMPLATE_SET_PARAM_VAL_SPECIALIZATION = """\
+template <>
 inline void SetParamVal<ParamType::T{enum}>({type} valueIn, ParamValue *valueOut)
 {{
     valueOut->{union_name} = valueIn;
 }}"""
 
-template_init_param_value_case = """        case ParamType::T{enum}:
+TEMPLATE_INIT_PARAM_VALUE_CASE = """\
+        case ParamType::T{enum}:
             SetParamVal<ParamType::T{enum}>(valueIn, valueOut);
             break;"""
 
-template_write_param_type_to_stream_case = """        case ParamType::T{enum_in}:
+TEMPLATE_WRITE_PARAM_TYPE_TO_STREAM_CASE = """\
+        case ParamType::T{enum_in}:
             WriteParamValueReplay<ParamType::T{enum_out}>(os, call, param.value.{union_name});
             break;"""
 
-template_param_type_to_string_case = """        case ParamType::T{enum}:
+TEMPLATE_PARAM_TYPE_TO_STRING_CASE = """\
+        case ParamType::T{enum}:
             return "{type}";"""
 
-template_param_type_to_resource_id_type_case = """        case ParamType::T{enum}:
+TEMPLATE_PARAM_TYPE_TO_RESOURCE_ID_TYPE_CASE = """\
+        case ParamType::T{enum}:
             return ResourceIDType::{resource_id_type};"""
 
-template_resource_id_type_name_case = """        case ResourceIDType::{resource_id_type}:
+TEMPLATE_RESOURCE_ID_TYPE_NAME_CASE = """\
+        case ResourceIDType::{resource_id_type}:
             return "{resource_id_type}";"""
 
+EGL_PACKED_TYPES = {
+    "EGLContext": "gl::Context *",
+    "EGLConfig": "Config *",
+    "EGLDeviceEXT": "Device *",
+    # Needs an explicit namespace to avoid an X11 namespace collision.
+    "EGLDisplay": "egl::Display *",
+    "EGLImage": "Image *",
+    "EGLImageKHR": "Image *",
+    "EGLStreamKHR": "Stream *",
+    "EGLSurface": "Surface *",
+    "EGLSync": "Sync *",
+    "EGLSyncKHR": "Sync *",
+}
+
+
+def is_aliasing_excepted(api, cmd_name):
+    return api == GLES and cmd_name in ALIASING_EXCEPTIONS
+
+
 def script_relative(path):
     return os.path.join(os.path.dirname(sys.argv[0]), path)
 
 
-def format_entry_point_decl(cmd_name, proto, params, is_explicit_context):
+def strip_api_prefix(cmd_name):
+    return cmd_name.lstrip("wegl")
+
+
+def format_entry_point_decl(api, cmd_name, proto, params, is_explicit_context):
     comma_if_needed = ", " if len(params) > 0 else ""
-    return template_entry_point_decl.format(
-        name=cmd_name[2:],
+    stripped = strip_api_prefix(cmd_name)
+    return TEMPLATE_ENTRY_POINT_DECL.format(
+        api="EGL" if api == EGL else "GL_",
+        name="EGL_%s" % stripped if api == EGL else stripped,
         return_type=proto[:-len(cmd_name)],
         params=", ".join(params),
         comma_if_needed=comma_if_needed,
@@ -755,21 +1068,22 @@
         return name
 
 
+def is_unsigned_long_format(fmt):
+    return fmt == UNSIGNED_LONG_LONG_FORMAT or fmt == HEX_LONG_LONG_FORMAT
+
+
 def param_print_argument(command_node, param):
     name_only = just_the_name(param)
     type_only = just_the_type(param)
 
-    if "*" in param:
-        return "(uintptr_t)" + name_only
+    if "*" in param or FORMAT_DICT[type_only] == POINTER_FORMAT:
+        return "(uintptr_t)%s" % name_only
 
-    if type_only in reinterpret_cast_to_dict:
-        return "(" + reinterpret_cast_to_dict[type_only] + ")" + name_only
-
-    if type_only in static_cast_to_dict:
-        return "static_cast<" + static_cast_to_dict[type_only] + ">(" + name_only + ")"
+    if is_unsigned_long_format(FORMAT_DICT[type_only]):
+        return "static_cast<unsigned long long>(%s)" % name_only
 
     if type_only == "GLboolean":
-        return "GLbooleanToString(%s)" % (name_only,)
+        return "GLbooleanToString(%s)" % name_only
 
     if type_only == "GLbitfield":
         group_name = find_gl_enum_group_in_command(command_node, name_only)
@@ -787,16 +1101,17 @@
         return just_the_name(param) + " = 0x%016\" PRIxPTR \""
     else:
         type_only = just_the_type(param)
-        if type_only not in format_dict:
-            raise Exception(type_only + " is not a known type in 'format_dict'")
+        if type_only not in FORMAT_DICT:
+            raise Exception(type_only + " is not a known type in 'FORMAT_DICT'")
 
-        return just_the_name(param) + " = " + format_dict[type_only]
+        return just_the_name(param) + " = " + FORMAT_DICT[type_only]
 
 
 def default_return_value(cmd_name, return_type):
     if return_type == "void":
         return ""
-    return "GetDefaultReturnValue<EntryPoint::" + cmd_name[2:] + ", " + return_type + ">()"
+    return "GetDefaultReturnValue<EntryPoint::%s, %s>()" % (strip_api_prefix(cmd_name),
+                                                            return_type)
 
 
 def is_context_lost_acceptable_cmd(cmd_name):
@@ -846,12 +1161,12 @@
         return "GenerateContextLostErrorOnCurrentGlobalContext();"
 
 
-def strip_suffix(name, is_gles):
+def strip_suffix(api, name):
     # For commands where aliasing is excepted, keep the suffix
-    if is_aliasing_excepted(name, is_gles):
+    if is_aliasing_excepted(api, name):
         return name
 
-    for suffix in strip_suffixes:
+    for suffix in STRIP_SUFFIXES:
         if name.endswith(suffix):
             name = name[0:-len(suffix)]
     return name
@@ -870,36 +1185,54 @@
     return group_name
 
 
-def get_packed_enums(cmd_packed_gl_enums, cmd_name, is_gles):
+def get_packed_enums(api, cmd_packed_gl_enums, cmd_name, packed_param_types, params):
     # Always strip the suffix when querying packed enums.
-    return cmd_packed_gl_enums.get(strip_suffix(cmd_name, is_gles), {})
+    result = cmd_packed_gl_enums.get(strip_suffix(api, cmd_name), {})
+    for param in params:
+        param_type = just_the_type(param)
+        if param_type in packed_param_types:
+            result[just_the_name(param)] = packed_param_types[param_type]
+    return result
 
 
-def format_entry_point_def(command_node, cmd_name, proto, params, is_explicit_context,
-                           cmd_packed_gl_enums, is_gles):
-    packed_gl_enums = get_packed_enums(cmd_packed_gl_enums, cmd_name, is_gles)
-    internal_params = [just_the_name_packed(param, packed_gl_enums) for param in params]
+def get_def_template(api, return_type):
+    if return_type.strip() == "void":
+        if api == EGL:
+            return TEMPLATE_EGL_ENTRY_POINT_NO_RETURN
+        else:
+            return TEMPLATE_GLES_ENTRY_POINT_NO_RETURN
+    else:
+        if api == EGL:
+            return TEMPLATE_EGL_ENTRY_POINT_WITH_RETURN
+        else:
+            return TEMPLATE_GLES_ENTRY_POINT_WITH_RETURN
+
+
+def format_entry_point_def(api, command_node, cmd_name, proto, params, is_explicit_context,
+                           cmd_packed_enums, packed_param_types, egl_ep_to_object):
+    packed_enums = get_packed_enums(api, cmd_packed_enums, cmd_name, packed_param_types, params)
+    internal_params = [just_the_name_packed(param, packed_enums) for param in params]
     packed_gl_enum_conversions = []
     for param in params:
         name = just_the_name(param)
-        if name in packed_gl_enums:
+        if name in packed_enums:
             internal_name = name + "Packed"
-            internal_type = packed_gl_enums[name]
+            internal_type = packed_enums[name]
             packed_gl_enum_conversions += [
-                "\n        " + internal_type + " " + internal_name + " = FromGL<" + internal_type +
-                ">(" + name + ");"
+                "\n        " + internal_type + " " + internal_name + " = PackParam<" +
+                internal_type + ">(" + name + ");"
             ]
 
     pass_params = [param_print_argument(command_node, param) for param in params]
     format_params = [param_format_string(param) for param in params]
     return_type = proto[:-len(cmd_name)]
     default_return = default_return_value(cmd_name, return_type.strip())
-    event_comment = template_event_comment if cmd_name in no_event_marker_exceptions_list else ""
-    name_lower_no_suffix = strip_suffix(cmd_name[2:3].lower() + cmd_name[3:], is_gles)
+    event_comment = TEMPLATE_EVENT_COMMENT if cmd_name in NO_EVENT_MARKER_EXCEPTIONS_LIST else ""
+    name_lower_no_suffix = strip_suffix(api, cmd_name[2:3].lower() + cmd_name[3:])
 
     format_params = {
         "name":
-            cmd_name[2:],
+            strip_api_prefix(cmd_name),
         "name_lower_no_suffix":
             name_lower_no_suffix,
         "return_type":
@@ -933,13 +1266,13 @@
         "explicit_context_comma":
             ", " if is_explicit_context and len(params) > 0 else "",
         "assert_explicit_context":
-            "\nASSERT(context == GetValidGlobalContext());" if is_explicit_context else ""
+            "\nASSERT(context == GetValidGlobalContext());" if is_explicit_context else "",
+        "labeled_object":
+            get_egl_entry_point_labeled_object(egl_ep_to_object, cmd_name, params, packed_enums)
     }
 
-    if return_type.strip() == "void":
-        return template_entry_point_no_return.format(**format_params)
-    else:
-        return template_entry_point_with_return.format(**format_params)
+    template = get_def_template(api, return_type)
+    return template.format(**format_params)
 
 
 def get_capture_param_type_name(param_type):
@@ -958,14 +1291,15 @@
     return param_type
 
 
-def format_capture_method(command, cmd_name, proto, params, all_param_types, capture_pointer_funcs,
-                          cmd_packed_gl_enums, is_gles):
+def format_capture_method(api, command, cmd_name, proto, params, all_param_types,
+                          capture_pointer_funcs, cmd_packed_gl_enums, packed_param_types):
 
-    packed_gl_enums = get_packed_enums(cmd_packed_gl_enums, cmd_name, is_gles)
+    packed_gl_enums = get_packed_enums(api, cmd_packed_gl_enums, cmd_name, packed_param_types,
+                                       params)
 
-    params_with_type = get_internal_params(cmd_name,
+    params_with_type = get_internal_params(api, cmd_name,
                                            ["const State &glState", "bool isCallValid"] + params,
-                                           cmd_packed_gl_enums, is_gles)
+                                           cmd_packed_gl_enums, packed_param_types)
     params_just_name = ", ".join(
         ["glState", "isCallValid"] +
         [just_the_name_packed(param, packed_gl_enums) for param in params])
@@ -980,23 +1314,23 @@
 
         if pointer_count > 0:
             params = params_just_name
-            capture_name = "Capture%s_%s" % (cmd_name[2:], param_name)
-            capture = template_parameter_capture_pointer.format(
+            capture_name = "Capture%s_%s" % (strip_api_prefix(cmd_name), param_name)
+            capture = TEMPLATE_PARAMETER_CAPTURE_POINTER.format(
                 name=param_name,
                 type=capture_param_type,
                 capture_name=capture_name,
                 params=params,
                 cast_type=param_type)
 
-            capture_pointer_func = template_parameter_capture_pointer_func.format(
+            capture_pointer_func = TEMPLATE_PARAMETER_CAPTURE_POINTER_FUNC.format(
                 name=capture_name, params=params_with_type + ", angle::ParamCapture *paramCapture")
             capture_pointer_funcs += [capture_pointer_func]
         elif capture_param_type in ('GLenum', 'GLbitfield'):
             gl_enum_group = find_gl_enum_group_in_command(command, param_name)
-            capture = template_parameter_capture_gl_enum.format(
+            capture = TEMPLATE_PARAMETER_CAPTURE_GL_ENUM.format(
                 name=param_name, type=capture_param_type, group=gl_enum_group)
         else:
-            capture = template_parameter_capture_value.format(
+            capture = TEMPLATE_PARAMETER_CAPTURE_VALUE.format(
                 name=param_name, type=capture_param_type)
 
         all_param_types.add(capture_param_type)
@@ -1007,7 +1341,7 @@
 
     format_args = {
         "full_name": cmd_name,
-        "short_name": cmd_name[2:],
+        "short_name": strip_api_prefix(cmd_name),
         "params_with_type": params_with_type,
         "params_just_name": params_just_name,
         "parameter_captures": "\n    ".join(parameter_captures),
@@ -1016,9 +1350,9 @@
     }
 
     if return_type == "void":
-        return template_capture_method_no_return_value.format(**format_args)
+        return TEMPLATE_CAPTURE_METHOD_NO_RETURN_VALUE.format(**format_args)
     else:
-        return template_capture_method_with_return_value.format(**format_args)
+        return TEMPLATE_CAPTURE_METHOD_WITH_RETURN_VALUE.format(**format_args)
 
 
 def const_pointer_type(param, packed_gl_enums):
@@ -1031,8 +1365,9 @@
         return type
 
 
-def get_internal_params(cmd_name, params, cmd_packed_gl_enums, is_gles):
-    packed_gl_enums = get_packed_enums(cmd_packed_gl_enums, cmd_name, is_gles)
+def get_internal_params(api, cmd_name, params, cmd_packed_gl_enums, packed_param_types):
+    packed_gl_enums = get_packed_enums(api, cmd_packed_gl_enums, cmd_name, packed_param_types,
+                                       params)
     return ", ".join([
         make_param(
             just_the_type_packed(param, packed_gl_enums),
@@ -1040,8 +1375,9 @@
     ])
 
 
-def get_validation_params(cmd_name, params, cmd_packed_gl_enums, is_gles):
-    packed_gl_enums = get_packed_enums(cmd_packed_gl_enums, cmd_name, is_gles)
+def get_validation_params(api, cmd_name, params, cmd_packed_gl_enums, packed_param_types):
+    packed_gl_enums = get_packed_enums(api, cmd_packed_gl_enums, cmd_name, packed_param_types,
+                                       params)
     return ", ".join([
         make_param(
             const_pointer_type(param, packed_gl_enums), just_the_name_packed(
@@ -1049,12 +1385,14 @@
     ])
 
 
-def format_context_decl(cmd_name, proto, params, template, cmd_packed_gl_enums, is_gles):
-    internal_params = get_internal_params(cmd_name, params, cmd_packed_gl_enums, is_gles)
+def format_context_decl(api, cmd_name, proto, params, template, cmd_packed_gl_enums,
+                        packed_param_types):
+    internal_params = get_internal_params(api, cmd_name, params, cmd_packed_gl_enums,
+                                          packed_param_types)
 
     return_type = proto[:-len(cmd_name)]
     name_lower_no_suffix = cmd_name[2:3].lower() + cmd_name[3:]
-    name_lower_no_suffix = strip_suffix(name_lower_no_suffix, is_gles)
+    name_lower_no_suffix = strip_suffix(api, name_lower_no_suffix)
     maybe_const = " const" if name_lower_no_suffix.startswith(
         "is") and name_lower_no_suffix[2].isupper() else ""
 
@@ -1065,12 +1403,12 @@
         maybe_const=maybe_const)
 
 
-def format_libgles_entry_point_def(cmd_name, proto, params, is_explicit_context):
+def format_entry_point_export(cmd_name, proto, params, is_explicit_context, template):
     internal_params = [just_the_name(param) for param in params]
     return_type = proto[:-len(cmd_name)]
 
-    return libgles_entry_point_def.format(
-        name=cmd_name[2:],
+    return template.format(
+        name=strip_api_prefix(cmd_name),
         return_type=return_type,
         params=", ".join(params),
         internal_params=", ".join(internal_params),
@@ -1080,28 +1418,34 @@
         explicit_context_internal_param="ctx" if is_explicit_context else "")
 
 
-def format_validation_proto(cmd_name, params, cmd_packed_gl_enums, is_gles):
-    internal_params = get_validation_params(cmd_name, ["Context *context"] + params,
-                                            cmd_packed_gl_enums, is_gles)
-    return template_validation_proto % (cmd_name[2:], internal_params)
+def format_validation_proto(api, cmd_name, params, cmd_packed_gl_enums, packed_param_types):
+    if api in ["GL", "GLES"]:
+        with_extra_params = ["Context *context"] + params
+    elif api == "EGL":
+        with_extra_params = ["ValidationContext *val"] + params
+    else:
+        with_extra_params = params
+    internal_params = get_validation_params(api, cmd_name, with_extra_params, cmd_packed_gl_enums,
+                                            packed_param_types)
+    return TEMPLATE_VALIDATION_PROTO % (strip_api_prefix(cmd_name), internal_params)
 
 
-def format_capture_proto(cmd_name, proto, params, cmd_packed_gl_enums, is_gles):
-    internal_params = get_internal_params(cmd_name,
+def format_capture_proto(api, cmd_name, proto, params, cmd_packed_gl_enums, packed_param_types):
+    internal_params = get_internal_params(api, cmd_name,
                                           ["const State &glState", "bool isCallValid"] + params,
-                                          cmd_packed_gl_enums, is_gles)
+                                          cmd_packed_gl_enums, packed_param_types)
     return_type = proto[:-len(cmd_name)].strip()
     if return_type != "void":
         internal_params += ", %s returnValue" % return_type
-    return template_capture_proto % (cmd_name[2:], internal_params)
+    return TEMPLATE_CAPTURE_PROTO % (strip_api_prefix(cmd_name), internal_params)
 
 
 def path_to(folder, file):
     return os.path.join(script_relative(".."), "src", folder, file)
 
 
-def get_entry_points(all_commands, commands, is_explicit_context, is_wgl, all_param_types,
-                     cmd_packed_gl_enums, is_gles):
+def get_entry_points(api, all_commands, commands, is_explicit_context, all_param_types,
+                     cmd_packed_gl_enums, packed_param_types, egl_ep_to_object):
     decls = []
     defs = []
     export_defs = []
@@ -1114,7 +1458,7 @@
         proto = command.find('proto')
         cmd_name = proto.find('name').text
 
-        if is_wgl:
+        if api == WGL:
             cmd_name = cmd_name if cmd_name[:3] == 'wgl' else 'wgl' + cmd_name
 
         if cmd_name not in commands:
@@ -1123,27 +1467,37 @@
         param_text = ["".join(param.itertext()) for param in command.findall('param')]
         proto_text = "".join(proto.itertext())
         decls.append(
-            format_entry_point_decl(cmd_name, proto_text, param_text, is_explicit_context))
+            format_entry_point_decl(api, cmd_name, proto_text, param_text, is_explicit_context))
         defs.append(
-            format_entry_point_def(command, cmd_name, proto_text, param_text, is_explicit_context,
-                                   cmd_packed_gl_enums, is_gles))
+            format_entry_point_def(api, command, cmd_name, proto_text, param_text,
+                                   is_explicit_context, cmd_packed_gl_enums, packed_param_types,
+                                   egl_ep_to_object))
 
+        export_template = TEMPLATE_EGL_ENTRY_POINT_EXPORT if api == "EGL" else TEMPLATE_GL_ENTRY_POINT_EXPORT
         export_defs.append(
-            format_libgles_entry_point_def(cmd_name, proto_text, param_text, is_explicit_context))
+            format_entry_point_export(cmd_name, proto_text, param_text, is_explicit_context,
+                                      export_template))
 
         validation_protos.append(
-            format_validation_proto(cmd_name, param_text, cmd_packed_gl_enums, is_gles))
+            format_validation_proto(api, cmd_name, param_text, cmd_packed_gl_enums,
+                                    packed_param_types))
         capture_protos.append(
-            format_capture_proto(cmd_name, proto_text, param_text, cmd_packed_gl_enums, is_gles))
+            format_capture_proto(api, cmd_name, proto_text, param_text, cmd_packed_gl_enums,
+                                 packed_param_types))
         capture_methods.append(
-            format_capture_method(command, cmd_name, proto_text, param_text, all_param_types,
-                                  capture_pointer_funcs, cmd_packed_gl_enums, is_gles))
+            format_capture_method(api, command, cmd_name, proto_text, param_text, all_param_types,
+                                  capture_pointer_funcs, cmd_packed_gl_enums, packed_param_types))
 
     return decls, defs, export_defs, validation_protos, capture_protos, capture_methods, capture_pointer_funcs
 
 
-def get_decls(formatter, all_commands, gles_commands, already_included, cmd_packed_gl_enums,
-              is_gles):
+def get_decls(api,
+              formatter,
+              all_commands,
+              gles_commands,
+              already_included,
+              cmd_packed_gl_enums,
+              packed_param_types=[]):
     decls = []
     for command in all_commands:
         proto = command.find('proto')
@@ -1152,15 +1506,15 @@
         if cmd_name not in gles_commands:
             continue
 
-        name_no_suffix = strip_suffix(cmd_name, is_gles)
+        name_no_suffix = strip_suffix(api, cmd_name)
         if name_no_suffix in already_included:
             continue
 
         param_text = ["".join(param.itertext()) for param in command.findall('param')]
         proto_text = "".join(proto.itertext())
         decls.append(
-            format_context_decl(cmd_name, proto_text, param_text, formatter, cmd_packed_gl_enums,
-                                is_gles))
+            format_context_decl(api, cmd_name, proto_text, param_text, formatter,
+                                cmd_packed_gl_enums, packed_param_types))
 
     return decls
 
@@ -1198,24 +1552,24 @@
             "explicit_context_param": "GLeglContext ctx" if is_explicit_context else ""
         }
 
-        glext_ptrs.append(template_glext_function_pointer.format(**format_params))
-        glext_protos.append(template_glext_function_prototype.format(**format_params))
+        glext_ptrs.append(TEMPLATE_GLEXT_FUNCTION_POINTER.format(**format_params))
+        glext_protos.append(TEMPLATE_GLEXT_FUNCTION_PROTOTYPE.format(**format_params))
 
     return glext_ptrs, glext_protos
 
 
-def write_file(annotation, comment, template, entry_points, suffix, includes, lib, file):
+def write_file(annotation, comment, template, entry_points, suffix, includes, lib, file, ns):
 
     content = template.format(
         script_name=os.path.basename(sys.argv[0]),
         data_source_name=file,
-        year=date.today().year,
         annotation_lower=annotation.lower(),
         annotation_upper=annotation.upper(),
         comment=comment,
         lib=lib.upper(),
         includes=includes,
-        entry_points=entry_points)
+        entry_points=entry_points,
+        ns=ns)
 
     path = path_to(lib, "entry_points_{}_autogen.{}".format(annotation.lower(), suffix))
 
@@ -1225,10 +1579,9 @@
 
 
 def write_export_files(entry_points, includes, source, lib_name, lib_description):
-    content = template_lib_entry_point_source.format(
+    content = TEMPLATE_LIB_ENTRY_POINT_SOURCE.format(
         script_name=os.path.basename(sys.argv[0]),
         data_source_name=source,
-        year=date.today().year,
         lib_name=lib_name,
         lib_description=lib_description,
         includes=includes,
@@ -1241,24 +1594,21 @@
         out.close()
 
 
-def write_context_api_decls(template, decls, api):
-    for ver in decls['core'].keys():
-        interface_lines = []
-
-        for i in decls['core'][ver]:
-            interface_lines.append(i)
-
-        annotation = '{}_{}_{}'.format(api, ver[0], ver[1])
-        version = '{}_{}'.format(ver[0], ver[1])
-
-        content = template.format(
+def write_context_api_decls(decls, api):
+    for (major, minor), version_decls in sorted(decls['core'].items()):
+        if minor == "X":
+            annotation = '{}_{}'.format(api, major)
+            version = str(major)
+        else:
+            annotation = '{}_{}_{}'.format(api, major, minor)
+            version = '{}_{}'.format(major, minor)
+        content = CONTEXT_HEADER.format(
             annotation_lower=annotation.lower(),
             annotation_upper=annotation.upper(),
             script_name=os.path.basename(sys.argv[0]),
             data_source_name="gl.xml",
-            year=date.today().year,
             version=version,
-            interface="\n".join(interface_lines))
+            interface="\n".join(version_decls))
 
         path = path_to("libANGLE", "Context_%s_autogen.h" % annotation.lower())
 
@@ -1275,12 +1625,11 @@
                 interface_lines.append("    /* " + extname + " */ \\")
                 interface_lines.extend(decls['exts'][annotation][extname])
 
-        content = template.format(
+        content = CONTEXT_HEADER.format(
             annotation_lower='gles_ext',
             annotation_upper='GLES_EXT',
             script_name=os.path.basename(sys.argv[0]),
             data_source_name="gl.xml",
-            year=date.today().year,
             version='EXT',
             interface="\n".join(interface_lines))
 
@@ -1295,10 +1644,9 @@
     possible_versions = ["31", "32"]
     folder_version = version if version not in possible_versions else "3"
 
-    content = template_glext_explicit_context_inc.format(
+    content = TEMPLATE_GLEXT_EXPLICIT_CONTEXT_INC.format(
         script_name=os.path.basename(sys.argv[0]),
         data_source_name="gl.xml and gl_angle_ext.xml",
-        year=date.today().year,
         version=version,
         function_pointers=ptrs,
         function_prototypes=protos)
@@ -1312,11 +1660,10 @@
         out.close()
 
 
-def write_validation_header(annotation, comment, protos, source):
-    content = template_validation_header.format(
+def write_validation_header(annotation, comment, protos, source, template):
+    content = template.format(
         script_name=os.path.basename(sys.argv[0]),
         data_source_name=source,
-        year=date.today().year,
         annotation=annotation,
         comment=comment,
         prototypes="\n".join(protos))
@@ -1328,12 +1675,17 @@
         out.close()
 
 
+def write_gl_validation_header(annotation, comment, protos, source):
+    return write_validation_header(annotation, comment, protos, source,
+                                   TEMPLATE_GL_VALIDATION_HEADER)
+
+
 def write_capture_header(annotation, comment, protos, capture_pointer_funcs):
-    content = template_capture_header.format(
+    content = TEMPLATE_CAPTURE_HEADER.format(
         script_name=os.path.basename(sys.argv[0]),
         data_source_name="gl.xml and gl_angle_ext.xml",
-        year=date.today().year,
-        annotation=annotation,
+        annotation_lower=annotation.lower(),
+        annotation_upper=annotation.upper(),
         comment=comment,
         prototypes="\n".join(["\n// Method Captures\n"] + protos + ["\n// Parameter Captures\n"] +
                              capture_pointer_funcs))
@@ -1346,10 +1698,9 @@
 
 
 def write_capture_source(annotation_with_dash, annotation_no_dash, comment, capture_methods):
-    content = template_capture_source.format(
+    content = TEMPLATE_CAPTURE_SOURCE.format(
         script_name=os.path.basename(sys.argv[0]),
         data_source_name="gl.xml and gl_angle_ext.xml",
-        year=date.today().year,
         annotation_with_dash=annotation_with_dash,
         annotation_no_dash=annotation_no_dash,
         comment=comment,
@@ -1413,31 +1764,31 @@
 
 
 def format_get_param_val_specialization(param_type):
-    return template_get_param_val_specialization.format(
+    return TEMPLATE_GET_PARAM_VAL_SPECIALIZATION.format(
         enum=param_type,
         type=get_param_type_type(param_type),
         union_name=get_param_type_union_name(param_type))
 
 
 def format_access_param_value_case(param_type):
-    return template_access_param_value_case.format(enum=param_type)
+    return TEMPLATE_ACCESS_PARAM_VALUE_CASE.format(enum=param_type)
 
 
 def format_set_param_val_specialization(param_type):
-    return template_set_param_val_specialization.format(
+    return TEMPLATE_SET_PARAM_VAL_SPECIALIZATION.format(
         enum=param_type,
         type=get_param_type_type(param_type),
         union_name=get_param_type_union_name(param_type))
 
 
 def format_init_param_value_case(param_type):
-    return template_init_param_value_case.format(enum=param_type)
+    return TEMPLATE_INIT_PARAM_VALUE_CASE.format(enum=param_type)
 
 
 def format_write_param_type_to_stream_case(param_type):
     # Force all enum printing to go through "const void *"
     param_out = "voidConstPointer" if "Pointer" in param_type else param_type
-    return template_write_param_type_to_stream_case.format(
+    return TEMPLATE_WRITE_PARAM_TYPE_TO_STREAM_CASE.format(
         enum_in=param_type, enum_out=param_out, union_name=get_param_type_union_name(param_out))
 
 
@@ -1465,10 +1816,9 @@
     init_param_value_cases = "\n".join([format_init_param_value_case(t) for t in all_param_types])
     resource_id_types = format_resource_id_types(all_param_types)
 
-    content = template_frame_capture_utils_header.format(
+    content = TEMPLATE_FRAME_CAPTURE_UTILS_HEADER.format(
         script_name=os.path.basename(sys.argv[0]),
         data_source_name="gl.xml and gl_angle_ext.xml",
-        year=date.today().year,
         param_types=param_types,
         param_type_count=len(all_param_types),
         param_union_values=param_union_values,
@@ -1486,7 +1836,7 @@
 
 
 def format_param_type_to_string_case(param_type):
-    return template_param_type_to_string_case.format(
+    return TEMPLATE_PARAM_TYPE_TO_STRING_CASE.format(
         enum=param_type, type=get_gl_param_type_type(param_type))
 
 
@@ -1499,7 +1849,7 @@
 
 
 def format_param_type_to_resource_id_type_case(param_type):
-    return template_param_type_to_resource_id_type_case.format(
+    return TEMPLATE_PARAM_TYPE_TO_RESOURCE_ID_TYPE_CASE.format(
         enum=param_type, resource_id_type=get_resource_id_type_from_param_type(param_type))
 
 
@@ -1511,7 +1861,7 @@
 
 
 def format_resource_id_type_name_case(resource_id_type):
-    return template_resource_id_type_name_case.format(resource_id_type=resource_id_type)
+    return TEMPLATE_RESOURCE_ID_TYPE_NAME_CASE.format(resource_id_type=resource_id_type)
 
 
 def write_capture_helper_source(all_param_types):
@@ -1527,10 +1877,9 @@
     resource_id_type_name_cases = "\n".join(
         [format_resource_id_type_name_case(t) for t in resource_id_types])
 
-    content = template_frame_capture_utils_source.format(
+    content = TEMPLATE_FRAME_CAPTURE_UTILS_SOURCE.format(
         script_name=os.path.basename(sys.argv[0]),
         data_source_name="gl.xml and gl_angle_ext.xml",
-        year=date.today().year,
         write_param_type_to_stream_cases=write_param_type_to_stream_cases,
         param_type_to_string_cases=param_type_to_string_cases,
         param_type_resource_id_cases=param_type_resource_id_cases,
@@ -1554,10 +1903,11 @@
     return command_name.endswith('Pointerv') and command_name.startswith('glGet')
 
 
-def format_capture_replay_param_access(command_name, param_text_list, cmd_packed_gl_enums,
-                                       is_gles):
+def format_capture_replay_param_access(api, command_name, param_text_list, cmd_packed_gl_enums,
+                                       packed_param_types):
     param_access_strs = list()
-    cmd_packed_enums = get_packed_enums(cmd_packed_gl_enums, command_name, is_gles)
+    cmd_packed_enums = get_packed_enums(api, cmd_packed_gl_enums, command_name, packed_param_types,
+                                        param_text_list)
     for i, param_text in enumerate(param_text_list):
         param_type = just_the_type_packed(param_text, cmd_packed_enums)
         param_name = just_the_name_packed(param_text, cmd_packed_enums)
@@ -1584,24 +1934,25 @@
     return ",".join(param_access_strs)
 
 
-def format_capture_replay_call_case(command_to_param_types_mapping, cmd_packed_gl_enums, is_gles):
+def format_capture_replay_call_case(api, command_to_param_types_mapping, cmd_packed_gl_enums,
+                                    packed_param_types):
     call_str_list = list()
     for command_name, cmd_param_texts in sorted(command_to_param_types_mapping.items()):
-        entry_point_name = command_name[2:]  # strip the 'gl' prefix
+        entry_point_name = strip_api_prefix(command_name)
 
         call_str_list.append(
-            template_capture_replay_call_case.format(
+            TEMPLATE_CAPTURE_REPLAY_CALL_CASE.format(
                 entry_point=entry_point_name,
                 param_value_access=format_capture_replay_param_access(
-                    command_name, cmd_param_texts, cmd_packed_gl_enums, is_gles),
+                    api, command_name, cmd_param_texts, cmd_packed_gl_enums, packed_param_types),
                 context_call=entry_point_name[0].lower() + entry_point_name[1:],
             ))
 
     return '\n'.join(call_str_list)
 
 
-def write_capture_replay_source(all_commands_nodes, gles_command_names, cmd_packed_gl_enums,
-                                is_gles):
+def write_capture_replay_source(api, all_commands_nodes, gles_command_names, cmd_packed_gl_enums,
+                                packed_param_types):
     all_commands_names = set(gles_command_names)
 
     command_to_param_types_mapping = dict()
@@ -1613,13 +1964,12 @@
         command_to_param_types_mapping[command_name] = get_command_params_text(
             command_node, command_name)
 
-    call_replay_cases = format_capture_replay_call_case(command_to_param_types_mapping,
-                                                        cmd_packed_gl_enums, is_gles)
+    call_replay_cases = format_capture_replay_call_case(api, command_to_param_types_mapping,
+                                                        cmd_packed_gl_enums, packed_param_types)
 
-    source_content = template_capture_replay_source.format(
+    source_content = TEMPLATE_CAPTURE_REPLAY_SOURCE.format(
         script_name=os.path.basename(sys.argv[0]),
         data_source_name="gl.xml and gl_angle_ext.xml",
-        year=date.today().year,
         call_replay_cases=call_replay_cases,
     )
     source_file_path = registry_xml.script_relative(
@@ -1630,11 +1980,10 @@
 
 def write_windows_def_file(data_source_name, lib, libexport, folder, exports):
 
-    content = template_windows_def_file.format(
+    content = TEMPLATE_WINDOWS_DEF_FILE.format(
         script_name=os.path.basename(sys.argv[0]),
         data_source_name=data_source_name,
         exports="\n".join(exports),
-        year=date.today().year,
         lib=libexport)
 
     path = path_to(folder, "%s_autogen.def" % lib)
@@ -1659,7 +2008,7 @@
 
     capser = lambda fn: "EGL_" + fn[3:]
 
-    for major, minor in [[1, 0], [1, 1], [1, 2], [1, 3], [1, 4], [1, 5]]:
+    for major, minor in registry_xml.EGL_VERSIONS:
         annotation = "{}_{}".format(major, minor)
         name_prefix = "EGL_VERSION_"
 
@@ -1688,33 +2037,119 @@
     return exports
 
 
+def get_egl_object_category_map():
+    with open(EGL_GET_LABELED_OBJECT_DATA_PATH) as f:
+        try:
+            spec_json = json.loads(f.read())
+        except ValueError:
+            raise Exception("Could not decode JSON from %s" % EGL_GET_LABELED_OBJECT_DATA_PATH)
+
+    # Construct a mapping from EP to type. Fill in the gaps with Display/None.
+    ep_to_object = {}
+
+    for category, eps in spec_json.iteritems():
+        if category == 'description':
+            continue
+        for ep in eps:
+            ep_to_object[ep] = category
+
+    return ep_to_object
+
+
+# Construct a mapping from an EGL EP to object function
+def get_egl_entry_point_labeled_object(ep_to_object, cmd_stripped, params, packed_enums):
+
+    if not ep_to_object:
+        return ""
+
+    # Finds a packed parameter name in a list of params
+    def find_param(params, type_name, packed_enums):
+        for param in params:
+            if just_the_type_packed(param, packed_enums).split(' ')[0] == type_name:
+                return just_the_name_packed(param, packed_enums)
+        return None
+
+    display_param = find_param(params, "egl::Display", packed_enums)
+
+    # For entry points not listed in the JSON file, they default to an EGLDisplay or nothing.
+    if cmd_stripped not in ep_to_object:
+        if display_param:
+            return "GetDisplayIfValid(%s)" % display_param
+        return "nullptr"
+
+    # We first handle a few special cases for certain type categories.
+    category = ep_to_object[cmd_stripped]
+    if category == "Thread":
+        return "GetThreadIfValid(thread)"
+    found_param = find_param(params, category, packed_enums)
+    if category == "Context" and not found_param:
+        return "GetContextIfValid(thread->getDisplay(), thread->getContext())"
+    assert found_param, "Did not find %s for %s: %s" % (category, cmd_stripped, str(params))
+    if category == "Device":
+        return "GetDeviceIfValid(%s)" % found_param
+    if category == "LabeledObject":
+        object_type_param = find_param(params, "ObjectType", packed_enums)
+        return "GetLabeledObjectIfValid(thread, %s, %s, %s)" % (display_param, object_type_param,
+                                                                found_param)
+
+    # We then handle the general case which handles the rest of the type categories.
+    return "Get%sIfValid(%s, %s)" % (category, display_param, found_param)
+
+
+def write_egl_stubs_header(annotation, title, data_source, out_file, all_commands, commands,
+                           cmd_packed_egl_enums):
+
+    stubs = []
+
+    for command in all_commands:
+        proto = command.find('proto')
+        cmd_name = proto.find('name').text
+
+        if cmd_name not in commands:
+            continue
+
+        proto_text = "".join(proto.itertext())
+        params = ["".join(param.itertext()) for param in command.findall('param')]
+        return_type = proto_text[:-len(cmd_name)]
+
+        internal_params = get_internal_params(EGL, cmd_name, ["Thread *thread"] + params,
+                                              cmd_packed_egl_enums, EGL_PACKED_TYPES)
+
+        stubs.append("%s %s(%s);" % (return_type, strip_api_prefix(cmd_name), internal_params))
+
+    args = {
+        "annotation_lower": annotation.lower(),
+        "annotation_upper": annotation.upper(),
+        "data_source_name": data_source,
+        "return_type": proto[:-len(cmd_name)],
+        "script_name": os.path.basename(sys.argv[0]),
+        "stubs": "\n".join(stubs),
+        "title": title,
+    }
+
+    output = TEMPLATE_EGL_STUBS_HEADER.format(**args)
+
+    with open(out_file, "w") as f:
+        f.write(output)
+
+
 def main():
 
     # auto_script parameters.
     if len(sys.argv) > 1:
-        inputs = ['entry_point_packed_gl_enums.json'] + registry_xml.xml_inputs
+        inputs = [
+            'entry_point_packed_egl_enums.json', 'entry_point_packed_gl_enums.json',
+            EGL_GET_LABELED_OBJECT_DATA_PATH
+        ] + registry_xml.xml_inputs
         outputs = [
+            EGL_STUBS_HEADER_PATH,
+            EGL_EXT_STUBS_HEADER_PATH,
             '../src/common/entry_points_enum_autogen.cpp',
             '../src/common/entry_points_enum_autogen.h',
-            '../src/libANGLE/Context_gl_1_0_autogen.h',
-            '../src/libANGLE/Context_gl_1_1_autogen.h',
-            '../src/libANGLE/Context_gl_1_2_autogen.h',
-            '../src/libANGLE/Context_gl_1_3_autogen.h',
-            '../src/libANGLE/Context_gl_1_4_autogen.h',
-            '../src/libANGLE/Context_gl_1_5_autogen.h',
-            '../src/libANGLE/Context_gl_2_0_autogen.h',
-            '../src/libANGLE/Context_gl_2_1_autogen.h',
-            '../src/libANGLE/Context_gl_3_0_autogen.h',
-            '../src/libANGLE/Context_gl_3_1_autogen.h',
-            '../src/libANGLE/Context_gl_3_2_autogen.h',
-            '../src/libANGLE/Context_gl_3_3_autogen.h',
-            '../src/libANGLE/Context_gl_4_0_autogen.h',
-            '../src/libANGLE/Context_gl_4_1_autogen.h',
-            '../src/libANGLE/Context_gl_4_2_autogen.h',
-            '../src/libANGLE/Context_gl_4_3_autogen.h',
-            '../src/libANGLE/Context_gl_4_4_autogen.h',
-            '../src/libANGLE/Context_gl_4_5_autogen.h',
-            '../src/libANGLE/Context_gl_4_6_autogen.h',
+            '../src/libANGLE/Context_gl_1_autogen.h',
+            '../src/libANGLE/Context_gl_2_autogen.h',
+            '../src/libANGLE/Context_gl_3_autogen.h',
+            '../src/libANGLE/Context_gl_4_autogen.h',
             '../src/libANGLE/Context_gles_1_0_autogen.h',
             '../src/libANGLE/Context_gles_2_0_autogen.h',
             '../src/libANGLE/Context_gles_3_0_autogen.h',
@@ -1736,6 +2171,7 @@
             '../src/libANGLE/frame_capture_replay_autogen.cpp',
             '../src/libANGLE/frame_capture_utils_autogen.cpp',
             '../src/libANGLE/frame_capture_utils_autogen.h',
+            '../src/libANGLE/validationEGL_autogen.h',
             '../src/libANGLE/validationES1_autogen.h',
             '../src/libANGLE/validationES2_autogen.h',
             '../src/libANGLE/validationES31_autogen.h',
@@ -1746,21 +2182,12 @@
             '../src/libANGLE/validationGL2_autogen.h',
             '../src/libANGLE/validationGL3_autogen.h',
             '../src/libANGLE/validationGL4_autogen.h',
-            '../src/libANGLE/validationGL11_autogen.h',
-            '../src/libANGLE/validationGL12_autogen.h',
-            '../src/libANGLE/validationGL13_autogen.h',
-            '../src/libANGLE/validationGL14_autogen.h',
-            '../src/libANGLE/validationGL15_autogen.h',
-            '../src/libANGLE/validationGL21_autogen.h',
-            '../src/libANGLE/validationGL31_autogen.h',
-            '../src/libANGLE/validationGL32_autogen.h',
-            '../src/libANGLE/validationGL33_autogen.h',
-            '../src/libANGLE/validationGL41_autogen.h',
-            '../src/libANGLE/validationGL42_autogen.h',
-            '../src/libANGLE/validationGL43_autogen.h',
-            '../src/libANGLE/validationGL44_autogen.h',
-            '../src/libANGLE/validationGL45_autogen.h',
-            '../src/libANGLE/validationGL46_autogen.h',
+            '../src/libEGL/libEGL_autogen.cpp',
+            '../src/libEGL/libEGL_autogen.def',
+            '../src/libGLESv2/entry_points_egl_autogen.cpp',
+            '../src/libGLESv2/entry_points_egl_autogen.h',
+            '../src/libGLESv2/entry_points_egl_ext_autogen.cpp',
+            '../src/libGLESv2/entry_points_egl_ext_autogen.h',
             '../src/libGLESv2/entry_points_gles_1_0_autogen.cpp',
             '../src/libGLESv2/entry_points_gles_1_0_autogen.h',
             '../src/libGLESv2/entry_points_gles_2_0_autogen.cpp',
@@ -1777,44 +2204,14 @@
             '../src/libGLESv2/libGLESv2_autogen.def',
             '../src/libGLESv2/libGLESv2_no_capture_autogen.def',
             '../src/libGLESv2/libGLESv2_with_capture_autogen.def',
-            '../src/libGL/entry_points_gl_1_0_autogen.cpp',
-            '../src/libGL/entry_points_gl_1_0_autogen.h',
-            '../src/libGL/entry_points_gl_1_1_autogen.cpp',
-            '../src/libGL/entry_points_gl_1_1_autogen.h',
-            '../src/libGL/entry_points_gl_1_2_autogen.cpp',
-            '../src/libGL/entry_points_gl_1_2_autogen.h',
-            '../src/libGL/entry_points_gl_1_3_autogen.cpp',
-            '../src/libGL/entry_points_gl_1_3_autogen.h',
-            '../src/libGL/entry_points_gl_1_4_autogen.cpp',
-            '../src/libGL/entry_points_gl_1_4_autogen.h',
-            '../src/libGL/entry_points_gl_1_5_autogen.cpp',
-            '../src/libGL/entry_points_gl_1_5_autogen.h',
-            '../src/libGL/entry_points_gl_2_0_autogen.cpp',
-            '../src/libGL/entry_points_gl_2_0_autogen.h',
-            '../src/libGL/entry_points_gl_2_1_autogen.cpp',
-            '../src/libGL/entry_points_gl_2_1_autogen.h',
-            '../src/libGL/entry_points_gl_3_0_autogen.cpp',
-            '../src/libGL/entry_points_gl_3_0_autogen.h',
-            '../src/libGL/entry_points_gl_3_1_autogen.cpp',
-            '../src/libGL/entry_points_gl_3_1_autogen.h',
-            '../src/libGL/entry_points_gl_3_2_autogen.cpp',
-            '../src/libGL/entry_points_gl_3_2_autogen.h',
-            '../src/libGL/entry_points_gl_3_3_autogen.cpp',
-            '../src/libGL/entry_points_gl_3_3_autogen.h',
-            '../src/libGL/entry_points_gl_4_0_autogen.cpp',
-            '../src/libGL/entry_points_gl_4_0_autogen.h',
-            '../src/libGL/entry_points_gl_4_1_autogen.cpp',
-            '../src/libGL/entry_points_gl_4_1_autogen.h',
-            '../src/libGL/entry_points_gl_4_2_autogen.cpp',
-            '../src/libGL/entry_points_gl_4_2_autogen.h',
-            '../src/libGL/entry_points_gl_4_3_autogen.cpp',
-            '../src/libGL/entry_points_gl_4_3_autogen.h',
-            '../src/libGL/entry_points_gl_4_4_autogen.cpp',
-            '../src/libGL/entry_points_gl_4_4_autogen.h',
-            '../src/libGL/entry_points_gl_4_5_autogen.cpp',
-            '../src/libGL/entry_points_gl_4_5_autogen.h',
-            '../src/libGL/entry_points_gl_4_6_autogen.cpp',
-            '../src/libGL/entry_points_gl_4_6_autogen.h',
+            '../src/libGL/entry_points_gl_1_autogen.cpp',
+            '../src/libGL/entry_points_gl_1_autogen.h',
+            '../src/libGL/entry_points_gl_2_autogen.cpp',
+            '../src/libGL/entry_points_gl_2_autogen.h',
+            '../src/libGL/entry_points_gl_3_autogen.cpp',
+            '../src/libGL/entry_points_gl_3_autogen.h',
+            '../src/libGL/entry_points_gl_4_autogen.cpp',
+            '../src/libGL/entry_points_gl_4_autogen.h',
             '../src/libGL/libGL_autogen.cpp',
             '../src/libGL/libGL_autogen.def',
         ]
@@ -1834,7 +2231,7 @@
     glesdecls = {}
     glesdecls['core'] = {}
     glesdecls['exts'] = {}
-    for ver in [(1, 0), (2, 0), (3, 0), (3, 1), (3, 2)]:
+    for ver in registry_xml.GLES_VERSIONS:
         glesdecls['core'][ver] = []
     for ver in ['GLES1 Extensions', 'GLES2+ Extensions', 'ANGLE Extensions']:
         glesdecls['exts'][ver] = {}
@@ -1851,8 +2248,7 @@
 
     # First run through the main GLES entry points.  Since ES2+ is the primary use
     # case, we go through those first and then add ES1-only APIs at the end.
-    versions = [[2, 0], [3, 0], [3, 1], [3, 2], [1, 0]]
-    for major_version, minor_version in versions:
+    for major_version, minor_version in registry_xml.GLES_VERSIONS:
         version = "{}_{}".format(major_version, minor_version)
         annotation = "GLES_{}".format(version)
         name_prefix = "GL_ES_VERSION_"
@@ -1871,8 +2267,8 @@
         all_commands_with_suffix.extend(xml.commands[version])
 
         decls, defs, libgles_defs, validation_protos, capture_protos, capture_methods, capture_pointer_funcs = get_entry_points(
-            all_commands, gles_commands, False, False, all_gles_param_types, cmd_packed_gl_enums,
-            True)
+            GLES, all_commands, gles_commands, False, all_gles_param_types, cmd_packed_gl_enums,
+            [], {})
 
         # Write the version as a comment before the first EP.
         libgles_defs.insert(0, "\n// OpenGL ES %s" % comment)
@@ -1884,7 +2280,7 @@
         major_if_not_one = major_version if major_version != 1 else ""
         minor_if_not_zero = minor_version if minor_version != 0 else ""
 
-        header_includes = template_header_includes.format(
+        header_includes = TEMPLATE_HEADER_INCLUDES.format(
             major=major_if_not_one, minor=minor_if_not_zero)
 
         # We include the platform.h header since it undefines the conflicting MemoryBarrier macro.
@@ -1892,22 +2288,21 @@
             header_includes += "\n#include \"common/platform.h\"\n"
 
         version_annotation = "%s%s" % (major_version, minor_if_not_zero)
-        source_includes = template_sources_includes.format(
+        source_includes = TEMPLATE_SOURCES_INCLUDES.format(
             header_version=annotation.lower(), validation_header_version="ES" + version_annotation)
 
-        write_file(annotation, "GLES " + comment, template_entry_point_header, "\n".join(decls),
-                   "h", header_includes, "libGLESv2", "gl.xml")
-        write_file(annotation, "GLES " + comment, template_entry_point_source, "\n".join(defs),
-                   "cpp", source_includes, "libGLESv2", "gl.xml")
+        write_file(annotation, "GLES " + comment, TEMPLATE_ENTRY_POINT_HEADER, "\n".join(decls),
+                   "h", header_includes, "libGLESv2", "gl.xml", "namespace gl")
+        write_file(annotation, "GLES " + comment, TEMPLATE_ENTRY_POINT_SOURCE, "\n".join(defs),
+                   "cpp", source_includes, "libGLESv2", "gl.xml", "namespace gl")
 
         glesdecls['core'][(major_version,
-                           minor_version)] = get_decls(context_decl_format, all_commands,
-                                                       gles_commands, [], cmd_packed_gl_enums,
-                                                       True)
+                           minor_version)] = get_decls(GLES, CONTEXT_DECL_FORMAT, all_commands,
+                                                       gles_commands, [], cmd_packed_gl_enums)
 
         validation_annotation = "ES%s%s" % (major_version, minor_if_not_zero)
-        write_validation_header(validation_annotation, "ES %s" % comment, validation_protos,
-                                "gl.xml and gl_angle_ext.xml")
+        write_gl_validation_header(validation_annotation, "ES %s" % comment, validation_protos,
+                                   "gl.xml and gl_angle_ext.xml")
 
         write_capture_header(version, comment, capture_protos, capture_pointer_funcs)
         write_capture_source(version, validation_annotation, comment, capture_methods)
@@ -1937,12 +2332,12 @@
 
         # Detect and filter duplicate extensions.
         decls, defs, libgles_defs, validation_protos, capture_protos, capture_methods, capture_param_funcs = get_entry_points(
-            xml.all_commands, ext_cmd_names, False, False, all_gles_param_types,
-            cmd_packed_gl_enums, True)
+            GLES, xml.all_commands, ext_cmd_names, False, all_gles_param_types,
+            cmd_packed_gl_enums, [], {})
 
         # Avoid writing out entry points defined by a prior extension.
         for dupe in xml.ext_dupes[extension_name]:
-            msg = "// {} is already defined.\n".format(dupe[2:])
+            msg = "// {} is already defined.\n".format(strip_api_prefix(dupe))
             defs.append(msg)
 
         # Write the extension name as a comment before the first EP.
@@ -1964,22 +2359,22 @@
         libgles_ep_exports += get_exports(ext_cmd_names)
 
         if (extension_name in registry_xml.gles1_extensions and
-                extension_name not in gles1_no_context_decl_extensions):
+                extension_name not in GLES1_NO_CONTEXT_DECL_EXTENSIONS):
             glesdecls['exts']['GLES1 Extensions'][extension_name] = get_decls(
-                context_decl_format, all_commands, ext_cmd_names, all_commands_no_suffix,
-                cmd_packed_gl_enums, True)
+                GLES, CONTEXT_DECL_FORMAT, all_commands, ext_cmd_names, all_commands_no_suffix,
+                cmd_packed_gl_enums)
         if extension_name in registry_xml.gles_extensions:
             glesdecls['exts']['GLES2+ Extensions'][extension_name] = get_decls(
-                context_decl_format, all_commands, ext_cmd_names, all_commands_no_suffix,
-                cmd_packed_gl_enums, True)
+                GLES, CONTEXT_DECL_FORMAT, all_commands, ext_cmd_names, all_commands_no_suffix,
+                cmd_packed_gl_enums)
         if extension_name in registry_xml.angle_extensions:
             glesdecls['exts']['ANGLE Extensions'][extension_name] = get_decls(
-                context_decl_format, all_commands, ext_cmd_names, all_commands_no_suffix,
-                cmd_packed_gl_enums, True)
+                GLES, CONTEXT_DECL_FORMAT, all_commands, ext_cmd_names, all_commands_no_suffix,
+                cmd_packed_gl_enums)
 
     for name in extension_commands:
         all_commands_with_suffix.append(name)
-        all_commands_no_suffix.append(strip_suffix(name, True))
+        all_commands_no_suffix.append(strip_suffix(GLES, name))
 
     # Special handling for EGL_ANGLE_explicit_context extension
     if registry_xml.support_EGL_ANGLE_explicit_context:
@@ -1992,7 +2387,7 @@
 
         # Get the explicit context entry points
         decls, defs, libgles_defs, validation_protos, capture_protos, capture_methods, capture_param_funcs = get_entry_points(
-            xml.all_commands, cmds, True, False, all_gles_param_types, cmd_packed_gl_enums, True)
+            GLES, xml.all_commands, cmds, True, all_gles_param_types, cmd_packed_gl_enums, [], {})
 
         # Append the explicit context entry points
         extension_decls += decls
@@ -2003,7 +2398,7 @@
         libgles_ep_exports += get_exports(cmds, lambda x: "%sContextANGLE" % x)
 
         # Generate .inc files for extension function pointers and declarations
-        for major, minor in versions:
+        for major, minor in registry_xml.GLES_VERSIONS:
             annotation = "{}_{}".format(major, minor)
 
             major_if_not_one = major if major != 1 else ""
@@ -2032,78 +2427,179 @@
                                              "\n".join(glext_protos))
 
     # Now we generate entry points for the desktop implementation
-    gldecls = {}
-    gldecls['core'] = {}
-    for ver in [(1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 0), (2, 1), (3, 0), (3, 1),
-                (3, 2), (3, 3), (4, 0), (4, 1), (4, 2), (4, 3), (4, 4), (4, 5), (4, 6)]:
-        gldecls['core'][ver] = []
+    desktop_gl_decls = {}
+    desktop_gl_decls['core'] = {}
+    for major, _ in registry_xml.DESKTOP_GL_VERSIONS:
+        desktop_gl_decls['core'][(major, "X")] = []
 
     libgl_ep_defs = []
     libgl_ep_exports = []
 
     glxml = registry_xml.RegistryXML('gl.xml')
 
-    for major_version, minor_version in [[1, 0], [1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [2, 0],
-                                         [2, 1], [3, 0], [3, 1], [3, 2], [3, 3], [4, 0], [4, 1],
-                                         [4, 2], [4, 3], [4, 4], [4, 5], [4, 6]]:
-        version = "{}_{}".format(major_version, minor_version)
-        annotation = "GL_{}".format(version)
-        name_prefix = "GL_VERSION_"
+    for major_version in sorted(
+            set([major for (major, minor) in registry_xml.DESKTOP_GL_VERSIONS])):
+        is_major = lambda ver: ver[0] == major_version
 
-        comment = version.replace("_", ".")
-        feature_name = "{}{}".format(name_prefix, version)
+        ver_decls = []
+        ver_defs = []
+        validation_protos = []
 
-        glxml.AddCommands(feature_name, version)
+        for _, minor_version in filter(is_major, registry_xml.DESKTOP_GL_VERSIONS):
+            version = "{}_{}".format(major_version, minor_version)
+            annotation = "GL_{}".format(version)
+            name_prefix = "GL_VERSION_"
 
-        all_libgl_commands = glxml.commands[version]
+            comment = version.replace("_", ".")
+            feature_name = "{}{}".format(name_prefix, version)
 
-        just_libgl_commands = [
-            cmd for cmd in all_libgl_commands if cmd not in all_commands_no_suffix
-        ]
-        just_libgl_commands_suffix = [
-            cmd for cmd in all_libgl_commands if cmd not in all_commands_with_suffix
-        ]
+            glxml.AddCommands(feature_name, version)
 
-        all_commands32 = glxml.all_commands
+            all_libgl_commands = glxml.commands[version]
 
-        # Validation duplicates handled with suffix
-        _, _, _, validation_protos32, _, _, _ = get_entry_points(all_commands32,
-                                                                 just_libgl_commands_suffix, False,
-                                                                 False, all_gles_param_types,
-                                                                 cmd_packed_gl_enums, False)
-        decls_gl, defs_gl, libgl_defs, _, _, _, _ = get_entry_points(all_commands32,
-                                                                     all_libgl_commands, False,
-                                                                     False, all_gles_param_types,
-                                                                     cmd_packed_gl_enums, False)
+            just_libgl_commands = [
+                cmd for cmd in all_libgl_commands if cmd not in all_commands_no_suffix
+            ]
+            just_libgl_commands_suffix = [
+                cmd for cmd in all_libgl_commands if cmd not in all_commands_with_suffix
+            ]
 
-        # Write the version as a comment before the first EP.
-        libgl_defs.insert(0, "\n// GL %s" % comment)
-        libgl_ep_exports.append("\n    ; GL %s" % comment)
+            all_commands32 = glxml.all_commands
 
-        libgl_ep_defs += libgl_defs
-        libgl_ep_exports += get_exports(all_libgl_commands)
+            # Validation duplicates handled with suffix
+            _, _, _, protos, _, _, _ = get_entry_points(GL, all_commands32,
+                                                        just_libgl_commands_suffix, False,
+                                                        all_gles_param_types, cmd_packed_gl_enums,
+                                                        [], {})
+            decls, defs, libgl_defs, _, _, _, _ = get_entry_points(GL, all_commands32,
+                                                                   all_libgl_commands, False,
+                                                                   all_gles_param_types,
+                                                                   cmd_packed_gl_enums, [], {})
 
-        minor_if_not_zero = minor_version if minor_version != 0 else ""
+            desktop_gl_decls['core'][(major_version, "X")] += get_decls(
+                GL, CONTEXT_DECL_FORMAT, all_commands32, just_libgl_commands,
+                all_commands_no_suffix, cmd_packed_gl_enums)
 
-        header_includes = template_header_includes_gl32
-        source_includes = template_sources_includes_gl32.format(annotation.lower(), major_version,
-                                                                minor_if_not_zero)
+            # Write the version as a comment before the first EP.
+            cpp_comment = "\n// GL %s" % comment
+            def_comment = "\n    ; GL %s" % comment
+
+            libgl_ep_defs += [cpp_comment] + libgl_defs
+            libgl_ep_exports += [def_comment] + get_exports(all_libgl_commands)
+            validation_protos += [cpp_comment] + protos
+            ver_decls += [cpp_comment] + decls
+            ver_defs += [cpp_comment] + defs
+
+        annotation = "GL_%d" % major_version
+        name = "Desktop GL %s.x" % major_version
+
+        source_includes = TEMPLATE_DESKTOP_GL_SOURCE_INCLUDES.format(annotation.lower(),
+                                                                     major_version)
 
         # Entry point files
-        write_file(annotation, "GL " + comment, template_entry_point_header, "\n".join(decls_gl),
-                   "h", header_includes, "libGL", "gl.xml")
-        write_file(annotation, "GL " + comment, template_entry_point_source, "\n".join(defs_gl),
-                   "cpp", source_includes, "libGL", "gl.xml")
-
-        gldecls['core'][(major_version,
-                         minor_version)] = get_decls(context_decl_format, all_commands32,
-                                                     just_libgl_commands, all_commands_no_suffix,
-                                                     cmd_packed_gl_enums, False)
+        write_file(annotation, name, TEMPLATE_ENTRY_POINT_HEADER, "\n".join(ver_decls), "h",
+                   DESKTOP_GL_HEADER_INCLUDES, "libGL", "gl.xml", "namespace gl")
+        write_file(annotation, name, TEMPLATE_ENTRY_POINT_SOURCE, "\n".join(ver_defs), "cpp",
+                   source_includes, "libGL", "gl.xml", "namespace gl")
 
         # Validation files
-        validation_annotation = "GL%s%s" % (major_version, minor_if_not_zero)
-        write_validation_header(validation_annotation, "%s" % comment, validation_protos32,
-                                "gl.xml and wgl.xml")
+        write_gl_validation_header("GL%s" % major_version, name, validation_protos, "gl.xml")
+
+    # EGL
+    eglxml = registry_xml.RegistryXML('egl.xml', 'egl_angle_ext.xml')
+    egl_param_types = set()
+
+    with open(script_relative('entry_point_packed_egl_enums.json')) as f:
+        cmd_packed_egl_enums = json.loads(f.read())
+
+    egl_validation_protos = []
+    egl_decls = []
+    egl_defs = []
+    libegl_ep_defs = []
+    libegl_windows_def_exports = []
+    egl_ep_to_object = get_egl_object_category_map()
+    egl_commands = []
+
+    for major_version, minor_version in registry_xml.EGL_VERSIONS:
+        version = "%d_%d" % (major_version, minor_version)
+        annotation = "EGL_%s" % version
+        name_prefix = "EGL_VERSION_"
+
+        comment = version.replace("_", ".")
+        feature_name = "%s%s" % (name_prefix, version)
+
+        eglxml.AddCommands(feature_name, version)
+
+        egl_version_commands = eglxml.commands[version]
+        egl_commands += egl_version_commands
+
+        # Spec revs may have no new commands.
+        if not egl_version_commands:
+            continue
+
+        decls, defs, export_defs, validation_protos, _, _, _ = get_entry_points(
+            EGL, eglxml.all_commands, egl_version_commands, False, egl_param_types,
+            cmd_packed_egl_enums, EGL_PACKED_TYPES, egl_ep_to_object)
+
+        comment = "\n// EGL %d.%d" % (major_version, minor_version)
+        win_def_comment = "\n    ; EGL %d.%d" % (major_version, minor_version)
+
+        egl_validation_protos += [comment] + validation_protos
+        egl_decls += [comment] + decls
+        egl_defs += [comment] + defs
+        libegl_ep_defs += [comment] + export_defs
+        libegl_windows_def_exports += [win_def_comment] + get_exports(eglxml.commands[version])
+
+    write_file("egl", "EGL", TEMPLATE_ENTRY_POINT_HEADER, "\n".join(egl_decls), "h",
+               EGL_HEADER_INCLUDES, "libGLESv2", "egl.xml", "extern \"C\"")
+    write_file("egl", "EGL", TEMPLATE_ENTRY_POINT_SOURCE, "\n".join(egl_defs), "cpp",
+               EGL_SOURCE_INCLUDES, "libGLESv2", "egl.xml", "extern \"C\"")
+    write_egl_stubs_header("egl", "EGL", "egl.xml", EGL_STUBS_HEADER_PATH, eglxml.all_commands,
+                           egl_commands, cmd_packed_egl_enums)
+
+    eglxml.AddExtensionCommands(registry_xml.supported_egl_extensions, ['egl'])
+    egl_ext_decls = []
+    egl_ext_defs = []
+    egl_ext_commands = []
+
+    for extension_name, ext_cmd_names in sorted(eglxml.ext_data.iteritems()):
+
+        # Extensions may have no new commands.
+        if not ext_cmd_names:
+            continue
+
+        # Detect and filter duplicate extensions.
+        decls, defs, export_defs, validation_protos, _, _, _ = get_entry_points(
+            EGL, eglxml.all_commands, ext_cmd_names, False, egl_param_types, cmd_packed_egl_enums,
+            EGL_PACKED_TYPES, egl_ep_to_object)
+
+        # Avoid writing out entry points defined by a prior extension.
+        for dupe in eglxml.ext_dupes[extension_name]:
+            msg = "// %s is already defined.\n" % strip_api_prefix(dupe)
+            defs.append(msg)
+
+        comment = "\n// %s" % extension_name
+        win_def_comment = "\n    ; %s" % (extension_name)
+
+        egl_ext_commands += ext_cmd_names
+
+        egl_validation_protos += [comment] + validation_protos
+        egl_ext_decls += [comment] + decls
+        egl_ext_defs += [comment] + defs
+        libegl_ep_defs += [comment] + export_defs
+        libegl_windows_def_exports += [win_def_comment] + get_exports(ext_cmd_names)
+
+    write_file("egl_ext", "EGL Extension", TEMPLATE_ENTRY_POINT_HEADER, "\n".join(egl_ext_decls),
+               "h", EGL_EXT_HEADER_INCLUDES, "libGLESv2", "egl.xml and egl_angle_ext.xml",
+               "extern \"C\"")
+    write_file("egl_ext", "EGL Extension", TEMPLATE_ENTRY_POINT_SOURCE, "\n".join(egl_ext_defs),
+               "cpp", EGL_EXT_SOURCE_INCLUDES, "libGLESv2", "egl.xml and egl_angle_ext.xml",
+               "extern \"C\"")
+    write_validation_header("EGL", "EGL", egl_validation_protos, "egl.xml and egl_angle_ext.xml",
+                            TEMPLATE_EGL_VALIDATION_HEADER)
+    write_egl_stubs_header("egl_ext", "EXT extension", "egl.xml and egl_angle_ext.xml",
+                           EGL_EXT_STUBS_HEADER_PATH, eglxml.all_commands, egl_ext_commands,
+                           cmd_packed_egl_enums)
 
     # WGL
     wglxml = registry_xml.RegistryXML('wgl.xml')
@@ -2120,7 +2616,7 @@
 
     wgl_param_types = set()
     decls_wgl, defs_wgl, wgl_defs, validation_protos_wgl, _, _, _ = get_entry_points(
-        all_commands32, wgl_commands, False, True, wgl_param_types, {}, False)
+        WGL, all_commands32, wgl_commands, False, wgl_param_types, {}, [], {})
 
     # Write the version as a comment before the first EP.
     libgl_ep_exports.append("\n    ; WGL %s" % comment)
@@ -2131,59 +2627,37 @@
 
     libgl_ep_exports += get_exports(wgl_commands)
 
-    header_includes = template_header_includes.format(major="", minor="")
-    header_includes += """
-    #include <GLES/glext.h>
-    #include <GLES2/gl2.h>
-    #include <GLES2/gl2ext.h>
-    #include <GLES3/gl32.h>
-    """
+    write_file("gles_ext", "GLES extension", TEMPLATE_ENTRY_POINT_HEADER,
+               "\n".join([item for item in extension_decls]), "h", GLES_EXT_HEADER_INCLUDES,
+               "libGLESv2", "gl.xml and gl_angle_ext.xml", "namespace gl")
+    write_file("gles_ext", "GLES extension", TEMPLATE_ENTRY_POINT_SOURCE,
+               "\n".join([item for item in extension_defs]), "cpp", GLES_EXT_SOURCE_INCLUDES,
+               "libGLESv2", "gl.xml and gl_angle_ext.xml", "namespace gl")
 
-    source_includes = template_sources_includes.format(
-        header_version="gles_ext", validation_header_version="ESEXT")
-    source_includes += """
-    #include "libANGLE/capture_gles_1_0_autogen.h"
-    #include "libANGLE/capture_gles_2_0_autogen.h"
-    #include "libANGLE/capture_gles_3_0_autogen.h"
-    #include "libANGLE/capture_gles_3_1_autogen.h"
-    #include "libANGLE/capture_gles_3_2_autogen.h"
-    #include "libANGLE/validationES1.h"
-    #include "libANGLE/validationES2.h"
-    #include "libANGLE/validationES3.h"
-    #include "libANGLE/validationES31.h"
-    #include "libANGLE/validationES32.h"
-    """
-
-    write_file("gles_ext", "GLES extension", template_entry_point_header,
-               "\n".join([item for item in extension_decls]), "h", header_includes, "libGLESv2",
-               "gl.xml and gl_angle_ext.xml")
-    write_file("gles_ext", "GLES extension", template_entry_point_source,
-               "\n".join([item for item in extension_defs]), "cpp", source_includes, "libGLESv2",
-               "gl.xml and gl_angle_ext.xml")
-
-    write_validation_header("ESEXT", "ES extension", ext_validation_protos,
-                            "gl.xml and gl_angle_ext.xml")
+    write_gl_validation_header("ESEXT", "ES extension", ext_validation_protos,
+                               "gl.xml and gl_angle_ext.xml")
     write_capture_header("ext", "extension", ext_capture_protos, ext_capture_param_funcs)
     write_capture_source("ext", "ESEXT", "extension", ext_capture_methods)
 
-    write_context_api_decls(context_header, glesdecls, "gles")
-    write_context_api_decls(context_header, gldecls, "gl")
+    write_context_api_decls(glesdecls, "gles")
+    write_context_api_decls(desktop_gl_decls, "gl")
 
     # Entry point enum
-    cmd_names = ["Invalid"] + [cmd[2:] for cmd in xml.all_cmd_names.get_all_commands()]
-    gl_cmd_names = [cmd[2:] for cmd in glxml.all_cmd_names.get_all_commands()]
-    cmd_names.extend([cmd for cmd in gl_cmd_names if cmd not in cmd_names])
-    sorted_cmd_names = sorted(cmd_names)
+    egl_cmd_names = [strip_api_prefix(cmd) for cmd in eglxml.all_cmd_names.get_all_commands()]
+    gles_cmd_names = ["Invalid"
+                     ] + [strip_api_prefix(cmd) for cmd in xml.all_cmd_names.get_all_commands()]
+    gl_cmd_names = [strip_api_prefix(cmd) for cmd in glxml.all_cmd_names.get_all_commands()]
+    wgl_cmd_names = [strip_api_prefix(cmd) for cmd in wglxml.all_cmd_names.get_all_commands()]
+    unsorted_enums = [("EGL%s" % cmd, "egl%s" % cmd) for cmd in egl_cmd_names] + [
+        ("GL%s" % cmd, "gl%s" % cmd) for cmd in set(gles_cmd_names + gl_cmd_names)
+    ] + [("WGL%s" % cmd, "wgl%s" % cmd) for cmd in wgl_cmd_names]
+    all_enums = sorted(unsorted_enums)
 
-    # Ensure there are no duplicates
-    assert (len(sorted_cmd_names) == len(set(sorted_cmd_names))), "Duplicate command names found"
-
-    entry_points_enum_header = template_entry_points_enum_header.format(
+    entry_points_enum_header = TEMPLATE_ENTRY_POINTS_ENUM_HEADER.format(
         script_name=os.path.basename(sys.argv[0]),
         data_source_name="gl.xml and gl_angle_ext.xml",
-        year=date.today().year,
         lib="GL/GLES",
-        entry_points_list=",\n".join(["    " + cmd for cmd in sorted_cmd_names]))
+        entry_points_list=",\n".join(["    " + enum for (enum, _) in all_enums]))
 
     entry_points_enum_header_path = path_to("common", "entry_points_enum_autogen.h")
     with open(entry_points_enum_header_path, "w") as out:
@@ -2191,12 +2665,11 @@
         out.close()
 
     entry_points_cases = [
-        template_entry_points_name_case.format(enum=cmd) for cmd in sorted_cmd_names
+        TEMPLATE_ENTRY_POINTS_NAME_CASE.format(enum=enum, cmd=cmd) for (enum, cmd) in all_enums
     ]
-    entry_points_enum_source = template_entry_points_enum_source.format(
+    entry_points_enum_source = TEMPLATE_ENTRY_POINTS_ENUM_SOURCE.format(
         script_name=os.path.basename(sys.argv[0]),
         data_source_name="gl.xml and gl_angle_ext.xml",
-        year=date.today().year,
         lib="GL/GLES",
         entry_points_name_cases="\n".join(entry_points_cases))
 
@@ -2205,50 +2678,13 @@
         out.write(entry_points_enum_source)
         out.close()
 
-    source_includes = """
-    #include "angle_gl.h"
-
-    #include "libGLESv2/entry_points_gles_1_0_autogen.h"
-    #include "libGLESv2/entry_points_gles_2_0_autogen.h"
-    #include "libGLESv2/entry_points_gles_3_0_autogen.h"
-    #include "libGLESv2/entry_points_gles_3_1_autogen.h"
-    #include "libGLESv2/entry_points_gles_3_2_autogen.h"
-    #include "libGLESv2/entry_points_gles_ext_autogen.h"
-
-    #include "common/event_tracer.h"
-    """
-
-    write_export_files("\n".join([item for item in libgles_ep_defs]), source_includes,
+    write_export_files("\n".join([item for item in libgles_ep_defs]), LIBGLESV2_EXPORT_INCLUDES,
                        "gl.xml and gl_angle_ext.xml", "libGLESv2", "OpenGL ES")
-
-    source_includes = """
-    #include "angle_gl.h"
-
-    #include "libGL/entry_points_gl_1_0_autogen.h"
-    #include "libGL/entry_points_gl_1_1_autogen.h"
-    #include "libGL/entry_points_gl_1_2_autogen.h"
-    #include "libGL/entry_points_gl_1_3_autogen.h"
-    #include "libGL/entry_points_gl_1_4_autogen.h"
-    #include "libGL/entry_points_gl_1_5_autogen.h"
-    #include "libGL/entry_points_gl_2_0_autogen.h"
-    #include "libGL/entry_points_gl_2_1_autogen.h"
-    #include "libGL/entry_points_gl_3_0_autogen.h"
-    #include "libGL/entry_points_gl_3_1_autogen.h"
-    #include "libGL/entry_points_gl_3_2_autogen.h"
-    #include "libGL/entry_points_gl_3_3_autogen.h"
-    #include "libGL/entry_points_gl_4_0_autogen.h"
-    #include "libGL/entry_points_gl_4_1_autogen.h"
-    #include "libGL/entry_points_gl_4_2_autogen.h"
-    #include "libGL/entry_points_gl_4_3_autogen.h"
-    #include "libGL/entry_points_gl_4_4_autogen.h"
-    #include "libGL/entry_points_gl_4_5_autogen.h"
-    #include "libGL/entry_points_gl_4_6_autogen.h"
-
-    #include "common/event_tracer.h"
-    """
-
-    write_export_files("\n".join([item for item in libgl_ep_defs]), source_includes,
+    write_export_files("\n".join([item for item in libgl_ep_defs]), LIBGL_EXPORT_INCLUDES,
                        "gl.xml and wgl.xml", "libGL", "Windows GL")
+    write_export_files("\n".join([item for item in libegl_ep_defs]),
+                       LIBEGL_EXPORT_INCLUDES_AND_PREAMBLE, "egl.xml and egl_angle_ext.xml",
+                       "libEGL", "EGL")
 
     libgles_ep_exports += get_egl_exports()
 
@@ -2257,12 +2693,14 @@
     for lib in ["libGLESv2" + suffix for suffix in ["", "_no_capture", "_with_capture"]]:
         write_windows_def_file(everything, lib, lib, "libGLESv2", libgles_ep_exports)
     write_windows_def_file(everything, "libGL", "openGL32", "libGL", libgl_ep_exports)
+    write_windows_def_file("egl.xml and egl_angle_ext.xml", "libEGL", "libEGL", "libEGL",
+                           libegl_windows_def_exports)
 
     all_gles_param_types = sorted(all_gles_param_types)
     write_capture_helper_header(all_gles_param_types)
     write_capture_helper_source(all_gles_param_types)
-    write_capture_replay_source(xml.all_commands, all_commands_no_suffix, cmd_packed_gl_enums,
-                                True)
+    write_capture_replay_source(GLES, xml.all_commands, all_commands_no_suffix,
+                                cmd_packed_gl_enums, [])
 
 
 if __name__ == '__main__':
diff --git a/scripts/registry_xml.py b/scripts/registry_xml.py
index 777e35d..0652679 100644
--- a/scripts/registry_xml.py
+++ b/scripts/registry_xml.py
@@ -66,6 +66,7 @@
     "GL_EXT_blend_func_extended",
     "GL_EXT_buffer_storage",
     "GL_EXT_copy_image",
+    "GL_EXT_debug_label",
     "GL_EXT_debug_marker",
     "GL_EXT_discard_framebuffer",
     "GL_EXT_disjoint_timer_query",
@@ -87,6 +88,7 @@
     "GL_EXT_semaphore",
     "GL_EXT_semaphore_fd",
     "GL_EXT_separate_shader_objects",
+    "GL_EXT_shader_io_blocks",
     "GL_EXT_sRGB",
     "GL_EXT_tessellation_shader",
     "GL_EXT_texture_buffer",
@@ -114,6 +116,7 @@
     "GL_OES_get_program_binary",
     "GL_OES_mapbuffer",
     "GL_OES_sample_shading",
+    "GL_OES_shader_io_blocks",
     "GL_OES_texture_3D",
     "GL_OES_texture_border_clamp",
     "GL_OES_texture_buffer",
@@ -205,6 +208,14 @@
     'ClampColorModeARB',
 }
 
+# Versions (major, minor). Note that GLES intentionally places 1.0 last.
+DESKTOP_GL_VERSIONS = [(1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 0), (2, 1), (3, 0),
+                       (3, 1), (3, 2), (3, 3), (4, 0), (4, 1), (4, 2), (4, 3), (4, 4), (4, 5),
+                       (4, 6)]
+GLES_VERSIONS = [(2, 0), (3, 0), (3, 1), (3, 2), (1, 0)]
+EGL_VERSIONS = [(1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5)]
+WGL_VERSIONS = [(1, 0)]
+
 
 def script_relative(path):
     return os.path.join(os.path.dirname(sys.argv[0]), path)
diff --git a/scripts/roll_aosp.sh b/scripts/roll_aosp.sh
index 1564c29..6885d1f 100755
--- a/scripts/roll_aosp.sh
+++ b/scripts/roll_aosp.sh
@@ -105,7 +105,7 @@
     ${GN_OUTPUT_DIRECTORY}/desc.arm.json \
     ${GN_OUTPUT_DIRECTORY}/desc.arm64.json \
     ${GN_OUTPUT_DIRECTORY}/desc.x86.json \
-    ${GN_OUTPUT_DIRECTORY}/desc.x64.json > Android.bp
+    ${GN_OUTPUT_DIRECTORY}/desc.x64.json $@ > Android.bp
 
 rm -rf ${GN_OUTPUT_DIRECTORY}
 git add Android.bp
diff --git a/scripts/run_code_generation.py b/scripts/run_code_generation.py
index 9477a9d..15471c9 100755
--- a/scripts/run_code_generation.py
+++ b/scripts/run_code_generation.py
@@ -182,7 +182,10 @@
     for file in os.listdir(hash_dir):
         hash_fname = os.path.join(hash_dir, file)
         with open(hash_fname) as hash_file:
-            hashes[file] = json.load(open(hash_fname))
+            try:
+                hashes[file] = json.load(hash_file)
+            except ValueError:
+                raise Exception("Could not decode JSON from %s" % file)
     return hashes
 
 
diff --git a/src/common/PackedEnums.h b/src/common/PackedEnums.h
index fdc4dc0..c4ba3b8 100644
--- a/src/common/PackedEnums.h
+++ b/src/common/PackedEnums.h
@@ -187,15 +187,8 @@
     angle::EnumIterator<TextureTarget> end() const { return kAfterCubeMapTextureTargetMax; }
 };
 
-constexpr ShaderType kGLES2ShaderTypeMin = ShaderType::Vertex;
-constexpr ShaderType kGLES2ShaderTypeMax = ShaderType::Fragment;
-constexpr ShaderType kAfterGLES2ShaderTypeMax =
-    static_cast<ShaderType>(static_cast<uint8_t>(kGLES2ShaderTypeMax) + 1);
-struct AllGLES2ShaderTypes
-{
-    angle::EnumIterator<ShaderType> begin() const { return kGLES2ShaderTypeMin; }
-    angle::EnumIterator<ShaderType> end() const { return kAfterGLES2ShaderTypeMax; }
-};
+constexpr std::array<ShaderType, 2> kAllGLES2ShaderTypes = {ShaderType::Vertex,
+                                                            ShaderType::Fragment};
 
 constexpr ShaderType kShaderTypeMin = ShaderType::Vertex;
 constexpr ShaderType kShaderTypeMax = ShaderType::Compute;
@@ -243,9 +236,10 @@
     LineStripAdjacency     = 0xB,
     TrianglesAdjacency     = 0xC,
     TriangleStripAdjacency = 0xD,
+    Patches                = 0xE,
 
-    InvalidEnum = 0xE,
-    EnumCount   = 0xE,
+    InvalidEnum = 0xF,
+    EnumCount   = 0xF,
 };
 
 template <>
@@ -737,7 +731,7 @@
 
 // First case: handling packed enums.
 template <typename EnumT, typename FromT>
-typename std::enable_if<std::is_enum<EnumT>::value, EnumT>::type FromGL(FromT from)
+typename std::enable_if<std::is_enum<EnumT>::value, EnumT>::type PackParam(FromT from)
 {
     return FromGLenum<EnumT>(from);
 }
@@ -745,7 +739,7 @@
 // Second case: handling non-pointer resource ids.
 template <typename EnumT, typename FromT>
 typename std::enable_if<!std::is_pointer<FromT>::value && !std::is_enum<EnumT>::value, EnumT>::type
-FromGL(FromT from)
+PackParam(FromT from)
 {
     return {from};
 }
@@ -753,7 +747,7 @@
 // Third case: handling pointer resource ids.
 template <typename EnumT, typename FromT>
 typename std::enable_if<std::is_pointer<FromT>::value && !std::is_enum<EnumT>::value, EnumT>::type
-FromGL(FromT from)
+PackParam(FromT from)
 {
     return reinterpret_cast<EnumT>(from);
 }
diff --git a/src/common/PackedGLEnums_autogen.cpp b/src/common/PackedGLEnums_autogen.cpp
index d35c8e7..a6181d9 100644
--- a/src/common/PackedGLEnums_autogen.cpp
+++ b/src/common/PackedGLEnums_autogen.cpp
@@ -1392,14 +1392,14 @@
     {
         case GL_VERTEX_SHADER:
             return ShaderType::Vertex;
-        case GL_FRAGMENT_SHADER:
-            return ShaderType::Fragment;
-        case GL_GEOMETRY_SHADER_EXT:
-            return ShaderType::Geometry;
         case GL_TESS_CONTROL_SHADER_EXT:
             return ShaderType::TessControl;
         case GL_TESS_EVALUATION_SHADER_EXT:
             return ShaderType::TessEvaluation;
+        case GL_GEOMETRY_SHADER_EXT:
+            return ShaderType::Geometry;
+        case GL_FRAGMENT_SHADER:
+            return ShaderType::Fragment;
         case GL_COMPUTE_SHADER:
             return ShaderType::Compute;
         default:
@@ -1413,14 +1413,14 @@
     {
         case ShaderType::Vertex:
             return GL_VERTEX_SHADER;
-        case ShaderType::Fragment:
-            return GL_FRAGMENT_SHADER;
-        case ShaderType::Geometry:
-            return GL_GEOMETRY_SHADER_EXT;
         case ShaderType::TessControl:
             return GL_TESS_CONTROL_SHADER_EXT;
         case ShaderType::TessEvaluation:
             return GL_TESS_EVALUATION_SHADER_EXT;
+        case ShaderType::Geometry:
+            return GL_GEOMETRY_SHADER_EXT;
+        case ShaderType::Fragment:
+            return GL_FRAGMENT_SHADER;
         case ShaderType::Compute:
             return GL_COMPUTE_SHADER;
         default:
@@ -1436,18 +1436,18 @@
         case ShaderType::Vertex:
             os << "GL_VERTEX_SHADER";
             break;
-        case ShaderType::Fragment:
-            os << "GL_FRAGMENT_SHADER";
-            break;
-        case ShaderType::Geometry:
-            os << "GL_GEOMETRY_SHADER_EXT";
-            break;
         case ShaderType::TessControl:
             os << "GL_TESS_CONTROL_SHADER_EXT";
             break;
         case ShaderType::TessEvaluation:
             os << "GL_TESS_EVALUATION_SHADER_EXT";
             break;
+        case ShaderType::Geometry:
+            os << "GL_GEOMETRY_SHADER_EXT";
+            break;
+        case ShaderType::Fragment:
+            os << "GL_FRAGMENT_SHADER";
+            break;
         case ShaderType::Compute:
             os << "GL_COMPUTE_SHADER";
             break;
diff --git a/src/common/PackedGLEnums_autogen.h b/src/common/PackedGLEnums_autogen.h
index c2318f9..4305202 100644
--- a/src/common/PackedGLEnums_autogen.h
+++ b/src/common/PackedGLEnums_autogen.h
@@ -360,10 +360,10 @@
 enum class ShaderType : uint8_t
 {
     Vertex         = 0,
-    Fragment       = 1,
-    Geometry       = 2,
-    TessControl    = 3,
-    TessEvaluation = 4,
+    TessControl    = 1,
+    TessEvaluation = 2,
+    Geometry       = 3,
+    Fragment       = 4,
     Compute        = 5,
 
     InvalidEnum = 6,
diff --git a/src/common/aligned_memory.cpp b/src/common/aligned_memory.cpp
index 6d7d1d0..9798fc0 100644
--- a/src/common/aligned_memory.cpp
+++ b/src/common/aligned_memory.cpp
@@ -54,7 +54,7 @@
 
 void AlignedFree(void *ptr)
 {
-#if defined(_MSC_VER)
+#if defined(ANGLE_PLATFORM_WINDOWS)
     _aligned_free(ptr);
 #else
     free(ptr);
diff --git a/src/common/angleutils.h b/src/common/angleutils.h
index fe8777e..52450b0 100644
--- a/src/common/angleutils.h
+++ b/src/common/angleutils.h
@@ -15,6 +15,10 @@
 #    include "absl/container/flat_hash_map.h"
 #endif  // defined(ANGLE_USE_ABSEIL)
 
+#if defined(ANGLE_WITH_LSAN)
+#    include <sanitizer/lsan_interface.h>
+#endif  // defined(ANGLE_WITH_LSAN)
+
 #include <climits>
 #include <cstdarg>
 #include <cstddef>
@@ -296,6 +300,12 @@
     UNREACHABLE();                    \
     ANGLE_CHECK(context, false, "Unreachable Code.", GL_INVALID_OPERATION)
 
+#if defined(ANGLE_WITH_LSAN)
+#    define ANGLE_SCOPED_DISABLE_LSAN() __lsan::ScopedDisabler lsanDisabler
+#else
+#    define ANGLE_SCOPED_DISABLE_LSAN()
+#endif
+
 // The below inlining code lifted from V8.
 #if defined(__clang__) || (defined(__GNUC__) && defined(__has_attribute))
 #    define ANGLE_HAS_ATTRIBUTE_ALWAYS_INLINE (__has_attribute(always_inline))
diff --git a/src/common/debug.cpp b/src/common/debug.cpp
index e519d9d..0025048 100644
--- a/src/common/debug.cpp
+++ b/src/common/debug.cpp
@@ -129,7 +129,7 @@
     return *g_debugMutex;
 }
 
-ScopedPerfEventHelper::ScopedPerfEventHelper(gl::Context *context, gl::EntryPoint entryPoint)
+ScopedPerfEventHelper::ScopedPerfEventHelper(gl::Context *context, angle::EntryPoint entryPoint)
     : mContext(context), mEntryPoint(entryPoint), mFunctionName(nullptr)
 {}
 
@@ -163,8 +163,8 @@
 LogMessage::LogMessage(const char *file, const char *function, int line, LogSeverity severity)
     : mFile(file), mFunction(function), mLine(line), mSeverity(severity)
 {
-    // EVENT() does not require additional function(line) info.
-    if (mSeverity != LOG_EVENT)
+    // INFO() and EVENT() do not require additional function(line) info.
+    if (mSeverity > LOG_INFO)
     {
         const char *slash = std::max(strrchr(mFile, '/'), strrchr(mFile, '\\'));
         mStream << (slash ? (slash + 1) : mFile) << ":" << mLine << " (" << mFunction << "): ";
@@ -179,7 +179,7 @@
         lock = std::unique_lock<std::mutex>(*g_debugMutex);
     }
 
-    if (DebugAnnotationsInitialized() && (mSeverity >= LOG_INFO))
+    if (DebugAnnotationsInitialized() && (mSeverity > LOG_INFO))
     {
         g_debugAnnotator->logMessage(*this);
     }
@@ -279,7 +279,7 @@
         }
 #else
         // Note: we use fprintf because <iostream> includes static initializers.
-        fprintf((severity >= LOG_ERR) ? stderr : stdout, "%s: %s\n", LogSeverityName(severity),
+        fprintf((severity >= LOG_WARN) ? stderr : stdout, "%s: %s\n", LogSeverityName(severity),
                 str.c_str());
 #endif
     }
diff --git a/src/common/debug.h b/src/common/debug.h
index e0037a4..8365aec 100644
--- a/src/common/debug.h
+++ b/src/common/debug.h
@@ -20,6 +20,7 @@
 #include <string>
 
 #include "common/angleutils.h"
+#include "common/entry_points_enum_autogen.h"
 #include "common/platform.h"
 
 #if !defined(TRACE_OUTPUT_FILE)
@@ -29,20 +30,19 @@
 namespace gl
 {
 class Context;
-enum class EntryPoint;
 
 // Pairs a D3D begin event with an end event.
 class ScopedPerfEventHelper : angle::NonCopyable
 {
   public:
-    ScopedPerfEventHelper(gl::Context *context, gl::EntryPoint entryPoint);
+    ScopedPerfEventHelper(Context *context, angle::EntryPoint entryPoint);
     ~ScopedPerfEventHelper();
     ANGLE_FORMAT_PRINTF(2, 3)
     void begin(const char *format, ...);
 
   private:
     gl::Context *mContext;
-    const gl::EntryPoint mEntryPoint;
+    const angle::EntryPoint mEntryPoint;
     const char *mFunctionName;
 };
 
@@ -93,14 +93,14 @@
     DebugAnnotator() {}
     virtual ~DebugAnnotator() {}
     virtual void beginEvent(gl::Context *context,
-                            gl::EntryPoint entryPoint,
+                            angle::EntryPoint entryPoint,
                             const char *eventName,
-                            const char *eventMessage) = 0;
+                            const char *eventMessage)   = 0;
     virtual void endEvent(gl::Context *context,
                           const char *eventName,
-                          gl::EntryPoint entryPoint)  = 0;
-    virtual void setMarker(const char *markerName)    = 0;
-    virtual bool getStatus()                          = 0;
+                          angle::EntryPoint entryPoint) = 0;
+    virtual void setMarker(const char *markerName)      = 0;
+    virtual bool getStatus()                            = 0;
     // Log Message Handler that gets passed every log message,
     // when debug annotations are initialized,
     // replacing default handling by LogMessage.
@@ -256,26 +256,31 @@
 // A macro to log a performance event around a scope.
 #if defined(ANGLE_TRACE_ENABLED)
 #    if defined(_MSC_VER)
-#        define EVENT(context, entryPoint, function, message, ...)                          \
-            gl::ScopedPerfEventHelper scopedPerfEventHelper##__LINE__(context, entryPoint); \
-            do                                                                              \
-            {                                                                               \
-                if (gl::ShouldBeginScopedEvent())                                           \
-                {                                                                           \
-                    scopedPerfEventHelper##__LINE__.begin("%s(" message ")", function,      \
-                                                          __VA_ARGS__);                     \
-                }                                                                           \
-            } while (0)
-#    else
-#        define EVENT(context, entryPoint, function, message, ...)                           \
-            gl::ScopedPerfEventHelper scopedPerfEventHelper(context, entryPoint);            \
+#        define EVENT(context, entryPoint, message, ...)                                     \
+            gl::ScopedPerfEventHelper scopedPerfEventHelper##__LINE__(                       \
+                context, angle::EntryPoint::entryPoint);                                     \
             do                                                                               \
             {                                                                                \
                 if (gl::ShouldBeginScopedEvent())                                            \
                 {                                                                            \
-                    scopedPerfEventHelper.begin("%s(" message ")", function, ##__VA_ARGS__); \
+                    scopedPerfEventHelper##__LINE__.begin(                                   \
+                        "%s(" message ")", GetEntryPointName(angle::EntryPoint::entryPoint), \
+                        __VA_ARGS__);                                                        \
                 }                                                                            \
             } while (0)
+#    else
+#        define EVENT(context, entryPoint, message, ...)                                          \
+            gl::ScopedPerfEventHelper scopedPerfEventHelper(context,                              \
+                                                            angle::EntryPoint::entryPoint);       \
+            do                                                                                    \
+            {                                                                                     \
+                if (gl::ShouldBeginScopedEvent())                                                 \
+                {                                                                                 \
+                    scopedPerfEventHelper.begin("%s(" message ")",                                \
+                                                GetEntryPointName(angle::EntryPoint::entryPoint), \
+                                                ##__VA_ARGS__);                                   \
+                }                                                                                 \
+            } while (0)
 #    endif  // _MSC_VER
 #else
 #    define EVENT(message, ...) (void(0))
diff --git a/src/common/entry_points_enum_autogen.cpp b/src/common/entry_points_enum_autogen.cpp
index 26d25bd..9d01d1b 100644
--- a/src/common/entry_points_enum_autogen.cpp
+++ b/src/common/entry_points_enum_autogen.cpp
@@ -12,2849 +12,3103 @@
 
 #include "common/debug.h"
 
-namespace gl
+namespace angle
 {
 const char *GetEntryPointName(EntryPoint ep)
 {
     switch (ep)
     {
-        case EntryPoint::Accum:
+        case EntryPoint::EGLBindAPI:
+            return "eglBindAPI";
+        case EntryPoint::EGLBindTexImage:
+            return "eglBindTexImage";
+        case EntryPoint::EGLChooseConfig:
+            return "eglChooseConfig";
+        case EntryPoint::EGLClientWaitSync:
+            return "eglClientWaitSync";
+        case EntryPoint::EGLClientWaitSyncKHR:
+            return "eglClientWaitSyncKHR";
+        case EntryPoint::EGLCopyBuffers:
+            return "eglCopyBuffers";
+        case EntryPoint::EGLCreateContext:
+            return "eglCreateContext";
+        case EntryPoint::EGLCreateDeviceANGLE:
+            return "eglCreateDeviceANGLE";
+        case EntryPoint::EGLCreateImage:
+            return "eglCreateImage";
+        case EntryPoint::EGLCreateImageKHR:
+            return "eglCreateImageKHR";
+        case EntryPoint::EGLCreateNativeClientBufferANDROID:
+            return "eglCreateNativeClientBufferANDROID";
+        case EntryPoint::EGLCreatePbufferFromClientBuffer:
+            return "eglCreatePbufferFromClientBuffer";
+        case EntryPoint::EGLCreatePbufferSurface:
+            return "eglCreatePbufferSurface";
+        case EntryPoint::EGLCreatePixmapSurface:
+            return "eglCreatePixmapSurface";
+        case EntryPoint::EGLCreatePlatformPixmapSurface:
+            return "eglCreatePlatformPixmapSurface";
+        case EntryPoint::EGLCreatePlatformPixmapSurfaceEXT:
+            return "eglCreatePlatformPixmapSurfaceEXT";
+        case EntryPoint::EGLCreatePlatformWindowSurface:
+            return "eglCreatePlatformWindowSurface";
+        case EntryPoint::EGLCreatePlatformWindowSurfaceEXT:
+            return "eglCreatePlatformWindowSurfaceEXT";
+        case EntryPoint::EGLCreateStreamKHR:
+            return "eglCreateStreamKHR";
+        case EntryPoint::EGLCreateStreamProducerD3DTextureANGLE:
+            return "eglCreateStreamProducerD3DTextureANGLE";
+        case EntryPoint::EGLCreateSync:
+            return "eglCreateSync";
+        case EntryPoint::EGLCreateSyncKHR:
+            return "eglCreateSyncKHR";
+        case EntryPoint::EGLCreateWindowSurface:
+            return "eglCreateWindowSurface";
+        case EntryPoint::EGLDebugMessageControlKHR:
+            return "eglDebugMessageControlKHR";
+        case EntryPoint::EGLDestroyContext:
+            return "eglDestroyContext";
+        case EntryPoint::EGLDestroyImage:
+            return "eglDestroyImage";
+        case EntryPoint::EGLDestroyImageKHR:
+            return "eglDestroyImageKHR";
+        case EntryPoint::EGLDestroyStreamKHR:
+            return "eglDestroyStreamKHR";
+        case EntryPoint::EGLDestroySurface:
+            return "eglDestroySurface";
+        case EntryPoint::EGLDestroySync:
+            return "eglDestroySync";
+        case EntryPoint::EGLDestroySyncKHR:
+            return "eglDestroySyncKHR";
+        case EntryPoint::EGLDupNativeFenceFDANDROID:
+            return "eglDupNativeFenceFDANDROID";
+        case EntryPoint::EGLGetCompositorTimingANDROID:
+            return "eglGetCompositorTimingANDROID";
+        case EntryPoint::EGLGetCompositorTimingSupportedANDROID:
+            return "eglGetCompositorTimingSupportedANDROID";
+        case EntryPoint::EGLGetConfigAttrib:
+            return "eglGetConfigAttrib";
+        case EntryPoint::EGLGetConfigs:
+            return "eglGetConfigs";
+        case EntryPoint::EGLGetCurrentContext:
+            return "eglGetCurrentContext";
+        case EntryPoint::EGLGetCurrentDisplay:
+            return "eglGetCurrentDisplay";
+        case EntryPoint::EGLGetCurrentSurface:
+            return "eglGetCurrentSurface";
+        case EntryPoint::EGLGetDisplay:
+            return "eglGetDisplay";
+        case EntryPoint::EGLGetError:
+            return "eglGetError";
+        case EntryPoint::EGLGetFrameTimestampSupportedANDROID:
+            return "eglGetFrameTimestampSupportedANDROID";
+        case EntryPoint::EGLGetFrameTimestampsANDROID:
+            return "eglGetFrameTimestampsANDROID";
+        case EntryPoint::EGLGetMscRateANGLE:
+            return "eglGetMscRateANGLE";
+        case EntryPoint::EGLGetNativeClientBufferANDROID:
+            return "eglGetNativeClientBufferANDROID";
+        case EntryPoint::EGLGetNextFrameIdANDROID:
+            return "eglGetNextFrameIdANDROID";
+        case EntryPoint::EGLGetPlatformDisplay:
+            return "eglGetPlatformDisplay";
+        case EntryPoint::EGLGetPlatformDisplayEXT:
+            return "eglGetPlatformDisplayEXT";
+        case EntryPoint::EGLGetProcAddress:
+            return "eglGetProcAddress";
+        case EntryPoint::EGLGetSyncAttrib:
+            return "eglGetSyncAttrib";
+        case EntryPoint::EGLGetSyncAttribKHR:
+            return "eglGetSyncAttribKHR";
+        case EntryPoint::EGLGetSyncValuesCHROMIUM:
+            return "eglGetSyncValuesCHROMIUM";
+        case EntryPoint::EGLHandleGPUSwitchANGLE:
+            return "eglHandleGPUSwitchANGLE";
+        case EntryPoint::EGLInitialize:
+            return "eglInitialize";
+        case EntryPoint::EGLLabelObjectKHR:
+            return "eglLabelObjectKHR";
+        case EntryPoint::EGLMakeCurrent:
+            return "eglMakeCurrent";
+        case EntryPoint::EGLPostSubBufferNV:
+            return "eglPostSubBufferNV";
+        case EntryPoint::EGLPresentationTimeANDROID:
+            return "eglPresentationTimeANDROID";
+        case EntryPoint::EGLProgramCacheGetAttribANGLE:
+            return "eglProgramCacheGetAttribANGLE";
+        case EntryPoint::EGLProgramCachePopulateANGLE:
+            return "eglProgramCachePopulateANGLE";
+        case EntryPoint::EGLProgramCacheQueryANGLE:
+            return "eglProgramCacheQueryANGLE";
+        case EntryPoint::EGLProgramCacheResizeANGLE:
+            return "eglProgramCacheResizeANGLE";
+        case EntryPoint::EGLQueryAPI:
+            return "eglQueryAPI";
+        case EntryPoint::EGLQueryContext:
+            return "eglQueryContext";
+        case EntryPoint::EGLQueryDebugKHR:
+            return "eglQueryDebugKHR";
+        case EntryPoint::EGLQueryDeviceAttribEXT:
+            return "eglQueryDeviceAttribEXT";
+        case EntryPoint::EGLQueryDeviceStringEXT:
+            return "eglQueryDeviceStringEXT";
+        case EntryPoint::EGLQueryDisplayAttribANGLE:
+            return "eglQueryDisplayAttribANGLE";
+        case EntryPoint::EGLQueryDisplayAttribEXT:
+            return "eglQueryDisplayAttribEXT";
+        case EntryPoint::EGLQueryStreamKHR:
+            return "eglQueryStreamKHR";
+        case EntryPoint::EGLQueryStreamu64KHR:
+            return "eglQueryStreamu64KHR";
+        case EntryPoint::EGLQueryString:
+            return "eglQueryString";
+        case EntryPoint::EGLQueryStringiANGLE:
+            return "eglQueryStringiANGLE";
+        case EntryPoint::EGLQuerySurface:
+            return "eglQuerySurface";
+        case EntryPoint::EGLQuerySurfacePointerANGLE:
+            return "eglQuerySurfacePointerANGLE";
+        case EntryPoint::EGLReacquireHighPowerGPUANGLE:
+            return "eglReacquireHighPowerGPUANGLE";
+        case EntryPoint::EGLReleaseDeviceANGLE:
+            return "eglReleaseDeviceANGLE";
+        case EntryPoint::EGLReleaseHighPowerGPUANGLE:
+            return "eglReleaseHighPowerGPUANGLE";
+        case EntryPoint::EGLReleaseTexImage:
+            return "eglReleaseTexImage";
+        case EntryPoint::EGLReleaseThread:
+            return "eglReleaseThread";
+        case EntryPoint::EGLSetBlobCacheFuncsANDROID:
+            return "eglSetBlobCacheFuncsANDROID";
+        case EntryPoint::EGLSignalSyncKHR:
+            return "eglSignalSyncKHR";
+        case EntryPoint::EGLStreamAttribKHR:
+            return "eglStreamAttribKHR";
+        case EntryPoint::EGLStreamConsumerAcquireKHR:
+            return "eglStreamConsumerAcquireKHR";
+        case EntryPoint::EGLStreamConsumerGLTextureExternalAttribsNV:
+            return "eglStreamConsumerGLTextureExternalAttribsNV";
+        case EntryPoint::EGLStreamConsumerGLTextureExternalKHR:
+            return "eglStreamConsumerGLTextureExternalKHR";
+        case EntryPoint::EGLStreamConsumerReleaseKHR:
+            return "eglStreamConsumerReleaseKHR";
+        case EntryPoint::EGLStreamPostD3DTextureANGLE:
+            return "eglStreamPostD3DTextureANGLE";
+        case EntryPoint::EGLSurfaceAttrib:
+            return "eglSurfaceAttrib";
+        case EntryPoint::EGLSwapBuffers:
+            return "eglSwapBuffers";
+        case EntryPoint::EGLSwapBuffersWithDamageKHR:
+            return "eglSwapBuffersWithDamageKHR";
+        case EntryPoint::EGLSwapBuffersWithFrameTokenANGLE:
+            return "eglSwapBuffersWithFrameTokenANGLE";
+        case EntryPoint::EGLSwapInterval:
+            return "eglSwapInterval";
+        case EntryPoint::EGLTerminate:
+            return "eglTerminate";
+        case EntryPoint::EGLWaitClient:
+            return "eglWaitClient";
+        case EntryPoint::EGLWaitGL:
+            return "eglWaitGL";
+        case EntryPoint::EGLWaitNative:
+            return "eglWaitNative";
+        case EntryPoint::EGLWaitSync:
+            return "eglWaitSync";
+        case EntryPoint::EGLWaitSyncKHR:
+            return "eglWaitSyncKHR";
+        case EntryPoint::GLAccum:
             return "glAccum";
-        case EntryPoint::ActiveShaderProgram:
+        case EntryPoint::GLActiveShaderProgram:
             return "glActiveShaderProgram";
-        case EntryPoint::ActiveShaderProgramEXT:
+        case EntryPoint::GLActiveShaderProgramEXT:
             return "glActiveShaderProgramEXT";
-        case EntryPoint::ActiveTexture:
+        case EntryPoint::GLActiveTexture:
             return "glActiveTexture";
-        case EntryPoint::AlphaFunc:
+        case EntryPoint::GLAlphaFunc:
             return "glAlphaFunc";
-        case EntryPoint::AlphaFuncx:
+        case EntryPoint::GLAlphaFuncx:
             return "glAlphaFuncx";
-        case EntryPoint::AreTexturesResident:
+        case EntryPoint::GLAreTexturesResident:
             return "glAreTexturesResident";
-        case EntryPoint::ArrayElement:
+        case EntryPoint::GLArrayElement:
             return "glArrayElement";
-        case EntryPoint::AttachShader:
+        case EntryPoint::GLAttachShader:
             return "glAttachShader";
-        case EntryPoint::Begin:
+        case EntryPoint::GLBegin:
             return "glBegin";
-        case EntryPoint::BeginConditionalRender:
+        case EntryPoint::GLBeginConditionalRender:
             return "glBeginConditionalRender";
-        case EntryPoint::BeginQuery:
+        case EntryPoint::GLBeginQuery:
             return "glBeginQuery";
-        case EntryPoint::BeginQueryEXT:
+        case EntryPoint::GLBeginQueryEXT:
             return "glBeginQueryEXT";
-        case EntryPoint::BeginQueryIndexed:
+        case EntryPoint::GLBeginQueryIndexed:
             return "glBeginQueryIndexed";
-        case EntryPoint::BeginTransformFeedback:
+        case EntryPoint::GLBeginTransformFeedback:
             return "glBeginTransformFeedback";
-        case EntryPoint::BindAttribLocation:
+        case EntryPoint::GLBindAttribLocation:
             return "glBindAttribLocation";
-        case EntryPoint::BindBuffer:
+        case EntryPoint::GLBindBuffer:
             return "glBindBuffer";
-        case EntryPoint::BindBufferBase:
+        case EntryPoint::GLBindBufferBase:
             return "glBindBufferBase";
-        case EntryPoint::BindBufferRange:
+        case EntryPoint::GLBindBufferRange:
             return "glBindBufferRange";
-        case EntryPoint::BindBuffersBase:
+        case EntryPoint::GLBindBuffersBase:
             return "glBindBuffersBase";
-        case EntryPoint::BindBuffersRange:
+        case EntryPoint::GLBindBuffersRange:
             return "glBindBuffersRange";
-        case EntryPoint::BindFragDataLocation:
+        case EntryPoint::GLBindFragDataLocation:
             return "glBindFragDataLocation";
-        case EntryPoint::BindFragDataLocationEXT:
+        case EntryPoint::GLBindFragDataLocationEXT:
             return "glBindFragDataLocationEXT";
-        case EntryPoint::BindFragDataLocationIndexed:
+        case EntryPoint::GLBindFragDataLocationIndexed:
             return "glBindFragDataLocationIndexed";
-        case EntryPoint::BindFragDataLocationIndexedEXT:
+        case EntryPoint::GLBindFragDataLocationIndexedEXT:
             return "glBindFragDataLocationIndexedEXT";
-        case EntryPoint::BindFramebuffer:
+        case EntryPoint::GLBindFramebuffer:
             return "glBindFramebuffer";
-        case EntryPoint::BindFramebufferOES:
+        case EntryPoint::GLBindFramebufferOES:
             return "glBindFramebufferOES";
-        case EntryPoint::BindImageTexture:
+        case EntryPoint::GLBindImageTexture:
             return "glBindImageTexture";
-        case EntryPoint::BindImageTextures:
+        case EntryPoint::GLBindImageTextures:
             return "glBindImageTextures";
-        case EntryPoint::BindProgramPipeline:
+        case EntryPoint::GLBindProgramPipeline:
             return "glBindProgramPipeline";
-        case EntryPoint::BindProgramPipelineEXT:
+        case EntryPoint::GLBindProgramPipelineEXT:
             return "glBindProgramPipelineEXT";
-        case EntryPoint::BindRenderbuffer:
+        case EntryPoint::GLBindRenderbuffer:
             return "glBindRenderbuffer";
-        case EntryPoint::BindRenderbufferOES:
+        case EntryPoint::GLBindRenderbufferOES:
             return "glBindRenderbufferOES";
-        case EntryPoint::BindSampler:
+        case EntryPoint::GLBindSampler:
             return "glBindSampler";
-        case EntryPoint::BindSamplers:
+        case EntryPoint::GLBindSamplers:
             return "glBindSamplers";
-        case EntryPoint::BindTexture:
+        case EntryPoint::GLBindTexture:
             return "glBindTexture";
-        case EntryPoint::BindTextureUnit:
+        case EntryPoint::GLBindTextureUnit:
             return "glBindTextureUnit";
-        case EntryPoint::BindTextures:
+        case EntryPoint::GLBindTextures:
             return "glBindTextures";
-        case EntryPoint::BindTransformFeedback:
+        case EntryPoint::GLBindTransformFeedback:
             return "glBindTransformFeedback";
-        case EntryPoint::BindUniformLocationCHROMIUM:
+        case EntryPoint::GLBindUniformLocationCHROMIUM:
             return "glBindUniformLocationCHROMIUM";
-        case EntryPoint::BindVertexArray:
+        case EntryPoint::GLBindVertexArray:
             return "glBindVertexArray";
-        case EntryPoint::BindVertexArrayOES:
+        case EntryPoint::GLBindVertexArrayOES:
             return "glBindVertexArrayOES";
-        case EntryPoint::BindVertexBuffer:
+        case EntryPoint::GLBindVertexBuffer:
             return "glBindVertexBuffer";
-        case EntryPoint::BindVertexBuffers:
+        case EntryPoint::GLBindVertexBuffers:
             return "glBindVertexBuffers";
-        case EntryPoint::Bitmap:
+        case EntryPoint::GLBitmap:
             return "glBitmap";
-        case EntryPoint::BlendBarrier:
+        case EntryPoint::GLBlendBarrier:
             return "glBlendBarrier";
-        case EntryPoint::BlendColor:
+        case EntryPoint::GLBlendColor:
             return "glBlendColor";
-        case EntryPoint::BlendEquation:
+        case EntryPoint::GLBlendEquation:
             return "glBlendEquation";
-        case EntryPoint::BlendEquationSeparate:
+        case EntryPoint::GLBlendEquationSeparate:
             return "glBlendEquationSeparate";
-        case EntryPoint::BlendEquationSeparatei:
+        case EntryPoint::GLBlendEquationSeparatei:
             return "glBlendEquationSeparatei";
-        case EntryPoint::BlendEquationSeparateiEXT:
+        case EntryPoint::GLBlendEquationSeparateiEXT:
             return "glBlendEquationSeparateiEXT";
-        case EntryPoint::BlendEquationSeparateiOES:
+        case EntryPoint::GLBlendEquationSeparateiOES:
             return "glBlendEquationSeparateiOES";
-        case EntryPoint::BlendEquationi:
+        case EntryPoint::GLBlendEquationi:
             return "glBlendEquationi";
-        case EntryPoint::BlendEquationiEXT:
+        case EntryPoint::GLBlendEquationiEXT:
             return "glBlendEquationiEXT";
-        case EntryPoint::BlendEquationiOES:
+        case EntryPoint::GLBlendEquationiOES:
             return "glBlendEquationiOES";
-        case EntryPoint::BlendFunc:
+        case EntryPoint::GLBlendFunc:
             return "glBlendFunc";
-        case EntryPoint::BlendFuncSeparate:
+        case EntryPoint::GLBlendFuncSeparate:
             return "glBlendFuncSeparate";
-        case EntryPoint::BlendFuncSeparatei:
+        case EntryPoint::GLBlendFuncSeparatei:
             return "glBlendFuncSeparatei";
-        case EntryPoint::BlendFuncSeparateiEXT:
+        case EntryPoint::GLBlendFuncSeparateiEXT:
             return "glBlendFuncSeparateiEXT";
-        case EntryPoint::BlendFuncSeparateiOES:
+        case EntryPoint::GLBlendFuncSeparateiOES:
             return "glBlendFuncSeparateiOES";
-        case EntryPoint::BlendFunci:
+        case EntryPoint::GLBlendFunci:
             return "glBlendFunci";
-        case EntryPoint::BlendFunciEXT:
+        case EntryPoint::GLBlendFunciEXT:
             return "glBlendFunciEXT";
-        case EntryPoint::BlendFunciOES:
+        case EntryPoint::GLBlendFunciOES:
             return "glBlendFunciOES";
-        case EntryPoint::BlitFramebuffer:
+        case EntryPoint::GLBlitFramebuffer:
             return "glBlitFramebuffer";
-        case EntryPoint::BlitFramebufferANGLE:
+        case EntryPoint::GLBlitFramebufferANGLE:
             return "glBlitFramebufferANGLE";
-        case EntryPoint::BlitNamedFramebuffer:
+        case EntryPoint::GLBlitNamedFramebuffer:
             return "glBlitNamedFramebuffer";
-        case EntryPoint::BufferData:
+        case EntryPoint::GLBufferData:
             return "glBufferData";
-        case EntryPoint::BufferStorage:
+        case EntryPoint::GLBufferStorage:
             return "glBufferStorage";
-        case EntryPoint::BufferStorageEXT:
+        case EntryPoint::GLBufferStorageEXT:
             return "glBufferStorageEXT";
-        case EntryPoint::BufferStorageExternalEXT:
+        case EntryPoint::GLBufferStorageExternalEXT:
             return "glBufferStorageExternalEXT";
-        case EntryPoint::BufferStorageMemEXT:
+        case EntryPoint::GLBufferStorageMemEXT:
             return "glBufferStorageMemEXT";
-        case EntryPoint::BufferSubData:
+        case EntryPoint::GLBufferSubData:
             return "glBufferSubData";
-        case EntryPoint::CallList:
+        case EntryPoint::GLCallList:
             return "glCallList";
-        case EntryPoint::CallLists:
+        case EntryPoint::GLCallLists:
             return "glCallLists";
-        case EntryPoint::CheckFramebufferStatus:
+        case EntryPoint::GLCheckFramebufferStatus:
             return "glCheckFramebufferStatus";
-        case EntryPoint::CheckFramebufferStatusOES:
+        case EntryPoint::GLCheckFramebufferStatusOES:
             return "glCheckFramebufferStatusOES";
-        case EntryPoint::CheckNamedFramebufferStatus:
+        case EntryPoint::GLCheckNamedFramebufferStatus:
             return "glCheckNamedFramebufferStatus";
-        case EntryPoint::ClampColor:
+        case EntryPoint::GLClampColor:
             return "glClampColor";
-        case EntryPoint::Clear:
+        case EntryPoint::GLClear:
             return "glClear";
-        case EntryPoint::ClearAccum:
+        case EntryPoint::GLClearAccum:
             return "glClearAccum";
-        case EntryPoint::ClearBufferData:
+        case EntryPoint::GLClearBufferData:
             return "glClearBufferData";
-        case EntryPoint::ClearBufferSubData:
+        case EntryPoint::GLClearBufferSubData:
             return "glClearBufferSubData";
-        case EntryPoint::ClearBufferfi:
+        case EntryPoint::GLClearBufferfi:
             return "glClearBufferfi";
-        case EntryPoint::ClearBufferfv:
+        case EntryPoint::GLClearBufferfv:
             return "glClearBufferfv";
-        case EntryPoint::ClearBufferiv:
+        case EntryPoint::GLClearBufferiv:
             return "glClearBufferiv";
-        case EntryPoint::ClearBufferuiv:
+        case EntryPoint::GLClearBufferuiv:
             return "glClearBufferuiv";
-        case EntryPoint::ClearColor:
+        case EntryPoint::GLClearColor:
             return "glClearColor";
-        case EntryPoint::ClearColorx:
+        case EntryPoint::GLClearColorx:
             return "glClearColorx";
-        case EntryPoint::ClearDepth:
+        case EntryPoint::GLClearDepth:
             return "glClearDepth";
-        case EntryPoint::ClearDepthf:
+        case EntryPoint::GLClearDepthf:
             return "glClearDepthf";
-        case EntryPoint::ClearDepthx:
+        case EntryPoint::GLClearDepthx:
             return "glClearDepthx";
-        case EntryPoint::ClearIndex:
+        case EntryPoint::GLClearIndex:
             return "glClearIndex";
-        case EntryPoint::ClearNamedBufferData:
+        case EntryPoint::GLClearNamedBufferData:
             return "glClearNamedBufferData";
-        case EntryPoint::ClearNamedBufferSubData:
+        case EntryPoint::GLClearNamedBufferSubData:
             return "glClearNamedBufferSubData";
-        case EntryPoint::ClearNamedFramebufferfi:
+        case EntryPoint::GLClearNamedFramebufferfi:
             return "glClearNamedFramebufferfi";
-        case EntryPoint::ClearNamedFramebufferfv:
+        case EntryPoint::GLClearNamedFramebufferfv:
             return "glClearNamedFramebufferfv";
-        case EntryPoint::ClearNamedFramebufferiv:
+        case EntryPoint::GLClearNamedFramebufferiv:
             return "glClearNamedFramebufferiv";
-        case EntryPoint::ClearNamedFramebufferuiv:
+        case EntryPoint::GLClearNamedFramebufferuiv:
             return "glClearNamedFramebufferuiv";
-        case EntryPoint::ClearStencil:
+        case EntryPoint::GLClearStencil:
             return "glClearStencil";
-        case EntryPoint::ClearTexImage:
+        case EntryPoint::GLClearTexImage:
             return "glClearTexImage";
-        case EntryPoint::ClearTexSubImage:
+        case EntryPoint::GLClearTexSubImage:
             return "glClearTexSubImage";
-        case EntryPoint::ClientActiveTexture:
+        case EntryPoint::GLClientActiveTexture:
             return "glClientActiveTexture";
-        case EntryPoint::ClientWaitSync:
+        case EntryPoint::GLClientWaitSync:
             return "glClientWaitSync";
-        case EntryPoint::ClipControl:
+        case EntryPoint::GLClipControl:
             return "glClipControl";
-        case EntryPoint::ClipPlane:
+        case EntryPoint::GLClipPlane:
             return "glClipPlane";
-        case EntryPoint::ClipPlanef:
+        case EntryPoint::GLClipPlanef:
             return "glClipPlanef";
-        case EntryPoint::ClipPlanex:
+        case EntryPoint::GLClipPlanex:
             return "glClipPlanex";
-        case EntryPoint::Color3b:
+        case EntryPoint::GLColor3b:
             return "glColor3b";
-        case EntryPoint::Color3bv:
+        case EntryPoint::GLColor3bv:
             return "glColor3bv";
-        case EntryPoint::Color3d:
+        case EntryPoint::GLColor3d:
             return "glColor3d";
-        case EntryPoint::Color3dv:
+        case EntryPoint::GLColor3dv:
             return "glColor3dv";
-        case EntryPoint::Color3f:
+        case EntryPoint::GLColor3f:
             return "glColor3f";
-        case EntryPoint::Color3fv:
+        case EntryPoint::GLColor3fv:
             return "glColor3fv";
-        case EntryPoint::Color3i:
+        case EntryPoint::GLColor3i:
             return "glColor3i";
-        case EntryPoint::Color3iv:
+        case EntryPoint::GLColor3iv:
             return "glColor3iv";
-        case EntryPoint::Color3s:
+        case EntryPoint::GLColor3s:
             return "glColor3s";
-        case EntryPoint::Color3sv:
+        case EntryPoint::GLColor3sv:
             return "glColor3sv";
-        case EntryPoint::Color3ub:
+        case EntryPoint::GLColor3ub:
             return "glColor3ub";
-        case EntryPoint::Color3ubv:
+        case EntryPoint::GLColor3ubv:
             return "glColor3ubv";
-        case EntryPoint::Color3ui:
+        case EntryPoint::GLColor3ui:
             return "glColor3ui";
-        case EntryPoint::Color3uiv:
+        case EntryPoint::GLColor3uiv:
             return "glColor3uiv";
-        case EntryPoint::Color3us:
+        case EntryPoint::GLColor3us:
             return "glColor3us";
-        case EntryPoint::Color3usv:
+        case EntryPoint::GLColor3usv:
             return "glColor3usv";
-        case EntryPoint::Color4b:
+        case EntryPoint::GLColor4b:
             return "glColor4b";
-        case EntryPoint::Color4bv:
+        case EntryPoint::GLColor4bv:
             return "glColor4bv";
-        case EntryPoint::Color4d:
+        case EntryPoint::GLColor4d:
             return "glColor4d";
-        case EntryPoint::Color4dv:
+        case EntryPoint::GLColor4dv:
             return "glColor4dv";
-        case EntryPoint::Color4f:
+        case EntryPoint::GLColor4f:
             return "glColor4f";
-        case EntryPoint::Color4fv:
+        case EntryPoint::GLColor4fv:
             return "glColor4fv";
-        case EntryPoint::Color4i:
+        case EntryPoint::GLColor4i:
             return "glColor4i";
-        case EntryPoint::Color4iv:
+        case EntryPoint::GLColor4iv:
             return "glColor4iv";
-        case EntryPoint::Color4s:
+        case EntryPoint::GLColor4s:
             return "glColor4s";
-        case EntryPoint::Color4sv:
+        case EntryPoint::GLColor4sv:
             return "glColor4sv";
-        case EntryPoint::Color4ub:
+        case EntryPoint::GLColor4ub:
             return "glColor4ub";
-        case EntryPoint::Color4ubv:
+        case EntryPoint::GLColor4ubv:
             return "glColor4ubv";
-        case EntryPoint::Color4ui:
+        case EntryPoint::GLColor4ui:
             return "glColor4ui";
-        case EntryPoint::Color4uiv:
+        case EntryPoint::GLColor4uiv:
             return "glColor4uiv";
-        case EntryPoint::Color4us:
+        case EntryPoint::GLColor4us:
             return "glColor4us";
-        case EntryPoint::Color4usv:
+        case EntryPoint::GLColor4usv:
             return "glColor4usv";
-        case EntryPoint::Color4x:
+        case EntryPoint::GLColor4x:
             return "glColor4x";
-        case EntryPoint::ColorMask:
+        case EntryPoint::GLColorMask:
             return "glColorMask";
-        case EntryPoint::ColorMaski:
+        case EntryPoint::GLColorMaski:
             return "glColorMaski";
-        case EntryPoint::ColorMaskiEXT:
+        case EntryPoint::GLColorMaskiEXT:
             return "glColorMaskiEXT";
-        case EntryPoint::ColorMaskiOES:
+        case EntryPoint::GLColorMaskiOES:
             return "glColorMaskiOES";
-        case EntryPoint::ColorMaterial:
+        case EntryPoint::GLColorMaterial:
             return "glColorMaterial";
-        case EntryPoint::ColorP3ui:
+        case EntryPoint::GLColorP3ui:
             return "glColorP3ui";
-        case EntryPoint::ColorP3uiv:
+        case EntryPoint::GLColorP3uiv:
             return "glColorP3uiv";
-        case EntryPoint::ColorP4ui:
+        case EntryPoint::GLColorP4ui:
             return "glColorP4ui";
-        case EntryPoint::ColorP4uiv:
+        case EntryPoint::GLColorP4uiv:
             return "glColorP4uiv";
-        case EntryPoint::ColorPointer:
+        case EntryPoint::GLColorPointer:
             return "glColorPointer";
-        case EntryPoint::CompileShader:
+        case EntryPoint::GLCompileShader:
             return "glCompileShader";
-        case EntryPoint::CompressedCopyTextureCHROMIUM:
+        case EntryPoint::GLCompressedCopyTextureCHROMIUM:
             return "glCompressedCopyTextureCHROMIUM";
-        case EntryPoint::CompressedTexImage1D:
+        case EntryPoint::GLCompressedTexImage1D:
             return "glCompressedTexImage1D";
-        case EntryPoint::CompressedTexImage2D:
+        case EntryPoint::GLCompressedTexImage2D:
             return "glCompressedTexImage2D";
-        case EntryPoint::CompressedTexImage2DRobustANGLE:
+        case EntryPoint::GLCompressedTexImage2DRobustANGLE:
             return "glCompressedTexImage2DRobustANGLE";
-        case EntryPoint::CompressedTexImage3D:
+        case EntryPoint::GLCompressedTexImage3D:
             return "glCompressedTexImage3D";
-        case EntryPoint::CompressedTexImage3DOES:
+        case EntryPoint::GLCompressedTexImage3DOES:
             return "glCompressedTexImage3DOES";
-        case EntryPoint::CompressedTexImage3DRobustANGLE:
+        case EntryPoint::GLCompressedTexImage3DRobustANGLE:
             return "glCompressedTexImage3DRobustANGLE";
-        case EntryPoint::CompressedTexSubImage1D:
+        case EntryPoint::GLCompressedTexSubImage1D:
             return "glCompressedTexSubImage1D";
-        case EntryPoint::CompressedTexSubImage2D:
+        case EntryPoint::GLCompressedTexSubImage2D:
             return "glCompressedTexSubImage2D";
-        case EntryPoint::CompressedTexSubImage2DRobustANGLE:
+        case EntryPoint::GLCompressedTexSubImage2DRobustANGLE:
             return "glCompressedTexSubImage2DRobustANGLE";
-        case EntryPoint::CompressedTexSubImage3D:
+        case EntryPoint::GLCompressedTexSubImage3D:
             return "glCompressedTexSubImage3D";
-        case EntryPoint::CompressedTexSubImage3DOES:
+        case EntryPoint::GLCompressedTexSubImage3DOES:
             return "glCompressedTexSubImage3DOES";
-        case EntryPoint::CompressedTexSubImage3DRobustANGLE:
+        case EntryPoint::GLCompressedTexSubImage3DRobustANGLE:
             return "glCompressedTexSubImage3DRobustANGLE";
-        case EntryPoint::CompressedTextureSubImage1D:
+        case EntryPoint::GLCompressedTextureSubImage1D:
             return "glCompressedTextureSubImage1D";
-        case EntryPoint::CompressedTextureSubImage2D:
+        case EntryPoint::GLCompressedTextureSubImage2D:
             return "glCompressedTextureSubImage2D";
-        case EntryPoint::CompressedTextureSubImage3D:
+        case EntryPoint::GLCompressedTextureSubImage3D:
             return "glCompressedTextureSubImage3D";
-        case EntryPoint::CopyBufferSubData:
+        case EntryPoint::GLCopyBufferSubData:
             return "glCopyBufferSubData";
-        case EntryPoint::CopyImageSubData:
+        case EntryPoint::GLCopyImageSubData:
             return "glCopyImageSubData";
-        case EntryPoint::CopyImageSubDataEXT:
+        case EntryPoint::GLCopyImageSubDataEXT:
             return "glCopyImageSubDataEXT";
-        case EntryPoint::CopyImageSubDataOES:
+        case EntryPoint::GLCopyImageSubDataOES:
             return "glCopyImageSubDataOES";
-        case EntryPoint::CopyNamedBufferSubData:
+        case EntryPoint::GLCopyNamedBufferSubData:
             return "glCopyNamedBufferSubData";
-        case EntryPoint::CopyPixels:
+        case EntryPoint::GLCopyPixels:
             return "glCopyPixels";
-        case EntryPoint::CopySubTexture3DANGLE:
+        case EntryPoint::GLCopySubTexture3DANGLE:
             return "glCopySubTexture3DANGLE";
-        case EntryPoint::CopySubTextureCHROMIUM:
+        case EntryPoint::GLCopySubTextureCHROMIUM:
             return "glCopySubTextureCHROMIUM";
-        case EntryPoint::CopyTexImage1D:
+        case EntryPoint::GLCopyTexImage1D:
             return "glCopyTexImage1D";
-        case EntryPoint::CopyTexImage2D:
+        case EntryPoint::GLCopyTexImage2D:
             return "glCopyTexImage2D";
-        case EntryPoint::CopyTexSubImage1D:
+        case EntryPoint::GLCopyTexSubImage1D:
             return "glCopyTexSubImage1D";
-        case EntryPoint::CopyTexSubImage2D:
+        case EntryPoint::GLCopyTexSubImage2D:
             return "glCopyTexSubImage2D";
-        case EntryPoint::CopyTexSubImage3D:
+        case EntryPoint::GLCopyTexSubImage3D:
             return "glCopyTexSubImage3D";
-        case EntryPoint::CopyTexSubImage3DOES:
+        case EntryPoint::GLCopyTexSubImage3DOES:
             return "glCopyTexSubImage3DOES";
-        case EntryPoint::CopyTexture3DANGLE:
+        case EntryPoint::GLCopyTexture3DANGLE:
             return "glCopyTexture3DANGLE";
-        case EntryPoint::CopyTextureCHROMIUM:
+        case EntryPoint::GLCopyTextureCHROMIUM:
             return "glCopyTextureCHROMIUM";
-        case EntryPoint::CopyTextureSubImage1D:
+        case EntryPoint::GLCopyTextureSubImage1D:
             return "glCopyTextureSubImage1D";
-        case EntryPoint::CopyTextureSubImage2D:
+        case EntryPoint::GLCopyTextureSubImage2D:
             return "glCopyTextureSubImage2D";
-        case EntryPoint::CopyTextureSubImage3D:
+        case EntryPoint::GLCopyTextureSubImage3D:
             return "glCopyTextureSubImage3D";
-        case EntryPoint::CoverageModulationCHROMIUM:
+        case EntryPoint::GLCoverageModulationCHROMIUM:
             return "glCoverageModulationCHROMIUM";
-        case EntryPoint::CreateBuffers:
+        case EntryPoint::GLCreateBuffers:
             return "glCreateBuffers";
-        case EntryPoint::CreateFramebuffers:
+        case EntryPoint::GLCreateFramebuffers:
             return "glCreateFramebuffers";
-        case EntryPoint::CreateMemoryObjectsEXT:
+        case EntryPoint::GLCreateMemoryObjectsEXT:
             return "glCreateMemoryObjectsEXT";
-        case EntryPoint::CreateProgram:
+        case EntryPoint::GLCreateProgram:
             return "glCreateProgram";
-        case EntryPoint::CreateProgramPipelines:
+        case EntryPoint::GLCreateProgramPipelines:
             return "glCreateProgramPipelines";
-        case EntryPoint::CreateQueries:
+        case EntryPoint::GLCreateQueries:
             return "glCreateQueries";
-        case EntryPoint::CreateRenderbuffers:
+        case EntryPoint::GLCreateRenderbuffers:
             return "glCreateRenderbuffers";
-        case EntryPoint::CreateSamplers:
+        case EntryPoint::GLCreateSamplers:
             return "glCreateSamplers";
-        case EntryPoint::CreateShader:
+        case EntryPoint::GLCreateShader:
             return "glCreateShader";
-        case EntryPoint::CreateShaderProgramv:
+        case EntryPoint::GLCreateShaderProgramv:
             return "glCreateShaderProgramv";
-        case EntryPoint::CreateShaderProgramvEXT:
+        case EntryPoint::GLCreateShaderProgramvEXT:
             return "glCreateShaderProgramvEXT";
-        case EntryPoint::CreateTextures:
+        case EntryPoint::GLCreateTextures:
             return "glCreateTextures";
-        case EntryPoint::CreateTransformFeedbacks:
+        case EntryPoint::GLCreateTransformFeedbacks:
             return "glCreateTransformFeedbacks";
-        case EntryPoint::CreateVertexArrays:
+        case EntryPoint::GLCreateVertexArrays:
             return "glCreateVertexArrays";
-        case EntryPoint::CullFace:
+        case EntryPoint::GLCullFace:
             return "glCullFace";
-        case EntryPoint::CurrentPaletteMatrixOES:
+        case EntryPoint::GLCurrentPaletteMatrixOES:
             return "glCurrentPaletteMatrixOES";
-        case EntryPoint::DebugMessageCallback:
+        case EntryPoint::GLDebugMessageCallback:
             return "glDebugMessageCallback";
-        case EntryPoint::DebugMessageCallbackKHR:
+        case EntryPoint::GLDebugMessageCallbackKHR:
             return "glDebugMessageCallbackKHR";
-        case EntryPoint::DebugMessageControl:
+        case EntryPoint::GLDebugMessageControl:
             return "glDebugMessageControl";
-        case EntryPoint::DebugMessageControlKHR:
+        case EntryPoint::GLDebugMessageControlKHR:
             return "glDebugMessageControlKHR";
-        case EntryPoint::DebugMessageInsert:
+        case EntryPoint::GLDebugMessageInsert:
             return "glDebugMessageInsert";
-        case EntryPoint::DebugMessageInsertKHR:
+        case EntryPoint::GLDebugMessageInsertKHR:
             return "glDebugMessageInsertKHR";
-        case EntryPoint::DeleteBuffers:
+        case EntryPoint::GLDeleteBuffers:
             return "glDeleteBuffers";
-        case EntryPoint::DeleteFencesNV:
+        case EntryPoint::GLDeleteFencesNV:
             return "glDeleteFencesNV";
-        case EntryPoint::DeleteFramebuffers:
+        case EntryPoint::GLDeleteFramebuffers:
             return "glDeleteFramebuffers";
-        case EntryPoint::DeleteFramebuffersOES:
+        case EntryPoint::GLDeleteFramebuffersOES:
             return "glDeleteFramebuffersOES";
-        case EntryPoint::DeleteLists:
+        case EntryPoint::GLDeleteLists:
             return "glDeleteLists";
-        case EntryPoint::DeleteMemoryObjectsEXT:
+        case EntryPoint::GLDeleteMemoryObjectsEXT:
             return "glDeleteMemoryObjectsEXT";
-        case EntryPoint::DeleteProgram:
+        case EntryPoint::GLDeleteProgram:
             return "glDeleteProgram";
-        case EntryPoint::DeleteProgramPipelines:
+        case EntryPoint::GLDeleteProgramPipelines:
             return "glDeleteProgramPipelines";
-        case EntryPoint::DeleteProgramPipelinesEXT:
+        case EntryPoint::GLDeleteProgramPipelinesEXT:
             return "glDeleteProgramPipelinesEXT";
-        case EntryPoint::DeleteQueries:
+        case EntryPoint::GLDeleteQueries:
             return "glDeleteQueries";
-        case EntryPoint::DeleteQueriesEXT:
+        case EntryPoint::GLDeleteQueriesEXT:
             return "glDeleteQueriesEXT";
-        case EntryPoint::DeleteRenderbuffers:
+        case EntryPoint::GLDeleteRenderbuffers:
             return "glDeleteRenderbuffers";
-        case EntryPoint::DeleteRenderbuffersOES:
+        case EntryPoint::GLDeleteRenderbuffersOES:
             return "glDeleteRenderbuffersOES";
-        case EntryPoint::DeleteSamplers:
+        case EntryPoint::GLDeleteSamplers:
             return "glDeleteSamplers";
-        case EntryPoint::DeleteSemaphoresEXT:
+        case EntryPoint::GLDeleteSemaphoresEXT:
             return "glDeleteSemaphoresEXT";
-        case EntryPoint::DeleteShader:
+        case EntryPoint::GLDeleteShader:
             return "glDeleteShader";
-        case EntryPoint::DeleteSync:
+        case EntryPoint::GLDeleteSync:
             return "glDeleteSync";
-        case EntryPoint::DeleteTextures:
+        case EntryPoint::GLDeleteTextures:
             return "glDeleteTextures";
-        case EntryPoint::DeleteTransformFeedbacks:
+        case EntryPoint::GLDeleteTransformFeedbacks:
             return "glDeleteTransformFeedbacks";
-        case EntryPoint::DeleteVertexArrays:
+        case EntryPoint::GLDeleteVertexArrays:
             return "glDeleteVertexArrays";
-        case EntryPoint::DeleteVertexArraysOES:
+        case EntryPoint::GLDeleteVertexArraysOES:
             return "glDeleteVertexArraysOES";
-        case EntryPoint::DepthFunc:
+        case EntryPoint::GLDepthFunc:
             return "glDepthFunc";
-        case EntryPoint::DepthMask:
+        case EntryPoint::GLDepthMask:
             return "glDepthMask";
-        case EntryPoint::DepthRange:
+        case EntryPoint::GLDepthRange:
             return "glDepthRange";
-        case EntryPoint::DepthRangeArrayv:
+        case EntryPoint::GLDepthRangeArrayv:
             return "glDepthRangeArrayv";
-        case EntryPoint::DepthRangeIndexed:
+        case EntryPoint::GLDepthRangeIndexed:
             return "glDepthRangeIndexed";
-        case EntryPoint::DepthRangef:
+        case EntryPoint::GLDepthRangef:
             return "glDepthRangef";
-        case EntryPoint::DepthRangex:
+        case EntryPoint::GLDepthRangex:
             return "glDepthRangex";
-        case EntryPoint::DetachShader:
+        case EntryPoint::GLDetachShader:
             return "glDetachShader";
-        case EntryPoint::Disable:
+        case EntryPoint::GLDisable:
             return "glDisable";
-        case EntryPoint::DisableClientState:
+        case EntryPoint::GLDisableClientState:
             return "glDisableClientState";
-        case EntryPoint::DisableExtensionANGLE:
+        case EntryPoint::GLDisableExtensionANGLE:
             return "glDisableExtensionANGLE";
-        case EntryPoint::DisableVertexArrayAttrib:
+        case EntryPoint::GLDisableVertexArrayAttrib:
             return "glDisableVertexArrayAttrib";
-        case EntryPoint::DisableVertexAttribArray:
+        case EntryPoint::GLDisableVertexAttribArray:
             return "glDisableVertexAttribArray";
-        case EntryPoint::Disablei:
+        case EntryPoint::GLDisablei:
             return "glDisablei";
-        case EntryPoint::DisableiEXT:
+        case EntryPoint::GLDisableiEXT:
             return "glDisableiEXT";
-        case EntryPoint::DisableiOES:
+        case EntryPoint::GLDisableiOES:
             return "glDisableiOES";
-        case EntryPoint::DiscardFramebufferEXT:
+        case EntryPoint::GLDiscardFramebufferEXT:
             return "glDiscardFramebufferEXT";
-        case EntryPoint::DispatchCompute:
+        case EntryPoint::GLDispatchCompute:
             return "glDispatchCompute";
-        case EntryPoint::DispatchComputeIndirect:
+        case EntryPoint::GLDispatchComputeIndirect:
             return "glDispatchComputeIndirect";
-        case EntryPoint::DrawArrays:
+        case EntryPoint::GLDrawArrays:
             return "glDrawArrays";
-        case EntryPoint::DrawArraysIndirect:
+        case EntryPoint::GLDrawArraysIndirect:
             return "glDrawArraysIndirect";
-        case EntryPoint::DrawArraysInstanced:
+        case EntryPoint::GLDrawArraysInstanced:
             return "glDrawArraysInstanced";
-        case EntryPoint::DrawArraysInstancedANGLE:
+        case EntryPoint::GLDrawArraysInstancedANGLE:
             return "glDrawArraysInstancedANGLE";
-        case EntryPoint::DrawArraysInstancedBaseInstance:
+        case EntryPoint::GLDrawArraysInstancedBaseInstance:
             return "glDrawArraysInstancedBaseInstance";
-        case EntryPoint::DrawArraysInstancedBaseInstanceANGLE:
+        case EntryPoint::GLDrawArraysInstancedBaseInstanceANGLE:
             return "glDrawArraysInstancedBaseInstanceANGLE";
-        case EntryPoint::DrawArraysInstancedEXT:
+        case EntryPoint::GLDrawArraysInstancedEXT:
             return "glDrawArraysInstancedEXT";
-        case EntryPoint::DrawBuffer:
+        case EntryPoint::GLDrawBuffer:
             return "glDrawBuffer";
-        case EntryPoint::DrawBuffers:
+        case EntryPoint::GLDrawBuffers:
             return "glDrawBuffers";
-        case EntryPoint::DrawBuffersEXT:
+        case EntryPoint::GLDrawBuffersEXT:
             return "glDrawBuffersEXT";
-        case EntryPoint::DrawElements:
+        case EntryPoint::GLDrawElements:
             return "glDrawElements";
-        case EntryPoint::DrawElementsBaseVertex:
+        case EntryPoint::GLDrawElementsBaseVertex:
             return "glDrawElementsBaseVertex";
-        case EntryPoint::DrawElementsBaseVertexEXT:
+        case EntryPoint::GLDrawElementsBaseVertexEXT:
             return "glDrawElementsBaseVertexEXT";
-        case EntryPoint::DrawElementsBaseVertexOES:
+        case EntryPoint::GLDrawElementsBaseVertexOES:
             return "glDrawElementsBaseVertexOES";
-        case EntryPoint::DrawElementsIndirect:
+        case EntryPoint::GLDrawElementsIndirect:
             return "glDrawElementsIndirect";
-        case EntryPoint::DrawElementsInstanced:
+        case EntryPoint::GLDrawElementsInstanced:
             return "glDrawElementsInstanced";
-        case EntryPoint::DrawElementsInstancedANGLE:
+        case EntryPoint::GLDrawElementsInstancedANGLE:
             return "glDrawElementsInstancedANGLE";
-        case EntryPoint::DrawElementsInstancedBaseInstance:
+        case EntryPoint::GLDrawElementsInstancedBaseInstance:
             return "glDrawElementsInstancedBaseInstance";
-        case EntryPoint::DrawElementsInstancedBaseVertex:
+        case EntryPoint::GLDrawElementsInstancedBaseVertex:
             return "glDrawElementsInstancedBaseVertex";
-        case EntryPoint::DrawElementsInstancedBaseVertexBaseInstance:
+        case EntryPoint::GLDrawElementsInstancedBaseVertexBaseInstance:
             return "glDrawElementsInstancedBaseVertexBaseInstance";
-        case EntryPoint::DrawElementsInstancedBaseVertexBaseInstanceANGLE:
+        case EntryPoint::GLDrawElementsInstancedBaseVertexBaseInstanceANGLE:
             return "glDrawElementsInstancedBaseVertexBaseInstanceANGLE";
-        case EntryPoint::DrawElementsInstancedBaseVertexEXT:
+        case EntryPoint::GLDrawElementsInstancedBaseVertexEXT:
             return "glDrawElementsInstancedBaseVertexEXT";
-        case EntryPoint::DrawElementsInstancedBaseVertexOES:
+        case EntryPoint::GLDrawElementsInstancedBaseVertexOES:
             return "glDrawElementsInstancedBaseVertexOES";
-        case EntryPoint::DrawElementsInstancedEXT:
+        case EntryPoint::GLDrawElementsInstancedEXT:
             return "glDrawElementsInstancedEXT";
-        case EntryPoint::DrawPixels:
+        case EntryPoint::GLDrawPixels:
             return "glDrawPixels";
-        case EntryPoint::DrawRangeElements:
+        case EntryPoint::GLDrawRangeElements:
             return "glDrawRangeElements";
-        case EntryPoint::DrawRangeElementsBaseVertex:
+        case EntryPoint::GLDrawRangeElementsBaseVertex:
             return "glDrawRangeElementsBaseVertex";
-        case EntryPoint::DrawRangeElementsBaseVertexEXT:
+        case EntryPoint::GLDrawRangeElementsBaseVertexEXT:
             return "glDrawRangeElementsBaseVertexEXT";
-        case EntryPoint::DrawRangeElementsBaseVertexOES:
+        case EntryPoint::GLDrawRangeElementsBaseVertexOES:
             return "glDrawRangeElementsBaseVertexOES";
-        case EntryPoint::DrawTexfOES:
+        case EntryPoint::GLDrawTexfOES:
             return "glDrawTexfOES";
-        case EntryPoint::DrawTexfvOES:
+        case EntryPoint::GLDrawTexfvOES:
             return "glDrawTexfvOES";
-        case EntryPoint::DrawTexiOES:
+        case EntryPoint::GLDrawTexiOES:
             return "glDrawTexiOES";
-        case EntryPoint::DrawTexivOES:
+        case EntryPoint::GLDrawTexivOES:
             return "glDrawTexivOES";
-        case EntryPoint::DrawTexsOES:
+        case EntryPoint::GLDrawTexsOES:
             return "glDrawTexsOES";
-        case EntryPoint::DrawTexsvOES:
+        case EntryPoint::GLDrawTexsvOES:
             return "glDrawTexsvOES";
-        case EntryPoint::DrawTexxOES:
+        case EntryPoint::GLDrawTexxOES:
             return "glDrawTexxOES";
-        case EntryPoint::DrawTexxvOES:
+        case EntryPoint::GLDrawTexxvOES:
             return "glDrawTexxvOES";
-        case EntryPoint::DrawTransformFeedback:
+        case EntryPoint::GLDrawTransformFeedback:
             return "glDrawTransformFeedback";
-        case EntryPoint::DrawTransformFeedbackInstanced:
+        case EntryPoint::GLDrawTransformFeedbackInstanced:
             return "glDrawTransformFeedbackInstanced";
-        case EntryPoint::DrawTransformFeedbackStream:
+        case EntryPoint::GLDrawTransformFeedbackStream:
             return "glDrawTransformFeedbackStream";
-        case EntryPoint::DrawTransformFeedbackStreamInstanced:
+        case EntryPoint::GLDrawTransformFeedbackStreamInstanced:
             return "glDrawTransformFeedbackStreamInstanced";
-        case EntryPoint::EGLImageTargetRenderbufferStorageOES:
+        case EntryPoint::GLEGLImageTargetRenderbufferStorageOES:
             return "glEGLImageTargetRenderbufferStorageOES";
-        case EntryPoint::EGLImageTargetTexture2DOES:
+        case EntryPoint::GLEGLImageTargetTexture2DOES:
             return "glEGLImageTargetTexture2DOES";
-        case EntryPoint::EdgeFlag:
+        case EntryPoint::GLEdgeFlag:
             return "glEdgeFlag";
-        case EntryPoint::EdgeFlagPointer:
+        case EntryPoint::GLEdgeFlagPointer:
             return "glEdgeFlagPointer";
-        case EntryPoint::EdgeFlagv:
+        case EntryPoint::GLEdgeFlagv:
             return "glEdgeFlagv";
-        case EntryPoint::Enable:
+        case EntryPoint::GLEnable:
             return "glEnable";
-        case EntryPoint::EnableClientState:
+        case EntryPoint::GLEnableClientState:
             return "glEnableClientState";
-        case EntryPoint::EnableVertexArrayAttrib:
+        case EntryPoint::GLEnableVertexArrayAttrib:
             return "glEnableVertexArrayAttrib";
-        case EntryPoint::EnableVertexAttribArray:
+        case EntryPoint::GLEnableVertexAttribArray:
             return "glEnableVertexAttribArray";
-        case EntryPoint::Enablei:
+        case EntryPoint::GLEnablei:
             return "glEnablei";
-        case EntryPoint::EnableiEXT:
+        case EntryPoint::GLEnableiEXT:
             return "glEnableiEXT";
-        case EntryPoint::EnableiOES:
+        case EntryPoint::GLEnableiOES:
             return "glEnableiOES";
-        case EntryPoint::End:
+        case EntryPoint::GLEnd:
             return "glEnd";
-        case EntryPoint::EndConditionalRender:
+        case EntryPoint::GLEndConditionalRender:
             return "glEndConditionalRender";
-        case EntryPoint::EndList:
+        case EntryPoint::GLEndList:
             return "glEndList";
-        case EntryPoint::EndQuery:
+        case EntryPoint::GLEndQuery:
             return "glEndQuery";
-        case EntryPoint::EndQueryEXT:
+        case EntryPoint::GLEndQueryEXT:
             return "glEndQueryEXT";
-        case EntryPoint::EndQueryIndexed:
+        case EntryPoint::GLEndQueryIndexed:
             return "glEndQueryIndexed";
-        case EntryPoint::EndTransformFeedback:
+        case EntryPoint::GLEndTransformFeedback:
             return "glEndTransformFeedback";
-        case EntryPoint::EvalCoord1d:
+        case EntryPoint::GLEvalCoord1d:
             return "glEvalCoord1d";
-        case EntryPoint::EvalCoord1dv:
+        case EntryPoint::GLEvalCoord1dv:
             return "glEvalCoord1dv";
-        case EntryPoint::EvalCoord1f:
+        case EntryPoint::GLEvalCoord1f:
             return "glEvalCoord1f";
-        case EntryPoint::EvalCoord1fv:
+        case EntryPoint::GLEvalCoord1fv:
             return "glEvalCoord1fv";
-        case EntryPoint::EvalCoord2d:
+        case EntryPoint::GLEvalCoord2d:
             return "glEvalCoord2d";
-        case EntryPoint::EvalCoord2dv:
+        case EntryPoint::GLEvalCoord2dv:
             return "glEvalCoord2dv";
-        case EntryPoint::EvalCoord2f:
+        case EntryPoint::GLEvalCoord2f:
             return "glEvalCoord2f";
-        case EntryPoint::EvalCoord2fv:
+        case EntryPoint::GLEvalCoord2fv:
             return "glEvalCoord2fv";
-        case EntryPoint::EvalMesh1:
+        case EntryPoint::GLEvalMesh1:
             return "glEvalMesh1";
-        case EntryPoint::EvalMesh2:
+        case EntryPoint::GLEvalMesh2:
             return "glEvalMesh2";
-        case EntryPoint::EvalPoint1:
+        case EntryPoint::GLEvalPoint1:
             return "glEvalPoint1";
-        case EntryPoint::EvalPoint2:
+        case EntryPoint::GLEvalPoint2:
             return "glEvalPoint2";
-        case EntryPoint::FeedbackBuffer:
+        case EntryPoint::GLFeedbackBuffer:
             return "glFeedbackBuffer";
-        case EntryPoint::FenceSync:
+        case EntryPoint::GLFenceSync:
             return "glFenceSync";
-        case EntryPoint::Finish:
+        case EntryPoint::GLFinish:
             return "glFinish";
-        case EntryPoint::FinishFenceNV:
+        case EntryPoint::GLFinishFenceNV:
             return "glFinishFenceNV";
-        case EntryPoint::Flush:
+        case EntryPoint::GLFlush:
             return "glFlush";
-        case EntryPoint::FlushMappedBufferRange:
+        case EntryPoint::GLFlushMappedBufferRange:
             return "glFlushMappedBufferRange";
-        case EntryPoint::FlushMappedBufferRangeEXT:
+        case EntryPoint::GLFlushMappedBufferRangeEXT:
             return "glFlushMappedBufferRangeEXT";
-        case EntryPoint::FlushMappedNamedBufferRange:
+        case EntryPoint::GLFlushMappedNamedBufferRange:
             return "glFlushMappedNamedBufferRange";
-        case EntryPoint::FogCoordPointer:
+        case EntryPoint::GLFogCoordPointer:
             return "glFogCoordPointer";
-        case EntryPoint::FogCoordd:
+        case EntryPoint::GLFogCoordd:
             return "glFogCoordd";
-        case EntryPoint::FogCoorddv:
+        case EntryPoint::GLFogCoorddv:
             return "glFogCoorddv";
-        case EntryPoint::FogCoordf:
+        case EntryPoint::GLFogCoordf:
             return "glFogCoordf";
-        case EntryPoint::FogCoordfv:
+        case EntryPoint::GLFogCoordfv:
             return "glFogCoordfv";
-        case EntryPoint::Fogf:
+        case EntryPoint::GLFogf:
             return "glFogf";
-        case EntryPoint::Fogfv:
+        case EntryPoint::GLFogfv:
             return "glFogfv";
-        case EntryPoint::Fogi:
+        case EntryPoint::GLFogi:
             return "glFogi";
-        case EntryPoint::Fogiv:
+        case EntryPoint::GLFogiv:
             return "glFogiv";
-        case EntryPoint::Fogx:
+        case EntryPoint::GLFogx:
             return "glFogx";
-        case EntryPoint::Fogxv:
+        case EntryPoint::GLFogxv:
             return "glFogxv";
-        case EntryPoint::FramebufferParameteri:
+        case EntryPoint::GLFramebufferParameteri:
             return "glFramebufferParameteri";
-        case EntryPoint::FramebufferRenderbuffer:
+        case EntryPoint::GLFramebufferRenderbuffer:
             return "glFramebufferRenderbuffer";
-        case EntryPoint::FramebufferRenderbufferOES:
+        case EntryPoint::GLFramebufferRenderbufferOES:
             return "glFramebufferRenderbufferOES";
-        case EntryPoint::FramebufferTexture:
+        case EntryPoint::GLFramebufferTexture:
             return "glFramebufferTexture";
-        case EntryPoint::FramebufferTexture1D:
+        case EntryPoint::GLFramebufferTexture1D:
             return "glFramebufferTexture1D";
-        case EntryPoint::FramebufferTexture2D:
+        case EntryPoint::GLFramebufferTexture2D:
             return "glFramebufferTexture2D";
-        case EntryPoint::FramebufferTexture2DMultisampleEXT:
+        case EntryPoint::GLFramebufferTexture2DMultisampleEXT:
             return "glFramebufferTexture2DMultisampleEXT";
-        case EntryPoint::FramebufferTexture2DOES:
+        case EntryPoint::GLFramebufferTexture2DOES:
             return "glFramebufferTexture2DOES";
-        case EntryPoint::FramebufferTexture3D:
+        case EntryPoint::GLFramebufferTexture3D:
             return "glFramebufferTexture3D";
-        case EntryPoint::FramebufferTexture3DOES:
+        case EntryPoint::GLFramebufferTexture3DOES:
             return "glFramebufferTexture3DOES";
-        case EntryPoint::FramebufferTextureEXT:
+        case EntryPoint::GLFramebufferTextureEXT:
             return "glFramebufferTextureEXT";
-        case EntryPoint::FramebufferTextureLayer:
+        case EntryPoint::GLFramebufferTextureLayer:
             return "glFramebufferTextureLayer";
-        case EntryPoint::FramebufferTextureMultiviewOVR:
+        case EntryPoint::GLFramebufferTextureMultiviewOVR:
             return "glFramebufferTextureMultiviewOVR";
-        case EntryPoint::FrontFace:
+        case EntryPoint::GLFrontFace:
             return "glFrontFace";
-        case EntryPoint::Frustum:
+        case EntryPoint::GLFrustum:
             return "glFrustum";
-        case EntryPoint::Frustumf:
+        case EntryPoint::GLFrustumf:
             return "glFrustumf";
-        case EntryPoint::Frustumx:
+        case EntryPoint::GLFrustumx:
             return "glFrustumx";
-        case EntryPoint::GenBuffers:
+        case EntryPoint::GLGenBuffers:
             return "glGenBuffers";
-        case EntryPoint::GenFencesNV:
+        case EntryPoint::GLGenFencesNV:
             return "glGenFencesNV";
-        case EntryPoint::GenFramebuffers:
+        case EntryPoint::GLGenFramebuffers:
             return "glGenFramebuffers";
-        case EntryPoint::GenFramebuffersOES:
+        case EntryPoint::GLGenFramebuffersOES:
             return "glGenFramebuffersOES";
-        case EntryPoint::GenLists:
+        case EntryPoint::GLGenLists:
             return "glGenLists";
-        case EntryPoint::GenProgramPipelines:
+        case EntryPoint::GLGenProgramPipelines:
             return "glGenProgramPipelines";
-        case EntryPoint::GenProgramPipelinesEXT:
+        case EntryPoint::GLGenProgramPipelinesEXT:
             return "glGenProgramPipelinesEXT";
-        case EntryPoint::GenQueries:
+        case EntryPoint::GLGenQueries:
             return "glGenQueries";
-        case EntryPoint::GenQueriesEXT:
+        case EntryPoint::GLGenQueriesEXT:
             return "glGenQueriesEXT";
-        case EntryPoint::GenRenderbuffers:
+        case EntryPoint::GLGenRenderbuffers:
             return "glGenRenderbuffers";
-        case EntryPoint::GenRenderbuffersOES:
+        case EntryPoint::GLGenRenderbuffersOES:
             return "glGenRenderbuffersOES";
-        case EntryPoint::GenSamplers:
+        case EntryPoint::GLGenSamplers:
             return "glGenSamplers";
-        case EntryPoint::GenSemaphoresEXT:
+        case EntryPoint::GLGenSemaphoresEXT:
             return "glGenSemaphoresEXT";
-        case EntryPoint::GenTextures:
+        case EntryPoint::GLGenTextures:
             return "glGenTextures";
-        case EntryPoint::GenTransformFeedbacks:
+        case EntryPoint::GLGenTransformFeedbacks:
             return "glGenTransformFeedbacks";
-        case EntryPoint::GenVertexArrays:
+        case EntryPoint::GLGenVertexArrays:
             return "glGenVertexArrays";
-        case EntryPoint::GenVertexArraysOES:
+        case EntryPoint::GLGenVertexArraysOES:
             return "glGenVertexArraysOES";
-        case EntryPoint::GenerateMipmap:
+        case EntryPoint::GLGenerateMipmap:
             return "glGenerateMipmap";
-        case EntryPoint::GenerateMipmapOES:
+        case EntryPoint::GLGenerateMipmapOES:
             return "glGenerateMipmapOES";
-        case EntryPoint::GenerateTextureMipmap:
+        case EntryPoint::GLGenerateTextureMipmap:
             return "glGenerateTextureMipmap";
-        case EntryPoint::GetActiveAtomicCounterBufferiv:
+        case EntryPoint::GLGetActiveAtomicCounterBufferiv:
             return "glGetActiveAtomicCounterBufferiv";
-        case EntryPoint::GetActiveAttrib:
+        case EntryPoint::GLGetActiveAttrib:
             return "glGetActiveAttrib";
-        case EntryPoint::GetActiveSubroutineName:
+        case EntryPoint::GLGetActiveSubroutineName:
             return "glGetActiveSubroutineName";
-        case EntryPoint::GetActiveSubroutineUniformName:
+        case EntryPoint::GLGetActiveSubroutineUniformName:
             return "glGetActiveSubroutineUniformName";
-        case EntryPoint::GetActiveSubroutineUniformiv:
+        case EntryPoint::GLGetActiveSubroutineUniformiv:
             return "glGetActiveSubroutineUniformiv";
-        case EntryPoint::GetActiveUniform:
+        case EntryPoint::GLGetActiveUniform:
             return "glGetActiveUniform";
-        case EntryPoint::GetActiveUniformBlockName:
+        case EntryPoint::GLGetActiveUniformBlockName:
             return "glGetActiveUniformBlockName";
-        case EntryPoint::GetActiveUniformBlockiv:
+        case EntryPoint::GLGetActiveUniformBlockiv:
             return "glGetActiveUniformBlockiv";
-        case EntryPoint::GetActiveUniformBlockivRobustANGLE:
+        case EntryPoint::GLGetActiveUniformBlockivRobustANGLE:
             return "glGetActiveUniformBlockivRobustANGLE";
-        case EntryPoint::GetActiveUniformName:
+        case EntryPoint::GLGetActiveUniformName:
             return "glGetActiveUniformName";
-        case EntryPoint::GetActiveUniformsiv:
+        case EntryPoint::GLGetActiveUniformsiv:
             return "glGetActiveUniformsiv";
-        case EntryPoint::GetAttachedShaders:
+        case EntryPoint::GLGetAttachedShaders:
             return "glGetAttachedShaders";
-        case EntryPoint::GetAttribLocation:
+        case EntryPoint::GLGetAttribLocation:
             return "glGetAttribLocation";
-        case EntryPoint::GetBooleani_v:
+        case EntryPoint::GLGetBooleani_v:
             return "glGetBooleani_v";
-        case EntryPoint::GetBooleani_vRobustANGLE:
+        case EntryPoint::GLGetBooleani_vRobustANGLE:
             return "glGetBooleani_vRobustANGLE";
-        case EntryPoint::GetBooleanv:
+        case EntryPoint::GLGetBooleanv:
             return "glGetBooleanv";
-        case EntryPoint::GetBooleanvRobustANGLE:
+        case EntryPoint::GLGetBooleanvRobustANGLE:
             return "glGetBooleanvRobustANGLE";
-        case EntryPoint::GetBufferParameteri64v:
+        case EntryPoint::GLGetBufferParameteri64v:
             return "glGetBufferParameteri64v";
-        case EntryPoint::GetBufferParameteri64vRobustANGLE:
+        case EntryPoint::GLGetBufferParameteri64vRobustANGLE:
             return "glGetBufferParameteri64vRobustANGLE";
-        case EntryPoint::GetBufferParameteriv:
+        case EntryPoint::GLGetBufferParameteriv:
             return "glGetBufferParameteriv";
-        case EntryPoint::GetBufferParameterivRobustANGLE:
+        case EntryPoint::GLGetBufferParameterivRobustANGLE:
             return "glGetBufferParameterivRobustANGLE";
-        case EntryPoint::GetBufferPointerv:
+        case EntryPoint::GLGetBufferPointerv:
             return "glGetBufferPointerv";
-        case EntryPoint::GetBufferPointervOES:
+        case EntryPoint::GLGetBufferPointervOES:
             return "glGetBufferPointervOES";
-        case EntryPoint::GetBufferPointervRobustANGLE:
+        case EntryPoint::GLGetBufferPointervRobustANGLE:
             return "glGetBufferPointervRobustANGLE";
-        case EntryPoint::GetBufferSubData:
+        case EntryPoint::GLGetBufferSubData:
             return "glGetBufferSubData";
-        case EntryPoint::GetClipPlane:
+        case EntryPoint::GLGetClipPlane:
             return "glGetClipPlane";
-        case EntryPoint::GetClipPlanef:
+        case EntryPoint::GLGetClipPlanef:
             return "glGetClipPlanef";
-        case EntryPoint::GetClipPlanex:
+        case EntryPoint::GLGetClipPlanex:
             return "glGetClipPlanex";
-        case EntryPoint::GetCompressedTexImage:
+        case EntryPoint::GLGetCompressedTexImage:
             return "glGetCompressedTexImage";
-        case EntryPoint::GetCompressedTextureImage:
+        case EntryPoint::GLGetCompressedTextureImage:
             return "glGetCompressedTextureImage";
-        case EntryPoint::GetCompressedTextureSubImage:
+        case EntryPoint::GLGetCompressedTextureSubImage:
             return "glGetCompressedTextureSubImage";
-        case EntryPoint::GetDebugMessageLog:
+        case EntryPoint::GLGetDebugMessageLog:
             return "glGetDebugMessageLog";
-        case EntryPoint::GetDebugMessageLogKHR:
+        case EntryPoint::GLGetDebugMessageLogKHR:
             return "glGetDebugMessageLogKHR";
-        case EntryPoint::GetDoublei_v:
+        case EntryPoint::GLGetDoublei_v:
             return "glGetDoublei_v";
-        case EntryPoint::GetDoublev:
+        case EntryPoint::GLGetDoublev:
             return "glGetDoublev";
-        case EntryPoint::GetError:
+        case EntryPoint::GLGetError:
             return "glGetError";
-        case EntryPoint::GetFenceivNV:
+        case EntryPoint::GLGetFenceivNV:
             return "glGetFenceivNV";
-        case EntryPoint::GetFixedv:
+        case EntryPoint::GLGetFixedv:
             return "glGetFixedv";
-        case EntryPoint::GetFloati_v:
+        case EntryPoint::GLGetFloati_v:
             return "glGetFloati_v";
-        case EntryPoint::GetFloatv:
+        case EntryPoint::GLGetFloatv:
             return "glGetFloatv";
-        case EntryPoint::GetFloatvRobustANGLE:
+        case EntryPoint::GLGetFloatvRobustANGLE:
             return "glGetFloatvRobustANGLE";
-        case EntryPoint::GetFragDataIndex:
+        case EntryPoint::GLGetFragDataIndex:
             return "glGetFragDataIndex";
-        case EntryPoint::GetFragDataIndexEXT:
+        case EntryPoint::GLGetFragDataIndexEXT:
             return "glGetFragDataIndexEXT";
-        case EntryPoint::GetFragDataLocation:
+        case EntryPoint::GLGetFragDataLocation:
             return "glGetFragDataLocation";
-        case EntryPoint::GetFramebufferAttachmentParameteriv:
+        case EntryPoint::GLGetFramebufferAttachmentParameteriv:
             return "glGetFramebufferAttachmentParameteriv";
-        case EntryPoint::GetFramebufferAttachmentParameterivOES:
+        case EntryPoint::GLGetFramebufferAttachmentParameterivOES:
             return "glGetFramebufferAttachmentParameterivOES";
-        case EntryPoint::GetFramebufferAttachmentParameterivRobustANGLE:
+        case EntryPoint::GLGetFramebufferAttachmentParameterivRobustANGLE:
             return "glGetFramebufferAttachmentParameterivRobustANGLE";
-        case EntryPoint::GetFramebufferParameteriv:
+        case EntryPoint::GLGetFramebufferParameteriv:
             return "glGetFramebufferParameteriv";
-        case EntryPoint::GetFramebufferParameterivRobustANGLE:
+        case EntryPoint::GLGetFramebufferParameterivRobustANGLE:
             return "glGetFramebufferParameterivRobustANGLE";
-        case EntryPoint::GetGraphicsResetStatus:
+        case EntryPoint::GLGetGraphicsResetStatus:
             return "glGetGraphicsResetStatus";
-        case EntryPoint::GetGraphicsResetStatusEXT:
+        case EntryPoint::GLGetGraphicsResetStatusEXT:
             return "glGetGraphicsResetStatusEXT";
-        case EntryPoint::GetInteger64i_v:
+        case EntryPoint::GLGetInteger64i_v:
             return "glGetInteger64i_v";
-        case EntryPoint::GetInteger64i_vRobustANGLE:
+        case EntryPoint::GLGetInteger64i_vRobustANGLE:
             return "glGetInteger64i_vRobustANGLE";
-        case EntryPoint::GetInteger64v:
+        case EntryPoint::GLGetInteger64v:
             return "glGetInteger64v";
-        case EntryPoint::GetInteger64vEXT:
+        case EntryPoint::GLGetInteger64vEXT:
             return "glGetInteger64vEXT";
-        case EntryPoint::GetInteger64vRobustANGLE:
+        case EntryPoint::GLGetInteger64vRobustANGLE:
             return "glGetInteger64vRobustANGLE";
-        case EntryPoint::GetIntegeri_v:
+        case EntryPoint::GLGetIntegeri_v:
             return "glGetIntegeri_v";
-        case EntryPoint::GetIntegeri_vRobustANGLE:
+        case EntryPoint::GLGetIntegeri_vRobustANGLE:
             return "glGetIntegeri_vRobustANGLE";
-        case EntryPoint::GetIntegerv:
+        case EntryPoint::GLGetIntegerv:
             return "glGetIntegerv";
-        case EntryPoint::GetIntegervRobustANGLE:
+        case EntryPoint::GLGetIntegervRobustANGLE:
             return "glGetIntegervRobustANGLE";
-        case EntryPoint::GetInternalformati64v:
+        case EntryPoint::GLGetInternalformati64v:
             return "glGetInternalformati64v";
-        case EntryPoint::GetInternalformativ:
+        case EntryPoint::GLGetInternalformativ:
             return "glGetInternalformativ";
-        case EntryPoint::GetInternalformativRobustANGLE:
+        case EntryPoint::GLGetInternalformativRobustANGLE:
             return "glGetInternalformativRobustANGLE";
-        case EntryPoint::GetLightfv:
+        case EntryPoint::GLGetLightfv:
             return "glGetLightfv";
-        case EntryPoint::GetLightiv:
+        case EntryPoint::GLGetLightiv:
             return "glGetLightiv";
-        case EntryPoint::GetLightxv:
+        case EntryPoint::GLGetLightxv:
             return "glGetLightxv";
-        case EntryPoint::GetMapdv:
+        case EntryPoint::GLGetMapdv:
             return "glGetMapdv";
-        case EntryPoint::GetMapfv:
+        case EntryPoint::GLGetMapfv:
             return "glGetMapfv";
-        case EntryPoint::GetMapiv:
+        case EntryPoint::GLGetMapiv:
             return "glGetMapiv";
-        case EntryPoint::GetMaterialfv:
+        case EntryPoint::GLGetMaterialfv:
             return "glGetMaterialfv";
-        case EntryPoint::GetMaterialiv:
+        case EntryPoint::GLGetMaterialiv:
             return "glGetMaterialiv";
-        case EntryPoint::GetMaterialxv:
+        case EntryPoint::GLGetMaterialxv:
             return "glGetMaterialxv";
-        case EntryPoint::GetMemoryObjectParameterivEXT:
+        case EntryPoint::GLGetMemoryObjectParameterivEXT:
             return "glGetMemoryObjectParameterivEXT";
-        case EntryPoint::GetMultisamplefv:
+        case EntryPoint::GLGetMultisamplefv:
             return "glGetMultisamplefv";
-        case EntryPoint::GetMultisamplefvANGLE:
+        case EntryPoint::GLGetMultisamplefvANGLE:
             return "glGetMultisamplefvANGLE";
-        case EntryPoint::GetMultisamplefvRobustANGLE:
+        case EntryPoint::GLGetMultisamplefvRobustANGLE:
             return "glGetMultisamplefvRobustANGLE";
-        case EntryPoint::GetNamedBufferParameteri64v:
+        case EntryPoint::GLGetNamedBufferParameteri64v:
             return "glGetNamedBufferParameteri64v";
-        case EntryPoint::GetNamedBufferParameteriv:
+        case EntryPoint::GLGetNamedBufferParameteriv:
             return "glGetNamedBufferParameteriv";
-        case EntryPoint::GetNamedBufferPointerv:
+        case EntryPoint::GLGetNamedBufferPointerv:
             return "glGetNamedBufferPointerv";
-        case EntryPoint::GetNamedBufferSubData:
+        case EntryPoint::GLGetNamedBufferSubData:
             return "glGetNamedBufferSubData";
-        case EntryPoint::GetNamedFramebufferAttachmentParameteriv:
+        case EntryPoint::GLGetNamedFramebufferAttachmentParameteriv:
             return "glGetNamedFramebufferAttachmentParameteriv";
-        case EntryPoint::GetNamedFramebufferParameteriv:
+        case EntryPoint::GLGetNamedFramebufferParameteriv:
             return "glGetNamedFramebufferParameteriv";
-        case EntryPoint::GetNamedRenderbufferParameteriv:
+        case EntryPoint::GLGetNamedRenderbufferParameteriv:
             return "glGetNamedRenderbufferParameteriv";
-        case EntryPoint::GetObjectLabel:
+        case EntryPoint::GLGetObjectLabel:
             return "glGetObjectLabel";
-        case EntryPoint::GetObjectLabelKHR:
+        case EntryPoint::GLGetObjectLabelEXT:
+            return "glGetObjectLabelEXT";
+        case EntryPoint::GLGetObjectLabelKHR:
             return "glGetObjectLabelKHR";
-        case EntryPoint::GetObjectPtrLabel:
+        case EntryPoint::GLGetObjectPtrLabel:
             return "glGetObjectPtrLabel";
-        case EntryPoint::GetObjectPtrLabelKHR:
+        case EntryPoint::GLGetObjectPtrLabelKHR:
             return "glGetObjectPtrLabelKHR";
-        case EntryPoint::GetPixelMapfv:
+        case EntryPoint::GLGetPixelMapfv:
             return "glGetPixelMapfv";
-        case EntryPoint::GetPixelMapuiv:
+        case EntryPoint::GLGetPixelMapuiv:
             return "glGetPixelMapuiv";
-        case EntryPoint::GetPixelMapusv:
+        case EntryPoint::GLGetPixelMapusv:
             return "glGetPixelMapusv";
-        case EntryPoint::GetPointerv:
+        case EntryPoint::GLGetPointerv:
             return "glGetPointerv";
-        case EntryPoint::GetPointervKHR:
+        case EntryPoint::GLGetPointervKHR:
             return "glGetPointervKHR";
-        case EntryPoint::GetPointervRobustANGLERobustANGLE:
+        case EntryPoint::GLGetPointervRobustANGLERobustANGLE:
             return "glGetPointervRobustANGLERobustANGLE";
-        case EntryPoint::GetPolygonStipple:
+        case EntryPoint::GLGetPolygonStipple:
             return "glGetPolygonStipple";
-        case EntryPoint::GetProgramBinary:
+        case EntryPoint::GLGetProgramBinary:
             return "glGetProgramBinary";
-        case EntryPoint::GetProgramBinaryOES:
+        case EntryPoint::GLGetProgramBinaryOES:
             return "glGetProgramBinaryOES";
-        case EntryPoint::GetProgramInfoLog:
+        case EntryPoint::GLGetProgramInfoLog:
             return "glGetProgramInfoLog";
-        case EntryPoint::GetProgramInterfaceiv:
+        case EntryPoint::GLGetProgramInterfaceiv:
             return "glGetProgramInterfaceiv";
-        case EntryPoint::GetProgramInterfaceivRobustANGLE:
+        case EntryPoint::GLGetProgramInterfaceivRobustANGLE:
             return "glGetProgramInterfaceivRobustANGLE";
-        case EntryPoint::GetProgramPipelineInfoLog:
+        case EntryPoint::GLGetProgramPipelineInfoLog:
             return "glGetProgramPipelineInfoLog";
-        case EntryPoint::GetProgramPipelineInfoLogEXT:
+        case EntryPoint::GLGetProgramPipelineInfoLogEXT:
             return "glGetProgramPipelineInfoLogEXT";
-        case EntryPoint::GetProgramPipelineiv:
+        case EntryPoint::GLGetProgramPipelineiv:
             return "glGetProgramPipelineiv";
-        case EntryPoint::GetProgramPipelineivEXT:
+        case EntryPoint::GLGetProgramPipelineivEXT:
             return "glGetProgramPipelineivEXT";
-        case EntryPoint::GetProgramResourceIndex:
+        case EntryPoint::GLGetProgramResourceIndex:
             return "glGetProgramResourceIndex";
-        case EntryPoint::GetProgramResourceLocation:
+        case EntryPoint::GLGetProgramResourceLocation:
             return "glGetProgramResourceLocation";
-        case EntryPoint::GetProgramResourceLocationIndex:
+        case EntryPoint::GLGetProgramResourceLocationIndex:
             return "glGetProgramResourceLocationIndex";
-        case EntryPoint::GetProgramResourceLocationIndexEXT:
+        case EntryPoint::GLGetProgramResourceLocationIndexEXT:
             return "glGetProgramResourceLocationIndexEXT";
-        case EntryPoint::GetProgramResourceName:
+        case EntryPoint::GLGetProgramResourceName:
             return "glGetProgramResourceName";
-        case EntryPoint::GetProgramResourceiv:
+        case EntryPoint::GLGetProgramResourceiv:
             return "glGetProgramResourceiv";
-        case EntryPoint::GetProgramStageiv:
+        case EntryPoint::GLGetProgramStageiv:
             return "glGetProgramStageiv";
-        case EntryPoint::GetProgramiv:
+        case EntryPoint::GLGetProgramiv:
             return "glGetProgramiv";
-        case EntryPoint::GetProgramivRobustANGLE:
+        case EntryPoint::GLGetProgramivRobustANGLE:
             return "glGetProgramivRobustANGLE";
-        case EntryPoint::GetQueryBufferObjecti64v:
+        case EntryPoint::GLGetQueryBufferObjecti64v:
             return "glGetQueryBufferObjecti64v";
-        case EntryPoint::GetQueryBufferObjectiv:
+        case EntryPoint::GLGetQueryBufferObjectiv:
             return "glGetQueryBufferObjectiv";
-        case EntryPoint::GetQueryBufferObjectui64v:
+        case EntryPoint::GLGetQueryBufferObjectui64v:
             return "glGetQueryBufferObjectui64v";
-        case EntryPoint::GetQueryBufferObjectuiv:
+        case EntryPoint::GLGetQueryBufferObjectuiv:
             return "glGetQueryBufferObjectuiv";
-        case EntryPoint::GetQueryIndexediv:
+        case EntryPoint::GLGetQueryIndexediv:
             return "glGetQueryIndexediv";
-        case EntryPoint::GetQueryObjecti64v:
+        case EntryPoint::GLGetQueryObjecti64v:
             return "glGetQueryObjecti64v";
-        case EntryPoint::GetQueryObjecti64vEXT:
+        case EntryPoint::GLGetQueryObjecti64vEXT:
             return "glGetQueryObjecti64vEXT";
-        case EntryPoint::GetQueryObjecti64vRobustANGLE:
+        case EntryPoint::GLGetQueryObjecti64vRobustANGLE:
             return "glGetQueryObjecti64vRobustANGLE";
-        case EntryPoint::GetQueryObjectiv:
+        case EntryPoint::GLGetQueryObjectiv:
             return "glGetQueryObjectiv";
-        case EntryPoint::GetQueryObjectivEXT:
+        case EntryPoint::GLGetQueryObjectivEXT:
             return "glGetQueryObjectivEXT";
-        case EntryPoint::GetQueryObjectivRobustANGLE:
+        case EntryPoint::GLGetQueryObjectivRobustANGLE:
             return "glGetQueryObjectivRobustANGLE";
-        case EntryPoint::GetQueryObjectui64v:
+        case EntryPoint::GLGetQueryObjectui64v:
             return "glGetQueryObjectui64v";
-        case EntryPoint::GetQueryObjectui64vEXT:
+        case EntryPoint::GLGetQueryObjectui64vEXT:
             return "glGetQueryObjectui64vEXT";
-        case EntryPoint::GetQueryObjectui64vRobustANGLE:
+        case EntryPoint::GLGetQueryObjectui64vRobustANGLE:
             return "glGetQueryObjectui64vRobustANGLE";
-        case EntryPoint::GetQueryObjectuiv:
+        case EntryPoint::GLGetQueryObjectuiv:
             return "glGetQueryObjectuiv";
-        case EntryPoint::GetQueryObjectuivEXT:
+        case EntryPoint::GLGetQueryObjectuivEXT:
             return "glGetQueryObjectuivEXT";
-        case EntryPoint::GetQueryObjectuivRobustANGLE:
+        case EntryPoint::GLGetQueryObjectuivRobustANGLE:
             return "glGetQueryObjectuivRobustANGLE";
-        case EntryPoint::GetQueryiv:
+        case EntryPoint::GLGetQueryiv:
             return "glGetQueryiv";
-        case EntryPoint::GetQueryivEXT:
+        case EntryPoint::GLGetQueryivEXT:
             return "glGetQueryivEXT";
-        case EntryPoint::GetQueryivRobustANGLE:
+        case EntryPoint::GLGetQueryivRobustANGLE:
             return "glGetQueryivRobustANGLE";
-        case EntryPoint::GetRenderbufferImageANGLE:
+        case EntryPoint::GLGetRenderbufferImageANGLE:
             return "glGetRenderbufferImageANGLE";
-        case EntryPoint::GetRenderbufferParameteriv:
+        case EntryPoint::GLGetRenderbufferParameteriv:
             return "glGetRenderbufferParameteriv";
-        case EntryPoint::GetRenderbufferParameterivOES:
+        case EntryPoint::GLGetRenderbufferParameterivOES:
             return "glGetRenderbufferParameterivOES";
-        case EntryPoint::GetRenderbufferParameterivRobustANGLE:
+        case EntryPoint::GLGetRenderbufferParameterivRobustANGLE:
             return "glGetRenderbufferParameterivRobustANGLE";
-        case EntryPoint::GetSamplerParameterIiv:
+        case EntryPoint::GLGetSamplerParameterIiv:
             return "glGetSamplerParameterIiv";
-        case EntryPoint::GetSamplerParameterIivOES:
+        case EntryPoint::GLGetSamplerParameterIivOES:
             return "glGetSamplerParameterIivOES";
-        case EntryPoint::GetSamplerParameterIivRobustANGLE:
+        case EntryPoint::GLGetSamplerParameterIivRobustANGLE:
             return "glGetSamplerParameterIivRobustANGLE";
-        case EntryPoint::GetSamplerParameterIuiv:
+        case EntryPoint::GLGetSamplerParameterIuiv:
             return "glGetSamplerParameterIuiv";
-        case EntryPoint::GetSamplerParameterIuivOES:
+        case EntryPoint::GLGetSamplerParameterIuivOES:
             return "glGetSamplerParameterIuivOES";
-        case EntryPoint::GetSamplerParameterIuivRobustANGLE:
+        case EntryPoint::GLGetSamplerParameterIuivRobustANGLE:
             return "glGetSamplerParameterIuivRobustANGLE";
-        case EntryPoint::GetSamplerParameterfv:
+        case EntryPoint::GLGetSamplerParameterfv:
             return "glGetSamplerParameterfv";
-        case EntryPoint::GetSamplerParameterfvRobustANGLE:
+        case EntryPoint::GLGetSamplerParameterfvRobustANGLE:
             return "glGetSamplerParameterfvRobustANGLE";
-        case EntryPoint::GetSamplerParameteriv:
+        case EntryPoint::GLGetSamplerParameteriv:
             return "glGetSamplerParameteriv";
-        case EntryPoint::GetSamplerParameterivRobustANGLE:
+        case EntryPoint::GLGetSamplerParameterivRobustANGLE:
             return "glGetSamplerParameterivRobustANGLE";
-        case EntryPoint::GetSemaphoreParameterui64vEXT:
+        case EntryPoint::GLGetSemaphoreParameterui64vEXT:
             return "glGetSemaphoreParameterui64vEXT";
-        case EntryPoint::GetShaderInfoLog:
+        case EntryPoint::GLGetShaderInfoLog:
             return "glGetShaderInfoLog";
-        case EntryPoint::GetShaderPrecisionFormat:
+        case EntryPoint::GLGetShaderPrecisionFormat:
             return "glGetShaderPrecisionFormat";
-        case EntryPoint::GetShaderSource:
+        case EntryPoint::GLGetShaderSource:
             return "glGetShaderSource";
-        case EntryPoint::GetShaderiv:
+        case EntryPoint::GLGetShaderiv:
             return "glGetShaderiv";
-        case EntryPoint::GetShaderivRobustANGLE:
+        case EntryPoint::GLGetShaderivRobustANGLE:
             return "glGetShaderivRobustANGLE";
-        case EntryPoint::GetString:
+        case EntryPoint::GLGetString:
             return "glGetString";
-        case EntryPoint::GetStringi:
+        case EntryPoint::GLGetStringi:
             return "glGetStringi";
-        case EntryPoint::GetSubroutineIndex:
+        case EntryPoint::GLGetSubroutineIndex:
             return "glGetSubroutineIndex";
-        case EntryPoint::GetSubroutineUniformLocation:
+        case EntryPoint::GLGetSubroutineUniformLocation:
             return "glGetSubroutineUniformLocation";
-        case EntryPoint::GetSynciv:
+        case EntryPoint::GLGetSynciv:
             return "glGetSynciv";
-        case EntryPoint::GetTexEnvfv:
+        case EntryPoint::GLGetTexEnvfv:
             return "glGetTexEnvfv";
-        case EntryPoint::GetTexEnviv:
+        case EntryPoint::GLGetTexEnviv:
             return "glGetTexEnviv";
-        case EntryPoint::GetTexEnvxv:
+        case EntryPoint::GLGetTexEnvxv:
             return "glGetTexEnvxv";
-        case EntryPoint::GetTexGendv:
+        case EntryPoint::GLGetTexGendv:
             return "glGetTexGendv";
-        case EntryPoint::GetTexGenfv:
+        case EntryPoint::GLGetTexGenfv:
             return "glGetTexGenfv";
-        case EntryPoint::GetTexGenfvOES:
+        case EntryPoint::GLGetTexGenfvOES:
             return "glGetTexGenfvOES";
-        case EntryPoint::GetTexGeniv:
+        case EntryPoint::GLGetTexGeniv:
             return "glGetTexGeniv";
-        case EntryPoint::GetTexGenivOES:
+        case EntryPoint::GLGetTexGenivOES:
             return "glGetTexGenivOES";
-        case EntryPoint::GetTexGenxvOES:
+        case EntryPoint::GLGetTexGenxvOES:
             return "glGetTexGenxvOES";
-        case EntryPoint::GetTexImage:
+        case EntryPoint::GLGetTexImage:
             return "glGetTexImage";
-        case EntryPoint::GetTexImageANGLE:
+        case EntryPoint::GLGetTexImageANGLE:
             return "glGetTexImageANGLE";
-        case EntryPoint::GetTexLevelParameterfv:
+        case EntryPoint::GLGetTexLevelParameterfv:
             return "glGetTexLevelParameterfv";
-        case EntryPoint::GetTexLevelParameterfvANGLE:
+        case EntryPoint::GLGetTexLevelParameterfvANGLE:
             return "glGetTexLevelParameterfvANGLE";
-        case EntryPoint::GetTexLevelParameterfvRobustANGLE:
+        case EntryPoint::GLGetTexLevelParameterfvRobustANGLE:
             return "glGetTexLevelParameterfvRobustANGLE";
-        case EntryPoint::GetTexLevelParameteriv:
+        case EntryPoint::GLGetTexLevelParameteriv:
             return "glGetTexLevelParameteriv";
-        case EntryPoint::GetTexLevelParameterivANGLE:
+        case EntryPoint::GLGetTexLevelParameterivANGLE:
             return "glGetTexLevelParameterivANGLE";
-        case EntryPoint::GetTexLevelParameterivRobustANGLE:
+        case EntryPoint::GLGetTexLevelParameterivRobustANGLE:
             return "glGetTexLevelParameterivRobustANGLE";
-        case EntryPoint::GetTexParameterIiv:
+        case EntryPoint::GLGetTexParameterIiv:
             return "glGetTexParameterIiv";
-        case EntryPoint::GetTexParameterIivOES:
+        case EntryPoint::GLGetTexParameterIivOES:
             return "glGetTexParameterIivOES";
-        case EntryPoint::GetTexParameterIivRobustANGLE:
+        case EntryPoint::GLGetTexParameterIivRobustANGLE:
             return "glGetTexParameterIivRobustANGLE";
-        case EntryPoint::GetTexParameterIuiv:
+        case EntryPoint::GLGetTexParameterIuiv:
             return "glGetTexParameterIuiv";
-        case EntryPoint::GetTexParameterIuivOES:
+        case EntryPoint::GLGetTexParameterIuivOES:
             return "glGetTexParameterIuivOES";
-        case EntryPoint::GetTexParameterIuivRobustANGLE:
+        case EntryPoint::GLGetTexParameterIuivRobustANGLE:
             return "glGetTexParameterIuivRobustANGLE";
-        case EntryPoint::GetTexParameterfv:
+        case EntryPoint::GLGetTexParameterfv:
             return "glGetTexParameterfv";
-        case EntryPoint::GetTexParameterfvRobustANGLE:
+        case EntryPoint::GLGetTexParameterfvRobustANGLE:
             return "glGetTexParameterfvRobustANGLE";
-        case EntryPoint::GetTexParameteriv:
+        case EntryPoint::GLGetTexParameteriv:
             return "glGetTexParameteriv";
-        case EntryPoint::GetTexParameterivRobustANGLE:
+        case EntryPoint::GLGetTexParameterivRobustANGLE:
             return "glGetTexParameterivRobustANGLE";
-        case EntryPoint::GetTexParameterxv:
+        case EntryPoint::GLGetTexParameterxv:
             return "glGetTexParameterxv";
-        case EntryPoint::GetTextureImage:
+        case EntryPoint::GLGetTextureImage:
             return "glGetTextureImage";
-        case EntryPoint::GetTextureLevelParameterfv:
+        case EntryPoint::GLGetTextureLevelParameterfv:
             return "glGetTextureLevelParameterfv";
-        case EntryPoint::GetTextureLevelParameteriv:
+        case EntryPoint::GLGetTextureLevelParameteriv:
             return "glGetTextureLevelParameteriv";
-        case EntryPoint::GetTextureParameterIiv:
+        case EntryPoint::GLGetTextureParameterIiv:
             return "glGetTextureParameterIiv";
-        case EntryPoint::GetTextureParameterIuiv:
+        case EntryPoint::GLGetTextureParameterIuiv:
             return "glGetTextureParameterIuiv";
-        case EntryPoint::GetTextureParameterfv:
+        case EntryPoint::GLGetTextureParameterfv:
             return "glGetTextureParameterfv";
-        case EntryPoint::GetTextureParameteriv:
+        case EntryPoint::GLGetTextureParameteriv:
             return "glGetTextureParameteriv";
-        case EntryPoint::GetTextureSubImage:
+        case EntryPoint::GLGetTextureSubImage:
             return "glGetTextureSubImage";
-        case EntryPoint::GetTransformFeedbackVarying:
+        case EntryPoint::GLGetTransformFeedbackVarying:
             return "glGetTransformFeedbackVarying";
-        case EntryPoint::GetTransformFeedbacki64_v:
+        case EntryPoint::GLGetTransformFeedbacki64_v:
             return "glGetTransformFeedbacki64_v";
-        case EntryPoint::GetTransformFeedbacki_v:
+        case EntryPoint::GLGetTransformFeedbacki_v:
             return "glGetTransformFeedbacki_v";
-        case EntryPoint::GetTransformFeedbackiv:
+        case EntryPoint::GLGetTransformFeedbackiv:
             return "glGetTransformFeedbackiv";
-        case EntryPoint::GetTranslatedShaderSourceANGLE:
+        case EntryPoint::GLGetTranslatedShaderSourceANGLE:
             return "glGetTranslatedShaderSourceANGLE";
-        case EntryPoint::GetUniformBlockIndex:
+        case EntryPoint::GLGetUniformBlockIndex:
             return "glGetUniformBlockIndex";
-        case EntryPoint::GetUniformIndices:
+        case EntryPoint::GLGetUniformIndices:
             return "glGetUniformIndices";
-        case EntryPoint::GetUniformLocation:
+        case EntryPoint::GLGetUniformLocation:
             return "glGetUniformLocation";
-        case EntryPoint::GetUniformSubroutineuiv:
+        case EntryPoint::GLGetUniformSubroutineuiv:
             return "glGetUniformSubroutineuiv";
-        case EntryPoint::GetUniformdv:
+        case EntryPoint::GLGetUniformdv:
             return "glGetUniformdv";
-        case EntryPoint::GetUniformfv:
+        case EntryPoint::GLGetUniformfv:
             return "glGetUniformfv";
-        case EntryPoint::GetUniformfvRobustANGLE:
+        case EntryPoint::GLGetUniformfvRobustANGLE:
             return "glGetUniformfvRobustANGLE";
-        case EntryPoint::GetUniformiv:
+        case EntryPoint::GLGetUniformiv:
             return "glGetUniformiv";
-        case EntryPoint::GetUniformivRobustANGLE:
+        case EntryPoint::GLGetUniformivRobustANGLE:
             return "glGetUniformivRobustANGLE";
-        case EntryPoint::GetUniformuiv:
+        case EntryPoint::GLGetUniformuiv:
             return "glGetUniformuiv";
-        case EntryPoint::GetUniformuivRobustANGLE:
+        case EntryPoint::GLGetUniformuivRobustANGLE:
             return "glGetUniformuivRobustANGLE";
-        case EntryPoint::GetUnsignedBytei_vEXT:
+        case EntryPoint::GLGetUnsignedBytei_vEXT:
             return "glGetUnsignedBytei_vEXT";
-        case EntryPoint::GetUnsignedBytevEXT:
+        case EntryPoint::GLGetUnsignedBytevEXT:
             return "glGetUnsignedBytevEXT";
-        case EntryPoint::GetVertexArrayIndexed64iv:
+        case EntryPoint::GLGetVertexArrayIndexed64iv:
             return "glGetVertexArrayIndexed64iv";
-        case EntryPoint::GetVertexArrayIndexediv:
+        case EntryPoint::GLGetVertexArrayIndexediv:
             return "glGetVertexArrayIndexediv";
-        case EntryPoint::GetVertexArrayiv:
+        case EntryPoint::GLGetVertexArrayiv:
             return "glGetVertexArrayiv";
-        case EntryPoint::GetVertexAttribIiv:
+        case EntryPoint::GLGetVertexAttribIiv:
             return "glGetVertexAttribIiv";
-        case EntryPoint::GetVertexAttribIivRobustANGLE:
+        case EntryPoint::GLGetVertexAttribIivRobustANGLE:
             return "glGetVertexAttribIivRobustANGLE";
-        case EntryPoint::GetVertexAttribIuiv:
+        case EntryPoint::GLGetVertexAttribIuiv:
             return "glGetVertexAttribIuiv";
-        case EntryPoint::GetVertexAttribIuivRobustANGLE:
+        case EntryPoint::GLGetVertexAttribIuivRobustANGLE:
             return "glGetVertexAttribIuivRobustANGLE";
-        case EntryPoint::GetVertexAttribLdv:
+        case EntryPoint::GLGetVertexAttribLdv:
             return "glGetVertexAttribLdv";
-        case EntryPoint::GetVertexAttribPointerv:
+        case EntryPoint::GLGetVertexAttribPointerv:
             return "glGetVertexAttribPointerv";
-        case EntryPoint::GetVertexAttribPointervRobustANGLE:
+        case EntryPoint::GLGetVertexAttribPointervRobustANGLE:
             return "glGetVertexAttribPointervRobustANGLE";
-        case EntryPoint::GetVertexAttribdv:
+        case EntryPoint::GLGetVertexAttribdv:
             return "glGetVertexAttribdv";
-        case EntryPoint::GetVertexAttribfv:
+        case EntryPoint::GLGetVertexAttribfv:
             return "glGetVertexAttribfv";
-        case EntryPoint::GetVertexAttribfvRobustANGLE:
+        case EntryPoint::GLGetVertexAttribfvRobustANGLE:
             return "glGetVertexAttribfvRobustANGLE";
-        case EntryPoint::GetVertexAttribiv:
+        case EntryPoint::GLGetVertexAttribiv:
             return "glGetVertexAttribiv";
-        case EntryPoint::GetVertexAttribivRobustANGLE:
+        case EntryPoint::GLGetVertexAttribivRobustANGLE:
             return "glGetVertexAttribivRobustANGLE";
-        case EntryPoint::GetnColorTable:
+        case EntryPoint::GLGetnColorTable:
             return "glGetnColorTable";
-        case EntryPoint::GetnCompressedTexImage:
+        case EntryPoint::GLGetnCompressedTexImage:
             return "glGetnCompressedTexImage";
-        case EntryPoint::GetnConvolutionFilter:
+        case EntryPoint::GLGetnConvolutionFilter:
             return "glGetnConvolutionFilter";
-        case EntryPoint::GetnHistogram:
+        case EntryPoint::GLGetnHistogram:
             return "glGetnHistogram";
-        case EntryPoint::GetnMapdv:
+        case EntryPoint::GLGetnMapdv:
             return "glGetnMapdv";
-        case EntryPoint::GetnMapfv:
+        case EntryPoint::GLGetnMapfv:
             return "glGetnMapfv";
-        case EntryPoint::GetnMapiv:
+        case EntryPoint::GLGetnMapiv:
             return "glGetnMapiv";
-        case EntryPoint::GetnMinmax:
+        case EntryPoint::GLGetnMinmax:
             return "glGetnMinmax";
-        case EntryPoint::GetnPixelMapfv:
+        case EntryPoint::GLGetnPixelMapfv:
             return "glGetnPixelMapfv";
-        case EntryPoint::GetnPixelMapuiv:
+        case EntryPoint::GLGetnPixelMapuiv:
             return "glGetnPixelMapuiv";
-        case EntryPoint::GetnPixelMapusv:
+        case EntryPoint::GLGetnPixelMapusv:
             return "glGetnPixelMapusv";
-        case EntryPoint::GetnPolygonStipple:
+        case EntryPoint::GLGetnPolygonStipple:
             return "glGetnPolygonStipple";
-        case EntryPoint::GetnSeparableFilter:
+        case EntryPoint::GLGetnSeparableFilter:
             return "glGetnSeparableFilter";
-        case EntryPoint::GetnTexImage:
+        case EntryPoint::GLGetnTexImage:
             return "glGetnTexImage";
-        case EntryPoint::GetnUniformdv:
+        case EntryPoint::GLGetnUniformdv:
             return "glGetnUniformdv";
-        case EntryPoint::GetnUniformfv:
+        case EntryPoint::GLGetnUniformfv:
             return "glGetnUniformfv";
-        case EntryPoint::GetnUniformfvEXT:
+        case EntryPoint::GLGetnUniformfvEXT:
             return "glGetnUniformfvEXT";
-        case EntryPoint::GetnUniformfvRobustANGLE:
+        case EntryPoint::GLGetnUniformfvRobustANGLE:
             return "glGetnUniformfvRobustANGLE";
-        case EntryPoint::GetnUniformiv:
+        case EntryPoint::GLGetnUniformiv:
             return "glGetnUniformiv";
-        case EntryPoint::GetnUniformivEXT:
+        case EntryPoint::GLGetnUniformivEXT:
             return "glGetnUniformivEXT";
-        case EntryPoint::GetnUniformivRobustANGLE:
+        case EntryPoint::GLGetnUniformivRobustANGLE:
             return "glGetnUniformivRobustANGLE";
-        case EntryPoint::GetnUniformuiv:
+        case EntryPoint::GLGetnUniformuiv:
             return "glGetnUniformuiv";
-        case EntryPoint::GetnUniformuivRobustANGLE:
+        case EntryPoint::GLGetnUniformuivRobustANGLE:
             return "glGetnUniformuivRobustANGLE";
-        case EntryPoint::Hint:
+        case EntryPoint::GLHint:
             return "glHint";
-        case EntryPoint::ImportMemoryFdEXT:
+        case EntryPoint::GLImportMemoryFdEXT:
             return "glImportMemoryFdEXT";
-        case EntryPoint::ImportMemoryZirconHandleANGLE:
+        case EntryPoint::GLImportMemoryZirconHandleANGLE:
             return "glImportMemoryZirconHandleANGLE";
-        case EntryPoint::ImportSemaphoreFdEXT:
+        case EntryPoint::GLImportSemaphoreFdEXT:
             return "glImportSemaphoreFdEXT";
-        case EntryPoint::ImportSemaphoreZirconHandleANGLE:
+        case EntryPoint::GLImportSemaphoreZirconHandleANGLE:
             return "glImportSemaphoreZirconHandleANGLE";
-        case EntryPoint::IndexMask:
+        case EntryPoint::GLIndexMask:
             return "glIndexMask";
-        case EntryPoint::IndexPointer:
+        case EntryPoint::GLIndexPointer:
             return "glIndexPointer";
-        case EntryPoint::Indexd:
+        case EntryPoint::GLIndexd:
             return "glIndexd";
-        case EntryPoint::Indexdv:
+        case EntryPoint::GLIndexdv:
             return "glIndexdv";
-        case EntryPoint::Indexf:
+        case EntryPoint::GLIndexf:
             return "glIndexf";
-        case EntryPoint::Indexfv:
+        case EntryPoint::GLIndexfv:
             return "glIndexfv";
-        case EntryPoint::Indexi:
+        case EntryPoint::GLIndexi:
             return "glIndexi";
-        case EntryPoint::Indexiv:
+        case EntryPoint::GLIndexiv:
             return "glIndexiv";
-        case EntryPoint::Indexs:
+        case EntryPoint::GLIndexs:
             return "glIndexs";
-        case EntryPoint::Indexsv:
+        case EntryPoint::GLIndexsv:
             return "glIndexsv";
-        case EntryPoint::Indexub:
+        case EntryPoint::GLIndexub:
             return "glIndexub";
-        case EntryPoint::Indexubv:
+        case EntryPoint::GLIndexubv:
             return "glIndexubv";
-        case EntryPoint::InitNames:
+        case EntryPoint::GLInitNames:
             return "glInitNames";
-        case EntryPoint::InsertEventMarkerEXT:
+        case EntryPoint::GLInsertEventMarkerEXT:
             return "glInsertEventMarkerEXT";
-        case EntryPoint::InterleavedArrays:
+        case EntryPoint::GLInterleavedArrays:
             return "glInterleavedArrays";
-        case EntryPoint::Invalid:
+        case EntryPoint::GLInvalid:
             return "glInvalid";
-        case EntryPoint::InvalidateBufferData:
+        case EntryPoint::GLInvalidateBufferData:
             return "glInvalidateBufferData";
-        case EntryPoint::InvalidateBufferSubData:
+        case EntryPoint::GLInvalidateBufferSubData:
             return "glInvalidateBufferSubData";
-        case EntryPoint::InvalidateFramebuffer:
+        case EntryPoint::GLInvalidateFramebuffer:
             return "glInvalidateFramebuffer";
-        case EntryPoint::InvalidateNamedFramebufferData:
+        case EntryPoint::GLInvalidateNamedFramebufferData:
             return "glInvalidateNamedFramebufferData";
-        case EntryPoint::InvalidateNamedFramebufferSubData:
+        case EntryPoint::GLInvalidateNamedFramebufferSubData:
             return "glInvalidateNamedFramebufferSubData";
-        case EntryPoint::InvalidateSubFramebuffer:
+        case EntryPoint::GLInvalidateSubFramebuffer:
             return "glInvalidateSubFramebuffer";
-        case EntryPoint::InvalidateTexImage:
+        case EntryPoint::GLInvalidateTexImage:
             return "glInvalidateTexImage";
-        case EntryPoint::InvalidateTexSubImage:
+        case EntryPoint::GLInvalidateTexSubImage:
             return "glInvalidateTexSubImage";
-        case EntryPoint::InvalidateTextureANGLE:
+        case EntryPoint::GLInvalidateTextureANGLE:
             return "glInvalidateTextureANGLE";
-        case EntryPoint::IsBuffer:
+        case EntryPoint::GLIsBuffer:
             return "glIsBuffer";
-        case EntryPoint::IsEnabled:
+        case EntryPoint::GLIsEnabled:
             return "glIsEnabled";
-        case EntryPoint::IsEnabledi:
+        case EntryPoint::GLIsEnabledi:
             return "glIsEnabledi";
-        case EntryPoint::IsEnablediEXT:
+        case EntryPoint::GLIsEnablediEXT:
             return "glIsEnablediEXT";
-        case EntryPoint::IsEnablediOES:
+        case EntryPoint::GLIsEnablediOES:
             return "glIsEnablediOES";
-        case EntryPoint::IsFenceNV:
+        case EntryPoint::GLIsFenceNV:
             return "glIsFenceNV";
-        case EntryPoint::IsFramebuffer:
+        case EntryPoint::GLIsFramebuffer:
             return "glIsFramebuffer";
-        case EntryPoint::IsFramebufferOES:
+        case EntryPoint::GLIsFramebufferOES:
             return "glIsFramebufferOES";
-        case EntryPoint::IsList:
+        case EntryPoint::GLIsList:
             return "glIsList";
-        case EntryPoint::IsMemoryObjectEXT:
+        case EntryPoint::GLIsMemoryObjectEXT:
             return "glIsMemoryObjectEXT";
-        case EntryPoint::IsProgram:
+        case EntryPoint::GLIsProgram:
             return "glIsProgram";
-        case EntryPoint::IsProgramPipeline:
+        case EntryPoint::GLIsProgramPipeline:
             return "glIsProgramPipeline";
-        case EntryPoint::IsProgramPipelineEXT:
+        case EntryPoint::GLIsProgramPipelineEXT:
             return "glIsProgramPipelineEXT";
-        case EntryPoint::IsQuery:
+        case EntryPoint::GLIsQuery:
             return "glIsQuery";
-        case EntryPoint::IsQueryEXT:
+        case EntryPoint::GLIsQueryEXT:
             return "glIsQueryEXT";
-        case EntryPoint::IsRenderbuffer:
+        case EntryPoint::GLIsRenderbuffer:
             return "glIsRenderbuffer";
-        case EntryPoint::IsRenderbufferOES:
+        case EntryPoint::GLIsRenderbufferOES:
             return "glIsRenderbufferOES";
-        case EntryPoint::IsSampler:
+        case EntryPoint::GLIsSampler:
             return "glIsSampler";
-        case EntryPoint::IsSemaphoreEXT:
+        case EntryPoint::GLIsSemaphoreEXT:
             return "glIsSemaphoreEXT";
-        case EntryPoint::IsShader:
+        case EntryPoint::GLIsShader:
             return "glIsShader";
-        case EntryPoint::IsSync:
+        case EntryPoint::GLIsSync:
             return "glIsSync";
-        case EntryPoint::IsTexture:
+        case EntryPoint::GLIsTexture:
             return "glIsTexture";
-        case EntryPoint::IsTransformFeedback:
+        case EntryPoint::GLIsTransformFeedback:
             return "glIsTransformFeedback";
-        case EntryPoint::IsVertexArray:
+        case EntryPoint::GLIsVertexArray:
             return "glIsVertexArray";
-        case EntryPoint::IsVertexArrayOES:
+        case EntryPoint::GLIsVertexArrayOES:
             return "glIsVertexArrayOES";
-        case EntryPoint::LightModelf:
+        case EntryPoint::GLLabelObjectEXT:
+            return "glLabelObjectEXT";
+        case EntryPoint::GLLightModelf:
             return "glLightModelf";
-        case EntryPoint::LightModelfv:
+        case EntryPoint::GLLightModelfv:
             return "glLightModelfv";
-        case EntryPoint::LightModeli:
+        case EntryPoint::GLLightModeli:
             return "glLightModeli";
-        case EntryPoint::LightModeliv:
+        case EntryPoint::GLLightModeliv:
             return "glLightModeliv";
-        case EntryPoint::LightModelx:
+        case EntryPoint::GLLightModelx:
             return "glLightModelx";
-        case EntryPoint::LightModelxv:
+        case EntryPoint::GLLightModelxv:
             return "glLightModelxv";
-        case EntryPoint::Lightf:
+        case EntryPoint::GLLightf:
             return "glLightf";
-        case EntryPoint::Lightfv:
+        case EntryPoint::GLLightfv:
             return "glLightfv";
-        case EntryPoint::Lighti:
+        case EntryPoint::GLLighti:
             return "glLighti";
-        case EntryPoint::Lightiv:
+        case EntryPoint::GLLightiv:
             return "glLightiv";
-        case EntryPoint::Lightx:
+        case EntryPoint::GLLightx:
             return "glLightx";
-        case EntryPoint::Lightxv:
+        case EntryPoint::GLLightxv:
             return "glLightxv";
-        case EntryPoint::LineStipple:
+        case EntryPoint::GLLineStipple:
             return "glLineStipple";
-        case EntryPoint::LineWidth:
+        case EntryPoint::GLLineWidth:
             return "glLineWidth";
-        case EntryPoint::LineWidthx:
+        case EntryPoint::GLLineWidthx:
             return "glLineWidthx";
-        case EntryPoint::LinkProgram:
+        case EntryPoint::GLLinkProgram:
             return "glLinkProgram";
-        case EntryPoint::ListBase:
+        case EntryPoint::GLListBase:
             return "glListBase";
-        case EntryPoint::LoadIdentity:
+        case EntryPoint::GLLoadIdentity:
             return "glLoadIdentity";
-        case EntryPoint::LoadMatrixd:
+        case EntryPoint::GLLoadMatrixd:
             return "glLoadMatrixd";
-        case EntryPoint::LoadMatrixf:
+        case EntryPoint::GLLoadMatrixf:
             return "glLoadMatrixf";
-        case EntryPoint::LoadMatrixx:
+        case EntryPoint::GLLoadMatrixx:
             return "glLoadMatrixx";
-        case EntryPoint::LoadName:
+        case EntryPoint::GLLoadName:
             return "glLoadName";
-        case EntryPoint::LoadPaletteFromModelViewMatrixOES:
+        case EntryPoint::GLLoadPaletteFromModelViewMatrixOES:
             return "glLoadPaletteFromModelViewMatrixOES";
-        case EntryPoint::LoadTransposeMatrixd:
+        case EntryPoint::GLLoadTransposeMatrixd:
             return "glLoadTransposeMatrixd";
-        case EntryPoint::LoadTransposeMatrixf:
+        case EntryPoint::GLLoadTransposeMatrixf:
             return "glLoadTransposeMatrixf";
-        case EntryPoint::LogicOp:
+        case EntryPoint::GLLogicOp:
             return "glLogicOp";
-        case EntryPoint::LoseContextCHROMIUM:
+        case EntryPoint::GLLoseContextCHROMIUM:
             return "glLoseContextCHROMIUM";
-        case EntryPoint::Map1d:
+        case EntryPoint::GLMap1d:
             return "glMap1d";
-        case EntryPoint::Map1f:
+        case EntryPoint::GLMap1f:
             return "glMap1f";
-        case EntryPoint::Map2d:
+        case EntryPoint::GLMap2d:
             return "glMap2d";
-        case EntryPoint::Map2f:
+        case EntryPoint::GLMap2f:
             return "glMap2f";
-        case EntryPoint::MapBuffer:
+        case EntryPoint::GLMapBuffer:
             return "glMapBuffer";
-        case EntryPoint::MapBufferOES:
+        case EntryPoint::GLMapBufferOES:
             return "glMapBufferOES";
-        case EntryPoint::MapBufferRange:
+        case EntryPoint::GLMapBufferRange:
             return "glMapBufferRange";
-        case EntryPoint::MapBufferRangeEXT:
+        case EntryPoint::GLMapBufferRangeEXT:
             return "glMapBufferRangeEXT";
-        case EntryPoint::MapGrid1d:
+        case EntryPoint::GLMapGrid1d:
             return "glMapGrid1d";
-        case EntryPoint::MapGrid1f:
+        case EntryPoint::GLMapGrid1f:
             return "glMapGrid1f";
-        case EntryPoint::MapGrid2d:
+        case EntryPoint::GLMapGrid2d:
             return "glMapGrid2d";
-        case EntryPoint::MapGrid2f:
+        case EntryPoint::GLMapGrid2f:
             return "glMapGrid2f";
-        case EntryPoint::MapNamedBuffer:
+        case EntryPoint::GLMapNamedBuffer:
             return "glMapNamedBuffer";
-        case EntryPoint::MapNamedBufferRange:
+        case EntryPoint::GLMapNamedBufferRange:
             return "glMapNamedBufferRange";
-        case EntryPoint::Materialf:
+        case EntryPoint::GLMaterialf:
             return "glMaterialf";
-        case EntryPoint::Materialfv:
+        case EntryPoint::GLMaterialfv:
             return "glMaterialfv";
-        case EntryPoint::Materiali:
+        case EntryPoint::GLMateriali:
             return "glMateriali";
-        case EntryPoint::Materialiv:
+        case EntryPoint::GLMaterialiv:
             return "glMaterialiv";
-        case EntryPoint::Materialx:
+        case EntryPoint::GLMaterialx:
             return "glMaterialx";
-        case EntryPoint::Materialxv:
+        case EntryPoint::GLMaterialxv:
             return "glMaterialxv";
-        case EntryPoint::MatrixIndexPointerOES:
+        case EntryPoint::GLMatrixIndexPointerOES:
             return "glMatrixIndexPointerOES";
-        case EntryPoint::MatrixMode:
+        case EntryPoint::GLMatrixMode:
             return "glMatrixMode";
-        case EntryPoint::MaxShaderCompilerThreadsKHR:
+        case EntryPoint::GLMaxShaderCompilerThreadsKHR:
             return "glMaxShaderCompilerThreadsKHR";
-        case EntryPoint::MemoryBarrier:
+        case EntryPoint::GLMemoryBarrier:
             return "glMemoryBarrier";
-        case EntryPoint::MemoryBarrierByRegion:
+        case EntryPoint::GLMemoryBarrierByRegion:
             return "glMemoryBarrierByRegion";
-        case EntryPoint::MemoryObjectParameterivEXT:
+        case EntryPoint::GLMemoryObjectParameterivEXT:
             return "glMemoryObjectParameterivEXT";
-        case EntryPoint::MinSampleShading:
+        case EntryPoint::GLMinSampleShading:
             return "glMinSampleShading";
-        case EntryPoint::MinSampleShadingOES:
+        case EntryPoint::GLMinSampleShadingOES:
             return "glMinSampleShadingOES";
-        case EntryPoint::MultMatrixd:
+        case EntryPoint::GLMultMatrixd:
             return "glMultMatrixd";
-        case EntryPoint::MultMatrixf:
+        case EntryPoint::GLMultMatrixf:
             return "glMultMatrixf";
-        case EntryPoint::MultMatrixx:
+        case EntryPoint::GLMultMatrixx:
             return "glMultMatrixx";
-        case EntryPoint::MultTransposeMatrixd:
+        case EntryPoint::GLMultTransposeMatrixd:
             return "glMultTransposeMatrixd";
-        case EntryPoint::MultTransposeMatrixf:
+        case EntryPoint::GLMultTransposeMatrixf:
             return "glMultTransposeMatrixf";
-        case EntryPoint::MultiDrawArrays:
+        case EntryPoint::GLMultiDrawArrays:
             return "glMultiDrawArrays";
-        case EntryPoint::MultiDrawArraysANGLE:
+        case EntryPoint::GLMultiDrawArraysANGLE:
             return "glMultiDrawArraysANGLE";
-        case EntryPoint::MultiDrawArraysIndirect:
+        case EntryPoint::GLMultiDrawArraysIndirect:
             return "glMultiDrawArraysIndirect";
-        case EntryPoint::MultiDrawArraysIndirectCount:
+        case EntryPoint::GLMultiDrawArraysIndirectCount:
             return "glMultiDrawArraysIndirectCount";
-        case EntryPoint::MultiDrawArraysInstancedANGLE:
+        case EntryPoint::GLMultiDrawArraysInstancedANGLE:
             return "glMultiDrawArraysInstancedANGLE";
-        case EntryPoint::MultiDrawArraysInstancedBaseInstanceANGLE:
+        case EntryPoint::GLMultiDrawArraysInstancedBaseInstanceANGLE:
             return "glMultiDrawArraysInstancedBaseInstanceANGLE";
-        case EntryPoint::MultiDrawElements:
+        case EntryPoint::GLMultiDrawElements:
             return "glMultiDrawElements";
-        case EntryPoint::MultiDrawElementsANGLE:
+        case EntryPoint::GLMultiDrawElementsANGLE:
             return "glMultiDrawElementsANGLE";
-        case EntryPoint::MultiDrawElementsBaseVertex:
+        case EntryPoint::GLMultiDrawElementsBaseVertex:
             return "glMultiDrawElementsBaseVertex";
-        case EntryPoint::MultiDrawElementsBaseVertexEXT:
+        case EntryPoint::GLMultiDrawElementsBaseVertexEXT:
             return "glMultiDrawElementsBaseVertexEXT";
-        case EntryPoint::MultiDrawElementsIndirect:
+        case EntryPoint::GLMultiDrawElementsIndirect:
             return "glMultiDrawElementsIndirect";
-        case EntryPoint::MultiDrawElementsIndirectCount:
+        case EntryPoint::GLMultiDrawElementsIndirectCount:
             return "glMultiDrawElementsIndirectCount";
-        case EntryPoint::MultiDrawElementsInstancedANGLE:
+        case EntryPoint::GLMultiDrawElementsInstancedANGLE:
             return "glMultiDrawElementsInstancedANGLE";
-        case EntryPoint::MultiDrawElementsInstancedBaseVertexBaseInstanceANGLE:
+        case EntryPoint::GLMultiDrawElementsInstancedBaseVertexBaseInstanceANGLE:
             return "glMultiDrawElementsInstancedBaseVertexBaseInstanceANGLE";
-        case EntryPoint::MultiTexCoord1d:
+        case EntryPoint::GLMultiTexCoord1d:
             return "glMultiTexCoord1d";
-        case EntryPoint::MultiTexCoord1dv:
+        case EntryPoint::GLMultiTexCoord1dv:
             return "glMultiTexCoord1dv";
-        case EntryPoint::MultiTexCoord1f:
+        case EntryPoint::GLMultiTexCoord1f:
             return "glMultiTexCoord1f";
-        case EntryPoint::MultiTexCoord1fv:
+        case EntryPoint::GLMultiTexCoord1fv:
             return "glMultiTexCoord1fv";
-        case EntryPoint::MultiTexCoord1i:
+        case EntryPoint::GLMultiTexCoord1i:
             return "glMultiTexCoord1i";
-        case EntryPoint::MultiTexCoord1iv:
+        case EntryPoint::GLMultiTexCoord1iv:
             return "glMultiTexCoord1iv";
-        case EntryPoint::MultiTexCoord1s:
+        case EntryPoint::GLMultiTexCoord1s:
             return "glMultiTexCoord1s";
-        case EntryPoint::MultiTexCoord1sv:
+        case EntryPoint::GLMultiTexCoord1sv:
             return "glMultiTexCoord1sv";
-        case EntryPoint::MultiTexCoord2d:
+        case EntryPoint::GLMultiTexCoord2d:
             return "glMultiTexCoord2d";
-        case EntryPoint::MultiTexCoord2dv:
+        case EntryPoint::GLMultiTexCoord2dv:
             return "glMultiTexCoord2dv";
-        case EntryPoint::MultiTexCoord2f:
+        case EntryPoint::GLMultiTexCoord2f:
             return "glMultiTexCoord2f";
-        case EntryPoint::MultiTexCoord2fv:
+        case EntryPoint::GLMultiTexCoord2fv:
             return "glMultiTexCoord2fv";
-        case EntryPoint::MultiTexCoord2i:
+        case EntryPoint::GLMultiTexCoord2i:
             return "glMultiTexCoord2i";
-        case EntryPoint::MultiTexCoord2iv:
+        case EntryPoint::GLMultiTexCoord2iv:
             return "glMultiTexCoord2iv";
-        case EntryPoint::MultiTexCoord2s:
+        case EntryPoint::GLMultiTexCoord2s:
             return "glMultiTexCoord2s";
-        case EntryPoint::MultiTexCoord2sv:
+        case EntryPoint::GLMultiTexCoord2sv:
             return "glMultiTexCoord2sv";
-        case EntryPoint::MultiTexCoord3d:
+        case EntryPoint::GLMultiTexCoord3d:
             return "glMultiTexCoord3d";
-        case EntryPoint::MultiTexCoord3dv:
+        case EntryPoint::GLMultiTexCoord3dv:
             return "glMultiTexCoord3dv";
-        case EntryPoint::MultiTexCoord3f:
+        case EntryPoint::GLMultiTexCoord3f:
             return "glMultiTexCoord3f";
-        case EntryPoint::MultiTexCoord3fv:
+        case EntryPoint::GLMultiTexCoord3fv:
             return "glMultiTexCoord3fv";
-        case EntryPoint::MultiTexCoord3i:
+        case EntryPoint::GLMultiTexCoord3i:
             return "glMultiTexCoord3i";
-        case EntryPoint::MultiTexCoord3iv:
+        case EntryPoint::GLMultiTexCoord3iv:
             return "glMultiTexCoord3iv";
-        case EntryPoint::MultiTexCoord3s:
+        case EntryPoint::GLMultiTexCoord3s:
             return "glMultiTexCoord3s";
-        case EntryPoint::MultiTexCoord3sv:
+        case EntryPoint::GLMultiTexCoord3sv:
             return "glMultiTexCoord3sv";
-        case EntryPoint::MultiTexCoord4d:
+        case EntryPoint::GLMultiTexCoord4d:
             return "glMultiTexCoord4d";
-        case EntryPoint::MultiTexCoord4dv:
+        case EntryPoint::GLMultiTexCoord4dv:
             return "glMultiTexCoord4dv";
-        case EntryPoint::MultiTexCoord4f:
+        case EntryPoint::GLMultiTexCoord4f:
             return "glMultiTexCoord4f";
-        case EntryPoint::MultiTexCoord4fv:
+        case EntryPoint::GLMultiTexCoord4fv:
             return "glMultiTexCoord4fv";
-        case EntryPoint::MultiTexCoord4i:
+        case EntryPoint::GLMultiTexCoord4i:
             return "glMultiTexCoord4i";
-        case EntryPoint::MultiTexCoord4iv:
+        case EntryPoint::GLMultiTexCoord4iv:
             return "glMultiTexCoord4iv";
-        case EntryPoint::MultiTexCoord4s:
+        case EntryPoint::GLMultiTexCoord4s:
             return "glMultiTexCoord4s";
-        case EntryPoint::MultiTexCoord4sv:
+        case EntryPoint::GLMultiTexCoord4sv:
             return "glMultiTexCoord4sv";
-        case EntryPoint::MultiTexCoord4x:
+        case EntryPoint::GLMultiTexCoord4x:
             return "glMultiTexCoord4x";
-        case EntryPoint::MultiTexCoordP1ui:
+        case EntryPoint::GLMultiTexCoordP1ui:
             return "glMultiTexCoordP1ui";
-        case EntryPoint::MultiTexCoordP1uiv:
+        case EntryPoint::GLMultiTexCoordP1uiv:
             return "glMultiTexCoordP1uiv";
-        case EntryPoint::MultiTexCoordP2ui:
+        case EntryPoint::GLMultiTexCoordP2ui:
             return "glMultiTexCoordP2ui";
-        case EntryPoint::MultiTexCoordP2uiv:
+        case EntryPoint::GLMultiTexCoordP2uiv:
             return "glMultiTexCoordP2uiv";
-        case EntryPoint::MultiTexCoordP3ui:
+        case EntryPoint::GLMultiTexCoordP3ui:
             return "glMultiTexCoordP3ui";
-        case EntryPoint::MultiTexCoordP3uiv:
+        case EntryPoint::GLMultiTexCoordP3uiv:
             return "glMultiTexCoordP3uiv";
-        case EntryPoint::MultiTexCoordP4ui:
+        case EntryPoint::GLMultiTexCoordP4ui:
             return "glMultiTexCoordP4ui";
-        case EntryPoint::MultiTexCoordP4uiv:
+        case EntryPoint::GLMultiTexCoordP4uiv:
             return "glMultiTexCoordP4uiv";
-        case EntryPoint::NamedBufferData:
+        case EntryPoint::GLNamedBufferData:
             return "glNamedBufferData";
-        case EntryPoint::NamedBufferStorage:
+        case EntryPoint::GLNamedBufferStorage:
             return "glNamedBufferStorage";
-        case EntryPoint::NamedBufferStorageExternalEXT:
+        case EntryPoint::GLNamedBufferStorageExternalEXT:
             return "glNamedBufferStorageExternalEXT";
-        case EntryPoint::NamedBufferSubData:
+        case EntryPoint::GLNamedBufferSubData:
             return "glNamedBufferSubData";
-        case EntryPoint::NamedFramebufferDrawBuffer:
+        case EntryPoint::GLNamedFramebufferDrawBuffer:
             return "glNamedFramebufferDrawBuffer";
-        case EntryPoint::NamedFramebufferDrawBuffers:
+        case EntryPoint::GLNamedFramebufferDrawBuffers:
             return "glNamedFramebufferDrawBuffers";
-        case EntryPoint::NamedFramebufferParameteri:
+        case EntryPoint::GLNamedFramebufferParameteri:
             return "glNamedFramebufferParameteri";
-        case EntryPoint::NamedFramebufferReadBuffer:
+        case EntryPoint::GLNamedFramebufferReadBuffer:
             return "glNamedFramebufferReadBuffer";
-        case EntryPoint::NamedFramebufferRenderbuffer:
+        case EntryPoint::GLNamedFramebufferRenderbuffer:
             return "glNamedFramebufferRenderbuffer";
-        case EntryPoint::NamedFramebufferTexture:
+        case EntryPoint::GLNamedFramebufferTexture:
             return "glNamedFramebufferTexture";
-        case EntryPoint::NamedFramebufferTextureLayer:
+        case EntryPoint::GLNamedFramebufferTextureLayer:
             return "glNamedFramebufferTextureLayer";
-        case EntryPoint::NamedRenderbufferStorage:
+        case EntryPoint::GLNamedRenderbufferStorage:
             return "glNamedRenderbufferStorage";
-        case EntryPoint::NamedRenderbufferStorageMultisample:
+        case EntryPoint::GLNamedRenderbufferStorageMultisample:
             return "glNamedRenderbufferStorageMultisample";
-        case EntryPoint::NewList:
+        case EntryPoint::GLNewList:
             return "glNewList";
-        case EntryPoint::Normal3b:
+        case EntryPoint::GLNormal3b:
             return "glNormal3b";
-        case EntryPoint::Normal3bv:
+        case EntryPoint::GLNormal3bv:
             return "glNormal3bv";
-        case EntryPoint::Normal3d:
+        case EntryPoint::GLNormal3d:
             return "glNormal3d";
-        case EntryPoint::Normal3dv:
+        case EntryPoint::GLNormal3dv:
             return "glNormal3dv";
-        case EntryPoint::Normal3f:
+        case EntryPoint::GLNormal3f:
             return "glNormal3f";
-        case EntryPoint::Normal3fv:
+        case EntryPoint::GLNormal3fv:
             return "glNormal3fv";
-        case EntryPoint::Normal3i:
+        case EntryPoint::GLNormal3i:
             return "glNormal3i";
-        case EntryPoint::Normal3iv:
+        case EntryPoint::GLNormal3iv:
             return "glNormal3iv";
-        case EntryPoint::Normal3s:
+        case EntryPoint::GLNormal3s:
             return "glNormal3s";
-        case EntryPoint::Normal3sv:
+        case EntryPoint::GLNormal3sv:
             return "glNormal3sv";
-        case EntryPoint::Normal3x:
+        case EntryPoint::GLNormal3x:
             return "glNormal3x";
-        case EntryPoint::NormalP3ui:
+        case EntryPoint::GLNormalP3ui:
             return "glNormalP3ui";
-        case EntryPoint::NormalP3uiv:
+        case EntryPoint::GLNormalP3uiv:
             return "glNormalP3uiv";
-        case EntryPoint::NormalPointer:
+        case EntryPoint::GLNormalPointer:
             return "glNormalPointer";
-        case EntryPoint::ObjectLabel:
+        case EntryPoint::GLObjectLabel:
             return "glObjectLabel";
-        case EntryPoint::ObjectLabelKHR:
+        case EntryPoint::GLObjectLabelKHR:
             return "glObjectLabelKHR";
-        case EntryPoint::ObjectPtrLabel:
+        case EntryPoint::GLObjectPtrLabel:
             return "glObjectPtrLabel";
-        case EntryPoint::ObjectPtrLabelKHR:
+        case EntryPoint::GLObjectPtrLabelKHR:
             return "glObjectPtrLabelKHR";
-        case EntryPoint::Ortho:
+        case EntryPoint::GLOrtho:
             return "glOrtho";
-        case EntryPoint::Orthof:
+        case EntryPoint::GLOrthof:
             return "glOrthof";
-        case EntryPoint::Orthox:
+        case EntryPoint::GLOrthox:
             return "glOrthox";
-        case EntryPoint::PassThrough:
+        case EntryPoint::GLPassThrough:
             return "glPassThrough";
-        case EntryPoint::PatchParameterfv:
+        case EntryPoint::GLPatchParameterfv:
             return "glPatchParameterfv";
-        case EntryPoint::PatchParameteri:
+        case EntryPoint::GLPatchParameteri:
             return "glPatchParameteri";
-        case EntryPoint::PatchParameteriEXT:
+        case EntryPoint::GLPatchParameteriEXT:
             return "glPatchParameteriEXT";
-        case EntryPoint::PauseTransformFeedback:
+        case EntryPoint::GLPauseTransformFeedback:
             return "glPauseTransformFeedback";
-        case EntryPoint::PixelMapfv:
+        case EntryPoint::GLPixelMapfv:
             return "glPixelMapfv";
-        case EntryPoint::PixelMapuiv:
+        case EntryPoint::GLPixelMapuiv:
             return "glPixelMapuiv";
-        case EntryPoint::PixelMapusv:
+        case EntryPoint::GLPixelMapusv:
             return "glPixelMapusv";
-        case EntryPoint::PixelStoref:
+        case EntryPoint::GLPixelStoref:
             return "glPixelStoref";
-        case EntryPoint::PixelStorei:
+        case EntryPoint::GLPixelStorei:
             return "glPixelStorei";
-        case EntryPoint::PixelTransferf:
+        case EntryPoint::GLPixelTransferf:
             return "glPixelTransferf";
-        case EntryPoint::PixelTransferi:
+        case EntryPoint::GLPixelTransferi:
             return "glPixelTransferi";
-        case EntryPoint::PixelZoom:
+        case EntryPoint::GLPixelZoom:
             return "glPixelZoom";
-        case EntryPoint::PointParameterf:
+        case EntryPoint::GLPointParameterf:
             return "glPointParameterf";
-        case EntryPoint::PointParameterfv:
+        case EntryPoint::GLPointParameterfv:
             return "glPointParameterfv";
-        case EntryPoint::PointParameteri:
+        case EntryPoint::GLPointParameteri:
             return "glPointParameteri";
-        case EntryPoint::PointParameteriv:
+        case EntryPoint::GLPointParameteriv:
             return "glPointParameteriv";
-        case EntryPoint::PointParameterx:
+        case EntryPoint::GLPointParameterx:
             return "glPointParameterx";
-        case EntryPoint::PointParameterxv:
+        case EntryPoint::GLPointParameterxv:
             return "glPointParameterxv";
-        case EntryPoint::PointSize:
+        case EntryPoint::GLPointSize:
             return "glPointSize";
-        case EntryPoint::PointSizePointerOES:
+        case EntryPoint::GLPointSizePointerOES:
             return "glPointSizePointerOES";
-        case EntryPoint::PointSizex:
+        case EntryPoint::GLPointSizex:
             return "glPointSizex";
-        case EntryPoint::PolygonMode:
+        case EntryPoint::GLPolygonMode:
             return "glPolygonMode";
-        case EntryPoint::PolygonOffset:
+        case EntryPoint::GLPolygonOffset:
             return "glPolygonOffset";
-        case EntryPoint::PolygonOffsetClamp:
+        case EntryPoint::GLPolygonOffsetClamp:
             return "glPolygonOffsetClamp";
-        case EntryPoint::PolygonOffsetx:
+        case EntryPoint::GLPolygonOffsetx:
             return "glPolygonOffsetx";
-        case EntryPoint::PolygonStipple:
+        case EntryPoint::GLPolygonStipple:
             return "glPolygonStipple";
-        case EntryPoint::PopAttrib:
+        case EntryPoint::GLPopAttrib:
             return "glPopAttrib";
-        case EntryPoint::PopClientAttrib:
+        case EntryPoint::GLPopClientAttrib:
             return "glPopClientAttrib";
-        case EntryPoint::PopDebugGroup:
+        case EntryPoint::GLPopDebugGroup:
             return "glPopDebugGroup";
-        case EntryPoint::PopDebugGroupKHR:
+        case EntryPoint::GLPopDebugGroupKHR:
             return "glPopDebugGroupKHR";
-        case EntryPoint::PopGroupMarkerEXT:
+        case EntryPoint::GLPopGroupMarkerEXT:
             return "glPopGroupMarkerEXT";
-        case EntryPoint::PopMatrix:
+        case EntryPoint::GLPopMatrix:
             return "glPopMatrix";
-        case EntryPoint::PopName:
+        case EntryPoint::GLPopName:
             return "glPopName";
-        case EntryPoint::PrimitiveBoundingBox:
+        case EntryPoint::GLPrimitiveBoundingBox:
             return "glPrimitiveBoundingBox";
-        case EntryPoint::PrimitiveRestartIndex:
+        case EntryPoint::GLPrimitiveRestartIndex:
             return "glPrimitiveRestartIndex";
-        case EntryPoint::PrioritizeTextures:
+        case EntryPoint::GLPrioritizeTextures:
             return "glPrioritizeTextures";
-        case EntryPoint::ProgramBinary:
+        case EntryPoint::GLProgramBinary:
             return "glProgramBinary";
-        case EntryPoint::ProgramBinaryOES:
+        case EntryPoint::GLProgramBinaryOES:
             return "glProgramBinaryOES";
-        case EntryPoint::ProgramParameteri:
+        case EntryPoint::GLProgramParameteri:
             return "glProgramParameteri";
-        case EntryPoint::ProgramParameteriEXT:
+        case EntryPoint::GLProgramParameteriEXT:
             return "glProgramParameteriEXT";
-        case EntryPoint::ProgramUniform1d:
+        case EntryPoint::GLProgramUniform1d:
             return "glProgramUniform1d";
-        case EntryPoint::ProgramUniform1dv:
+        case EntryPoint::GLProgramUniform1dv:
             return "glProgramUniform1dv";
-        case EntryPoint::ProgramUniform1f:
+        case EntryPoint::GLProgramUniform1f:
             return "glProgramUniform1f";
-        case EntryPoint::ProgramUniform1fEXT:
+        case EntryPoint::GLProgramUniform1fEXT:
             return "glProgramUniform1fEXT";
-        case EntryPoint::ProgramUniform1fv:
+        case EntryPoint::GLProgramUniform1fv:
             return "glProgramUniform1fv";
-        case EntryPoint::ProgramUniform1fvEXT:
+        case EntryPoint::GLProgramUniform1fvEXT:
             return "glProgramUniform1fvEXT";
-        case EntryPoint::ProgramUniform1i:
+        case EntryPoint::GLProgramUniform1i:
             return "glProgramUniform1i";
-        case EntryPoint::ProgramUniform1iEXT:
+        case EntryPoint::GLProgramUniform1iEXT:
             return "glProgramUniform1iEXT";
-        case EntryPoint::ProgramUniform1iv:
+        case EntryPoint::GLProgramUniform1iv:
             return "glProgramUniform1iv";
-        case EntryPoint::ProgramUniform1ivEXT:
+        case EntryPoint::GLProgramUniform1ivEXT:
             return "glProgramUniform1ivEXT";
-        case EntryPoint::ProgramUniform1ui:
+        case EntryPoint::GLProgramUniform1ui:
             return "glProgramUniform1ui";
-        case EntryPoint::ProgramUniform1uiEXT:
+        case EntryPoint::GLProgramUniform1uiEXT:
             return "glProgramUniform1uiEXT";
-        case EntryPoint::ProgramUniform1uiv:
+        case EntryPoint::GLProgramUniform1uiv:
             return "glProgramUniform1uiv";
-        case EntryPoint::ProgramUniform1uivEXT:
+        case EntryPoint::GLProgramUniform1uivEXT:
             return "glProgramUniform1uivEXT";
-        case EntryPoint::ProgramUniform2d:
+        case EntryPoint::GLProgramUniform2d:
             return "glProgramUniform2d";
-        case EntryPoint::ProgramUniform2dv:
+        case EntryPoint::GLProgramUniform2dv:
             return "glProgramUniform2dv";
-        case EntryPoint::ProgramUniform2f:
+        case EntryPoint::GLProgramUniform2f:
             return "glProgramUniform2f";
-        case EntryPoint::ProgramUniform2fEXT:
+        case EntryPoint::GLProgramUniform2fEXT:
             return "glProgramUniform2fEXT";
-        case EntryPoint::ProgramUniform2fv:
+        case EntryPoint::GLProgramUniform2fv:
             return "glProgramUniform2fv";
-        case EntryPoint::ProgramUniform2fvEXT:
+        case EntryPoint::GLProgramUniform2fvEXT:
             return "glProgramUniform2fvEXT";
-        case EntryPoint::ProgramUniform2i:
+        case EntryPoint::GLProgramUniform2i:
             return "glProgramUniform2i";
-        case EntryPoint::ProgramUniform2iEXT:
+        case EntryPoint::GLProgramUniform2iEXT:
             return "glProgramUniform2iEXT";
-        case EntryPoint::ProgramUniform2iv:
+        case EntryPoint::GLProgramUniform2iv:
             return "glProgramUniform2iv";
-        case EntryPoint::ProgramUniform2ivEXT:
+        case EntryPoint::GLProgramUniform2ivEXT:
             return "glProgramUniform2ivEXT";
-        case EntryPoint::ProgramUniform2ui:
+        case EntryPoint::GLProgramUniform2ui:
             return "glProgramUniform2ui";
-        case EntryPoint::ProgramUniform2uiEXT:
+        case EntryPoint::GLProgramUniform2uiEXT:
             return "glProgramUniform2uiEXT";
-        case EntryPoint::ProgramUniform2uiv:
+        case EntryPoint::GLProgramUniform2uiv:
             return "glProgramUniform2uiv";
-        case EntryPoint::ProgramUniform2uivEXT:
+        case EntryPoint::GLProgramUniform2uivEXT:
             return "glProgramUniform2uivEXT";
-        case EntryPoint::ProgramUniform3d:
+        case EntryPoint::GLProgramUniform3d:
             return "glProgramUniform3d";
-        case EntryPoint::ProgramUniform3dv:
+        case EntryPoint::GLProgramUniform3dv:
             return "glProgramUniform3dv";
-        case EntryPoint::ProgramUniform3f:
+        case EntryPoint::GLProgramUniform3f:
             return "glProgramUniform3f";
-        case EntryPoint::ProgramUniform3fEXT:
+        case EntryPoint::GLProgramUniform3fEXT:
             return "glProgramUniform3fEXT";
-        case EntryPoint::ProgramUniform3fv:
+        case EntryPoint::GLProgramUniform3fv:
             return "glProgramUniform3fv";
-        case EntryPoint::ProgramUniform3fvEXT:
+        case EntryPoint::GLProgramUniform3fvEXT:
             return "glProgramUniform3fvEXT";
-        case EntryPoint::ProgramUniform3i:
+        case EntryPoint::GLProgramUniform3i:
             return "glProgramUniform3i";
-        case EntryPoint::ProgramUniform3iEXT:
+        case EntryPoint::GLProgramUniform3iEXT:
             return "glProgramUniform3iEXT";
-        case EntryPoint::ProgramUniform3iv:
+        case EntryPoint::GLProgramUniform3iv:
             return "glProgramUniform3iv";
-        case EntryPoint::ProgramUniform3ivEXT:
+        case EntryPoint::GLProgramUniform3ivEXT:
             return "glProgramUniform3ivEXT";
-        case EntryPoint::ProgramUniform3ui:
+        case EntryPoint::GLProgramUniform3ui:
             return "glProgramUniform3ui";
-        case EntryPoint::ProgramUniform3uiEXT:
+        case EntryPoint::GLProgramUniform3uiEXT:
             return "glProgramUniform3uiEXT";
-        case EntryPoint::ProgramUniform3uiv:
+        case EntryPoint::GLProgramUniform3uiv:
             return "glProgramUniform3uiv";
-        case EntryPoint::ProgramUniform3uivEXT:
+        case EntryPoint::GLProgramUniform3uivEXT:
             return "glProgramUniform3uivEXT";
-        case EntryPoint::ProgramUniform4d:
+        case EntryPoint::GLProgramUniform4d:
             return "glProgramUniform4d";
-        case EntryPoint::ProgramUniform4dv:
+        case EntryPoint::GLProgramUniform4dv:
             return "glProgramUniform4dv";
-        case EntryPoint::ProgramUniform4f:
+        case EntryPoint::GLProgramUniform4f:
             return "glProgramUniform4f";
-        case EntryPoint::ProgramUniform4fEXT:
+        case EntryPoint::GLProgramUniform4fEXT:
             return "glProgramUniform4fEXT";
-        case EntryPoint::ProgramUniform4fv:
+        case EntryPoint::GLProgramUniform4fv:
             return "glProgramUniform4fv";
-        case EntryPoint::ProgramUniform4fvEXT:
+        case EntryPoint::GLProgramUniform4fvEXT:
             return "glProgramUniform4fvEXT";
-        case EntryPoint::ProgramUniform4i:
+        case EntryPoint::GLProgramUniform4i:
             return "glProgramUniform4i";
-        case EntryPoint::ProgramUniform4iEXT:
+        case EntryPoint::GLProgramUniform4iEXT:
             return "glProgramUniform4iEXT";
-        case EntryPoint::ProgramUniform4iv:
+        case EntryPoint::GLProgramUniform4iv:
             return "glProgramUniform4iv";
-        case EntryPoint::ProgramUniform4ivEXT:
+        case EntryPoint::GLProgramUniform4ivEXT:
             return "glProgramUniform4ivEXT";
-        case EntryPoint::ProgramUniform4ui:
+        case EntryPoint::GLProgramUniform4ui:
             return "glProgramUniform4ui";
-        case EntryPoint::ProgramUniform4uiEXT:
+        case EntryPoint::GLProgramUniform4uiEXT:
             return "glProgramUniform4uiEXT";
-        case EntryPoint::ProgramUniform4uiv:
+        case EntryPoint::GLProgramUniform4uiv:
             return "glProgramUniform4uiv";
-        case EntryPoint::ProgramUniform4uivEXT:
+        case EntryPoint::GLProgramUniform4uivEXT:
             return "glProgramUniform4uivEXT";
-        case EntryPoint::ProgramUniformMatrix2dv:
+        case EntryPoint::GLProgramUniformMatrix2dv:
             return "glProgramUniformMatrix2dv";
-        case EntryPoint::ProgramUniformMatrix2fv:
+        case EntryPoint::GLProgramUniformMatrix2fv:
             return "glProgramUniformMatrix2fv";
-        case EntryPoint::ProgramUniformMatrix2fvEXT:
+        case EntryPoint::GLProgramUniformMatrix2fvEXT:
             return "glProgramUniformMatrix2fvEXT";
-        case EntryPoint::ProgramUniformMatrix2x3dv:
+        case EntryPoint::GLProgramUniformMatrix2x3dv:
             return "glProgramUniformMatrix2x3dv";
-        case EntryPoint::ProgramUniformMatrix2x3fv:
+        case EntryPoint::GLProgramUniformMatrix2x3fv:
             return "glProgramUniformMatrix2x3fv";
-        case EntryPoint::ProgramUniformMatrix2x3fvEXT:
+        case EntryPoint::GLProgramUniformMatrix2x3fvEXT:
             return "glProgramUniformMatrix2x3fvEXT";
-        case EntryPoint::ProgramUniformMatrix2x4dv:
+        case EntryPoint::GLProgramUniformMatrix2x4dv:
             return "glProgramUniformMatrix2x4dv";
-        case EntryPoint::ProgramUniformMatrix2x4fv:
+        case EntryPoint::GLProgramUniformMatrix2x4fv:
             return "glProgramUniformMatrix2x4fv";
-        case EntryPoint::ProgramUniformMatrix2x4fvEXT:
+        case EntryPoint::GLProgramUniformMatrix2x4fvEXT:
             return "glProgramUniformMatrix2x4fvEXT";
-        case EntryPoint::ProgramUniformMatrix3dv:
+        case EntryPoint::GLProgramUniformMatrix3dv:
             return "glProgramUniformMatrix3dv";
-        case EntryPoint::ProgramUniformMatrix3fv:
+        case EntryPoint::GLProgramUniformMatrix3fv:
             return "glProgramUniformMatrix3fv";
-        case EntryPoint::ProgramUniformMatrix3fvEXT:
+        case EntryPoint::GLProgramUniformMatrix3fvEXT:
             return "glProgramUniformMatrix3fvEXT";
-        case EntryPoint::ProgramUniformMatrix3x2dv:
+        case EntryPoint::GLProgramUniformMatrix3x2dv:
             return "glProgramUniformMatrix3x2dv";
-        case EntryPoint::ProgramUniformMatrix3x2fv:
+        case EntryPoint::GLProgramUniformMatrix3x2fv:
             return "glProgramUniformMatrix3x2fv";
-        case EntryPoint::ProgramUniformMatrix3x2fvEXT:
+        case EntryPoint::GLProgramUniformMatrix3x2fvEXT:
             return "glProgramUniformMatrix3x2fvEXT";
-        case EntryPoint::ProgramUniformMatrix3x4dv:
+        case EntryPoint::GLProgramUniformMatrix3x4dv:
             return "glProgramUniformMatrix3x4dv";
-        case EntryPoint::ProgramUniformMatrix3x4fv:
+        case EntryPoint::GLProgramUniformMatrix3x4fv:
             return "glProgramUniformMatrix3x4fv";
-        case EntryPoint::ProgramUniformMatrix3x4fvEXT:
+        case EntryPoint::GLProgramUniformMatrix3x4fvEXT:
             return "glProgramUniformMatrix3x4fvEXT";
-        case EntryPoint::ProgramUniformMatrix4dv:
+        case EntryPoint::GLProgramUniformMatrix4dv:
             return "glProgramUniformMatrix4dv";
-        case EntryPoint::ProgramUniformMatrix4fv:
+        case EntryPoint::GLProgramUniformMatrix4fv:
             return "glProgramUniformMatrix4fv";
-        case EntryPoint::ProgramUniformMatrix4fvEXT:
+        case EntryPoint::GLProgramUniformMatrix4fvEXT:
             return "glProgramUniformMatrix4fvEXT";
-        case EntryPoint::ProgramUniformMatrix4x2dv:
+        case EntryPoint::GLProgramUniformMatrix4x2dv:
             return "glProgramUniformMatrix4x2dv";
-        case EntryPoint::ProgramUniformMatrix4x2fv:
+        case EntryPoint::GLProgramUniformMatrix4x2fv:
             return "glProgramUniformMatrix4x2fv";
-        case EntryPoint::ProgramUniformMatrix4x2fvEXT:
+        case EntryPoint::GLProgramUniformMatrix4x2fvEXT:
             return "glProgramUniformMatrix4x2fvEXT";
-        case EntryPoint::ProgramUniformMatrix4x3dv:
+        case EntryPoint::GLProgramUniformMatrix4x3dv:
             return "glProgramUniformMatrix4x3dv";
-        case EntryPoint::ProgramUniformMatrix4x3fv:
+        case EntryPoint::GLProgramUniformMatrix4x3fv:
             return "glProgramUniformMatrix4x3fv";
-        case EntryPoint::ProgramUniformMatrix4x3fvEXT:
+        case EntryPoint::GLProgramUniformMatrix4x3fvEXT:
             return "glProgramUniformMatrix4x3fvEXT";
-        case EntryPoint::ProvokingVertex:
+        case EntryPoint::GLProvokingVertex:
             return "glProvokingVertex";
-        case EntryPoint::ProvokingVertexANGLE:
+        case EntryPoint::GLProvokingVertexANGLE:
             return "glProvokingVertexANGLE";
-        case EntryPoint::PushAttrib:
+        case EntryPoint::GLPushAttrib:
             return "glPushAttrib";
-        case EntryPoint::PushClientAttrib:
+        case EntryPoint::GLPushClientAttrib:
             return "glPushClientAttrib";
-        case EntryPoint::PushDebugGroup:
+        case EntryPoint::GLPushDebugGroup:
             return "glPushDebugGroup";
-        case EntryPoint::PushDebugGroupKHR:
+        case EntryPoint::GLPushDebugGroupKHR:
             return "glPushDebugGroupKHR";
-        case EntryPoint::PushGroupMarkerEXT:
+        case EntryPoint::GLPushGroupMarkerEXT:
             return "glPushGroupMarkerEXT";
-        case EntryPoint::PushMatrix:
+        case EntryPoint::GLPushMatrix:
             return "glPushMatrix";
-        case EntryPoint::PushName:
+        case EntryPoint::GLPushName:
             return "glPushName";
-        case EntryPoint::QueryCounter:
+        case EntryPoint::GLQueryCounter:
             return "glQueryCounter";
-        case EntryPoint::QueryCounterEXT:
+        case EntryPoint::GLQueryCounterEXT:
             return "glQueryCounterEXT";
-        case EntryPoint::QueryMatrixxOES:
+        case EntryPoint::GLQueryMatrixxOES:
             return "glQueryMatrixxOES";
-        case EntryPoint::RasterPos2d:
+        case EntryPoint::GLRasterPos2d:
             return "glRasterPos2d";
-        case EntryPoint::RasterPos2dv:
+        case EntryPoint::GLRasterPos2dv:
             return "glRasterPos2dv";
-        case EntryPoint::RasterPos2f:
+        case EntryPoint::GLRasterPos2f:
             return "glRasterPos2f";
-        case EntryPoint::RasterPos2fv:
+        case EntryPoint::GLRasterPos2fv:
             return "glRasterPos2fv";
-        case EntryPoint::RasterPos2i:
+        case EntryPoint::GLRasterPos2i:
             return "glRasterPos2i";
-        case EntryPoint::RasterPos2iv:
+        case EntryPoint::GLRasterPos2iv:
             return "glRasterPos2iv";
-        case EntryPoint::RasterPos2s:
+        case EntryPoint::GLRasterPos2s:
             return "glRasterPos2s";
-        case EntryPoint::RasterPos2sv:
+        case EntryPoint::GLRasterPos2sv:
             return "glRasterPos2sv";
-        case EntryPoint::RasterPos3d:
+        case EntryPoint::GLRasterPos3d:
             return "glRasterPos3d";
-        case EntryPoint::RasterPos3dv:
+        case EntryPoint::GLRasterPos3dv:
             return "glRasterPos3dv";
-        case EntryPoint::RasterPos3f:
+        case EntryPoint::GLRasterPos3f:
             return "glRasterPos3f";
-        case EntryPoint::RasterPos3fv:
+        case EntryPoint::GLRasterPos3fv:
             return "glRasterPos3fv";
-        case EntryPoint::RasterPos3i:
+        case EntryPoint::GLRasterPos3i:
             return "glRasterPos3i";
-        case EntryPoint::RasterPos3iv:
+        case EntryPoint::GLRasterPos3iv:
             return "glRasterPos3iv";
-        case EntryPoint::RasterPos3s:
+        case EntryPoint::GLRasterPos3s:
             return "glRasterPos3s";
-        case EntryPoint::RasterPos3sv:
+        case EntryPoint::GLRasterPos3sv:
             return "glRasterPos3sv";
-        case EntryPoint::RasterPos4d:
+        case EntryPoint::GLRasterPos4d:
             return "glRasterPos4d";
-        case EntryPoint::RasterPos4dv:
+        case EntryPoint::GLRasterPos4dv:
             return "glRasterPos4dv";
-        case EntryPoint::RasterPos4f:
+        case EntryPoint::GLRasterPos4f:
             return "glRasterPos4f";
-        case EntryPoint::RasterPos4fv:
+        case EntryPoint::GLRasterPos4fv:
             return "glRasterPos4fv";
-        case EntryPoint::RasterPos4i:
+        case EntryPoint::GLRasterPos4i:
             return "glRasterPos4i";
-        case EntryPoint::RasterPos4iv:
+        case EntryPoint::GLRasterPos4iv:
             return "glRasterPos4iv";
-        case EntryPoint::RasterPos4s:
+        case EntryPoint::GLRasterPos4s:
             return "glRasterPos4s";
-        case EntryPoint::RasterPos4sv:
+        case EntryPoint::GLRasterPos4sv:
             return "glRasterPos4sv";
-        case EntryPoint::ReadBuffer:
+        case EntryPoint::GLReadBuffer:
             return "glReadBuffer";
-        case EntryPoint::ReadPixels:
+        case EntryPoint::GLReadPixels:
             return "glReadPixels";
-        case EntryPoint::ReadPixelsRobustANGLE:
+        case EntryPoint::GLReadPixelsRobustANGLE:
             return "glReadPixelsRobustANGLE";
-        case EntryPoint::ReadnPixels:
+        case EntryPoint::GLReadnPixels:
             return "glReadnPixels";
-        case EntryPoint::ReadnPixelsEXT:
+        case EntryPoint::GLReadnPixelsEXT:
             return "glReadnPixelsEXT";
-        case EntryPoint::ReadnPixelsRobustANGLE:
+        case EntryPoint::GLReadnPixelsRobustANGLE:
             return "glReadnPixelsRobustANGLE";
-        case EntryPoint::Rectd:
+        case EntryPoint::GLRectd:
             return "glRectd";
-        case EntryPoint::Rectdv:
+        case EntryPoint::GLRectdv:
             return "glRectdv";
-        case EntryPoint::Rectf:
+        case EntryPoint::GLRectf:
             return "glRectf";
-        case EntryPoint::Rectfv:
+        case EntryPoint::GLRectfv:
             return "glRectfv";
-        case EntryPoint::Recti:
+        case EntryPoint::GLRecti:
             return "glRecti";
-        case EntryPoint::Rectiv:
+        case EntryPoint::GLRectiv:
             return "glRectiv";
-        case EntryPoint::Rects:
+        case EntryPoint::GLRects:
             return "glRects";
-        case EntryPoint::Rectsv:
+        case EntryPoint::GLRectsv:
             return "glRectsv";
-        case EntryPoint::ReleaseShaderCompiler:
+        case EntryPoint::GLReleaseShaderCompiler:
             return "glReleaseShaderCompiler";
-        case EntryPoint::RenderMode:
+        case EntryPoint::GLRenderMode:
             return "glRenderMode";
-        case EntryPoint::RenderbufferStorage:
+        case EntryPoint::GLRenderbufferStorage:
             return "glRenderbufferStorage";
-        case EntryPoint::RenderbufferStorageMultisample:
+        case EntryPoint::GLRenderbufferStorageMultisample:
             return "glRenderbufferStorageMultisample";
-        case EntryPoint::RenderbufferStorageMultisampleANGLE:
+        case EntryPoint::GLRenderbufferStorageMultisampleANGLE:
             return "glRenderbufferStorageMultisampleANGLE";
-        case EntryPoint::RenderbufferStorageMultisampleEXT:
+        case EntryPoint::GLRenderbufferStorageMultisampleEXT:
             return "glRenderbufferStorageMultisampleEXT";
-        case EntryPoint::RenderbufferStorageOES:
+        case EntryPoint::GLRenderbufferStorageOES:
             return "glRenderbufferStorageOES";
-        case EntryPoint::RequestExtensionANGLE:
+        case EntryPoint::GLRequestExtensionANGLE:
             return "glRequestExtensionANGLE";
-        case EntryPoint::ResumeTransformFeedback:
+        case EntryPoint::GLResumeTransformFeedback:
             return "glResumeTransformFeedback";
-        case EntryPoint::Rotated:
+        case EntryPoint::GLRotated:
             return "glRotated";
-        case EntryPoint::Rotatef:
+        case EntryPoint::GLRotatef:
             return "glRotatef";
-        case EntryPoint::Rotatex:
+        case EntryPoint::GLRotatex:
             return "glRotatex";
-        case EntryPoint::SampleCoverage:
+        case EntryPoint::GLSampleCoverage:
             return "glSampleCoverage";
-        case EntryPoint::SampleCoveragex:
+        case EntryPoint::GLSampleCoveragex:
             return "glSampleCoveragex";
-        case EntryPoint::SampleMaski:
+        case EntryPoint::GLSampleMaski:
             return "glSampleMaski";
-        case EntryPoint::SampleMaskiANGLE:
+        case EntryPoint::GLSampleMaskiANGLE:
             return "glSampleMaskiANGLE";
-        case EntryPoint::SamplerParameterIiv:
+        case EntryPoint::GLSamplerParameterIiv:
             return "glSamplerParameterIiv";
-        case EntryPoint::SamplerParameterIivOES:
+        case EntryPoint::GLSamplerParameterIivOES:
             return "glSamplerParameterIivOES";
-        case EntryPoint::SamplerParameterIivRobustANGLE:
+        case EntryPoint::GLSamplerParameterIivRobustANGLE:
             return "glSamplerParameterIivRobustANGLE";
-        case EntryPoint::SamplerParameterIuiv:
+        case EntryPoint::GLSamplerParameterIuiv:
             return "glSamplerParameterIuiv";
-        case EntryPoint::SamplerParameterIuivOES:
+        case EntryPoint::GLSamplerParameterIuivOES:
             return "glSamplerParameterIuivOES";
-        case EntryPoint::SamplerParameterIuivRobustANGLE:
+        case EntryPoint::GLSamplerParameterIuivRobustANGLE:
             return "glSamplerParameterIuivRobustANGLE";
-        case EntryPoint::SamplerParameterf:
+        case EntryPoint::GLSamplerParameterf:
             return "glSamplerParameterf";
-        case EntryPoint::SamplerParameterfv:
+        case EntryPoint::GLSamplerParameterfv:
             return "glSamplerParameterfv";
-        case EntryPoint::SamplerParameterfvRobustANGLE:
+        case EntryPoint::GLSamplerParameterfvRobustANGLE:
             return "glSamplerParameterfvRobustANGLE";
-        case EntryPoint::SamplerParameteri:
+        case EntryPoint::GLSamplerParameteri:
             return "glSamplerParameteri";
-        case EntryPoint::SamplerParameteriv:
+        case EntryPoint::GLSamplerParameteriv:
             return "glSamplerParameteriv";
-        case EntryPoint::SamplerParameterivRobustANGLE:
+        case EntryPoint::GLSamplerParameterivRobustANGLE:
             return "glSamplerParameterivRobustANGLE";
-        case EntryPoint::Scaled:
+        case EntryPoint::GLScaled:
             return "glScaled";
-        case EntryPoint::Scalef:
+        case EntryPoint::GLScalef:
             return "glScalef";
-        case EntryPoint::Scalex:
+        case EntryPoint::GLScalex:
             return "glScalex";
-        case EntryPoint::Scissor:
+        case EntryPoint::GLScissor:
             return "glScissor";
-        case EntryPoint::ScissorArrayv:
+        case EntryPoint::GLScissorArrayv:
             return "glScissorArrayv";
-        case EntryPoint::ScissorIndexed:
+        case EntryPoint::GLScissorIndexed:
             return "glScissorIndexed";
-        case EntryPoint::ScissorIndexedv:
+        case EntryPoint::GLScissorIndexedv:
             return "glScissorIndexedv";
-        case EntryPoint::SecondaryColor3b:
+        case EntryPoint::GLSecondaryColor3b:
             return "glSecondaryColor3b";
-        case EntryPoint::SecondaryColor3bv:
+        case EntryPoint::GLSecondaryColor3bv:
             return "glSecondaryColor3bv";
-        case EntryPoint::SecondaryColor3d:
+        case EntryPoint::GLSecondaryColor3d:
             return "glSecondaryColor3d";
-        case EntryPoint::SecondaryColor3dv:
+        case EntryPoint::GLSecondaryColor3dv:
             return "glSecondaryColor3dv";
-        case EntryPoint::SecondaryColor3f:
+        case EntryPoint::GLSecondaryColor3f:
             return "glSecondaryColor3f";
-        case EntryPoint::SecondaryColor3fv:
+        case EntryPoint::GLSecondaryColor3fv:
             return "glSecondaryColor3fv";
-        case EntryPoint::SecondaryColor3i:
+        case EntryPoint::GLSecondaryColor3i:
             return "glSecondaryColor3i";
-        case EntryPoint::SecondaryColor3iv:
+        case EntryPoint::GLSecondaryColor3iv:
             return "glSecondaryColor3iv";
-        case EntryPoint::SecondaryColor3s:
+        case EntryPoint::GLSecondaryColor3s:
             return "glSecondaryColor3s";
-        case EntryPoint::SecondaryColor3sv:
+        case EntryPoint::GLSecondaryColor3sv:
             return "glSecondaryColor3sv";
-        case EntryPoint::SecondaryColor3ub:
+        case EntryPoint::GLSecondaryColor3ub:
             return "glSecondaryColor3ub";
-        case EntryPoint::SecondaryColor3ubv:
+        case EntryPoint::GLSecondaryColor3ubv:
             return "glSecondaryColor3ubv";
-        case EntryPoint::SecondaryColor3ui:
+        case EntryPoint::GLSecondaryColor3ui:
             return "glSecondaryColor3ui";
-        case EntryPoint::SecondaryColor3uiv:
+        case EntryPoint::GLSecondaryColor3uiv:
             return "glSecondaryColor3uiv";
-        case EntryPoint::SecondaryColor3us:
+        case EntryPoint::GLSecondaryColor3us:
             return "glSecondaryColor3us";
-        case EntryPoint::SecondaryColor3usv:
+        case EntryPoint::GLSecondaryColor3usv:
             return "glSecondaryColor3usv";
-        case EntryPoint::SecondaryColorP3ui:
+        case EntryPoint::GLSecondaryColorP3ui:
             return "glSecondaryColorP3ui";
-        case EntryPoint::SecondaryColorP3uiv:
+        case EntryPoint::GLSecondaryColorP3uiv:
             return "glSecondaryColorP3uiv";
-        case EntryPoint::SecondaryColorPointer:
+        case EntryPoint::GLSecondaryColorPointer:
             return "glSecondaryColorPointer";
-        case EntryPoint::SelectBuffer:
+        case EntryPoint::GLSelectBuffer:
             return "glSelectBuffer";
-        case EntryPoint::SemaphoreParameterui64vEXT:
+        case EntryPoint::GLSemaphoreParameterui64vEXT:
             return "glSemaphoreParameterui64vEXT";
-        case EntryPoint::SetFenceNV:
+        case EntryPoint::GLSetFenceNV:
             return "glSetFenceNV";
-        case EntryPoint::ShadeModel:
+        case EntryPoint::GLShadeModel:
             return "glShadeModel";
-        case EntryPoint::ShaderBinary:
+        case EntryPoint::GLShaderBinary:
             return "glShaderBinary";
-        case EntryPoint::ShaderSource:
+        case EntryPoint::GLShaderSource:
             return "glShaderSource";
-        case EntryPoint::ShaderStorageBlockBinding:
+        case EntryPoint::GLShaderStorageBlockBinding:
             return "glShaderStorageBlockBinding";
-        case EntryPoint::SignalSemaphoreEXT:
+        case EntryPoint::GLSignalSemaphoreEXT:
             return "glSignalSemaphoreEXT";
-        case EntryPoint::SpecializeShader:
+        case EntryPoint::GLSpecializeShader:
             return "glSpecializeShader";
-        case EntryPoint::StencilFunc:
+        case EntryPoint::GLStencilFunc:
             return "glStencilFunc";
-        case EntryPoint::StencilFuncSeparate:
+        case EntryPoint::GLStencilFuncSeparate:
             return "glStencilFuncSeparate";
-        case EntryPoint::StencilMask:
+        case EntryPoint::GLStencilMask:
             return "glStencilMask";
-        case EntryPoint::StencilMaskSeparate:
+        case EntryPoint::GLStencilMaskSeparate:
             return "glStencilMaskSeparate";
-        case EntryPoint::StencilOp:
+        case EntryPoint::GLStencilOp:
             return "glStencilOp";
-        case EntryPoint::StencilOpSeparate:
+        case EntryPoint::GLStencilOpSeparate:
             return "glStencilOpSeparate";
-        case EntryPoint::TestFenceNV:
+        case EntryPoint::GLTestFenceNV:
             return "glTestFenceNV";
-        case EntryPoint::TexBuffer:
+        case EntryPoint::GLTexBuffer:
             return "glTexBuffer";
-        case EntryPoint::TexBufferEXT:
+        case EntryPoint::GLTexBufferEXT:
             return "glTexBufferEXT";
-        case EntryPoint::TexBufferOES:
+        case EntryPoint::GLTexBufferOES:
             return "glTexBufferOES";
-        case EntryPoint::TexBufferRange:
+        case EntryPoint::GLTexBufferRange:
             return "glTexBufferRange";
-        case EntryPoint::TexBufferRangeEXT:
+        case EntryPoint::GLTexBufferRangeEXT:
             return "glTexBufferRangeEXT";
-        case EntryPoint::TexBufferRangeOES:
+        case EntryPoint::GLTexBufferRangeOES:
             return "glTexBufferRangeOES";
-        case EntryPoint::TexCoord1d:
+        case EntryPoint::GLTexCoord1d:
             return "glTexCoord1d";
-        case EntryPoint::TexCoord1dv:
+        case EntryPoint::GLTexCoord1dv:
             return "glTexCoord1dv";
-        case EntryPoint::TexCoord1f:
+        case EntryPoint::GLTexCoord1f:
             return "glTexCoord1f";
-        case EntryPoint::TexCoord1fv:
+        case EntryPoint::GLTexCoord1fv:
             return "glTexCoord1fv";
-        case EntryPoint::TexCoord1i:
+        case EntryPoint::GLTexCoord1i:
             return "glTexCoord1i";
-        case EntryPoint::TexCoord1iv:
+        case EntryPoint::GLTexCoord1iv:
             return "glTexCoord1iv";
-        case EntryPoint::TexCoord1s:
+        case EntryPoint::GLTexCoord1s:
             return "glTexCoord1s";
-        case EntryPoint::TexCoord1sv:
+        case EntryPoint::GLTexCoord1sv:
             return "glTexCoord1sv";
-        case EntryPoint::TexCoord2d:
+        case EntryPoint::GLTexCoord2d:
             return "glTexCoord2d";
-        case EntryPoint::TexCoord2dv:
+        case EntryPoint::GLTexCoord2dv:
             return "glTexCoord2dv";
-        case EntryPoint::TexCoord2f:
+        case EntryPoint::GLTexCoord2f:
             return "glTexCoord2f";
-        case EntryPoint::TexCoord2fv:
+        case EntryPoint::GLTexCoord2fv:
             return "glTexCoord2fv";
-        case EntryPoint::TexCoord2i:
+        case EntryPoint::GLTexCoord2i:
             return "glTexCoord2i";
-        case EntryPoint::TexCoord2iv:
+        case EntryPoint::GLTexCoord2iv:
             return "glTexCoord2iv";
-        case EntryPoint::TexCoord2s:
+        case EntryPoint::GLTexCoord2s:
             return "glTexCoord2s";
-        case EntryPoint::TexCoord2sv:
+        case EntryPoint::GLTexCoord2sv:
             return "glTexCoord2sv";
-        case EntryPoint::TexCoord3d:
+        case EntryPoint::GLTexCoord3d:
             return "glTexCoord3d";
-        case EntryPoint::TexCoord3dv:
+        case EntryPoint::GLTexCoord3dv:
             return "glTexCoord3dv";
-        case EntryPoint::TexCoord3f:
+        case EntryPoint::GLTexCoord3f:
             return "glTexCoord3f";
-        case EntryPoint::TexCoord3fv:
+        case EntryPoint::GLTexCoord3fv:
             return "glTexCoord3fv";
-        case EntryPoint::TexCoord3i:
+        case EntryPoint::GLTexCoord3i:
             return "glTexCoord3i";
-        case EntryPoint::TexCoord3iv:
+        case EntryPoint::GLTexCoord3iv:
             return "glTexCoord3iv";
-        case EntryPoint::TexCoord3s:
+        case EntryPoint::GLTexCoord3s:
             return "glTexCoord3s";
-        case EntryPoint::TexCoord3sv:
+        case EntryPoint::GLTexCoord3sv:
             return "glTexCoord3sv";
-        case EntryPoint::TexCoord4d:
+        case EntryPoint::GLTexCoord4d:
             return "glTexCoord4d";
-        case EntryPoint::TexCoord4dv:
+        case EntryPoint::GLTexCoord4dv:
             return "glTexCoord4dv";
-        case EntryPoint::TexCoord4f:
+        case EntryPoint::GLTexCoord4f:
             return "glTexCoord4f";
-        case EntryPoint::TexCoord4fv:
+        case EntryPoint::GLTexCoord4fv:
             return "glTexCoord4fv";
-        case EntryPoint::TexCoord4i:
+        case EntryPoint::GLTexCoord4i:
             return "glTexCoord4i";
-        case EntryPoint::TexCoord4iv:
+        case EntryPoint::GLTexCoord4iv:
             return "glTexCoord4iv";
-        case EntryPoint::TexCoord4s:
+        case EntryPoint::GLTexCoord4s:
             return "glTexCoord4s";
-        case EntryPoint::TexCoord4sv:
+        case EntryPoint::GLTexCoord4sv:
             return "glTexCoord4sv";
-        case EntryPoint::TexCoordP1ui:
+        case EntryPoint::GLTexCoordP1ui:
             return "glTexCoordP1ui";
-        case EntryPoint::TexCoordP1uiv:
+        case EntryPoint::GLTexCoordP1uiv:
             return "glTexCoordP1uiv";
-        case EntryPoint::TexCoordP2ui:
+        case EntryPoint::GLTexCoordP2ui:
             return "glTexCoordP2ui";
-        case EntryPoint::TexCoordP2uiv:
+        case EntryPoint::GLTexCoordP2uiv:
             return "glTexCoordP2uiv";
-        case EntryPoint::TexCoordP3ui:
+        case EntryPoint::GLTexCoordP3ui:
             return "glTexCoordP3ui";
-        case EntryPoint::TexCoordP3uiv:
+        case EntryPoint::GLTexCoordP3uiv:
             return "glTexCoordP3uiv";
-        case EntryPoint::TexCoordP4ui:
+        case EntryPoint::GLTexCoordP4ui:
             return "glTexCoordP4ui";
-        case EntryPoint::TexCoordP4uiv:
+        case EntryPoint::GLTexCoordP4uiv:
             return "glTexCoordP4uiv";
-        case EntryPoint::TexCoordPointer:
+        case EntryPoint::GLTexCoordPointer:
             return "glTexCoordPointer";
-        case EntryPoint::TexEnvf:
+        case EntryPoint::GLTexEnvf:
             return "glTexEnvf";
-        case EntryPoint::TexEnvfv:
+        case EntryPoint::GLTexEnvfv:
             return "glTexEnvfv";
-        case EntryPoint::TexEnvi:
+        case EntryPoint::GLTexEnvi:
             return "glTexEnvi";
-        case EntryPoint::TexEnviv:
+        case EntryPoint::GLTexEnviv:
             return "glTexEnviv";
-        case EntryPoint::TexEnvx:
+        case EntryPoint::GLTexEnvx:
             return "glTexEnvx";
-        case EntryPoint::TexEnvxv:
+        case EntryPoint::GLTexEnvxv:
             return "glTexEnvxv";
-        case EntryPoint::TexGend:
+        case EntryPoint::GLTexGend:
             return "glTexGend";
-        case EntryPoint::TexGendv:
+        case EntryPoint::GLTexGendv:
             return "glTexGendv";
-        case EntryPoint::TexGenf:
+        case EntryPoint::GLTexGenf:
             return "glTexGenf";
-        case EntryPoint::TexGenfOES:
+        case EntryPoint::GLTexGenfOES:
             return "glTexGenfOES";
-        case EntryPoint::TexGenfv:
+        case EntryPoint::GLTexGenfv:
             return "glTexGenfv";
-        case EntryPoint::TexGenfvOES:
+        case EntryPoint::GLTexGenfvOES:
             return "glTexGenfvOES";
-        case EntryPoint::TexGeni:
+        case EntryPoint::GLTexGeni:
             return "glTexGeni";
-        case EntryPoint::TexGeniOES:
+        case EntryPoint::GLTexGeniOES:
             return "glTexGeniOES";
-        case EntryPoint::TexGeniv:
+        case EntryPoint::GLTexGeniv:
             return "glTexGeniv";
-        case EntryPoint::TexGenivOES:
+        case EntryPoint::GLTexGenivOES:
             return "glTexGenivOES";
-        case EntryPoint::TexGenxOES:
+        case EntryPoint::GLTexGenxOES:
             return "glTexGenxOES";
-        case EntryPoint::TexGenxvOES:
+        case EntryPoint::GLTexGenxvOES:
             return "glTexGenxvOES";
-        case EntryPoint::TexImage1D:
+        case EntryPoint::GLTexImage1D:
             return "glTexImage1D";
-        case EntryPoint::TexImage2D:
+        case EntryPoint::GLTexImage2D:
             return "glTexImage2D";
-        case EntryPoint::TexImage2DExternalANGLE:
+        case EntryPoint::GLTexImage2DExternalANGLE:
             return "glTexImage2DExternalANGLE";
-        case EntryPoint::TexImage2DMultisample:
+        case EntryPoint::GLTexImage2DMultisample:
             return "glTexImage2DMultisample";
-        case EntryPoint::TexImage2DRobustANGLE:
+        case EntryPoint::GLTexImage2DRobustANGLE:
             return "glTexImage2DRobustANGLE";
-        case EntryPoint::TexImage3D:
+        case EntryPoint::GLTexImage3D:
             return "glTexImage3D";
-        case EntryPoint::TexImage3DMultisample:
+        case EntryPoint::GLTexImage3DMultisample:
             return "glTexImage3DMultisample";
-        case EntryPoint::TexImage3DOES:
+        case EntryPoint::GLTexImage3DOES:
             return "glTexImage3DOES";
-        case EntryPoint::TexImage3DRobustANGLE:
+        case EntryPoint::GLTexImage3DRobustANGLE:
             return "glTexImage3DRobustANGLE";
-        case EntryPoint::TexParameterIiv:
+        case EntryPoint::GLTexParameterIiv:
             return "glTexParameterIiv";
-        case EntryPoint::TexParameterIivOES:
+        case EntryPoint::GLTexParameterIivOES:
             return "glTexParameterIivOES";
-        case EntryPoint::TexParameterIivRobustANGLE:
+        case EntryPoint::GLTexParameterIivRobustANGLE:
             return "glTexParameterIivRobustANGLE";
-        case EntryPoint::TexParameterIuiv:
+        case EntryPoint::GLTexParameterIuiv:
             return "glTexParameterIuiv";
-        case EntryPoint::TexParameterIuivOES:
+        case EntryPoint::GLTexParameterIuivOES:
             return "glTexParameterIuivOES";
-        case EntryPoint::TexParameterIuivRobustANGLE:
+        case EntryPoint::GLTexParameterIuivRobustANGLE:
             return "glTexParameterIuivRobustANGLE";
-        case EntryPoint::TexParameterf:
+        case EntryPoint::GLTexParameterf:
             return "glTexParameterf";
-        case EntryPoint::TexParameterfv:
+        case EntryPoint::GLTexParameterfv:
             return "glTexParameterfv";
-        case EntryPoint::TexParameterfvRobustANGLE:
+        case EntryPoint::GLTexParameterfvRobustANGLE:
             return "glTexParameterfvRobustANGLE";
-        case EntryPoint::TexParameteri:
+        case EntryPoint::GLTexParameteri:
             return "glTexParameteri";
-        case EntryPoint::TexParameteriv:
+        case EntryPoint::GLTexParameteriv:
             return "glTexParameteriv";
-        case EntryPoint::TexParameterivRobustANGLE:
+        case EntryPoint::GLTexParameterivRobustANGLE:
             return "glTexParameterivRobustANGLE";
-        case EntryPoint::TexParameterx:
+        case EntryPoint::GLTexParameterx:
             return "glTexParameterx";
-        case EntryPoint::TexParameterxv:
+        case EntryPoint::GLTexParameterxv:
             return "glTexParameterxv";
-        case EntryPoint::TexStorage1D:
+        case EntryPoint::GLTexStorage1D:
             return "glTexStorage1D";
-        case EntryPoint::TexStorage1DEXT:
+        case EntryPoint::GLTexStorage1DEXT:
             return "glTexStorage1DEXT";
-        case EntryPoint::TexStorage2D:
+        case EntryPoint::GLTexStorage2D:
             return "glTexStorage2D";
-        case EntryPoint::TexStorage2DEXT:
+        case EntryPoint::GLTexStorage2DEXT:
             return "glTexStorage2DEXT";
-        case EntryPoint::TexStorage2DMultisample:
+        case EntryPoint::GLTexStorage2DMultisample:
             return "glTexStorage2DMultisample";
-        case EntryPoint::TexStorage2DMultisampleANGLE:
+        case EntryPoint::GLTexStorage2DMultisampleANGLE:
             return "glTexStorage2DMultisampleANGLE";
-        case EntryPoint::TexStorage3D:
+        case EntryPoint::GLTexStorage3D:
             return "glTexStorage3D";
-        case EntryPoint::TexStorage3DEXT:
+        case EntryPoint::GLTexStorage3DEXT:
             return "glTexStorage3DEXT";
-        case EntryPoint::TexStorage3DMultisample:
+        case EntryPoint::GLTexStorage3DMultisample:
             return "glTexStorage3DMultisample";
-        case EntryPoint::TexStorage3DMultisampleOES:
+        case EntryPoint::GLTexStorage3DMultisampleOES:
             return "glTexStorage3DMultisampleOES";
-        case EntryPoint::TexStorageMem2DEXT:
+        case EntryPoint::GLTexStorageMem2DEXT:
             return "glTexStorageMem2DEXT";
-        case EntryPoint::TexStorageMem2DMultisampleEXT:
+        case EntryPoint::GLTexStorageMem2DMultisampleEXT:
             return "glTexStorageMem2DMultisampleEXT";
-        case EntryPoint::TexStorageMem3DEXT:
+        case EntryPoint::GLTexStorageMem3DEXT:
             return "glTexStorageMem3DEXT";
-        case EntryPoint::TexStorageMem3DMultisampleEXT:
+        case EntryPoint::GLTexStorageMem3DMultisampleEXT:
             return "glTexStorageMem3DMultisampleEXT";
-        case EntryPoint::TexStorageMemFlags2DANGLE:
+        case EntryPoint::GLTexStorageMemFlags2DANGLE:
             return "glTexStorageMemFlags2DANGLE";
-        case EntryPoint::TexStorageMemFlags2DMultisampleANGLE:
+        case EntryPoint::GLTexStorageMemFlags2DMultisampleANGLE:
             return "glTexStorageMemFlags2DMultisampleANGLE";
-        case EntryPoint::TexStorageMemFlags3DANGLE:
+        case EntryPoint::GLTexStorageMemFlags3DANGLE:
             return "glTexStorageMemFlags3DANGLE";
-        case EntryPoint::TexStorageMemFlags3DMultisampleANGLE:
+        case EntryPoint::GLTexStorageMemFlags3DMultisampleANGLE:
             return "glTexStorageMemFlags3DMultisampleANGLE";
-        case EntryPoint::TexSubImage1D:
+        case EntryPoint::GLTexSubImage1D:
             return "glTexSubImage1D";
-        case EntryPoint::TexSubImage2D:
+        case EntryPoint::GLTexSubImage2D:
             return "glTexSubImage2D";
-        case EntryPoint::TexSubImage2DRobustANGLE:
+        case EntryPoint::GLTexSubImage2DRobustANGLE:
             return "glTexSubImage2DRobustANGLE";
-        case EntryPoint::TexSubImage3D:
+        case EntryPoint::GLTexSubImage3D:
             return "glTexSubImage3D";
-        case EntryPoint::TexSubImage3DOES:
+        case EntryPoint::GLTexSubImage3DOES:
             return "glTexSubImage3DOES";
-        case EntryPoint::TexSubImage3DRobustANGLE:
+        case EntryPoint::GLTexSubImage3DRobustANGLE:
             return "glTexSubImage3DRobustANGLE";
-        case EntryPoint::TextureBarrier:
+        case EntryPoint::GLTextureBarrier:
             return "glTextureBarrier";
-        case EntryPoint::TextureBuffer:
+        case EntryPoint::GLTextureBuffer:
             return "glTextureBuffer";
-        case EntryPoint::TextureBufferRange:
+        case EntryPoint::GLTextureBufferRange:
             return "glTextureBufferRange";
-        case EntryPoint::TextureParameterIiv:
+        case EntryPoint::GLTextureParameterIiv:
             return "glTextureParameterIiv";
-        case EntryPoint::TextureParameterIuiv:
+        case EntryPoint::GLTextureParameterIuiv:
             return "glTextureParameterIuiv";
-        case EntryPoint::TextureParameterf:
+        case EntryPoint::GLTextureParameterf:
             return "glTextureParameterf";
-        case EntryPoint::TextureParameterfv:
+        case EntryPoint::GLTextureParameterfv:
             return "glTextureParameterfv";
-        case EntryPoint::TextureParameteri:
+        case EntryPoint::GLTextureParameteri:
             return "glTextureParameteri";
-        case EntryPoint::TextureParameteriv:
+        case EntryPoint::GLTextureParameteriv:
             return "glTextureParameteriv";
-        case EntryPoint::TextureStorage1D:
+        case EntryPoint::GLTextureStorage1D:
             return "glTextureStorage1D";
-        case EntryPoint::TextureStorage2D:
+        case EntryPoint::GLTextureStorage2D:
             return "glTextureStorage2D";
-        case EntryPoint::TextureStorage2DMultisample:
+        case EntryPoint::GLTextureStorage2DMultisample:
             return "glTextureStorage2DMultisample";
-        case EntryPoint::TextureStorage3D:
+        case EntryPoint::GLTextureStorage3D:
             return "glTextureStorage3D";
-        case EntryPoint::TextureStorage3DMultisample:
+        case EntryPoint::GLTextureStorage3DMultisample:
             return "glTextureStorage3DMultisample";
-        case EntryPoint::TextureSubImage1D:
+        case EntryPoint::GLTextureSubImage1D:
             return "glTextureSubImage1D";
-        case EntryPoint::TextureSubImage2D:
+        case EntryPoint::GLTextureSubImage2D:
             return "glTextureSubImage2D";
-        case EntryPoint::TextureSubImage3D:
+        case EntryPoint::GLTextureSubImage3D:
             return "glTextureSubImage3D";
-        case EntryPoint::TextureView:
+        case EntryPoint::GLTextureView:
             return "glTextureView";
-        case EntryPoint::TransformFeedbackBufferBase:
+        case EntryPoint::GLTransformFeedbackBufferBase:
             return "glTransformFeedbackBufferBase";
-        case EntryPoint::TransformFeedbackBufferRange:
+        case EntryPoint::GLTransformFeedbackBufferRange:
             return "glTransformFeedbackBufferRange";
-        case EntryPoint::TransformFeedbackVaryings:
+        case EntryPoint::GLTransformFeedbackVaryings:
             return "glTransformFeedbackVaryings";
-        case EntryPoint::Translated:
+        case EntryPoint::GLTranslated:
             return "glTranslated";
-        case EntryPoint::Translatef:
+        case EntryPoint::GLTranslatef:
             return "glTranslatef";
-        case EntryPoint::Translatex:
+        case EntryPoint::GLTranslatex:
             return "glTranslatex";
-        case EntryPoint::Uniform1d:
+        case EntryPoint::GLUniform1d:
             return "glUniform1d";
-        case EntryPoint::Uniform1dv:
+        case EntryPoint::GLUniform1dv:
             return "glUniform1dv";
-        case EntryPoint::Uniform1f:
+        case EntryPoint::GLUniform1f:
             return "glUniform1f";
-        case EntryPoint::Uniform1fv:
+        case EntryPoint::GLUniform1fv:
             return "glUniform1fv";
-        case EntryPoint::Uniform1i:
+        case EntryPoint::GLUniform1i:
             return "glUniform1i";
-        case EntryPoint::Uniform1iv:
+        case EntryPoint::GLUniform1iv:
             return "glUniform1iv";
-        case EntryPoint::Uniform1ui:
+        case EntryPoint::GLUniform1ui:
             return "glUniform1ui";
-        case EntryPoint::Uniform1uiv:
+        case EntryPoint::GLUniform1uiv:
             return "glUniform1uiv";
-        case EntryPoint::Uniform2d:
+        case EntryPoint::GLUniform2d:
             return "glUniform2d";
-        case EntryPoint::Uniform2dv:
+        case EntryPoint::GLUniform2dv:
             return "glUniform2dv";
-        case EntryPoint::Uniform2f:
+        case EntryPoint::GLUniform2f:
             return "glUniform2f";
-        case EntryPoint::Uniform2fv:
+        case EntryPoint::GLUniform2fv:
             return "glUniform2fv";
-        case EntryPoint::Uniform2i:
+        case EntryPoint::GLUniform2i:
             return "glUniform2i";
-        case EntryPoint::Uniform2iv:
+        case EntryPoint::GLUniform2iv:
             return "glUniform2iv";
-        case EntryPoint::Uniform2ui:
+        case EntryPoint::GLUniform2ui:
             return "glUniform2ui";
-        case EntryPoint::Uniform2uiv:
+        case EntryPoint::GLUniform2uiv:
             return "glUniform2uiv";
-        case EntryPoint::Uniform3d:
+        case EntryPoint::GLUniform3d:
             return "glUniform3d";
-        case EntryPoint::Uniform3dv:
+        case EntryPoint::GLUniform3dv:
             return "glUniform3dv";
-        case EntryPoint::Uniform3f:
+        case EntryPoint::GLUniform3f:
             return "glUniform3f";
-        case EntryPoint::Uniform3fv:
+        case EntryPoint::GLUniform3fv:
             return "glUniform3fv";
-        case EntryPoint::Uniform3i:
+        case EntryPoint::GLUniform3i:
             return "glUniform3i";
-        case EntryPoint::Uniform3iv:
+        case EntryPoint::GLUniform3iv:
             return "glUniform3iv";
-        case EntryPoint::Uniform3ui:
+        case EntryPoint::GLUniform3ui:
             return "glUniform3ui";
-        case EntryPoint::Uniform3uiv:
+        case EntryPoint::GLUniform3uiv:
             return "glUniform3uiv";
-        case EntryPoint::Uniform4d:
+        case EntryPoint::GLUniform4d:
             return "glUniform4d";
-        case EntryPoint::Uniform4dv:
+        case EntryPoint::GLUniform4dv:
             return "glUniform4dv";
-        case EntryPoint::Uniform4f:
+        case EntryPoint::GLUniform4f:
             return "glUniform4f";
-        case EntryPoint::Uniform4fv:
+        case EntryPoint::GLUniform4fv:
             return "glUniform4fv";
-        case EntryPoint::Uniform4i:
+        case EntryPoint::GLUniform4i:
             return "glUniform4i";
-        case EntryPoint::Uniform4iv:
+        case EntryPoint::GLUniform4iv:
             return "glUniform4iv";
-        case EntryPoint::Uniform4ui:
+        case EntryPoint::GLUniform4ui:
             return "glUniform4ui";
-        case EntryPoint::Uniform4uiv:
+        case EntryPoint::GLUniform4uiv:
             return "glUniform4uiv";
-        case EntryPoint::UniformBlockBinding:
+        case EntryPoint::GLUniformBlockBinding:
             return "glUniformBlockBinding";
-        case EntryPoint::UniformMatrix2dv:
+        case EntryPoint::GLUniformMatrix2dv:
             return "glUniformMatrix2dv";
-        case EntryPoint::UniformMatrix2fv:
+        case EntryPoint::GLUniformMatrix2fv:
             return "glUniformMatrix2fv";
-        case EntryPoint::UniformMatrix2x3dv:
+        case EntryPoint::GLUniformMatrix2x3dv:
             return "glUniformMatrix2x3dv";
-        case EntryPoint::UniformMatrix2x3fv:
+        case EntryPoint::GLUniformMatrix2x3fv:
             return "glUniformMatrix2x3fv";
-        case EntryPoint::UniformMatrix2x4dv:
+        case EntryPoint::GLUniformMatrix2x4dv:
             return "glUniformMatrix2x4dv";
-        case EntryPoint::UniformMatrix2x4fv:
+        case EntryPoint::GLUniformMatrix2x4fv:
             return "glUniformMatrix2x4fv";
-        case EntryPoint::UniformMatrix3dv:
+        case EntryPoint::GLUniformMatrix3dv:
             return "glUniformMatrix3dv";
-        case EntryPoint::UniformMatrix3fv:
+        case EntryPoint::GLUniformMatrix3fv:
             return "glUniformMatrix3fv";
-        case EntryPoint::UniformMatrix3x2dv:
+        case EntryPoint::GLUniformMatrix3x2dv:
             return "glUniformMatrix3x2dv";
-        case EntryPoint::UniformMatrix3x2fv:
+        case EntryPoint::GLUniformMatrix3x2fv:
             return "glUniformMatrix3x2fv";
-        case EntryPoint::UniformMatrix3x4dv:
+        case EntryPoint::GLUniformMatrix3x4dv:
             return "glUniformMatrix3x4dv";
-        case EntryPoint::UniformMatrix3x4fv:
+        case EntryPoint::GLUniformMatrix3x4fv:
             return "glUniformMatrix3x4fv";
-        case EntryPoint::UniformMatrix4dv:
+        case EntryPoint::GLUniformMatrix4dv:
             return "glUniformMatrix4dv";
-        case EntryPoint::UniformMatrix4fv:
+        case EntryPoint::GLUniformMatrix4fv:
             return "glUniformMatrix4fv";
-        case EntryPoint::UniformMatrix4x2dv:
+        case EntryPoint::GLUniformMatrix4x2dv:
             return "glUniformMatrix4x2dv";
-        case EntryPoint::UniformMatrix4x2fv:
+        case EntryPoint::GLUniformMatrix4x2fv:
             return "glUniformMatrix4x2fv";
-        case EntryPoint::UniformMatrix4x3dv:
+        case EntryPoint::GLUniformMatrix4x3dv:
             return "glUniformMatrix4x3dv";
-        case EntryPoint::UniformMatrix4x3fv:
+        case EntryPoint::GLUniformMatrix4x3fv:
             return "glUniformMatrix4x3fv";
-        case EntryPoint::UniformSubroutinesuiv:
+        case EntryPoint::GLUniformSubroutinesuiv:
             return "glUniformSubroutinesuiv";
-        case EntryPoint::UnmapBuffer:
+        case EntryPoint::GLUnmapBuffer:
             return "glUnmapBuffer";
-        case EntryPoint::UnmapBufferOES:
+        case EntryPoint::GLUnmapBufferOES:
             return "glUnmapBufferOES";
-        case EntryPoint::UnmapNamedBuffer:
+        case EntryPoint::GLUnmapNamedBuffer:
             return "glUnmapNamedBuffer";
-        case EntryPoint::UseProgram:
+        case EntryPoint::GLUseProgram:
             return "glUseProgram";
-        case EntryPoint::UseProgramStages:
+        case EntryPoint::GLUseProgramStages:
             return "glUseProgramStages";
-        case EntryPoint::UseProgramStagesEXT:
+        case EntryPoint::GLUseProgramStagesEXT:
             return "glUseProgramStagesEXT";
-        case EntryPoint::ValidateProgram:
+        case EntryPoint::GLValidateProgram:
             return "glValidateProgram";
-        case EntryPoint::ValidateProgramPipeline:
+        case EntryPoint::GLValidateProgramPipeline:
             return "glValidateProgramPipeline";
-        case EntryPoint::ValidateProgramPipelineEXT:
+        case EntryPoint::GLValidateProgramPipelineEXT:
             return "glValidateProgramPipelineEXT";
-        case EntryPoint::Vertex2d:
+        case EntryPoint::GLVertex2d:
             return "glVertex2d";
-        case EntryPoint::Vertex2dv:
+        case EntryPoint::GLVertex2dv:
             return "glVertex2dv";
-        case EntryPoint::Vertex2f:
+        case EntryPoint::GLVertex2f:
             return "glVertex2f";
-        case EntryPoint::Vertex2fv:
+        case EntryPoint::GLVertex2fv:
             return "glVertex2fv";
-        case EntryPoint::Vertex2i:
+        case EntryPoint::GLVertex2i:
             return "glVertex2i";
-        case EntryPoint::Vertex2iv:
+        case EntryPoint::GLVertex2iv:
             return "glVertex2iv";
-        case EntryPoint::Vertex2s:
+        case EntryPoint::GLVertex2s:
             return "glVertex2s";
-        case EntryPoint::Vertex2sv:
+        case EntryPoint::GLVertex2sv:
             return "glVertex2sv";
-        case EntryPoint::Vertex3d:
+        case EntryPoint::GLVertex3d:
             return "glVertex3d";
-        case EntryPoint::Vertex3dv:
+        case EntryPoint::GLVertex3dv:
             return "glVertex3dv";
-        case EntryPoint::Vertex3f:
+        case EntryPoint::GLVertex3f:
             return "glVertex3f";
-        case EntryPoint::Vertex3fv:
+        case EntryPoint::GLVertex3fv:
             return "glVertex3fv";
-        case EntryPoint::Vertex3i:
+        case EntryPoint::GLVertex3i:
             return "glVertex3i";
-        case EntryPoint::Vertex3iv:
+        case EntryPoint::GLVertex3iv:
             return "glVertex3iv";
-        case EntryPoint::Vertex3s:
+        case EntryPoint::GLVertex3s:
             return "glVertex3s";
-        case EntryPoint::Vertex3sv:
+        case EntryPoint::GLVertex3sv:
             return "glVertex3sv";
-        case EntryPoint::Vertex4d:
+        case EntryPoint::GLVertex4d:
             return "glVertex4d";
-        case EntryPoint::Vertex4dv:
+        case EntryPoint::GLVertex4dv:
             return "glVertex4dv";
-        case EntryPoint::Vertex4f:
+        case EntryPoint::GLVertex4f:
             return "glVertex4f";
-        case EntryPoint::Vertex4fv:
+        case EntryPoint::GLVertex4fv:
             return "glVertex4fv";
-        case EntryPoint::Vertex4i:
+        case EntryPoint::GLVertex4i:
             return "glVertex4i";
-        case EntryPoint::Vertex4iv:
+        case EntryPoint::GLVertex4iv:
             return "glVertex4iv";
-        case EntryPoint::Vertex4s:
+        case EntryPoint::GLVertex4s:
             return "glVertex4s";
-        case EntryPoint::Vertex4sv:
+        case EntryPoint::GLVertex4sv:
             return "glVertex4sv";
-        case EntryPoint::VertexArrayAttribBinding:
+        case EntryPoint::GLVertexArrayAttribBinding:
             return "glVertexArrayAttribBinding";
-        case EntryPoint::VertexArrayAttribFormat:
+        case EntryPoint::GLVertexArrayAttribFormat:
             return "glVertexArrayAttribFormat";
-        case EntryPoint::VertexArrayAttribIFormat:
+        case EntryPoint::GLVertexArrayAttribIFormat:
             return "glVertexArrayAttribIFormat";
-        case EntryPoint::VertexArrayAttribLFormat:
+        case EntryPoint::GLVertexArrayAttribLFormat:
             return "glVertexArrayAttribLFormat";
-        case EntryPoint::VertexArrayBindingDivisor:
+        case EntryPoint::GLVertexArrayBindingDivisor:
             return "glVertexArrayBindingDivisor";
-        case EntryPoint::VertexArrayElementBuffer:
+        case EntryPoint::GLVertexArrayElementBuffer:
             return "glVertexArrayElementBuffer";
-        case EntryPoint::VertexArrayVertexBuffer:
+        case EntryPoint::GLVertexArrayVertexBuffer:
             return "glVertexArrayVertexBuffer";
-        case EntryPoint::VertexArrayVertexBuffers:
+        case EntryPoint::GLVertexArrayVertexBuffers:
             return "glVertexArrayVertexBuffers";
-        case EntryPoint::VertexAttrib1d:
+        case EntryPoint::GLVertexAttrib1d:
             return "glVertexAttrib1d";
-        case EntryPoint::VertexAttrib1dv:
+        case EntryPoint::GLVertexAttrib1dv:
             return "glVertexAttrib1dv";
-        case EntryPoint::VertexAttrib1f:
+        case EntryPoint::GLVertexAttrib1f:
             return "glVertexAttrib1f";
-        case EntryPoint::VertexAttrib1fv:
+        case EntryPoint::GLVertexAttrib1fv:
             return "glVertexAttrib1fv";
-        case EntryPoint::VertexAttrib1s:
+        case EntryPoint::GLVertexAttrib1s:
             return "glVertexAttrib1s";
-        case EntryPoint::VertexAttrib1sv:
+        case EntryPoint::GLVertexAttrib1sv:
             return "glVertexAttrib1sv";
-        case EntryPoint::VertexAttrib2d:
+        case EntryPoint::GLVertexAttrib2d:
             return "glVertexAttrib2d";
-        case EntryPoint::VertexAttrib2dv:
+        case EntryPoint::GLVertexAttrib2dv:
             return "glVertexAttrib2dv";
-        case EntryPoint::VertexAttrib2f:
+        case EntryPoint::GLVertexAttrib2f:
             return "glVertexAttrib2f";
-        case EntryPoint::VertexAttrib2fv:
+        case EntryPoint::GLVertexAttrib2fv:
             return "glVertexAttrib2fv";
-        case EntryPoint::VertexAttrib2s:
+        case EntryPoint::GLVertexAttrib2s:
             return "glVertexAttrib2s";
-        case EntryPoint::VertexAttrib2sv:
+        case EntryPoint::GLVertexAttrib2sv:
             return "glVertexAttrib2sv";
-        case EntryPoint::VertexAttrib3d:
+        case EntryPoint::GLVertexAttrib3d:
             return "glVertexAttrib3d";
-        case EntryPoint::VertexAttrib3dv:
+        case EntryPoint::GLVertexAttrib3dv:
             return "glVertexAttrib3dv";
-        case EntryPoint::VertexAttrib3f:
+        case EntryPoint::GLVertexAttrib3f:
             return "glVertexAttrib3f";
-        case EntryPoint::VertexAttrib3fv:
+        case EntryPoint::GLVertexAttrib3fv:
             return "glVertexAttrib3fv";
-        case EntryPoint::VertexAttrib3s:
+        case EntryPoint::GLVertexAttrib3s:
             return "glVertexAttrib3s";
-        case EntryPoint::VertexAttrib3sv:
+        case EntryPoint::GLVertexAttrib3sv:
             return "glVertexAttrib3sv";
-        case EntryPoint::VertexAttrib4Nbv:
+        case EntryPoint::GLVertexAttrib4Nbv:
             return "glVertexAttrib4Nbv";
-        case EntryPoint::VertexAttrib4Niv:
+        case EntryPoint::GLVertexAttrib4Niv:
             return "glVertexAttrib4Niv";
-        case EntryPoint::VertexAttrib4Nsv:
+        case EntryPoint::GLVertexAttrib4Nsv:
             return "glVertexAttrib4Nsv";
-        case EntryPoint::VertexAttrib4Nub:
+        case EntryPoint::GLVertexAttrib4Nub:
             return "glVertexAttrib4Nub";
-        case EntryPoint::VertexAttrib4Nubv:
+        case EntryPoint::GLVertexAttrib4Nubv:
             return "glVertexAttrib4Nubv";
-        case EntryPoint::VertexAttrib4Nuiv:
+        case EntryPoint::GLVertexAttrib4Nuiv:
             return "glVertexAttrib4Nuiv";
-        case EntryPoint::VertexAttrib4Nusv:
+        case EntryPoint::GLVertexAttrib4Nusv:
             return "glVertexAttrib4Nusv";
-        case EntryPoint::VertexAttrib4bv:
+        case EntryPoint::GLVertexAttrib4bv:
             return "glVertexAttrib4bv";
-        case EntryPoint::VertexAttrib4d:
+        case EntryPoint::GLVertexAttrib4d:
             return "glVertexAttrib4d";
-        case EntryPoint::VertexAttrib4dv:
+        case EntryPoint::GLVertexAttrib4dv:
             return "glVertexAttrib4dv";
-        case EntryPoint::VertexAttrib4f:
+        case EntryPoint::GLVertexAttrib4f:
             return "glVertexAttrib4f";
-        case EntryPoint::VertexAttrib4fv:
+        case EntryPoint::GLVertexAttrib4fv:
             return "glVertexAttrib4fv";
-        case EntryPoint::VertexAttrib4iv:
+        case EntryPoint::GLVertexAttrib4iv:
             return "glVertexAttrib4iv";
-        case EntryPoint::VertexAttrib4s:
+        case EntryPoint::GLVertexAttrib4s:
             return "glVertexAttrib4s";
-        case EntryPoint::VertexAttrib4sv:
+        case EntryPoint::GLVertexAttrib4sv:
             return "glVertexAttrib4sv";
-        case EntryPoint::VertexAttrib4ubv:
+        case EntryPoint::GLVertexAttrib4ubv:
             return "glVertexAttrib4ubv";
-        case EntryPoint::VertexAttrib4uiv:
+        case EntryPoint::GLVertexAttrib4uiv:
             return "glVertexAttrib4uiv";
-        case EntryPoint::VertexAttrib4usv:
+        case EntryPoint::GLVertexAttrib4usv:
             return "glVertexAttrib4usv";
-        case EntryPoint::VertexAttribBinding:
+        case EntryPoint::GLVertexAttribBinding:
             return "glVertexAttribBinding";
-        case EntryPoint::VertexAttribDivisor:
+        case EntryPoint::GLVertexAttribDivisor:
             return "glVertexAttribDivisor";
-        case EntryPoint::VertexAttribDivisorANGLE:
+        case EntryPoint::GLVertexAttribDivisorANGLE:
             return "glVertexAttribDivisorANGLE";
-        case EntryPoint::VertexAttribDivisorEXT:
+        case EntryPoint::GLVertexAttribDivisorEXT:
             return "glVertexAttribDivisorEXT";
-        case EntryPoint::VertexAttribFormat:
+        case EntryPoint::GLVertexAttribFormat:
             return "glVertexAttribFormat";
-        case EntryPoint::VertexAttribI1i:
+        case EntryPoint::GLVertexAttribI1i:
             return "glVertexAttribI1i";
-        case EntryPoint::VertexAttribI1iv:
+        case EntryPoint::GLVertexAttribI1iv:
             return "glVertexAttribI1iv";
-        case EntryPoint::VertexAttribI1ui:
+        case EntryPoint::GLVertexAttribI1ui:
             return "glVertexAttribI1ui";
-        case EntryPoint::VertexAttribI1uiv:
+        case EntryPoint::GLVertexAttribI1uiv:
             return "glVertexAttribI1uiv";
-        case EntryPoint::VertexAttribI2i:
+        case EntryPoint::GLVertexAttribI2i:
             return "glVertexAttribI2i";
-        case EntryPoint::VertexAttribI2iv:
+        case EntryPoint::GLVertexAttribI2iv:
             return "glVertexAttribI2iv";
-        case EntryPoint::VertexAttribI2ui:
+        case EntryPoint::GLVertexAttribI2ui:
             return "glVertexAttribI2ui";
-        case EntryPoint::VertexAttribI2uiv:
+        case EntryPoint::GLVertexAttribI2uiv:
             return "glVertexAttribI2uiv";
-        case EntryPoint::VertexAttribI3i:
+        case EntryPoint::GLVertexAttribI3i:
             return "glVertexAttribI3i";
-        case EntryPoint::VertexAttribI3iv:
+        case EntryPoint::GLVertexAttribI3iv:
             return "glVertexAttribI3iv";
-        case EntryPoint::VertexAttribI3ui:
+        case EntryPoint::GLVertexAttribI3ui:
             return "glVertexAttribI3ui";
-        case EntryPoint::VertexAttribI3uiv:
+        case EntryPoint::GLVertexAttribI3uiv:
             return "glVertexAttribI3uiv";
-        case EntryPoint::VertexAttribI4bv:
+        case EntryPoint::GLVertexAttribI4bv:
             return "glVertexAttribI4bv";
-        case EntryPoint::VertexAttribI4i:
+        case EntryPoint::GLVertexAttribI4i:
             return "glVertexAttribI4i";
-        case EntryPoint::VertexAttribI4iv:
+        case EntryPoint::GLVertexAttribI4iv:
             return "glVertexAttribI4iv";
-        case EntryPoint::VertexAttribI4sv:
+        case EntryPoint::GLVertexAttribI4sv:
             return "glVertexAttribI4sv";
-        case EntryPoint::VertexAttribI4ubv:
+        case EntryPoint::GLVertexAttribI4ubv:
             return "glVertexAttribI4ubv";
-        case EntryPoint::VertexAttribI4ui:
+        case EntryPoint::GLVertexAttribI4ui:
             return "glVertexAttribI4ui";
-        case EntryPoint::VertexAttribI4uiv:
+        case EntryPoint::GLVertexAttribI4uiv:
             return "glVertexAttribI4uiv";
-        case EntryPoint::VertexAttribI4usv:
+        case EntryPoint::GLVertexAttribI4usv:
             return "glVertexAttribI4usv";
-        case EntryPoint::VertexAttribIFormat:
+        case EntryPoint::GLVertexAttribIFormat:
             return "glVertexAttribIFormat";
-        case EntryPoint::VertexAttribIPointer:
+        case EntryPoint::GLVertexAttribIPointer:
             return "glVertexAttribIPointer";
-        case EntryPoint::VertexAttribL1d:
+        case EntryPoint::GLVertexAttribL1d:
             return "glVertexAttribL1d";
-        case EntryPoint::VertexAttribL1dv:
+        case EntryPoint::GLVertexAttribL1dv:
             return "glVertexAttribL1dv";
-        case EntryPoint::VertexAttribL2d:
+        case EntryPoint::GLVertexAttribL2d:
             return "glVertexAttribL2d";
-        case EntryPoint::VertexAttribL2dv:
+        case EntryPoint::GLVertexAttribL2dv:
             return "glVertexAttribL2dv";
-        case EntryPoint::VertexAttribL3d:
+        case EntryPoint::GLVertexAttribL3d:
             return "glVertexAttribL3d";
-        case EntryPoint::VertexAttribL3dv:
+        case EntryPoint::GLVertexAttribL3dv:
             return "glVertexAttribL3dv";
-        case EntryPoint::VertexAttribL4d:
+        case EntryPoint::GLVertexAttribL4d:
             return "glVertexAttribL4d";
-        case EntryPoint::VertexAttribL4dv:
+        case EntryPoint::GLVertexAttribL4dv:
             return "glVertexAttribL4dv";
-        case EntryPoint::VertexAttribLFormat:
+        case EntryPoint::GLVertexAttribLFormat:
             return "glVertexAttribLFormat";
-        case EntryPoint::VertexAttribLPointer:
+        case EntryPoint::GLVertexAttribLPointer:
             return "glVertexAttribLPointer";
-        case EntryPoint::VertexAttribP1ui:
+        case EntryPoint::GLVertexAttribP1ui:
             return "glVertexAttribP1ui";
-        case EntryPoint::VertexAttribP1uiv:
+        case EntryPoint::GLVertexAttribP1uiv:
             return "glVertexAttribP1uiv";
-        case EntryPoint::VertexAttribP2ui:
+        case EntryPoint::GLVertexAttribP2ui:
             return "glVertexAttribP2ui";
-        case EntryPoint::VertexAttribP2uiv:
+        case EntryPoint::GLVertexAttribP2uiv:
             return "glVertexAttribP2uiv";
-        case EntryPoint::VertexAttribP3ui:
+        case EntryPoint::GLVertexAttribP3ui:
             return "glVertexAttribP3ui";
-        case EntryPoint::VertexAttribP3uiv:
+        case EntryPoint::GLVertexAttribP3uiv:
             return "glVertexAttribP3uiv";
-        case EntryPoint::VertexAttribP4ui:
+        case EntryPoint::GLVertexAttribP4ui:
             return "glVertexAttribP4ui";
-        case EntryPoint::VertexAttribP4uiv:
+        case EntryPoint::GLVertexAttribP4uiv:
             return "glVertexAttribP4uiv";
-        case EntryPoint::VertexAttribPointer:
+        case EntryPoint::GLVertexAttribPointer:
             return "glVertexAttribPointer";
-        case EntryPoint::VertexBindingDivisor:
+        case EntryPoint::GLVertexBindingDivisor:
             return "glVertexBindingDivisor";
-        case EntryPoint::VertexP2ui:
+        case EntryPoint::GLVertexP2ui:
             return "glVertexP2ui";
-        case EntryPoint::VertexP2uiv:
+        case EntryPoint::GLVertexP2uiv:
             return "glVertexP2uiv";
-        case EntryPoint::VertexP3ui:
+        case EntryPoint::GLVertexP3ui:
             return "glVertexP3ui";
-        case EntryPoint::VertexP3uiv:
+        case EntryPoint::GLVertexP3uiv:
             return "glVertexP3uiv";
-        case EntryPoint::VertexP4ui:
+        case EntryPoint::GLVertexP4ui:
             return "glVertexP4ui";
-        case EntryPoint::VertexP4uiv:
+        case EntryPoint::GLVertexP4uiv:
             return "glVertexP4uiv";
-        case EntryPoint::VertexPointer:
+        case EntryPoint::GLVertexPointer:
             return "glVertexPointer";
-        case EntryPoint::Viewport:
+        case EntryPoint::GLViewport:
             return "glViewport";
-        case EntryPoint::ViewportArrayv:
+        case EntryPoint::GLViewportArrayv:
             return "glViewportArrayv";
-        case EntryPoint::ViewportIndexedf:
+        case EntryPoint::GLViewportIndexedf:
             return "glViewportIndexedf";
-        case EntryPoint::ViewportIndexedfv:
+        case EntryPoint::GLViewportIndexedfv:
             return "glViewportIndexedfv";
-        case EntryPoint::WaitSemaphoreEXT:
+        case EntryPoint::GLWaitSemaphoreEXT:
             return "glWaitSemaphoreEXT";
-        case EntryPoint::WaitSync:
+        case EntryPoint::GLWaitSync:
             return "glWaitSync";
-        case EntryPoint::WeightPointerOES:
+        case EntryPoint::GLWeightPointerOES:
             return "glWeightPointerOES";
-        case EntryPoint::WindowPos2d:
+        case EntryPoint::GLWindowPos2d:
             return "glWindowPos2d";
-        case EntryPoint::WindowPos2dv:
+        case EntryPoint::GLWindowPos2dv:
             return "glWindowPos2dv";
-        case EntryPoint::WindowPos2f:
+        case EntryPoint::GLWindowPos2f:
             return "glWindowPos2f";
-        case EntryPoint::WindowPos2fv:
+        case EntryPoint::GLWindowPos2fv:
             return "glWindowPos2fv";
-        case EntryPoint::WindowPos2i:
+        case EntryPoint::GLWindowPos2i:
             return "glWindowPos2i";
-        case EntryPoint::WindowPos2iv:
+        case EntryPoint::GLWindowPos2iv:
             return "glWindowPos2iv";
-        case EntryPoint::WindowPos2s:
+        case EntryPoint::GLWindowPos2s:
             return "glWindowPos2s";
-        case EntryPoint::WindowPos2sv:
+        case EntryPoint::GLWindowPos2sv:
             return "glWindowPos2sv";
-        case EntryPoint::WindowPos3d:
+        case EntryPoint::GLWindowPos3d:
             return "glWindowPos3d";
-        case EntryPoint::WindowPos3dv:
+        case EntryPoint::GLWindowPos3dv:
             return "glWindowPos3dv";
-        case EntryPoint::WindowPos3f:
+        case EntryPoint::GLWindowPos3f:
             return "glWindowPos3f";
-        case EntryPoint::WindowPos3fv:
+        case EntryPoint::GLWindowPos3fv:
             return "glWindowPos3fv";
-        case EntryPoint::WindowPos3i:
+        case EntryPoint::GLWindowPos3i:
             return "glWindowPos3i";
-        case EntryPoint::WindowPos3iv:
+        case EntryPoint::GLWindowPos3iv:
             return "glWindowPos3iv";
-        case EntryPoint::WindowPos3s:
+        case EntryPoint::GLWindowPos3s:
             return "glWindowPos3s";
-        case EntryPoint::WindowPos3sv:
+        case EntryPoint::GLWindowPos3sv:
             return "glWindowPos3sv";
+        case EntryPoint::WGLChoosePixelFormat:
+            return "wglChoosePixelFormat";
+        case EntryPoint::WGLCopyContext:
+            return "wglCopyContext";
+        case EntryPoint::WGLCreateContext:
+            return "wglCreateContext";
+        case EntryPoint::WGLCreateLayerContext:
+            return "wglCreateLayerContext";
+        case EntryPoint::WGLDeleteContext:
+            return "wglDeleteContext";
+        case EntryPoint::WGLDescribeLayerPlane:
+            return "wglDescribeLayerPlane";
+        case EntryPoint::WGLDescribePixelFormat:
+            return "wglDescribePixelFormat";
+        case EntryPoint::WGLGetCurrentContext:
+            return "wglGetCurrentContext";
+        case EntryPoint::WGLGetCurrentDC:
+            return "wglGetCurrentDC";
+        case EntryPoint::WGLGetEnhMetaFilePixelFormat:
+            return "wglGetEnhMetaFilePixelFormat";
+        case EntryPoint::WGLGetLayerPaletteEntries:
+            return "wglGetLayerPaletteEntries";
+        case EntryPoint::WGLGetPixelFormat:
+            return "wglGetPixelFormat";
+        case EntryPoint::WGLGetProcAddress:
+            return "wglGetProcAddress";
+        case EntryPoint::WGLMakeCurrent:
+            return "wglMakeCurrent";
+        case EntryPoint::WGLRealizeLayerPalette:
+            return "wglRealizeLayerPalette";
+        case EntryPoint::WGLSetLayerPaletteEntries:
+            return "wglSetLayerPaletteEntries";
+        case EntryPoint::WGLSetPixelFormat:
+            return "wglSetPixelFormat";
+        case EntryPoint::WGLShareLists:
+            return "wglShareLists";
+        case EntryPoint::WGLSwapBuffers:
+            return "wglSwapBuffers";
+        case EntryPoint::WGLSwapLayerBuffers:
+            return "wglSwapLayerBuffers";
+        case EntryPoint::WGLUseFontBitmaps:
+            return "wglUseFontBitmaps";
+        case EntryPoint::WGLUseFontBitmapsA:
+            return "wglUseFontBitmapsA";
+        case EntryPoint::WGLUseFontBitmapsW:
+            return "wglUseFontBitmapsW";
+        case EntryPoint::WGLUseFontOutlines:
+            return "wglUseFontOutlines";
+        case EntryPoint::WGLUseFontOutlinesA:
+            return "wglUseFontOutlinesA";
+        case EntryPoint::WGLUseFontOutlinesW:
+            return "wglUseFontOutlinesW";
         default:
             UNREACHABLE();
             return "error";
     }
 }
-}  // namespace gl
+}  // namespace angle
diff --git a/src/common/entry_points_enum_autogen.h b/src/common/entry_points_enum_autogen.h
index 0e88eb1..27c4f1e 100644
--- a/src/common/entry_points_enum_autogen.h
+++ b/src/common/entry_points_enum_autogen.h
@@ -11,1429 +11,1556 @@
 #ifndef COMMON_ENTRYPOINTSENUM_AUTOGEN_H_
 #define COMMON_ENTRYPOINTSENUM_AUTOGEN_H_
 
-namespace gl
+namespace angle
 {
 enum class EntryPoint
 {
-    Accum,
-    ActiveShaderProgram,
-    ActiveShaderProgramEXT,
-    ActiveTexture,
-    AlphaFunc,
-    AlphaFuncx,
-    AreTexturesResident,
-    ArrayElement,
-    AttachShader,
-    Begin,
-    BeginConditionalRender,
-    BeginQuery,
-    BeginQueryEXT,
-    BeginQueryIndexed,
-    BeginTransformFeedback,
-    BindAttribLocation,
-    BindBuffer,
-    BindBufferBase,
-    BindBufferRange,
-    BindBuffersBase,
-    BindBuffersRange,
-    BindFragDataLocation,
-    BindFragDataLocationEXT,
-    BindFragDataLocationIndexed,
-    BindFragDataLocationIndexedEXT,
-    BindFramebuffer,
-    BindFramebufferOES,
-    BindImageTexture,
-    BindImageTextures,
-    BindProgramPipeline,
-    BindProgramPipelineEXT,
-    BindRenderbuffer,
-    BindRenderbufferOES,
-    BindSampler,
-    BindSamplers,
-    BindTexture,
-    BindTextureUnit,
-    BindTextures,
-    BindTransformFeedback,
-    BindUniformLocationCHROMIUM,
-    BindVertexArray,
-    BindVertexArrayOES,
-    BindVertexBuffer,
-    BindVertexBuffers,
-    Bitmap,
-    BlendBarrier,
-    BlendColor,
-    BlendEquation,
-    BlendEquationSeparate,
-    BlendEquationSeparatei,
-    BlendEquationSeparateiEXT,
-    BlendEquationSeparateiOES,
-    BlendEquationi,
-    BlendEquationiEXT,
-    BlendEquationiOES,
-    BlendFunc,
-    BlendFuncSeparate,
-    BlendFuncSeparatei,
-    BlendFuncSeparateiEXT,
-    BlendFuncSeparateiOES,
-    BlendFunci,
-    BlendFunciEXT,
-    BlendFunciOES,
-    BlitFramebuffer,
-    BlitFramebufferANGLE,
-    BlitNamedFramebuffer,
-    BufferData,
-    BufferStorage,
-    BufferStorageEXT,
-    BufferStorageExternalEXT,
-    BufferStorageMemEXT,
-    BufferSubData,
-    CallList,
-    CallLists,
-    CheckFramebufferStatus,
-    CheckFramebufferStatusOES,
-    CheckNamedFramebufferStatus,
-    ClampColor,
-    Clear,
-    ClearAccum,
-    ClearBufferData,
-    ClearBufferSubData,
-    ClearBufferfi,
-    ClearBufferfv,
-    ClearBufferiv,
-    ClearBufferuiv,
-    ClearColor,
-    ClearColorx,
-    ClearDepth,
-    ClearDepthf,
-    ClearDepthx,
-    ClearIndex,
-    ClearNamedBufferData,
-    ClearNamedBufferSubData,
-    ClearNamedFramebufferfi,
-    ClearNamedFramebufferfv,
-    ClearNamedFramebufferiv,
-    ClearNamedFramebufferuiv,
-    ClearStencil,
-    ClearTexImage,
-    ClearTexSubImage,
-    ClientActiveTexture,
-    ClientWaitSync,
-    ClipControl,
-    ClipPlane,
-    ClipPlanef,
-    ClipPlanex,
-    Color3b,
-    Color3bv,
-    Color3d,
-    Color3dv,
-    Color3f,
-    Color3fv,
-    Color3i,
-    Color3iv,
-    Color3s,
-    Color3sv,
-    Color3ub,
-    Color3ubv,
-    Color3ui,
-    Color3uiv,
-    Color3us,
-    Color3usv,
-    Color4b,
-    Color4bv,
-    Color4d,
-    Color4dv,
-    Color4f,
-    Color4fv,
-    Color4i,
-    Color4iv,
-    Color4s,
-    Color4sv,
-    Color4ub,
-    Color4ubv,
-    Color4ui,
-    Color4uiv,
-    Color4us,
-    Color4usv,
-    Color4x,
-    ColorMask,
-    ColorMaski,
-    ColorMaskiEXT,
-    ColorMaskiOES,
-    ColorMaterial,
-    ColorP3ui,
-    ColorP3uiv,
-    ColorP4ui,
-    ColorP4uiv,
-    ColorPointer,
-    CompileShader,
-    CompressedCopyTextureCHROMIUM,
-    CompressedTexImage1D,
-    CompressedTexImage2D,
-    CompressedTexImage2DRobustANGLE,
-    CompressedTexImage3D,
-    CompressedTexImage3DOES,
-    CompressedTexImage3DRobustANGLE,
-    CompressedTexSubImage1D,
-    CompressedTexSubImage2D,
-    CompressedTexSubImage2DRobustANGLE,
-    CompressedTexSubImage3D,
-    CompressedTexSubImage3DOES,
-    CompressedTexSubImage3DRobustANGLE,
-    CompressedTextureSubImage1D,
-    CompressedTextureSubImage2D,
-    CompressedTextureSubImage3D,
-    CopyBufferSubData,
-    CopyImageSubData,
-    CopyImageSubDataEXT,
-    CopyImageSubDataOES,
-    CopyNamedBufferSubData,
-    CopyPixels,
-    CopySubTexture3DANGLE,
-    CopySubTextureCHROMIUM,
-    CopyTexImage1D,
-    CopyTexImage2D,
-    CopyTexSubImage1D,
-    CopyTexSubImage2D,
-    CopyTexSubImage3D,
-    CopyTexSubImage3DOES,
-    CopyTexture3DANGLE,
-    CopyTextureCHROMIUM,
-    CopyTextureSubImage1D,
-    CopyTextureSubImage2D,
-    CopyTextureSubImage3D,
-    CoverageModulationCHROMIUM,
-    CreateBuffers,
-    CreateFramebuffers,
-    CreateMemoryObjectsEXT,
-    CreateProgram,
-    CreateProgramPipelines,
-    CreateQueries,
-    CreateRenderbuffers,
-    CreateSamplers,
-    CreateShader,
-    CreateShaderProgramv,
-    CreateShaderProgramvEXT,
-    CreateTextures,
-    CreateTransformFeedbacks,
-    CreateVertexArrays,
-    CullFace,
-    CurrentPaletteMatrixOES,
-    DebugMessageCallback,
-    DebugMessageCallbackKHR,
-    DebugMessageControl,
-    DebugMessageControlKHR,
-    DebugMessageInsert,
-    DebugMessageInsertKHR,
-    DeleteBuffers,
-    DeleteFencesNV,
-    DeleteFramebuffers,
-    DeleteFramebuffersOES,
-    DeleteLists,
-    DeleteMemoryObjectsEXT,
-    DeleteProgram,
-    DeleteProgramPipelines,
-    DeleteProgramPipelinesEXT,
-    DeleteQueries,
-    DeleteQueriesEXT,
-    DeleteRenderbuffers,
-    DeleteRenderbuffersOES,
-    DeleteSamplers,
-    DeleteSemaphoresEXT,
-    DeleteShader,
-    DeleteSync,
-    DeleteTextures,
-    DeleteTransformFeedbacks,
-    DeleteVertexArrays,
-    DeleteVertexArraysOES,
-    DepthFunc,
-    DepthMask,
-    DepthRange,
-    DepthRangeArrayv,
-    DepthRangeIndexed,
-    DepthRangef,
-    DepthRangex,
-    DetachShader,
-    Disable,
-    DisableClientState,
-    DisableExtensionANGLE,
-    DisableVertexArrayAttrib,
-    DisableVertexAttribArray,
-    Disablei,
-    DisableiEXT,
-    DisableiOES,
-    DiscardFramebufferEXT,
-    DispatchCompute,
-    DispatchComputeIndirect,
-    DrawArrays,
-    DrawArraysIndirect,
-    DrawArraysInstanced,
-    DrawArraysInstancedANGLE,
-    DrawArraysInstancedBaseInstance,
-    DrawArraysInstancedBaseInstanceANGLE,
-    DrawArraysInstancedEXT,
-    DrawBuffer,
-    DrawBuffers,
-    DrawBuffersEXT,
-    DrawElements,
-    DrawElementsBaseVertex,
-    DrawElementsBaseVertexEXT,
-    DrawElementsBaseVertexOES,
-    DrawElementsIndirect,
-    DrawElementsInstanced,
-    DrawElementsInstancedANGLE,
-    DrawElementsInstancedBaseInstance,
-    DrawElementsInstancedBaseVertex,
-    DrawElementsInstancedBaseVertexBaseInstance,
-    DrawElementsInstancedBaseVertexBaseInstanceANGLE,
-    DrawElementsInstancedBaseVertexEXT,
-    DrawElementsInstancedBaseVertexOES,
-    DrawElementsInstancedEXT,
-    DrawPixels,
-    DrawRangeElements,
-    DrawRangeElementsBaseVertex,
-    DrawRangeElementsBaseVertexEXT,
-    DrawRangeElementsBaseVertexOES,
-    DrawTexfOES,
-    DrawTexfvOES,
-    DrawTexiOES,
-    DrawTexivOES,
-    DrawTexsOES,
-    DrawTexsvOES,
-    DrawTexxOES,
-    DrawTexxvOES,
-    DrawTransformFeedback,
-    DrawTransformFeedbackInstanced,
-    DrawTransformFeedbackStream,
-    DrawTransformFeedbackStreamInstanced,
-    EGLImageTargetRenderbufferStorageOES,
-    EGLImageTargetTexture2DOES,
-    EdgeFlag,
-    EdgeFlagPointer,
-    EdgeFlagv,
-    Enable,
-    EnableClientState,
-    EnableVertexArrayAttrib,
-    EnableVertexAttribArray,
-    Enablei,
-    EnableiEXT,
-    EnableiOES,
-    End,
-    EndConditionalRender,
-    EndList,
-    EndQuery,
-    EndQueryEXT,
-    EndQueryIndexed,
-    EndTransformFeedback,
-    EvalCoord1d,
-    EvalCoord1dv,
-    EvalCoord1f,
-    EvalCoord1fv,
-    EvalCoord2d,
-    EvalCoord2dv,
-    EvalCoord2f,
-    EvalCoord2fv,
-    EvalMesh1,
-    EvalMesh2,
-    EvalPoint1,
-    EvalPoint2,
-    FeedbackBuffer,
-    FenceSync,
-    Finish,
-    FinishFenceNV,
-    Flush,
-    FlushMappedBufferRange,
-    FlushMappedBufferRangeEXT,
-    FlushMappedNamedBufferRange,
-    FogCoordPointer,
-    FogCoordd,
-    FogCoorddv,
-    FogCoordf,
-    FogCoordfv,
-    Fogf,
-    Fogfv,
-    Fogi,
-    Fogiv,
-    Fogx,
-    Fogxv,
-    FramebufferParameteri,
-    FramebufferRenderbuffer,
-    FramebufferRenderbufferOES,
-    FramebufferTexture,
-    FramebufferTexture1D,
-    FramebufferTexture2D,
-    FramebufferTexture2DMultisampleEXT,
-    FramebufferTexture2DOES,
-    FramebufferTexture3D,
-    FramebufferTexture3DOES,
-    FramebufferTextureEXT,
-    FramebufferTextureLayer,
-    FramebufferTextureMultiviewOVR,
-    FrontFace,
-    Frustum,
-    Frustumf,
-    Frustumx,
-    GenBuffers,
-    GenFencesNV,
-    GenFramebuffers,
-    GenFramebuffersOES,
-    GenLists,
-    GenProgramPipelines,
-    GenProgramPipelinesEXT,
-    GenQueries,
-    GenQueriesEXT,
-    GenRenderbuffers,
-    GenRenderbuffersOES,
-    GenSamplers,
-    GenSemaphoresEXT,
-    GenTextures,
-    GenTransformFeedbacks,
-    GenVertexArrays,
-    GenVertexArraysOES,
-    GenerateMipmap,
-    GenerateMipmapOES,
-    GenerateTextureMipmap,
-    GetActiveAtomicCounterBufferiv,
-    GetActiveAttrib,
-    GetActiveSubroutineName,
-    GetActiveSubroutineUniformName,
-    GetActiveSubroutineUniformiv,
-    GetActiveUniform,
-    GetActiveUniformBlockName,
-    GetActiveUniformBlockiv,
-    GetActiveUniformBlockivRobustANGLE,
-    GetActiveUniformName,
-    GetActiveUniformsiv,
-    GetAttachedShaders,
-    GetAttribLocation,
-    GetBooleani_v,
-    GetBooleani_vRobustANGLE,
-    GetBooleanv,
-    GetBooleanvRobustANGLE,
-    GetBufferParameteri64v,
-    GetBufferParameteri64vRobustANGLE,
-    GetBufferParameteriv,
-    GetBufferParameterivRobustANGLE,
-    GetBufferPointerv,
-    GetBufferPointervOES,
-    GetBufferPointervRobustANGLE,
-    GetBufferSubData,
-    GetClipPlane,
-    GetClipPlanef,
-    GetClipPlanex,
-    GetCompressedTexImage,
-    GetCompressedTextureImage,
-    GetCompressedTextureSubImage,
-    GetDebugMessageLog,
-    GetDebugMessageLogKHR,
-    GetDoublei_v,
-    GetDoublev,
-    GetError,
-    GetFenceivNV,
-    GetFixedv,
-    GetFloati_v,
-    GetFloatv,
-    GetFloatvRobustANGLE,
-    GetFragDataIndex,
-    GetFragDataIndexEXT,
-    GetFragDataLocation,
-    GetFramebufferAttachmentParameteriv,
-    GetFramebufferAttachmentParameterivOES,
-    GetFramebufferAttachmentParameterivRobustANGLE,
-    GetFramebufferParameteriv,
-    GetFramebufferParameterivRobustANGLE,
-    GetGraphicsResetStatus,
-    GetGraphicsResetStatusEXT,
-    GetInteger64i_v,
-    GetInteger64i_vRobustANGLE,
-    GetInteger64v,
-    GetInteger64vEXT,
-    GetInteger64vRobustANGLE,
-    GetIntegeri_v,
-    GetIntegeri_vRobustANGLE,
-    GetIntegerv,
-    GetIntegervRobustANGLE,
-    GetInternalformati64v,
-    GetInternalformativ,
-    GetInternalformativRobustANGLE,
-    GetLightfv,
-    GetLightiv,
-    GetLightxv,
-    GetMapdv,
-    GetMapfv,
-    GetMapiv,
-    GetMaterialfv,
-    GetMaterialiv,
-    GetMaterialxv,
-    GetMemoryObjectParameterivEXT,
-    GetMultisamplefv,
-    GetMultisamplefvANGLE,
-    GetMultisamplefvRobustANGLE,
-    GetNamedBufferParameteri64v,
-    GetNamedBufferParameteriv,
-    GetNamedBufferPointerv,
-    GetNamedBufferSubData,
-    GetNamedFramebufferAttachmentParameteriv,
-    GetNamedFramebufferParameteriv,
-    GetNamedRenderbufferParameteriv,
-    GetObjectLabel,
-    GetObjectLabelKHR,
-    GetObjectPtrLabel,
-    GetObjectPtrLabelKHR,
-    GetPixelMapfv,
-    GetPixelMapuiv,
-    GetPixelMapusv,
-    GetPointerv,
-    GetPointervKHR,
-    GetPointervRobustANGLERobustANGLE,
-    GetPolygonStipple,
-    GetProgramBinary,
-    GetProgramBinaryOES,
-    GetProgramInfoLog,
-    GetProgramInterfaceiv,
-    GetProgramInterfaceivRobustANGLE,
-    GetProgramPipelineInfoLog,
-    GetProgramPipelineInfoLogEXT,
-    GetProgramPipelineiv,
-    GetProgramPipelineivEXT,
-    GetProgramResourceIndex,
-    GetProgramResourceLocation,
-    GetProgramResourceLocationIndex,
-    GetProgramResourceLocationIndexEXT,
-    GetProgramResourceName,
-    GetProgramResourceiv,
-    GetProgramStageiv,
-    GetProgramiv,
-    GetProgramivRobustANGLE,
-    GetQueryBufferObjecti64v,
-    GetQueryBufferObjectiv,
-    GetQueryBufferObjectui64v,
-    GetQueryBufferObjectuiv,
-    GetQueryIndexediv,
-    GetQueryObjecti64v,
-    GetQueryObjecti64vEXT,
-    GetQueryObjecti64vRobustANGLE,
-    GetQueryObjectiv,
-    GetQueryObjectivEXT,
-    GetQueryObjectivRobustANGLE,
-    GetQueryObjectui64v,
-    GetQueryObjectui64vEXT,
-    GetQueryObjectui64vRobustANGLE,
-    GetQueryObjectuiv,
-    GetQueryObjectuivEXT,
-    GetQueryObjectuivRobustANGLE,
-    GetQueryiv,
-    GetQueryivEXT,
-    GetQueryivRobustANGLE,
-    GetRenderbufferImageANGLE,
-    GetRenderbufferParameteriv,
-    GetRenderbufferParameterivOES,
-    GetRenderbufferParameterivRobustANGLE,
-    GetSamplerParameterIiv,
-    GetSamplerParameterIivOES,
-    GetSamplerParameterIivRobustANGLE,
-    GetSamplerParameterIuiv,
-    GetSamplerParameterIuivOES,
-    GetSamplerParameterIuivRobustANGLE,
-    GetSamplerParameterfv,
-    GetSamplerParameterfvRobustANGLE,
-    GetSamplerParameteriv,
-    GetSamplerParameterivRobustANGLE,
-    GetSemaphoreParameterui64vEXT,
-    GetShaderInfoLog,
-    GetShaderPrecisionFormat,
-    GetShaderSource,
-    GetShaderiv,
-    GetShaderivRobustANGLE,
-    GetString,
-    GetStringi,
-    GetSubroutineIndex,
-    GetSubroutineUniformLocation,
-    GetSynciv,
-    GetTexEnvfv,
-    GetTexEnviv,
-    GetTexEnvxv,
-    GetTexGendv,
-    GetTexGenfv,
-    GetTexGenfvOES,
-    GetTexGeniv,
-    GetTexGenivOES,
-    GetTexGenxvOES,
-    GetTexImage,
-    GetTexImageANGLE,
-    GetTexLevelParameterfv,
-    GetTexLevelParameterfvANGLE,
-    GetTexLevelParameterfvRobustANGLE,
-    GetTexLevelParameteriv,
-    GetTexLevelParameterivANGLE,
-    GetTexLevelParameterivRobustANGLE,
-    GetTexParameterIiv,
-    GetTexParameterIivOES,
-    GetTexParameterIivRobustANGLE,
-    GetTexParameterIuiv,
-    GetTexParameterIuivOES,
-    GetTexParameterIuivRobustANGLE,
-    GetTexParameterfv,
-    GetTexParameterfvRobustANGLE,
-    GetTexParameteriv,
-    GetTexParameterivRobustANGLE,
-    GetTexParameterxv,
-    GetTextureImage,
-    GetTextureLevelParameterfv,
-    GetTextureLevelParameteriv,
-    GetTextureParameterIiv,
-    GetTextureParameterIuiv,
-    GetTextureParameterfv,
-    GetTextureParameteriv,
-    GetTextureSubImage,
-    GetTransformFeedbackVarying,
-    GetTransformFeedbacki64_v,
-    GetTransformFeedbacki_v,
-    GetTransformFeedbackiv,
-    GetTranslatedShaderSourceANGLE,
-    GetUniformBlockIndex,
-    GetUniformIndices,
-    GetUniformLocation,
-    GetUniformSubroutineuiv,
-    GetUniformdv,
-    GetUniformfv,
-    GetUniformfvRobustANGLE,
-    GetUniformiv,
-    GetUniformivRobustANGLE,
-    GetUniformuiv,
-    GetUniformuivRobustANGLE,
-    GetUnsignedBytei_vEXT,
-    GetUnsignedBytevEXT,
-    GetVertexArrayIndexed64iv,
-    GetVertexArrayIndexediv,
-    GetVertexArrayiv,
-    GetVertexAttribIiv,
-    GetVertexAttribIivRobustANGLE,
-    GetVertexAttribIuiv,
-    GetVertexAttribIuivRobustANGLE,
-    GetVertexAttribLdv,
-    GetVertexAttribPointerv,
-    GetVertexAttribPointervRobustANGLE,
-    GetVertexAttribdv,
-    GetVertexAttribfv,
-    GetVertexAttribfvRobustANGLE,
-    GetVertexAttribiv,
-    GetVertexAttribivRobustANGLE,
-    GetnColorTable,
-    GetnCompressedTexImage,
-    GetnConvolutionFilter,
-    GetnHistogram,
-    GetnMapdv,
-    GetnMapfv,
-    GetnMapiv,
-    GetnMinmax,
-    GetnPixelMapfv,
-    GetnPixelMapuiv,
-    GetnPixelMapusv,
-    GetnPolygonStipple,
-    GetnSeparableFilter,
-    GetnTexImage,
-    GetnUniformdv,
-    GetnUniformfv,
-    GetnUniformfvEXT,
-    GetnUniformfvRobustANGLE,
-    GetnUniformiv,
-    GetnUniformivEXT,
-    GetnUniformivRobustANGLE,
-    GetnUniformuiv,
-    GetnUniformuivRobustANGLE,
-    Hint,
-    ImportMemoryFdEXT,
-    ImportMemoryZirconHandleANGLE,
-    ImportSemaphoreFdEXT,
-    ImportSemaphoreZirconHandleANGLE,
-    IndexMask,
-    IndexPointer,
-    Indexd,
-    Indexdv,
-    Indexf,
-    Indexfv,
-    Indexi,
-    Indexiv,
-    Indexs,
-    Indexsv,
-    Indexub,
-    Indexubv,
-    InitNames,
-    InsertEventMarkerEXT,
-    InterleavedArrays,
-    Invalid,
-    InvalidateBufferData,
-    InvalidateBufferSubData,
-    InvalidateFramebuffer,
-    InvalidateNamedFramebufferData,
-    InvalidateNamedFramebufferSubData,
-    InvalidateSubFramebuffer,
-    InvalidateTexImage,
-    InvalidateTexSubImage,
-    InvalidateTextureANGLE,
-    IsBuffer,
-    IsEnabled,
-    IsEnabledi,
-    IsEnablediEXT,
-    IsEnablediOES,
-    IsFenceNV,
-    IsFramebuffer,
-    IsFramebufferOES,
-    IsList,
-    IsMemoryObjectEXT,
-    IsProgram,
-    IsProgramPipeline,
-    IsProgramPipelineEXT,
-    IsQuery,
-    IsQueryEXT,
-    IsRenderbuffer,
-    IsRenderbufferOES,
-    IsSampler,
-    IsSemaphoreEXT,
-    IsShader,
-    IsSync,
-    IsTexture,
-    IsTransformFeedback,
-    IsVertexArray,
-    IsVertexArrayOES,
-    LightModelf,
-    LightModelfv,
-    LightModeli,
-    LightModeliv,
-    LightModelx,
-    LightModelxv,
-    Lightf,
-    Lightfv,
-    Lighti,
-    Lightiv,
-    Lightx,
-    Lightxv,
-    LineStipple,
-    LineWidth,
-    LineWidthx,
-    LinkProgram,
-    ListBase,
-    LoadIdentity,
-    LoadMatrixd,
-    LoadMatrixf,
-    LoadMatrixx,
-    LoadName,
-    LoadPaletteFromModelViewMatrixOES,
-    LoadTransposeMatrixd,
-    LoadTransposeMatrixf,
-    LogicOp,
-    LoseContextCHROMIUM,
-    Map1d,
-    Map1f,
-    Map2d,
-    Map2f,
-    MapBuffer,
-    MapBufferOES,
-    MapBufferRange,
-    MapBufferRangeEXT,
-    MapGrid1d,
-    MapGrid1f,
-    MapGrid2d,
-    MapGrid2f,
-    MapNamedBuffer,
-    MapNamedBufferRange,
-    Materialf,
-    Materialfv,
-    Materiali,
-    Materialiv,
-    Materialx,
-    Materialxv,
-    MatrixIndexPointerOES,
-    MatrixMode,
-    MaxShaderCompilerThreadsKHR,
-    MemoryBarrier,
-    MemoryBarrierByRegion,
-    MemoryObjectParameterivEXT,
-    MinSampleShading,
-    MinSampleShadingOES,
-    MultMatrixd,
-    MultMatrixf,
-    MultMatrixx,
-    MultTransposeMatrixd,
-    MultTransposeMatrixf,
-    MultiDrawArrays,
-    MultiDrawArraysANGLE,
-    MultiDrawArraysIndirect,
-    MultiDrawArraysIndirectCount,
-    MultiDrawArraysInstancedANGLE,
-    MultiDrawArraysInstancedBaseInstanceANGLE,
-    MultiDrawElements,
-    MultiDrawElementsANGLE,
-    MultiDrawElementsBaseVertex,
-    MultiDrawElementsBaseVertexEXT,
-    MultiDrawElementsIndirect,
-    MultiDrawElementsIndirectCount,
-    MultiDrawElementsInstancedANGLE,
-    MultiDrawElementsInstancedBaseVertexBaseInstanceANGLE,
-    MultiTexCoord1d,
-    MultiTexCoord1dv,
-    MultiTexCoord1f,
-    MultiTexCoord1fv,
-    MultiTexCoord1i,
-    MultiTexCoord1iv,
-    MultiTexCoord1s,
-    MultiTexCoord1sv,
-    MultiTexCoord2d,
-    MultiTexCoord2dv,
-    MultiTexCoord2f,
-    MultiTexCoord2fv,
-    MultiTexCoord2i,
-    MultiTexCoord2iv,
-    MultiTexCoord2s,
-    MultiTexCoord2sv,
-    MultiTexCoord3d,
-    MultiTexCoord3dv,
-    MultiTexCoord3f,
-    MultiTexCoord3fv,
-    MultiTexCoord3i,
-    MultiTexCoord3iv,
-    MultiTexCoord3s,
-    MultiTexCoord3sv,
-    MultiTexCoord4d,
-    MultiTexCoord4dv,
-    MultiTexCoord4f,
-    MultiTexCoord4fv,
-    MultiTexCoord4i,
-    MultiTexCoord4iv,
-    MultiTexCoord4s,
-    MultiTexCoord4sv,
-    MultiTexCoord4x,
-    MultiTexCoordP1ui,
-    MultiTexCoordP1uiv,
-    MultiTexCoordP2ui,
-    MultiTexCoordP2uiv,
-    MultiTexCoordP3ui,
-    MultiTexCoordP3uiv,
-    MultiTexCoordP4ui,
-    MultiTexCoordP4uiv,
-    NamedBufferData,
-    NamedBufferStorage,
-    NamedBufferStorageExternalEXT,
-    NamedBufferSubData,
-    NamedFramebufferDrawBuffer,
-    NamedFramebufferDrawBuffers,
-    NamedFramebufferParameteri,
-    NamedFramebufferReadBuffer,
-    NamedFramebufferRenderbuffer,
-    NamedFramebufferTexture,
-    NamedFramebufferTextureLayer,
-    NamedRenderbufferStorage,
-    NamedRenderbufferStorageMultisample,
-    NewList,
-    Normal3b,
-    Normal3bv,
-    Normal3d,
-    Normal3dv,
-    Normal3f,
-    Normal3fv,
-    Normal3i,
-    Normal3iv,
-    Normal3s,
-    Normal3sv,
-    Normal3x,
-    NormalP3ui,
-    NormalP3uiv,
-    NormalPointer,
-    ObjectLabel,
-    ObjectLabelKHR,
-    ObjectPtrLabel,
-    ObjectPtrLabelKHR,
-    Ortho,
-    Orthof,
-    Orthox,
-    PassThrough,
-    PatchParameterfv,
-    PatchParameteri,
-    PatchParameteriEXT,
-    PauseTransformFeedback,
-    PixelMapfv,
-    PixelMapuiv,
-    PixelMapusv,
-    PixelStoref,
-    PixelStorei,
-    PixelTransferf,
-    PixelTransferi,
-    PixelZoom,
-    PointParameterf,
-    PointParameterfv,
-    PointParameteri,
-    PointParameteriv,
-    PointParameterx,
-    PointParameterxv,
-    PointSize,
-    PointSizePointerOES,
-    PointSizex,
-    PolygonMode,
-    PolygonOffset,
-    PolygonOffsetClamp,
-    PolygonOffsetx,
-    PolygonStipple,
-    PopAttrib,
-    PopClientAttrib,
-    PopDebugGroup,
-    PopDebugGroupKHR,
-    PopGroupMarkerEXT,
-    PopMatrix,
-    PopName,
-    PrimitiveBoundingBox,
-    PrimitiveRestartIndex,
-    PrioritizeTextures,
-    ProgramBinary,
-    ProgramBinaryOES,
-    ProgramParameteri,
-    ProgramParameteriEXT,
-    ProgramUniform1d,
-    ProgramUniform1dv,
-    ProgramUniform1f,
-    ProgramUniform1fEXT,
-    ProgramUniform1fv,
-    ProgramUniform1fvEXT,
-    ProgramUniform1i,
-    ProgramUniform1iEXT,
-    ProgramUniform1iv,
-    ProgramUniform1ivEXT,
-    ProgramUniform1ui,
-    ProgramUniform1uiEXT,
-    ProgramUniform1uiv,
-    ProgramUniform1uivEXT,
-    ProgramUniform2d,
-    ProgramUniform2dv,
-    ProgramUniform2f,
-    ProgramUniform2fEXT,
-    ProgramUniform2fv,
-    ProgramUniform2fvEXT,
-    ProgramUniform2i,
-    ProgramUniform2iEXT,
-    ProgramUniform2iv,
-    ProgramUniform2ivEXT,
-    ProgramUniform2ui,
-    ProgramUniform2uiEXT,
-    ProgramUniform2uiv,
-    ProgramUniform2uivEXT,
-    ProgramUniform3d,
-    ProgramUniform3dv,
-    ProgramUniform3f,
-    ProgramUniform3fEXT,
-    ProgramUniform3fv,
-    ProgramUniform3fvEXT,
-    ProgramUniform3i,
-    ProgramUniform3iEXT,
-    ProgramUniform3iv,
-    ProgramUniform3ivEXT,
-    ProgramUniform3ui,
-    ProgramUniform3uiEXT,
-    ProgramUniform3uiv,
-    ProgramUniform3uivEXT,
-    ProgramUniform4d,
-    ProgramUniform4dv,
-    ProgramUniform4f,
-    ProgramUniform4fEXT,
-    ProgramUniform4fv,
-    ProgramUniform4fvEXT,
-    ProgramUniform4i,
-    ProgramUniform4iEXT,
-    ProgramUniform4iv,
-    ProgramUniform4ivEXT,
-    ProgramUniform4ui,
-    ProgramUniform4uiEXT,
-    ProgramUniform4uiv,
-    ProgramUniform4uivEXT,
-    ProgramUniformMatrix2dv,
-    ProgramUniformMatrix2fv,
-    ProgramUniformMatrix2fvEXT,
-    ProgramUniformMatrix2x3dv,
-    ProgramUniformMatrix2x3fv,
-    ProgramUniformMatrix2x3fvEXT,
-    ProgramUniformMatrix2x4dv,
-    ProgramUniformMatrix2x4fv,
-    ProgramUniformMatrix2x4fvEXT,
-    ProgramUniformMatrix3dv,
-    ProgramUniformMatrix3fv,
-    ProgramUniformMatrix3fvEXT,
-    ProgramUniformMatrix3x2dv,
-    ProgramUniformMatrix3x2fv,
-    ProgramUniformMatrix3x2fvEXT,
-    ProgramUniformMatrix3x4dv,
-    ProgramUniformMatrix3x4fv,
-    ProgramUniformMatrix3x4fvEXT,
-    ProgramUniformMatrix4dv,
-    ProgramUniformMatrix4fv,
-    ProgramUniformMatrix4fvEXT,
-    ProgramUniformMatrix4x2dv,
-    ProgramUniformMatrix4x2fv,
-    ProgramUniformMatrix4x2fvEXT,
-    ProgramUniformMatrix4x3dv,
-    ProgramUniformMatrix4x3fv,
-    ProgramUniformMatrix4x3fvEXT,
-    ProvokingVertex,
-    ProvokingVertexANGLE,
-    PushAttrib,
-    PushClientAttrib,
-    PushDebugGroup,
-    PushDebugGroupKHR,
-    PushGroupMarkerEXT,
-    PushMatrix,
-    PushName,
-    QueryCounter,
-    QueryCounterEXT,
-    QueryMatrixxOES,
-    RasterPos2d,
-    RasterPos2dv,
-    RasterPos2f,
-    RasterPos2fv,
-    RasterPos2i,
-    RasterPos2iv,
-    RasterPos2s,
-    RasterPos2sv,
-    RasterPos3d,
-    RasterPos3dv,
-    RasterPos3f,
-    RasterPos3fv,
-    RasterPos3i,
-    RasterPos3iv,
-    RasterPos3s,
-    RasterPos3sv,
-    RasterPos4d,
-    RasterPos4dv,
-    RasterPos4f,
-    RasterPos4fv,
-    RasterPos4i,
-    RasterPos4iv,
-    RasterPos4s,
-    RasterPos4sv,
-    ReadBuffer,
-    ReadPixels,
-    ReadPixelsRobustANGLE,
-    ReadnPixels,
-    ReadnPixelsEXT,
-    ReadnPixelsRobustANGLE,
-    Rectd,
-    Rectdv,
-    Rectf,
-    Rectfv,
-    Recti,
-    Rectiv,
-    Rects,
-    Rectsv,
-    ReleaseShaderCompiler,
-    RenderMode,
-    RenderbufferStorage,
-    RenderbufferStorageMultisample,
-    RenderbufferStorageMultisampleANGLE,
-    RenderbufferStorageMultisampleEXT,
-    RenderbufferStorageOES,
-    RequestExtensionANGLE,
-    ResumeTransformFeedback,
-    Rotated,
-    Rotatef,
-    Rotatex,
-    SampleCoverage,
-    SampleCoveragex,
-    SampleMaski,
-    SampleMaskiANGLE,
-    SamplerParameterIiv,
-    SamplerParameterIivOES,
-    SamplerParameterIivRobustANGLE,
-    SamplerParameterIuiv,
-    SamplerParameterIuivOES,
-    SamplerParameterIuivRobustANGLE,
-    SamplerParameterf,
-    SamplerParameterfv,
-    SamplerParameterfvRobustANGLE,
-    SamplerParameteri,
-    SamplerParameteriv,
-    SamplerParameterivRobustANGLE,
-    Scaled,
-    Scalef,
-    Scalex,
-    Scissor,
-    ScissorArrayv,
-    ScissorIndexed,
-    ScissorIndexedv,
-    SecondaryColor3b,
-    SecondaryColor3bv,
-    SecondaryColor3d,
-    SecondaryColor3dv,
-    SecondaryColor3f,
-    SecondaryColor3fv,
-    SecondaryColor3i,
-    SecondaryColor3iv,
-    SecondaryColor3s,
-    SecondaryColor3sv,
-    SecondaryColor3ub,
-    SecondaryColor3ubv,
-    SecondaryColor3ui,
-    SecondaryColor3uiv,
-    SecondaryColor3us,
-    SecondaryColor3usv,
-    SecondaryColorP3ui,
-    SecondaryColorP3uiv,
-    SecondaryColorPointer,
-    SelectBuffer,
-    SemaphoreParameterui64vEXT,
-    SetFenceNV,
-    ShadeModel,
-    ShaderBinary,
-    ShaderSource,
-    ShaderStorageBlockBinding,
-    SignalSemaphoreEXT,
-    SpecializeShader,
-    StencilFunc,
-    StencilFuncSeparate,
-    StencilMask,
-    StencilMaskSeparate,
-    StencilOp,
-    StencilOpSeparate,
-    TestFenceNV,
-    TexBuffer,
-    TexBufferEXT,
-    TexBufferOES,
-    TexBufferRange,
-    TexBufferRangeEXT,
-    TexBufferRangeOES,
-    TexCoord1d,
-    TexCoord1dv,
-    TexCoord1f,
-    TexCoord1fv,
-    TexCoord1i,
-    TexCoord1iv,
-    TexCoord1s,
-    TexCoord1sv,
-    TexCoord2d,
-    TexCoord2dv,
-    TexCoord2f,
-    TexCoord2fv,
-    TexCoord2i,
-    TexCoord2iv,
-    TexCoord2s,
-    TexCoord2sv,
-    TexCoord3d,
-    TexCoord3dv,
-    TexCoord3f,
-    TexCoord3fv,
-    TexCoord3i,
-    TexCoord3iv,
-    TexCoord3s,
-    TexCoord3sv,
-    TexCoord4d,
-    TexCoord4dv,
-    TexCoord4f,
-    TexCoord4fv,
-    TexCoord4i,
-    TexCoord4iv,
-    TexCoord4s,
-    TexCoord4sv,
-    TexCoordP1ui,
-    TexCoordP1uiv,
-    TexCoordP2ui,
-    TexCoordP2uiv,
-    TexCoordP3ui,
-    TexCoordP3uiv,
-    TexCoordP4ui,
-    TexCoordP4uiv,
-    TexCoordPointer,
-    TexEnvf,
-    TexEnvfv,
-    TexEnvi,
-    TexEnviv,
-    TexEnvx,
-    TexEnvxv,
-    TexGend,
-    TexGendv,
-    TexGenf,
-    TexGenfOES,
-    TexGenfv,
-    TexGenfvOES,
-    TexGeni,
-    TexGeniOES,
-    TexGeniv,
-    TexGenivOES,
-    TexGenxOES,
-    TexGenxvOES,
-    TexImage1D,
-    TexImage2D,
-    TexImage2DExternalANGLE,
-    TexImage2DMultisample,
-    TexImage2DRobustANGLE,
-    TexImage3D,
-    TexImage3DMultisample,
-    TexImage3DOES,
-    TexImage3DRobustANGLE,
-    TexParameterIiv,
-    TexParameterIivOES,
-    TexParameterIivRobustANGLE,
-    TexParameterIuiv,
-    TexParameterIuivOES,
-    TexParameterIuivRobustANGLE,
-    TexParameterf,
-    TexParameterfv,
-    TexParameterfvRobustANGLE,
-    TexParameteri,
-    TexParameteriv,
-    TexParameterivRobustANGLE,
-    TexParameterx,
-    TexParameterxv,
-    TexStorage1D,
-    TexStorage1DEXT,
-    TexStorage2D,
-    TexStorage2DEXT,
-    TexStorage2DMultisample,
-    TexStorage2DMultisampleANGLE,
-    TexStorage3D,
-    TexStorage3DEXT,
-    TexStorage3DMultisample,
-    TexStorage3DMultisampleOES,
-    TexStorageMem2DEXT,
-    TexStorageMem2DMultisampleEXT,
-    TexStorageMem3DEXT,
-    TexStorageMem3DMultisampleEXT,
-    TexStorageMemFlags2DANGLE,
-    TexStorageMemFlags2DMultisampleANGLE,
-    TexStorageMemFlags3DANGLE,
-    TexStorageMemFlags3DMultisampleANGLE,
-    TexSubImage1D,
-    TexSubImage2D,
-    TexSubImage2DRobustANGLE,
-    TexSubImage3D,
-    TexSubImage3DOES,
-    TexSubImage3DRobustANGLE,
-    TextureBarrier,
-    TextureBuffer,
-    TextureBufferRange,
-    TextureParameterIiv,
-    TextureParameterIuiv,
-    TextureParameterf,
-    TextureParameterfv,
-    TextureParameteri,
-    TextureParameteriv,
-    TextureStorage1D,
-    TextureStorage2D,
-    TextureStorage2DMultisample,
-    TextureStorage3D,
-    TextureStorage3DMultisample,
-    TextureSubImage1D,
-    TextureSubImage2D,
-    TextureSubImage3D,
-    TextureView,
-    TransformFeedbackBufferBase,
-    TransformFeedbackBufferRange,
-    TransformFeedbackVaryings,
-    Translated,
-    Translatef,
-    Translatex,
-    Uniform1d,
-    Uniform1dv,
-    Uniform1f,
-    Uniform1fv,
-    Uniform1i,
-    Uniform1iv,
-    Uniform1ui,
-    Uniform1uiv,
-    Uniform2d,
-    Uniform2dv,
-    Uniform2f,
-    Uniform2fv,
-    Uniform2i,
-    Uniform2iv,
-    Uniform2ui,
-    Uniform2uiv,
-    Uniform3d,
-    Uniform3dv,
-    Uniform3f,
-    Uniform3fv,
-    Uniform3i,
-    Uniform3iv,
-    Uniform3ui,
-    Uniform3uiv,
-    Uniform4d,
-    Uniform4dv,
-    Uniform4f,
-    Uniform4fv,
-    Uniform4i,
-    Uniform4iv,
-    Uniform4ui,
-    Uniform4uiv,
-    UniformBlockBinding,
-    UniformMatrix2dv,
-    UniformMatrix2fv,
-    UniformMatrix2x3dv,
-    UniformMatrix2x3fv,
-    UniformMatrix2x4dv,
-    UniformMatrix2x4fv,
-    UniformMatrix3dv,
-    UniformMatrix3fv,
-    UniformMatrix3x2dv,
-    UniformMatrix3x2fv,
-    UniformMatrix3x4dv,
-    UniformMatrix3x4fv,
-    UniformMatrix4dv,
-    UniformMatrix4fv,
-    UniformMatrix4x2dv,
-    UniformMatrix4x2fv,
-    UniformMatrix4x3dv,
-    UniformMatrix4x3fv,
-    UniformSubroutinesuiv,
-    UnmapBuffer,
-    UnmapBufferOES,
-    UnmapNamedBuffer,
-    UseProgram,
-    UseProgramStages,
-    UseProgramStagesEXT,
-    ValidateProgram,
-    ValidateProgramPipeline,
-    ValidateProgramPipelineEXT,
-    Vertex2d,
-    Vertex2dv,
-    Vertex2f,
-    Vertex2fv,
-    Vertex2i,
-    Vertex2iv,
-    Vertex2s,
-    Vertex2sv,
-    Vertex3d,
-    Vertex3dv,
-    Vertex3f,
-    Vertex3fv,
-    Vertex3i,
-    Vertex3iv,
-    Vertex3s,
-    Vertex3sv,
-    Vertex4d,
-    Vertex4dv,
-    Vertex4f,
-    Vertex4fv,
-    Vertex4i,
-    Vertex4iv,
-    Vertex4s,
-    Vertex4sv,
-    VertexArrayAttribBinding,
-    VertexArrayAttribFormat,
-    VertexArrayAttribIFormat,
-    VertexArrayAttribLFormat,
-    VertexArrayBindingDivisor,
-    VertexArrayElementBuffer,
-    VertexArrayVertexBuffer,
-    VertexArrayVertexBuffers,
-    VertexAttrib1d,
-    VertexAttrib1dv,
-    VertexAttrib1f,
-    VertexAttrib1fv,
-    VertexAttrib1s,
-    VertexAttrib1sv,
-    VertexAttrib2d,
-    VertexAttrib2dv,
-    VertexAttrib2f,
-    VertexAttrib2fv,
-    VertexAttrib2s,
-    VertexAttrib2sv,
-    VertexAttrib3d,
-    VertexAttrib3dv,
-    VertexAttrib3f,
-    VertexAttrib3fv,
-    VertexAttrib3s,
-    VertexAttrib3sv,
-    VertexAttrib4Nbv,
-    VertexAttrib4Niv,
-    VertexAttrib4Nsv,
-    VertexAttrib4Nub,
-    VertexAttrib4Nubv,
-    VertexAttrib4Nuiv,
-    VertexAttrib4Nusv,
-    VertexAttrib4bv,
-    VertexAttrib4d,
-    VertexAttrib4dv,
-    VertexAttrib4f,
-    VertexAttrib4fv,
-    VertexAttrib4iv,
-    VertexAttrib4s,
-    VertexAttrib4sv,
-    VertexAttrib4ubv,
-    VertexAttrib4uiv,
-    VertexAttrib4usv,
-    VertexAttribBinding,
-    VertexAttribDivisor,
-    VertexAttribDivisorANGLE,
-    VertexAttribDivisorEXT,
-    VertexAttribFormat,
-    VertexAttribI1i,
-    VertexAttribI1iv,
-    VertexAttribI1ui,
-    VertexAttribI1uiv,
-    VertexAttribI2i,
-    VertexAttribI2iv,
-    VertexAttribI2ui,
-    VertexAttribI2uiv,
-    VertexAttribI3i,
-    VertexAttribI3iv,
-    VertexAttribI3ui,
-    VertexAttribI3uiv,
-    VertexAttribI4bv,
-    VertexAttribI4i,
-    VertexAttribI4iv,
-    VertexAttribI4sv,
-    VertexAttribI4ubv,
-    VertexAttribI4ui,
-    VertexAttribI4uiv,
-    VertexAttribI4usv,
-    VertexAttribIFormat,
-    VertexAttribIPointer,
-    VertexAttribL1d,
-    VertexAttribL1dv,
-    VertexAttribL2d,
-    VertexAttribL2dv,
-    VertexAttribL3d,
-    VertexAttribL3dv,
-    VertexAttribL4d,
-    VertexAttribL4dv,
-    VertexAttribLFormat,
-    VertexAttribLPointer,
-    VertexAttribP1ui,
-    VertexAttribP1uiv,
-    VertexAttribP2ui,
-    VertexAttribP2uiv,
-    VertexAttribP3ui,
-    VertexAttribP3uiv,
-    VertexAttribP4ui,
-    VertexAttribP4uiv,
-    VertexAttribPointer,
-    VertexBindingDivisor,
-    VertexP2ui,
-    VertexP2uiv,
-    VertexP3ui,
-    VertexP3uiv,
-    VertexP4ui,
-    VertexP4uiv,
-    VertexPointer,
-    Viewport,
-    ViewportArrayv,
-    ViewportIndexedf,
-    ViewportIndexedfv,
-    WaitSemaphoreEXT,
-    WaitSync,
-    WeightPointerOES,
-    WindowPos2d,
-    WindowPos2dv,
-    WindowPos2f,
-    WindowPos2fv,
-    WindowPos2i,
-    WindowPos2iv,
-    WindowPos2s,
-    WindowPos2sv,
-    WindowPos3d,
-    WindowPos3dv,
-    WindowPos3f,
-    WindowPos3fv,
-    WindowPos3i,
-    WindowPos3iv,
-    WindowPos3s,
-    WindowPos3sv
+    EGLBindAPI,
+    EGLBindTexImage,
+    EGLChooseConfig,
+    EGLClientWaitSync,
+    EGLClientWaitSyncKHR,
+    EGLCopyBuffers,
+    EGLCreateContext,
+    EGLCreateDeviceANGLE,
+    EGLCreateImage,
+    EGLCreateImageKHR,
+    EGLCreateNativeClientBufferANDROID,
+    EGLCreatePbufferFromClientBuffer,
+    EGLCreatePbufferSurface,
+    EGLCreatePixmapSurface,
+    EGLCreatePlatformPixmapSurface,
+    EGLCreatePlatformPixmapSurfaceEXT,
+    EGLCreatePlatformWindowSurface,
+    EGLCreatePlatformWindowSurfaceEXT,
+    EGLCreateStreamKHR,
+    EGLCreateStreamProducerD3DTextureANGLE,
+    EGLCreateSync,
+    EGLCreateSyncKHR,
+    EGLCreateWindowSurface,
+    EGLDebugMessageControlKHR,
+    EGLDestroyContext,
+    EGLDestroyImage,
+    EGLDestroyImageKHR,
+    EGLDestroyStreamKHR,
+    EGLDestroySurface,
+    EGLDestroySync,
+    EGLDestroySyncKHR,
+    EGLDupNativeFenceFDANDROID,
+    EGLGetCompositorTimingANDROID,
+    EGLGetCompositorTimingSupportedANDROID,
+    EGLGetConfigAttrib,
+    EGLGetConfigs,
+    EGLGetCurrentContext,
+    EGLGetCurrentDisplay,
+    EGLGetCurrentSurface,
+    EGLGetDisplay,
+    EGLGetError,
+    EGLGetFrameTimestampSupportedANDROID,
+    EGLGetFrameTimestampsANDROID,
+    EGLGetMscRateANGLE,
+    EGLGetNativeClientBufferANDROID,
+    EGLGetNextFrameIdANDROID,
+    EGLGetPlatformDisplay,
+    EGLGetPlatformDisplayEXT,
+    EGLGetProcAddress,
+    EGLGetSyncAttrib,
+    EGLGetSyncAttribKHR,
+    EGLGetSyncValuesCHROMIUM,
+    EGLHandleGPUSwitchANGLE,
+    EGLInitialize,
+    EGLLabelObjectKHR,
+    EGLMakeCurrent,
+    EGLPostSubBufferNV,
+    EGLPresentationTimeANDROID,
+    EGLProgramCacheGetAttribANGLE,
+    EGLProgramCachePopulateANGLE,
+    EGLProgramCacheQueryANGLE,
+    EGLProgramCacheResizeANGLE,
+    EGLQueryAPI,
+    EGLQueryContext,
+    EGLQueryDebugKHR,
+    EGLQueryDeviceAttribEXT,
+    EGLQueryDeviceStringEXT,
+    EGLQueryDisplayAttribANGLE,
+    EGLQueryDisplayAttribEXT,
+    EGLQueryStreamKHR,
+    EGLQueryStreamu64KHR,
+    EGLQueryString,
+    EGLQueryStringiANGLE,
+    EGLQuerySurface,
+    EGLQuerySurfacePointerANGLE,
+    EGLReacquireHighPowerGPUANGLE,
+    EGLReleaseDeviceANGLE,
+    EGLReleaseHighPowerGPUANGLE,
+    EGLReleaseTexImage,
+    EGLReleaseThread,
+    EGLSetBlobCacheFuncsANDROID,
+    EGLSignalSyncKHR,
+    EGLStreamAttribKHR,
+    EGLStreamConsumerAcquireKHR,
+    EGLStreamConsumerGLTextureExternalAttribsNV,
+    EGLStreamConsumerGLTextureExternalKHR,
+    EGLStreamConsumerReleaseKHR,
+    EGLStreamPostD3DTextureANGLE,
+    EGLSurfaceAttrib,
+    EGLSwapBuffers,
+    EGLSwapBuffersWithDamageKHR,
+    EGLSwapBuffersWithFrameTokenANGLE,
+    EGLSwapInterval,
+    EGLTerminate,
+    EGLWaitClient,
+    EGLWaitGL,
+    EGLWaitNative,
+    EGLWaitSync,
+    EGLWaitSyncKHR,
+    GLAccum,
+    GLActiveShaderProgram,
+    GLActiveShaderProgramEXT,
+    GLActiveTexture,
+    GLAlphaFunc,
+    GLAlphaFuncx,
+    GLAreTexturesResident,
+    GLArrayElement,
+    GLAttachShader,
+    GLBegin,
+    GLBeginConditionalRender,
+    GLBeginQuery,
+    GLBeginQueryEXT,
+    GLBeginQueryIndexed,
+    GLBeginTransformFeedback,
+    GLBindAttribLocation,
+    GLBindBuffer,
+    GLBindBufferBase,
+    GLBindBufferRange,
+    GLBindBuffersBase,
+    GLBindBuffersRange,
+    GLBindFragDataLocation,
+    GLBindFragDataLocationEXT,
+    GLBindFragDataLocationIndexed,
+    GLBindFragDataLocationIndexedEXT,
+    GLBindFramebuffer,
+    GLBindFramebufferOES,
+    GLBindImageTexture,
+    GLBindImageTextures,
+    GLBindProgramPipeline,
+    GLBindProgramPipelineEXT,
+    GLBindRenderbuffer,
+    GLBindRenderbufferOES,
+    GLBindSampler,
+    GLBindSamplers,
+    GLBindTexture,
+    GLBindTextureUnit,
+    GLBindTextures,
+    GLBindTransformFeedback,
+    GLBindUniformLocationCHROMIUM,
+    GLBindVertexArray,
+    GLBindVertexArrayOES,
+    GLBindVertexBuffer,
+    GLBindVertexBuffers,
+    GLBitmap,
+    GLBlendBarrier,
+    GLBlendColor,
+    GLBlendEquation,
+    GLBlendEquationSeparate,
+    GLBlendEquationSeparatei,
+    GLBlendEquationSeparateiEXT,
+    GLBlendEquationSeparateiOES,
+    GLBlendEquationi,
+    GLBlendEquationiEXT,
+    GLBlendEquationiOES,
+    GLBlendFunc,
+    GLBlendFuncSeparate,
+    GLBlendFuncSeparatei,
+    GLBlendFuncSeparateiEXT,
+    GLBlendFuncSeparateiOES,
+    GLBlendFunci,
+    GLBlendFunciEXT,
+    GLBlendFunciOES,
+    GLBlitFramebuffer,
+    GLBlitFramebufferANGLE,
+    GLBlitNamedFramebuffer,
+    GLBufferData,
+    GLBufferStorage,
+    GLBufferStorageEXT,
+    GLBufferStorageExternalEXT,
+    GLBufferStorageMemEXT,
+    GLBufferSubData,
+    GLCallList,
+    GLCallLists,
+    GLCheckFramebufferStatus,
+    GLCheckFramebufferStatusOES,
+    GLCheckNamedFramebufferStatus,
+    GLClampColor,
+    GLClear,
+    GLClearAccum,
+    GLClearBufferData,
+    GLClearBufferSubData,
+    GLClearBufferfi,
+    GLClearBufferfv,
+    GLClearBufferiv,
+    GLClearBufferuiv,
+    GLClearColor,
+    GLClearColorx,
+    GLClearDepth,
+    GLClearDepthf,
+    GLClearDepthx,
+    GLClearIndex,
+    GLClearNamedBufferData,
+    GLClearNamedBufferSubData,
+    GLClearNamedFramebufferfi,
+    GLClearNamedFramebufferfv,
+    GLClearNamedFramebufferiv,
+    GLClearNamedFramebufferuiv,
+    GLClearStencil,
+    GLClearTexImage,
+    GLClearTexSubImage,
+    GLClientActiveTexture,
+    GLClientWaitSync,
+    GLClipControl,
+    GLClipPlane,
+    GLClipPlanef,
+    GLClipPlanex,
+    GLColor3b,
+    GLColor3bv,
+    GLColor3d,
+    GLColor3dv,
+    GLColor3f,
+    GLColor3fv,
+    GLColor3i,
+    GLColor3iv,
+    GLColor3s,
+    GLColor3sv,
+    GLColor3ub,
+    GLColor3ubv,
+    GLColor3ui,
+    GLColor3uiv,
+    GLColor3us,
+    GLColor3usv,
+    GLColor4b,
+    GLColor4bv,
+    GLColor4d,
+    GLColor4dv,
+    GLColor4f,
+    GLColor4fv,
+    GLColor4i,
+    GLColor4iv,
+    GLColor4s,
+    GLColor4sv,
+    GLColor4ub,
+    GLColor4ubv,
+    GLColor4ui,
+    GLColor4uiv,
+    GLColor4us,
+    GLColor4usv,
+    GLColor4x,
+    GLColorMask,
+    GLColorMaski,
+    GLColorMaskiEXT,
+    GLColorMaskiOES,
+    GLColorMaterial,
+    GLColorP3ui,
+    GLColorP3uiv,
+    GLColorP4ui,
+    GLColorP4uiv,
+    GLColorPointer,
+    GLCompileShader,
+    GLCompressedCopyTextureCHROMIUM,
+    GLCompressedTexImage1D,
+    GLCompressedTexImage2D,
+    GLCompressedTexImage2DRobustANGLE,
+    GLCompressedTexImage3D,
+    GLCompressedTexImage3DOES,
+    GLCompressedTexImage3DRobustANGLE,
+    GLCompressedTexSubImage1D,
+    GLCompressedTexSubImage2D,
+    GLCompressedTexSubImage2DRobustANGLE,
+    GLCompressedTexSubImage3D,
+    GLCompressedTexSubImage3DOES,
+    GLCompressedTexSubImage3DRobustANGLE,
+    GLCompressedTextureSubImage1D,
+    GLCompressedTextureSubImage2D,
+    GLCompressedTextureSubImage3D,
+    GLCopyBufferSubData,
+    GLCopyImageSubData,
+    GLCopyImageSubDataEXT,
+    GLCopyImageSubDataOES,
+    GLCopyNamedBufferSubData,
+    GLCopyPixels,
+    GLCopySubTexture3DANGLE,
+    GLCopySubTextureCHROMIUM,
+    GLCopyTexImage1D,
+    GLCopyTexImage2D,
+    GLCopyTexSubImage1D,
+    GLCopyTexSubImage2D,
+    GLCopyTexSubImage3D,
+    GLCopyTexSubImage3DOES,
+    GLCopyTexture3DANGLE,
+    GLCopyTextureCHROMIUM,
+    GLCopyTextureSubImage1D,
+    GLCopyTextureSubImage2D,
+    GLCopyTextureSubImage3D,
+    GLCoverageModulationCHROMIUM,
+    GLCreateBuffers,
+    GLCreateFramebuffers,
+    GLCreateMemoryObjectsEXT,
+    GLCreateProgram,
+    GLCreateProgramPipelines,
+    GLCreateQueries,
+    GLCreateRenderbuffers,
+    GLCreateSamplers,
+    GLCreateShader,
+    GLCreateShaderProgramv,
+    GLCreateShaderProgramvEXT,
+    GLCreateTextures,
+    GLCreateTransformFeedbacks,
+    GLCreateVertexArrays,
+    GLCullFace,
+    GLCurrentPaletteMatrixOES,
+    GLDebugMessageCallback,
+    GLDebugMessageCallbackKHR,
+    GLDebugMessageControl,
+    GLDebugMessageControlKHR,
+    GLDebugMessageInsert,
+    GLDebugMessageInsertKHR,
+    GLDeleteBuffers,
+    GLDeleteFencesNV,
+    GLDeleteFramebuffers,
+    GLDeleteFramebuffersOES,
+    GLDeleteLists,
+    GLDeleteMemoryObjectsEXT,
+    GLDeleteProgram,
+    GLDeleteProgramPipelines,
+    GLDeleteProgramPipelinesEXT,
+    GLDeleteQueries,
+    GLDeleteQueriesEXT,
+    GLDeleteRenderbuffers,
+    GLDeleteRenderbuffersOES,
+    GLDeleteSamplers,
+    GLDeleteSemaphoresEXT,
+    GLDeleteShader,
+    GLDeleteSync,
+    GLDeleteTextures,
+    GLDeleteTransformFeedbacks,
+    GLDeleteVertexArrays,
+    GLDeleteVertexArraysOES,
+    GLDepthFunc,
+    GLDepthMask,
+    GLDepthRange,
+    GLDepthRangeArrayv,
+    GLDepthRangeIndexed,
+    GLDepthRangef,
+    GLDepthRangex,
+    GLDetachShader,
+    GLDisable,
+    GLDisableClientState,
+    GLDisableExtensionANGLE,
+    GLDisableVertexArrayAttrib,
+    GLDisableVertexAttribArray,
+    GLDisablei,
+    GLDisableiEXT,
+    GLDisableiOES,
+    GLDiscardFramebufferEXT,
+    GLDispatchCompute,
+    GLDispatchComputeIndirect,
+    GLDrawArrays,
+    GLDrawArraysIndirect,
+    GLDrawArraysInstanced,
+    GLDrawArraysInstancedANGLE,
+    GLDrawArraysInstancedBaseInstance,
+    GLDrawArraysInstancedBaseInstanceANGLE,
+    GLDrawArraysInstancedEXT,
+    GLDrawBuffer,
+    GLDrawBuffers,
+    GLDrawBuffersEXT,
+    GLDrawElements,
+    GLDrawElementsBaseVertex,
+    GLDrawElementsBaseVertexEXT,
+    GLDrawElementsBaseVertexOES,
+    GLDrawElementsIndirect,
+    GLDrawElementsInstanced,
+    GLDrawElementsInstancedANGLE,
+    GLDrawElementsInstancedBaseInstance,
+    GLDrawElementsInstancedBaseVertex,
+    GLDrawElementsInstancedBaseVertexBaseInstance,
+    GLDrawElementsInstancedBaseVertexBaseInstanceANGLE,
+    GLDrawElementsInstancedBaseVertexEXT,
+    GLDrawElementsInstancedBaseVertexOES,
+    GLDrawElementsInstancedEXT,
+    GLDrawPixels,
+    GLDrawRangeElements,
+    GLDrawRangeElementsBaseVertex,
+    GLDrawRangeElementsBaseVertexEXT,
+    GLDrawRangeElementsBaseVertexOES,
+    GLDrawTexfOES,
+    GLDrawTexfvOES,
+    GLDrawTexiOES,
+    GLDrawTexivOES,
+    GLDrawTexsOES,
+    GLDrawTexsvOES,
+    GLDrawTexxOES,
+    GLDrawTexxvOES,
+    GLDrawTransformFeedback,
+    GLDrawTransformFeedbackInstanced,
+    GLDrawTransformFeedbackStream,
+    GLDrawTransformFeedbackStreamInstanced,
+    GLEGLImageTargetRenderbufferStorageOES,
+    GLEGLImageTargetTexture2DOES,
+    GLEdgeFlag,
+    GLEdgeFlagPointer,
+    GLEdgeFlagv,
+    GLEnable,
+    GLEnableClientState,
+    GLEnableVertexArrayAttrib,
+    GLEnableVertexAttribArray,
+    GLEnablei,
+    GLEnableiEXT,
+    GLEnableiOES,
+    GLEnd,
+    GLEndConditionalRender,
+    GLEndList,
+    GLEndQuery,
+    GLEndQueryEXT,
+    GLEndQueryIndexed,
+    GLEndTransformFeedback,
+    GLEvalCoord1d,
+    GLEvalCoord1dv,
+    GLEvalCoord1f,
+    GLEvalCoord1fv,
+    GLEvalCoord2d,
+    GLEvalCoord2dv,
+    GLEvalCoord2f,
+    GLEvalCoord2fv,
+    GLEvalMesh1,
+    GLEvalMesh2,
+    GLEvalPoint1,
+    GLEvalPoint2,
+    GLFeedbackBuffer,
+    GLFenceSync,
+    GLFinish,
+    GLFinishFenceNV,
+    GLFlush,
+    GLFlushMappedBufferRange,
+    GLFlushMappedBufferRangeEXT,
+    GLFlushMappedNamedBufferRange,
+    GLFogCoordPointer,
+    GLFogCoordd,
+    GLFogCoorddv,
+    GLFogCoordf,
+    GLFogCoordfv,
+    GLFogf,
+    GLFogfv,
+    GLFogi,
+    GLFogiv,
+    GLFogx,
+    GLFogxv,
+    GLFramebufferParameteri,
+    GLFramebufferRenderbuffer,
+    GLFramebufferRenderbufferOES,
+    GLFramebufferTexture,
+    GLFramebufferTexture1D,
+    GLFramebufferTexture2D,
+    GLFramebufferTexture2DMultisampleEXT,
+    GLFramebufferTexture2DOES,
+    GLFramebufferTexture3D,
+    GLFramebufferTexture3DOES,
+    GLFramebufferTextureEXT,
+    GLFramebufferTextureLayer,
+    GLFramebufferTextureMultiviewOVR,
+    GLFrontFace,
+    GLFrustum,
+    GLFrustumf,
+    GLFrustumx,
+    GLGenBuffers,
+    GLGenFencesNV,
+    GLGenFramebuffers,
+    GLGenFramebuffersOES,
+    GLGenLists,
+    GLGenProgramPipelines,
+    GLGenProgramPipelinesEXT,
+    GLGenQueries,
+    GLGenQueriesEXT,
+    GLGenRenderbuffers,
+    GLGenRenderbuffersOES,
+    GLGenSamplers,
+    GLGenSemaphoresEXT,
+    GLGenTextures,
+    GLGenTransformFeedbacks,
+    GLGenVertexArrays,
+    GLGenVertexArraysOES,
+    GLGenerateMipmap,
+    GLGenerateMipmapOES,
+    GLGenerateTextureMipmap,
+    GLGetActiveAtomicCounterBufferiv,
+    GLGetActiveAttrib,
+    GLGetActiveSubroutineName,
+    GLGetActiveSubroutineUniformName,
+    GLGetActiveSubroutineUniformiv,
+    GLGetActiveUniform,
+    GLGetActiveUniformBlockName,
+    GLGetActiveUniformBlockiv,
+    GLGetActiveUniformBlockivRobustANGLE,
+    GLGetActiveUniformName,
+    GLGetActiveUniformsiv,
+    GLGetAttachedShaders,
+    GLGetAttribLocation,
+    GLGetBooleani_v,
+    GLGetBooleani_vRobustANGLE,
+    GLGetBooleanv,
+    GLGetBooleanvRobustANGLE,
+    GLGetBufferParameteri64v,
+    GLGetBufferParameteri64vRobustANGLE,
+    GLGetBufferParameteriv,
+    GLGetBufferParameterivRobustANGLE,
+    GLGetBufferPointerv,
+    GLGetBufferPointervOES,
+    GLGetBufferPointervRobustANGLE,
+    GLGetBufferSubData,
+    GLGetClipPlane,
+    GLGetClipPlanef,
+    GLGetClipPlanex,
+    GLGetCompressedTexImage,
+    GLGetCompressedTextureImage,
+    GLGetCompressedTextureSubImage,
+    GLGetDebugMessageLog,
+    GLGetDebugMessageLogKHR,
+    GLGetDoublei_v,
+    GLGetDoublev,
+    GLGetError,
+    GLGetFenceivNV,
+    GLGetFixedv,
+    GLGetFloati_v,
+    GLGetFloatv,
+    GLGetFloatvRobustANGLE,
+    GLGetFragDataIndex,
+    GLGetFragDataIndexEXT,
+    GLGetFragDataLocation,
+    GLGetFramebufferAttachmentParameteriv,
+    GLGetFramebufferAttachmentParameterivOES,
+    GLGetFramebufferAttachmentParameterivRobustANGLE,
+    GLGetFramebufferParameteriv,
+    GLGetFramebufferParameterivRobustANGLE,
+    GLGetGraphicsResetStatus,
+    GLGetGraphicsResetStatusEXT,
+    GLGetInteger64i_v,
+    GLGetInteger64i_vRobustANGLE,
+    GLGetInteger64v,
+    GLGetInteger64vEXT,
+    GLGetInteger64vRobustANGLE,
+    GLGetIntegeri_v,
+    GLGetIntegeri_vRobustANGLE,
+    GLGetIntegerv,
+    GLGetIntegervRobustANGLE,
+    GLGetInternalformati64v,
+    GLGetInternalformativ,
+    GLGetInternalformativRobustANGLE,
+    GLGetLightfv,
+    GLGetLightiv,
+    GLGetLightxv,
+    GLGetMapdv,
+    GLGetMapfv,
+    GLGetMapiv,
+    GLGetMaterialfv,
+    GLGetMaterialiv,
+    GLGetMaterialxv,
+    GLGetMemoryObjectParameterivEXT,
+    GLGetMultisamplefv,
+    GLGetMultisamplefvANGLE,
+    GLGetMultisamplefvRobustANGLE,
+    GLGetNamedBufferParameteri64v,
+    GLGetNamedBufferParameteriv,
+    GLGetNamedBufferPointerv,
+    GLGetNamedBufferSubData,
+    GLGetNamedFramebufferAttachmentParameteriv,
+    GLGetNamedFramebufferParameteriv,
+    GLGetNamedRenderbufferParameteriv,
+    GLGetObjectLabel,
+    GLGetObjectLabelEXT,
+    GLGetObjectLabelKHR,
+    GLGetObjectPtrLabel,
+    GLGetObjectPtrLabelKHR,
+    GLGetPixelMapfv,
+    GLGetPixelMapuiv,
+    GLGetPixelMapusv,
+    GLGetPointerv,
+    GLGetPointervKHR,
+    GLGetPointervRobustANGLERobustANGLE,
+    GLGetPolygonStipple,
+    GLGetProgramBinary,
+    GLGetProgramBinaryOES,
+    GLGetProgramInfoLog,
+    GLGetProgramInterfaceiv,
+    GLGetProgramInterfaceivRobustANGLE,
+    GLGetProgramPipelineInfoLog,
+    GLGetProgramPipelineInfoLogEXT,
+    GLGetProgramPipelineiv,
+    GLGetProgramPipelineivEXT,
+    GLGetProgramResourceIndex,
+    GLGetProgramResourceLocation,
+    GLGetProgramResourceLocationIndex,
+    GLGetProgramResourceLocationIndexEXT,
+    GLGetProgramResourceName,
+    GLGetProgramResourceiv,
+    GLGetProgramStageiv,
+    GLGetProgramiv,
+    GLGetProgramivRobustANGLE,
+    GLGetQueryBufferObjecti64v,
+    GLGetQueryBufferObjectiv,
+    GLGetQueryBufferObjectui64v,
+    GLGetQueryBufferObjectuiv,
+    GLGetQueryIndexediv,
+    GLGetQueryObjecti64v,
+    GLGetQueryObjecti64vEXT,
+    GLGetQueryObjecti64vRobustANGLE,
+    GLGetQueryObjectiv,
+    GLGetQueryObjectivEXT,
+    GLGetQueryObjectivRobustANGLE,
+    GLGetQueryObjectui64v,
+    GLGetQueryObjectui64vEXT,
+    GLGetQueryObjectui64vRobustANGLE,
+    GLGetQueryObjectuiv,
+    GLGetQueryObjectuivEXT,
+    GLGetQueryObjectuivRobustANGLE,
+    GLGetQueryiv,
+    GLGetQueryivEXT,
+    GLGetQueryivRobustANGLE,
+    GLGetRenderbufferImageANGLE,
+    GLGetRenderbufferParameteriv,
+    GLGetRenderbufferParameterivOES,
+    GLGetRenderbufferParameterivRobustANGLE,
+    GLGetSamplerParameterIiv,
+    GLGetSamplerParameterIivOES,
+    GLGetSamplerParameterIivRobustANGLE,
+    GLGetSamplerParameterIuiv,
+    GLGetSamplerParameterIuivOES,
+    GLGetSamplerParameterIuivRobustANGLE,
+    GLGetSamplerParameterfv,
+    GLGetSamplerParameterfvRobustANGLE,
+    GLGetSamplerParameteriv,
+    GLGetSamplerParameterivRobustANGLE,
+    GLGetSemaphoreParameterui64vEXT,
+    GLGetShaderInfoLog,
+    GLGetShaderPrecisionFormat,
+    GLGetShaderSource,
+    GLGetShaderiv,
+    GLGetShaderivRobustANGLE,
+    GLGetString,
+    GLGetStringi,
+    GLGetSubroutineIndex,
+    GLGetSubroutineUniformLocation,
+    GLGetSynciv,
+    GLGetTexEnvfv,
+    GLGetTexEnviv,
+    GLGetTexEnvxv,
+    GLGetTexGendv,
+    GLGetTexGenfv,
+    GLGetTexGenfvOES,
+    GLGetTexGeniv,
+    GLGetTexGenivOES,
+    GLGetTexGenxvOES,
+    GLGetTexImage,
+    GLGetTexImageANGLE,
+    GLGetTexLevelParameterfv,
+    GLGetTexLevelParameterfvANGLE,
+    GLGetTexLevelParameterfvRobustANGLE,
+    GLGetTexLevelParameteriv,
+    GLGetTexLevelParameterivANGLE,
+    GLGetTexLevelParameterivRobustANGLE,
+    GLGetTexParameterIiv,
+    GLGetTexParameterIivOES,
+    GLGetTexParameterIivRobustANGLE,
+    GLGetTexParameterIuiv,
+    GLGetTexParameterIuivOES,
+    GLGetTexParameterIuivRobustANGLE,
+    GLGetTexParameterfv,
+    GLGetTexParameterfvRobustANGLE,
+    GLGetTexParameteriv,
+    GLGetTexParameterivRobustANGLE,
+    GLGetTexParameterxv,
+    GLGetTextureImage,
+    GLGetTextureLevelParameterfv,
+    GLGetTextureLevelParameteriv,
+    GLGetTextureParameterIiv,
+    GLGetTextureParameterIuiv,
+    GLGetTextureParameterfv,
+    GLGetTextureParameteriv,
+    GLGetTextureSubImage,
+    GLGetTransformFeedbackVarying,
+    GLGetTransformFeedbacki64_v,
+    GLGetTransformFeedbacki_v,
+    GLGetTransformFeedbackiv,
+    GLGetTranslatedShaderSourceANGLE,
+    GLGetUniformBlockIndex,
+    GLGetUniformIndices,
+    GLGetUniformLocation,
+    GLGetUniformSubroutineuiv,
+    GLGetUniformdv,
+    GLGetUniformfv,
+    GLGetUniformfvRobustANGLE,
+    GLGetUniformiv,
+    GLGetUniformivRobustANGLE,
+    GLGetUniformuiv,
+    GLGetUniformuivRobustANGLE,
+    GLGetUnsignedBytei_vEXT,
+    GLGetUnsignedBytevEXT,
+    GLGetVertexArrayIndexed64iv,
+    GLGetVertexArrayIndexediv,
+    GLGetVertexArrayiv,
+    GLGetVertexAttribIiv,
+    GLGetVertexAttribIivRobustANGLE,
+    GLGetVertexAttribIuiv,
+    GLGetVertexAttribIuivRobustANGLE,
+    GLGetVertexAttribLdv,
+    GLGetVertexAttribPointerv,
+    GLGetVertexAttribPointervRobustANGLE,
+    GLGetVertexAttribdv,
+    GLGetVertexAttribfv,
+    GLGetVertexAttribfvRobustANGLE,
+    GLGetVertexAttribiv,
+    GLGetVertexAttribivRobustANGLE,
+    GLGetnColorTable,
+    GLGetnCompressedTexImage,
+    GLGetnConvolutionFilter,
+    GLGetnHistogram,
+    GLGetnMapdv,
+    GLGetnMapfv,
+    GLGetnMapiv,
+    GLGetnMinmax,
+    GLGetnPixelMapfv,
+    GLGetnPixelMapuiv,
+    GLGetnPixelMapusv,
+    GLGetnPolygonStipple,
+    GLGetnSeparableFilter,
+    GLGetnTexImage,
+    GLGetnUniformdv,
+    GLGetnUniformfv,
+    GLGetnUniformfvEXT,
+    GLGetnUniformfvRobustANGLE,
+    GLGetnUniformiv,
+    GLGetnUniformivEXT,
+    GLGetnUniformivRobustANGLE,
+    GLGetnUniformuiv,
+    GLGetnUniformuivRobustANGLE,
+    GLHint,
+    GLImportMemoryFdEXT,
+    GLImportMemoryZirconHandleANGLE,
+    GLImportSemaphoreFdEXT,
+    GLImportSemaphoreZirconHandleANGLE,
+    GLIndexMask,
+    GLIndexPointer,
+    GLIndexd,
+    GLIndexdv,
+    GLIndexf,
+    GLIndexfv,
+    GLIndexi,
+    GLIndexiv,
+    GLIndexs,
+    GLIndexsv,
+    GLIndexub,
+    GLIndexubv,
+    GLInitNames,
+    GLInsertEventMarkerEXT,
+    GLInterleavedArrays,
+    GLInvalid,
+    GLInvalidateBufferData,
+    GLInvalidateBufferSubData,
+    GLInvalidateFramebuffer,
+    GLInvalidateNamedFramebufferData,
+    GLInvalidateNamedFramebufferSubData,
+    GLInvalidateSubFramebuffer,
+    GLInvalidateTexImage,
+    GLInvalidateTexSubImage,
+    GLInvalidateTextureANGLE,
+    GLIsBuffer,
+    GLIsEnabled,
+    GLIsEnabledi,
+    GLIsEnablediEXT,
+    GLIsEnablediOES,
+    GLIsFenceNV,
+    GLIsFramebuffer,
+    GLIsFramebufferOES,
+    GLIsList,
+    GLIsMemoryObjectEXT,
+    GLIsProgram,
+    GLIsProgramPipeline,
+    GLIsProgramPipelineEXT,
+    GLIsQuery,
+    GLIsQueryEXT,
+    GLIsRenderbuffer,
+    GLIsRenderbufferOES,
+    GLIsSampler,
+    GLIsSemaphoreEXT,
+    GLIsShader,
+    GLIsSync,
+    GLIsTexture,
+    GLIsTransformFeedback,
+    GLIsVertexArray,
+    GLIsVertexArrayOES,
+    GLLabelObjectEXT,
+    GLLightModelf,
+    GLLightModelfv,
+    GLLightModeli,
+    GLLightModeliv,
+    GLLightModelx,
+    GLLightModelxv,
+    GLLightf,
+    GLLightfv,
+    GLLighti,
+    GLLightiv,
+    GLLightx,
+    GLLightxv,
+    GLLineStipple,
+    GLLineWidth,
+    GLLineWidthx,
+    GLLinkProgram,
+    GLListBase,
+    GLLoadIdentity,
+    GLLoadMatrixd,
+    GLLoadMatrixf,
+    GLLoadMatrixx,
+    GLLoadName,
+    GLLoadPaletteFromModelViewMatrixOES,
+    GLLoadTransposeMatrixd,
+    GLLoadTransposeMatrixf,
+    GLLogicOp,
+    GLLoseContextCHROMIUM,
+    GLMap1d,
+    GLMap1f,
+    GLMap2d,
+    GLMap2f,
+    GLMapBuffer,
+    GLMapBufferOES,
+    GLMapBufferRange,
+    GLMapBufferRangeEXT,
+    GLMapGrid1d,
+    GLMapGrid1f,
+    GLMapGrid2d,
+    GLMapGrid2f,
+    GLMapNamedBuffer,
+    GLMapNamedBufferRange,
+    GLMaterialf,
+    GLMaterialfv,
+    GLMateriali,
+    GLMaterialiv,
+    GLMaterialx,
+    GLMaterialxv,
+    GLMatrixIndexPointerOES,
+    GLMatrixMode,
+    GLMaxShaderCompilerThreadsKHR,
+    GLMemoryBarrier,
+    GLMemoryBarrierByRegion,
+    GLMemoryObjectParameterivEXT,
+    GLMinSampleShading,
+    GLMinSampleShadingOES,
+    GLMultMatrixd,
+    GLMultMatrixf,
+    GLMultMatrixx,
+    GLMultTransposeMatrixd,
+    GLMultTransposeMatrixf,
+    GLMultiDrawArrays,
+    GLMultiDrawArraysANGLE,
+    GLMultiDrawArraysIndirect,
+    GLMultiDrawArraysIndirectCount,
+    GLMultiDrawArraysInstancedANGLE,
+    GLMultiDrawArraysInstancedBaseInstanceANGLE,
+    GLMultiDrawElements,
+    GLMultiDrawElementsANGLE,
+    GLMultiDrawElementsBaseVertex,
+    GLMultiDrawElementsBaseVertexEXT,
+    GLMultiDrawElementsIndirect,
+    GLMultiDrawElementsIndirectCount,
+    GLMultiDrawElementsInstancedANGLE,
+    GLMultiDrawElementsInstancedBaseVertexBaseInstanceANGLE,
+    GLMultiTexCoord1d,
+    GLMultiTexCoord1dv,
+    GLMultiTexCoord1f,
+    GLMultiTexCoord1fv,
+    GLMultiTexCoord1i,
+    GLMultiTexCoord1iv,
+    GLMultiTexCoord1s,
+    GLMultiTexCoord1sv,
+    GLMultiTexCoord2d,
+    GLMultiTexCoord2dv,
+    GLMultiTexCoord2f,
+    GLMultiTexCoord2fv,
+    GLMultiTexCoord2i,
+    GLMultiTexCoord2iv,
+    GLMultiTexCoord2s,
+    GLMultiTexCoord2sv,
+    GLMultiTexCoord3d,
+    GLMultiTexCoord3dv,
+    GLMultiTexCoord3f,
+    GLMultiTexCoord3fv,
+    GLMultiTexCoord3i,
+    GLMultiTexCoord3iv,
+    GLMultiTexCoord3s,
+    GLMultiTexCoord3sv,
+    GLMultiTexCoord4d,
+    GLMultiTexCoord4dv,
+    GLMultiTexCoord4f,
+    GLMultiTexCoord4fv,
+    GLMultiTexCoord4i,
+    GLMultiTexCoord4iv,
+    GLMultiTexCoord4s,
+    GLMultiTexCoord4sv,
+    GLMultiTexCoord4x,
+    GLMultiTexCoordP1ui,
+    GLMultiTexCoordP1uiv,
+    GLMultiTexCoordP2ui,
+    GLMultiTexCoordP2uiv,
+    GLMultiTexCoordP3ui,
+    GLMultiTexCoordP3uiv,
+    GLMultiTexCoordP4ui,
+    GLMultiTexCoordP4uiv,
+    GLNamedBufferData,
+    GLNamedBufferStorage,
+    GLNamedBufferStorageExternalEXT,
+    GLNamedBufferSubData,
+    GLNamedFramebufferDrawBuffer,
+    GLNamedFramebufferDrawBuffers,
+    GLNamedFramebufferParameteri,
+    GLNamedFramebufferReadBuffer,
+    GLNamedFramebufferRenderbuffer,
+    GLNamedFramebufferTexture,
+    GLNamedFramebufferTextureLayer,
+    GLNamedRenderbufferStorage,
+    GLNamedRenderbufferStorageMultisample,
+    GLNewList,
+    GLNormal3b,
+    GLNormal3bv,
+    GLNormal3d,
+    GLNormal3dv,
+    GLNormal3f,
+    GLNormal3fv,
+    GLNormal3i,
+    GLNormal3iv,
+    GLNormal3s,
+    GLNormal3sv,
+    GLNormal3x,
+    GLNormalP3ui,
+    GLNormalP3uiv,
+    GLNormalPointer,
+    GLObjectLabel,
+    GLObjectLabelKHR,
+    GLObjectPtrLabel,
+    GLObjectPtrLabelKHR,
+    GLOrtho,
+    GLOrthof,
+    GLOrthox,
+    GLPassThrough,
+    GLPatchParameterfv,
+    GLPatchParameteri,
+    GLPatchParameteriEXT,
+    GLPauseTransformFeedback,
+    GLPixelMapfv,
+    GLPixelMapuiv,
+    GLPixelMapusv,
+    GLPixelStoref,
+    GLPixelStorei,
+    GLPixelTransferf,
+    GLPixelTransferi,
+    GLPixelZoom,
+    GLPointParameterf,
+    GLPointParameterfv,
+    GLPointParameteri,
+    GLPointParameteriv,
+    GLPointParameterx,
+    GLPointParameterxv,
+    GLPointSize,
+    GLPointSizePointerOES,
+    GLPointSizex,
+    GLPolygonMode,
+    GLPolygonOffset,
+    GLPolygonOffsetClamp,
+    GLPolygonOffsetx,
+    GLPolygonStipple,
+    GLPopAttrib,
+    GLPopClientAttrib,
+    GLPopDebugGroup,
+    GLPopDebugGroupKHR,
+    GLPopGroupMarkerEXT,
+    GLPopMatrix,
+    GLPopName,
+    GLPrimitiveBoundingBox,
+    GLPrimitiveRestartIndex,
+    GLPrioritizeTextures,
+    GLProgramBinary,
+    GLProgramBinaryOES,
+    GLProgramParameteri,
+    GLProgramParameteriEXT,
+    GLProgramUniform1d,
+    GLProgramUniform1dv,
+    GLProgramUniform1f,
+    GLProgramUniform1fEXT,
+    GLProgramUniform1fv,
+    GLProgramUniform1fvEXT,
+    GLProgramUniform1i,
+    GLProgramUniform1iEXT,
+    GLProgramUniform1iv,
+    GLProgramUniform1ivEXT,
+    GLProgramUniform1ui,
+    GLProgramUniform1uiEXT,
+    GLProgramUniform1uiv,
+    GLProgramUniform1uivEXT,
+    GLProgramUniform2d,
+    GLProgramUniform2dv,
+    GLProgramUniform2f,
+    GLProgramUniform2fEXT,
+    GLProgramUniform2fv,
+    GLProgramUniform2fvEXT,
+    GLProgramUniform2i,
+    GLProgramUniform2iEXT,
+    GLProgramUniform2iv,
+    GLProgramUniform2ivEXT,
+    GLProgramUniform2ui,
+    GLProgramUniform2uiEXT,
+    GLProgramUniform2uiv,
+    GLProgramUniform2uivEXT,
+    GLProgramUniform3d,
+    GLProgramUniform3dv,
+    GLProgramUniform3f,
+    GLProgramUniform3fEXT,
+    GLProgramUniform3fv,
+    GLProgramUniform3fvEXT,
+    GLProgramUniform3i,
+    GLProgramUniform3iEXT,
+    GLProgramUniform3iv,
+    GLProgramUniform3ivEXT,
+    GLProgramUniform3ui,
+    GLProgramUniform3uiEXT,
+    GLProgramUniform3uiv,
+    GLProgramUniform3uivEXT,
+    GLProgramUniform4d,
+    GLProgramUniform4dv,
+    GLProgramUniform4f,
+    GLProgramUniform4fEXT,
+    GLProgramUniform4fv,
+    GLProgramUniform4fvEXT,
+    GLProgramUniform4i,
+    GLProgramUniform4iEXT,
+    GLProgramUniform4iv,
+    GLProgramUniform4ivEXT,
+    GLProgramUniform4ui,
+    GLProgramUniform4uiEXT,
+    GLProgramUniform4uiv,
+    GLProgramUniform4uivEXT,
+    GLProgramUniformMatrix2dv,
+    GLProgramUniformMatrix2fv,
+    GLProgramUniformMatrix2fvEXT,
+    GLProgramUniformMatrix2x3dv,
+    GLProgramUniformMatrix2x3fv,
+    GLProgramUniformMatrix2x3fvEXT,
+    GLProgramUniformMatrix2x4dv,
+    GLProgramUniformMatrix2x4fv,
+    GLProgramUniformMatrix2x4fvEXT,
+    GLProgramUniformMatrix3dv,
+    GLProgramUniformMatrix3fv,
+    GLProgramUniformMatrix3fvEXT,
+    GLProgramUniformMatrix3x2dv,
+    GLProgramUniformMatrix3x2fv,
+    GLProgramUniformMatrix3x2fvEXT,
+    GLProgramUniformMatrix3x4dv,
+    GLProgramUniformMatrix3x4fv,
+    GLProgramUniformMatrix3x4fvEXT,
+    GLProgramUniformMatrix4dv,
+    GLProgramUniformMatrix4fv,
+    GLProgramUniformMatrix4fvEXT,
+    GLProgramUniformMatrix4x2dv,
+    GLProgramUniformMatrix4x2fv,
+    GLProgramUniformMatrix4x2fvEXT,
+    GLProgramUniformMatrix4x3dv,
+    GLProgramUniformMatrix4x3fv,
+    GLProgramUniformMatrix4x3fvEXT,
+    GLProvokingVertex,
+    GLProvokingVertexANGLE,
+    GLPushAttrib,
+    GLPushClientAttrib,
+    GLPushDebugGroup,
+    GLPushDebugGroupKHR,
+    GLPushGroupMarkerEXT,
+    GLPushMatrix,
+    GLPushName,
+    GLQueryCounter,
+    GLQueryCounterEXT,
+    GLQueryMatrixxOES,
+    GLRasterPos2d,
+    GLRasterPos2dv,
+    GLRasterPos2f,
+    GLRasterPos2fv,
+    GLRasterPos2i,
+    GLRasterPos2iv,
+    GLRasterPos2s,
+    GLRasterPos2sv,
+    GLRasterPos3d,
+    GLRasterPos3dv,
+    GLRasterPos3f,
+    GLRasterPos3fv,
+    GLRasterPos3i,
+    GLRasterPos3iv,
+    GLRasterPos3s,
+    GLRasterPos3sv,
+    GLRasterPos4d,
+    GLRasterPos4dv,
+    GLRasterPos4f,
+    GLRasterPos4fv,
+    GLRasterPos4i,
+    GLRasterPos4iv,
+    GLRasterPos4s,
+    GLRasterPos4sv,
+    GLReadBuffer,
+    GLReadPixels,
+    GLReadPixelsRobustANGLE,
+    GLReadnPixels,
+    GLReadnPixelsEXT,
+    GLReadnPixelsRobustANGLE,
+    GLRectd,
+    GLRectdv,
+    GLRectf,
+    GLRectfv,
+    GLRecti,
+    GLRectiv,
+    GLRects,
+    GLRectsv,
+    GLReleaseShaderCompiler,
+    GLRenderMode,
+    GLRenderbufferStorage,
+    GLRenderbufferStorageMultisample,
+    GLRenderbufferStorageMultisampleANGLE,
+    GLRenderbufferStorageMultisampleEXT,
+    GLRenderbufferStorageOES,
+    GLRequestExtensionANGLE,
+    GLResumeTransformFeedback,
+    GLRotated,
+    GLRotatef,
+    GLRotatex,
+    GLSampleCoverage,
+    GLSampleCoveragex,
+    GLSampleMaski,
+    GLSampleMaskiANGLE,
+    GLSamplerParameterIiv,
+    GLSamplerParameterIivOES,
+    GLSamplerParameterIivRobustANGLE,
+    GLSamplerParameterIuiv,
+    GLSamplerParameterIuivOES,
+    GLSamplerParameterIuivRobustANGLE,
+    GLSamplerParameterf,
+    GLSamplerParameterfv,
+    GLSamplerParameterfvRobustANGLE,
+    GLSamplerParameteri,
+    GLSamplerParameteriv,
+    GLSamplerParameterivRobustANGLE,
+    GLScaled,
+    GLScalef,
+    GLScalex,
+    GLScissor,
+    GLScissorArrayv,
+    GLScissorIndexed,
+    GLScissorIndexedv,
+    GLSecondaryColor3b,
+    GLSecondaryColor3bv,
+    GLSecondaryColor3d,
+    GLSecondaryColor3dv,
+    GLSecondaryColor3f,
+    GLSecondaryColor3fv,
+    GLSecondaryColor3i,
+    GLSecondaryColor3iv,
+    GLSecondaryColor3s,
+    GLSecondaryColor3sv,
+    GLSecondaryColor3ub,
+    GLSecondaryColor3ubv,
+    GLSecondaryColor3ui,
+    GLSecondaryColor3uiv,
+    GLSecondaryColor3us,
+    GLSecondaryColor3usv,
+    GLSecondaryColorP3ui,
+    GLSecondaryColorP3uiv,
+    GLSecondaryColorPointer,
+    GLSelectBuffer,
+    GLSemaphoreParameterui64vEXT,
+    GLSetFenceNV,
+    GLShadeModel,
+    GLShaderBinary,
+    GLShaderSource,
+    GLShaderStorageBlockBinding,
+    GLSignalSemaphoreEXT,
+    GLSpecializeShader,
+    GLStencilFunc,
+    GLStencilFuncSeparate,
+    GLStencilMask,
+    GLStencilMaskSeparate,
+    GLStencilOp,
+    GLStencilOpSeparate,
+    GLTestFenceNV,
+    GLTexBuffer,
+    GLTexBufferEXT,
+    GLTexBufferOES,
+    GLTexBufferRange,
+    GLTexBufferRangeEXT,
+    GLTexBufferRangeOES,
+    GLTexCoord1d,
+    GLTexCoord1dv,
+    GLTexCoord1f,
+    GLTexCoord1fv,
+    GLTexCoord1i,
+    GLTexCoord1iv,
+    GLTexCoord1s,
+    GLTexCoord1sv,
+    GLTexCoord2d,
+    GLTexCoord2dv,
+    GLTexCoord2f,
+    GLTexCoord2fv,
+    GLTexCoord2i,
+    GLTexCoord2iv,
+    GLTexCoord2s,
+    GLTexCoord2sv,
+    GLTexCoord3d,
+    GLTexCoord3dv,
+    GLTexCoord3f,
+    GLTexCoord3fv,
+    GLTexCoord3i,
+    GLTexCoord3iv,
+    GLTexCoord3s,
+    GLTexCoord3sv,
+    GLTexCoord4d,
+    GLTexCoord4dv,
+    GLTexCoord4f,
+    GLTexCoord4fv,
+    GLTexCoord4i,
+    GLTexCoord4iv,
+    GLTexCoord4s,
+    GLTexCoord4sv,
+    GLTexCoordP1ui,
+    GLTexCoordP1uiv,
+    GLTexCoordP2ui,
+    GLTexCoordP2uiv,
+    GLTexCoordP3ui,
+    GLTexCoordP3uiv,
+    GLTexCoordP4ui,
+    GLTexCoordP4uiv,
+    GLTexCoordPointer,
+    GLTexEnvf,
+    GLTexEnvfv,
+    GLTexEnvi,
+    GLTexEnviv,
+    GLTexEnvx,
+    GLTexEnvxv,
+    GLTexGend,
+    GLTexGendv,
+    GLTexGenf,
+    GLTexGenfOES,
+    GLTexGenfv,
+    GLTexGenfvOES,
+    GLTexGeni,
+    GLTexGeniOES,
+    GLTexGeniv,
+    GLTexGenivOES,
+    GLTexGenxOES,
+    GLTexGenxvOES,
+    GLTexImage1D,
+    GLTexImage2D,
+    GLTexImage2DExternalANGLE,
+    GLTexImage2DMultisample,
+    GLTexImage2DRobustANGLE,
+    GLTexImage3D,
+    GLTexImage3DMultisample,
+    GLTexImage3DOES,
+    GLTexImage3DRobustANGLE,
+    GLTexParameterIiv,
+    GLTexParameterIivOES,
+    GLTexParameterIivRobustANGLE,
+    GLTexParameterIuiv,
+    GLTexParameterIuivOES,
+    GLTexParameterIuivRobustANGLE,
+    GLTexParameterf,
+    GLTexParameterfv,
+    GLTexParameterfvRobustANGLE,
+    GLTexParameteri,
+    GLTexParameteriv,
+    GLTexParameterivRobustANGLE,
+    GLTexParameterx,
+    GLTexParameterxv,
+    GLTexStorage1D,
+    GLTexStorage1DEXT,
+    GLTexStorage2D,
+    GLTexStorage2DEXT,
+    GLTexStorage2DMultisample,
+    GLTexStorage2DMultisampleANGLE,
+    GLTexStorage3D,
+    GLTexStorage3DEXT,
+    GLTexStorage3DMultisample,
+    GLTexStorage3DMultisampleOES,
+    GLTexStorageMem2DEXT,
+    GLTexStorageMem2DMultisampleEXT,
+    GLTexStorageMem3DEXT,
+    GLTexStorageMem3DMultisampleEXT,
+    GLTexStorageMemFlags2DANGLE,
+    GLTexStorageMemFlags2DMultisampleANGLE,
+    GLTexStorageMemFlags3DANGLE,
+    GLTexStorageMemFlags3DMultisampleANGLE,
+    GLTexSubImage1D,
+    GLTexSubImage2D,
+    GLTexSubImage2DRobustANGLE,
+    GLTexSubImage3D,
+    GLTexSubImage3DOES,
+    GLTexSubImage3DRobustANGLE,
+    GLTextureBarrier,
+    GLTextureBuffer,
+    GLTextureBufferRange,
+    GLTextureParameterIiv,
+    GLTextureParameterIuiv,
+    GLTextureParameterf,
+    GLTextureParameterfv,
+    GLTextureParameteri,
+    GLTextureParameteriv,
+    GLTextureStorage1D,
+    GLTextureStorage2D,
+    GLTextureStorage2DMultisample,
+    GLTextureStorage3D,
+    GLTextureStorage3DMultisample,
+    GLTextureSubImage1D,
+    GLTextureSubImage2D,
+    GLTextureSubImage3D,
+    GLTextureView,
+    GLTransformFeedbackBufferBase,
+    GLTransformFeedbackBufferRange,
+    GLTransformFeedbackVaryings,
+    GLTranslated,
+    GLTranslatef,
+    GLTranslatex,
+    GLUniform1d,
+    GLUniform1dv,
+    GLUniform1f,
+    GLUniform1fv,
+    GLUniform1i,
+    GLUniform1iv,
+    GLUniform1ui,
+    GLUniform1uiv,
+    GLUniform2d,
+    GLUniform2dv,
+    GLUniform2f,
+    GLUniform2fv,
+    GLUniform2i,
+    GLUniform2iv,
+    GLUniform2ui,
+    GLUniform2uiv,
+    GLUniform3d,
+    GLUniform3dv,
+    GLUniform3f,
+    GLUniform3fv,
+    GLUniform3i,
+    GLUniform3iv,
+    GLUniform3ui,
+    GLUniform3uiv,
+    GLUniform4d,
+    GLUniform4dv,
+    GLUniform4f,
+    GLUniform4fv,
+    GLUniform4i,
+    GLUniform4iv,
+    GLUniform4ui,
+    GLUniform4uiv,
+    GLUniformBlockBinding,
+    GLUniformMatrix2dv,
+    GLUniformMatrix2fv,
+    GLUniformMatrix2x3dv,
+    GLUniformMatrix2x3fv,
+    GLUniformMatrix2x4dv,
+    GLUniformMatrix2x4fv,
+    GLUniformMatrix3dv,
+    GLUniformMatrix3fv,
+    GLUniformMatrix3x2dv,
+    GLUniformMatrix3x2fv,
+    GLUniformMatrix3x4dv,
+    GLUniformMatrix3x4fv,
+    GLUniformMatrix4dv,
+    GLUniformMatrix4fv,
+    GLUniformMatrix4x2dv,
+    GLUniformMatrix4x2fv,
+    GLUniformMatrix4x3dv,
+    GLUniformMatrix4x3fv,
+    GLUniformSubroutinesuiv,
+    GLUnmapBuffer,
+    GLUnmapBufferOES,
+    GLUnmapNamedBuffer,
+    GLUseProgram,
+    GLUseProgramStages,
+    GLUseProgramStagesEXT,
+    GLValidateProgram,
+    GLValidateProgramPipeline,
+    GLValidateProgramPipelineEXT,
+    GLVertex2d,
+    GLVertex2dv,
+    GLVertex2f,
+    GLVertex2fv,
+    GLVertex2i,
+    GLVertex2iv,
+    GLVertex2s,
+    GLVertex2sv,
+    GLVertex3d,
+    GLVertex3dv,
+    GLVertex3f,
+    GLVertex3fv,
+    GLVertex3i,
+    GLVertex3iv,
+    GLVertex3s,
+    GLVertex3sv,
+    GLVertex4d,
+    GLVertex4dv,
+    GLVertex4f,
+    GLVertex4fv,
+    GLVertex4i,
+    GLVertex4iv,
+    GLVertex4s,
+    GLVertex4sv,
+    GLVertexArrayAttribBinding,
+    GLVertexArrayAttribFormat,
+    GLVertexArrayAttribIFormat,
+    GLVertexArrayAttribLFormat,
+    GLVertexArrayBindingDivisor,
+    GLVertexArrayElementBuffer,
+    GLVertexArrayVertexBuffer,
+    GLVertexArrayVertexBuffers,
+    GLVertexAttrib1d,
+    GLVertexAttrib1dv,
+    GLVertexAttrib1f,
+    GLVertexAttrib1fv,
+    GLVertexAttrib1s,
+    GLVertexAttrib1sv,
+    GLVertexAttrib2d,
+    GLVertexAttrib2dv,
+    GLVertexAttrib2f,
+    GLVertexAttrib2fv,
+    GLVertexAttrib2s,
+    GLVertexAttrib2sv,
+    GLVertexAttrib3d,
+    GLVertexAttrib3dv,
+    GLVertexAttrib3f,
+    GLVertexAttrib3fv,
+    GLVertexAttrib3s,
+    GLVertexAttrib3sv,
+    GLVertexAttrib4Nbv,
+    GLVertexAttrib4Niv,
+    GLVertexAttrib4Nsv,
+    GLVertexAttrib4Nub,
+    GLVertexAttrib4Nubv,
+    GLVertexAttrib4Nuiv,
+    GLVertexAttrib4Nusv,
+    GLVertexAttrib4bv,
+    GLVertexAttrib4d,
+    GLVertexAttrib4dv,
+    GLVertexAttrib4f,
+    GLVertexAttrib4fv,
+    GLVertexAttrib4iv,
+    GLVertexAttrib4s,
+    GLVertexAttrib4sv,
+    GLVertexAttrib4ubv,
+    GLVertexAttrib4uiv,
+    GLVertexAttrib4usv,
+    GLVertexAttribBinding,
+    GLVertexAttribDivisor,
+    GLVertexAttribDivisorANGLE,
+    GLVertexAttribDivisorEXT,
+    GLVertexAttribFormat,
+    GLVertexAttribI1i,
+    GLVertexAttribI1iv,
+    GLVertexAttribI1ui,
+    GLVertexAttribI1uiv,
+    GLVertexAttribI2i,
+    GLVertexAttribI2iv,
+    GLVertexAttribI2ui,
+    GLVertexAttribI2uiv,
+    GLVertexAttribI3i,
+    GLVertexAttribI3iv,
+    GLVertexAttribI3ui,
+    GLVertexAttribI3uiv,
+    GLVertexAttribI4bv,
+    GLVertexAttribI4i,
+    GLVertexAttribI4iv,
+    GLVertexAttribI4sv,
+    GLVertexAttribI4ubv,
+    GLVertexAttribI4ui,
+    GLVertexAttribI4uiv,
+    GLVertexAttribI4usv,
+    GLVertexAttribIFormat,
+    GLVertexAttribIPointer,
+    GLVertexAttribL1d,
+    GLVertexAttribL1dv,
+    GLVertexAttribL2d,
+    GLVertexAttribL2dv,
+    GLVertexAttribL3d,
+    GLVertexAttribL3dv,
+    GLVertexAttribL4d,
+    GLVertexAttribL4dv,
+    GLVertexAttribLFormat,
+    GLVertexAttribLPointer,
+    GLVertexAttribP1ui,
+    GLVertexAttribP1uiv,
+    GLVertexAttribP2ui,
+    GLVertexAttribP2uiv,
+    GLVertexAttribP3ui,
+    GLVertexAttribP3uiv,
+    GLVertexAttribP4ui,
+    GLVertexAttribP4uiv,
+    GLVertexAttribPointer,
+    GLVertexBindingDivisor,
+    GLVertexP2ui,
+    GLVertexP2uiv,
+    GLVertexP3ui,
+    GLVertexP3uiv,
+    GLVertexP4ui,
+    GLVertexP4uiv,
+    GLVertexPointer,
+    GLViewport,
+    GLViewportArrayv,
+    GLViewportIndexedf,
+    GLViewportIndexedfv,
+    GLWaitSemaphoreEXT,
+    GLWaitSync,
+    GLWeightPointerOES,
+    GLWindowPos2d,
+    GLWindowPos2dv,
+    GLWindowPos2f,
+    GLWindowPos2fv,
+    GLWindowPos2i,
+    GLWindowPos2iv,
+    GLWindowPos2s,
+    GLWindowPos2sv,
+    GLWindowPos3d,
+    GLWindowPos3dv,
+    GLWindowPos3f,
+    GLWindowPos3fv,
+    GLWindowPos3i,
+    GLWindowPos3iv,
+    GLWindowPos3s,
+    GLWindowPos3sv,
+    WGLChoosePixelFormat,
+    WGLCopyContext,
+    WGLCreateContext,
+    WGLCreateLayerContext,
+    WGLDeleteContext,
+    WGLDescribeLayerPlane,
+    WGLDescribePixelFormat,
+    WGLGetCurrentContext,
+    WGLGetCurrentDC,
+    WGLGetEnhMetaFilePixelFormat,
+    WGLGetLayerPaletteEntries,
+    WGLGetPixelFormat,
+    WGLGetProcAddress,
+    WGLMakeCurrent,
+    WGLRealizeLayerPalette,
+    WGLSetLayerPaletteEntries,
+    WGLSetPixelFormat,
+    WGLShareLists,
+    WGLSwapBuffers,
+    WGLSwapLayerBuffers,
+    WGLUseFontBitmaps,
+    WGLUseFontBitmapsA,
+    WGLUseFontBitmapsW,
+    WGLUseFontOutlines,
+    WGLUseFontOutlinesA,
+    WGLUseFontOutlinesW
 };
 
 const char *GetEntryPointName(EntryPoint ep);
-}  // namespace gl
+}  // namespace angle
 #endif  // COMMON_ENTRY_POINTS_ENUM_AUTOGEN_H_
diff --git a/src/common/packed_gl_enums.json b/src/common/packed_gl_enums.json
index 3c520ec..0f39299 100644
--- a/src/common/packed_gl_enums.json
+++ b/src/common/packed_gl_enums.json
@@ -110,10 +110,10 @@
     "ShaderType":
     {
         "Vertex": "GL_VERTEX_SHADER",
-        "Fragment": "GL_FRAGMENT_SHADER",
-        "Geometry": "GL_GEOMETRY_SHADER_EXT",
         "TessControl": "GL_TESS_CONTROL_SHADER_EXT",
         "TessEvaluation": "GL_TESS_EVALUATION_SHADER_EXT",
+        "Geometry": "GL_GEOMETRY_SHADER_EXT",
+        "Fragment": "GL_FRAGMENT_SHADER",
         "Compute": "GL_COMPUTE_SHADER"
     },
     "ShadingModel":
diff --git a/src/common/utilities.cpp b/src/common/utilities.cpp
index 4275a3d..b903f21 100644
--- a/src/common/utilities.cpp
+++ b/src/common/utilities.cpp
@@ -10,6 +10,7 @@
 #include "GLES3/gl3.h"
 #include "common/mathutil.h"
 #include "common/platform.h"
+#include "common/string_utils.h"
 
 #include <set>
 
@@ -920,6 +921,11 @@
     return name.substr(0, baseNameLength);
 }
 
+bool IsBuiltInName(const char *name)
+{
+    return angle::BeginsWith(name, "gl_");
+}
+
 std::string StripLastArrayIndex(const std::string &name)
 {
     size_t strippedNameLength = name.find_last_of('[');
@@ -1123,6 +1129,40 @@
             return "Unknown Severity";
     }
 }
+
+ShaderType GetShaderTypeFromBitfield(size_t singleShaderType)
+{
+    switch (singleShaderType)
+    {
+        case GL_VERTEX_SHADER_BIT:
+            return ShaderType::Vertex;
+        case GL_FRAGMENT_SHADER_BIT:
+            return ShaderType::Fragment;
+        case GL_COMPUTE_SHADER_BIT:
+            return ShaderType::Compute;
+        case GL_GEOMETRY_SHADER_BIT:
+            return ShaderType::Geometry;
+        case GL_TESS_CONTROL_SHADER_BIT:
+            return ShaderType::TessControl;
+        case GL_TESS_EVALUATION_SHADER_BIT:
+            return ShaderType::TessEvaluation;
+        default:
+            return ShaderType::InvalidEnum;
+    }
+}
+
+bool ShaderTypeSupportsTransformFeedback(ShaderType shaderType)
+{
+    switch (shaderType)
+    {
+        case ShaderType::Vertex:
+        case ShaderType::Geometry:
+        case ShaderType::TessEvaluation:
+            return true;
+        default:
+            return false;
+    }
+}
 }  // namespace gl
 
 namespace egl
diff --git a/src/common/utilities.h b/src/common/utilities.h
index 4a1f2c4..1795e45 100644
--- a/src/common/utilities.h
+++ b/src/common/utilities.h
@@ -62,6 +62,12 @@
 // outSubscripts.
 std::string ParseResourceName(const std::string &name, std::vector<unsigned int> *outSubscripts);
 
+bool IsBuiltInName(const char *name);
+ANGLE_INLINE bool IsBuiltInName(const std::string &name)
+{
+    return IsBuiltInName(name.c_str());
+}
+
 // Strips only the last array index from a resource name.
 std::string StripLastArrayIndex(const std::string &name);
 
@@ -239,6 +245,9 @@
     Linear
 };
 
+ShaderType GetShaderTypeFromBitfield(size_t singleShaderType);
+bool ShaderTypeSupportsTransformFeedback(ShaderType shaderType);
+
 }  // namespace gl
 
 namespace egl
diff --git a/src/compiler.gni b/src/compiler.gni
index 4640d70..2de7f36 100644
--- a/src/compiler.gni
+++ b/src/compiler.gni
@@ -150,8 +150,8 @@
   "src/compiler/translator/tree_ops/PruneNoOps.h",
   "src/compiler/translator/tree_ops/RecordConstantPrecision.cpp",
   "src/compiler/translator/tree_ops/RecordConstantPrecision.h",
-  "src/compiler/translator/tree_ops/RecordUniformBlocksTranslatedToStructuredBuffers.cpp",
-  "src/compiler/translator/tree_ops/RecordUniformBlocksTranslatedToStructuredBuffers.h",
+  "src/compiler/translator/tree_ops/RecordUniformBlocksWithLargeArrayMember.cpp",
+  "src/compiler/translator/tree_ops/RecordUniformBlocksWithLargeArrayMember.h",
   "src/compiler/translator/tree_ops/RegenerateStructNames.cpp",
   "src/compiler/translator/tree_ops/RegenerateStructNames.h",
   "src/compiler/translator/tree_ops/RemoveArrayLengthMethod.cpp",
diff --git a/src/compiler/fuzz/translator_fuzzer.cpp b/src/compiler/fuzz/translator_fuzzer.cpp
index b939139..cf29817 100644
--- a/src/compiler/fuzz/translator_fuzzer.cpp
+++ b/src/compiler/fuzz/translator_fuzzer.cpp
@@ -130,7 +130,7 @@
     key.output = output;
 
     using UniqueTCompiler = std::unique_ptr<TCompiler, TCompilerDeleter>;
-    static angle::base::NoDestructor<std::unordered_map<TranslatorCacheKey, UniqueTCompiler>>
+    static angle::base::NoDestructor<angle::HashMap<TranslatorCacheKey, UniqueTCompiler>>
         translators;
 
     if (translators->find(key) == translators->end())
diff --git a/src/compiler/translator/BaseTypes.h b/src/compiler/translator/BaseTypes.h
index bdc60cc..15603e0 100644
--- a/src/compiler/translator/BaseTypes.h
+++ b/src/compiler/translator/BaseTypes.h
@@ -1093,6 +1093,26 @@
     }
 }
 
+inline bool IsShaderIoBlock(TQualifier qualifier)
+{
+    switch (qualifier)
+    {
+        case EvqPerVertexIn:
+        case EvqPerVertexOut:
+        case EvqVertexOut:
+        case EvqTessControlIn:
+        case EvqTessControlOut:
+        case EvqTessEvaluationIn:
+        case EvqTessEvaluationOut:
+        case EvqGeometryIn:
+        case EvqGeometryOut:
+        case EvqFragmentIn:
+            return true;
+        default:
+            return false;
+    }
+}
+
 enum TLayoutImageInternalFormat
 {
     EiifUnspecified,
diff --git a/src/compiler/translator/CollectVariables.cpp b/src/compiler/translator/CollectVariables.cpp
index a7f6569..26cd135 100644
--- a/src/compiler/translator/CollectVariables.cpp
+++ b/src/compiler/translator/CollectVariables.cpp
@@ -38,7 +38,6 @@
     }
 }
 
-// TODO(jiawei.shao@intel.com): implement GL_EXT_shader_io_blocks.
 BlockType GetBlockType(TQualifier qualifier)
 {
     switch (qualifier)
@@ -47,8 +46,6 @@
             return BlockType::BLOCK_UNIFORM;
         case EvqBuffer:
             return BlockType::BLOCK_BUFFER;
-        case EvqPerVertexIn:
-            return BlockType::BLOCK_IN;
         default:
             UNREACHABLE();
             return BlockType::BLOCK_UNIFORM;
@@ -99,6 +96,18 @@
     return FindVariable(name, &namedBlock->fields);
 }
 
+ShaderVariable *FindShaderIOBlockVariable(const ImmutableString &blockName,
+                                          std::vector<ShaderVariable> *infoList)
+{
+    for (size_t index = 0; index < infoList->size(); ++index)
+    {
+        if (blockName == (*infoList)[index].structName)
+            return &(*infoList)[index];
+    }
+
+    return nullptr;
+}
+
 // Traverses the intermediate tree to collect all attributes, uniforms, varyings, fragment outputs,
 // shared data and interface blocks.
 class CollectVariablesTraverser : public TIntermTraverser
@@ -112,7 +121,6 @@
                               std::vector<ShaderVariable> *sharedVariables,
                               std::vector<InterfaceBlock> *uniformBlocks,
                               std::vector<InterfaceBlock> *shaderStorageBlocks,
-                              std::vector<InterfaceBlock> *inBlocks,
                               ShHashFunction64 hashFunction,
                               TSymbolTable *symbolTable,
                               GLenum shaderType,
@@ -129,10 +137,12 @@
 
     void setFieldOrVariableProperties(const TType &type,
                                       bool staticUse,
+                                      bool isShaderIOBlock,
                                       ShaderVariable *variableOut) const;
     void setFieldProperties(const TType &type,
                             const ImmutableString &name,
                             bool staticUse,
+                            bool isShaderIOBlock,
                             ShaderVariable *variableOut) const;
     void setCommonVariableProperties(const TType &type,
                                      const TVariable &variable,
@@ -153,7 +163,6 @@
                                   std::vector<ShaderVariable> *varyings);
     void recordBuiltInFragmentOutputUsed(const TVariable &variable, bool *addedFlag);
     void recordBuiltInAttributeUsed(const TVariable &variable, bool *addedFlag);
-    InterfaceBlock *recordGLInUsed(const TType &glInType);
     InterfaceBlock *findNamedInterfaceBlock(const ImmutableString &name) const;
 
     std::vector<ShaderVariable> *mAttribs;
@@ -164,7 +173,6 @@
     std::vector<ShaderVariable> *mSharedVariables;
     std::vector<InterfaceBlock> *mUniformBlocks;
     std::vector<InterfaceBlock> *mShaderStorageBlocks;
-    std::vector<InterfaceBlock> *mInBlocks;
 
     std::map<std::string, ShaderVariable *> mInterfaceBlockFields;
 
@@ -235,7 +243,6 @@
     std::vector<sh::ShaderVariable> *sharedVariables,
     std::vector<sh::InterfaceBlock> *uniformBlocks,
     std::vector<sh::InterfaceBlock> *shaderStorageBlocks,
-    std::vector<sh::InterfaceBlock> *inBlocks,
     ShHashFunction64 hashFunction,
     TSymbolTable *symbolTable,
     GLenum shaderType,
@@ -249,7 +256,6 @@
       mSharedVariables(sharedVariables),
       mUniformBlocks(uniformBlocks),
       mShaderStorageBlocks(shaderStorageBlocks),
-      mInBlocks(inBlocks),
       mDepthRangeAdded(false),
       mNumSamplesAdded(false),
       mNumWorkGroupsAdded(false),
@@ -304,7 +310,10 @@
     info->name       = variable.name().data();
     info->mappedName = variable.name().data();
 
-    setFieldOrVariableProperties(type, true, info);
+    bool isShaderIOBlock =
+        IsShaderIoBlock(type.getQualifier()) && type.getInterfaceBlock() != nullptr;
+
+    setFieldOrVariableProperties(type, true, isShaderIOBlock, info);
 }
 
 void CollectVariablesTraverser::recordBuiltInVaryingUsed(const TVariable &variable,
@@ -351,24 +360,6 @@
     }
 }
 
-InterfaceBlock *CollectVariablesTraverser::recordGLInUsed(const TType &glInType)
-{
-    if (!mPerVertexInAdded)
-    {
-        ASSERT(glInType.getQualifier() == EvqPerVertexIn);
-        InterfaceBlock info;
-        recordInterfaceBlock("gl_in", glInType, &info);
-
-        mPerVertexInAdded = true;
-        mInBlocks->push_back(info);
-        return &mInBlocks->back();
-    }
-    else
-    {
-        return FindVariable(ImmutableString("gl_PerVertex"), mInBlocks);
-    }
-}
-
 bool CollectVariablesTraverser::visitGlobalQualifierDeclaration(
     Visit visit,
     TIntermGlobalQualifierDeclaration *node)
@@ -398,15 +389,30 @@
 
     // Check the qualifier from the variable, not from the symbol node. The node may have a
     // different qualifier if it's the result of a folded ternary node.
-    TQualifier qualifier = symbol->variable().getType().getQualifier();
+    TQualifier qualifier                  = symbol->variable().getType().getQualifier();
+    const TInterfaceBlock *interfaceBlock = symbol->getType().getInterfaceBlock();
 
     if (IsVaryingIn(qualifier))
     {
-        var = FindVariable(symbolName, mInputVaryings);
+        if (interfaceBlock)
+        {
+            var = FindShaderIOBlockVariable(interfaceBlock->name(), mInputVaryings);
+        }
+        else
+        {
+            var = FindVariable(symbolName, mInputVaryings);
+        }
     }
     else if (IsVaryingOut(qualifier))
     {
-        var = FindVariable(symbolName, mOutputVaryings);
+        if (interfaceBlock)
+        {
+            var = FindShaderIOBlockVariable(interfaceBlock->name(), mOutputVaryings);
+        }
+        else
+        {
+            var = FindVariable(symbolName, mOutputVaryings);
+        }
     }
     else if (symbol->getType().getBasicType() == EbtInterfaceBlock)
     {
@@ -491,7 +497,6 @@
                 break;
             case EvqUniform:
             {
-                const TInterfaceBlock *interfaceBlock = symbol->getType().getInterfaceBlock();
                 if (interfaceBlock)
                 {
                     var = FindVariableInInterfaceBlock(symbolName, interfaceBlock, mUniformBlocks);
@@ -507,7 +512,6 @@
             break;
             case EvqBuffer:
             {
-                const TInterfaceBlock *interfaceBlock = symbol->getType().getInterfaceBlock();
                 var =
                     FindVariableInInterfaceBlock(symbolName, interfaceBlock, mShaderStorageBlocks);
             }
@@ -667,19 +671,17 @@
 
 void CollectVariablesTraverser::setFieldOrVariableProperties(const TType &type,
                                                              bool staticUse,
+                                                             bool isShaderIOBlock,
                                                              ShaderVariable *variableOut) const
 {
     ASSERT(variableOut);
 
-    variableOut->staticUse = staticUse;
+    variableOut->staticUse       = staticUse;
+    variableOut->isShaderIOBlock = isShaderIOBlock;
 
-    const TStructure *structure = type.getStruct();
-    if (!structure)
-    {
-        variableOut->type      = GLVariableType(type);
-        variableOut->precision = GLVariablePrecision(type);
-    }
-    else
+    const TStructure *structure           = type.getStruct();
+    const TInterfaceBlock *interfaceBlock = type.getInterfaceBlock();
+    if (structure)
     {
         // Structures use a NONE type that isn't exposed outside ANGLE.
         variableOut->type = GL_NONE;
@@ -695,10 +697,35 @@
             // Regardless of the variable type (uniform, in/out etc.) its fields are always plain
             // ShaderVariable objects.
             ShaderVariable fieldVariable;
-            setFieldProperties(*field->type(), field->name(), staticUse, &fieldVariable);
+            setFieldProperties(*field->type(), field->name(), staticUse, isShaderIOBlock,
+                               &fieldVariable);
             variableOut->fields.push_back(fieldVariable);
         }
     }
+    else if (interfaceBlock && isShaderIOBlock)
+    {
+        variableOut->type = GL_NONE;
+        if (interfaceBlock->symbolType() != SymbolType::Empty)
+        {
+            variableOut->structName = interfaceBlock->name().data();
+            variableOut->mappedStructName =
+                HashName(interfaceBlock->name(), mHashFunction, nullptr).data();
+        }
+        const TFieldList &fields = interfaceBlock->fields();
+        for (const TField *field : fields)
+        {
+            ShaderVariable fieldVariable;
+            setFieldProperties(*field->type(), field->name(), staticUse, true, &fieldVariable);
+            fieldVariable.isShaderIOBlock = true;
+            variableOut->fields.push_back(fieldVariable);
+        }
+    }
+    else
+    {
+        variableOut->type      = GLVariableType(type);
+        variableOut->precision = GLVariablePrecision(type);
+    }
+
     const TSpan<const unsigned int> &arraySizes = type.getArraySizes();
     if (!arraySizes.empty())
     {
@@ -709,10 +736,11 @@
 void CollectVariablesTraverser::setFieldProperties(const TType &type,
                                                    const ImmutableString &name,
                                                    bool staticUse,
+                                                   bool isShaderIOBlock,
                                                    ShaderVariable *variableOut) const
 {
     ASSERT(variableOut);
-    setFieldOrVariableProperties(type, staticUse, variableOut);
+    setFieldOrVariableProperties(type, staticUse, isShaderIOBlock, variableOut);
     variableOut->name.assign(name.data(), name.length());
     variableOut->mappedName = HashName(name, mHashFunction, nullptr).data();
 }
@@ -723,11 +751,34 @@
 {
     ASSERT(variableOut);
 
-    variableOut->staticUse = mSymbolTable->isStaticallyUsed(variable);
-    setFieldOrVariableProperties(type, variableOut->staticUse, variableOut);
-    ASSERT(variable.symbolType() != SymbolType::Empty);
-    variableOut->name.assign(variable.name().data(), variable.name().length());
-    variableOut->mappedName = getMappedName(&variable);
+    const bool staticUse = mSymbolTable->isStaticallyUsed(variable);
+    const bool isShaderIOBlock =
+        IsShaderIoBlock(type.getQualifier()) && type.getInterfaceBlock() != nullptr;
+
+    setFieldOrVariableProperties(type, staticUse, isShaderIOBlock, variableOut);
+
+    const bool isNamed = variable.symbolType() != SymbolType::Empty;
+
+    ASSERT(isNamed || isShaderIOBlock);
+    if (isNamed)
+    {
+        variableOut->name.assign(variable.name().data(), variable.name().length());
+        variableOut->mappedName = getMappedName(&variable);
+    }
+
+    // For I/O blocks, additionally store the name of the block as structName.  If the variable is
+    // unnamed, this name will be used instead for the purpose of interface matching.
+    if (isShaderIOBlock)
+    {
+        const TInterfaceBlock *interfaceBlock = type.getInterfaceBlock();
+        ASSERT(interfaceBlock);
+
+        variableOut->structName.assign(interfaceBlock->name().data(),
+                                       interfaceBlock->name().length());
+        variableOut->mappedStructName =
+            HashName(interfaceBlock->name(), mHashFunction, nullptr).data();
+        variableOut->isShaderIOBlock = true;
+    }
 }
 
 ShaderVariable CollectVariablesTraverser::recordAttribute(const TIntermSymbol &variable) const
@@ -785,10 +836,54 @@
     }
 
     varying.interpolation = GetInterpolationType(type.getQualifier());
+
+    // Shader I/O block properties
+    if (type.getBasicType() == EbtInterfaceBlock)
+    {
+        bool isBlockImplicitLocation = false;
+        int location                 = type.getLayoutQualifier().location;
+
+        // when a interface has not location in layout, assign to the zero.
+        if (location < 0)
+        {
+            location                = 0;
+            isBlockImplicitLocation = true;
+        }
+
+        const TInterfaceBlock *blockType = type.getInterfaceBlock();
+        ASSERT(blockType->fields().size() == varying.fields.size());
+
+        for (size_t fieldIndex = 0; fieldIndex < varying.fields.size(); ++fieldIndex)
+        {
+            const TField *blockField      = blockType->fields()[fieldIndex];
+            ShaderVariable &fieldVariable = varying.fields[fieldIndex];
+            const TType &fieldType        = *blockField->type();
+
+            fieldVariable.hasImplicitLocation = isBlockImplicitLocation;
+
+            int fieldLocation = fieldType.getLayoutQualifier().location;
+            if (fieldLocation >= 0)
+            {
+                fieldVariable.hasImplicitLocation = false;
+                fieldVariable.location            = fieldLocation;
+                location                          = fieldLocation;
+            }
+            else
+            {
+                fieldVariable.location = location;
+                location += fieldType.getLocationCount();
+            }
+
+            if (fieldType.getQualifier() != EvqGlobal)
+            {
+                fieldVariable.interpolation = GetFieldInterpolationType(fieldType.getQualifier());
+            }
+        }
+    }
+
     return varying;
 }
 
-// TODO(jiawei.shao@intel.com): implement GL_EXT_shader_io_blocks.
 void CollectVariablesTraverser::recordInterfaceBlock(const char *instanceName,
                                                      const TType &interfaceBlockType,
                                                      InterfaceBlock *interfaceBlock) const
@@ -801,11 +896,13 @@
 
     interfaceBlock->name       = blockType->name().data();
     interfaceBlock->mappedName = getMappedName(blockType);
+
+    const bool isGLInBuiltin = (instanceName != nullptr) && strncmp(instanceName, "gl_in", 5u) == 0;
     if (instanceName != nullptr)
     {
         interfaceBlock->instanceName = instanceName;
         const TSymbol *blockSymbol   = nullptr;
-        if (strncmp(instanceName, "gl_in", 5u) == 0)
+        if (isGLInBuiltin)
         {
             blockSymbol = mSymbolTable->getGlInVariableWithArraySize();
         }
@@ -817,6 +914,7 @@
         interfaceBlock->staticUse =
             mSymbolTable->isStaticallyUsed(*static_cast<const TVariable *>(blockSymbol));
     }
+
     ASSERT(!interfaceBlockType.isArrayOfArrays());  // Disallowed by GLSL ES 3.10 section 4.3.9
     interfaceBlock->arraySize =
         interfaceBlockType.isArray() ? interfaceBlockType.getOutermostArraySize() : 0;
@@ -833,6 +931,7 @@
 
     // Gather field information
     bool anyFieldStaticallyUsed = false;
+
     for (const TField *field : blockType->fields())
     {
         const TType &fieldType = *field->type();
@@ -853,7 +952,7 @@
         }
 
         ShaderVariable fieldVariable;
-        setFieldProperties(fieldType, field->name(), staticUse, &fieldVariable);
+        setFieldProperties(fieldType, field->name(), staticUse, false, &fieldVariable);
         fieldVariable.isRowMajorLayout =
             (fieldType.getLayoutQualifier().matrixPacking == EmpRowMajor);
         interfaceBlock->fields.push_back(fieldVariable);
@@ -908,15 +1007,20 @@
             continue;
         }
 
-        // TODO(jiawei.shao@intel.com): implement GL_EXT_shader_io_blocks.
-        if (typedNode.getBasicType() == EbtInterfaceBlock)
+        // SpirvTransformer::transform uses a map of ShaderVariables, it needs member variables and
+        // (named or unnamed) structure as ShaderVariable. at link between two shaders, validation
+        // between of named and unnamed, needs the same structure, its members, and members order
+        // except instance name.
+        if (typedNode.getBasicType() == EbtInterfaceBlock && !IsShaderIoBlock(qualifier))
         {
             InterfaceBlock interfaceBlock;
-            recordInterfaceBlock(variable.variable().symbolType() != SymbolType::Empty
-                                     ? variable.getName().data()
-                                     : nullptr,
-                                 variable.getType(), &interfaceBlock);
+            bool isUnnamed    = variable.variable().symbolType() == SymbolType::Empty;
+            const TType &type = variable.getType();
+            recordInterfaceBlock(isUnnamed ? nullptr : variable.getName().data(), type,
+                                 &interfaceBlock);
 
+            // all fields in interface block will be added for updating interface variables because
+            // the temporal structure variable will be ignored.
             switch (qualifier)
             {
                 case EvqUniform:
@@ -931,7 +1035,8 @@
         }
         else
         {
-            ASSERT(variable.variable().symbolType() != SymbolType::Empty);
+            ASSERT(variable.variable().symbolType() != SymbolType::Empty ||
+                   IsShaderIoBlock(qualifier));
             switch (qualifier)
             {
                 case EvqAttribute:
@@ -964,8 +1069,6 @@
     return false;
 }
 
-// TODO(jiawei.shao@intel.com): add search on mInBlocks and mOutBlocks when implementing
-// GL_EXT_shader_io_blocks.
 InterfaceBlock *CollectVariablesTraverser::findNamedInterfaceBlock(
     const ImmutableString &blockName) const
 {
@@ -994,36 +1097,55 @@
         TIntermBinary *interfaceIndexingNode = blockNode->getAsBinaryNode();
         if (interfaceIndexingNode)
         {
-            TIntermTyped *interfaceNode = interfaceIndexingNode->getLeft()->getAsTyped();
-            ASSERT(interfaceNode);
-
-            const TType &interfaceType = interfaceNode->getType();
-            if (interfaceType.getQualifier() == EvqPerVertexIn)
-            {
-                namedBlock = recordGLInUsed(interfaceType);
-                ASSERT(namedBlock);
-            }
-
-            // We need to continue traversing to collect useful variables in the index expression
-            // of the interface block array or gl_in in the case of the if above.
+            ASSERT(interfaceIndexingNode->getOp() == EOpIndexDirect ||
+                   interfaceIndexingNode->getOp() == EOpIndexIndirect);
             traverseIndexExpression = true;
+            blockNode               = interfaceIndexingNode->getLeft();
         }
 
-        const TInterfaceBlock *interfaceBlock = blockNode->getType().getInterfaceBlock();
-        if (!namedBlock)
+        const TType &interfaceNodeType        = blockNode->getType();
+        const TInterfaceBlock *interfaceBlock = interfaceNodeType.getInterfaceBlock();
+        const TQualifier qualifier            = interfaceNodeType.getQualifier();
+
+        // If it's a shader I/O block, look in varyings
+        ShaderVariable *ioBlockVar = nullptr;
+        if (qualifier == EvqPerVertexIn)
         {
-            namedBlock = findNamedInterfaceBlock(interfaceBlock->name());
+            TIntermSymbol *symbolNode = blockNode->getAsSymbolNode();
+            ASSERT(symbolNode);
+            recordBuiltInVaryingUsed(symbolNode->variable(), &mPerVertexInAdded, mInputVaryings);
+            ioBlockVar = FindShaderIOBlockVariable(interfaceBlock->name(), mInputVaryings);
         }
-        ASSERT(namedBlock);
-        ASSERT(namedBlock->staticUse);
-        namedBlock->active      = true;
-        unsigned int fieldIndex = static_cast<unsigned int>(constantUnion->getIConst(0));
-        ASSERT(fieldIndex < namedBlock->fields.size());
-        // TODO(oetuaho): Would be nicer to record static use of fields of named interface blocks
-        // more accurately at parse time - now we only mark the fields statically used if they are
-        // active. http://anglebug.com/2440
-        // We need to mark this field and all of its sub-fields, as static/active
-        MarkActive(&namedBlock->fields[fieldIndex]);
+        else if (IsVaryingIn(qualifier))
+        {
+            ioBlockVar = FindShaderIOBlockVariable(interfaceBlock->name(), mInputVaryings);
+        }
+        else if (IsVaryingOut(qualifier))
+        {
+            ioBlockVar = FindShaderIOBlockVariable(interfaceBlock->name(), mOutputVaryings);
+        }
+
+        if (ioBlockVar)
+        {
+            MarkActive(ioBlockVar);
+        }
+        else
+        {
+            if (!namedBlock)
+            {
+                namedBlock = findNamedInterfaceBlock(interfaceBlock->name());
+            }
+            ASSERT(namedBlock);
+            ASSERT(namedBlock->staticUse);
+            namedBlock->active      = true;
+            unsigned int fieldIndex = static_cast<unsigned int>(constantUnion->getIConst(0));
+            ASSERT(fieldIndex < namedBlock->fields.size());
+            // TODO(oetuaho): Would be nicer to record static use of fields of named interface
+            // blocks more accurately at parse time - now we only mark the fields statically used if
+            // they are active. http://anglebug.com/2440 We need to mark this field and all of its
+            // sub-fields, as static/active
+            MarkActive(&namedBlock->fields[fieldIndex]);
+        }
 
         if (traverseIndexExpression)
         {
@@ -1047,7 +1169,6 @@
                       std::vector<ShaderVariable> *sharedVariables,
                       std::vector<InterfaceBlock> *uniformBlocks,
                       std::vector<InterfaceBlock> *shaderStorageBlocks,
-                      std::vector<InterfaceBlock> *inBlocks,
                       ShHashFunction64 hashFunction,
                       TSymbolTable *symbolTable,
                       GLenum shaderType,
@@ -1055,8 +1176,8 @@
 {
     CollectVariablesTraverser collect(attributes, outputVariables, uniforms, inputVaryings,
                                       outputVaryings, sharedVariables, uniformBlocks,
-                                      shaderStorageBlocks, inBlocks, hashFunction, symbolTable,
-                                      shaderType, extensionBehavior);
+                                      shaderStorageBlocks, hashFunction, symbolTable, shaderType,
+                                      extensionBehavior);
     root->traverse(&collect);
 }
 
diff --git a/src/compiler/translator/CollectVariables.h b/src/compiler/translator/CollectVariables.h
index e0d80b1..47ac438 100644
--- a/src/compiler/translator/CollectVariables.h
+++ b/src/compiler/translator/CollectVariables.h
@@ -27,7 +27,6 @@
                       std::vector<ShaderVariable> *sharedVariables,
                       std::vector<InterfaceBlock> *uniformBlocks,
                       std::vector<InterfaceBlock> *shaderStorageBlocks,
-                      std::vector<InterfaceBlock> *inBlocks,
                       ShHashFunction64 hashFunction,
                       TSymbolTable *symbolTable,
                       GLenum shaderType,
diff --git a/src/compiler/translator/Compiler.cpp b/src/compiler/translator/Compiler.cpp
index 435c4c0..eaef548 100644
--- a/src/compiler/translator/Compiler.cpp
+++ b/src/compiler/translator/Compiler.cpp
@@ -806,8 +806,8 @@
         ASSERT(!mVariablesCollected);
         CollectVariables(root, &mAttributes, &mOutputVariables, &mUniforms, &mInputVaryings,
                          &mOutputVaryings, &mSharedVariables, &mUniformBlocks,
-                         &mShaderStorageBlocks, &mInBlocks, mResources.HashFunction, &mSymbolTable,
-                         mShaderType, mExtensionBehavior);
+                         &mShaderStorageBlocks, mResources.HashFunction, &mSymbolTable, mShaderType,
+                         mExtensionBehavior);
         collectInterfaceBlocks();
         mVariablesCollected = true;
         if (compileOptions & SH_USE_UNUSED_STANDARD_SHARED_BLOCKS)
@@ -1085,6 +1085,8 @@
         << ":OVR_multiview:" << mResources.OVR_multiview
         << ":EXT_YUV_target:" << mResources.EXT_YUV_target
         << ":EXT_geometry_shader:" << mResources.EXT_geometry_shader
+        << ":OES_shader_io_blocks:" << mResources.OES_shader_io_blocks
+        << ":EXT_shader_io_blocks:" << mResources.EXT_shader_io_blocks
         << ":EXT_gpu_shader5:" << mResources.EXT_gpu_shader5
         << ":OES_texture_3D:" << mResources.OES_texture_3D
         << ":MaxVertexOutputVectors:" << mResources.MaxVertexOutputVectors
@@ -1154,12 +1156,10 @@
 void TCompiler::collectInterfaceBlocks()
 {
     ASSERT(mInterfaceBlocks.empty());
-    mInterfaceBlocks.reserve(mUniformBlocks.size() + mShaderStorageBlocks.size() +
-                             mInBlocks.size());
+    mInterfaceBlocks.reserve(mUniformBlocks.size() + mShaderStorageBlocks.size());
     mInterfaceBlocks.insert(mInterfaceBlocks.end(), mUniformBlocks.begin(), mUniformBlocks.end());
     mInterfaceBlocks.insert(mInterfaceBlocks.end(), mShaderStorageBlocks.begin(),
                             mShaderStorageBlocks.end());
-    mInterfaceBlocks.insert(mInterfaceBlocks.end(), mInBlocks.begin(), mInBlocks.end());
 }
 
 bool TCompiler::emulatePrecisionIfNeeded(TIntermBlock *root,
@@ -1199,7 +1199,6 @@
     mInterfaceBlocks.clear();
     mUniformBlocks.clear();
     mShaderStorageBlocks.clear();
-    mInBlocks.clear();
     mVariablesCollected    = false;
     mGLPositionInitialized = false;
 
@@ -1247,7 +1246,7 @@
         int depth                     = 0;
         const CallDAG::Record &record = mCallDag.getRecordFromIndex(i);
 
-        for (const int &calleeIndex : record.callees)
+        for (int calleeIndex : record.callees)
         {
             depth = std::max(depth, depths[calleeIndex] + 1);
         }
diff --git a/src/compiler/translator/Compiler.h b/src/compiler/translator/Compiler.h
index ea351b9..2e59660 100644
--- a/src/compiler/translator/Compiler.h
+++ b/src/compiler/translator/Compiler.h
@@ -123,7 +123,6 @@
     {
         return mShaderStorageBlocks;
     }
-    const std::vector<sh::InterfaceBlock> &getInBlocks() const { return mInBlocks; }
 
     ShHashFunction64 getHashFunction() const { return mResources.HashFunction; }
     NameMap &getNameMap() { return mNameMap; }
@@ -195,7 +194,6 @@
     std::vector<sh::InterfaceBlock> mInterfaceBlocks;
     std::vector<sh::InterfaceBlock> mUniformBlocks;
     std::vector<sh::InterfaceBlock> mShaderStorageBlocks;
-    std::vector<sh::InterfaceBlock> mInBlocks;
 
     // Specialization constant usage bits
     SpecConstUsageBits mSpecConstUsageBits;
diff --git a/src/compiler/translator/DirectiveHandler.cpp b/src/compiler/translator/DirectiveHandler.cpp
index 7e50d75..a3029ae 100644
--- a/src/compiler/translator/DirectiveHandler.cpp
+++ b/src/compiler/translator/DirectiveHandler.cpp
@@ -167,12 +167,22 @@
         // OVR_multiview is implicitly enabled when OVR_multiview2 is enabled
         if (name == "GL_OVR_multiview2")
         {
-            const std::string multiview = "GL_OVR_multiview";
-            TExtensionBehavior::iterator iterMultiview =
-                mExtensionBehavior.find(GetExtensionByName(multiview.c_str()));
-            if (iterMultiview != mExtensionBehavior.end())
+            constexpr char kMultiviewExtName[] = "GL_OVR_multiview";
+            iter = mExtensionBehavior.find(GetExtensionByName(kMultiviewExtName));
+            if (iter != mExtensionBehavior.end())
             {
-                iterMultiview->second = behaviorVal;
+                iter->second = behaviorVal;
+            }
+        }
+        // EXT_shader_io_blocks is implicitly enabled when EXT_geometry_shader or
+        // EXT_tessellation_shader is enabled.
+        if (name == "GL_EXT_geometry_shader" || name == "GL_EXT_tessellation_shader")
+        {
+            constexpr char kIOBlocksExtName[] = "GL_EXT_shader_io_blocks";
+            iter = mExtensionBehavior.find(GetExtensionByName(kIOBlocksExtName));
+            if (iter != mExtensionBehavior.end())
+            {
+                iter->second = behaviorVal;
             }
         }
         return;
diff --git a/src/compiler/translator/ExtensionBehavior.cpp b/src/compiler/translator/ExtensionBehavior.cpp
index 056c694..98c922d 100644
--- a/src/compiler/translator/ExtensionBehavior.cpp
+++ b/src/compiler/translator/ExtensionBehavior.cpp
@@ -23,6 +23,8 @@
     OP(EXT_draw_buffers)                            \
     OP(EXT_frag_depth)                              \
     OP(EXT_geometry_shader)                         \
+    OP(OES_shader_io_blocks)                        \
+    OP(EXT_shader_io_blocks)                        \
     OP(EXT_gpu_shader5)                             \
     OP(EXT_shader_framebuffer_fetch)                \
     OP(EXT_shader_non_constant_global_initializers) \
diff --git a/src/compiler/translator/ExtensionBehavior.h b/src/compiler/translator/ExtensionBehavior.h
index 81c9ee8..772dacd 100644
--- a/src/compiler/translator/ExtensionBehavior.h
+++ b/src/compiler/translator/ExtensionBehavior.h
@@ -29,6 +29,8 @@
     EXT_draw_buffers,
     EXT_frag_depth,
     EXT_geometry_shader,
+    OES_shader_io_blocks,
+    EXT_shader_io_blocks,
     EXT_gpu_shader5,
     EXT_shader_framebuffer_fetch,
     EXT_shader_non_constant_global_initializers,
diff --git a/src/compiler/translator/Initialize.cpp b/src/compiler/translator/Initialize.cpp
index ae4f0b7..1742661 100644
--- a/src/compiler/translator/Initialize.cpp
+++ b/src/compiler/translator/Initialize.cpp
@@ -81,6 +81,14 @@
     {
         extBehavior[TExtension::EXT_geometry_shader] = EBhUndefined;
     }
+    if (resources.OES_shader_io_blocks)
+    {
+        extBehavior[TExtension::OES_shader_io_blocks] = EBhUndefined;
+    }
+    if (resources.EXT_shader_io_blocks)
+    {
+        extBehavior[TExtension::EXT_shader_io_blocks] = EBhUndefined;
+    }
     if (resources.EXT_gpu_shader5)
     {
         extBehavior[TExtension::EXT_gpu_shader5] = EBhUndefined;
diff --git a/src/compiler/translator/OutputGLSLBase.cpp b/src/compiler/translator/OutputGLSLBase.cpp
index 7c82309..929e59f 100644
--- a/src/compiler/translator/OutputGLSLBase.cpp
+++ b/src/compiler/translator/OutputGLSLBase.cpp
@@ -258,8 +258,7 @@
 
     if (type.getBasicType() == EbtInterfaceBlock)
     {
-        const TInterfaceBlock *interfaceBlock = type.getInterfaceBlock();
-        declareInterfaceBlockLayout(interfaceBlock);
+        declareInterfaceBlockLayout(type);
         return;
     }
 
@@ -405,8 +404,7 @@
     }
     else if (type.getBasicType() == EbtInterfaceBlock)
     {
-        const TInterfaceBlock *interfaceBlock = type.getInterfaceBlock();
-        declareInterfaceBlock(interfaceBlock);
+        declareInterfaceBlock(type);
     }
     else
     {
@@ -1321,9 +1319,18 @@
     }
 }
 
-void TOutputGLSLBase::declareInterfaceBlockLayout(const TInterfaceBlock *interfaceBlock)
+void TOutputGLSLBase::declareInterfaceBlockLayout(const TType &type)
 {
-    TInfoSinkBase &out = objSink();
+    // 4.4.5 Uniform and Shader Storage Block Layout Qualifiers in GLSL 4.5 spec.
+    // Layout qualifiers can be used for uniform and shader storage blocks,
+    // but not for non-block uniform declarations.
+    if (IsShaderIoBlock(type.getQualifier()))
+    {
+        return;
+    }
+
+    const TInterfaceBlock *interfaceBlock = type.getInterfaceBlock();
+    TInfoSinkBase &out                    = objSink();
 
     out << "layout(";
 
@@ -1332,6 +1339,7 @@
         case EbsUnspecified:
         case EbsShared:
             // Default block storage is shared.
+            fprintf(stderr, "\n\n\nHERE\n\n\n");
             out << "shared";
             break;
 
@@ -1361,20 +1369,55 @@
     out << ") ";
 }
 
-void TOutputGLSLBase::declareInterfaceBlock(const TInterfaceBlock *interfaceBlock)
+const char *getVariableInterpolation(TQualifier qualifier)
 {
-    TInfoSinkBase &out = objSink();
+    switch (qualifier)
+    {
+        case EvqSmoothOut:
+            return "smooth out ";
+        case EvqFlatOut:
+            return "flat out ";
+        case EvqNoPerspectiveOut:
+            return "noperspective out ";
+        case EvqCentroidOut:
+            return "centroid out ";
+        case EvqSmoothIn:
+            return "smooth in ";
+        case EvqFlatIn:
+            return "flat in ";
+        case EvqNoPerspectiveIn:
+            return "noperspective in ";
+        case EvqCentroidIn:
+            return "centroid in ";
+        default:
+            break;
+    }
+    return nullptr;
+}
+
+void TOutputGLSLBase::declareInterfaceBlock(const TType &type)
+{
+    const TInterfaceBlock *interfaceBlock = type.getInterfaceBlock();
+    TInfoSinkBase &out                    = objSink();
 
     out << hashName(interfaceBlock) << "{\n";
     const TFieldList &fields = interfaceBlock->fields();
     for (const TField *field : fields)
     {
-        writeFieldLayoutQualifier(field);
+        if (!IsShaderIoBlock(type.getQualifier()))
+        {
+            writeFieldLayoutQualifier(field);
+        }
         out << getMemoryQualifiers(*field->type());
-
         if (writeVariablePrecision(field->type()->getPrecision()))
             out << " ";
+
+        const char *qualifier = getVariableInterpolation(field->type()->getQualifier());
+        if (qualifier != nullptr)
+            out << qualifier;
+
         out << getTypeName(*field->type()) << " " << hashFieldName(field);
+
         if (field->type()->isArray())
             out << ArrayString(*field->type());
         out << ";\n";
diff --git a/src/compiler/translator/OutputGLSLBase.h b/src/compiler/translator/OutputGLSLBase.h
index 70777b4..870ae7b 100644
--- a/src/compiler/translator/OutputGLSLBase.h
+++ b/src/compiler/translator/OutputGLSLBase.h
@@ -96,8 +96,8 @@
     sh::GLenum getShaderType() { return mShaderType; }
 
   private:
-    void declareInterfaceBlockLayout(const TInterfaceBlock *interfaceBlock);
-    void declareInterfaceBlock(const TInterfaceBlock *interfaceBlock);
+    void declareInterfaceBlockLayout(const TType &type);
+    void declareInterfaceBlock(const TType &type);
 
     void writeBuiltInFunctionTriplet(Visit visit, TOperator op, bool useEmulatedFunction);
 
diff --git a/src/compiler/translator/OutputHLSL.cpp b/src/compiler/translator/OutputHLSL.cpp
index 43881b9..e7e36cc 100644
--- a/src/compiler/translator/OutputHLSL.cpp
+++ b/src/compiler/translator/OutputHLSL.cpp
@@ -297,22 +297,21 @@
     return constUnionIterated;
 }
 
-OutputHLSL::OutputHLSL(
-    sh::GLenum shaderType,
-    ShShaderSpec shaderSpec,
-    int shaderVersion,
-    const TExtensionBehavior &extensionBehavior,
-    const char *sourcePath,
-    ShShaderOutput outputType,
-    int numRenderTargets,
-    int maxDualSourceDrawBuffers,
-    const std::vector<ShaderVariable> &uniforms,
-    ShCompileOptions compileOptions,
-    sh::WorkGroupSize workGroupSize,
-    TSymbolTable *symbolTable,
-    PerformanceDiagnostics *perfDiagnostics,
-    const std::map<int, const TInterfaceBlock *> &uniformBlocksTranslatedToStructuredBuffers,
-    const std::vector<InterfaceBlock> &shaderStorageBlocks)
+OutputHLSL::OutputHLSL(sh::GLenum shaderType,
+                       ShShaderSpec shaderSpec,
+                       int shaderVersion,
+                       const TExtensionBehavior &extensionBehavior,
+                       const char *sourcePath,
+                       ShShaderOutput outputType,
+                       int numRenderTargets,
+                       int maxDualSourceDrawBuffers,
+                       const std::vector<ShaderVariable> &uniforms,
+                       ShCompileOptions compileOptions,
+                       sh::WorkGroupSize workGroupSize,
+                       TSymbolTable *symbolTable,
+                       PerformanceDiagnostics *perfDiagnostics,
+                       const std::map<int, const TInterfaceBlock *> &uniformBlockOptimizedMap,
+                       const std::vector<InterfaceBlock> &shaderStorageBlocks)
     : TIntermTraverser(true, true, true, symbolTable),
       mShaderType(shaderType),
       mShaderSpec(shaderSpec),
@@ -323,7 +322,7 @@
       mCompileOptions(compileOptions),
       mInsideFunction(false),
       mInsideMain(false),
-      mUniformBlocksTranslatedToStructuredBuffers(uniformBlocksTranslatedToStructuredBuffers),
+      mUniformBlockOptimizedMap(uniformBlockOptimizedMap),
       mNumRenderTargets(numRenderTargets),
       mMaxDualSourceDrawBuffers(maxDualSourceDrawBuffers),
       mCurrentFunctionMetadata(nullptr),
@@ -661,8 +660,7 @@
     out << mStructureHLSL->structsHeader();
 
     mResourcesHLSL->uniformsHeader(out, mOutputType, mReferencedUniforms, mSymbolTable);
-    out << mResourcesHLSL->uniformBlocksHeader(mReferencedUniformBlocks,
-                                               mUniformBlocksTranslatedToStructuredBuffers);
+    out << mResourcesHLSL->uniformBlocksHeader(mReferencedUniformBlocks, mUniformBlockOptimizedMap);
     mSSBOOutputHLSL->writeShaderStorageBlocksHeader(out);
 
     if (!mEqualityFunctions.empty())
@@ -1650,8 +1648,8 @@
                 {
                     const TInterfaceBlock *interfaceBlock =
                         GetInterfaceBlockOfUniformBlockNearestIndexOperator(node->getLeft());
-                    if (interfaceBlock && mUniformBlocksTranslatedToStructuredBuffers.count(
-                                              interfaceBlock->uniqueId().get()) != 0)
+                    if (interfaceBlock &&
+                        mUniformBlockOptimizedMap.count(interfaceBlock->uniqueId().get()) != 0)
                     {
                         // If the uniform block member's type is not structure, we had explicitly
                         // packed the member into a structure, so need to add an operator of field
@@ -1685,8 +1683,8 @@
                 {
                     const TInterfaceBlock *interfaceBlock =
                         GetInterfaceBlockOfUniformBlockNearestIndexOperator(node->getLeft());
-                    if (interfaceBlock && mUniformBlocksTranslatedToStructuredBuffers.count(
-                                              interfaceBlock->uniqueId().get()) != 0)
+                    if (interfaceBlock &&
+                        mUniformBlockOptimizedMap.count(interfaceBlock->uniqueId().get()) != 0)
                     {
                         // If the uniform block member's type is not structure, we had explicitly
                         // packed the member into a structure, so need to add an operator of field
@@ -1757,8 +1755,8 @@
                     node->getLeft()->getType().getInterfaceBlock();
                 const TIntermConstantUnion *index = node->getRight()->getAsConstantUnion();
                 const TField *field               = interfaceBlock->fields()[index->getIConst(0)];
-                if (structInStd140UniformBlock || mUniformBlocksTranslatedToStructuredBuffers.count(
-                                                      interfaceBlock->uniqueId().get()) != 0)
+                if (structInStd140UniformBlock ||
+                    mUniformBlockOptimizedMap.count(interfaceBlock->uniqueId().get()) != 0)
                 {
                     out << "_";
                 }
diff --git a/src/compiler/translator/OutputHLSL.h b/src/compiler/translator/OutputHLSL.h
index c3311e5..91848f5 100644
--- a/src/compiler/translator/OutputHLSL.h
+++ b/src/compiler/translator/OutputHLSL.h
@@ -37,22 +37,21 @@
 class OutputHLSL : public TIntermTraverser
 {
   public:
-    OutputHLSL(
-        sh::GLenum shaderType,
-        ShShaderSpec shaderSpec,
-        int shaderVersion,
-        const TExtensionBehavior &extensionBehavior,
-        const char *sourcePath,
-        ShShaderOutput outputType,
-        int numRenderTargets,
-        int maxDualSourceDrawBuffers,
-        const std::vector<ShaderVariable> &uniforms,
-        ShCompileOptions compileOptions,
-        sh::WorkGroupSize workGroupSize,
-        TSymbolTable *symbolTable,
-        PerformanceDiagnostics *perfDiagnostics,
-        const std::map<int, const TInterfaceBlock *> &uniformBlocksTranslatedToStructuredBuffers,
-        const std::vector<InterfaceBlock> &shaderStorageBlocks);
+    OutputHLSL(sh::GLenum shaderType,
+               ShShaderSpec shaderSpec,
+               int shaderVersion,
+               const TExtensionBehavior &extensionBehavior,
+               const char *sourcePath,
+               ShShaderOutput outputType,
+               int numRenderTargets,
+               int maxDualSourceDrawBuffers,
+               const std::vector<ShaderVariable> &uniforms,
+               ShCompileOptions compileOptions,
+               sh::WorkGroupSize workGroupSize,
+               TSymbolTable *symbolTable,
+               PerformanceDiagnostics *perfDiagnostics,
+               const std::map<int, const TInterfaceBlock *> &uniformBlockOptimizedMap,
+               const std::vector<InterfaceBlock> &shaderStorageBlocks);
 
     ~OutputHLSL() override;
 
@@ -181,7 +180,7 @@
     // Indexed by block id, not instance id.
     ReferencedInterfaceBlocks mReferencedUniformBlocks;
 
-    std::map<int, const TInterfaceBlock *> mUniformBlocksTranslatedToStructuredBuffers;
+    std::map<int, const TInterfaceBlock *> mUniformBlockOptimizedMap;
 
     ReferencedVariables mReferencedAttributes;
     ReferencedVariables mReferencedVaryings;
diff --git a/src/compiler/translator/OutputVulkanGLSL.cpp b/src/compiler/translator/OutputVulkanGLSL.cpp
index 3626452..6ebdf0c 100644
--- a/src/compiler/translator/OutputVulkanGLSL.cpp
+++ b/src/compiler/translator/OutputVulkanGLSL.cpp
@@ -50,8 +50,10 @@
 {
     const TType &type = variable->getType();
 
-    bool needsSetBinding =
-        IsSampler(type.getBasicType()) || type.isInterfaceBlock() || IsImage(type.getBasicType());
+    bool needsSetBinding = IsSampler(type.getBasicType()) ||
+                           (type.isInterfaceBlock() && (type.getQualifier() == EvqUniform ||
+                                                        type.getQualifier() == EvqBuffer)) ||
+                           IsImage(type.getBasicType());
     bool needsLocation = type.getQualifier() == EvqAttribute ||
                          type.getQualifier() == EvqVertexIn ||
                          type.getQualifier() == EvqFragmentOut || IsVarying(type.getQualifier());
@@ -103,8 +105,8 @@
     {
         matrixPacking = getMatrixPackingString(layoutQualifier.matrixPacking);
     }
-
-    const char *separator = "";
+    const char *kCommaSeparator = ", ";
+    const char *separator       = "";
     out << "layout(";
 
     // If the resource declaration requires set & binding layout qualifiers, specify arbitrary
@@ -112,7 +114,7 @@
     if (needsSetBinding)
     {
         out << "set=0, binding=" << nextUnusedBinding();
-        separator = ", ";
+        separator = kCommaSeparator;
     }
 
     if (needsLocation)
@@ -122,8 +124,8 @@
                                 ? nextUnusedInputLocation(locationCount)
                                 : nextUnusedOutputLocation(locationCount);
 
-        out << "location=" << location;
-        separator = ", ";
+        out << separator << "location=" << location;
+        separator = kCommaSeparator;
     }
 
     // Output the list of qualifiers already known at this stage, i.e. everything other than
@@ -133,12 +135,12 @@
     if (blockStorage)
     {
         out << separator << blockStorage;
-        separator = ", ";
+        separator = kCommaSeparator;
     }
     if (matrixPacking)
     {
         out << separator << matrixPacking;
-        separator = ", ";
+        separator = kCommaSeparator;
     }
     if (!otherQualifiers.empty())
     {
diff --git a/src/compiler/translator/ParseContext.cpp b/src/compiler/translator/ParseContext.cpp
index d7ca18b..c794e61 100644
--- a/src/compiler/translator/ParseContext.cpp
+++ b/src/compiler/translator/ParseContext.cpp
@@ -240,6 +240,7 @@
       mGeometryShaderMaxVertices(-1),
       mMaxGeometryShaderInvocations(resources.MaxGeometryShaderInvocations),
       mMaxGeometryShaderMaxVertices(resources.MaxGeometryOutputVertices),
+      mGeometryInputArraySize(0),
       mFunctionBodyNewScope(false),
       mOutputType(outputType)
 {}
@@ -2444,7 +2445,10 @@
     bool typeContainsIntegers =
         (type.getBasicType() == EbtInt || type.getBasicType() == EbtUInt ||
          type.isStructureContainingType(EbtInt) || type.isStructureContainingType(EbtUInt));
-    if (typeContainsIntegers && qualifier != EvqFlatIn && qualifier != EvqFlatOut)
+    bool extendedShaderTypes =
+        mShaderVersion == 320 || isExtensionEnabled(TExtension::EXT_geometry_shader);
+    if (typeContainsIntegers && qualifier != EvqFlatIn && qualifier != EvqFlatOut &&
+        (!extendedShaderTypes || mShaderType == GL_FRAGMENT_SHADER))
     {
         error(qualifierLocation, "must use 'flat' interpolation here",
               getQualifierString(qualifier));
@@ -3071,6 +3075,7 @@
               "array inputs.",
               "layout");
     }
+    mGeometryInputArraySize = inputArraySize;
 }
 
 bool TParseContext::parseGeometryShaderInputLayoutQualifier(const TTypeQualifier &typeQualifier)
@@ -3830,8 +3835,6 @@
 
 //
 // Interface/uniform blocks
-// TODO(jiawei.shao@intel.com): implement GL_EXT_shader_io_blocks.
-//
 TIntermDeclaration *TParseContext::addInterfaceBlock(
     const TTypeQualifierBuilder &typeQualifierBuilder,
     const TSourceLoc &nameLine,
@@ -3839,13 +3842,17 @@
     TFieldList *fieldList,
     const ImmutableString &instanceName,
     const TSourceLoc &instanceLine,
-    TIntermTyped *arrayIndex,
-    const TSourceLoc &arrayIndexLine)
+    const TVector<unsigned int> *arraySizes,
+    const TSourceLoc &arraySizesLine)
 {
     checkIsNotReserved(nameLine, blockName);
 
     TTypeQualifier typeQualifier = typeQualifierBuilder.getVariableTypeQualifier(mDiagnostics);
 
+    const bool isUniformOrBuffer =
+        typeQualifier.qualifier == EvqUniform || typeQualifier.qualifier == EvqBuffer;
+    const bool isShaderIoBlock = IsShaderIoBlock(typeQualifier.qualifier);
+
     if (mShaderVersion < 310 && typeQualifier.qualifier != EvqUniform)
     {
         error(typeQualifier.line,
@@ -3855,8 +3862,22 @@
     }
     else if (typeQualifier.qualifier != EvqUniform && typeQualifier.qualifier != EvqBuffer)
     {
-        error(typeQualifier.line, "invalid qualifier: interface blocks must be uniform or buffer",
-              getQualifierString(typeQualifier.qualifier));
+        if (isShaderIoBlock)
+        {
+            if (!isExtensionEnabled(TExtension::OES_shader_io_blocks) &&
+                !isExtensionEnabled(TExtension::EXT_shader_io_blocks))
+            {
+                error(typeQualifier.line,
+                      "invalid qualifier: interface blocks need shader io block extension",
+                      getQualifierString(typeQualifier.qualifier));
+            }
+        }
+        else
+        {
+            error(typeQualifier.line,
+                  "invalid qualifier: interface blocks must be uniform or buffer",
+                  getQualifierString(typeQualifier.qualifier));
+        }
     }
 
     if (typeQualifier.invariant)
@@ -3869,11 +3890,52 @@
         checkMemoryQualifierIsNotSpecified(typeQualifier.memoryQualifier, typeQualifier.line);
     }
 
-    // add array index
-    unsigned int arraySize = 0;
-    if (arrayIndex != nullptr)
+    // Verify array sizes
+    if (arraySizes)
     {
-        arraySize = checkIsValidArraySize(arrayIndexLine, arrayIndex);
+        if (isUniformOrBuffer)
+        {
+            if (arraySizes->size() == 0)
+            {
+                error(arraySizesLine, "unsized arrays are not allowed with interface blocks", "");
+            }
+            if (arraySizes->size() > 1)
+            {
+                error(arraySizesLine, "array of arrays are not allowed with interface blocks", "");
+            }
+        }
+        else if (isShaderIoBlock)
+        {
+            size_t arrayDimensions = arraySizes->size();
+
+            // Geometry shader inputs have a level arrayness that must be ignored.
+            if (mShaderType == GL_GEOMETRY_SHADER_EXT && IsVaryingIn(typeQualifier.qualifier))
+            {
+                ASSERT(arrayDimensions > 0);
+                --arrayDimensions;
+
+                // Validate that the array size of input matches the geometry layout
+                // declaration, if not automatic (specified as []).
+                const unsigned int geometryDim = arraySizes->back();
+                if (geometryDim > 0 && geometryDim != mGeometryInputArraySize)
+                {
+                    error(arraySizesLine,
+                          "geometry shader input block array size inconsistent "
+                          "with primitive",
+                          "");
+                }
+            }
+
+            if (arrayDimensions > 1)
+            {
+                error(arraySizesLine, "array of arrays are not allowed with I/O blocks", "");
+            }
+        }
+    }
+    else if (isShaderIoBlock && mShaderType == GL_GEOMETRY_SHADER_EXT &&
+             IsVaryingIn(typeQualifier.qualifier))
+    {
+        error(arraySizesLine, "geometry shader input blocks must be an array", "");
     }
 
     checkIndexIsNotSpecified(typeQualifier.line, typeQualifier.layoutQualifier.index);
@@ -3884,6 +3946,8 @@
     }
     else
     {
+        unsigned int arraySize =
+            arraySizes == nullptr || arraySizes->empty() ? 0 : (*arraySizes)[0];
         checkBlockBindingIsValid(typeQualifier.line, typeQualifier.qualifier,
                                  typeQualifier.layoutQualifier.binding, arraySize);
     }
@@ -3893,7 +3957,10 @@
                                           typeQualifier.layoutQualifier.earlyFragmentTests);
 
     TLayoutQualifier blockLayoutQualifier = typeQualifier.layoutQualifier;
-    checkLocationIsNotSpecified(typeQualifier.line, blockLayoutQualifier);
+    if (!IsShaderIoBlock(typeQualifier.qualifier))
+    {
+        checkLocationIsNotSpecified(typeQualifier.line, blockLayoutQualifier);
+    }
     checkStd430IsForShaderStorageBlock(typeQualifier.line, blockLayoutQualifier.blockStorage,
                                        typeQualifier.qualifier);
 
@@ -3957,6 +4024,28 @@
                           getQualifierString(qualifier));
                 }
                 break;
+            // a member variable in io block may have different interpolation.
+            case EvqFlatIn:
+            case EvqFlatOut:
+            case EvqNoPerspectiveIn:
+            case EvqNoPerspectiveOut:
+            case EvqSmoothIn:
+            case EvqSmoothOut:
+            case EvqCentroidIn:
+            case EvqCentroidOut:
+                break;
+            // a member variable can have an incomplete qualifier because shader io block has either
+            // in or out.
+            case EvqSmooth:
+            case EvqFlat:
+            case EvqNoPerspective:
+            case EvqCentroid:
+                if (!IsShaderIoBlock(typeQualifier.qualifier))
+                {
+                    error(field->line(), "invalid qualifier on interface block member",
+                          getQualifierString(qualifier));
+                }
+                break;
             default:
                 error(field->line(), "invalid qualifier on interface block member",
                       getQualifierString(qualifier));
@@ -3970,7 +4059,6 @@
 
         // check layout qualifiers
         TLayoutQualifier fieldLayoutQualifier = fieldType->getLayoutQualifier();
-        checkLocationIsNotSpecified(field->line(), fieldLayoutQualifier);
         checkIndexIsNotSpecified(field->line(), fieldLayoutQualifier.index);
         checkBindingIsNotSpecified(field->line(), fieldLayoutQualifier.binding);
 
@@ -4030,9 +4118,9 @@
 
     TType *interfaceBlockType =
         new TType(interfaceBlock, typeQualifier.qualifier, blockLayoutQualifier);
-    if (arrayIndex != nullptr)
+    if (arraySizes)
     {
-        interfaceBlockType->makeArray(arraySize);
+        interfaceBlockType->makeArrays(*arraySizes);
     }
 
     // The instance variable gets created to refer to the interface block type from the AST
@@ -4184,7 +4272,6 @@
     {
         if (baseExpression->isInterfaceBlock())
         {
-            // TODO(jiawei.shao@intel.com): implement GL_EXT_shader_io_blocks.
             switch (baseExpression->getQualifier())
             {
                 case EvqPerVertexIn:
@@ -4205,8 +4292,12 @@
                           "[");
                     break;
                 default:
-                    // We can reach here only in error cases.
-                    ASSERT(mDiagnostics->numErrors() > 0);
+                    // It's ok for shader I/O blocks to be dynamically indexed
+                    if (!IsShaderIoBlock(baseExpression->getQualifier()))
+                    {
+                        // We can reach here only in error cases.
+                        ASSERT(mDiagnostics->numErrors() > 0);
+                    }
                     break;
             }
         }
diff --git a/src/compiler/translator/ParseContext.h b/src/compiler/translator/ParseContext.h
index 70d2ad4..51c0825 100644
--- a/src/compiler/translator/ParseContext.h
+++ b/src/compiler/translator/ParseContext.h
@@ -358,8 +358,8 @@
                                           TFieldList *fieldList,
                                           const ImmutableString &instanceName,
                                           const TSourceLoc &instanceLine,
-                                          TIntermTyped *arrayIndex,
-                                          const TSourceLoc &arrayIndexLine);
+                                          const TVector<unsigned int> *arraySizes,
+                                          const TSourceLoc &arraySizesLine);
 
     void parseLocalSize(const ImmutableString &qualifierType,
                         const TSourceLoc &qualifierTypeLine,
@@ -616,8 +616,8 @@
     // followed by a declarator.
     bool mDeferredNonEmptyDeclarationErrorCheck;
 
-    sh::GLenum mShaderType;    // vertex or fragment language (future: pack or unpack)
-    ShShaderSpec mShaderSpec;  // The language specification compiler conforms to - GLES2 or WebGL.
+    sh::GLenum mShaderType;    // vertex/fragment/geometry/etc shader
+    ShShaderSpec mShaderSpec;  // The language specification compiler conforms to - GLES/WebGL/etc.
     ShCompileOptions mCompileOptions;  // Options passed to TCompiler
     int mShaderVersion;
     TIntermBlock *mTreeRoot;  // root of parse tree being created
@@ -674,6 +674,7 @@
     int mGeometryShaderMaxVertices;
     int mMaxGeometryShaderInvocations;
     int mMaxGeometryShaderMaxVertices;
+    unsigned int mGeometryInputArraySize;
 
     // Track when we add new scope for func body in ESSL 1.00 spec
     bool mFunctionBodyNewScope;
diff --git a/src/compiler/translator/ResourcesHLSL.cpp b/src/compiler/translator/ResourcesHLSL.cpp
index 4b7fc44..68d9e37 100644
--- a/src/compiler/translator/ResourcesHLSL.cpp
+++ b/src/compiler/translator/ResourcesHLSL.cpp
@@ -697,7 +697,7 @@
 
 TString ResourcesHLSL::uniformBlocksHeader(
     const ReferencedInterfaceBlocks &referencedInterfaceBlocks,
-    const std::map<int, const TInterfaceBlock *> &uniformBlockTranslatedToStructuredBuffer)
+    const std::map<int, const TInterfaceBlock *> &uniformBlockOptimizedMap)
 {
     TString interfaceBlocks;
 
@@ -712,7 +712,7 @@
 
         // In order to avoid compile performance issue, translate uniform block to structured
         // buffer. anglebug.com/3682.
-        if (uniformBlockTranslatedToStructuredBuffer.count(interfaceBlock.uniqueId().get()) != 0)
+        if (uniformBlockOptimizedMap.count(interfaceBlock.uniqueId().get()) != 0)
         {
             unsigned int structuredBufferRegister = mSRVRegister;
             if (instanceVariable != nullptr && instanceVariable->getType().isArray())
diff --git a/src/compiler/translator/ResourcesHLSL.h b/src/compiler/translator/ResourcesHLSL.h
index 1af2984..ef2d938 100644
--- a/src/compiler/translator/ResourcesHLSL.h
+++ b/src/compiler/translator/ResourcesHLSL.h
@@ -40,7 +40,7 @@
     void imageMetadataUniforms(TInfoSinkBase &out, unsigned int regIndex);
     TString uniformBlocksHeader(
         const ReferencedInterfaceBlocks &referencedInterfaceBlocks,
-        const std::map<int, const TInterfaceBlock *> &uniformBlockTranslatedToStructuredBuffer);
+        const std::map<int, const TInterfaceBlock *> &uniformBlockOptimizedMap);
     TString shaderStorageBlocksHeader(const ReferencedInterfaceBlocks &referencedInterfaceBlocks);
 
     // Used for direct index references
diff --git a/src/compiler/translator/ShaderLang.cpp b/src/compiler/translator/ShaderLang.cpp
index eaec7cb..ceeffc1 100644
--- a/src/compiler/translator/ShaderLang.cpp
+++ b/src/compiler/translator/ShaderLang.cpp
@@ -167,6 +167,8 @@
     resources->EXT_YUV_target                              = 0;
     resources->EXT_geometry_shader                         = 0;
     resources->EXT_gpu_shader5                             = 0;
+    resources->OES_shader_io_blocks                        = 0;
+    resources->EXT_shader_io_blocks                        = 0;
     resources->EXT_shader_non_constant_global_initializers = 0;
     resources->NV_shader_noperspective_interpolation       = 0;
     resources->OES_texture_storage_multisample_2d_array    = 0;
@@ -627,6 +629,18 @@
 #endif  // ANGLE_ENABLE_HLSL
 }
 
+const std::set<std::string> *GetSlowCompilingUniformBlockSet(const ShHandle handle)
+{
+#ifdef ANGLE_ENABLE_HLSL
+    TranslatorHLSL *translator = GetTranslatorHLSLFromHandle(handle);
+    ASSERT(translator);
+
+    return translator->getSlowCompilingUniformBlockSet();
+#else
+    return nullptr;
+#endif  // ANGLE_ENABLE_HLSL
+}
+
 unsigned int GetReadonlyImage2DRegisterIndex(const ShHandle handle)
 {
 #ifdef ANGLE_ENABLE_HLSL
diff --git a/src/compiler/translator/ShaderVars.cpp b/src/compiler/translator/ShaderVars.cpp
index d205871..aa2123e8 100644
--- a/src/compiler/translator/ShaderVars.cpp
+++ b/src/compiler/translator/ShaderVars.cpp
@@ -40,6 +40,7 @@
       active(false),
       isRowMajorLayout(false),
       location(-1),
+      hasImplicitLocation(false),
       binding(-1),
       imageUnitFormat(GL_NONE),
       offset(-1),
@@ -49,6 +50,7 @@
       yuv(false),
       interpolation(INTERPOLATION_SMOOTH),
       isInvariant(false),
+      isShaderIOBlock(false),
       texelFetchStaticUse(false),
       flattenedOffsetInParentArrays(-1)
 {}
@@ -71,8 +73,10 @@
       active(other.active),
       fields(other.fields),
       structName(other.structName),
+      mappedStructName(other.mappedStructName),
       isRowMajorLayout(other.isRowMajorLayout),
       location(other.location),
+      hasImplicitLocation(other.hasImplicitLocation),
       binding(other.binding),
       imageUnitFormat(other.imageUnitFormat),
       offset(other.offset),
@@ -82,6 +86,7 @@
       yuv(other.yuv),
       interpolation(other.interpolation),
       isInvariant(other.isInvariant),
+      isShaderIOBlock(other.isShaderIOBlock),
       texelFetchStaticUse(other.texelFetchStaticUse),
       flattenedOffsetInParentArrays(other.flattenedOffsetInParentArrays)
 {}
@@ -97,9 +102,11 @@
     active                        = other.active;
     fields                        = other.fields;
     structName                    = other.structName;
+    mappedStructName              = other.mappedStructName;
     isRowMajorLayout              = other.isRowMajorLayout;
     flattenedOffsetInParentArrays = other.flattenedOffsetInParentArrays;
     location                      = other.location;
+    hasImplicitLocation           = other.hasImplicitLocation;
     binding                       = other.binding;
     imageUnitFormat               = other.imageUnitFormat;
     offset                        = other.offset;
@@ -109,6 +116,7 @@
     yuv                           = other.yuv;
     interpolation                 = other.interpolation;
     isInvariant                   = other.isInvariant;
+    isShaderIOBlock               = other.isShaderIOBlock;
     texelFetchStaticUse           = other.texelFetchStaticUse;
     return *this;
 }
@@ -119,11 +127,13 @@
         mappedName != other.mappedName || arraySizes != other.arraySizes ||
         staticUse != other.staticUse || active != other.active ||
         fields.size() != other.fields.size() || structName != other.structName ||
-        isRowMajorLayout != other.isRowMajorLayout || location != other.location ||
+        mappedStructName != other.mappedStructName || isRowMajorLayout != other.isRowMajorLayout ||
+        location != other.location || hasImplicitLocation != other.hasImplicitLocation ||
         binding != other.binding || imageUnitFormat != other.imageUnitFormat ||
         offset != other.offset || readonly != other.readonly || writeonly != other.writeonly ||
         index != other.index || yuv != other.yuv || interpolation != other.interpolation ||
-        isInvariant != other.isInvariant || texelFetchStaticUse != other.texelFetchStaticUse)
+        isInvariant != other.isInvariant || isShaderIOBlock != other.isShaderIOBlock ||
+        texelFetchStaticUse != other.texelFetchStaticUse)
     {
         return false;
     }
@@ -323,7 +333,7 @@
 
 bool ShaderVariable::isBuiltIn() const
 {
-    return (name.size() >= 4 && name[0] == 'g' && name[1] == 'l' && name[2] == '_');
+    return gl::IsBuiltInName(name);
 }
 
 bool ShaderVariable::isEmulatedBuiltIn() const
@@ -359,11 +369,27 @@
             return false;
         }
     }
-    if (structName != other.structName)
+    if (structName != other.structName || mappedStructName != other.mappedStructName)
         return false;
     return true;
 }
 
+void ShaderVariable::updateEffectiveLocation(const sh::ShaderVariable &parent)
+{
+    if ((location < 0 || hasImplicitLocation) && !parent.hasImplicitLocation)
+    {
+        location = parent.location;
+    }
+}
+
+void ShaderVariable::resetEffectiveLocation()
+{
+    if (hasImplicitLocation)
+    {
+        location = -1;
+    }
+}
+
 bool ShaderVariable::isSameUniformAtLinkTime(const ShaderVariable &other) const
 {
     // Enforce a consistent match.
@@ -403,11 +429,28 @@
 
 bool ShaderVariable::isSameVaryingAtLinkTime(const ShaderVariable &other, int shaderVersion) const
 {
-    return (ShaderVariable::isSameVariableAtLinkTime(other, false, false) &&
-            InterpolationTypesMatch(interpolation, other.interpolation) &&
-            (shaderVersion >= 300 || isInvariant == other.isInvariant) &&
-            (location == other.location) &&
-            (name == other.name || (shaderVersion >= 310 && location >= 0)));
+    return ShaderVariable::isSameVariableAtLinkTime(other, false, false) &&
+           InterpolationTypesMatch(interpolation, other.interpolation) &&
+           (shaderVersion >= 300 || isInvariant == other.isInvariant) &&
+           location == other.location &&
+           (isSameNameAtLinkTime(other) || (shaderVersion >= 310 && location >= 0));
+}
+
+bool ShaderVariable::isSameNameAtLinkTime(const ShaderVariable &other) const
+{
+    if (isShaderIOBlock != other.isShaderIOBlock)
+    {
+        return false;
+    }
+
+    if (isShaderIOBlock)
+    {
+        // Shader I/O blocks match by block name.
+        return structName == other.structName;
+    }
+
+    // Otherwise match by name.
+    return name == other.name;
 }
 
 InterfaceBlock::InterfaceBlock()
@@ -485,7 +528,7 @@
 
 bool InterfaceBlock::isBuiltIn() const
 {
-    return (name.size() >= 4 && name[0] == 'g' && name[1] == 'l' && name[2] == '_');
+    return gl::IsBuiltInName(name);
 }
 
 void WorkGroupSize::fill(int fillValue)
diff --git a/src/compiler/translator/TranslatorHLSL.cpp b/src/compiler/translator/TranslatorHLSL.cpp
index bd00f83..c335dee 100644
--- a/src/compiler/translator/TranslatorHLSL.cpp
+++ b/src/compiler/translator/TranslatorHLSL.cpp
@@ -12,7 +12,7 @@
 #include "compiler/translator/tree_ops/BreakVariableAliasingInInnerLoops.h"
 #include "compiler/translator/tree_ops/ExpandIntegerPowExpressions.h"
 #include "compiler/translator/tree_ops/PruneEmptyCases.h"
-#include "compiler/translator/tree_ops/RecordUniformBlocksTranslatedToStructuredBuffers.h"
+#include "compiler/translator/tree_ops/RecordUniformBlocksWithLargeArrayMember.h"
 #include "compiler/translator/tree_ops/RemoveDynamicIndexing.h"
 #include "compiler/translator/tree_ops/RewriteAtomicFunctionExpressions.h"
 #include "compiler/translator/tree_ops/RewriteElseBlocks.h"
@@ -184,25 +184,26 @@
         }
     }
 
-    mUniformBlocksTranslatedToStructuredBuffers.clear();
+    mUniformBlockOptimizedMap.clear();
+    mSlowCompilingUniformBlockSet.clear();
     // In order to get the exact maximum of slots are available for shader resources, which would
     // been bound with StructuredBuffer, we only translate uniform block with a large array member
     // into StructuredBuffer when shader version is 300.
     if (getShaderVersion() == 300 &&
         (compileOptions & SH_ALLOW_TRANSLATE_UNIFORM_BLOCK_TO_STRUCTUREDBUFFER) != 0)
     {
-        if (!sh::RecordUniformBlocksTranslatedToStructuredBuffers(
-                root, mUniformBlocksTranslatedToStructuredBuffers))
+        if (!sh::RecordUniformBlocksWithLargeArrayMember(root, mUniformBlockOptimizedMap,
+                                                         mSlowCompilingUniformBlockSet))
         {
             return false;
         }
     }
 
-    sh::OutputHLSL outputHLSL(
-        getShaderType(), getShaderSpec(), getShaderVersion(), getExtensionBehavior(),
-        getSourcePath(), getOutputType(), numRenderTargets, maxDualSourceDrawBuffers, getUniforms(),
-        compileOptions, getComputeShaderLocalSize(), &getSymbolTable(), perfDiagnostics,
-        mUniformBlocksTranslatedToStructuredBuffers, mShaderStorageBlocks);
+    sh::OutputHLSL outputHLSL(getShaderType(), getShaderSpec(), getShaderVersion(),
+                              getExtensionBehavior(), getSourcePath(), getOutputType(),
+                              numRenderTargets, maxDualSourceDrawBuffers, getUniforms(),
+                              compileOptions, getComputeShaderLocalSize(), &getSymbolTable(),
+                              perfDiagnostics, mUniformBlockOptimizedMap, mShaderStorageBlocks);
 
     outputHLSL.output(root, getInfoSink().obj);
 
@@ -251,6 +252,11 @@
     return &mUniformRegisterMap;
 }
 
+const std::set<std::string> *TranslatorHLSL::getSlowCompilingUniformBlockSet() const
+{
+    return &mSlowCompilingUniformBlockSet;
+}
+
 unsigned int TranslatorHLSL::getReadonlyImage2DRegisterIndex() const
 {
     return mReadonlyImage2DRegisterIndex;
diff --git a/src/compiler/translator/TranslatorHLSL.h b/src/compiler/translator/TranslatorHLSL.h
index 62ac438..36eb702 100644
--- a/src/compiler/translator/TranslatorHLSL.h
+++ b/src/compiler/translator/TranslatorHLSL.h
@@ -24,6 +24,7 @@
     bool hasUniformBlock(const std::string &interfaceBlockName) const;
     unsigned int getUniformBlockRegister(const std::string &interfaceBlockName) const;
     bool shouldUniformBlockUseStructuredBuffer(const std::string &uniformBlockName) const;
+    const std::set<std::string> *getSlowCompilingUniformBlockSet() const;
 
     const std::map<std::string, unsigned int> *getUniformRegisterMap() const;
     unsigned int getReadonlyImage2DRegisterIndex() const;
@@ -46,7 +47,8 @@
     unsigned int mReadonlyImage2DRegisterIndex;
     unsigned int mImage2DRegisterIndex;
     std::set<std::string> mUsedImage2DFunctionNames;
-    std::map<int, const TInterfaceBlock *> mUniformBlocksTranslatedToStructuredBuffers;
+    std::map<int, const TInterfaceBlock *> mUniformBlockOptimizedMap;
+    std::set<std::string> mSlowCompilingUniformBlockSet;
 };
 
 }  // namespace sh
diff --git a/src/compiler/translator/TranslatorVulkan.cpp b/src/compiler/translator/TranslatorVulkan.cpp
index c2093be..b8a8bd6 100644
--- a/src/compiler/translator/TranslatorVulkan.cpp
+++ b/src/compiler/translator/TranslatorVulkan.cpp
@@ -341,9 +341,9 @@
     return RunAtTheEndOfShader(compiler, root, assignment, symbolTable);
 }
 
-ANGLE_NO_DISCARD bool AppendVertexShaderTransformFeedbackOutputToMain(TCompiler *compiler,
-                                                                      TIntermBlock *root,
-                                                                      TSymbolTable *symbolTable)
+ANGLE_NO_DISCARD bool AppendTransformFeedbackOutputToMain(TCompiler *compiler,
+                                                          TIntermBlock *root,
+                                                          TSymbolTable *symbolTable)
 {
     TVariable *xfbPlaceholder = new TVariable(symbolTable, ImmutableString("@@ XFB-OUT @@"),
                                               new TType(), SymbolType::AngleInternal);
@@ -467,7 +467,13 @@
     {
         flipXY = driverUniforms->getFlipXYRef();
     }
-    TIntermBinary *pivot       = driverUniforms->getHalfRenderAreaRef();
+
+    TIntermBinary *pivot = rotationSpecConst->getHalfRenderArea();
+    if (!pivot)
+    {
+        pivot = driverUniforms->getHalfRenderAreaRef();
+    }
+
     TIntermTyped *fragRotation = nullptr;
     if (compileOptions & SH_ADD_PRE_ROTATION)
     {
@@ -739,11 +745,12 @@
         return false;
     }
 
+    gl::ShaderType packedShaderType = gl::FromGLenum<gl::ShaderType>(getShaderType());
+
     if (defaultUniformCount > 0)
     {
-        gl::ShaderType shaderType = gl::FromGLenum<gl::ShaderType>(getShaderType());
         sink << "\nlayout(set=0, binding=" << outputGLSL->nextUnusedBinding()
-             << ", std140) uniform " << kDefaultUniformNames[shaderType] << "\n{\n";
+             << ", std140) uniform " << kDefaultUniformNames[packedShaderType] << "\n{\n";
 
         DeclareDefaultUniformsTraverser defaultTraverser(&sink, getHashFunction(), &getNameMap());
         root->traverse(&defaultTraverser);
@@ -791,7 +798,7 @@
         }
     }
 
-    if (getShaderType() != GL_COMPUTE_SHADER)
+    if (packedShaderType != gl::ShaderType::Compute)
     {
         if (!ReplaceGLDepthRangeWithDriverUniform(this, root, driverUniforms, &getSymbolTable()))
         {
@@ -808,224 +815,249 @@
         }
     }
 
-    // Declare gl_FragColor and glFragData as webgl_FragColor and webgl_FragData
-    // if it's core profile shaders and they are used.
-    if (getShaderType() == GL_FRAGMENT_SHADER)
+    if (gl::ShaderTypeSupportsTransformFeedback(packedShaderType))
     {
-        bool usesPointCoord   = false;
-        bool usesFragCoord    = false;
-        bool usesSampleMaskIn = false;
-
-        // Search for the gl_PointCoord usage, if its used, we need to flip the y coordinate.
-        for (const ShaderVariable &inputVarying : mInputVaryings)
-        {
-            if (!inputVarying.isBuiltIn())
-            {
-                continue;
-            }
-
-            if (inputVarying.name == "gl_SampleMaskIn")
-            {
-                usesSampleMaskIn = true;
-                continue;
-            }
-
-            if (inputVarying.name == "gl_PointCoord")
-            {
-                usesPointCoord = true;
-                break;
-            }
-
-            if (inputVarying.name == "gl_FragCoord")
-            {
-                usesFragCoord = true;
-                break;
-            }
-        }
-
-        if (compileOptions & SH_ADD_BRESENHAM_LINE_RASTER_EMULATION)
-        {
-            if (!AddBresenhamEmulationFS(this, compileOptions, sink, root, &getSymbolTable(),
-                                         &surfaceRotationSpecConst, driverUniforms, usesFragCoord))
-            {
-                return false;
-            }
-            mSpecConstUsageBits.set(vk::SpecConstUsage::LineRasterEmulation);
-        }
-
-        bool hasGLFragColor  = false;
-        bool hasGLFragData   = false;
-        bool usePreRotation  = compileOptions & SH_ADD_PRE_ROTATION;
-        bool hasGLSampleMask = false;
-
-        for (const ShaderVariable &outputVar : mOutputVariables)
-        {
-            if (outputVar.name == "gl_FragColor")
-            {
-                ASSERT(!hasGLFragColor);
-                hasGLFragColor = true;
-                continue;
-            }
-            else if (outputVar.name == "gl_FragData")
-            {
-                ASSERT(!hasGLFragData);
-                hasGLFragData = true;
-                continue;
-            }
-            else if (outputVar.name == "gl_SampleMask")
-            {
-                ASSERT(!hasGLSampleMask);
-                hasGLSampleMask = true;
-                continue;
-            }
-        }
-        ASSERT(!(hasGLFragColor && hasGLFragData));
-        if (hasGLFragColor)
-        {
-            sink << "layout(location = 0) out vec4 webgl_FragColor;\n";
-        }
-        if (hasGLFragData)
-        {
-            sink << "layout(location = 0) out vec4 webgl_FragData[gl_MaxDrawBuffers];\n";
-        }
-
-        if (usesPointCoord)
-        {
-            TIntermTyped *flipNegXY = surfaceRotationSpecConst.getNegFlipXY();
-            if (!flipNegXY)
-            {
-                flipNegXY = driverUniforms->getNegFlipXYRef();
-            }
-            TIntermConstantUnion *pivot = CreateFloatNode(0.5f);
-            TIntermTyped *fragRotation  = nullptr;
-            if (usePreRotation)
-            {
-                fragRotation = surfaceRotationSpecConst.getFragRotationMatrix();
-                if (!fragRotation)
-                {
-                    fragRotation = driverUniforms->getFragRotationMatrixRef();
-                }
-            }
-            if (!RotateAndFlipBuiltinVariable(this, root, GetMainSequence(root), flipNegXY,
-                                              &getSymbolTable(), BuiltInVariable::gl_PointCoord(),
-                                              kFlippedPointCoordName, pivot, fragRotation))
-            {
-                return false;
-            }
-        }
-
-        if (usesFragCoord)
-        {
-            if (!InsertFragCoordCorrection(this, compileOptions, root, GetMainSequence(root),
-                                           &getSymbolTable(), &surfaceRotationSpecConst,
-                                           driverUniforms))
-            {
-                return false;
-            }
-        }
-
-        if (!RewriteDfdy(this, compileOptions, root, getSymbolTable(), getShaderVersion(),
-                         &surfaceRotationSpecConst, driverUniforms))
-        {
-            return false;
-        }
-
-        if (!RewriteInterpolateAtOffset(this, compileOptions, root, getSymbolTable(),
-                                        getShaderVersion(), &surfaceRotationSpecConst,
-                                        driverUniforms))
-        {
-            return false;
-        }
-
-        if (usesSampleMaskIn && !RewriteSampleMaskIn(this, root, &getSymbolTable()))
-        {
-            return false;
-        }
-
-        if (hasGLSampleMask)
-        {
-            TIntermBinary *numSamples = driverUniforms->getNumSamplesRef();
-            if (!RewriteSampleMask(this, root, &getSymbolTable(), numSamples))
-            {
-                return false;
-            }
-        }
-
-        {
-            const TVariable *numSamplesVar = static_cast<const TVariable *>(
-                getSymbolTable().findBuiltIn(ImmutableString("gl_NumSamples"), getShaderVersion()));
-            TIntermBinary *numSamples = driverUniforms->getNumSamplesRef();
-            if (!ReplaceVariableWithTyped(this, root, numSamplesVar, numSamples))
-            {
-                return false;
-            }
-        }
-
-        EmitEarlyFragmentTestsGLSL(*this, sink);
-    }
-    else if (getShaderType() == GL_VERTEX_SHADER)
-    {
-        if (compileOptions & SH_ADD_BRESENHAM_LINE_RASTER_EMULATION)
-        {
-            if (!AddBresenhamEmulationVS(this, root, &getSymbolTable(), driverUniforms))
-            {
-                return false;
-            }
-            mSpecConstUsageBits.set(vk::SpecConstUsage::LineRasterEmulation);
-        }
-
         // Add a macro to declare transform feedback buffers.
         sink << "@@ XFB-DECL @@\n\n";
 
         // Append a macro for transform feedback substitution prior to modifying depth.
-        if (!AppendVertexShaderTransformFeedbackOutputToMain(this, root, &getSymbolTable()))
+        if (!AppendTransformFeedbackOutputToMain(this, root, &getSymbolTable()))
         {
             return false;
         }
+    }
 
-        // Search for the gl_ClipDistance usage, if its used, we need to do some replacements.
-        bool useClipDistance = false;
-        for (const ShaderVariable &outputVarying : mOutputVaryings)
+    switch (packedShaderType)
+    {
+        case gl::ShaderType::Fragment:
         {
-            if (outputVarying.name == "gl_ClipDistance")
+            bool usesPointCoord   = false;
+            bool usesFragCoord    = false;
+            bool usesSampleMaskIn = false;
+
+            // Search for the gl_PointCoord usage, if its used, we need to flip the y coordinate.
+            for (const ShaderVariable &inputVarying : mInputVaryings)
             {
-                useClipDistance = true;
-                break;
+                if (!inputVarying.isBuiltIn())
+                {
+                    continue;
+                }
+
+                if (inputVarying.name == "gl_SampleMaskIn")
+                {
+                    usesSampleMaskIn = true;
+                    continue;
+                }
+
+                if (inputVarying.name == "gl_PointCoord")
+                {
+                    usesPointCoord = true;
+                    break;
+                }
+
+                if (inputVarying.name == "gl_FragCoord")
+                {
+                    usesFragCoord = true;
+                    break;
+                }
             }
-        }
-        if (useClipDistance &&
-            !ReplaceClipDistanceAssignments(this, root, &getSymbolTable(),
-                                            driverUniforms->getClipDistancesEnabled()))
-        {
-            return false;
+
+            if (compileOptions & SH_ADD_BRESENHAM_LINE_RASTER_EMULATION)
+            {
+                if (!AddBresenhamEmulationFS(this, compileOptions, sink, root, &getSymbolTable(),
+                                             &surfaceRotationSpecConst, driverUniforms,
+                                             usesFragCoord))
+                {
+                    return false;
+                }
+                mSpecConstUsageBits.set(vk::SpecConstUsage::LineRasterEmulation);
+            }
+
+            bool hasGLFragColor  = false;
+            bool hasGLFragData   = false;
+            bool usePreRotation  = compileOptions & SH_ADD_PRE_ROTATION;
+            bool hasGLSampleMask = false;
+
+            for (const ShaderVariable &outputVar : mOutputVariables)
+            {
+                if (outputVar.name == "gl_FragColor")
+                {
+                    ASSERT(!hasGLFragColor);
+                    hasGLFragColor = true;
+                    continue;
+                }
+                else if (outputVar.name == "gl_FragData")
+                {
+                    ASSERT(!hasGLFragData);
+                    hasGLFragData = true;
+                    continue;
+                }
+                else if (outputVar.name == "gl_SampleMask")
+                {
+                    ASSERT(!hasGLSampleMask);
+                    hasGLSampleMask = true;
+                    continue;
+                }
+            }
+
+            // Declare gl_FragColor and glFragData as webgl_FragColor and webgl_FragData
+            // if it's core profile shaders and they are used.
+            ASSERT(!(hasGLFragColor && hasGLFragData));
+            if (hasGLFragColor)
+            {
+                sink << "layout(location = 0) out vec4 webgl_FragColor;\n";
+            }
+            if (hasGLFragData)
+            {
+                sink << "layout(location = 0) out vec4 webgl_FragData[gl_MaxDrawBuffers];\n";
+            }
+
+            if (usesPointCoord)
+            {
+                TIntermTyped *flipNegXY = surfaceRotationSpecConst.getNegFlipXY();
+                if (!flipNegXY)
+                {
+                    flipNegXY = driverUniforms->getNegFlipXYRef();
+                }
+                TIntermConstantUnion *pivot = CreateFloatNode(0.5f);
+                TIntermTyped *fragRotation  = nullptr;
+                if (usePreRotation)
+                {
+                    fragRotation = surfaceRotationSpecConst.getFragRotationMatrix();
+                    if (!fragRotation)
+                    {
+                        fragRotation = driverUniforms->getFragRotationMatrixRef();
+                    }
+                }
+                if (!RotateAndFlipBuiltinVariable(this, root, GetMainSequence(root), flipNegXY,
+                                                  &getSymbolTable(),
+                                                  BuiltInVariable::gl_PointCoord(),
+                                                  kFlippedPointCoordName, pivot, fragRotation))
+                {
+                    return false;
+                }
+            }
+
+            if (usesFragCoord)
+            {
+                if (!InsertFragCoordCorrection(this, compileOptions, root, GetMainSequence(root),
+                                               &getSymbolTable(), &surfaceRotationSpecConst,
+                                               driverUniforms))
+                {
+                    return false;
+                }
+            }
+
+            if (!RewriteDfdy(this, compileOptions, root, getSymbolTable(), getShaderVersion(),
+                             &surfaceRotationSpecConst, driverUniforms))
+            {
+                return false;
+            }
+
+            if (!RewriteInterpolateAtOffset(this, compileOptions, root, getSymbolTable(),
+                                            getShaderVersion(), &surfaceRotationSpecConst,
+                                            driverUniforms))
+            {
+                return false;
+            }
+
+            if (usesSampleMaskIn && !RewriteSampleMaskIn(this, root, &getSymbolTable()))
+            {
+                return false;
+            }
+
+            if (hasGLSampleMask)
+            {
+                TIntermBinary *numSamples = driverUniforms->getNumSamplesRef();
+                if (!RewriteSampleMask(this, root, &getSymbolTable(), numSamples))
+                {
+                    return false;
+                }
+            }
+
+            {
+                const TVariable *numSamplesVar =
+                    static_cast<const TVariable *>(getSymbolTable().findBuiltIn(
+                        ImmutableString("gl_NumSamples"), getShaderVersion()));
+                TIntermBinary *numSamples = driverUniforms->getNumSamplesRef();
+                if (!ReplaceVariableWithTyped(this, root, numSamplesVar, numSamples))
+                {
+                    return false;
+                }
+            }
+
+            EmitEarlyFragmentTestsGLSL(*this, sink);
+            break;
         }
 
-        // Append depth range translation to main.
-        if (!transformDepthBeforeCorrection(root, driverUniforms))
+        case gl::ShaderType::Vertex:
         {
-            return false;
+            if (compileOptions & SH_ADD_BRESENHAM_LINE_RASTER_EMULATION)
+            {
+                if (!AddBresenhamEmulationVS(this, root, &getSymbolTable(), driverUniforms))
+                {
+                    return false;
+                }
+                mSpecConstUsageBits.set(vk::SpecConstUsage::LineRasterEmulation);
+            }
+
+            // Search for the gl_ClipDistance usage, if its used, we need to do some replacements.
+            bool useClipDistance = false;
+            for (const ShaderVariable &outputVarying : mOutputVaryings)
+            {
+                if (outputVarying.name == "gl_ClipDistance")
+                {
+                    useClipDistance = true;
+                    break;
+                }
+            }
+            if (useClipDistance &&
+                !ReplaceClipDistanceAssignments(this, root, &getSymbolTable(),
+                                                driverUniforms->getClipDistancesEnabled()))
+            {
+                return false;
+            }
+
+            // Append depth range translation to main.
+            if (!transformDepthBeforeCorrection(root, driverUniforms))
+            {
+                return false;
+            }
+            if (!AppendVertexShaderDepthCorrectionToMain(this, root, &getSymbolTable()))
+            {
+                return false;
+            }
+            if ((compileOptions & SH_ADD_PRE_ROTATION) != 0 &&
+                !AppendPreRotation(this, root, &getSymbolTable(), &surfaceRotationSpecConst,
+                                   driverUniforms))
+            {
+                return false;
+            }
+            break;
         }
-        if (!AppendVertexShaderDepthCorrectionToMain(this, root, &getSymbolTable()))
+
+        case gl::ShaderType::Geometry:
         {
-            return false;
+            int maxVertices = getGeometryShaderMaxVertices();
+
+            // max_vertices=0 is not valid in Vulkan
+            maxVertices = std::max(1, maxVertices);
+
+            WriteGeometryShaderLayoutQualifiers(
+                sink, getGeometryShaderInputPrimitiveType(), getGeometryShaderInvocations(),
+                getGeometryShaderOutputPrimitiveType(), maxVertices);
+            break;
         }
-        if ((compileOptions & SH_ADD_PRE_ROTATION) != 0 &&
-            !AppendPreRotation(this, root, &getSymbolTable(), &surfaceRotationSpecConst,
-                               driverUniforms))
+
+        case gl::ShaderType::Compute:
         {
-            return false;
+            EmitWorkGroupSizeGLSL(*this, sink);
+            break;
         }
-    }
-    else if (getShaderType() == GL_GEOMETRY_SHADER)
-    {
-        WriteGeometryShaderLayoutQualifiers(
-            sink, getGeometryShaderInputPrimitiveType(), getGeometryShaderInvocations(),
-            getGeometryShaderOutputPrimitiveType(), getGeometryShaderMaxVertices());
-    }
-    else
-    {
-        ASSERT(getShaderType() == GL_COMPUTE_SHADER);
-        EmitWorkGroupSizeGLSL(*this, sink);
+
+        default:
+            UNREACHABLE();
+            break;
     }
 
     surfaceRotationSpecConst.outputLayoutString(sink);
diff --git a/src/compiler/translator/ValidateVaryingLocations.cpp b/src/compiler/translator/ValidateVaryingLocations.cpp
index ee594e8..d32acd9 100644
--- a/src/compiler/translator/ValidateVaryingLocations.cpp
+++ b/src/compiler/translator/ValidateVaryingLocations.cpp
@@ -25,42 +25,135 @@
     diagnostics->error(symbol.getLine(), reason, symbol.getName().data());
 }
 
-unsigned int GetLocationCount(const TIntermSymbol *varying, bool ignoreVaryingArraySize)
+int GetStructLocationCount(const TStructure *structure);
+
+int GetFieldLocationCount(const TField *field)
 {
-    const auto &varyingType = varying->getType();
+    int field_size         = 0;
+    const TType *fieldType = field->type();
+
+    if (fieldType->getStruct() != nullptr)
+    {
+        field_size = GetStructLocationCount(fieldType->getStruct());
+    }
+    else if (fieldType->isMatrix())
+    {
+        field_size = fieldType->getNominalSize();
+    }
+    else
+    {
+        ASSERT(fieldType->getSecondarySize() == 1);
+        field_size = 1;
+    }
+
+    if (fieldType->isArray())
+    {
+        field_size *= fieldType->getArraySizeProduct();
+    }
+
+    return field_size;
+}
+
+int GetStructLocationCount(const TStructure *structure)
+{
+    int totalLocation = 0;
+    for (const TField *field : structure->fields())
+    {
+        totalLocation += GetFieldLocationCount(field);
+    }
+    return totalLocation;
+}
+
+int GetInterfaceBlockLocationCount(const TType &varyingType, bool ignoreVaryingArraySize)
+{
+    int totalLocation = 0;
+    for (const TField *field : varyingType.getInterfaceBlock()->fields())
+    {
+        totalLocation += GetFieldLocationCount(field);
+    }
+
+    if (!ignoreVaryingArraySize && varyingType.isArray())
+    {
+        totalLocation *= varyingType.getArraySizeProduct();
+    }
+    return totalLocation;
+}
+
+int GetLocationCount(const TIntermSymbol *varying, bool ignoreVaryingArraySize)
+{
+    const TType &varyingType = varying->getType();
+    ASSERT(!varyingType.isInterfaceBlock());
+
     if (varyingType.getStruct() != nullptr)
     {
-        ASSERT(!varyingType.isArray());
-        unsigned int totalLocation = 0;
-        for (const auto *field : varyingType.getStruct()->fields())
+        int totalLocation = 0;
+        for (const TField *field : varyingType.getStruct()->fields())
         {
-            const auto *fieldType = field->type();
+            const TType *fieldType = field->type();
             ASSERT(fieldType->getStruct() == nullptr && !fieldType->isArray());
 
-            totalLocation +=
-                fieldType->isMatrix() ? fieldType->getNominalSize() : fieldType->getSecondarySize();
+            totalLocation += GetFieldLocationCount(field);
         }
         return totalLocation;
     }
+
+    ASSERT(varyingType.isMatrix() || varyingType.getSecondarySize() == 1);
+    int elementLocationCount = varyingType.isMatrix() ? varyingType.getNominalSize() : 1;
+
     // [GL_EXT_shader_io_blocks SPEC Chapter 4.4.1]
     // Geometry shader inputs, tessellation control shader inputs and outputs, and tessellation
     // evaluation inputs all have an additional level of arrayness relative to other shader inputs
     // and outputs. This outer array level is removed from the type before considering how many
     // locations the type consumes.
-    else if (ignoreVaryingArraySize)
+    if (ignoreVaryingArraySize)
     {
         // Array-of-arrays cannot be inputs or outputs of a geometry shader.
         // (GL_EXT_geometry_shader SPEC issues(5))
         ASSERT(!varyingType.isArrayOfArrays());
-        return varyingType.getSecondarySize();
+        return elementLocationCount;
     }
-    else if (varyingType.isMatrix())
+
+    return elementLocationCount * varyingType.getArraySizeProduct();
+}
+
+struct SymbolAndField
+{
+    const TIntermSymbol *symbol;
+    const TField *field;
+};
+using LocationMap = std::map<int, SymbolAndField>;
+
+void MarkVaryingLocations(TDiagnostics *diagnostics,
+                          const TIntermSymbol *varying,
+                          const TField *field,
+                          int location,
+                          int elementCount,
+                          LocationMap *locationMap)
+{
+    for (int elementIndex = 0; elementIndex < elementCount; ++elementIndex)
     {
-        return varyingType.getNominalSize() * varyingType.getArraySizeProduct();
-    }
-    else
-    {
-        return varyingType.getArraySizeProduct();
+        const int offsetLocation = location + elementIndex;
+        auto conflict            = locationMap->find(offsetLocation);
+        if (conflict != locationMap->end())
+        {
+            std::stringstream strstr = sh::InitializeStream<std::stringstream>();
+            strstr << "'" << varying->getName();
+            if (field)
+            {
+                strstr << "." << field->name();
+            }
+            strstr << "' conflicting location with '" << conflict->second.symbol->getName();
+            if (conflict->second.field)
+            {
+                strstr << "." << conflict->second.field->name();
+            }
+            strstr << "'";
+            error(*varying, strstr.str().c_str(), diagnostics);
+        }
+        else
+        {
+            (*locationMap)[offsetLocation] = {varying, field};
+        }
     }
 }
 
@@ -76,29 +169,89 @@
         return;
     }
 
-    std::map<int, const TIntermSymbol *> locationMap;
+    LocationMap locationMap;
     for (const TIntermSymbol *varying : varyingVector)
     {
-        const int location = varying->getType().getLayoutQualifier().location;
+        const TType &varyingType = varying->getType();
+        const int location       = varyingType.getLayoutQualifier().location;
         ASSERT(location >= 0);
 
-        const int elementCount = GetLocationCount(varying, ignoreVaryingArraySize);
-        for (int elementIndex = 0; elementIndex < elementCount; ++elementIndex)
+        // A varying is either:
+        //
+        // - A vector or matrix, which can take a number of contiguous locations
+        // - A struct, which also takes a number of contiguous locations
+        // - An interface block.
+        //
+        // Interface blocks can assign arbitrary locations to their fields, for example:
+        //
+        //     layout(location = 4) in block {
+        //         vec4 a;                         // gets location 4
+        //         vec4 b;                         // gets location 5
+        //         layout(location = 7) vec4 c;    // gets location 7
+        //         vec4 d;                         // gets location 8
+        //         layout (location = 1) vec4 e;   // gets location 1
+        //         vec4 f;                         // gets location 2
+        //     };
+        //
+        // The following code therefore takes two paths.  For non-interface-block types, the number
+        // of locations for the varying is calculated (elementCount), and all locations in
+        // [location, location + elementCount) are marked as occupied.
+        //
+        // For interface blocks, a similar algorithm is implemented except each field is
+        // individually marked with the location either advancing automatically or taking its value
+        // from the field's layout qualifier.
+
+        if (varyingType.isInterfaceBlock())
         {
-            const int offsetLocation = location + elementIndex;
-            if (locationMap.find(offsetLocation) != locationMap.end())
+            int currentLocation       = location;
+            bool anyFieldWithLocation = false;
+
+            for (const TField *field : varyingType.getInterfaceBlock()->fields())
             {
-                std::stringstream strstr = sh::InitializeStream<std::stringstream>();
-                strstr << "'" << varying->getName()
-                       << "' conflicting location with previously defined '"
-                       << locationMap[offsetLocation]->getName() << "'";
-                error(*varying, strstr.str().c_str(), diagnostics);
+                const int fieldLocation = field->type()->getLayoutQualifier().location;
+                if (fieldLocation >= 0)
+                {
+                    currentLocation      = fieldLocation;
+                    anyFieldWithLocation = true;
+                }
+
+                const int fieldLocationCount = GetFieldLocationCount(field);
+                MarkVaryingLocations(diagnostics, varying, field, currentLocation,
+                                     fieldLocationCount, &locationMap);
+
+                currentLocation += fieldLocationCount;
             }
-            else
+
+            // Array interface blocks can't have location qualifiers on fields.
+            ASSERT(ignoreVaryingArraySize || !anyFieldWithLocation || !varyingType.isArray());
+
+            if (!ignoreVaryingArraySize && varyingType.isArray())
             {
-                locationMap[offsetLocation] = varying;
+                // This is only reached if the varying is an array of interface blocks, with only a
+                // layout qualifier on the block itself, for example:
+                //
+                //     layout(location = 4) in block {
+                //         vec4 a;
+                //         vec4 b;
+                //         vec4 c;
+                //         vec4 d;
+                //     } instance[N];
+                //
+                // The locations for instance[0] are already marked by the above code, so we need to
+                // further mark locations occupied by instances [1, N).  |currentLocation| is
+                // already just past the end of instance[0], which is the beginning of instance[1].
+                //
+                int remainingLocations = currentLocation * (varyingType.getArraySizeProduct() - 1);
+                MarkVaryingLocations(diagnostics, varying, nullptr, currentLocation,
+                                     remainingLocations, &locationMap);
             }
         }
+        else
+        {
+            const int elementCount = GetLocationCount(varying, ignoreVaryingArraySize);
+            MarkVaryingLocations(diagnostics, varying, nullptr, location, elementCount,
+                                 &locationMap);
+        }
     }
 }
 
@@ -174,7 +327,17 @@
 
 unsigned int CalculateVaryingLocationCount(TIntermSymbol *varying, GLenum shaderType)
 {
-    return GetLocationCount(varying, shaderType == GL_GEOMETRY_SHADER_EXT);
+    const TType &varyingType          = varying->getType();
+    const TQualifier qualifier        = varyingType.getQualifier();
+    const bool isShaderIn             = IsShaderIn(qualifier);
+    const bool ignoreVaryingArraySize = isShaderIn && shaderType == GL_GEOMETRY_SHADER_EXT;
+
+    if (varyingType.isInterfaceBlock())
+    {
+        return GetInterfaceBlockLocationCount(varyingType, ignoreVaryingArraySize);
+    }
+
+    return GetLocationCount(varying, ignoreVaryingArraySize);
 }
 
 bool ValidateVaryingLocations(TIntermBlock *root, TDiagnostics *diagnostics, GLenum shaderType)
diff --git a/src/compiler/translator/glslang.y b/src/compiler/translator/glslang.y
index 871c0cf..d1fc3cd 100644
--- a/src/compiler/translator/glslang.y
+++ b/src/compiler/translator/glslang.y
@@ -618,9 +618,9 @@
         ES3_OR_NEWER(ImmutableString($2.string), @1, "interface blocks");
         $$ = context->addInterfaceBlock(*$1, @2, ImmutableString($2.string), $3, ImmutableString($5.string), @5, NULL, @$);
     }
-    | type_qualifier enter_struct struct_declaration_list RIGHT_BRACE IDENTIFIER LEFT_BRACKET constant_expression RIGHT_BRACKET SEMICOLON {
+    | type_qualifier enter_struct struct_declaration_list RIGHT_BRACE IDENTIFIER array_specifier SEMICOLON {
         ES3_OR_NEWER(ImmutableString($2.string), @1, "interface blocks");
-        $$ = context->addInterfaceBlock(*$1, @2, ImmutableString($2.string), $3, ImmutableString($5.string), @5, $7, @6);
+        $$ = context->addInterfaceBlock(*$1, @2, ImmutableString($2.string), $3, ImmutableString($5.string), @5, $6, @6);
     }
     | type_qualifier SEMICOLON {
         context->parseGlobalLayoutQualifier(*$1);
diff --git a/src/compiler/translator/glslang_tab_autogen.cpp b/src/compiler/translator/glslang_tab_autogen.cpp
index c4d65f6..8f05110 100644
--- a/src/compiler/translator/glslang_tab_autogen.cpp
+++ b/src/compiler/translator/glslang_tab_autogen.cpp
@@ -696,7 +696,7 @@
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL 164
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST 3501
+#define YYLAST 3500
 
 /* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS 182
@@ -705,7 +705,7 @@
 /* YYNRULES -- Number of rules.  */
 #define YYNRULES 326
 /* YYNSTATES -- Number of states.  */
-#define YYNSTATES 452
+#define YYNSTATES 450
 
 #define YYUNDEFTOK 2
 #define YYMAXUTOK 436
@@ -1067,9 +1067,9 @@
     426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436};
 #endif
 
-#define YYPACT_NINF -392
+#define YYPACT_NINF -393
 
-#define yypact_value_is_default(Yystate) (!!((Yystate) == (-392)))
+#define yypact_value_is_default(Yystate) (!!((Yystate) == (-393)))
 
 #define YYTABLE_NINF -286
 
@@ -1078,35 +1078,35 @@
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
 static const yytype_int16 yypact[] = {
-    2999, -392, -392, -392, -392, -392, 126,  -392, -392, -392, -392, -392, -392, -392, -392, -392,
-    -392, -392, -392, -392, -392, -392, -392, -392, -392, -392, -392, -392, -392, -392, -392, -392,
-    -392, -392, -392, -392, -392, -392, -392, -392, -392, -392, -392, -392, -392, -392, -392, -392,
-    -392, -392, -392, -392, -85,  -392, -392, -392, -392, -392, -392, -392, -392, -392, -392, -392,
-    -392, -392, -392, -392, -392, -392, -392, -392, -392, -392, -392, -392, -392, -392, -392, -392,
-    -392, -392, -392, -392, -392, -392, -392, -392, -392, -392, -392, -392, -392, -392, -392, -392,
-    -392, -392, -392, -392, -392, -392, -392, -392, -392, -392, -392, -392, -392, -392, -392, -392,
-    -132, -392, -392, -392, -93,  -122, -99,  3128, -127, -392, -2,   -392, 1586, -392, -392, -392,
-    -392, -392, -392, -392, -392, -61,  -392, 2870, -392, -392, 3370, -392, -392, -392, -58,  -49,
-    -392, -28,  -392, 3128, -392, -392, -392, 3128, 12,   12,   -392, -73,  -131, -119, -392, 3128,
-    -392, -392, 1708, -24,  -392, -392, -29,  3128, -392, -392, -22,  -104, -392, 436,  -392, -392,
-    -392, -392, -61,  -102, -392, 2158, -81,  -392, -392, 3128, 12,   2456, -392, -392, -8,   -392,
-    -392, -392, -392, -392, 2158, 2158, 2158, -392, -392, -392, -392, -392, -392, -392, -86,  -392,
-    -392, -392, -7,   -77,  2306, 21,   -392, 2158, -13,  -75,  17,   -114, 20,   2,    -21,  -6,
-    33,   39,   -125, -392, 27,   -392, 1859, -392, 2594, 3128, 32,   -392, -49,  22,   23,   -392,
-    34,   35,   26,   2010, 37,   2158, 30,   40,   36,   -392, -392, 116,  -392, -392, -62,  -392,
-    -93,  42,   -392, -392, -392, -392, 606,  -392, -392, -392, -392, -392, -392, -24,  2158, -80,
-    -392, -392, 2158, 12,   -61,  -55,  -392, -108, -392, -392, -392, -76,  -392, -392, 2158, 3249,
-    -392, -392, 2158, 38,   -392, -392, -392, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158,
-    2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, -392, -392, 44,   -392, 2732,
-    -392, -392, -392, -392, -392, 41,   -392, 2158, -392, -392, -54,  2158, 60,   -392, -392, -392,
-    776,  -392, -392, -392, -392, -392, -392, -392, -392, -392, -392, -392, 2158, 2158, -392, -392,
-    -392, -392, 2158, -392, -38,  -24,  12,   -392, -137, -392, -392, 66,   63,   -392, 43,   -392,
-    -392, -392, -392, -392, -13,  -13,  -75,  -75,  17,   17,   17,   17,   -114, -114, 20,   2,
-    -21,  -6,   33,   39,   3,    -392, -392, 162,  -28,  1116, 1286, -69,  -392, -67,  -392, 1436,
-    776,  -392, -392, -392, -392, -392, 2158, -392, -392, 2158, 72,   -392, -392, -392, -392, 1436,
-    41,   -392, 63,   12,   3128, 75,   68,   74,   -392, 2158, -392, 69,   77,   220,  -392, 78,
-    76,   946,  -392, 71,   -65,  2158, 946,  41,   -392, 2158, -392, -392, -392, -392, 79,   63,
-    -392, -392, -392, -392};
+    2998, -393, -393, -393, -393, -393, 135,  -393, -393, -393, -393, -393, -393, -393, -393, -393,
+    -393, -393, -393, -393, -393, -393, -393, -393, -393, -393, -393, -393, -393, -393, -393, -393,
+    -393, -393, -393, -393, -393, -393, -393, -393, -393, -393, -393, -393, -393, -393, -393, -393,
+    -393, -393, -393, -393, -108, -393, -393, -393, -393, -393, -393, -393, -393, -393, -393, -393,
+    -393, -393, -393, -393, -393, -393, -393, -393, -393, -393, -393, -393, -393, -393, -393, -393,
+    -393, -393, -393, -393, -393, -393, -393, -393, -393, -393, -393, -393, -393, -393, -393, -393,
+    -393, -393, -393, -393, -393, -393, -393, -393, -393, -393, -393, -393, -393, -393, -393, -393,
+    -63,  -393, -393, -393, -56,  -60,  -31,  3127, -61,  -393, -66,  -393, 1585, -393, -393, -393,
+    -393, -393, -393, -393, -393, -46,  -393, 2869, -393, -393, 3369, -393, -393, -393, -17,  -47,
+    -393, -14,  -393, 3127, -393, -393, -393, 3127, -9,   -9,   -393, 6,    -119, -80,  -393, 3127,
+    -393, -393, 1707, 5,    -393, -393, -2,   3127, -393, -393, 1,    -74,  -393, 435,  -393, -393,
+    -393, -393, -46,  -98,  -393, 2157, -87,  -393, -393, 3127, -9,   2455, -393, -393, 11,   -393,
+    -393, -393, -393, -393, 2157, 2157, 2157, -393, -393, -393, -393, -393, -393, -393, -111, -393,
+    -393, -393, 12,   -73,  2305, 16,   -393, 2157, -21,  -132, -6,   -116, -15,  -8,   -3,   -1,
+    25,   31,   -125, -393, 18,   -393, 1858, -393, 2593, 3127, 3,    -393, -47,  13,   20,   -393,
+    22,   24,   32,   2009, 28,   2157, 35,   45,   44,   -393, -393, 42,   -393, -393, -57,  -393,
+    -56,  48,   -393, -393, -393, -393, 605,  -393, -393, -393, -393, -393, -393, 5,    2157, -86,
+    -393, -393, 2157, -9,   -46,  -55,  -393, -110, -393, -393, -393, -72,  -393, -393, 2157, 3248,
+    -393, -393, 2157, 49,   -393, -393, -393, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157,
+    2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, -393, -393, 51,   -393, 2731,
+    -393, -393, -393, -393, -393, 52,   -393, 2157, -393, -393, -45,  2157, 47,   -393, -393, -393,
+    775,  -393, -393, -393, -393, -393, -393, -393, -393, -393, -393, -393, 2157, 2157, -393, -393,
+    -393, -393, 2157, -393, -38,  5,    -9,   -393, -129, -393, -393, 54,   53,   -393, 58,   -393,
+    -393, -393, -393, -393, -21,  -21,  -132, -132, -6,   -6,   -6,   -6,   -116, -116, -15,  -8,
+    -3,   -1,   25,   31,   -10,  -393, -393, 143,  -14,  1115, 1285, -69,  -393, -62,  -393, 1435,
+    775,  -393, -393, -393, -393, -393, -393, -123, -393, 2157, 61,   -393, -393, -393, -393, 1435,
+    52,   -393, 53,   -9,   3127, 62,   57,   -393, -393, 2157, -393, 55,   63,   206,  -393, 64,
+    67,   945,  -393, -59,  2157, 945,  52,   -393, 2157, -393, -393, -393, 60,   53,   -393, -393,
+    -393, -393};
 
 /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
    Performed when YYTABLE does not specify something else to do.  Zero
@@ -1133,18 +1133,18 @@
     81,  82,  83,  84,  79,  74,  0,   0,   294, 290, 292, 114, 0,   118, 0,   267, 0,   262, 0,
     92,  11,  0,   18,  30,  15,  21,  27,  41,  42,  43,  46,  45,  48,  49,  53,  54,  51,  52,
     56,  57,  59,  61,  63,  65,  67,  69,  0,   168, 257, 0,   0,   0,   0,   0,   319, 0,   300,
-    0,   281, 73,  86,  113, 263, 265, 0,   93,  13,  0,   0,   286, 288, 311, 310, 313, 287, 298,
-    302, 0,   0,   0,   0,   0,   71,  0,   312, 0,   0,   297, 295, 0,   0,   0,   282, 0,   0,
-    314, 0,   287, 299, 0,   284, 305, 283, 94,  0,   315, 309, 296, 303, 307};
+    0,   281, 73,  86,  113, 263, 265, 93,  0,   13,  0,   0,   286, 288, 311, 310, 313, 287, 298,
+    302, 0,   0,   0,   0,   94,  71,  0,   312, 0,   0,   297, 295, 0,   0,   0,   282, 0,   314,
+    0,   287, 299, 0,   284, 305, 283, 0,   315, 309, 296, 303, 307};
 
 /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] = {
-    -392, -51,  -392, -392, -392, -392, -392, -392, -45,  -392, -392, -392, -392, -89,  -392, -128,
-    -126, -182, -130, -63,  -60,  -64,  -57,  -59,  -56,  -392, -154, -165, -392, -174, -225, -392,
-    11,   14,   -392, -392, -392, 97,   108,  105,  -392, -392, -364, -392, -115, -392, -392, -118,
-    -392, -117, 252,  -392, -392, 24,   0,    -139, -392, -392, -392, -392, -149, -175, -16,  -97,
-    -261, -120, -252, -374, -156, -392, -392, -161, -391, -392, -392, -142, -50,  -116, -392, -392,
-    -392, -392, -392, -136, -392, -392, -392, -392, -392, -392, -392, -392, -392, 145,  -392, -392};
+    -393, -51,  -393, -393, -393, -393, -393, -393, -58,  -393, -393, -393, -393, 43,   -393, -141,
+    -140, -227, -144, -83,  -79,  -75,  -70,  -81,  -77,  -393, -151, -165, -393, -188, -179, -393,
+    14,   15,   -393, -393, -393, 87,   95,   92,   -393, -393, -372, -393, -115, -393, -393, -118,
+    -393, -117, 239,  -393, -393, 10,   0,    -143, -393, -393, -393, -393, -149, -175, -28,  -109,
+    -265, -139, -254, -374, -180, -393, -393, -185, -392, -393, -393, -142, -82,  -138, -393, -393,
+    -393, -393, -393, -162, -393, -393, -393, -393, -393, -393, -393, -393, -393, 122,  -393, -393};
 
 /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] = {
@@ -1152,233 +1152,224 @@
     217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 252, 253, 348, 254, 228, 159,
     255, 256, 117, 118, 119, 148, 149, 150, 120, 121, 122, 123, 124, 125, 126, 127,
     128, 129, 130, 131, 171, 172, 229, 163, 133, 134, 233, 167, 187, 188, 277, 278,
-    273, 258, 259, 260, 261, 336, 422, 443, 391, 392, 393, 444, 262, 263, 264, 430,
+    273, 258, 259, 260, 261, 336, 422, 442, 391, 392, 393, 443, 262, 263, 264, 430,
     265, 431, 266, 421, 267, 399, 325, 394, 415, 427, 428, 268, 135, 136, 137, 145};
 
 /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
    positive, shift that token.  If negative, reduce the rule whose
    number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_int16 yytable[] = {
-    132, 142, 152, 174, 151, 317, 160, 161, 227, 353, 352, 115, 280, 355,  116, 169, 272, 182, 232,
-    412, 332, 313, 360, 406, 283, 429, 143, 302, 303, 162, 152, 407, 151,  160, 152, 419, 181, 146,
-    153, 269, 271, 154, 186, 183, 185, 139, 140, 292, 449, 184, 186, 419,  185, 284, 285, 235, 314,
-    280, 162, 442, 361, 236, 304, 305, 442, 270, 147, 160, 275, 330, 186,  156, 185, 214, 286, 144,
-    227, 141, 287, 230, 230, 170, 289, 362, 319, 180, 274, 354, 290, 349,  416, 227, 417, 403, 446,
-    298, 349, 299, 349, 162, 349, 178, 179, 349, 168, 272, 350, 281, 282,  272, 358, 349, 364, 359,
-    396, 186, 186, 185, 185, 132, 376, 377, 378, 379, 132, 368, 294, 358,  155, 140, 404, 3,   4,
-    5,   173, 132, 230, 357, 166, 231, 388, 214, 139, 140, 280, 234, 115,  132, 352, 116, -30, 132,
-    288, 395, 300, 301, 214, 397, 309, 132, 295, 296, 297, 306, 307, 320,  321, 132, 349, 409, 372,
-    373, 310, 257, 374, 375, 380, 381, 311, 293, 450, 423, 308, 401, 402,  132, 312, 132, 315, 272,
-    323, 324, 326, 327, 328, 331, 333, -24, 334, 335, -29, -31, 186, -285, 185, 389, 369, 370, 371,
-    214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214,  214, 214, 418, 398, 408,
-    349, 410, 425, 434, 132, 132, 433, 435, 438, 437, 439, 445, 248, 418,  367, 441, 424, 382, 384,
-    451, 176, 383, 411, 436, 227, 386, 385, 175, 177, 387, 138, 356, 322,  405, 257, 447, 337, 338,
-    339, 340, 341, 342, 343, 344, 345, 346, 413, 440, 272, 448, 414, 426,  165, 0,   0,   347, 420,
-    0,   400, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,    0,   420, 0,   160, 161,
-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   214,  0,   132, 0,   0,   0,
-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   257,  0,   0,   0,   0,   0,
-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,    0,   0,   0,   0,   0,
-    0,   0,   0,   0,   0,   0,   0,   432, 0,   0,   0,   0,   0,   0,    0,   0,   0,   0,   0,
-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   257,  257, 0,   0,   0,   0,
-    257, 257, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,    0,   0,   257, 0,   0,
-    0,   0,   132, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,    0,   257, 0,   0,   0,
-    0,   257, 1,   2,   3,   4,   5,   6,   7,   8,   9,   10,  11,  12,   237, 238, 239, 0,   240,
-    241, 242, 243, 244, 245, 246, 13,  14,  15,  16,  17,  18,  19,  20,   21,  22,  23,  24,  25,
-    26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,   40,  41,  42,  43,  44,
-    45,  46,  47,  48,  49,  50,  51,  52,  53,  247, 54,  55,  56,  57,   58,  59,  60,  61,  62,
-    63,  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  0,   74,  75,   76,  77,  78,  79,  80,
-    81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,   95,  96,  97,  98,  99,
-    100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113,  189, 190, 114, 191, 192,
-    193, 194, 195, 0,   0,   196, 197, 0,   0,   0,   0,   0,   0,   0,    0,   0,   0,   0,   0,
-    0,   0,   0,   0,   0,   198, 0,   0,   0,   248, 249, 0,   0,   0,    0,   250, 200, 201, 202,
-    203, 1,   2,   3,   4,   5,   6,   7,   8,   9,   10,  11,  12,  237,  238, 239, 0,   240, 241,
-    242, 243, 244, 245, 246, 13,  14,  15,  16,  17,  18,  19,  20,  21,   22,  23,  24,  25,  26,
-    27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,   41,  42,  43,  44,  45,
-    46,  47,  48,  49,  50,  51,  52,  53,  247, 54,  55,  56,  57,  58,   59,  60,  61,  62,  63,
-    64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  0,   74,  75,  76,   77,  78,  79,  80,  81,
-    82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,   96,  97,  98,  99,  100,
-    101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 189,  190, 114, 191, 192, 193,
-    194, 195, 0,   0,   196, 197, 0,   0,   0,   0,   0,   0,   0,   0,    0,   0,   0,   0,   0,
-    0,   0,   0,   0,   198, 0,   0,   0,   248, 351, 0,   0,   0,   0,    250, 200, 201, 202, 203,
-    1,   2,   3,   4,   5,   6,   7,   8,   9,   10,  11,  12,  237, 238,  239, 0,   240, 241, 242,
-    243, 244, 245, 246, 13,  14,  15,  16,  17,  18,  19,  20,  21,  22,   23,  24,  25,  26,  27,
-    28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,   42,  43,  44,  45,  46,
-    47,  48,  49,  50,  51,  52,  53,  247, 54,  55,  56,  57,  58,  59,   60,  61,  62,  63,  64,
-    65,  66,  67,  68,  69,  70,  71,  72,  73,  0,   74,  75,  76,  77,   78,  79,  80,  81,  82,
-    83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,  96,   97,  98,  99,  100, 101,
-    102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 189, 190,  114, 191, 192, 193, 194,
-    195, 0,   0,   196, 197, 0,   0,   0,   0,   0,   0,   0,   0,   0,    0,   0,   0,   0,   0,
-    0,   0,   0,   198, 0,   0,   0,   248, 0,   0,   0,   0,   0,   250,  200, 201, 202, 203, 1,
-    2,   3,   4,   5,   6,   7,   8,   9,   10,  11,  12,  237, 238, 239,  0,   240, 241, 242, 243,
-    244, 245, 246, 13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23,   24,  25,  26,  27,  28,
-    29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,   43,  44,  45,  46,  47,
-    48,  49,  50,  51,  52,  53,  247, 54,  55,  56,  57,  58,  59,  60,   61,  62,  63,  64,  65,
-    66,  67,  68,  69,  70,  71,  72,  73,  0,   74,  75,  76,  77,  78,   79,  80,  81,  82,  83,
-    84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,  96,  97,   98,  99,  100, 101, 102,
-    103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 189, 190, 114,  191, 192, 193, 194, 195,
-    0,   0,   196, 197, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,    0,   0,   0,   0,   0,
-    0,   0,   198, 0,   0,   0,   173, 0,   0,   0,   0,   0,   250, 200,  201, 202, 203, 1,   2,
-    3,   4,   5,   6,   7,   8,   9,   10,  11,  12,  237, 238, 239, 0,    240, 241, 242, 243, 244,
-    245, 246, 13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,   25,  26,  27,  28,  29,
-    30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,   44,  45,  46,  47,  48,
-    49,  50,  51,  52,  53,  247, 54,  55,  56,  57,  58,  59,  60,  61,   62,  63,  64,  65,  66,
-    67,  68,  69,  70,  71,  72,  73,  0,   74,  75,  76,  77,  78,  79,   80,  81,  82,  83,  84,
-    85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,  96,  97,  98,   99,  100, 101, 102, 103,
-    104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 189, 190, 114, 191,  192, 193, 194, 195, 0,
-    0,   196, 197, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,    0,   0,   0,   0,   0,
-    0,   198, 0,   0,   0,   0,   0,   0,   0,   0,   0,   250, 200, 201,  202, 203, 1,   2,   3,
-    4,   5,   6,   7,   8,   9,   10,  11,  12,  0,   0,   0,   0,   0,    0,   0,   0,   0,   0,
-    0,   13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,   26,  27,  28,  29,  30,
-    31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,   45,  46,  47,  48,  49,
-    50,  51,  52,  53,  0,   54,  55,  56,  57,  58,  59,  60,  61,  62,   63,  64,  65,  66,  67,
-    68,  69,  70,  71,  72,  73,  0,   74,  75,  76,  77,  78,  79,  80,   81,  82,  83,  84,  85,
-    86,  87,  88,  89,  90,  91,  92,  93,  94,  95,  96,  97,  98,  99,   100, 101, 102, 103, 104,
-    105, 106, 107, 108, 109, 110, 111, 112, 113, 189, 190, 114, 191, 192,  193, 194, 195, 0,   0,
-    196, 197, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,    1,   2,   3,   4,   5,
-    198, 7,   8,   9,   10,  11,  12,  0,   0,   0,   250, 200, 201, 202,  203, 0,   0,   0,   13,
-    14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,   28,  29,  30,  31,  32,
-    33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,   47,  48,  49,  50,  51,
-    52,  53,  0,   54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,   65,  66,  67,  68,  69,
-    70,  71,  72,  73,  0,   74,  75,  76,  77,  78,  79,  80,  81,  82,   83,  84,  85,  86,  87,
-    88,  89,  90,  91,  92,  93,  94,  95,  96,  97,  98,  99,  100, 101,  102, 103, 104, 105, 106,
-    107, 108, 109, 110, 111, 112, 113, 189, 190, 114, 191, 192, 193, 194,  195, 0,   0,   196, 197,
-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   2,    3,   4,   5,   198, 7,
-    8,   9,   10,  11,  12,  0,   0,   0,   0,   200, 201, 202, 203, 0,    0,   0,   13,  14,  15,
-    16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,   30,  31,  32,  33,  34,
-    35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,  48,   49,  50,  51,  52,  53,
-    0,   54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,  66,   67,  68,  69,  70,  71,
-    72,  73,  0,   74,  75,  76,  77,  78,  79,  80,  81,  82,  83,  84,   85,  86,  87,  88,  89,
-    90,  91,  92,  93,  94,  95,  96,  97,  98,  99,  100, 101, 102, 103,  104, 105, 106, 107, 108,
-    109, 110, 111, 112, 113, 0,   157, 114, 0,   9,   10,  11,  12,  0,    0,   0,   0,   0,   0,
-    0,   0,   0,   0,   0,   13,  14,  15,  16,  17,  18,  19,  20,  21,   22,  23,  24,  25,  26,
-    27,  0,   0,   0,   0,   0,   158, 34,  35,  36,  37,  38,  39,  0,    0,   0,   0,   0,   0,
-    0,   0,   0,   0,   0,   0,   52,  53,  0,   54,  55,  56,  57,  58,   59,  60,  61,  62,  63,
-    64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  0,   74,  75,  76,   77,  78,  79,  80,  81,
-    82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,   96,  97,  98,  99,  100,
-    101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 0,   113, 189,  190, 114, 191, 192, 193,
-    194, 195, 0,   0,   196, 197, 0,   0,   0,   0,   0,   0,   0,   0,    0,   0,   0,   0,   0,
-    0,   0,   0,   0,   198, 0,   0,   199, 9,   10,  11,  12,  0,   0,    0,   200, 201, 202, 203,
-    0,   0,   0,   0,   13,  14,  15,  16,  17,  18,  19,  20,  21,  22,   23,  24,  25,  26,  27,
-    0,   0,   0,   0,   0,   0,   34,  35,  36,  37,  38,  39,  0,   0,    0,   0,   0,   0,   0,
-    0,   0,   0,   0,   0,   52,  53,  0,   54,  55,  56,  57,  58,  59,   60,  61,  62,  63,  64,
-    65,  66,  67,  68,  69,  70,  71,  72,  73,  0,   74,  75,  76,  77,   78,  79,  80,  81,  82,
-    83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,  96,   97,  98,  99,  100, 101,
-    102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 0,   113, 189, 190,  114, 191, 192, 193, 194,
-    195, 0,   0,   196, 197, 0,   0,   0,   0,   0,   0,   0,   0,   0,    0,   0,   0,   0,   0,
-    0,   0,   0,   198, 0,   0,   316, 9,   10,  11,  12,  0,   0,   0,    200, 201, 202, 203, 0,
-    0,   0,   0,   13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23,   24,  25,  26,  27,  0,
-    0,   0,   0,   0,   0,   34,  35,  36,  37,  38,  39,  0,   0,   0,    0,   0,   0,   0,   0,
-    0,   0,   0,   0,   52,  53,  0,   54,  55,  56,  57,  58,  59,  60,   61,  62,  63,  64,  65,
-    66,  67,  68,  69,  70,  71,  72,  73,  0,   74,  75,  76,  77,  78,   79,  80,  81,  82,  83,
-    84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,  96,  97,   98,  99,  100, 101, 102,
-    103, 104, 105, 106, 107, 108, 109, 110, 111, 0,   113, 189, 190, 114,  191, 192, 193, 194, 195,
-    0,   0,   196, 197, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,    0,   0,   0,   0,   0,
-    0,   0,   198, 9,   10,  11,  12,  0,   0,   0,   0,   0,   329, 200,  201, 202, 203, 0,   13,
-    14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,   0,   0,   0,   0,   0,
-    0,   34,  35,  36,  37,  38,  39,  0,   0,   0,   0,   0,   0,   0,    0,   0,   0,   0,   0,
-    52,  53,  0,   54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,   65,  66,  67,  68,  69,
-    70,  71,  72,  73,  0,   74,  75,  76,  77,  78,  79,  80,  81,  82,   83,  84,  85,  86,  87,
-    88,  89,  90,  91,  92,  93,  94,  95,  96,  97,  98,  99,  100, 101,  102, 103, 104, 105, 106,
-    107, 108, 109, 110, 111, 0,   113, 189, 190, 114, 191, 192, 193, 194,  195, 0,   0,   196, 197,
-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,    0,   0,   0,   198, 9,
-    10,  11,  12,  0,   0,   0,   0,   0,   0,   200, 201, 202, 203, 0,    13,  14,  15,  16,  17,
-    18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  0,   0,   0,   0,    0,   0,   34,  35,  36,
-    37,  38,  39,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,    0,   52,  291, 0,   54,
-    55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,  66,  67,  68,   69,  70,  71,  72,  73,
-    0,   74,  75,  76,  77,  78,  79,  80,  81,  82,  83,  84,  85,  86,   87,  88,  89,  90,  91,
-    92,  93,  94,  95,  96,  97,  98,  99,  100, 101, 102, 103, 104, 105,  106, 107, 108, 109, 110,
-    111, 0,   113, 189, 190, 114, 191, 192, 193, 194, 195, 0,   0,   196,  197, 0,   0,   0,   0,
-    0,   0,   0,   0,   0,   0,   0,   0,   1,   2,   3,   4,   5,   198,  7,   8,   9,   10,  11,
-    12,  0,   0,   0,   0,   200, 201, 202, 203, 0,   0,   0,   13,  14,   15,  16,  17,  18,  19,
-    20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,  32,  33,   34,  35,  36,  37,  38,
-    39,  40,  41,  42,  43,  44,  45,  46,  47,  48,  49,  50,  51,  52,   53,  0,   54,  55,  56,
-    57,  58,  59,  60,  61,  62,  63,  64,  65,  66,  67,  68,  69,  70,   71,  72,  73,  0,   74,
-    75,  76,  77,  78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  88,   89,  90,  91,  92,  93,
-    94,  95,  96,  97,  98,  99,  100, 101, 102, 103, 104, 105, 106, 107,  108, 109, 110, 111, 112,
-    113, 0,   0,   114, 0,   0,   0,   0,   0,   0,   0,   0,   0,   1,    2,   3,   4,   5,   0,
-    7,   8,   9,   10,  11,  12,  0,   0,   0,   0,   0,   0,   0,   0,    0,   0,   279, 13,  14,
-    15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,   29,  30,  31,  32,  33,
-    34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,   48,  49,  50,  51,  52,
-    53,  0,   54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,   66,  67,  68,  69,  70,
-    71,  72,  73,  0,   74,  75,  76,  77,  78,  79,  80,  81,  82,  83,   84,  85,  86,  87,  88,
-    89,  90,  91,  92,  93,  94,  95,  96,  97,  98,  99,  100, 101, 102,  103, 104, 105, 106, 107,
-    108, 109, 110, 111, 112, 113, 0,   0,   114, 0,   0,   0,   0,   0,    0,   0,   0,   0,   1,
-    2,   3,   4,   5,   0,   7,   8,   9,   10,  11,  12,  0,   0,   0,    0,   0,   0,   0,   0,
-    0,   0,   318, 13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23,   24,  25,  26,  27,  28,
-    29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,   43,  44,  45,  46,  47,
-    48,  49,  50,  51,  52,  53,  0,   54,  55,  56,  57,  58,  59,  60,   61,  62,  63,  64,  65,
-    66,  67,  68,  69,  70,  71,  72,  73,  0,   74,  75,  76,  77,  78,   79,  80,  81,  82,  83,
-    84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,  96,  97,   98,  99,  100, 101, 102,
-    103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 0,   0,   114,  0,   0,   0,   0,   0,
-    0,   164, 0,   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,   10,   11,  12,  0,   0,   0,
-    0,   0,   0,   0,   0,   0,   0,   390, 13,  14,  15,  16,  17,  18,   19,  20,  21,  22,  23,
-    24,  25,  26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,   38,  39,  40,  41,  42,
-    43,  44,  45,  46,  47,  48,  49,  50,  51,  52,  53,  0,   54,  55,   56,  57,  58,  59,  60,
-    61,  62,  63,  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  0,    74,  75,  76,  77,  78,
-    79,  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,   93,  94,  95,  96,  97,
-    98,  99,  100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,  112, 113, 0,   0,   114,
-    1,   2,   3,   4,   5,   6,   7,   8,   9,   10,  11,  12,  0,   0,    0,   0,   0,   0,   0,
-    0,   0,   0,   0,   13,  14,  15,  16,  17,  18,  19,  20,  21,  22,   23,  24,  25,  26,  27,
-    28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,   42,  43,  44,  45,  46,
-    47,  48,  49,  50,  51,  52,  53,  0,   54,  55,  56,  57,  58,  59,   60,  61,  62,  63,  64,
-    65,  66,  67,  68,  69,  70,  71,  72,  73,  0,   74,  75,  76,  77,   78,  79,  80,  81,  82,
-    83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,  96,   97,  98,  99,  100, 101,
-    102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 0,   0,    114, 1,   2,   3,   4,
-    5,   0,   7,   8,   9,   10,  11,  12,  0,   0,   0,   0,   0,   0,    0,   0,   0,   0,   0,
-    13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,   27,  28,  29,  30,  31,
-    32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,   46,  47,  48,  49,  50,
-    51,  52,  53,  0,   54,  55,  56,  57,  58,  59,  60,  61,  62,  63,   64,  65,  66,  67,  68,
-    69,  70,  71,  72,  73,  0,   74,  75,  76,  77,  78,  79,  80,  81,   82,  83,  84,  85,  86,
-    87,  88,  89,  90,  91,  92,  93,  94,  95,  96,  97,  98,  99,  100,  101, 102, 103, 104, 105,
-    106, 107, 108, 109, 110, 111, 112, 113, 0,   0,   114, 9,   10,  11,   12,  0,   0,   0,   0,
-    0,   0,   0,   0,   0,   0,   0,   13,  14,  15,  16,  17,  18,  19,   20,  21,  22,  23,  24,
-    25,  26,  27,  0,   0,   0,   0,   0,   0,   34,  35,  36,  37,  38,   39,  0,   0,   0,   0,
-    0,   0,   0,   0,   0,   0,   0,   0,   52,  53,  0,   54,  55,  56,   57,  58,  59,  60,  61,
-    62,  63,  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  0,   74,   75,  76,  77,  78,  79,
-    80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,   94,  95,  96,  97,  98,
-    99,  100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 0,    113, 0,   365, 114, 9,
-    10,  11,  12,  366, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,    13,  14,  15,  16,  17,
-    18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  0,   0,   0,   0,    0,   0,   34,  35,  36,
-    37,  38,  39,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,    0,   52,  53,  0,   54,
-    55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,  66,  67,  68,   69,  70,  71,  72,  73,
-    0,   74,  75,  76,  77,  78,  79,  80,  81,  82,  83,  84,  85,  86,   87,  88,  89,  90,  91,
-    92,  93,  94,  95,  96,  97,  98,  99,  100, 101, 102, 103, 104, 105,  106, 107, 108, 109, 110,
-    111, 0,   113, 0,   0,   114};
+    132, 142, 152, 174, 151, 353,  160, 161, 352, 355, 283, 227, 280, 182, 115, 116, 272, 169, 232,
+    412, 360, 313, 139, 140, 429,  302, 303, 419, 284, 285, 152, 162, 151, 160, 152, 269, 271, 230,
+    298, 406, 299, 162, 186, 419,  185, 423, 447, 292, 181, 286, 186, 317, 185, 287, 141, 330, 314,
+    280, 361, 441, 304, 305, 162,  441, 155, 140, 332, 160, 275, 270, 186, 156, 185, 230, 230, 376,
+    377, 378, 379, 227, 274, 354,  183, 170, 319, 235, 289, 362, 184, 403, 416, 236, 290, 349, 227,
+    143, 349, 417, 364, 146, 444,  178, 179, 349, 153, 272, 349, 154, 349, 272, 358, 350, 144, 359,
+    162, 186, 186, 185, 185, 132,  349, 139, 140, 396, 132, 368, 388, 358, 306, 307, 404, 300, 301,
+    357, 147, 132, 320, 321, 166,  395, 3,   4,   5,   397, 280, 168, 352, 132, 173, 115, 116, 132,
+    295, 296, 297, 349, 409, 372,  373, 132, 374, 375, 380, 381, 180, 230, 231, 132, 234, -30, 311,
+    288, 308, 257, 293, 448, 309,  310, 312, 315, 326, 323, 327, 401, 402, 132, 331, 132, 324, 272,
+    337, 338, 339, 340, 341, 342,  343, 344, 345, 346, 328, 333, 186, 334, 185, 214, -29, 335, -24,
+    347, 410, 418, 389, 398, -285, 408, -31, 407, 349, 425, 434, 433, 437, 436, 438, 382, 248, 418,
+    449, 367, 383, 386, 132, 132,  440, 384, 387, 435, 176, 281, 282, 385, 175, 177, 424, 138, 322,
+    356, 445, 405, 411, 439, 446,  426, 400, 413, 414, 165, 294, 0,   0,   0,   257, 0,   0,   0,
+    0,   0,   0,   0,   0,   0,    0,   214, 0,   272, 0,   0,   0,   0,   0,   0,   0,   0,   420,
+    0,   0,   0,   214, 0,   0,    0,   0,   0,   0,   0,   0,   0,   0,   0,   420, 0,   160, 161,
+    0,   0,   0,   0,   0,   0,    0,   0,   0,   0,   0,   0,   0,   0,   0,   132, 0,   0,   0,
+    0,   0,   0,   0,   0,   0,    0,   0,   0,   0,   0,   0,   0,   257, 0,   369, 370, 371, 214,
+    214, 214, 214, 214, 214, 214,  214, 214, 214, 214, 214, 214, 214, 214, 214, 0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,    0,   432, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,    0,   0,   0,   0,   0,   0,   0,   257, 257, 0,   0,   0,   0,
+    257, 257, 0,   0,   0,   0,    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   257, 0,   0,
+    0,   0,   132, 0,   0,   0,    0,   0,   0,   0,   0,   0,   0,   0,   0,   257, 0,   0,   0,
+    257, 1,   2,   3,   4,   5,    6,   7,   8,   9,   10,  11,  12,  237, 238, 239, 0,   240, 241,
+    242, 243, 244, 245, 246, 13,   14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,
+    27,  28,  29,  30,  31,  32,   33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,
+    46,  47,  48,  49,  50,  51,   52,  53,  247, 54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
+    64,  65,  66,  67,  68,  69,   70,  71,  72,  73,  0,   74,  75,  76,  77,  78,  79,  80,  81,
+    82,  83,  84,  85,  86,  87,   88,  89,  90,  91,  92,  93,  94,  95,  96,  97,  98,  99,  100,
+    101, 102, 103, 104, 105, 106,  107, 108, 109, 110, 111, 112, 113, 189, 190, 114, 191, 192, 193,
+    194, 195, 0,   0,   196, 197,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   198, 0,    0,   0,   248, 249, 0,   0,   0,   0,   250, 200, 201, 202, 203,
+    1,   2,   3,   4,   5,   6,    7,   8,   9,   10,  11,  12,  237, 238, 239, 0,   240, 241, 242,
+    243, 244, 245, 246, 13,  14,   15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,
+    28,  29,  30,  31,  32,  33,   34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,
+    47,  48,  49,  50,  51,  52,   53,  247, 54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,
+    65,  66,  67,  68,  69,  70,   71,  72,  73,  0,   74,  75,  76,  77,  78,  79,  80,  81,  82,
+    83,  84,  85,  86,  87,  88,   89,  90,  91,  92,  93,  94,  95,  96,  97,  98,  99,  100, 101,
+    102, 103, 104, 105, 106, 107,  108, 109, 110, 111, 112, 113, 189, 190, 114, 191, 192, 193, 194,
+    195, 0,   0,   196, 197, 0,    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   198, 0,   0,    0,   248, 351, 0,   0,   0,   0,   250, 200, 201, 202, 203, 1,
+    2,   3,   4,   5,   6,   7,    8,   9,   10,  11,  12,  237, 238, 239, 0,   240, 241, 242, 243,
+    244, 245, 246, 13,  14,  15,   16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,
+    29,  30,  31,  32,  33,  34,   35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
+    48,  49,  50,  51,  52,  53,   247, 54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,
+    66,  67,  68,  69,  70,  71,   72,  73,  0,   74,  75,  76,  77,  78,  79,  80,  81,  82,  83,
+    84,  85,  86,  87,  88,  89,   90,  91,  92,  93,  94,  95,  96,  97,  98,  99,  100, 101, 102,
+    103, 104, 105, 106, 107, 108,  109, 110, 111, 112, 113, 189, 190, 114, 191, 192, 193, 194, 195,
+    0,   0,   196, 197, 0,   0,    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   198, 0,   0,   0,    248, 0,   0,   0,   0,   0,   250, 200, 201, 202, 203, 1,   2,
+    3,   4,   5,   6,   7,   8,    9,   10,  11,  12,  237, 238, 239, 0,   240, 241, 242, 243, 244,
+    245, 246, 13,  14,  15,  16,   17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,
+    30,  31,  32,  33,  34,  35,   36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,  48,
+    49,  50,  51,  52,  53,  247,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,  66,
+    67,  68,  69,  70,  71,  72,   73,  0,   74,  75,  76,  77,  78,  79,  80,  81,  82,  83,  84,
+    85,  86,  87,  88,  89,  90,   91,  92,  93,  94,  95,  96,  97,  98,  99,  100, 101, 102, 103,
+    104, 105, 106, 107, 108, 109,  110, 111, 112, 113, 189, 190, 114, 191, 192, 193, 194, 195, 0,
+    0,   196, 197, 0,   0,   0,    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   198, 0,   0,   0,   173,  0,   0,   0,   0,   0,   250, 200, 201, 202, 203, 1,   2,   3,
+    4,   5,   6,   7,   8,   9,    10,  11,  12,  237, 238, 239, 0,   240, 241, 242, 243, 244, 245,
+    246, 13,  14,  15,  16,  17,   18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,
+    31,  32,  33,  34,  35,  36,   37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,  48,  49,
+    50,  51,  52,  53,  247, 54,   55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,  66,  67,
+    68,  69,  70,  71,  72,  73,   0,   74,  75,  76,  77,  78,  79,  80,  81,  82,  83,  84,  85,
+    86,  87,  88,  89,  90,  91,   92,  93,  94,  95,  96,  97,  98,  99,  100, 101, 102, 103, 104,
+    105, 106, 107, 108, 109, 110,  111, 112, 113, 189, 190, 114, 191, 192, 193, 194, 195, 0,   0,
+    196, 197, 0,   0,   0,   0,    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    198, 0,   0,   0,   0,   0,    0,   0,   0,   0,   250, 200, 201, 202, 203, 1,   2,   3,   4,
+    5,   6,   7,   8,   9,   10,   11,  12,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    13,  14,  15,  16,  17,  18,   19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
+    32,  33,  34,  35,  36,  37,   38,  39,  40,  41,  42,  43,  44,  45,  46,  47,  48,  49,  50,
+    51,  52,  53,  0,   54,  55,   56,  57,  58,  59,  60,  61,  62,  63,  64,  65,  66,  67,  68,
+    69,  70,  71,  72,  73,  0,    74,  75,  76,  77,  78,  79,  80,  81,  82,  83,  84,  85,  86,
+    87,  88,  89,  90,  91,  92,   93,  94,  95,  96,  97,  98,  99,  100, 101, 102, 103, 104, 105,
+    106, 107, 108, 109, 110, 111,  112, 113, 189, 190, 114, 191, 192, 193, 194, 195, 0,   0,   196,
+    197, 0,   0,   0,   0,   0,    0,   0,   0,   0,   0,   0,   0,   1,   2,   3,   4,   5,   198,
+    7,   8,   9,   10,  11,  12,   0,   0,   0,   250, 200, 201, 202, 203, 0,   0,   0,   13,  14,
+    15,  16,  17,  18,  19,  20,   21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,  32,  33,
+    34,  35,  36,  37,  38,  39,   40,  41,  42,  43,  44,  45,  46,  47,  48,  49,  50,  51,  52,
+    53,  0,   54,  55,  56,  57,   58,  59,  60,  61,  62,  63,  64,  65,  66,  67,  68,  69,  70,
+    71,  72,  73,  0,   74,  75,   76,  77,  78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  88,
+    89,  90,  91,  92,  93,  94,   95,  96,  97,  98,  99,  100, 101, 102, 103, 104, 105, 106, 107,
+    108, 109, 110, 111, 112, 113,  189, 190, 114, 191, 192, 193, 194, 195, 0,   0,   196, 197, 0,
+    0,   0,   0,   0,   0,   0,    0,   0,   0,   0,   0,   1,   2,   3,   4,   5,   198, 7,   8,
+    9,   10,  11,  12,  0,   0,    0,   0,   200, 201, 202, 203, 0,   0,   0,   13,  14,  15,  16,
+    17,  18,  19,  20,  21,  22,   23,  24,  25,  26,  27,  28,  29,  30,  31,  32,  33,  34,  35,
+    36,  37,  38,  39,  40,  41,   42,  43,  44,  45,  46,  47,  48,  49,  50,  51,  52,  53,  0,
+    54,  55,  56,  57,  58,  59,   60,  61,  62,  63,  64,  65,  66,  67,  68,  69,  70,  71,  72,
+    73,  0,   74,  75,  76,  77,   78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,
+    91,  92,  93,  94,  95,  96,   97,  98,  99,  100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
+    110, 111, 112, 113, 0,   157,  114, 0,   9,   10,  11,  12,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   13,  14,   15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,
+    0,   0,   0,   0,   0,   158,  34,  35,  36,  37,  38,  39,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   52,   53,  0,   54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,
+    65,  66,  67,  68,  69,  70,   71,  72,  73,  0,   74,  75,  76,  77,  78,  79,  80,  81,  82,
+    83,  84,  85,  86,  87,  88,   89,  90,  91,  92,  93,  94,  95,  96,  97,  98,  99,  100, 101,
+    102, 103, 104, 105, 106, 107,  108, 109, 110, 111, 0,   113, 189, 190, 114, 191, 192, 193, 194,
+    195, 0,   0,   196, 197, 0,    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   198, 0,   0,    199, 9,   10,  11,  12,  0,   0,   0,   200, 201, 202, 203, 0,
+    0,   0,   0,   13,  14,  15,   16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  0,
+    0,   0,   0,   0,   0,   34,   35,  36,  37,  38,  39,  0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   52,  53,   0,   54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,
+    66,  67,  68,  69,  70,  71,   72,  73,  0,   74,  75,  76,  77,  78,  79,  80,  81,  82,  83,
+    84,  85,  86,  87,  88,  89,   90,  91,  92,  93,  94,  95,  96,  97,  98,  99,  100, 101, 102,
+    103, 104, 105, 106, 107, 108,  109, 110, 111, 0,   113, 189, 190, 114, 191, 192, 193, 194, 195,
+    0,   0,   196, 197, 0,   0,    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   198, 0,   0,   316,  9,   10,  11,  12,  0,   0,   0,   200, 201, 202, 203, 0,   0,
+    0,   0,   13,  14,  15,  16,   17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  0,   0,
+    0,   0,   0,   0,   34,  35,   36,  37,  38,  39,  0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   52,  53,  0,    54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,  66,
+    67,  68,  69,  70,  71,  72,   73,  0,   74,  75,  76,  77,  78,  79,  80,  81,  82,  83,  84,
+    85,  86,  87,  88,  89,  90,   91,  92,  93,  94,  95,  96,  97,  98,  99,  100, 101, 102, 103,
+    104, 105, 106, 107, 108, 109,  110, 111, 0,   113, 189, 190, 114, 191, 192, 193, 194, 195, 0,
+    0,   196, 197, 0,   0,   0,    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   198, 9,   10,  11,  12,   0,   0,   0,   0,   0,   329, 200, 201, 202, 203, 0,   13,  14,
+    15,  16,  17,  18,  19,  20,   21,  22,  23,  24,  25,  26,  27,  0,   0,   0,   0,   0,   0,
+    34,  35,  36,  37,  38,  39,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   52,
+    53,  0,   54,  55,  56,  57,   58,  59,  60,  61,  62,  63,  64,  65,  66,  67,  68,  69,  70,
+    71,  72,  73,  0,   74,  75,   76,  77,  78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  88,
+    89,  90,  91,  92,  93,  94,   95,  96,  97,  98,  99,  100, 101, 102, 103, 104, 105, 106, 107,
+    108, 109, 110, 111, 0,   113,  189, 190, 114, 191, 192, 193, 194, 195, 0,   0,   196, 197, 0,
+    0,   0,   0,   0,   0,   0,    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   198, 9,   10,
+    11,  12,  0,   0,   0,   0,    0,   0,   200, 201, 202, 203, 0,   13,  14,  15,  16,  17,  18,
+    19,  20,  21,  22,  23,  24,   25,  26,  27,  0,   0,   0,   0,   0,   0,   34,  35,  36,  37,
+    38,  39,  0,   0,   0,   0,    0,   0,   0,   0,   0,   0,   0,   0,   52,  291, 0,   54,  55,
+    56,  57,  58,  59,  60,  61,   62,  63,  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  0,
+    74,  75,  76,  77,  78,  79,   80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,
+    93,  94,  95,  96,  97,  98,   99,  100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
+    0,   113, 189, 190, 114, 191,  192, 193, 194, 195, 0,   0,   196, 197, 0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,    0,   1,   2,   3,   4,   5,   198, 7,   8,   9,   10,  11,  12,
+    0,   0,   0,   0,   200, 201,  202, 203, 0,   0,   0,   13,  14,  15,  16,  17,  18,  19,  20,
+    21,  22,  23,  24,  25,  26,   27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,
+    40,  41,  42,  43,  44,  45,   46,  47,  48,  49,  50,  51,  52,  53,  0,   54,  55,  56,  57,
+    58,  59,  60,  61,  62,  63,   64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  0,   74,  75,
+    76,  77,  78,  79,  80,  81,   82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,
+    95,  96,  97,  98,  99,  100,  101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113,
+    0,   0,   114, 0,   0,   0,    0,   0,   0,   0,   0,   0,   1,   2,   3,   4,   5,   0,   7,
+    8,   9,   10,  11,  12,  0,    0,   0,   0,   0,   0,   0,   0,   0,   0,   279, 13,  14,  15,
+    16,  17,  18,  19,  20,  21,   22,  23,  24,  25,  26,  27,  28,  29,  30,  31,  32,  33,  34,
+    35,  36,  37,  38,  39,  40,   41,  42,  43,  44,  45,  46,  47,  48,  49,  50,  51,  52,  53,
+    0,   54,  55,  56,  57,  58,   59,  60,  61,  62,  63,  64,  65,  66,  67,  68,  69,  70,  71,
+    72,  73,  0,   74,  75,  76,   77,  78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,
+    90,  91,  92,  93,  94,  95,   96,  97,  98,  99,  100, 101, 102, 103, 104, 105, 106, 107, 108,
+    109, 110, 111, 112, 113, 0,    0,   114, 0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   2,
+    3,   4,   5,   0,   7,   8,    9,   10,  11,  12,  0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   318, 13,  14,  15,  16,   17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,
+    30,  31,  32,  33,  34,  35,   36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,  48,
+    49,  50,  51,  52,  53,  0,    54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,  66,
+    67,  68,  69,  70,  71,  72,   73,  0,   74,  75,  76,  77,  78,  79,  80,  81,  82,  83,  84,
+    85,  86,  87,  88,  89,  90,   91,  92,  93,  94,  95,  96,  97,  98,  99,  100, 101, 102, 103,
+    104, 105, 106, 107, 108, 109,  110, 111, 112, 113, 0,   0,   114, 0,   0,   0,   0,   0,   0,
+    164, 0,   0,   1,   2,   3,    4,   5,   6,   7,   8,   9,   10,  11,  12,  0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,    390, 13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,
+    25,  26,  27,  28,  29,  30,   31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,
+    44,  45,  46,  47,  48,  49,   50,  51,  52,  53,  0,   54,  55,  56,  57,  58,  59,  60,  61,
+    62,  63,  64,  65,  66,  67,   68,  69,  70,  71,  72,  73,  0,   74,  75,  76,  77,  78,  79,
+    80,  81,  82,  83,  84,  85,   86,  87,  88,  89,  90,  91,  92,  93,  94,  95,  96,  97,  98,
+    99,  100, 101, 102, 103, 104,  105, 106, 107, 108, 109, 110, 111, 112, 113, 0,   0,   114, 1,
+    2,   3,   4,   5,   6,   7,    8,   9,   10,  11,  12,  0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   13,  14,  15,   16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,
+    29,  30,  31,  32,  33,  34,   35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
+    48,  49,  50,  51,  52,  53,   0,   54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,
+    66,  67,  68,  69,  70,  71,   72,  73,  0,   74,  75,  76,  77,  78,  79,  80,  81,  82,  83,
+    84,  85,  86,  87,  88,  89,   90,  91,  92,  93,  94,  95,  96,  97,  98,  99,  100, 101, 102,
+    103, 104, 105, 106, 107, 108,  109, 110, 111, 112, 113, 0,   0,   114, 1,   2,   3,   4,   5,
+    0,   7,   8,   9,   10,  11,   12,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   13,
+    14,  15,  16,  17,  18,  19,   20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,  32,
+    33,  34,  35,  36,  37,  38,   39,  40,  41,  42,  43,  44,  45,  46,  47,  48,  49,  50,  51,
+    52,  53,  0,   54,  55,  56,   57,  58,  59,  60,  61,  62,  63,  64,  65,  66,  67,  68,  69,
+    70,  71,  72,  73,  0,   74,   75,  76,  77,  78,  79,  80,  81,  82,  83,  84,  85,  86,  87,
+    88,  89,  90,  91,  92,  93,   94,  95,  96,  97,  98,  99,  100, 101, 102, 103, 104, 105, 106,
+    107, 108, 109, 110, 111, 112,  113, 0,   0,   114, 9,   10,  11,  12,  0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,    13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,
+    26,  27,  0,   0,   0,   0,    0,   0,   34,  35,  36,  37,  38,  39,  0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,    0,   52,  53,  0,   54,  55,  56,  57,  58,  59,  60,  61,  62,
+    63,  64,  65,  66,  67,  68,   69,  70,  71,  72,  73,  0,   74,  75,  76,  77,  78,  79,  80,
+    81,  82,  83,  84,  85,  86,   87,  88,  89,  90,  91,  92,  93,  94,  95,  96,  97,  98,  99,
+    100, 101, 102, 103, 104, 105,  106, 107, 108, 109, 110, 111, 0,   113, 0,   365, 114, 9,   10,
+    11,  12,  366, 0,   0,   0,    0,   0,   0,   0,   0,   0,   0,   13,  14,  15,  16,  17,  18,
+    19,  20,  21,  22,  23,  24,   25,  26,  27,  0,   0,   0,   0,   0,   0,   34,  35,  36,  37,
+    38,  39,  0,   0,   0,   0,    0,   0,   0,   0,   0,   0,   0,   0,   52,  53,  0,   54,  55,
+    56,  57,  58,  59,  60,  61,   62,  63,  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  0,
+    74,  75,  76,  77,  78,  79,   80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,
+    93,  94,  95,  96,  97,  98,   99,  100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
+    0,   113, 0,   0,   114};
 
 static const yytype_int16 yycheck[] = {
-    0,   52,  119, 145, 119, 230, 124, 124, 162, 270, 262, 0,   187, 274, 0,   64,  181, 156, 167,
-    393, 245, 146, 130, 160, 198, 416, 158, 141, 142, 160, 147, 168, 147, 151, 151, 399, 167, 159,
-    165, 178, 179, 168, 159, 162, 159, 130, 131, 212, 439, 168, 167, 415, 167, 139, 140, 159, 181,
-    232, 160, 433, 168, 165, 176, 177, 438, 167, 165, 185, 185, 243, 187, 122, 187, 162, 160, 168,
-    230, 162, 164, 160, 160, 130, 159, 159, 233, 158, 167, 167, 165, 165, 159, 245, 159, 354, 159,
-    170, 165, 172, 165, 160, 165, 152, 153, 165, 162, 270, 168, 196, 197, 274, 165, 165, 286, 168,
-    168, 232, 233, 232, 233, 119, 302, 303, 304, 305, 124, 290, 215, 165, 130, 131, 168, 5,   6,
-    7,   162, 135, 160, 276, 138, 168, 314, 230, 130, 131, 319, 167, 135, 147, 400, 135, 158, 151,
-    159, 327, 137, 138, 245, 331, 179, 159, 173, 174, 175, 143, 144, 133, 134, 167, 165, 166, 298,
-    299, 178, 173, 300, 301, 306, 307, 145, 158, 441, 406, 180, 348, 349, 185, 147, 187, 161, 354,
-    168, 168, 158, 158, 168, 158, 166, 159, 158, 163, 158, 158, 319, 162, 319, 161, 295, 296, 297,
-    298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 399, 166, 161,
-    165, 67,  158, 163, 232, 233, 159, 161, 159, 168, 18,  168, 162, 415, 287, 167, 409, 308, 310,
-    168, 151, 309, 392, 425, 406, 312, 311, 147, 151, 313, 6,   275, 236, 358, 262, 437, 148, 149,
-    150, 151, 152, 153, 154, 155, 156, 157, 394, 431, 441, 438, 394, 415, 135, -1,  -1,  167, 399,
-    -1,  336, -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  415, -1,  420, 420,
-    -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  406, -1,  319, -1,  -1,  -1,
-    -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  336, -1,  -1,  -1,  -1,  -1,
-    -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+    0,   52,  119, 145, 119, 270, 124, 124, 262, 274, 198, 162, 187, 156, 0,   0,   181, 64,  167,
+    393, 130, 146, 130, 131, 416, 141, 142, 399, 139, 140, 147, 160, 147, 151, 151, 178, 179, 160,
+    170, 168, 172, 160, 159, 415, 159, 168, 438, 212, 167, 160, 167, 230, 167, 164, 162, 243, 181,
+    232, 168, 433, 176, 177, 160, 437, 130, 131, 245, 185, 185, 167, 187, 122, 187, 160, 160, 302,
+    303, 304, 305, 230, 167, 167, 162, 130, 233, 159, 159, 159, 168, 354, 159, 165, 165, 165, 245,
+    158, 165, 159, 286, 159, 159, 152, 153, 165, 165, 270, 165, 168, 165, 274, 165, 168, 168, 168,
+    160, 232, 233, 232, 233, 119, 165, 130, 131, 168, 124, 290, 314, 165, 143, 144, 168, 137, 138,
+    276, 165, 135, 133, 134, 138, 327, 5,   6,   7,   331, 319, 162, 400, 147, 162, 135, 135, 151,
+    173, 174, 175, 165, 166, 298, 299, 159, 300, 301, 306, 307, 158, 160, 168, 167, 167, 158, 145,
+    159, 180, 173, 158, 440, 179, 178, 147, 161, 158, 168, 158, 348, 349, 185, 158, 187, 168, 354,
+    148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 168, 166, 319, 158, 319, 162, 158, 163, 159,
+    167, 67,  399, 161, 166, 162, 161, 158, 360, 165, 158, 163, 159, 159, 168, 18,  308, 162, 415,
+    168, 287, 309, 312, 232, 233, 167, 310, 313, 425, 151, 196, 197, 311, 147, 151, 409, 6,   236,
+    275, 436, 358, 392, 431, 437, 415, 336, 394, 394, 135, 215, -1,  -1,  -1,  262, -1,  -1,  -1,
+    -1,  -1,  -1,  -1,  -1,  -1,  -1,  230, -1,  440, -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  399,
+    -1,  -1,  -1,  245, -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  415, -1,  420, 420,
+    -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  319, -1,  -1,  -1,
+    -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  336, -1,  295, 296, 297, 298,
+    299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, -1,  -1,  -1,  -1,
     -1,  -1,  -1,  -1,  -1,  -1,  -1,  419, -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
     -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  393, 394, -1,  -1,  -1,  -1,
     399, 400, -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  415, -1,  -1,
     -1,  -1,  420, -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  433, -1,  -1,  -1,
-    -1,  438, 3,   4,   5,   6,   7,   8,   9,   10,  11,  12,  13,  14,  15,  16,  17,  -1,  19,
-    20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,
-    39,  40,  41,  42,  43,  44,  45,  46,  47,  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,
-    58,  59,  60,  61,  62,  63,  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,
-    77,  78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  -1,  89,  90,  91,  92,  93,  94,  95,
-    96,  97,  98,  99,  100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
-    115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133,
-    134, 135, 136, -1,  -1,  139, 140, -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-    -1,  -1,  -1,  -1,  -1,  158, -1,  -1,  -1,  162, 163, -1,  -1,  -1,  -1,  168, 169, 170, 171,
-    172, 3,   4,   5,   6,   7,   8,   9,   10,  11,  12,  13,  14,  15,  16,  17,  -1,  19,  20,
+    437, 3,   4,   5,   6,   7,   8,   9,   10,  11,  12,  13,  14,  15,  16,  17,  -1,  19,  20,
     21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,
     40,  41,  42,  43,  44,  45,  46,  47,  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,
     59,  60,  61,  62,  63,  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,
@@ -1395,7 +1386,7 @@
     98,  99,  100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
     117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,
     136, -1,  -1,  139, 140, -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-    -1,  -1,  -1,  158, -1,  -1,  -1,  162, -1,  -1,  -1,  -1,  -1,  168, 169, 170, 171, 172, 3,
+    -1,  -1,  -1,  158, -1,  -1,  -1,  162, 163, -1,  -1,  -1,  -1,  168, 169, 170, 171, 172, 3,
     4,   5,   6,   7,   8,   9,   10,  11,  12,  13,  14,  15,  16,  17,  -1,  19,  20,  21,  22,
     23,  24,  25,  26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,
     42,  43,  44,  45,  46,  47,  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,
@@ -1413,40 +1404,41 @@
     100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118,
     119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, -1,
     -1,  139, 140, -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-    -1,  158, -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  168, 169, 170, 171, 172, 3,   4,   5,
-    6,   7,   8,   9,   10,  11,  12,  13,  14,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-    -1,  26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,
+    -1,  158, -1,  -1,  -1,  162, -1,  -1,  -1,  -1,  -1,  168, 169, 170, 171, 172, 3,   4,   5,
+    6,   7,   8,   9,   10,  11,  12,  13,  14,  15,  16,  17,  -1,  19,  20,  21,  22,  23,  24,
+    25,  26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,
     44,  45,  46,  47,  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,
-    63,  64,  65,  66,  -1,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,  80,  81,
+    63,  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,  80,  81,
     82,  83,  84,  85,  86,  87,  -1,  89,  90,  91,  92,  93,  94,  95,  96,  97,  98,  99,  100,
     101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
     120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, -1,  -1,
-    139, 140, -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  3,   4,   5,   6,   7,
-    158, 9,   10,  11,  12,  13,  14,  -1,  -1,  -1,  168, 169, 170, 171, 172, -1,  -1,  -1,  26,
-    27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,
-    46,  47,  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,
-    65,  66,  -1,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,  80,  81,  82,  83,
-    84,  85,  86,  87,  -1,  89,  90,  91,  92,  93,  94,  95,  96,  97,  98,  99,  100, 101, 102,
-    103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
-    122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, -1,  -1,  139, 140,
-    -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  3,   4,   5,   6,   7,   158, 9,
-    10,  11,  12,  13,  14,  -1,  -1,  -1,  -1,  169, 170, 171, 172, -1,  -1,  -1,  26,  27,  28,
-    29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
-    48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,  66,
-    -1,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,  80,  81,  82,  83,  84,  85,
-    86,  87,  -1,  89,  90,  91,  92,  93,  94,  95,  96,  97,  98,  99,  100, 101, 102, 103, 104,
-    105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123,
-    124, 125, 126, 127, 128, -1,  130, 131, -1,  11,  12,  13,  14,  -1,  -1,  -1,  -1,  -1,  -1,
-    -1,  -1,  -1,  -1,  -1,  26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,
-    40,  -1,  -1,  -1,  -1,  -1,  168, 47,  48,  49,  50,  51,  52,  -1,  -1,  -1,  -1,  -1,  -1,
-    -1,  -1,  -1,  -1,  -1,  -1,  65,  66,  -1,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,
-    78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  -1,  89,  90,  91,  92,  93,  94,  95,  96,
-    97,  98,  99,  100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
-    116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, -1,  128, 129, 130, 131, 132, 133, 134,
-    135, 136, -1,  -1,  139, 140, -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-    -1,  -1,  -1,  -1,  158, -1,  -1,  161, 11,  12,  13,  14,  -1,  -1,  -1,  169, 170, 171, 172,
+    139, 140, -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+    158, -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  168, 169, 170, 171, 172, 3,   4,   5,   6,
+    7,   8,   9,   10,  11,  12,  13,  14,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+    26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,
+    45,  46,  47,  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
+    64,  65,  66,  -1,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,  80,  81,  82,
+    83,  84,  85,  86,  87,  -1,  89,  90,  91,  92,  93,  94,  95,  96,  97,  98,  99,  100, 101,
+    102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120,
+    121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, -1,  -1,  139,
+    140, -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  3,   4,   5,   6,   7,   158,
+    9,   10,  11,  12,  13,  14,  -1,  -1,  -1,  168, 169, 170, 171, 172, -1,  -1,  -1,  26,  27,
+    28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,
+    47,  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,
+    66,  -1,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,  80,  81,  82,  83,  84,
+    85,  86,  87,  -1,  89,  90,  91,  92,  93,  94,  95,  96,  97,  98,  99,  100, 101, 102, 103,
+    104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122,
+    123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, -1,  -1,  139, 140, -1,
+    -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  3,   4,   5,   6,   7,   158, 9,   10,
+    11,  12,  13,  14,  -1,  -1,  -1,  -1,  169, 170, 171, 172, -1,  -1,  -1,  26,  27,  28,  29,
+    30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,  48,
+    49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,  66,  -1,
+    68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,  80,  81,  82,  83,  84,  85,  86,
+    87,  -1,  89,  90,  91,  92,  93,  94,  95,  96,  97,  98,  99,  100, 101, 102, 103, 104, 105,
+    106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124,
+    125, 126, 127, 128, -1,  130, 131, -1,  11,  12,  13,  14,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
     -1,  -1,  -1,  -1,  26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,
-    -1,  -1,  -1,  -1,  -1,  -1,  47,  48,  49,  50,  51,  52,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+    -1,  -1,  -1,  -1,  -1,  168, 47,  48,  49,  50,  51,  52,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
     -1,  -1,  -1,  -1,  -1,  65,  66,  -1,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,
     79,  80,  81,  82,  83,  84,  85,  86,  87,  -1,  89,  90,  91,  92,  93,  94,  95,  96,  97,
     98,  99,  100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
@@ -1460,77 +1452,85 @@
     99,  100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
     118, 119, 120, 121, 122, 123, 124, 125, 126, -1,  128, 129, 130, 131, 132, 133, 134, 135, 136,
     -1,  -1,  139, 140, -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-    -1,  -1,  158, 11,  12,  13,  14,  -1,  -1,  -1,  -1,  -1,  168, 169, 170, 171, 172, -1,  26,
-    27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  -1,  -1,  -1,  -1,  -1,
-    -1,  47,  48,  49,  50,  51,  52,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-    65,  66,  -1,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,  80,  81,  82,  83,
-    84,  85,  86,  87,  -1,  89,  90,  91,  92,  93,  94,  95,  96,  97,  98,  99,  100, 101, 102,
-    103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
-    122, 123, 124, 125, 126, -1,  128, 129, 130, 131, 132, 133, 134, 135, 136, -1,  -1,  139, 140,
-    -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  158, 11,
-    12,  13,  14,  -1,  -1,  -1,  -1,  -1,  -1,  169, 170, 171, 172, -1,  26,  27,  28,  29,  30,
-    31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  -1,  -1,  -1,  -1,  -1,  -1,  47,  48,  49,
-    50,  51,  52,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  65,  66,  -1,  68,
-    69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,  80,  81,  82,  83,  84,  85,  86,  87,
-    -1,  89,  90,  91,  92,  93,  94,  95,  96,  97,  98,  99,  100, 101, 102, 103, 104, 105, 106,
-    107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125,
-    126, -1,  128, 129, 130, 131, 132, 133, 134, 135, 136, -1,  -1,  139, 140, -1,  -1,  -1,  -1,
-    -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  3,   4,   5,   6,   7,   158, 9,   10,  11,  12,  13,
-    14,  -1,  -1,  -1,  -1,  169, 170, 171, 172, -1,  -1,  -1,  26,  27,  28,  29,  30,  31,  32,
-    33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,  48,  49,  50,  51,
-    52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,  66,  -1,  68,  69,  70,
-    71,  72,  73,  74,  75,  76,  77,  78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  -1,  89,
-    90,  91,  92,  93,  94,  95,  96,  97,  98,  99,  100, 101, 102, 103, 104, 105, 106, 107, 108,
-    109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
-    128, -1,  -1,  131, -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  3,   4,   5,   6,   7,   -1,
-    9,   10,  11,  12,  13,  14,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  163, 26,  27,
-    28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,
-    47,  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,
+    -1,  -1,  158, -1,  -1,  161, 11,  12,  13,  14,  -1,  -1,  -1,  169, 170, 171, 172, -1,  -1,
+    -1,  -1,  26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  -1,  -1,
+    -1,  -1,  -1,  -1,  47,  48,  49,  50,  51,  52,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+    -1,  -1,  -1,  65,  66,  -1,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,  80,
+    81,  82,  83,  84,  85,  86,  87,  -1,  89,  90,  91,  92,  93,  94,  95,  96,  97,  98,  99,
+    100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118,
+    119, 120, 121, 122, 123, 124, 125, 126, -1,  128, 129, 130, 131, 132, 133, 134, 135, 136, -1,
+    -1,  139, 140, -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+    -1,  158, 11,  12,  13,  14,  -1,  -1,  -1,  -1,  -1,  168, 169, 170, 171, 172, -1,  26,  27,
+    28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  -1,  -1,  -1,  -1,  -1,  -1,
+    47,  48,  49,  50,  51,  52,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  65,
     66,  -1,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,  80,  81,  82,  83,  84,
     85,  86,  87,  -1,  89,  90,  91,  92,  93,  94,  95,  96,  97,  98,  99,  100, 101, 102, 103,
     104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122,
-    123, 124, 125, 126, 127, 128, -1,  -1,  131, -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  3,
-    4,   5,   6,   7,   -1,  9,   10,  11,  12,  13,  14,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-    -1,  -1,  163, 26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,
+    123, 124, 125, 126, -1,  128, 129, 130, 131, 132, 133, 134, 135, 136, -1,  -1,  139, 140, -1,
+    -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  158, 11,  12,
+    13,  14,  -1,  -1,  -1,  -1,  -1,  -1,  169, 170, 171, 172, -1,  26,  27,  28,  29,  30,  31,
+    32,  33,  34,  35,  36,  37,  38,  39,  40,  -1,  -1,  -1,  -1,  -1,  -1,  47,  48,  49,  50,
+    51,  52,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  65,  66,  -1,  68,  69,
+    70,  71,  72,  73,  74,  75,  76,  77,  78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  -1,
+    89,  90,  91,  92,  93,  94,  95,  96,  97,  98,  99,  100, 101, 102, 103, 104, 105, 106, 107,
+    108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126,
+    -1,  128, 129, 130, 131, 132, 133, 134, 135, 136, -1,  -1,  139, 140, -1,  -1,  -1,  -1,  -1,
+    -1,  -1,  -1,  -1,  -1,  -1,  -1,  3,   4,   5,   6,   7,   158, 9,   10,  11,  12,  13,  14,
+    -1,  -1,  -1,  -1,  169, 170, 171, 172, -1,  -1,  -1,  26,  27,  28,  29,  30,  31,  32,  33,
+    34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,  48,  49,  50,  51,  52,
+    53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,  66,  -1,  68,  69,  70,  71,
+    72,  73,  74,  75,  76,  77,  78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  -1,  89,  90,
+    91,  92,  93,  94,  95,  96,  97,  98,  99,  100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
+    110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128,
+    -1,  -1,  131, -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  3,   4,   5,   6,   7,   -1,  9,
+    10,  11,  12,  13,  14,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  163, 26,  27,  28,
+    29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
+    48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,  66,
+    -1,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,  80,  81,  82,  83,  84,  85,
+    86,  87,  -1,  89,  90,  91,  92,  93,  94,  95,  96,  97,  98,  99,  100, 101, 102, 103, 104,
+    105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123,
+    124, 125, 126, 127, 128, -1,  -1,  131, -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  3,   4,
+    5,   6,   7,   -1,  9,   10,  11,  12,  13,  14,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+    -1,  163, 26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,
+    43,  44,  45,  46,  47,  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,
+    62,  63,  64,  65,  66,  -1,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,  80,
+    81,  82,  83,  84,  85,  86,  87,  -1,  89,  90,  91,  92,  93,  94,  95,  96,  97,  98,  99,
+    100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118,
+    119, 120, 121, 122, 123, 124, 125, 126, 127, 128, -1,  -1,  131, -1,  -1,  -1,  -1,  -1,  -1,
+    0,   -1,  -1,  3,   4,   5,   6,   7,   8,   9,   10,  11,  12,  13,  14,  -1,  -1,  -1,  -1,
+    -1,  -1,  -1,  -1,  -1,  -1,  163, 26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,
+    38,  39,  40,  41,  42,  43,  44,  45,  46,  47,  48,  49,  50,  51,  52,  53,  54,  55,  56,
+    57,  58,  59,  60,  61,  62,  63,  64,  65,  66,  -1,  68,  69,  70,  71,  72,  73,  74,  75,
+    76,  77,  78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  -1,  89,  90,  91,  92,  93,  94,
+    95,  96,  97,  98,  99,  100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113,
+    114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, -1,  -1,  131, 3,
+    4,   5,   6,   7,   8,   9,   10,  11,  12,  13,  14,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+    -1,  -1,  -1,  26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,
     42,  43,  44,  45,  46,  47,  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,
     61,  62,  63,  64,  65,  66,  -1,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
     80,  81,  82,  83,  84,  85,  86,  87,  -1,  89,  90,  91,  92,  93,  94,  95,  96,  97,  98,
     99,  100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
-    118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, -1,  -1,  131, -1,  -1,  -1,  -1,  -1,
-    -1,  0,   -1,  -1,  3,   4,   5,   6,   7,   8,   9,   10,  11,  12,  13,  14,  -1,  -1,  -1,
-    -1,  -1,  -1,  -1,  -1,  -1,  -1,  163, 26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,
-    37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,  48,  49,  50,  51,  52,  53,  54,  55,
-    56,  57,  58,  59,  60,  61,  62,  63,  64,  65,  66,  -1,  68,  69,  70,  71,  72,  73,  74,
-    75,  76,  77,  78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  -1,  89,  90,  91,  92,  93,
-    94,  95,  96,  97,  98,  99,  100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112,
-    113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, -1,  -1,  131,
-    3,   4,   5,   6,   7,   8,   9,   10,  11,  12,  13,  14,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-    -1,  -1,  -1,  -1,  26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,
-    41,  42,  43,  44,  45,  46,  47,  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,
-    60,  61,  62,  63,  64,  65,  66,  -1,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,
-    79,  80,  81,  82,  83,  84,  85,  86,  87,  -1,  89,  90,  91,  92,  93,  94,  95,  96,  97,
-    98,  99,  100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
-    117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, -1,  -1,  131, 3,   4,   5,   6,
-    7,   -1,  9,   10,  11,  12,  13,  14,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-    26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,
-    45,  46,  47,  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
-    64,  65,  66,  -1,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,  80,  81,  82,
-    83,  84,  85,  86,  87,  -1,  89,  90,  91,  92,  93,  94,  95,  96,  97,  98,  99,  100, 101,
-    102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120,
-    121, 122, 123, 124, 125, 126, 127, 128, -1,  -1,  131, 11,  12,  13,  14,  -1,  -1,  -1,  -1,
-    -1,  -1,  -1,  -1,  -1,  -1,  -1,  26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,
-    38,  39,  40,  -1,  -1,  -1,  -1,  -1,  -1,  47,  48,  49,  50,  51,  52,  -1,  -1,  -1,  -1,
-    -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  65,  66,  -1,  68,  69,  70,  71,  72,  73,  74,  75,
-    76,  77,  78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  -1,  89,  90,  91,  92,  93,  94,
-    95,  96,  97,  98,  99,  100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113,
-    114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, -1,  128, -1,  130, 131, 11,
-    12,  13,  14,  136, -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  26,  27,  28,  29,  30,
-    31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  -1,  -1,  -1,  -1,  -1,  -1,  47,  48,  49,
-    50,  51,  52,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  65,  66,  -1,  68,
-    69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,  80,  81,  82,  83,  84,  85,  86,  87,
-    -1,  89,  90,  91,  92,  93,  94,  95,  96,  97,  98,  99,  100, 101, 102, 103, 104, 105, 106,
-    107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125,
-    126, -1,  128, -1,  -1,  131};
+    118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, -1,  -1,  131, 3,   4,   5,   6,   7,
+    -1,  9,   10,  11,  12,  13,  14,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  26,
+    27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,
+    46,  47,  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,
+    65,  66,  -1,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,  80,  81,  82,  83,
+    84,  85,  86,  87,  -1,  89,  90,  91,  92,  93,  94,  95,  96,  97,  98,  99,  100, 101, 102,
+    103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
+    122, 123, 124, 125, 126, 127, 128, -1,  -1,  131, 11,  12,  13,  14,  -1,  -1,  -1,  -1,  -1,
+    -1,  -1,  -1,  -1,  -1,  -1,  26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,
+    39,  40,  -1,  -1,  -1,  -1,  -1,  -1,  47,  48,  49,  50,  51,  52,  -1,  -1,  -1,  -1,  -1,
+    -1,  -1,  -1,  -1,  -1,  -1,  -1,  65,  66,  -1,  68,  69,  70,  71,  72,  73,  74,  75,  76,
+    77,  78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  -1,  89,  90,  91,  92,  93,  94,  95,
+    96,  97,  98,  99,  100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
+    115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, -1,  128, -1,  130, 131, 11,  12,
+    13,  14,  136, -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  26,  27,  28,  29,  30,  31,
+    32,  33,  34,  35,  36,  37,  38,  39,  40,  -1,  -1,  -1,  -1,  -1,  -1,  47,  48,  49,  50,
+    51,  52,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  65,  66,  -1,  68,  69,
+    70,  71,  72,  73,  74,  75,  76,  77,  78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  -1,
+    89,  90,  91,  92,  93,  94,  95,  96,  97,  98,  99,  100, 101, 102, 103, 104, 105, 106, 107,
+    108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126,
+    -1,  128, -1,  -1,  131};
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
    symbol of state STATE-NUM.  */
@@ -1556,9 +1556,9 @@
     153, 154, 155, 156, 157, 167, 210, 165, 168, 163, 248, 246, 167, 246, 244, 237, 165, 168, 130,
     168, 159, 187, 211, 130, 136, 190, 209, 195, 195, 195, 197, 197, 198, 198, 199, 199, 199, 199,
     200, 200, 201, 202, 203, 204, 205, 206, 211, 161, 163, 254, 255, 256, 269, 211, 168, 211, 166,
-    267, 258, 209, 209, 246, 168, 245, 160, 168, 161, 166, 67,  257, 249, 247, 259, 270, 159, 159,
-    211, 224, 226, 265, 252, 212, 209, 158, 265, 271, 272, 254, 261, 263, 183, 159, 163, 161, 211,
-    168, 159, 18,  250, 167, 249, 253, 257, 168, 159, 211, 253, 254, 246, 168};
+    267, 258, 209, 209, 246, 168, 245, 168, 237, 161, 166, 67,  257, 249, 247, 259, 270, 159, 159,
+    211, 224, 226, 265, 252, 168, 209, 158, 265, 271, 272, 254, 261, 263, 183, 159, 163, 211, 168,
+    159, 18,  250, 167, 249, 253, 257, 159, 211, 253, 254, 246, 168};
 
 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 static const yytype_uint16 yyr1[] = {
@@ -1586,7 +1586,7 @@
     0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 4, 1, 3, 2, 2, 1, 1, 1, 3, 2, 2, 2, 1, 2, 3, 2, 1,
     1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 3, 3, 3, 1, 3, 3, 1, 3, 3, 1, 3, 3, 3, 3, 1, 3, 3, 1, 3,
     1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 5, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 2,
-    2, 4, 5, 6, 9, 2, 3, 2, 1, 1, 2, 3, 3, 2, 3, 2, 1, 2, 1, 1, 1, 3, 4, 6, 5, 1, 2, 3, 5, 4,
+    2, 4, 5, 6, 7, 2, 3, 2, 1, 1, 2, 3, 3, 2, 3, 2, 1, 2, 1, 1, 1, 3, 4, 6, 5, 1, 2, 3, 5, 4,
     1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 4, 1, 3, 1, 3, 3, 1, 1, 2, 2, 3, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -3192,12 +3192,12 @@
         case 94:
 
         {
-            ES3_OR_NEWER(ImmutableString((yyvsp[-7].lex).string), (yylsp[-8]), "interface blocks");
+            ES3_OR_NEWER(ImmutableString((yyvsp[-5].lex).string), (yylsp[-6]), "interface blocks");
             (yyval.interm.intermNode) = context->addInterfaceBlock(
-                *(yyvsp[-8].interm.typeQualifierBuilder), (yylsp[-7]),
-                ImmutableString((yyvsp[-7].lex).string), (yyvsp[-6].interm.fieldList),
-                ImmutableString((yyvsp[-4].lex).string), (yylsp[-4]),
-                (yyvsp[-2].interm.intermTypedNode), (yylsp[-3]));
+                *(yyvsp[-6].interm.typeQualifierBuilder), (yylsp[-5]),
+                ImmutableString((yyvsp[-5].lex).string), (yyvsp[-4].interm.fieldList),
+                ImmutableString((yyvsp[-2].lex).string), (yylsp[-2]), (yyvsp[-1].interm.arraySizes),
+                (yylsp[-1]));
         }
 
         break;
diff --git a/src/compiler/translator/tree_ops/RecordUniformBlocksTranslatedToStructuredBuffers.cpp b/src/compiler/translator/tree_ops/RecordUniformBlocksTranslatedToStructuredBuffers.cpp
deleted file mode 100644
index 371fb3f..0000000
--- a/src/compiler/translator/tree_ops/RecordUniformBlocksTranslatedToStructuredBuffers.cpp
+++ /dev/null
@@ -1,269 +0,0 @@
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// RecordUniformBlocksTranslatedToStructuredBuffers.cpp:
-// Collect all uniform blocks which will been translated to StructuredBuffers on Direct3D
-// backend.
-//
-
-#include "compiler/translator/tree_ops/RecordUniformBlocksTranslatedToStructuredBuffers.h"
-
-#include "compiler/translator/Compiler.h"
-#include "compiler/translator/tree_util/IntermNode_util.h"
-#include "compiler/translator/tree_util/IntermTraverse.h"
-
-namespace sh
-{
-
-namespace
-{
-// Only when a uniform block member's array size is greater than or equal to
-// kMinArraySizeUseStructuredBuffer, then we may translate the uniform block
-// to a StructuredBuffer on Direct3D backend.
-const unsigned int kMinArraySizeUseStructuredBuffer = 50u;
-
-// There is a maximum of D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT(128) slots that are available
-// for shader resources on Direct3D 11. When shader version is 300, we only use
-// D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT(16) slots for texture units. We allow StructuredBuffer to
-// use the maximum of 60 slots, that is enough here.
-const unsigned int kMaxAllowToUseRegisterCount = 60u;
-
-// Traverser that collects all uniform blocks which will been translated to StructuredBuffer on
-// Direct3D backend.
-class UniformBlockTranslatedToStructuredBufferTraverser : public TIntermTraverser
-{
-  public:
-    UniformBlockTranslatedToStructuredBufferTraverser();
-
-    void visitSymbol(TIntermSymbol *node) override;
-    bool visitBinary(Visit visit, TIntermBinary *node) override;
-    std::map<int, const TInterfaceBlock *> &getUniformBlockMayTranslation()
-    {
-        return mUniformBlockMayTranslation;
-    }
-    std::map<int, const TInterfaceBlock *> &getUniformBlockNotAllowTranslation()
-    {
-        return mUniformBlockNotAllowTranslation;
-    }
-    std::map<int, unsigned int> &getUniformBlockUsedRegisterCount()
-    {
-        return mUniformBlockUsedRegisterCount;
-    }
-
-  private:
-    void parseAccessWholeUniformBlock(TIntermTyped *node);
-    std::map<int, const TInterfaceBlock *> mUniformBlockMayTranslation;
-    std::map<int, const TInterfaceBlock *> mUniformBlockNotAllowTranslation;
-    std::map<int, unsigned int> mUniformBlockUsedRegisterCount;
-};
-
-UniformBlockTranslatedToStructuredBufferTraverser::
-    UniformBlockTranslatedToStructuredBufferTraverser()
-    : TIntermTraverser(true, false, false)
-{}
-
-static bool IsSupportedTypeForStructuredBuffer(const TType &type)
-{
-    const TStructure *structure = type.getStruct();
-    if (structure)
-    {
-        const TFieldList &fields = structure->fields();
-        for (size_t i = 0; i < fields.size(); i++)
-        {
-            // Do not allow the structure's member is array or structure.
-            if (fields[i]->type()->isArray() || fields[i]->type()->getStruct() ||
-                !IsSupportedTypeForStructuredBuffer(*fields[i]->type()))
-            {
-                return false;
-            }
-        }
-        return true;
-    }
-    else if (type.isMatrix())
-    {
-        // Only supports the matrix types that we do not need to pad in a structure or an array
-        // explicitly.
-        return (type.getLayoutQualifier().matrixPacking != EmpRowMajor && type.getRows() == 4) ||
-               (type.getLayoutQualifier().matrixPacking == EmpRowMajor && type.getCols() == 4);
-    }
-    else
-    {
-        // Supports vector and scalar types in a structure or an array.
-        return true;
-    }
-}
-
-static bool CanTranslateUniformBlockToStructuredBuffer(const TInterfaceBlock &interfaceBlock)
-{
-    const TLayoutBlockStorage blockStorage = interfaceBlock.blockStorage();
-
-    if (blockStorage == EbsStd140 && interfaceBlock.fields().size() == 1u)
-    {
-        const TType &fieldType = *interfaceBlock.fields()[0]->type();
-        if (fieldType.getNumArraySizes() == 1u &&
-            fieldType.getOutermostArraySize() >= kMinArraySizeUseStructuredBuffer)
-        {
-            return IsSupportedTypeForStructuredBuffer(fieldType);
-        }
-    }
-
-    return false;
-}
-
-void UniformBlockTranslatedToStructuredBufferTraverser::visitSymbol(TIntermSymbol *node)
-{
-    const TVariable &variable = node->variable();
-    const TType &variableType = variable.getType();
-    TQualifier qualifier      = variable.getType().getQualifier();
-
-    if (qualifier == EvqUniform)
-    {
-        const TInterfaceBlock *interfaceBlock = variableType.getInterfaceBlock();
-        if (interfaceBlock && CanTranslateUniformBlockToStructuredBuffer(*interfaceBlock))
-        {
-            if (mUniformBlockMayTranslation.count(interfaceBlock->uniqueId().get()) == 0)
-            {
-                mUniformBlockMayTranslation[interfaceBlock->uniqueId().get()] = interfaceBlock;
-            }
-
-            if (!variableType.isInterfaceBlock())
-            {
-                TIntermNode *accessor           = getAncestorNode(0);
-                TIntermBinary *accessorAsBinary = accessor->getAsBinaryNode();
-                // The uniform block variable is array type, only indexing operator is allowed to
-                // operate on the variable, otherwise do not translate the uniform block to HLSL
-                // StructuredBuffer.
-                if (!accessorAsBinary ||
-                    !(accessorAsBinary && (accessorAsBinary->getOp() == EOpIndexDirect ||
-                                           accessorAsBinary->getOp() == EOpIndexIndirect)))
-                {
-                    if (mUniformBlockNotAllowTranslation.count(interfaceBlock->uniqueId().get()) ==
-                        0)
-                    {
-                        mUniformBlockNotAllowTranslation[interfaceBlock->uniqueId().get()] =
-                            interfaceBlock;
-                    }
-                }
-                else
-                {
-                    if (mUniformBlockUsedRegisterCount.count(interfaceBlock->uniqueId().get()) == 0)
-                    {
-                        // The uniform block is not an instanced one, so it only uses one register.
-                        mUniformBlockUsedRegisterCount[interfaceBlock->uniqueId().get()] = 1;
-                    }
-                }
-            }
-            else
-            {
-                if (mUniformBlockUsedRegisterCount.count(interfaceBlock->uniqueId().get()) == 0)
-                {
-                    // The uniform block is an instanced one, the count of used registers depends on
-                    // the array size of variable.
-                    mUniformBlockUsedRegisterCount[interfaceBlock->uniqueId().get()] =
-                        variableType.isArray() ? variableType.getOutermostArraySize() : 1;
-                }
-            }
-        }
-    }
-}
-
-bool UniformBlockTranslatedToStructuredBufferTraverser::visitBinary(Visit visit,
-                                                                    TIntermBinary *node)
-{
-    switch (node->getOp())
-    {
-        case EOpIndexDirect:
-        {
-            if (visit == PreVisit)
-            {
-                const TType &leftType = node->getLeft()->getType();
-                if (leftType.isInterfaceBlock())
-                {
-                    const TInterfaceBlock *interfaceBlock = leftType.getInterfaceBlock();
-                    if (CanTranslateUniformBlockToStructuredBuffer(*interfaceBlock) &&
-                        mUniformBlockMayTranslation.count(interfaceBlock->uniqueId().get()) == 0)
-                    {
-                        mUniformBlockMayTranslation[interfaceBlock->uniqueId().get()] =
-                            interfaceBlock;
-                        if (mUniformBlockUsedRegisterCount.count(
-                                interfaceBlock->uniqueId().get()) == 0)
-                        {
-                            // The uniform block is an instanced one, the count of used registers
-                            // depends on the array size of variable.
-                            mUniformBlockUsedRegisterCount[interfaceBlock->uniqueId().get()] =
-                                leftType.isArray() ? leftType.getOutermostArraySize() : 1;
-                        }
-                        return false;
-                    }
-                }
-            }
-            break;
-        }
-        case EOpIndexDirectInterfaceBlock:
-        {
-            if (visit == InVisit)
-            {
-                const TInterfaceBlock *interfaceBlock =
-                    node->getLeft()->getType().getInterfaceBlock();
-                if (CanTranslateUniformBlockToStructuredBuffer(*interfaceBlock))
-                {
-                    TIntermNode *accessor           = getAncestorNode(0);
-                    TIntermBinary *accessorAsBinary = accessor->getAsBinaryNode();
-                    // The uniform block variable is array type, only indexing operator is allowed
-                    // to operate on the
-                    // variable, otherwise do not translate the uniform block to HLSL
-                    // StructuredBuffer.
-                    if ((!accessorAsBinary ||
-                         !(accessorAsBinary && (accessorAsBinary->getOp() == EOpIndexDirect ||
-                                                accessorAsBinary->getOp() == EOpIndexIndirect))) &&
-                        mUniformBlockNotAllowTranslation.count(interfaceBlock->uniqueId().get()) ==
-                            0)
-                    {
-                        mUniformBlockNotAllowTranslation[interfaceBlock->uniqueId().get()] =
-                            interfaceBlock;
-                        return false;
-                    }
-                }
-            }
-            break;
-        }
-        default:
-            break;
-    }
-
-    return true;
-}
-}  // namespace
-
-bool RecordUniformBlocksTranslatedToStructuredBuffers(
-    TIntermNode *root,
-    std::map<int, const TInterfaceBlock *> &uniformBlockTranslatedToStructuredBuffer)
-{
-    UniformBlockTranslatedToStructuredBufferTraverser traverser;
-    root->traverse(&traverser);
-    std::map<int, const TInterfaceBlock *> &uniformBlockMayTranslation =
-        traverser.getUniformBlockMayTranslation();
-    std::map<int, const TInterfaceBlock *> &uniformBlockNotAllowTranslation =
-        traverser.getUniformBlockNotAllowTranslation();
-    std::map<int, unsigned int> &uniformBlockUsedRegisterCount =
-        traverser.getUniformBlockUsedRegisterCount();
-
-    unsigned int usedRegisterCount = 0;
-    for (auto &uniformBlock : uniformBlockMayTranslation)
-    {
-        if (uniformBlockNotAllowTranslation.count(uniformBlock.first) == 0)
-        {
-            usedRegisterCount += uniformBlockUsedRegisterCount[uniformBlock.first];
-            if (usedRegisterCount > kMaxAllowToUseRegisterCount)
-            {
-                break;
-            }
-            uniformBlockTranslatedToStructuredBuffer[uniformBlock.first] = uniformBlock.second;
-        }
-    }
-    return true;
-}
-
-}  // namespace sh
diff --git a/src/compiler/translator/tree_ops/RecordUniformBlocksTranslatedToStructuredBuffers.h b/src/compiler/translator/tree_ops/RecordUniformBlocksTranslatedToStructuredBuffers.h
deleted file mode 100644
index ba90cf6..0000000
--- a/src/compiler/translator/tree_ops/RecordUniformBlocksTranslatedToStructuredBuffers.h
+++ /dev/null
@@ -1,25 +0,0 @@
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// RecordUniformBlocksTranslatedToStructuredBuffers.h:
-// Collect all uniform blocks which will been translated to StructuredBuffers on Direct3D
-// backend.
-//
-
-#ifndef COMPILER_TRANSLATOR_TREEOPS_RECORDUNIFORMBLOCKSTRANSLATEDTOSTRUCTUREDBUFFERS_H_
-#define COMPILER_TRANSLATOR_TREEOPS_RECORDUNIFORMBLOCKSTRANSLATEDTOSTRUCTUREDBUFFERS_H_
-
-#include "compiler/translator/IntermNode.h"
-
-namespace sh
-{
-class TIntermNode;
-
-ANGLE_NO_DISCARD bool RecordUniformBlocksTranslatedToStructuredBuffers(
-    TIntermNode *root,
-    std::map<int, const TInterfaceBlock *> &uniformBlockTranslatedToStructuredBuffer);
-}  // namespace sh
-
-#endif  // COMPILER_TRANSLATOR_TREEOPS_RECORDACCESSUNIFORMBLOCKENTIREARRAYMEMBER_H_
diff --git a/src/compiler/translator/tree_ops/RecordUniformBlocksWithLargeArrayMember.cpp b/src/compiler/translator/tree_ops/RecordUniformBlocksWithLargeArrayMember.cpp
new file mode 100644
index 0000000..45df5b9
--- /dev/null
+++ b/src/compiler/translator/tree_ops/RecordUniformBlocksWithLargeArrayMember.cpp
@@ -0,0 +1,385 @@
+//
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// RecordUniformBlocksWithLargeArrayMember.h:
+// Collect all uniform blocks which have one or more large array members,
+// and the array sizes are greater than or equal to 50. If some of them
+// satify some conditions, we will translate them to StructuredBuffers
+// on Direct3D backend.
+//
+
+#include "compiler/translator/tree_ops/RecordUniformBlocksWithLargeArrayMember.h"
+
+#include "compiler/translator/Compiler.h"
+#include "compiler/translator/tree_util/IntermNode_util.h"
+#include "compiler/translator/tree_util/IntermTraverse.h"
+
+namespace sh
+{
+
+namespace
+{
+// Only when a uniform block member's array size is greater than or equal to
+// kMinArraySizeUseStructuredBuffer, then we may translate the uniform block
+// to a StructuredBuffer on Direct3D backend.
+const unsigned int kMinArraySizeUseStructuredBuffer = 50u;
+
+// There is a maximum of D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT(128) slots that are
+// available for shader resources on Direct3D 11. When shader version is 300, we only use
+// D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT(16) slots for texture units. We allow StructuredBuffer
+// to use the maximum of 60 slots, that is enough here.
+const unsigned int kMaxAllowToUseRegisterCount = 60u;
+
+// Traverser that all uniform blocks which have one or more large array members, and the array
+// sizes are greater than or equal to 50.
+class UniformBlocksWithLargeArrayMemberTraverser : public TIntermTraverser
+{
+  public:
+    UniformBlocksWithLargeArrayMemberTraverser();
+
+    void visitSymbol(TIntermSymbol *node) override;
+    bool visitBinary(Visit visit, TIntermBinary *node) override;
+    std::map<int, const TInterfaceBlock *> &getUniformBlockMayTranslation()
+    {
+        return mUniformBlockMayTranslation;
+    }
+    std::map<int, const TInterfaceBlock *> &getUniformBlockNotAllowTranslation()
+    {
+        return mUniformBlockNotAllowTranslation;
+    }
+    std::map<int, unsigned int> &getUniformBlockUsedRegisterCount()
+    {
+        return mUniformBlockUsedRegisterCount;
+    }
+    std::map<int, const TInterfaceBlock *> &getUniformBlockWithLargeArrayMember()
+    {
+        return mUniformBlockWithLargeArrayMember;
+    }
+
+  private:
+    std::map<int, const TInterfaceBlock *> mUniformBlockMayTranslation;
+    std::map<int, const TInterfaceBlock *> mUniformBlockNotAllowTranslation;
+    std::map<int, unsigned int> mUniformBlockUsedRegisterCount;
+    std::map<int, const TInterfaceBlock *> mUniformBlockWithLargeArrayMember;
+};
+
+UniformBlocksWithLargeArrayMemberTraverser::UniformBlocksWithLargeArrayMemberTraverser()
+    : TIntermTraverser(true, true, false)
+{}
+
+static bool IsSupportedTypeForStructuredBuffer(const TType &type)
+{
+    const TStructure *structure              = type.getStruct();
+    const TLayoutMatrixPacking matrixPacking = type.getLayoutQualifier().matrixPacking;
+    if (structure)
+    {
+        const TFieldList &fields = structure->fields();
+        for (size_t i = 0; i < fields.size(); i++)
+        {
+            const TType &fieldType = *fields[i]->type();
+            // Do not allow the structure's member is array or structure.
+            if (!fieldType.isArray() && !fieldType.getStruct() &&
+                (fieldType.isScalar() || fieldType.isVector() ||
+                 (fieldType.isMatrix() &&
+                  ((matrixPacking != EmpRowMajor && fieldType.getRows() == 4) ||
+                   (matrixPacking == EmpRowMajor && fieldType.getCols() == 4)))))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+    else if (type.isMatrix())
+    {
+        // Only supports the matrix types that we do not need to pad in a structure or an array
+        // explicitly.
+        return (matrixPacking != EmpRowMajor && type.getRows() == 4) ||
+               (matrixPacking == EmpRowMajor && type.getCols() == 4);
+    }
+    else
+    {
+        // Supports vector and scalar types in a structure or an array.
+        return true;
+    }
+}
+
+static bool CanTranslateUniformBlockToStructuredBuffer(const TInterfaceBlock &interfaceBlock)
+{
+    const TLayoutBlockStorage blockStorage = interfaceBlock.blockStorage();
+
+    if (blockStorage == EbsStd140 && interfaceBlock.fields().size() == 1u)
+    {
+        const TType &fieldType = *interfaceBlock.fields()[0]->type();
+        if (fieldType.getNumArraySizes() == 1u &&
+            fieldType.getOutermostArraySize() >= kMinArraySizeUseStructuredBuffer)
+        {
+            return IsSupportedTypeForStructuredBuffer(fieldType);
+        }
+    }
+
+    return false;
+}
+
+static bool FieldIsOrHasLargeArrayField(const TField &field)
+{
+    const TType *type = field.type();
+    if (type->getArraySizeProduct() >= kMinArraySizeUseStructuredBuffer)
+    {
+        return true;
+    }
+
+    const TStructure *structure = type->getStruct();
+    if (structure)
+    {
+        const TFieldList &fields = structure->fields();
+        bool hasLargeArrayField  = false;
+        for (size_t i = 0; i < fields.size(); i++)
+        {
+            hasLargeArrayField = FieldIsOrHasLargeArrayField(*fields[i]);
+            if (hasLargeArrayField)
+            {
+                break;
+            }
+        }
+        return hasLargeArrayField;
+    }
+
+    return false;
+}
+
+static bool IsInterfaceBlockWithLargeArrayField(const TInterfaceBlock &interfaceBlock)
+{
+    const TFieldList &fields = interfaceBlock.fields();
+    bool isLargeArrayField   = false;
+    for (size_t i = 0; i < fields.size(); i++)
+    {
+        isLargeArrayField = FieldIsOrHasLargeArrayField(*fields[i]);
+        if (isLargeArrayField)
+        {
+            break;
+        }
+    }
+
+    return isLargeArrayField;
+}
+
+void UniformBlocksWithLargeArrayMemberTraverser::visitSymbol(TIntermSymbol *node)
+{
+    const TVariable &variable = node->variable();
+    const TType &variableType = variable.getType();
+    TQualifier qualifier      = variable.getType().getQualifier();
+
+    if (qualifier == EvqUniform)
+    {
+        const TInterfaceBlock *interfaceBlock = variableType.getInterfaceBlock();
+        if (interfaceBlock)
+        {
+            if (CanTranslateUniformBlockToStructuredBuffer(*interfaceBlock))
+            {
+                if (mUniformBlockMayTranslation.count(interfaceBlock->uniqueId().get()) == 0)
+                {
+                    mUniformBlockMayTranslation[interfaceBlock->uniqueId().get()] = interfaceBlock;
+                }
+
+                if (!variableType.isInterfaceBlock())
+                {
+                    TIntermNode *accessor           = getAncestorNode(0);
+                    TIntermBinary *accessorAsBinary = accessor->getAsBinaryNode();
+                    // The uniform block variable is array type, only indexing operator is allowed
+                    // to operate on the variable, otherwise do not translate the uniform block to
+                    // HLSL StructuredBuffer.
+                    if (!accessorAsBinary ||
+                        !(accessorAsBinary && (accessorAsBinary->getOp() == EOpIndexDirect ||
+                                               accessorAsBinary->getOp() == EOpIndexIndirect)))
+                    {
+                        if (mUniformBlockNotAllowTranslation.count(
+                                interfaceBlock->uniqueId().get()) == 0)
+                        {
+                            mUniformBlockNotAllowTranslation[interfaceBlock->uniqueId().get()] =
+                                interfaceBlock;
+                        }
+                    }
+                    else
+                    {
+                        if (mUniformBlockUsedRegisterCount.count(
+                                interfaceBlock->uniqueId().get()) == 0)
+                        {
+                            // The uniform block is not an instanced one, so it only uses one
+                            // register.
+                            mUniformBlockUsedRegisterCount[interfaceBlock->uniqueId().get()] = 1;
+                        }
+                    }
+                }
+                else
+                {
+                    if (mUniformBlockUsedRegisterCount.count(interfaceBlock->uniqueId().get()) == 0)
+                    {
+                        // The uniform block is an instanced one, the count of used registers
+                        // depends on the array size of variable.
+                        mUniformBlockUsedRegisterCount[interfaceBlock->uniqueId().get()] =
+                            variableType.isArray() ? variableType.getOutermostArraySize() : 1;
+                    }
+                }
+            }
+
+            if (interfaceBlock->blockStorage() == EbsStd140 &&
+                IsInterfaceBlockWithLargeArrayField(*interfaceBlock))
+            {
+                if (!variableType.isInterfaceBlock())
+                {
+                    TIntermNode *accessor           = getAncestorNode(0);
+                    TIntermBinary *accessorAsBinary = accessor->getAsBinaryNode();
+                    if (accessorAsBinary && (accessorAsBinary->getOp() == EOpIndexDirect ||
+                                             accessorAsBinary->getOp() == EOpIndexIndirect))
+                    {
+                        if (mUniformBlockWithLargeArrayMember.count(
+                                interfaceBlock->uniqueId().get()) == 0)
+                        {
+                            mUniformBlockWithLargeArrayMember[interfaceBlock->uniqueId().get()] =
+                                interfaceBlock;
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
+
+bool UniformBlocksWithLargeArrayMemberTraverser::visitBinary(Visit visit, TIntermBinary *node)
+{
+    switch (node->getOp())
+    {
+        case EOpIndexDirect:
+        {
+            if (visit == PreVisit)
+            {
+                const TType &leftType = node->getLeft()->getType();
+                if (leftType.isInterfaceBlock())
+                {
+                    const TInterfaceBlock *interfaceBlock = leftType.getInterfaceBlock();
+                    if (CanTranslateUniformBlockToStructuredBuffer(*interfaceBlock) &&
+                        mUniformBlockMayTranslation.count(interfaceBlock->uniqueId().get()) == 0)
+                    {
+                        mUniformBlockMayTranslation[interfaceBlock->uniqueId().get()] =
+                            interfaceBlock;
+                        if (mUniformBlockUsedRegisterCount.count(
+                                interfaceBlock->uniqueId().get()) == 0)
+                        {
+                            // The uniform block is an instanced one, the count of used registers
+                            // depends on the array size of variable.
+                            mUniformBlockUsedRegisterCount[interfaceBlock->uniqueId().get()] =
+                                leftType.isArray() ? leftType.getOutermostArraySize() : 1;
+                        }
+                        return false;
+                    }
+
+                    if (interfaceBlock->blockStorage() == EbsStd140 &&
+                        IsInterfaceBlockWithLargeArrayField(*interfaceBlock))
+                    {
+                        if (mUniformBlockWithLargeArrayMember.count(
+                                interfaceBlock->uniqueId().get()) == 0)
+                        {
+                            mUniformBlockWithLargeArrayMember[interfaceBlock->uniqueId().get()] =
+                                interfaceBlock;
+                        }
+                    }
+                }
+            }
+            break;
+        }
+        case EOpIndexDirectInterfaceBlock:
+        {
+            if (visit == InVisit)
+            {
+                const TInterfaceBlock *interfaceBlock =
+                    node->getLeft()->getType().getInterfaceBlock();
+                if (CanTranslateUniformBlockToStructuredBuffer(*interfaceBlock))
+                {
+                    TIntermNode *accessor           = getAncestorNode(0);
+                    TIntermBinary *accessorAsBinary = accessor->getAsBinaryNode();
+                    // The uniform block variable is array type, only indexing operator is allowed
+                    // to operate on the variable, otherwise do not translate the uniform block to
+                    // HLSL StructuredBuffer.
+                    if ((!accessorAsBinary ||
+                         !(accessorAsBinary && (accessorAsBinary->getOp() == EOpIndexDirect ||
+                                                accessorAsBinary->getOp() == EOpIndexIndirect))) &&
+                        mUniformBlockNotAllowTranslation.count(interfaceBlock->uniqueId().get()) ==
+                            0)
+                    {
+                        mUniformBlockNotAllowTranslation[interfaceBlock->uniqueId().get()] =
+                            interfaceBlock;
+                        return false;
+                    }
+                }
+
+                if (interfaceBlock->blockStorage() == EbsStd140 &&
+                    IsInterfaceBlockWithLargeArrayField(*interfaceBlock))
+                {
+                    TIntermNode *accessor           = getAncestorNode(0);
+                    TIntermBinary *accessorAsBinary = accessor->getAsBinaryNode();
+                    if (accessorAsBinary && (accessorAsBinary->getOp() == EOpIndexDirect ||
+                                             accessorAsBinary->getOp() == EOpIndexIndirect))
+                    {
+                        if (mUniformBlockWithLargeArrayMember.count(
+                                interfaceBlock->uniqueId().get()) == 0)
+                        {
+                            mUniformBlockWithLargeArrayMember[interfaceBlock->uniqueId().get()] =
+                                interfaceBlock;
+                        }
+                    }
+                }
+            }
+            break;
+        }
+        default:
+            break;
+    }
+
+    return true;
+}
+}  // namespace
+
+bool RecordUniformBlocksWithLargeArrayMember(
+    TIntermNode *root,
+    std::map<int, const TInterfaceBlock *> &uniformBlockOptimizedMap,
+    std::set<std::string> &slowCompilingUniformBlockSet)
+{
+    UniformBlocksWithLargeArrayMemberTraverser traverser;
+    root->traverse(&traverser);
+    std::map<int, const TInterfaceBlock *> &uniformBlockMayTranslation =
+        traverser.getUniformBlockMayTranslation();
+    std::map<int, const TInterfaceBlock *> &uniformBlockNotAllowTranslation =
+        traverser.getUniformBlockNotAllowTranslation();
+    std::map<int, unsigned int> &uniformBlockUsedRegisterCount =
+        traverser.getUniformBlockUsedRegisterCount();
+    std::map<int, const TInterfaceBlock *> &uniformBlockWithLargeArrayMember =
+        traverser.getUniformBlockWithLargeArrayMember();
+
+    unsigned int usedRegisterCount = 0;
+    for (auto &uniformBlock : uniformBlockMayTranslation)
+    {
+        if (uniformBlockNotAllowTranslation.count(uniformBlock.first) == 0)
+        {
+            usedRegisterCount += uniformBlockUsedRegisterCount[uniformBlock.first];
+            if (usedRegisterCount > kMaxAllowToUseRegisterCount)
+            {
+                break;
+            }
+            uniformBlockOptimizedMap[uniformBlock.first] = uniformBlock.second;
+        }
+    }
+
+    for (auto &uniformBlock : uniformBlockWithLargeArrayMember)
+    {
+        if (uniformBlockOptimizedMap.count(uniformBlock.first) == 0)
+        {
+            slowCompilingUniformBlockSet.insert(uniformBlock.second->name().data());
+        }
+    }
+
+    return true;
+}
+
+}  // namespace sh
diff --git a/src/compiler/translator/tree_ops/RecordUniformBlocksWithLargeArrayMember.h b/src/compiler/translator/tree_ops/RecordUniformBlocksWithLargeArrayMember.h
new file mode 100644
index 0000000..0d55d52
--- /dev/null
+++ b/src/compiler/translator/tree_ops/RecordUniformBlocksWithLargeArrayMember.h
@@ -0,0 +1,28 @@
+//
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// RecordUniformBlocksWithLargeArrayMember.h:
+// Collect all uniform blocks which have one or more large array members,
+// and the array sizes are greater than or equal to 50. If some of them
+// satify some conditions, we will translate them to StructuredBuffers
+// on Direct3D backend.
+//
+
+#ifndef COMPILER_TRANSLATOR_TREEOPS_RECORDUNIFORMBLOCKSWITHLARGEARRAYMEMBER_H_
+#define COMPILER_TRANSLATOR_TREEOPS_RECORDUNIFORMBLOCKSWITHLARGEARRAYMEMBER_H_
+
+#include "compiler/translator/IntermNode.h"
+
+namespace sh
+{
+class TIntermNode;
+
+ANGLE_NO_DISCARD bool RecordUniformBlocksWithLargeArrayMember(
+    TIntermNode *root,
+    std::map<int, const TInterfaceBlock *> &uniformBlockOptimizedMap,
+    std::set<std::string> &slowCompilingUniformBlockSet);
+}  // namespace sh
+
+#endif  // COMPILER_TRANSLATOR_TREEOPS_RECORDUNIFORMBLOCKSWITHLARGEARRAYMEMBER_H_
diff --git a/src/compiler/translator/tree_ops/RemoveInactiveInterfaceVariables.cpp b/src/compiler/translator/tree_ops/RemoveInactiveInterfaceVariables.cpp
index 51ea958..f952707 100644
--- a/src/compiler/translator/tree_ops/RemoveInactiveInterfaceVariables.cpp
+++ b/src/compiler/translator/tree_ops/RemoveInactiveInterfaceVariables.cpp
@@ -99,7 +99,14 @@
 
     if (type.isInterfaceBlock())
     {
-        removeDeclaration = !IsVariableActive(mInterfaceBlocks, type.getInterfaceBlock()->name());
+        // When a member has an explicit location, interface block should not be removed.
+        // If the member or interface would be removed, GetProgramResource could not return the
+        // location.
+        if (!IsShaderIoBlock(type.getQualifier()))
+        {
+            removeDeclaration =
+                !IsVariableActive(mInterfaceBlocks, type.getInterfaceBlock()->name());
+        }
     }
     else if (qualifier == EvqUniform)
     {
diff --git a/src/compiler/translator/tree_ops/RemoveUnreferencedVariables.cpp b/src/compiler/translator/tree_ops/RemoveUnreferencedVariables.cpp
index a449ba5..66ebd8e 100644
--- a/src/compiler/translator/tree_ops/RemoveUnreferencedVariables.cpp
+++ b/src/compiler/translator/tree_ops/RemoveUnreferencedVariables.cpp
@@ -24,7 +24,7 @@
   public:
     CollectVariableRefCountsTraverser();
 
-    using RefCountMap = std::unordered_map<int, unsigned int>;
+    using RefCountMap = angle::HashMap<int, unsigned int>;
     RefCountMap &getSymbolIdRefCounts() { return mSymbolIdRefCounts; }
     RefCountMap &getStructIdRefCounts() { return mStructIdRefCounts; }
 
diff --git a/src/compiler/translator/tree_ops/RewriteStructSamplers.cpp b/src/compiler/translator/tree_ops/RewriteStructSamplers.cpp
index 60b8908..a608bdf 100644
--- a/src/compiler/translator/tree_ops/RewriteStructSamplers.cpp
+++ b/src/compiler/translator/tree_ops/RewriteStructSamplers.cpp
@@ -191,7 +191,7 @@
 typedef std::map<ImmutableString, std::unordered_map<Instantiation, TFunction *, InstantiationHash>>
     FunctionInstantiations;
 
-typedef std::unordered_map<const TFunction *, const TFunction *> FunctionMap;
+typedef angle::HashMap<const TFunction *, const TFunction *> FunctionMap;
 
 // Generates a new function from the given function using the given
 // instantiation; generatedInstantiations can be null.
@@ -299,9 +299,9 @@
 {
     // The value consists of strides, starting from the outermost array.
     // For example, with sampler2D foo[3][6], we would have {1, 6, 18}.
-    std::unordered_map<const TVariable *, std::vector<size_t>> arrayStrideMap;
+    angle::HashMap<const TVariable *, std::vector<size_t>> arrayStrideMap;
     // For each generated array parameter, holds the offset parameter.
-    std::unordered_map<const TVariable *, const TVariable *> paramOffsetMap;
+    angle::HashMap<const TVariable *, const TVariable *> paramOffsetMap;
 };
 
 class Traverser final : public TIntermTraverser, public ArrayTraverser
@@ -489,10 +489,7 @@
 
     FunctionInstantiations *getFunctionInstantiations() { return &mFunctionInstantiations; }
 
-    std::unordered_map<const TFunction *, const TFunction *> *getFunctionMap()
-    {
-        return &mFunctionMap;
-    }
+    angle::HashMap<const TFunction *, const TFunction *> *getFunctionMap() { return &mFunctionMap; }
 
   private:
     // This returns the name of a struct sampler reference. References are always TIntermBinary.
@@ -1024,13 +1021,13 @@
 class MonomorphizeTraverser final : public TIntermTraverser
 {
   public:
-    typedef std::unordered_map<const TVariable *, const TVariable *> VariableReplacementMap;
+    typedef angle::HashMap<const TVariable *, const TVariable *> VariableReplacementMap;
 
     explicit MonomorphizeTraverser(
         TCompiler *compiler,
         TSymbolTable *symbolTable,
         FunctionInstantiations *functionInstantiations,
-        std::unordered_map<const TFunction *, const TFunction *> *functionMap)
+        angle::HashMap<const TFunction *, const TFunction *> *functionMap)
         : TIntermTraverser(true, false, true, symbolTable),
           mFunctionInstantiations(*functionInstantiations),
           mFunctionMap(functionMap),
@@ -1131,7 +1128,7 @@
     FunctionInstantiations mGeneratedInstantiations;
     // New instantiations caused by other instantiations.
     FunctionInstantiations mPendingInstantiations;
-    std::unordered_map<const TFunction *, const TFunction *> *mFunctionMap;
+    angle::HashMap<const TFunction *, const TFunction *> *mFunctionMap;
     TIntermSequence mReplacementPrototypes;
     TCompiler *mCompiler;
     bool mSubpassesSucceeded;
@@ -1166,7 +1163,7 @@
             TSymbolTable *symbolTable,
             FunctionInstantiations *pendingInstantiations,
             FunctionInstantiations *generatedInstantiations,
-            std::unordered_map<const TFunction *, const TFunction *> *functionMap)
+            angle::HashMap<const TFunction *, const TFunction *> *functionMap)
             : TIntermTraverser(true, false, false, symbolTable),
               mPendingInstantiations(pendingInstantiations),
               mGeneratedInstantiations(generatedInstantiations),
@@ -1198,7 +1195,7 @@
       private:
         FunctionInstantiations *mPendingInstantiations;
         FunctionInstantiations *mGeneratedInstantiations;
-        std::unordered_map<const TFunction *, const TFunction *> *mFunctionMap;
+        angle::HashMap<const TFunction *, const TFunction *> *mFunctionMap;
     };
 };
 }  // anonymous namespace
diff --git a/src/compiler/translator/tree_util/FlipRotateSpecConst.cpp b/src/compiler/translator/tree_util/FlipRotateSpecConst.cpp
index 19fce12..86e9777 100644
--- a/src/compiler/translator/tree_util/FlipRotateSpecConst.cpp
+++ b/src/compiler/translator/tree_util/FlipRotateSpecConst.cpp
@@ -22,6 +22,8 @@
 {
 constexpr ImmutableString kSurfaceRotationSpecConstVarName =
     ImmutableString("ANGLESurfaceRotation");
+constexpr ImmutableString kDrawableWidthSpecConstVarName  = ImmutableString("ANGLEDrawableWidth");
+constexpr ImmutableString kDrawableHeightSpecConstVarName = ImmutableString("ANGLEDrawableHeight");
 
 // When an Android surface is rotated differently than the device's native orientation, ANGLE must
 // rotate gl_Position in the vertex shader and gl_FragCoord in the fragment shader.  The following
@@ -52,6 +54,19 @@
      {vk::SurfaceRotation::FlippedRotated180Degrees, {{1.0f, 0.0f, 0.0f, 1.0f}}},
      {vk::SurfaceRotation::FlippedRotated270Degrees, {{0.0f, 1.0f, 1.0f, 0.0f}}}}};
 
+// TODO: https://issuetracker.google.com/174066134. This is to make sure the specialization constant
+// code path behaves exactly the same as driver uniform code path. Not sure why this has to be
+// different from kFragRotationMatrices.
+constexpr Mat2x2EnumMap kHalfRenderAreaRotationMatrices = {
+    {{vk::SurfaceRotation::Identity, {{1.0f, 0.0f, 0.0f, 1.0f}}},
+     {vk::SurfaceRotation::Rotated90Degrees, {{0.0f, 1.0f, 1.0f, 0.0f}}},
+     {vk::SurfaceRotation::Rotated180Degrees, {{1.0f, 0.0f, 0.0f, 1.0f}}},
+     {vk::SurfaceRotation::Rotated270Degrees, {{1.0f, 0.0f, 0.0f, 1.0f}}},
+     {vk::SurfaceRotation::FlippedIdentity, {{1.0f, 0.0f, 0.0f, 1.0f}}},
+     {vk::SurfaceRotation::FlippedRotated90Degrees, {{0.0f, 1.0f, 1.0f, 0.0f}}},
+     {vk::SurfaceRotation::FlippedRotated180Degrees, {{1.0f, 0.0f, 0.0f, 1.0f}}},
+     {vk::SurfaceRotation::FlippedRotated270Degrees, {{1.0f, 0.0f, 0.0f, 1.0f}}}}};
+
 // Returns mat2(m0, m1, m2, m3)
 TIntermAggregate *CreateMat2x2(const Mat2x2EnumMap &matrix, vk::SurfaceRotation rotation)
 {
@@ -220,7 +235,7 @@
 }
 }  // anonymous namespace
 
-FlipRotateSpecConst::FlipRotateSpecConst() : mSpecConstSymbol(nullptr) {}
+FlipRotateSpecConst::FlipRotateSpecConst() : mSymbolTable(nullptr), mSpecConstSymbol(nullptr) {}
 
 FlipRotateSpecConst::~FlipRotateSpecConst()
 {
@@ -236,17 +251,29 @@
         new TVariable(symbolTable, kSurfaceRotationSpecConstVarName,
                       StaticType::GetBasic<EbtUInt>(), SymbolType::AngleInternal);
     mSpecConstSymbol = new TIntermSymbol(specConstVar);
+
+    mSymbolTable = symbolTable;
 }
 
 void FlipRotateSpecConst::outputLayoutString(TInfoSinkBase &sink) const
 {
     // Only emit specialized const layout string if it has been referenced.
-    if (mUsageBits.any())
+    if (mUsageBits.test(vk::SpecConstUsage::YFlip) || mUsageBits.test(vk::SpecConstUsage::Rotation))
     {
         sink << "layout(constant_id="
              << static_cast<uint32_t>(vk::SpecializationConstantId::SurfaceRotation)
              << ") const uint " << kSurfaceRotationSpecConstVarName << " = 0;\n\n";
     }
+
+    if (mUsageBits.test(vk::SpecConstUsage::DrawableSize))
+    {
+        sink << "layout(constant_id="
+             << static_cast<uint32_t>(vk::SpecializationConstantId::DrawableWidth)
+             << ") const uint " << kDrawableWidthSpecConstVarName << " = 0;\n\n";
+        sink << "layout(constant_id="
+             << static_cast<uint32_t>(vk::SpecializationConstantId::DrawableHeight)
+             << ") const uint " << kDrawableHeightSpecConstVarName << " = 0;\n\n";
+    }
 }
 
 TIntermTyped *FlipRotateSpecConst::getMultiplierXForDFdx()
@@ -313,6 +340,16 @@
     return GenerateMat2x2ArrayWithIndex(kFragRotationMatrices, mSpecConstSymbol);
 }
 
+TIntermTyped *FlipRotateSpecConst::getHalfRenderAreaRotationMatrix()
+{
+    if (!mSpecConstSymbol)
+    {
+        return nullptr;
+    }
+    mUsageBits.set(vk::SpecConstUsage::Rotation);
+    return GenerateMat2x2ArrayWithIndex(kHalfRenderAreaRotationMatrices, mSpecConstSymbol);
+}
+
 TIntermTyped *FlipRotateSpecConst::getFlipXY()
 {
     if (!mSpecConstSymbol)
@@ -383,4 +420,49 @@
     return CreateVec2ArrayWithIndex(kFragRotationMultiplyFlipXY, 1.0, mSpecConstSymbol);
 }
 
+TIntermSymbol *FlipRotateSpecConst::getDrawableWidth()
+{
+    TVariable *widthSpecConstVar =
+        new TVariable(mSymbolTable, kDrawableWidthSpecConstVarName,
+                      StaticType::GetBasic<EbtFloat>(), SymbolType::AngleInternal);
+    TIntermSymbol *drawableWidth = new TIntermSymbol(widthSpecConstVar);
+    return drawableWidth;
+}
+
+TIntermSymbol *FlipRotateSpecConst::getDrawableHeight()
+{
+    TVariable *heightSpecConstVar =
+        new TVariable(mSymbolTable, kDrawableHeightSpecConstVarName,
+                      StaticType::GetBasic<EbtFloat>(), SymbolType::AngleInternal);
+    TIntermSymbol *drawableHeight = new TIntermSymbol(heightSpecConstVar);
+    return drawableHeight;
+}
+
+TIntermBinary *FlipRotateSpecConst::getHalfRenderArea()
+{
+    if (!mSymbolTable)
+    {
+        return nullptr;
+    }
+
+    // vec2 drawableSize(drawableWidth, drawableHeight)
+    auto vec2Type                    = new TType(EbtFloat, 2);
+    TIntermSequence *widthHeightArgs = new TIntermSequence();
+    widthHeightArgs->push_back(getDrawableWidth());
+    widthHeightArgs->push_back(getDrawableHeight());
+    TIntermAggregate *drawableSize =
+        TIntermAggregate::CreateConstructor(*vec2Type, widthHeightArgs);
+
+    // drawableSize * 0.5f
+    TIntermBinary *halfRenderArea =
+        new TIntermBinary(EOpVectorTimesScalar, drawableSize, CreateFloatNode(0.5));
+    mUsageBits.set(vk::SpecConstUsage::DrawableSize);
+
+    // drawableSize * 0.5f * halfRenderAreaRotationMatrix (See comment in
+    // kHalfRenderAreaRotationMatrices)
+    TIntermBinary *rotatedHalfRenderArea =
+        new TIntermBinary(EOpMatrixTimesVector, getHalfRenderAreaRotationMatrix(), halfRenderArea);
+
+    return rotatedHalfRenderArea;
+}
 }  // namespace sh
diff --git a/src/compiler/translator/tree_util/FlipRotateSpecConst.h b/src/compiler/translator/tree_util/FlipRotateSpecConst.h
index 3ff792b..01341af 100644
--- a/src/compiler/translator/tree_util/FlipRotateSpecConst.h
+++ b/src/compiler/translator/tree_util/FlipRotateSpecConst.h
@@ -38,12 +38,18 @@
     TIntermTyped *getFlipY();
     TIntermTyped *getNegFlipY();
     TIntermTyped *getFragRotationMultiplyFlipXY();
+    TIntermBinary *getHalfRenderArea();
+    TIntermTyped *getHalfRenderAreaRotationMatrix();
 
     void generateSymbol(TSymbolTable *symbolTable);
     void outputLayoutString(TInfoSinkBase &sink) const;
     SpecConstUsageBits getSpecConstUsageBits() const { return mUsageBits; }
 
   private:
+    TIntermSymbol *getDrawableWidth();
+    TIntermSymbol *getDrawableHeight();
+
+    TSymbolTable *mSymbolTable;
     TIntermSymbol *mSpecConstSymbol;
     // Bit is set if YFlip or Rotation has been used
     SpecConstUsageBits mUsageBits;
diff --git a/src/compiler/translator/tree_util/ReplaceVariable.h b/src/compiler/translator/tree_util/ReplaceVariable.h
index cfe0f47..ccc3176 100644
--- a/src/compiler/translator/tree_util/ReplaceVariable.h
+++ b/src/compiler/translator/tree_util/ReplaceVariable.h
@@ -124,18 +124,18 @@
 
   private:
     // A map from the old global variable to the new one.
-    std::unordered_map<const TVariable *, TVariable *> mReplacedGlobalVariables;
+    angle::HashMap<const TVariable *, TVariable *> mReplacedGlobalVariables;
 
     // A map from functions with old type parameters to one where that's replaced with the new type.
-    std::unordered_map<const TFunction *, TFunction *> mReplacedFunctions;
+    angle::HashMap<const TFunction *, TFunction *> mReplacedFunctions;
 
     // A map from function old type parameters to their replacement new type parameter for the
     // current function definition.
-    std::unordered_map<const TVariable *, TVariable *> mReplacedFunctionParams;
+    angle::HashMap<const TVariable *, TVariable *> mReplacedFunctionParams;
 
     // A map from function call old type arguments to their replacement for the current function
     // call.
-    std::stack<std::unordered_map<const TIntermNode *, TIntermTyped *>> mReplacedFunctionCallArgs;
+    std::stack<angle::HashMap<const TIntermNode *, TIntermTyped *>> mReplacedFunctionCallArgs;
 };
 
 }  // namespace sh
diff --git a/src/compiler/translator/util.cpp b/src/compiler/translator/util.cpp
index 346470e..c0a4fc4 100644
--- a/src/compiler/translator/util.cpp
+++ b/src/compiler/translator/util.cpp
@@ -551,6 +551,8 @@
         case EvqCentroidOut:
         case EvqVertexOut:
         case EvqGeometryOut:
+        case EvqTessControlOut:
+        case EvqTessEvaluationOut:
         case EvqSampleOut:
             return true;
 
@@ -572,6 +574,8 @@
         case EvqCentroidIn:
         case EvqFragmentIn:
         case EvqGeometryIn:
+        case EvqTessControlIn:
+        case EvqTessEvaluationIn:
         case EvqSampleIn:
             return true;
 
@@ -630,6 +634,24 @@
     }
 }
 
+// a field may not have qualifer without in or out.
+InterpolationType GetFieldInterpolationType(TQualifier qualifier)
+{
+    switch (qualifier)
+    {
+        case EvqFlat:
+            return INTERPOLATION_FLAT;
+        case EvqNoPerspective:
+            return INTERPOLATION_NOPERSPECTIVE;
+        case EvqSmooth:
+            return INTERPOLATION_SMOOTH;
+        case EvqCentroid:
+            return INTERPOLATION_CENTROID;
+        default:
+            return GetInterpolationType(qualifier);
+    }
+}
+
 TType GetShaderVariableBasicType(const sh::ShaderVariable &var)
 {
     switch (var.type)
diff --git a/src/compiler/translator/util.h b/src/compiler/translator/util.h
index 53ee755..095e709 100644
--- a/src/compiler/translator/util.h
+++ b/src/compiler/translator/util.h
@@ -56,6 +56,7 @@
 bool IsVarying(TQualifier qualifier);
 bool IsGeometryShaderInput(GLenum shaderType, TQualifier qualifier);
 InterpolationType GetInterpolationType(TQualifier qualifier);
+InterpolationType GetFieldInterpolationType(TQualifier qualifier);
 
 // Returns array brackets including size with outermost array size first, as specified in GLSL ES
 // 3.10 section 4.1.9.
diff --git a/src/gpu_info_util/SystemInfo_ios.cpp b/src/gpu_info_util/SystemInfo_ios.cpp
index 6cdcd80..f0e52fd 100644
--- a/src/gpu_info_util/SystemInfo_ios.cpp
+++ b/src/gpu_info_util/SystemInfo_ios.cpp
@@ -19,8 +19,9 @@
 {
     {
         // TODO(anglebug.com/4275): Get the actual system version and GPU info.
-        info->machineModelVersion          = "0.0";
-        info->gpus.emplace_back().vendorId = kVendorID_Apple;
+        info->machineModelVersion = "0.0";
+        info->gpus.emplace_back();
+        info->gpus[0].vendorId = kVendorID_Apple;
     }
 
     return true;
diff --git a/src/libANGLE/Caps.cpp b/src/libANGLE/Caps.cpp
index c09e560..3d13c44 100644
--- a/src/libANGLE/Caps.cpp
+++ b/src/libANGLE/Caps.cpp
@@ -965,6 +965,7 @@
         map["GL_ANGLE_translated_shader_source"] = esOnlyExtension(&Extensions::translatedShaderSource);
         map["GL_OES_fbo_render_mipmap"] = enableableExtension(&Extensions::fboRenderMipmapOES);
         map["GL_EXT_discard_framebuffer"] = esOnlyExtension(&Extensions::discardFramebuffer);
+        map["GL_EXT_debug_label"] = esOnlyExtension(&Extensions::debugLabel);
         map["GL_EXT_debug_marker"] = esOnlyExtension(&Extensions::debugMarker);
         map["GL_OES_EGL_image"] = enableableExtension(&Extensions::eglImageOES);
         map["GL_OES_EGL_image_external"] = enableableExtension(&Extensions::eglImageExternalOES);
@@ -1047,11 +1048,14 @@
         map["GL_OES_texture_buffer"] = enableableExtension(&Extensions::textureBufferOES);
         map["GL_EXT_texture_buffer"] = enableableExtension(&Extensions::textureBufferEXT);
         map["GL_EXT_YUV_target"] = enableableExtension(&Extensions::yuvTargetEXT);
+        map["GL_OES_shader_io_blocks"] = enableableExtension(&Extensions::shaderIoBlocksOES);
+        map["GL_EXT_shader_io_blocks"] = enableableExtension(&Extensions::shaderIoBlocksEXT);
         // GLES1 extensions
         map["GL_OES_point_size_array"] = enableableExtension(&Extensions::pointSizeArrayOES);
         map["GL_OES_texture_cube_map"] = enableableExtension(&Extensions::textureCubeMapOES);
         map["GL_OES_point_sprite"] = enableableExtension(&Extensions::pointSpriteOES);
         map["GL_OES_draw_texture"] = enableableExtension(&Extensions::drawTextureOES);
+        map["GL_OES_framebuffer_object"] = enableableExtension(&Extensions::framebufferObjectOES);
         map["GL_ANGLE_memory_size"] = enableableExtension(&Extensions::memorySize);
         map["GL_EXT_shader_non_constant_global_initializers"] = enableableExtension(&Extensions::shaderNonConstGlobalInitializersEXT);
         map["GL_WEBGL_video_texture"] = enableableExtension(&Extensions::webglVideoTexture);
@@ -1375,7 +1379,6 @@
     InsertExtensionString("EGL_ANGLE_windows_ui_composition",                    windowsUIComposition,               &extensionStrings);
     InsertExtensionString("EGL_NV_post_sub_buffer",                              postSubBuffer,                      &extensionStrings);
     InsertExtensionString("EGL_KHR_create_context",                              createContext,                      &extensionStrings);
-    InsertExtensionString("EGL_EXT_device_query",                                deviceQuery,                        &extensionStrings);
     InsertExtensionString("EGL_KHR_image",                                       image,                              &extensionStrings);
     InsertExtensionString("EGL_KHR_image_base",                                  imageBase,                          &extensionStrings);
     InsertExtensionString("EGL_KHR_image_pixmap",                                imagePixmap,                        &extensionStrings);
@@ -1464,6 +1467,7 @@
     // clang-format off
     //                   | Extension name                                    | Supported flag                   | Output vector   |
     InsertExtensionString("EGL_EXT_client_extensions",                        clientExtensions,                   &extensionStrings);
+    InsertExtensionString("EGL_EXT_device_query",                             deviceQueryEXT,                        &extensionStrings);
     InsertExtensionString("EGL_EXT_platform_base",                            platformBase,                       &extensionStrings);
     InsertExtensionString("EGL_EXT_platform_device",                          platformDevice,                     &extensionStrings);
     InsertExtensionString("EGL_ANGLE_platform_angle",                         platformANGLE,                      &extensionStrings);
diff --git a/src/libANGLE/Caps.h b/src/libANGLE/Caps.h
index 2644c30..3fc0b4d 100644
--- a/src/libANGLE/Caps.h
+++ b/src/libANGLE/Caps.h
@@ -397,6 +397,9 @@
     // EXT_debug_marker
     bool debugMarker = false;
 
+    // EXT_debug_label
+    bool debugLabel = false;
+
     // GL_OES_EGL_image
     bool eglImageOES = false;
 
@@ -562,6 +565,9 @@
     // GL_OES_draw_texture
     bool drawTextureOES = false;
 
+    // GL_OES_framebuffer_object
+    bool framebufferObjectOES = false;
+
     // EGL_ANGLE_explicit_context GL subextensions
     // GL_ANGLE_explicit_context_gles1
     bool explicitContextGles1 = false;
@@ -627,6 +633,13 @@
     // GL_EXT_shader_non_constant_global_initializers
     bool shaderNonConstGlobalInitializersEXT = false;
 
+    // GL_OES_shader_io_blocks
+    bool shaderIoBlocksOES = false;
+    // GL_EXT_shader_io_blocks
+    bool shaderIoBlocksEXT = false;
+    // Any version of shader io block extension
+    bool shaderIoBlocksAny() const { return (shaderIoBlocksOES || shaderIoBlocksEXT); }
+
     // GL_EXT_gpu_shader5
     bool gpuShader5EXT = false;
     // WEBGL_video_texture
@@ -989,9 +1002,6 @@
     // EGL_KHR_create_context
     bool createContext = false;
 
-    // EGL_EXT_device_query
-    bool deviceQuery = false;
-
     // EGL_KHR_image
     bool image = false;
 
@@ -1266,6 +1276,9 @@
 
     // EGL_ANGLE_platform_angle_device_type_egl_angle
     bool platformANGLEDeviceTypeEGLANGLE = false;
+
+    // EGL_EXT_device_query
+    bool deviceQueryEXT = false;
 };
 
 }  // namespace egl
diff --git a/src/libANGLE/Compiler.cpp b/src/libANGLE/Compiler.cpp
index 1feed02..b995f12 100644
--- a/src/libANGLE/Compiler.cpp
+++ b/src/libANGLE/Compiler.cpp
@@ -107,6 +107,8 @@
     mResources.NV_shader_noperspective_interpolation = extensions.noperspectiveInterpolationNV;
     mResources.ARB_texture_rectangle                 = extensions.textureRectangle;
     mResources.EXT_gpu_shader5                       = extensions.gpuShader5EXT;
+    mResources.OES_shader_io_blocks                  = extensions.shaderIoBlocksOES;
+    mResources.EXT_shader_io_blocks                  = extensions.shaderIoBlocksEXT;
     mResources.OES_texture_storage_multisample_2d_array =
         extensions.textureStorageMultisample2DArrayOES;
     mResources.OES_texture_3D                  = extensions.texture3DOES;
diff --git a/src/libANGLE/Constants.h b/src/libANGLE/Constants.h
index 6298889..6966633 100644
--- a/src/libANGLE/Constants.h
+++ b/src/libANGLE/Constants.h
@@ -38,7 +38,9 @@
     IMPLEMENTATION_MAX_FRAGMENT_SHADER_UNIFORM_BUFFERS = 16,
     IMPLEMENTATION_MAX_COMPUTE_SHADER_UNIFORM_BUFFERS  = 16,
     // GL_EXT_geometry_shader increases the minimum value of GL_MAX_COMBINED_UNIFORM_BLOCKS to 36.
-    IMPLEMENTATION_MAX_COMBINED_SHADER_UNIFORM_BUFFERS = 36,
+    // GL_EXT_tessellation_shader increases the minimum value of GL_MAX_COMBINED_UNIFORM_BLOCKS
+    // to 60.
+    IMPLEMENTATION_MAX_COMBINED_SHADER_UNIFORM_BUFFERS = 60,
 
     // GL_EXT_geometry_shader increases the minimum value of GL_MAX_UNIFORM_BUFFER_BINDINGS to 48.
     // Vulkan's minimum value for maxDescriptorSetUniformBuffers is 72 so allow exposing up to that
diff --git a/src/libANGLE/Context.cpp b/src/libANGLE/Context.cpp
index 73fbc1c..bffc248 100644
--- a/src/libANGLE/Context.cpp
+++ b/src/libANGLE/Context.cpp
@@ -782,14 +782,14 @@
 
 GLuint Context::createShaderProgramv(ShaderType type, GLsizei count, const GLchar *const *strings)
 {
-    const ShaderProgramID shaderID = FromGL<ShaderProgramID>(createShader(type));
+    const ShaderProgramID shaderID = PackParam<ShaderProgramID>(createShader(type));
     if (shaderID.value)
     {
         Shader *shaderObject = getShader(shaderID);
         ASSERT(shaderObject);
         shaderObject->setSource(count, strings, nullptr);
         shaderObject->compile(this);
-        const ShaderProgramID programID = FromGL<ShaderProgramID>(createProgram());
+        const ShaderProgramID programID = PackParam<ShaderProgramID>(createProgram());
         if (programID.value)
         {
             gl::Program *programObject = getProgramNoResolveLink(programID);
@@ -999,14 +999,19 @@
     switch (identifier)
     {
         case GL_BUFFER:
+        case GL_BUFFER_OBJECT_EXT:
             return getBuffer({name});
         case GL_SHADER:
+        case GL_SHADER_OBJECT_EXT:
             return getShader({name});
         case GL_PROGRAM:
+        case GL_PROGRAM_OBJECT_EXT:
             return getProgramNoResolveLink({name});
         case GL_VERTEX_ARRAY:
+        case GL_VERTEX_ARRAY_OBJECT_EXT:
             return getVertexArray({name});
         case GL_QUERY:
+        case GL_QUERY_OBJECT_EXT:
             return getQuery({name});
         case GL_TRANSFORM_FEEDBACK:
             return getTransformFeedback({name});
@@ -1019,6 +1024,7 @@
         case GL_FRAMEBUFFER:
             return getFramebuffer({name});
         case GL_PROGRAM_PIPELINE:
+        case GL_PROGRAM_PIPELINE_OBJECT_EXT:
             return getProgramPipeline({name});
         default:
             UNREACHABLE();
@@ -1044,6 +1050,21 @@
     mState.setObjectDirty(identifier);
 }
 
+void Context::labelObject(GLenum type, GLuint object, GLsizei length, const GLchar *label)
+{
+    gl::LabeledObject *obj = getLabeledObject(type, object);
+    ASSERT(obj != nullptr);
+
+    std::string labelName = "";
+    if (label != nullptr)
+    {
+        size_t labelLength = length == 0 ? strlen(label) : length;
+        labelName          = std::string(label, labelLength);
+    }
+    obj->setLabel(this, labelName);
+    mState.setObjectDirty(type);
+}
+
 void Context::objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
 {
     gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
@@ -2614,7 +2635,7 @@
     return ToGLenum(mResetStatus);
 }
 
-bool Context::isResetNotificationEnabled()
+bool Context::isResetNotificationEnabled() const
 {
     return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
 }
@@ -3179,6 +3200,7 @@
         supportedExtensions.textureCubeMapOES     = true;
         supportedExtensions.pointSpriteOES        = true;
         supportedExtensions.drawTextureOES        = true;
+        supportedExtensions.framebufferObjectOES  = true;
         supportedExtensions.parallelShaderCompile = false;
         supportedExtensions.texture3DOES          = false;
     }
@@ -3288,6 +3310,9 @@
     supportedExtensions.maxDebugGroupStackDepth = 1024;
     supportedExtensions.maxLabelLength          = 1024;
 
+    // Explicitly enable GL_EXT_debug_label
+    supportedExtensions.debugLabel = true;
+
     // Explicitly enable GL_ANGLE_robust_client_memory if the context supports validation.
     supportedExtensions.robustClientMemory = !mSkipValidation;
 
@@ -3543,6 +3568,11 @@
                << std::endl;
         mState.mExtensions.mapBufferRange = false;
         mState.mExtensions.mapBufferOES   = false;
+
+        INFO() << "Disabling GL_CHROMIUM_bind_uniform_location during capture, which is not "
+                  "supported on native drivers"
+               << std::endl;
+        mState.mExtensions.bindUniformLocation = false;
     }
 
     // Disable support for OES_get_program_binary
@@ -4169,11 +4199,11 @@
     if (srcTarget == GL_RENDERBUFFER)
     {
         // Source target is a Renderbuffer
-        Renderbuffer *readBuffer = getRenderbuffer(FromGL<RenderbufferID>(srcName));
+        Renderbuffer *readBuffer = getRenderbuffer(PackParam<RenderbufferID>(srcName));
         if (dstTarget == GL_RENDERBUFFER)
         {
             // Destination target is a Renderbuffer
-            Renderbuffer *writeBuffer = getRenderbuffer(FromGL<RenderbufferID>(dstName));
+            Renderbuffer *writeBuffer = getRenderbuffer(PackParam<RenderbufferID>(dstName));
 
             // Copy Renderbuffer to Renderbuffer
             ANGLE_CONTEXT_TRY(writeBuffer->copyRenderbufferSubData(
@@ -4186,7 +4216,7 @@
             ASSERT(dstTarget == GL_TEXTURE_2D || dstTarget == GL_TEXTURE_2D_ARRAY ||
                    dstTarget == GL_TEXTURE_3D || dstTarget == GL_TEXTURE_CUBE_MAP);
 
-            Texture *writeTexture = getTexture(FromGL<TextureID>(dstName));
+            Texture *writeTexture = getTexture(PackParam<TextureID>(dstName));
             ANGLE_CONTEXT_TRY(syncTextureForCopy(writeTexture));
 
             // Copy Renderbuffer to Texture
@@ -4201,13 +4231,13 @@
         ASSERT(srcTarget == GL_TEXTURE_2D || srcTarget == GL_TEXTURE_2D_ARRAY ||
                srcTarget == GL_TEXTURE_3D || srcTarget == GL_TEXTURE_CUBE_MAP);
 
-        Texture *readTexture = getTexture(FromGL<TextureID>(srcName));
+        Texture *readTexture = getTexture(PackParam<TextureID>(srcName));
         ANGLE_CONTEXT_TRY(syncTextureForCopy(readTexture));
 
         if (dstTarget == GL_RENDERBUFFER)
         {
             // Destination target is a Renderbuffer
-            Renderbuffer *writeBuffer = getRenderbuffer(FromGL<RenderbufferID>(dstName));
+            Renderbuffer *writeBuffer = getRenderbuffer(PackParam<RenderbufferID>(dstName));
 
             // Copy Texture to Renderbuffer
             ANGLE_CONTEXT_TRY(writeBuffer->copyTextureSubData(this, readTexture, srcLevel, srcX,
@@ -4220,7 +4250,7 @@
             ASSERT(dstTarget == GL_TEXTURE_2D || dstTarget == GL_TEXTURE_2D_ARRAY ||
                    dstTarget == GL_TEXTURE_3D || dstTarget == GL_TEXTURE_CUBE_MAP);
 
-            Texture *writeTexture = getTexture(FromGL<TextureID>(dstName));
+            Texture *writeTexture = getTexture(PackParam<TextureID>(dstName));
             ANGLE_CONTEXT_TRY(syncTextureForCopy(writeTexture));
 
             // Copy Texture to Texture
diff --git a/src/libANGLE/Context.h b/src/libANGLE/Context.h
index fa1ca4b..8c30a2e 100644
--- a/src/libANGLE/Context.h
+++ b/src/libANGLE/Context.h
@@ -20,25 +20,10 @@
 #include "common/angleutils.h"
 #include "libANGLE/Caps.h"
 #include "libANGLE/Constants.h"
-#include "libANGLE/Context_gl_1_0_autogen.h"
-#include "libANGLE/Context_gl_1_1_autogen.h"
-#include "libANGLE/Context_gl_1_2_autogen.h"
-#include "libANGLE/Context_gl_1_3_autogen.h"
-#include "libANGLE/Context_gl_1_4_autogen.h"
-#include "libANGLE/Context_gl_1_5_autogen.h"
-#include "libANGLE/Context_gl_2_0_autogen.h"
-#include "libANGLE/Context_gl_2_1_autogen.h"
-#include "libANGLE/Context_gl_3_0_autogen.h"
-#include "libANGLE/Context_gl_3_1_autogen.h"
-#include "libANGLE/Context_gl_3_2_autogen.h"
-#include "libANGLE/Context_gl_3_3_autogen.h"
-#include "libANGLE/Context_gl_4_0_autogen.h"
-#include "libANGLE/Context_gl_4_1_autogen.h"
-#include "libANGLE/Context_gl_4_2_autogen.h"
-#include "libANGLE/Context_gl_4_3_autogen.h"
-#include "libANGLE/Context_gl_4_4_autogen.h"
-#include "libANGLE/Context_gl_4_5_autogen.h"
-#include "libANGLE/Context_gl_4_6_autogen.h"
+#include "libANGLE/Context_gl_1_autogen.h"
+#include "libANGLE/Context_gl_2_autogen.h"
+#include "libANGLE/Context_gl_3_autogen.h"
+#include "libANGLE/Context_gl_4_autogen.h"
 #include "libANGLE/Context_gles_1_0_autogen.h"
 #include "libANGLE/Context_gles_2_0_autogen.h"
 #include "libANGLE/Context_gles_3_0_autogen.h"
@@ -434,28 +419,13 @@
 
     bool hasActiveTransformFeedback(ShaderProgramID program) const;
 
-    // GL emulation: Interface to entry points
-    ANGLE_GL_1_0_CONTEXT_API
-    ANGLE_GL_1_1_CONTEXT_API
-    ANGLE_GL_1_2_CONTEXT_API
-    ANGLE_GL_1_3_CONTEXT_API
-    ANGLE_GL_1_4_CONTEXT_API
-    ANGLE_GL_1_5_CONTEXT_API
-    ANGLE_GL_2_0_CONTEXT_API
-    ANGLE_GL_2_1_CONTEXT_API
-    ANGLE_GL_3_0_CONTEXT_API
-    ANGLE_GL_3_1_CONTEXT_API
-    ANGLE_GL_3_2_CONTEXT_API
-    ANGLE_GL_3_3_CONTEXT_API
-    ANGLE_GL_4_0_CONTEXT_API
-    ANGLE_GL_4_1_CONTEXT_API
-    ANGLE_GL_4_2_CONTEXT_API
-    ANGLE_GL_4_3_CONTEXT_API
-    ANGLE_GL_4_4_CONTEXT_API
-    ANGLE_GL_4_5_CONTEXT_API
-    ANGLE_GL_4_6_CONTEXT_API
+    // Desktop GL entry point interface
+    ANGLE_GL_1_CONTEXT_API
+    ANGLE_GL_2_CONTEXT_API
+    ANGLE_GL_3_CONTEXT_API
+    ANGLE_GL_4_CONTEXT_API
 
-    // GLES emulation: Interface to entry points
+    // GLES entry point interface
     ANGLE_GLES_1_0_CONTEXT_API
     ANGLE_GLES_2_0_CONTEXT_API
     ANGLE_GLES_3_0_CONTEXT_API
@@ -478,7 +448,7 @@
     void setContextLost();
 
     GLenum getGraphicsResetStrategy() const { return mResetStrategy; }
-    bool isResetNotificationEnabled();
+    bool isResetNotificationEnabled() const;
 
     const egl::Config *getConfig() const;
     EGLenum getClientType() const;
diff --git a/src/libANGLE/Context_gl_1_1_autogen.h b/src/libANGLE/Context_gl_1_1_autogen.h
deleted file mode 100644
index 7424752..0000000
--- a/src/libANGLE/Context_gl_1_1_autogen.h
+++ /dev/null
@@ -1,31 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Context_gl_1_1_autogen.h: Creates a macro for interfaces in Context.
-
-#ifndef ANGLE_CONTEXT_GL_1_1_AUTOGEN_H_
-#define ANGLE_CONTEXT_GL_1_1_AUTOGEN_H_
-
-#define ANGLE_GL_1_1_CONTEXT_API                                                                \
-    GLboolean areTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences);    \
-    void arrayElement(GLint i);                                                                 \
-    void copyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y,    \
-                        GLsizei width, GLint border);                                           \
-    void copyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y,         \
-                           GLsizei width);                                                      \
-    void edgeFlagPointer(GLsizei stride, const void *pointer);                                  \
-    void indexPointer(GLenum type, GLsizei stride, const void *pointer);                        \
-    void indexub(GLubyte c);                                                                    \
-    void indexubv(const GLubyte *c);                                                            \
-    void interleavedArrays(GLenum format, GLsizei stride, const void *pointer);                 \
-    void popClientAttrib();                                                                     \
-    void prioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities);      \
-    void pushClientAttrib(GLbitfield mask);                                                     \
-    void texSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, \
-                       GLenum type, const void *pixels);
-
-#endif  // ANGLE_CONTEXT_API_1_1_AUTOGEN_H_
diff --git a/src/libANGLE/Context_gl_1_2_autogen.h b/src/libANGLE/Context_gl_1_2_autogen.h
deleted file mode 100644
index 56888dd..0000000
--- a/src/libANGLE/Context_gl_1_2_autogen.h
+++ /dev/null
@@ -1,15 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Context_gl_1_2_autogen.h: Creates a macro for interfaces in Context.
-
-#ifndef ANGLE_CONTEXT_GL_1_2_AUTOGEN_H_
-#define ANGLE_CONTEXT_GL_1_2_AUTOGEN_H_
-
-#define ANGLE_GL_1_2_CONTEXT_API
-
-#endif  // ANGLE_CONTEXT_API_1_2_AUTOGEN_H_
diff --git a/src/libANGLE/Context_gl_1_3_autogen.h b/src/libANGLE/Context_gl_1_3_autogen.h
deleted file mode 100644
index b64e0fc..0000000
--- a/src/libANGLE/Context_gl_1_3_autogen.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Context_gl_1_3_autogen.h: Creates a macro for interfaces in Context.
-
-#ifndef ANGLE_CONTEXT_GL_1_3_AUTOGEN_H_
-#define ANGLE_CONTEXT_GL_1_3_AUTOGEN_H_
-
-#define ANGLE_GL_1_3_CONTEXT_API                                                                \
-    void compressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, \
-                              GLint border, GLsizei imageSize, const void *data);               \
-    void compressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width,      \
-                                 GLenum format, GLsizei imageSize, const void *data);           \
-    void getCompressedTexImage(GLenum target, GLint level, void *img);                          \
-    void loadTransposeMatrixd(const GLdouble *m);                                               \
-    void loadTransposeMatrixf(const GLfloat *m);                                                \
-    void multTransposeMatrixd(const GLdouble *m);                                               \
-    void multTransposeMatrixf(const GLfloat *m);                                                \
-    void multiTexCoord1d(GLenum target, GLdouble s);                                            \
-    void multiTexCoord1dv(GLenum target, const GLdouble *v);                                    \
-    void multiTexCoord1f(GLenum target, GLfloat s);                                             \
-    void multiTexCoord1fv(GLenum target, const GLfloat *v);                                     \
-    void multiTexCoord1i(GLenum target, GLint s);                                               \
-    void multiTexCoord1iv(GLenum target, const GLint *v);                                       \
-    void multiTexCoord1s(GLenum target, GLshort s);                                             \
-    void multiTexCoord1sv(GLenum target, const GLshort *v);                                     \
-    void multiTexCoord2d(GLenum target, GLdouble s, GLdouble t);                                \
-    void multiTexCoord2dv(GLenum target, const GLdouble *v);                                    \
-    void multiTexCoord2f(GLenum target, GLfloat s, GLfloat t);                                  \
-    void multiTexCoord2fv(GLenum target, const GLfloat *v);                                     \
-    void multiTexCoord2i(GLenum target, GLint s, GLint t);                                      \
-    void multiTexCoord2iv(GLenum target, const GLint *v);                                       \
-    void multiTexCoord2s(GLenum target, GLshort s, GLshort t);                                  \
-    void multiTexCoord2sv(GLenum target, const GLshort *v);                                     \
-    void multiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r);                    \
-    void multiTexCoord3dv(GLenum target, const GLdouble *v);                                    \
-    void multiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r);                       \
-    void multiTexCoord3fv(GLenum target, const GLfloat *v);                                     \
-    void multiTexCoord3i(GLenum target, GLint s, GLint t, GLint r);                             \
-    void multiTexCoord3iv(GLenum target, const GLint *v);                                       \
-    void multiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r);                       \
-    void multiTexCoord3sv(GLenum target, const GLshort *v);                                     \
-    void multiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);        \
-    void multiTexCoord4dv(GLenum target, const GLdouble *v);                                    \
-    void multiTexCoord4fv(GLenum target, const GLfloat *v);                                     \
-    void multiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q);                    \
-    void multiTexCoord4iv(GLenum target, const GLint *v);                                       \
-    void multiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);            \
-    void multiTexCoord4sv(GLenum target, const GLshort *v);
-
-#endif  // ANGLE_CONTEXT_API_1_3_AUTOGEN_H_
diff --git a/src/libANGLE/Context_gl_1_4_autogen.h b/src/libANGLE/Context_gl_1_4_autogen.h
deleted file mode 100644
index bf14379..0000000
--- a/src/libANGLE/Context_gl_1_4_autogen.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Context_gl_1_4_autogen.h: Creates a macro for interfaces in Context.
-
-#ifndef ANGLE_CONTEXT_GL_1_4_AUTOGEN_H_
-#define ANGLE_CONTEXT_GL_1_4_AUTOGEN_H_
-
-#define ANGLE_GL_1_4_CONTEXT_API                                                              \
-    void fogCoordPointer(GLenum type, GLsizei stride, const void *pointer);                   \
-    void fogCoordd(GLdouble coord);                                                           \
-    void fogCoorddv(const GLdouble *coord);                                                   \
-    void fogCoordf(GLfloat coord);                                                            \
-    void fogCoordfv(const GLfloat *coord);                                                    \
-    void pointParameteri(GLenum pname, GLint param);                                          \
-    void pointParameteriv(GLenum pname, const GLint *params);                                 \
-    void secondaryColor3b(GLbyte red, GLbyte green, GLbyte blue);                             \
-    void secondaryColor3bv(const GLbyte *v);                                                  \
-    void secondaryColor3d(GLdouble red, GLdouble green, GLdouble blue);                       \
-    void secondaryColor3dv(const GLdouble *v);                                                \
-    void secondaryColor3f(GLfloat red, GLfloat green, GLfloat blue);                          \
-    void secondaryColor3fv(const GLfloat *v);                                                 \
-    void secondaryColor3i(GLint red, GLint green, GLint blue);                                \
-    void secondaryColor3iv(const GLint *v);                                                   \
-    void secondaryColor3s(GLshort red, GLshort green, GLshort blue);                          \
-    void secondaryColor3sv(const GLshort *v);                                                 \
-    void secondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue);                         \
-    void secondaryColor3ubv(const GLubyte *v);                                                \
-    void secondaryColor3ui(GLuint red, GLuint green, GLuint blue);                            \
-    void secondaryColor3uiv(const GLuint *v);                                                 \
-    void secondaryColor3us(GLushort red, GLushort green, GLushort blue);                      \
-    void secondaryColor3usv(const GLushort *v);                                               \
-    void secondaryColorPointer(GLint size, GLenum type, GLsizei stride, const void *pointer); \
-    void windowPos2d(GLdouble x, GLdouble y);                                                 \
-    void windowPos2dv(const GLdouble *v);                                                     \
-    void windowPos2f(GLfloat x, GLfloat y);                                                   \
-    void windowPos2fv(const GLfloat *v);                                                      \
-    void windowPos2i(GLint x, GLint y);                                                       \
-    void windowPos2iv(const GLint *v);                                                        \
-    void windowPos2s(GLshort x, GLshort y);                                                   \
-    void windowPos2sv(const GLshort *v);                                                      \
-    void windowPos3d(GLdouble x, GLdouble y, GLdouble z);                                     \
-    void windowPos3dv(const GLdouble *v);                                                     \
-    void windowPos3f(GLfloat x, GLfloat y, GLfloat z);                                        \
-    void windowPos3fv(const GLfloat *v);                                                      \
-    void windowPos3i(GLint x, GLint y, GLint z);                                              \
-    void windowPos3iv(const GLint *v);                                                        \
-    void windowPos3s(GLshort x, GLshort y, GLshort z);                                        \
-    void windowPos3sv(const GLshort *v);
-
-#endif  // ANGLE_CONTEXT_API_1_4_AUTOGEN_H_
diff --git a/src/libANGLE/Context_gl_1_5_autogen.h b/src/libANGLE/Context_gl_1_5_autogen.h
deleted file mode 100644
index fdc53fa..0000000
--- a/src/libANGLE/Context_gl_1_5_autogen.h
+++ /dev/null
@@ -1,16 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Context_gl_1_5_autogen.h: Creates a macro for interfaces in Context.
-
-#ifndef ANGLE_CONTEXT_GL_1_5_AUTOGEN_H_
-#define ANGLE_CONTEXT_GL_1_5_AUTOGEN_H_
-
-#define ANGLE_GL_1_5_CONTEXT_API \
-    void getBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, void *data);
-
-#endif  // ANGLE_CONTEXT_API_1_5_AUTOGEN_H_
diff --git a/src/libANGLE/Context_gl_1_0_autogen.h b/src/libANGLE/Context_gl_1_autogen.h
similarity index 70%
rename from src/libANGLE/Context_gl_1_0_autogen.h
rename to src/libANGLE/Context_gl_1_autogen.h
index 8707bef..724ca49 100644
--- a/src/libANGLE/Context_gl_1_0_autogen.h
+++ b/src/libANGLE/Context_gl_1_autogen.h
@@ -5,12 +5,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// Context_gl_1_0_autogen.h: Creates a macro for interfaces in Context.
+// Context_gl_1_autogen.h: Creates a macro for interfaces in Context.
 
-#ifndef ANGLE_CONTEXT_GL_1_0_AUTOGEN_H_
-#define ANGLE_CONTEXT_GL_1_0_AUTOGEN_H_
+#ifndef ANGLE_CONTEXT_GL_1_AUTOGEN_H_
+#define ANGLE_CONTEXT_GL_1_AUTOGEN_H_
 
-#define ANGLE_GL_1_0_CONTEXT_API                                                                   \
+#define ANGLE_GL_1_CONTEXT_API                                                                     \
     void accum(GLenum op, GLfloat value);                                                          \
     void begin(GLenum mode);                                                                       \
     void bitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove,        \
@@ -248,6 +248,103 @@
     void vertex4i(GLint x, GLint y, GLint z, GLint w);                                             \
     void vertex4iv(const GLint *v);                                                                \
     void vertex4s(GLshort x, GLshort y, GLshort z, GLshort w);                                     \
-    void vertex4sv(const GLshort *v);
+    void vertex4sv(const GLshort *v);                                                              \
+    GLboolean areTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences);       \
+    void arrayElement(GLint i);                                                                    \
+    void copyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y,       \
+                        GLsizei width, GLint border);                                              \
+    void copyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y,            \
+                           GLsizei width);                                                         \
+    void edgeFlagPointer(GLsizei stride, const void *pointer);                                     \
+    void indexPointer(GLenum type, GLsizei stride, const void *pointer);                           \
+    void indexub(GLubyte c);                                                                       \
+    void indexubv(const GLubyte *c);                                                               \
+    void interleavedArrays(GLenum format, GLsizei stride, const void *pointer);                    \
+    void popClientAttrib();                                                                        \
+    void prioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities);         \
+    void pushClientAttrib(GLbitfield mask);                                                        \
+    void texSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format,    \
+                       GLenum type, const void *pixels);                                           \
+    void compressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width,    \
+                              GLint border, GLsizei imageSize, const void *data);                  \
+    void compressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width,         \
+                                 GLenum format, GLsizei imageSize, const void *data);              \
+    void getCompressedTexImage(GLenum target, GLint level, void *img);                             \
+    void loadTransposeMatrixd(const GLdouble *m);                                                  \
+    void loadTransposeMatrixf(const GLfloat *m);                                                   \
+    void multTransposeMatrixd(const GLdouble *m);                                                  \
+    void multTransposeMatrixf(const GLfloat *m);                                                   \
+    void multiTexCoord1d(GLenum target, GLdouble s);                                               \
+    void multiTexCoord1dv(GLenum target, const GLdouble *v);                                       \
+    void multiTexCoord1f(GLenum target, GLfloat s);                                                \
+    void multiTexCoord1fv(GLenum target, const GLfloat *v);                                        \
+    void multiTexCoord1i(GLenum target, GLint s);                                                  \
+    void multiTexCoord1iv(GLenum target, const GLint *v);                                          \
+    void multiTexCoord1s(GLenum target, GLshort s);                                                \
+    void multiTexCoord1sv(GLenum target, const GLshort *v);                                        \
+    void multiTexCoord2d(GLenum target, GLdouble s, GLdouble t);                                   \
+    void multiTexCoord2dv(GLenum target, const GLdouble *v);                                       \
+    void multiTexCoord2f(GLenum target, GLfloat s, GLfloat t);                                     \
+    void multiTexCoord2fv(GLenum target, const GLfloat *v);                                        \
+    void multiTexCoord2i(GLenum target, GLint s, GLint t);                                         \
+    void multiTexCoord2iv(GLenum target, const GLint *v);                                          \
+    void multiTexCoord2s(GLenum target, GLshort s, GLshort t);                                     \
+    void multiTexCoord2sv(GLenum target, const GLshort *v);                                        \
+    void multiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r);                       \
+    void multiTexCoord3dv(GLenum target, const GLdouble *v);                                       \
+    void multiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r);                          \
+    void multiTexCoord3fv(GLenum target, const GLfloat *v);                                        \
+    void multiTexCoord3i(GLenum target, GLint s, GLint t, GLint r);                                \
+    void multiTexCoord3iv(GLenum target, const GLint *v);                                          \
+    void multiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r);                          \
+    void multiTexCoord3sv(GLenum target, const GLshort *v);                                        \
+    void multiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);           \
+    void multiTexCoord4dv(GLenum target, const GLdouble *v);                                       \
+    void multiTexCoord4fv(GLenum target, const GLfloat *v);                                        \
+    void multiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q);                       \
+    void multiTexCoord4iv(GLenum target, const GLint *v);                                          \
+    void multiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);               \
+    void multiTexCoord4sv(GLenum target, const GLshort *v);                                        \
+    void fogCoordPointer(GLenum type, GLsizei stride, const void *pointer);                        \
+    void fogCoordd(GLdouble coord);                                                                \
+    void fogCoorddv(const GLdouble *coord);                                                        \
+    void fogCoordf(GLfloat coord);                                                                 \
+    void fogCoordfv(const GLfloat *coord);                                                         \
+    void pointParameteri(GLenum pname, GLint param);                                               \
+    void pointParameteriv(GLenum pname, const GLint *params);                                      \
+    void secondaryColor3b(GLbyte red, GLbyte green, GLbyte blue);                                  \
+    void secondaryColor3bv(const GLbyte *v);                                                       \
+    void secondaryColor3d(GLdouble red, GLdouble green, GLdouble blue);                            \
+    void secondaryColor3dv(const GLdouble *v);                                                     \
+    void secondaryColor3f(GLfloat red, GLfloat green, GLfloat blue);                               \
+    void secondaryColor3fv(const GLfloat *v);                                                      \
+    void secondaryColor3i(GLint red, GLint green, GLint blue);                                     \
+    void secondaryColor3iv(const GLint *v);                                                        \
+    void secondaryColor3s(GLshort red, GLshort green, GLshort blue);                               \
+    void secondaryColor3sv(const GLshort *v);                                                      \
+    void secondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue);                              \
+    void secondaryColor3ubv(const GLubyte *v);                                                     \
+    void secondaryColor3ui(GLuint red, GLuint green, GLuint blue);                                 \
+    void secondaryColor3uiv(const GLuint *v);                                                      \
+    void secondaryColor3us(GLushort red, GLushort green, GLushort blue);                           \
+    void secondaryColor3usv(const GLushort *v);                                                    \
+    void secondaryColorPointer(GLint size, GLenum type, GLsizei stride, const void *pointer);      \
+    void windowPos2d(GLdouble x, GLdouble y);                                                      \
+    void windowPos2dv(const GLdouble *v);                                                          \
+    void windowPos2f(GLfloat x, GLfloat y);                                                        \
+    void windowPos2fv(const GLfloat *v);                                                           \
+    void windowPos2i(GLint x, GLint y);                                                            \
+    void windowPos2iv(const GLint *v);                                                             \
+    void windowPos2s(GLshort x, GLshort y);                                                        \
+    void windowPos2sv(const GLshort *v);                                                           \
+    void windowPos3d(GLdouble x, GLdouble y, GLdouble z);                                          \
+    void windowPos3dv(const GLdouble *v);                                                          \
+    void windowPos3f(GLfloat x, GLfloat y, GLfloat z);                                             \
+    void windowPos3fv(const GLfloat *v);                                                           \
+    void windowPos3i(GLint x, GLint y, GLint z);                                                   \
+    void windowPos3iv(const GLint *v);                                                             \
+    void windowPos3s(GLshort x, GLshort y, GLshort z);                                             \
+    void windowPos3sv(const GLshort *v);                                                           \
+    void getBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, void *data);
 
-#endif  // ANGLE_CONTEXT_API_1_0_AUTOGEN_H_
+#endif  // ANGLE_CONTEXT_API_1_AUTOGEN_H_
diff --git a/src/libANGLE/Context_gl_2_1_autogen.h b/src/libANGLE/Context_gl_2_1_autogen.h
deleted file mode 100644
index 73d3d07..0000000
--- a/src/libANGLE/Context_gl_2_1_autogen.h
+++ /dev/null
@@ -1,15 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Context_gl_2_1_autogen.h: Creates a macro for interfaces in Context.
-
-#ifndef ANGLE_CONTEXT_GL_2_1_AUTOGEN_H_
-#define ANGLE_CONTEXT_GL_2_1_AUTOGEN_H_
-
-#define ANGLE_GL_2_1_CONTEXT_API
-
-#endif  // ANGLE_CONTEXT_API_2_1_AUTOGEN_H_
diff --git a/src/libANGLE/Context_gl_2_0_autogen.h b/src/libANGLE/Context_gl_2_autogen.h
similarity index 91%
rename from src/libANGLE/Context_gl_2_0_autogen.h
rename to src/libANGLE/Context_gl_2_autogen.h
index f8a22a2..92e17d1 100644
--- a/src/libANGLE/Context_gl_2_0_autogen.h
+++ b/src/libANGLE/Context_gl_2_autogen.h
@@ -5,12 +5,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// Context_gl_2_0_autogen.h: Creates a macro for interfaces in Context.
+// Context_gl_2_autogen.h: Creates a macro for interfaces in Context.
 
-#ifndef ANGLE_CONTEXT_GL_2_0_AUTOGEN_H_
-#define ANGLE_CONTEXT_GL_2_0_AUTOGEN_H_
+#ifndef ANGLE_CONTEXT_GL_2_AUTOGEN_H_
+#define ANGLE_CONTEXT_GL_2_AUTOGEN_H_
 
-#define ANGLE_GL_2_0_CONTEXT_API                                                       \
+#define ANGLE_GL_2_CONTEXT_API                                                         \
     void getVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);              \
     void vertexAttrib1d(GLuint index, GLdouble x);                                     \
     void vertexAttrib1dv(GLuint index, const GLdouble *v);                             \
@@ -41,4 +41,4 @@
     void vertexAttrib4uiv(GLuint index, const GLuint *v);                              \
     void vertexAttrib4usv(GLuint index, const GLushort *v);
 
-#endif  // ANGLE_CONTEXT_API_2_0_AUTOGEN_H_
+#endif  // ANGLE_CONTEXT_API_2_AUTOGEN_H_
diff --git a/src/libANGLE/Context_gl_3_0_autogen.h b/src/libANGLE/Context_gl_3_0_autogen.h
deleted file mode 100644
index f0c6737..0000000
--- a/src/libANGLE/Context_gl_3_0_autogen.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Context_gl_3_0_autogen.h: Creates a macro for interfaces in Context.
-
-#ifndef ANGLE_CONTEXT_GL_3_0_AUTOGEN_H_
-#define ANGLE_CONTEXT_GL_3_0_AUTOGEN_H_
-
-#define ANGLE_GL_3_0_CONTEXT_API                                                               \
-    void beginConditionalRender(GLuint id, GLenum mode);                                       \
-    void clampColor(GLenum target, GLenum clamp);                                              \
-    void endConditionalRender();                                                               \
-    void framebufferTexture1D(GLenum target, GLenum attachment, TextureTarget textargetPacked, \
-                              TextureID texturePacked, GLint level);                           \
-    void vertexAttribI1i(GLuint index, GLint x);                                               \
-    void vertexAttribI1iv(GLuint index, const GLint *v);                                       \
-    void vertexAttribI1ui(GLuint index, GLuint x);                                             \
-    void vertexAttribI1uiv(GLuint index, const GLuint *v);                                     \
-    void vertexAttribI2i(GLuint index, GLint x, GLint y);                                      \
-    void vertexAttribI2iv(GLuint index, const GLint *v);                                       \
-    void vertexAttribI2ui(GLuint index, GLuint x, GLuint y);                                   \
-    void vertexAttribI2uiv(GLuint index, const GLuint *v);                                     \
-    void vertexAttribI3i(GLuint index, GLint x, GLint y, GLint z);                             \
-    void vertexAttribI3iv(GLuint index, const GLint *v);                                       \
-    void vertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z);                         \
-    void vertexAttribI3uiv(GLuint index, const GLuint *v);                                     \
-    void vertexAttribI4bv(GLuint index, const GLbyte *v);                                      \
-    void vertexAttribI4sv(GLuint index, const GLshort *v);                                     \
-    void vertexAttribI4ubv(GLuint index, const GLubyte *v);                                    \
-    void vertexAttribI4usv(GLuint index, const GLushort *v);
-
-#endif  // ANGLE_CONTEXT_API_3_0_AUTOGEN_H_
diff --git a/src/libANGLE/Context_gl_3_1_autogen.h b/src/libANGLE/Context_gl_3_1_autogen.h
deleted file mode 100644
index 90a4898..0000000
--- a/src/libANGLE/Context_gl_3_1_autogen.h
+++ /dev/null
@@ -1,18 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Context_gl_3_1_autogen.h: Creates a macro for interfaces in Context.
-
-#ifndef ANGLE_CONTEXT_GL_3_1_AUTOGEN_H_
-#define ANGLE_CONTEXT_GL_3_1_AUTOGEN_H_
-
-#define ANGLE_GL_3_1_CONTEXT_API                                                                   \
-    void getActiveUniformName(ShaderProgramID programPacked, GLuint uniformIndex, GLsizei bufSize, \
-                              GLsizei *length, GLchar *uniformName);                               \
-    void primitiveRestartIndex(GLuint index);
-
-#endif  // ANGLE_CONTEXT_API_3_1_AUTOGEN_H_
diff --git a/src/libANGLE/Context_gl_3_2_autogen.h b/src/libANGLE/Context_gl_3_2_autogen.h
deleted file mode 100644
index e2e5ee4..0000000
--- a/src/libANGLE/Context_gl_3_2_autogen.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Context_gl_3_2_autogen.h: Creates a macro for interfaces in Context.
-
-#ifndef ANGLE_CONTEXT_GL_3_2_AUTOGEN_H_
-#define ANGLE_CONTEXT_GL_3_2_AUTOGEN_H_
-
-#define ANGLE_GL_3_2_CONTEXT_API                                                               \
-    void texImage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat,          \
-                               GLsizei width, GLsizei height, GLboolean fixedsamplelocations); \
-    void texImage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat,          \
-                               GLsizei width, GLsizei height, GLsizei depth,                   \
-                               GLboolean fixedsamplelocations);
-
-#endif  // ANGLE_CONTEXT_API_3_2_AUTOGEN_H_
diff --git a/src/libANGLE/Context_gl_3_3_autogen.h b/src/libANGLE/Context_gl_3_3_autogen.h
deleted file mode 100644
index c715027..0000000
--- a/src/libANGLE/Context_gl_3_3_autogen.h
+++ /dev/null
@@ -1,53 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Context_gl_3_3_autogen.h: Creates a macro for interfaces in Context.
-
-#ifndef ANGLE_CONTEXT_GL_3_3_AUTOGEN_H_
-#define ANGLE_CONTEXT_GL_3_3_AUTOGEN_H_
-
-#define ANGLE_GL_3_3_CONTEXT_API                                                                  \
-    void colorP3ui(GLenum type, GLuint color);                                                    \
-    void colorP3uiv(GLenum type, const GLuint *color);                                            \
-    void colorP4ui(GLenum type, GLuint color);                                                    \
-    void colorP4uiv(GLenum type, const GLuint *color);                                            \
-    void multiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords);                           \
-    void multiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords);                   \
-    void multiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords);                           \
-    void multiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords);                   \
-    void multiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords);                           \
-    void multiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords);                   \
-    void multiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords);                           \
-    void multiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords);                   \
-    void normalP3ui(GLenum type, GLuint coords);                                                  \
-    void normalP3uiv(GLenum type, const GLuint *coords);                                          \
-    void secondaryColorP3ui(GLenum type, GLuint color);                                           \
-    void secondaryColorP3uiv(GLenum type, const GLuint *color);                                   \
-    void texCoordP1ui(GLenum type, GLuint coords);                                                \
-    void texCoordP1uiv(GLenum type, const GLuint *coords);                                        \
-    void texCoordP2ui(GLenum type, GLuint coords);                                                \
-    void texCoordP2uiv(GLenum type, const GLuint *coords);                                        \
-    void texCoordP3ui(GLenum type, GLuint coords);                                                \
-    void texCoordP3uiv(GLenum type, const GLuint *coords);                                        \
-    void texCoordP4ui(GLenum type, GLuint coords);                                                \
-    void texCoordP4uiv(GLenum type, const GLuint *coords);                                        \
-    void vertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);         \
-    void vertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value); \
-    void vertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);         \
-    void vertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value); \
-    void vertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);         \
-    void vertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value); \
-    void vertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);         \
-    void vertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value); \
-    void vertexP2ui(GLenum type, GLuint value);                                                   \
-    void vertexP2uiv(GLenum type, const GLuint *value);                                           \
-    void vertexP3ui(GLenum type, GLuint value);                                                   \
-    void vertexP3uiv(GLenum type, const GLuint *value);                                           \
-    void vertexP4ui(GLenum type, GLuint value);                                                   \
-    void vertexP4uiv(GLenum type, const GLuint *value);
-
-#endif  // ANGLE_CONTEXT_API_3_3_AUTOGEN_H_
diff --git a/src/libANGLE/Context_gl_3_autogen.h b/src/libANGLE/Context_gl_3_autogen.h
new file mode 100644
index 0000000..598a905
--- /dev/null
+++ b/src/libANGLE/Context_gl_3_autogen.h
@@ -0,0 +1,82 @@
+// GENERATED FILE - DO NOT EDIT.
+// Generated by generate_entry_points.py using data from gl.xml.
+//
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// Context_gl_3_autogen.h: Creates a macro for interfaces in Context.
+
+#ifndef ANGLE_CONTEXT_GL_3_AUTOGEN_H_
+#define ANGLE_CONTEXT_GL_3_AUTOGEN_H_
+
+#define ANGLE_GL_3_CONTEXT_API                                                                     \
+    void beginConditionalRender(GLuint id, GLenum mode);                                           \
+    void clampColor(GLenum target, GLenum clamp);                                                  \
+    void endConditionalRender();                                                                   \
+    void framebufferTexture1D(GLenum target, GLenum attachment, TextureTarget textargetPacked,     \
+                              TextureID texturePacked, GLint level);                               \
+    void vertexAttribI1i(GLuint index, GLint x);                                                   \
+    void vertexAttribI1iv(GLuint index, const GLint *v);                                           \
+    void vertexAttribI1ui(GLuint index, GLuint x);                                                 \
+    void vertexAttribI1uiv(GLuint index, const GLuint *v);                                         \
+    void vertexAttribI2i(GLuint index, GLint x, GLint y);                                          \
+    void vertexAttribI2iv(GLuint index, const GLint *v);                                           \
+    void vertexAttribI2ui(GLuint index, GLuint x, GLuint y);                                       \
+    void vertexAttribI2uiv(GLuint index, const GLuint *v);                                         \
+    void vertexAttribI3i(GLuint index, GLint x, GLint y, GLint z);                                 \
+    void vertexAttribI3iv(GLuint index, const GLint *v);                                           \
+    void vertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z);                             \
+    void vertexAttribI3uiv(GLuint index, const GLuint *v);                                         \
+    void vertexAttribI4bv(GLuint index, const GLbyte *v);                                          \
+    void vertexAttribI4sv(GLuint index, const GLshort *v);                                         \
+    void vertexAttribI4ubv(GLuint index, const GLubyte *v);                                        \
+    void vertexAttribI4usv(GLuint index, const GLushort *v);                                       \
+    void getActiveUniformName(ShaderProgramID programPacked, GLuint uniformIndex, GLsizei bufSize, \
+                              GLsizei *length, GLchar *uniformName);                               \
+    void primitiveRestartIndex(GLuint index);                                                      \
+    void texImage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat,              \
+                               GLsizei width, GLsizei height, GLboolean fixedsamplelocations);     \
+    void texImage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat,              \
+                               GLsizei width, GLsizei height, GLsizei depth,                       \
+                               GLboolean fixedsamplelocations);                                    \
+    void colorP3ui(GLenum type, GLuint color);                                                     \
+    void colorP3uiv(GLenum type, const GLuint *color);                                             \
+    void colorP4ui(GLenum type, GLuint color);                                                     \
+    void colorP4uiv(GLenum type, const GLuint *color);                                             \
+    void multiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords);                            \
+    void multiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords);                    \
+    void multiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords);                            \
+    void multiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords);                    \
+    void multiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords);                            \
+    void multiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords);                    \
+    void multiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords);                            \
+    void multiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords);                    \
+    void normalP3ui(GLenum type, GLuint coords);                                                   \
+    void normalP3uiv(GLenum type, const GLuint *coords);                                           \
+    void secondaryColorP3ui(GLenum type, GLuint color);                                            \
+    void secondaryColorP3uiv(GLenum type, const GLuint *color);                                    \
+    void texCoordP1ui(GLenum type, GLuint coords);                                                 \
+    void texCoordP1uiv(GLenum type, const GLuint *coords);                                         \
+    void texCoordP2ui(GLenum type, GLuint coords);                                                 \
+    void texCoordP2uiv(GLenum type, const GLuint *coords);                                         \
+    void texCoordP3ui(GLenum type, GLuint coords);                                                 \
+    void texCoordP3uiv(GLenum type, const GLuint *coords);                                         \
+    void texCoordP4ui(GLenum type, GLuint coords);                                                 \
+    void texCoordP4uiv(GLenum type, const GLuint *coords);                                         \
+    void vertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);          \
+    void vertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);  \
+    void vertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);          \
+    void vertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);  \
+    void vertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);          \
+    void vertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);  \
+    void vertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);          \
+    void vertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);  \
+    void vertexP2ui(GLenum type, GLuint value);                                                    \
+    void vertexP2uiv(GLenum type, const GLuint *value);                                            \
+    void vertexP3ui(GLenum type, GLuint value);                                                    \
+    void vertexP3uiv(GLenum type, const GLuint *value);                                            \
+    void vertexP4ui(GLenum type, GLuint value);                                                    \
+    void vertexP4uiv(GLenum type, const GLuint *value);
+
+#endif  // ANGLE_CONTEXT_API_3_AUTOGEN_H_
diff --git a/src/libANGLE/Context_gl_4_0_autogen.h b/src/libANGLE/Context_gl_4_0_autogen.h
deleted file mode 100644
index 80fa17b..0000000
--- a/src/libANGLE/Context_gl_4_0_autogen.h
+++ /dev/null
@@ -1,65 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Context_gl_4_0_autogen.h: Creates a macro for interfaces in Context.
-
-#ifndef ANGLE_CONTEXT_GL_4_0_AUTOGEN_H_
-#define ANGLE_CONTEXT_GL_4_0_AUTOGEN_H_
-
-#define ANGLE_GL_4_0_CONTEXT_API                                                                 \
-    void beginQueryIndexed(GLenum target, GLuint index, QueryID idPacked);                       \
-    void drawTransformFeedback(GLenum mode, TransformFeedbackID idPacked);                       \
-    void drawTransformFeedbackStream(GLenum mode, TransformFeedbackID idPacked, GLuint stream);  \
-    void endQueryIndexed(GLenum target, GLuint index);                                           \
-    void getActiveSubroutineName(ShaderProgramID programPacked, GLenum shadertype, GLuint index, \
-                                 GLsizei bufsize, GLsizei *length, GLchar *name);                \
-    void getActiveSubroutineUniformName(ShaderProgramID programPacked, GLenum shadertype,        \
-                                        GLuint index, GLsizei bufsize, GLsizei *length,          \
-                                        GLchar *name);                                           \
-    void getActiveSubroutineUniformiv(ShaderProgramID programPacked, GLenum shadertype,          \
-                                      GLuint index, GLenum pname, GLint *values);                \
-    void getProgramStageiv(ShaderProgramID programPacked, GLenum shadertype, GLenum pname,       \
-                           GLint *values);                                                       \
-    void getQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params);            \
-    GLuint getSubroutineIndex(ShaderProgramID programPacked, GLenum shadertype,                  \
-                              const GLchar *name);                                               \
-    GLint getSubroutineUniformLocation(ShaderProgramID programPacked, GLenum shadertype,         \
-                                       const GLchar *name);                                      \
-    void getUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params);             \
-    void getUniformdv(ShaderProgramID programPacked, UniformLocation locationPacked,             \
-                      GLdouble *params);                                                         \
-    void patchParameterfv(GLenum pname, const GLfloat *values);                                  \
-    void uniform1d(UniformLocation locationPacked, GLdouble x);                                  \
-    void uniform1dv(UniformLocation locationPacked, GLsizei count, const GLdouble *value);       \
-    void uniform2d(UniformLocation locationPacked, GLdouble x, GLdouble y);                      \
-    void uniform2dv(UniformLocation locationPacked, GLsizei count, const GLdouble *value);       \
-    void uniform3d(UniformLocation locationPacked, GLdouble x, GLdouble y, GLdouble z);          \
-    void uniform3dv(UniformLocation locationPacked, GLsizei count, const GLdouble *value);       \
-    void uniform4d(UniformLocation locationPacked, GLdouble x, GLdouble y, GLdouble z,           \
-                   GLdouble w);                                                                  \
-    void uniform4dv(UniformLocation locationPacked, GLsizei count, const GLdouble *value);       \
-    void uniformMatrix2dv(UniformLocation locationPacked, GLsizei count, GLboolean transpose,    \
-                          const GLdouble *value);                                                \
-    void uniformMatrix2x3dv(UniformLocation locationPacked, GLsizei count, GLboolean transpose,  \
-                            const GLdouble *value);                                              \
-    void uniformMatrix2x4dv(UniformLocation locationPacked, GLsizei count, GLboolean transpose,  \
-                            const GLdouble *value);                                              \
-    void uniformMatrix3dv(UniformLocation locationPacked, GLsizei count, GLboolean transpose,    \
-                          const GLdouble *value);                                                \
-    void uniformMatrix3x2dv(UniformLocation locationPacked, GLsizei count, GLboolean transpose,  \
-                            const GLdouble *value);                                              \
-    void uniformMatrix3x4dv(UniformLocation locationPacked, GLsizei count, GLboolean transpose,  \
-                            const GLdouble *value);                                              \
-    void uniformMatrix4dv(UniformLocation locationPacked, GLsizei count, GLboolean transpose,    \
-                          const GLdouble *value);                                                \
-    void uniformMatrix4x2dv(UniformLocation locationPacked, GLsizei count, GLboolean transpose,  \
-                            const GLdouble *value);                                              \
-    void uniformMatrix4x3dv(UniformLocation locationPacked, GLsizei count, GLboolean transpose,  \
-                            const GLdouble *value);                                              \
-    void uniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices);
-
-#endif  // ANGLE_CONTEXT_API_4_0_AUTOGEN_H_
diff --git a/src/libANGLE/Context_gl_4_1_autogen.h b/src/libANGLE/Context_gl_4_1_autogen.h
deleted file mode 100644
index 0cca1c0..0000000
--- a/src/libANGLE/Context_gl_4_1_autogen.h
+++ /dev/null
@@ -1,70 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Context_gl_4_1_autogen.h: Creates a macro for interfaces in Context.
-
-#ifndef ANGLE_CONTEXT_GL_4_1_AUTOGEN_H_
-#define ANGLE_CONTEXT_GL_4_1_AUTOGEN_H_
-
-#define ANGLE_GL_4_1_CONTEXT_API                                                                  \
-    void depthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v);                        \
-    void depthRangeIndexed(GLuint index, GLdouble n, GLdouble f);                                 \
-    void getDoublei_v(GLenum target, GLuint index, GLdouble *data);                               \
-    void getFloati_v(GLenum target, GLuint index, GLfloat *data);                                 \
-    void getVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params);                        \
-    void programUniform1d(ShaderProgramID programPacked, UniformLocation locationPacked,          \
-                          GLdouble v0);                                                           \
-    void programUniform1dv(ShaderProgramID programPacked, UniformLocation locationPacked,         \
-                           GLsizei count, const GLdouble *value);                                 \
-    void programUniform2d(ShaderProgramID programPacked, UniformLocation locationPacked,          \
-                          GLdouble v0, GLdouble v1);                                              \
-    void programUniform2dv(ShaderProgramID programPacked, UniformLocation locationPacked,         \
-                           GLsizei count, const GLdouble *value);                                 \
-    void programUniform3d(ShaderProgramID programPacked, UniformLocation locationPacked,          \
-                          GLdouble v0, GLdouble v1, GLdouble v2);                                 \
-    void programUniform3dv(ShaderProgramID programPacked, UniformLocation locationPacked,         \
-                           GLsizei count, const GLdouble *value);                                 \
-    void programUniform4d(ShaderProgramID programPacked, UniformLocation locationPacked,          \
-                          GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3);                    \
-    void programUniform4dv(ShaderProgramID programPacked, UniformLocation locationPacked,         \
-                           GLsizei count, const GLdouble *value);                                 \
-    void programUniformMatrix2dv(ShaderProgramID programPacked, UniformLocation locationPacked,   \
-                                 GLsizei count, GLboolean transpose, const GLdouble *value);      \
-    void programUniformMatrix2x3dv(ShaderProgramID programPacked, UniformLocation locationPacked, \
-                                   GLsizei count, GLboolean transpose, const GLdouble *value);    \
-    void programUniformMatrix2x4dv(ShaderProgramID programPacked, UniformLocation locationPacked, \
-                                   GLsizei count, GLboolean transpose, const GLdouble *value);    \
-    void programUniformMatrix3dv(ShaderProgramID programPacked, UniformLocation locationPacked,   \
-                                 GLsizei count, GLboolean transpose, const GLdouble *value);      \
-    void programUniformMatrix3x2dv(ShaderProgramID programPacked, UniformLocation locationPacked, \
-                                   GLsizei count, GLboolean transpose, const GLdouble *value);    \
-    void programUniformMatrix3x4dv(ShaderProgramID programPacked, UniformLocation locationPacked, \
-                                   GLsizei count, GLboolean transpose, const GLdouble *value);    \
-    void programUniformMatrix4dv(ShaderProgramID programPacked, UniformLocation locationPacked,   \
-                                 GLsizei count, GLboolean transpose, const GLdouble *value);      \
-    void programUniformMatrix4x2dv(ShaderProgramID programPacked, UniformLocation locationPacked, \
-                                   GLsizei count, GLboolean transpose, const GLdouble *value);    \
-    void programUniformMatrix4x3dv(ShaderProgramID programPacked, UniformLocation locationPacked, \
-                                   GLsizei count, GLboolean transpose, const GLdouble *value);    \
-    void scissorArrayv(GLuint first, GLsizei count, const GLint *v);                              \
-    void scissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);   \
-    void scissorIndexedv(GLuint index, const GLint *v);                                           \
-    void vertexAttribL1d(GLuint index, GLdouble x);                                               \
-    void vertexAttribL1dv(GLuint index, const GLdouble *v);                                       \
-    void vertexAttribL2d(GLuint index, GLdouble x, GLdouble y);                                   \
-    void vertexAttribL2dv(GLuint index, const GLdouble *v);                                       \
-    void vertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);                       \
-    void vertexAttribL3dv(GLuint index, const GLdouble *v);                                       \
-    void vertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);           \
-    void vertexAttribL4dv(GLuint index, const GLdouble *v);                                       \
-    void vertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride,              \
-                              const void *pointer);                                               \
-    void viewportArrayv(GLuint first, GLsizei count, const GLfloat *v);                           \
-    void viewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);              \
-    void viewportIndexedfv(GLuint index, const GLfloat *v);
-
-#endif  // ANGLE_CONTEXT_API_4_1_AUTOGEN_H_
diff --git a/src/libANGLE/Context_gl_4_2_autogen.h b/src/libANGLE/Context_gl_4_2_autogen.h
deleted file mode 100644
index 6431666..0000000
--- a/src/libANGLE/Context_gl_4_2_autogen.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Context_gl_4_2_autogen.h: Creates a macro for interfaces in Context.
-
-#ifndef ANGLE_CONTEXT_GL_4_2_AUTOGEN_H_
-#define ANGLE_CONTEXT_GL_4_2_AUTOGEN_H_
-
-#define ANGLE_GL_4_2_CONTEXT_API                                                           \
-    void drawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type,        \
-                                           const void *indices, GLsizei instancecount,     \
-                                           GLuint baseinstance);                           \
-    void drawTransformFeedbackInstanced(GLenum mode, TransformFeedbackID idPacked,         \
-                                        GLsizei instancecount);                            \
-    void drawTransformFeedbackStreamInstanced(GLenum mode, TransformFeedbackID idPacked,   \
-                                              GLuint stream, GLsizei instancecount);       \
-    void getActiveAtomicCounterBufferiv(ShaderProgramID programPacked, GLuint bufferIndex, \
-                                        GLenum pname, GLint *params);
-
-#endif  // ANGLE_CONTEXT_API_4_2_AUTOGEN_H_
diff --git a/src/libANGLE/Context_gl_4_3_autogen.h b/src/libANGLE/Context_gl_4_3_autogen.h
deleted file mode 100644
index ec38f50..0000000
--- a/src/libANGLE/Context_gl_4_3_autogen.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Context_gl_4_3_autogen.h: Creates a macro for interfaces in Context.
-
-#ifndef ANGLE_CONTEXT_GL_4_3_AUTOGEN_H_
-#define ANGLE_CONTEXT_GL_4_3_AUTOGEN_H_
-
-#define ANGLE_GL_4_3_CONTEXT_API                                                                   \
-    void clearBufferData(GLenum target, GLenum internalformat, GLenum format, GLenum type,         \
-                         const void *data);                                                        \
-    void clearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset,                 \
-                            GLsizeiptr size, GLenum format, GLenum type, const void *data);        \
-    void getInternalformati64v(GLenum target, GLenum internalformat, GLenum pname,                 \
-                               GLsizei bufSize, GLint64 *params);                                  \
-    void invalidateBufferData(BufferID bufferPacked);                                              \
-    void invalidateBufferSubData(BufferID bufferPacked, GLintptr offset, GLsizeiptr length);       \
-    void invalidateTexImage(TextureID texturePacked, GLint level);                                 \
-    void invalidateTexSubImage(TextureID texturePacked, GLint level, GLint xoffset, GLint yoffset, \
-                               GLint zoffset, GLsizei width, GLsizei height, GLsizei depth);       \
-    void multiDrawArraysIndirect(GLenum mode, const void *indirect, GLsizei drawcount,             \
-                                 GLsizei stride);                                                  \
-    void multiDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect,                 \
-                                   GLsizei drawcount, GLsizei stride);                             \
-    void shaderStorageBlockBinding(ShaderProgramID programPacked, GLuint storageBlockIndex,        \
-                                   GLuint storageBlockBinding);                                    \
-    void textureView(TextureID texturePacked, GLenum target, GLuint origtexture,                   \
-                     GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer,    \
-                     GLuint numlayers);                                                            \
-    void vertexAttribLFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
-
-#endif  // ANGLE_CONTEXT_API_4_3_AUTOGEN_H_
diff --git a/src/libANGLE/Context_gl_4_4_autogen.h b/src/libANGLE/Context_gl_4_4_autogen.h
deleted file mode 100644
index 48e035f..0000000
--- a/src/libANGLE/Context_gl_4_4_autogen.h
+++ /dev/null
@@ -1,30 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Context_gl_4_4_autogen.h: Creates a macro for interfaces in Context.
-
-#ifndef ANGLE_CONTEXT_GL_4_4_AUTOGEN_H_
-#define ANGLE_CONTEXT_GL_4_4_AUTOGEN_H_
-
-#define ANGLE_GL_4_4_CONTEXT_API                                                              \
-    void bindBuffersBase(GLenum target, GLuint first, GLsizei count,                          \
-                         const BufferID *buffersPacked);                                      \
-    void bindBuffersRange(GLenum target, GLuint first, GLsizei count,                         \
-                          const BufferID *buffersPacked, const GLintptr *offsets,             \
-                          const GLsizeiptr *sizes);                                           \
-    void bindImageTextures(GLuint first, GLsizei count, const GLuint *textures);              \
-    void bindSamplers(GLuint first, GLsizei count, const GLuint *samplers);                   \
-    void bindTextures(GLuint first, GLsizei count, const GLuint *textures);                   \
-    void bindVertexBuffers(GLuint first, GLsizei count, const BufferID *buffersPacked,        \
-                           const GLintptr *offsets, const GLsizei *strides);                  \
-    void clearTexImage(TextureID texturePacked, GLint level, GLenum format, GLenum type,      \
-                       const void *data);                                                     \
-    void clearTexSubImage(TextureID texturePacked, GLint level, GLint xoffset, GLint yoffset, \
-                          GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,        \
-                          GLenum format, GLenum type, const void *data);
-
-#endif  // ANGLE_CONTEXT_API_4_4_AUTOGEN_H_
diff --git a/src/libANGLE/Context_gl_4_5_autogen.h b/src/libANGLE/Context_gl_4_5_autogen.h
deleted file mode 100644
index a582c43..0000000
--- a/src/libANGLE/Context_gl_4_5_autogen.h
+++ /dev/null
@@ -1,208 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Context_gl_4_5_autogen.h: Creates a macro for interfaces in Context.
-
-#ifndef ANGLE_CONTEXT_GL_4_5_AUTOGEN_H_
-#define ANGLE_CONTEXT_GL_4_5_AUTOGEN_H_
-
-#define ANGLE_GL_4_5_CONTEXT_API                                                                   \
-    void bindTextureUnit(GLuint unit, TextureID texturePacked);                                    \
-    void blitNamedFramebuffer(GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0,         \
-                              GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0,     \
-                              GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);           \
-    GLenum checkNamedFramebufferStatus(FramebufferID framebufferPacked, GLenum target);            \
-    void clearNamedBufferData(BufferID bufferPacked, GLenum internalformat, GLenum format,         \
-                              GLenum type, const void *data);                                      \
-    void clearNamedBufferSubData(BufferID bufferPacked, GLenum internalformat, GLintptr offset,    \
-                                 GLsizeiptr size, GLenum format, GLenum type, const void *data);   \
-    void clearNamedFramebufferfi(FramebufferID framebufferPacked, GLenum buffer, GLint drawbuffer, \
-                                 GLfloat depth, GLint stencil);                                    \
-    void clearNamedFramebufferfv(FramebufferID framebufferPacked, GLenum buffer, GLint drawbuffer, \
-                                 const GLfloat *value);                                            \
-    void clearNamedFramebufferiv(FramebufferID framebufferPacked, GLenum buffer, GLint drawbuffer, \
-                                 const GLint *value);                                              \
-    void clearNamedFramebufferuiv(FramebufferID framebufferPacked, GLenum buffer,                  \
-                                  GLint drawbuffer, const GLuint *value);                          \
-    void clipControl(GLenum origin, GLenum depth);                                                 \
-    void compressedTextureSubImage1D(TextureID texturePacked, GLint level, GLint xoffset,          \
-                                     GLsizei width, GLenum format, GLsizei imageSize,              \
-                                     const void *data);                                            \
-    void compressedTextureSubImage2D(TextureID texturePacked, GLint level, GLint xoffset,          \
-                                     GLint yoffset, GLsizei width, GLsizei height, GLenum format,  \
-                                     GLsizei imageSize, const void *data);                         \
-    void compressedTextureSubImage3D(TextureID texturePacked, GLint level, GLint xoffset,          \
-                                     GLint yoffset, GLint zoffset, GLsizei width, GLsizei height,  \
-                                     GLsizei depth, GLenum format, GLsizei imageSize,              \
-                                     const void *data);                                            \
-    void copyNamedBufferSubData(GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset,        \
-                                GLintptr writeOffset, GLsizeiptr size);                            \
-    void copyTextureSubImage1D(TextureID texturePacked, GLint level, GLint xoffset, GLint x,       \
-                               GLint y, GLsizei width);                                            \
-    void copyTextureSubImage2D(TextureID texturePacked, GLint level, GLint xoffset, GLint yoffset, \
-                               GLint x, GLint y, GLsizei width, GLsizei height);                   \
-    void copyTextureSubImage3D(TextureID texturePacked, GLint level, GLint xoffset, GLint yoffset, \
-                               GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);    \
-    void createBuffers(GLsizei n, BufferID *buffersPacked);                                        \
-    void createFramebuffers(GLsizei n, GLuint *framebuffers);                                      \
-    void createProgramPipelines(GLsizei n, GLuint *pipelines);                                     \
-    void createQueries(GLenum target, GLsizei n, GLuint *ids);                                     \
-    void createRenderbuffers(GLsizei n, RenderbufferID *renderbuffersPacked);                      \
-    void createSamplers(GLsizei n, GLuint *samplers);                                              \
-    void createTextures(GLenum target, GLsizei n, GLuint *textures);                               \
-    void createTransformFeedbacks(GLsizei n, GLuint *ids);                                         \
-    void createVertexArrays(GLsizei n, VertexArrayID *arraysPacked);                               \
-    void disableVertexArrayAttrib(VertexArrayID vaobjPacked, GLuint index);                        \
-    void enableVertexArrayAttrib(VertexArrayID vaobjPacked, GLuint index);                         \
-    void flushMappedNamedBufferRange(BufferID bufferPacked, GLintptr offset, GLsizeiptr length);   \
-    void generateTextureMipmap(TextureID texturePacked);                                           \
-    void getCompressedTextureImage(TextureID texturePacked, GLint level, GLsizei bufSize,          \
-                                   void *pixels);                                                  \
-    void getCompressedTextureSubImage(TextureID texturePacked, GLint level, GLint xoffset,         \
-                                      GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, \
-                                      GLsizei depth, GLsizei bufSize, void *pixels);               \
-    void getNamedBufferParameteri64v(BufferID bufferPacked, GLenum pname, GLint64 *params);        \
-    void getNamedBufferParameteriv(BufferID bufferPacked, GLenum pname, GLint *params);            \
-    void getNamedBufferPointerv(BufferID bufferPacked, GLenum pname, void **params);               \
-    void getNamedBufferSubData(BufferID bufferPacked, GLintptr offset, GLsizeiptr size,            \
-                               void *data);                                                        \
-    void getNamedFramebufferAttachmentParameteriv(FramebufferID framebufferPacked,                 \
-                                                  GLenum attachment, GLenum pname, GLint *params); \
-    void getNamedFramebufferParameteriv(FramebufferID framebufferPacked, GLenum pname,             \
-                                        GLint *param);                                             \
-    void getNamedRenderbufferParameteriv(RenderbufferID renderbufferPacked, GLenum pname,          \
-                                         GLint *params);                                           \
-    void getQueryBufferObjecti64v(GLuint id, BufferID bufferPacked, GLenum pname,                  \
-                                  GLintptr offset);                                                \
-    void getQueryBufferObjectiv(GLuint id, BufferID bufferPacked, GLenum pname, GLintptr offset);  \
-    void getQueryBufferObjectui64v(GLuint id, BufferID bufferPacked, GLenum pname,                 \
-                                   GLintptr offset);                                               \
-    void getQueryBufferObjectuiv(GLuint id, BufferID bufferPacked, GLenum pname, GLintptr offset); \
-    void getTextureImage(TextureID texturePacked, GLint level, GLenum format, GLenum type,         \
-                         GLsizei bufSize, void *pixels);                                           \
-    void getTextureLevelParameterfv(TextureID texturePacked, GLint level, GLenum pname,            \
-                                    GLfloat *params);                                              \
-    void getTextureLevelParameteriv(TextureID texturePacked, GLint level, GLenum pname,            \
-                                    GLint *params);                                                \
-    void getTextureParameterIiv(TextureID texturePacked, GLenum pname, GLint *params);             \
-    void getTextureParameterIuiv(TextureID texturePacked, GLenum pname, GLuint *params);           \
-    void getTextureParameterfv(TextureID texturePacked, GLenum pname, GLfloat *params);            \
-    void getTextureParameteriv(TextureID texturePacked, GLenum pname, GLint *params);              \
-    void getTextureSubImage(TextureID texturePacked, GLint level, GLint xoffset, GLint yoffset,    \
-                            GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,           \
-                            GLenum format, GLenum type, GLsizei bufSize, void *pixels);            \
-    void getTransformFeedbacki64_v(GLuint xfb, GLenum pname, GLuint index, GLint64 *param);        \
-    void getTransformFeedbacki_v(GLuint xfb, GLenum pname, GLuint index, GLint *param);            \
-    void getTransformFeedbackiv(GLuint xfb, GLenum pname, GLint *param);                           \
-    void getVertexArrayIndexed64iv(VertexArrayID vaobjPacked, GLuint index, GLenum pname,          \
-                                   GLint64 *param);                                                \
-    void getVertexArrayIndexediv(VertexArrayID vaobjPacked, GLuint index, GLenum pname,            \
-                                 GLint *param);                                                    \
-    void getVertexArrayiv(VertexArrayID vaobjPacked, GLenum pname, GLint *param);                  \
-    void getnColorTable(GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table);  \
-    void getnCompressedTexImage(GLenum target, GLint lod, GLsizei bufSize, void *pixels);          \
-    void getnConvolutionFilter(GLenum target, GLenum format, GLenum type, GLsizei bufSize,         \
-                               void *image);                                                       \
-    void getnHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type,                 \
-                       GLsizei bufSize, void *values);                                             \
-    void getnMapdv(GLenum target, GLenum query, GLsizei bufSize, GLdouble *v);                     \
-    void getnMapfv(GLenum target, GLenum query, GLsizei bufSize, GLfloat *v);                      \
-    void getnMapiv(GLenum target, GLenum query, GLsizei bufSize, GLint *v);                        \
-    void getnMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize,   \
-                    void *values);                                                                 \
-    void getnPixelMapfv(GLenum map, GLsizei bufSize, GLfloat *values);                             \
-    void getnPixelMapuiv(GLenum map, GLsizei bufSize, GLuint *values);                             \
-    void getnPixelMapusv(GLenum map, GLsizei bufSize, GLushort *values);                           \
-    void getnPolygonStipple(GLsizei bufSize, GLubyte *pattern);                                    \
-    void getnSeparableFilter(GLenum target, GLenum format, GLenum type, GLsizei rowBufSize,        \
-                             void *row, GLsizei columnBufSize, void *column, void *span);          \
-    void getnTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize,     \
-                      void *pixels);                                                               \
-    void getnUniformdv(ShaderProgramID programPacked, UniformLocation locationPacked,              \
-                       GLsizei bufSize, GLdouble *params);                                         \
-    void invalidateNamedFramebufferData(FramebufferID framebufferPacked, GLsizei numAttachments,   \
-                                        const GLenum *attachments);                                \
-    void invalidateNamedFramebufferSubData(FramebufferID framebufferPacked,                        \
-                                           GLsizei numAttachments, const GLenum *attachments,      \
-                                           GLint x, GLint y, GLsizei width, GLsizei height);       \
-    void *mapNamedBuffer(BufferID bufferPacked, GLenum access);                                    \
-    void *mapNamedBufferRange(BufferID bufferPacked, GLintptr offset, GLsizeiptr length,           \
-                              GLbitfield access);                                                  \
-    void namedBufferData(BufferID bufferPacked, GLsizeiptr size, const void *data, GLenum usage);  \
-    void namedBufferStorage(BufferID bufferPacked, GLsizeiptr size, const void *data,              \
-                            GLbitfield flags);                                                     \
-    void namedBufferSubData(BufferID bufferPacked, GLintptr offset, GLsizeiptr size,               \
-                            const void *data);                                                     \
-    void namedFramebufferDrawBuffer(FramebufferID framebufferPacked, GLenum buf);                  \
-    void namedFramebufferDrawBuffers(FramebufferID framebufferPacked, GLsizei n,                   \
-                                     const GLenum *bufs);                                          \
-    void namedFramebufferParameteri(FramebufferID framebufferPacked, GLenum pname, GLint param);   \
-    void namedFramebufferReadBuffer(FramebufferID framebufferPacked, GLenum src);                  \
-    void namedFramebufferRenderbuffer(FramebufferID framebufferPacked, GLenum attachment,          \
-                                      GLenum renderbuffertarget,                                   \
-                                      RenderbufferID renderbufferPacked);                          \
-    void namedFramebufferTexture(FramebufferID framebufferPacked, GLenum attachment,               \
-                                 TextureID texturePacked, GLint level);                            \
-    void namedFramebufferTextureLayer(FramebufferID framebufferPacked, GLenum attachment,          \
-                                      TextureID texturePacked, GLint level, GLint layer);          \
-    void namedRenderbufferStorage(RenderbufferID renderbufferPacked, GLenum internalformat,        \
-                                  GLsizei width, GLsizei height);                                  \
-    void namedRenderbufferStorageMultisample(RenderbufferID renderbufferPacked, GLsizei samples,   \
-                                             GLenum internalformat, GLsizei width,                 \
-                                             GLsizei height);                                      \
-    void textureBarrier();                                                                         \
-    void textureBuffer(TextureID texturePacked, GLenum internalformat, BufferID bufferPacked);     \
-    void textureBufferRange(TextureID texturePacked, GLenum internalformat, BufferID bufferPacked, \
-                            GLintptr offset, GLsizeiptr size);                                     \
-    void textureParameterIiv(TextureID texturePacked, GLenum pname, const GLint *params);          \
-    void textureParameterIuiv(TextureID texturePacked, GLenum pname, const GLuint *params);        \
-    void textureParameterf(TextureID texturePacked, GLenum pname, GLfloat param);                  \
-    void textureParameterfv(TextureID texturePacked, GLenum pname, const GLfloat *param);          \
-    void textureParameteri(TextureID texturePacked, GLenum pname, GLint param);                    \
-    void textureParameteriv(TextureID texturePacked, GLenum pname, const GLint *param);            \
-    void textureStorage1D(TextureID texturePacked, GLsizei levels, GLenum internalformat,          \
-                          GLsizei width);                                                          \
-    void textureStorage2D(TextureID texturePacked, GLsizei levels, GLenum internalformat,          \
-                          GLsizei width, GLsizei height);                                          \
-    void textureStorage2DMultisample(TextureID texturePacked, GLsizei samples,                     \
-                                     GLenum internalformat, GLsizei width, GLsizei height,         \
-                                     GLboolean fixedsamplelocations);                              \
-    void textureStorage3D(TextureID texturePacked, GLsizei levels, GLenum internalformat,          \
-                          GLsizei width, GLsizei height, GLsizei depth);                           \
-    void textureStorage3DMultisample(TextureID texturePacked, GLsizei samples,                     \
-                                     GLenum internalformat, GLsizei width, GLsizei height,         \
-                                     GLsizei depth, GLboolean fixedsamplelocations);               \
-    void textureSubImage1D(TextureID texturePacked, GLint level, GLint xoffset, GLsizei width,     \
-                           GLenum format, GLenum type, const void *pixels);                        \
-    void textureSubImage2D(TextureID texturePacked, GLint level, GLint xoffset, GLint yoffset,     \
-                           GLsizei width, GLsizei height, GLenum format, GLenum type,              \
-                           const void *pixels);                                                    \
-    void textureSubImage3D(TextureID texturePacked, GLint level, GLint xoffset, GLint yoffset,     \
-                           GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,            \
-                           GLenum format, GLenum type, const void *pixels);                        \
-    void transformFeedbackBufferBase(GLuint xfb, GLuint index, BufferID bufferPacked);             \
-    void transformFeedbackBufferRange(GLuint xfb, GLuint index, BufferID bufferPacked,             \
-                                      GLintptr offset, GLsizeiptr size);                           \
-    GLboolean unmapNamedBuffer(BufferID bufferPacked);                                             \
-    void vertexArrayAttribBinding(VertexArrayID vaobjPacked, GLuint attribindex,                   \
-                                  GLuint bindingindex);                                            \
-    void vertexArrayAttribFormat(VertexArrayID vaobjPacked, GLuint attribindex, GLint size,        \
-                                 GLenum type, GLboolean normalized, GLuint relativeoffset);        \
-    void vertexArrayAttribIFormat(VertexArrayID vaobjPacked, GLuint attribindex, GLint size,       \
-                                  GLenum type, GLuint relativeoffset);                             \
-    void vertexArrayAttribLFormat(VertexArrayID vaobjPacked, GLuint attribindex, GLint size,       \
-                                  GLenum type, GLuint relativeoffset);                             \
-    void vertexArrayBindingDivisor(VertexArrayID vaobjPacked, GLuint bindingindex,                 \
-                                   GLuint divisor);                                                \
-    void vertexArrayElementBuffer(VertexArrayID vaobjPacked, BufferID bufferPacked);               \
-    void vertexArrayVertexBuffer(VertexArrayID vaobjPacked, GLuint bindingindex,                   \
-                                 BufferID bufferPacked, GLintptr offset, GLsizei stride);          \
-    void vertexArrayVertexBuffers(VertexArrayID vaobjPacked, GLuint first, GLsizei count,          \
-                                  const BufferID *buffersPacked, const GLintptr *offsets,          \
-                                  const GLsizei *strides);
-
-#endif  // ANGLE_CONTEXT_API_4_5_AUTOGEN_H_
diff --git a/src/libANGLE/Context_gl_4_6_autogen.h b/src/libANGLE/Context_gl_4_6_autogen.h
deleted file mode 100644
index 33faee8..0000000
--- a/src/libANGLE/Context_gl_4_6_autogen.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Context_gl_4_6_autogen.h: Creates a macro for interfaces in Context.
-
-#ifndef ANGLE_CONTEXT_GL_4_6_AUTOGEN_H_
-#define ANGLE_CONTEXT_GL_4_6_AUTOGEN_H_
-
-#define ANGLE_GL_4_6_CONTEXT_API                                                                   \
-    void multiDrawArraysIndirectCount(GLenum mode, const void *indirect, GLintptr drawcount,       \
-                                      GLsizei maxdrawcount, GLsizei stride);                       \
-    void multiDrawElementsIndirectCount(GLenum mode, GLenum type, const void *indirect,            \
-                                        GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); \
-    void polygonOffsetClamp(GLfloat factor, GLfloat units, GLfloat clamp);                         \
-    void specializeShader(GLuint shader, const GLchar *pEntryPoint,                                \
-                          GLuint numSpecializationConstants, const GLuint *pConstantIndex,         \
-                          const GLuint *pConstantValue);
-
-#endif  // ANGLE_CONTEXT_API_4_6_AUTOGEN_H_
diff --git a/src/libANGLE/Context_gl_4_autogen.h b/src/libANGLE/Context_gl_4_autogen.h
new file mode 100644
index 0000000..5b1b19e
--- /dev/null
+++ b/src/libANGLE/Context_gl_4_autogen.h
@@ -0,0 +1,366 @@
+// GENERATED FILE - DO NOT EDIT.
+// Generated by generate_entry_points.py using data from gl.xml.
+//
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// Context_gl_4_autogen.h: Creates a macro for interfaces in Context.
+
+#ifndef ANGLE_CONTEXT_GL_4_AUTOGEN_H_
+#define ANGLE_CONTEXT_GL_4_AUTOGEN_H_
+
+#define ANGLE_GL_4_CONTEXT_API                                                                     \
+    void beginQueryIndexed(GLenum target, GLuint index, QueryID idPacked);                         \
+    void drawTransformFeedback(GLenum mode, TransformFeedbackID idPacked);                         \
+    void drawTransformFeedbackStream(GLenum mode, TransformFeedbackID idPacked, GLuint stream);    \
+    void endQueryIndexed(GLenum target, GLuint index);                                             \
+    void getActiveSubroutineName(ShaderProgramID programPacked, GLenum shadertype, GLuint index,   \
+                                 GLsizei bufsize, GLsizei *length, GLchar *name);                  \
+    void getActiveSubroutineUniformName(ShaderProgramID programPacked, GLenum shadertype,          \
+                                        GLuint index, GLsizei bufsize, GLsizei *length,            \
+                                        GLchar *name);                                             \
+    void getActiveSubroutineUniformiv(ShaderProgramID programPacked, GLenum shadertype,            \
+                                      GLuint index, GLenum pname, GLint *values);                  \
+    void getProgramStageiv(ShaderProgramID programPacked, GLenum shadertype, GLenum pname,         \
+                           GLint *values);                                                         \
+    void getQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params);              \
+    GLuint getSubroutineIndex(ShaderProgramID programPacked, GLenum shadertype,                    \
+                              const GLchar *name);                                                 \
+    GLint getSubroutineUniformLocation(ShaderProgramID programPacked, GLenum shadertype,           \
+                                       const GLchar *name);                                        \
+    void getUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params);               \
+    void getUniformdv(ShaderProgramID programPacked, UniformLocation locationPacked,               \
+                      GLdouble *params);                                                           \
+    void patchParameterfv(GLenum pname, const GLfloat *values);                                    \
+    void uniform1d(UniformLocation locationPacked, GLdouble x);                                    \
+    void uniform1dv(UniformLocation locationPacked, GLsizei count, const GLdouble *value);         \
+    void uniform2d(UniformLocation locationPacked, GLdouble x, GLdouble y);                        \
+    void uniform2dv(UniformLocation locationPacked, GLsizei count, const GLdouble *value);         \
+    void uniform3d(UniformLocation locationPacked, GLdouble x, GLdouble y, GLdouble z);            \
+    void uniform3dv(UniformLocation locationPacked, GLsizei count, const GLdouble *value);         \
+    void uniform4d(UniformLocation locationPacked, GLdouble x, GLdouble y, GLdouble z,             \
+                   GLdouble w);                                                                    \
+    void uniform4dv(UniformLocation locationPacked, GLsizei count, const GLdouble *value);         \
+    void uniformMatrix2dv(UniformLocation locationPacked, GLsizei count, GLboolean transpose,      \
+                          const GLdouble *value);                                                  \
+    void uniformMatrix2x3dv(UniformLocation locationPacked, GLsizei count, GLboolean transpose,    \
+                            const GLdouble *value);                                                \
+    void uniformMatrix2x4dv(UniformLocation locationPacked, GLsizei count, GLboolean transpose,    \
+                            const GLdouble *value);                                                \
+    void uniformMatrix3dv(UniformLocation locationPacked, GLsizei count, GLboolean transpose,      \
+                          const GLdouble *value);                                                  \
+    void uniformMatrix3x2dv(UniformLocation locationPacked, GLsizei count, GLboolean transpose,    \
+                            const GLdouble *value);                                                \
+    void uniformMatrix3x4dv(UniformLocation locationPacked, GLsizei count, GLboolean transpose,    \
+                            const GLdouble *value);                                                \
+    void uniformMatrix4dv(UniformLocation locationPacked, GLsizei count, GLboolean transpose,      \
+                          const GLdouble *value);                                                  \
+    void uniformMatrix4x2dv(UniformLocation locationPacked, GLsizei count, GLboolean transpose,    \
+                            const GLdouble *value);                                                \
+    void uniformMatrix4x3dv(UniformLocation locationPacked, GLsizei count, GLboolean transpose,    \
+                            const GLdouble *value);                                                \
+    void uniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices);           \
+    void depthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v);                         \
+    void depthRangeIndexed(GLuint index, GLdouble n, GLdouble f);                                  \
+    void getDoublei_v(GLenum target, GLuint index, GLdouble *data);                                \
+    void getFloati_v(GLenum target, GLuint index, GLfloat *data);                                  \
+    void getVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params);                         \
+    void programUniform1d(ShaderProgramID programPacked, UniformLocation locationPacked,           \
+                          GLdouble v0);                                                            \
+    void programUniform1dv(ShaderProgramID programPacked, UniformLocation locationPacked,          \
+                           GLsizei count, const GLdouble *value);                                  \
+    void programUniform2d(ShaderProgramID programPacked, UniformLocation locationPacked,           \
+                          GLdouble v0, GLdouble v1);                                               \
+    void programUniform2dv(ShaderProgramID programPacked, UniformLocation locationPacked,          \
+                           GLsizei count, const GLdouble *value);                                  \
+    void programUniform3d(ShaderProgramID programPacked, UniformLocation locationPacked,           \
+                          GLdouble v0, GLdouble v1, GLdouble v2);                                  \
+    void programUniform3dv(ShaderProgramID programPacked, UniformLocation locationPacked,          \
+                           GLsizei count, const GLdouble *value);                                  \
+    void programUniform4d(ShaderProgramID programPacked, UniformLocation locationPacked,           \
+                          GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3);                     \
+    void programUniform4dv(ShaderProgramID programPacked, UniformLocation locationPacked,          \
+                           GLsizei count, const GLdouble *value);                                  \
+    void programUniformMatrix2dv(ShaderProgramID programPacked, UniformLocation locationPacked,    \
+                                 GLsizei count, GLboolean transpose, const GLdouble *value);       \
+    void programUniformMatrix2x3dv(ShaderProgramID programPacked, UniformLocation locationPacked,  \
+                                   GLsizei count, GLboolean transpose, const GLdouble *value);     \
+    void programUniformMatrix2x4dv(ShaderProgramID programPacked, UniformLocation locationPacked,  \
+                                   GLsizei count, GLboolean transpose, const GLdouble *value);     \
+    void programUniformMatrix3dv(ShaderProgramID programPacked, UniformLocation locationPacked,    \
+                                 GLsizei count, GLboolean transpose, const GLdouble *value);       \
+    void programUniformMatrix3x2dv(ShaderProgramID programPacked, UniformLocation locationPacked,  \
+                                   GLsizei count, GLboolean transpose, const GLdouble *value);     \
+    void programUniformMatrix3x4dv(ShaderProgramID programPacked, UniformLocation locationPacked,  \
+                                   GLsizei count, GLboolean transpose, const GLdouble *value);     \
+    void programUniformMatrix4dv(ShaderProgramID programPacked, UniformLocation locationPacked,    \
+                                 GLsizei count, GLboolean transpose, const GLdouble *value);       \
+    void programUniformMatrix4x2dv(ShaderProgramID programPacked, UniformLocation locationPacked,  \
+                                   GLsizei count, GLboolean transpose, const GLdouble *value);     \
+    void programUniformMatrix4x3dv(ShaderProgramID programPacked, UniformLocation locationPacked,  \
+                                   GLsizei count, GLboolean transpose, const GLdouble *value);     \
+    void scissorArrayv(GLuint first, GLsizei count, const GLint *v);                               \
+    void scissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);    \
+    void scissorIndexedv(GLuint index, const GLint *v);                                            \
+    void vertexAttribL1d(GLuint index, GLdouble x);                                                \
+    void vertexAttribL1dv(GLuint index, const GLdouble *v);                                        \
+    void vertexAttribL2d(GLuint index, GLdouble x, GLdouble y);                                    \
+    void vertexAttribL2dv(GLuint index, const GLdouble *v);                                        \
+    void vertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);                        \
+    void vertexAttribL3dv(GLuint index, const GLdouble *v);                                        \
+    void vertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);            \
+    void vertexAttribL4dv(GLuint index, const GLdouble *v);                                        \
+    void vertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride,               \
+                              const void *pointer);                                                \
+    void viewportArrayv(GLuint first, GLsizei count, const GLfloat *v);                            \
+    void viewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);               \
+    void viewportIndexedfv(GLuint index, const GLfloat *v);                                        \
+    void drawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type,                \
+                                           const void *indices, GLsizei instancecount,             \
+                                           GLuint baseinstance);                                   \
+    void drawTransformFeedbackInstanced(GLenum mode, TransformFeedbackID idPacked,                 \
+                                        GLsizei instancecount);                                    \
+    void drawTransformFeedbackStreamInstanced(GLenum mode, TransformFeedbackID idPacked,           \
+                                              GLuint stream, GLsizei instancecount);               \
+    void getActiveAtomicCounterBufferiv(ShaderProgramID programPacked, GLuint bufferIndex,         \
+                                        GLenum pname, GLint *params);                              \
+    void clearBufferData(GLenum target, GLenum internalformat, GLenum format, GLenum type,         \
+                         const void *data);                                                        \
+    void clearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset,                 \
+                            GLsizeiptr size, GLenum format, GLenum type, const void *data);        \
+    void getInternalformati64v(GLenum target, GLenum internalformat, GLenum pname,                 \
+                               GLsizei bufSize, GLint64 *params);                                  \
+    void invalidateBufferData(BufferID bufferPacked);                                              \
+    void invalidateBufferSubData(BufferID bufferPacked, GLintptr offset, GLsizeiptr length);       \
+    void invalidateTexImage(TextureID texturePacked, GLint level);                                 \
+    void invalidateTexSubImage(TextureID texturePacked, GLint level, GLint xoffset, GLint yoffset, \
+                               GLint zoffset, GLsizei width, GLsizei height, GLsizei depth);       \
+    void multiDrawArraysIndirect(GLenum mode, const void *indirect, GLsizei drawcount,             \
+                                 GLsizei stride);                                                  \
+    void multiDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect,                 \
+                                   GLsizei drawcount, GLsizei stride);                             \
+    void shaderStorageBlockBinding(ShaderProgramID programPacked, GLuint storageBlockIndex,        \
+                                   GLuint storageBlockBinding);                                    \
+    void textureView(TextureID texturePacked, GLenum target, GLuint origtexture,                   \
+                     GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer,    \
+                     GLuint numlayers);                                                            \
+    void vertexAttribLFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);  \
+    void bindBuffersBase(GLenum target, GLuint first, GLsizei count,                               \
+                         const BufferID *buffersPacked);                                           \
+    void bindBuffersRange(GLenum target, GLuint first, GLsizei count,                              \
+                          const BufferID *buffersPacked, const GLintptr *offsets,                  \
+                          const GLsizeiptr *sizes);                                                \
+    void bindImageTextures(GLuint first, GLsizei count, const GLuint *textures);                   \
+    void bindSamplers(GLuint first, GLsizei count, const GLuint *samplers);                        \
+    void bindTextures(GLuint first, GLsizei count, const GLuint *textures);                        \
+    void bindVertexBuffers(GLuint first, GLsizei count, const BufferID *buffersPacked,             \
+                           const GLintptr *offsets, const GLsizei *strides);                       \
+    void clearTexImage(TextureID texturePacked, GLint level, GLenum format, GLenum type,           \
+                       const void *data);                                                          \
+    void clearTexSubImage(TextureID texturePacked, GLint level, GLint xoffset, GLint yoffset,      \
+                          GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,             \
+                          GLenum format, GLenum type, const void *data);                           \
+    void bindTextureUnit(GLuint unit, TextureID texturePacked);                                    \
+    void blitNamedFramebuffer(GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0,         \
+                              GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0,     \
+                              GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);           \
+    GLenum checkNamedFramebufferStatus(FramebufferID framebufferPacked, GLenum target);            \
+    void clearNamedBufferData(BufferID bufferPacked, GLenum internalformat, GLenum format,         \
+                              GLenum type, const void *data);                                      \
+    void clearNamedBufferSubData(BufferID bufferPacked, GLenum internalformat, GLintptr offset,    \
+                                 GLsizeiptr size, GLenum format, GLenum type, const void *data);   \
+    void clearNamedFramebufferfi(FramebufferID framebufferPacked, GLenum buffer, GLint drawbuffer, \
+                                 GLfloat depth, GLint stencil);                                    \
+    void clearNamedFramebufferfv(FramebufferID framebufferPacked, GLenum buffer, GLint drawbuffer, \
+                                 const GLfloat *value);                                            \
+    void clearNamedFramebufferiv(FramebufferID framebufferPacked, GLenum buffer, GLint drawbuffer, \
+                                 const GLint *value);                                              \
+    void clearNamedFramebufferuiv(FramebufferID framebufferPacked, GLenum buffer,                  \
+                                  GLint drawbuffer, const GLuint *value);                          \
+    void clipControl(GLenum origin, GLenum depth);                                                 \
+    void compressedTextureSubImage1D(TextureID texturePacked, GLint level, GLint xoffset,          \
+                                     GLsizei width, GLenum format, GLsizei imageSize,              \
+                                     const void *data);                                            \
+    void compressedTextureSubImage2D(TextureID texturePacked, GLint level, GLint xoffset,          \
+                                     GLint yoffset, GLsizei width, GLsizei height, GLenum format,  \
+                                     GLsizei imageSize, const void *data);                         \
+    void compressedTextureSubImage3D(TextureID texturePacked, GLint level, GLint xoffset,          \
+                                     GLint yoffset, GLint zoffset, GLsizei width, GLsizei height,  \
+                                     GLsizei depth, GLenum format, GLsizei imageSize,              \
+                                     const void *data);                                            \
+    void copyNamedBufferSubData(GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset,        \
+                                GLintptr writeOffset, GLsizeiptr size);                            \
+    void copyTextureSubImage1D(TextureID texturePacked, GLint level, GLint xoffset, GLint x,       \
+                               GLint y, GLsizei width);                                            \
+    void copyTextureSubImage2D(TextureID texturePacked, GLint level, GLint xoffset, GLint yoffset, \
+                               GLint x, GLint y, GLsizei width, GLsizei height);                   \
+    void copyTextureSubImage3D(TextureID texturePacked, GLint level, GLint xoffset, GLint yoffset, \
+                               GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);    \
+    void createBuffers(GLsizei n, BufferID *buffersPacked);                                        \
+    void createFramebuffers(GLsizei n, GLuint *framebuffers);                                      \
+    void createProgramPipelines(GLsizei n, GLuint *pipelines);                                     \
+    void createQueries(GLenum target, GLsizei n, GLuint *ids);                                     \
+    void createRenderbuffers(GLsizei n, RenderbufferID *renderbuffersPacked);                      \
+    void createSamplers(GLsizei n, GLuint *samplers);                                              \
+    void createTextures(GLenum target, GLsizei n, GLuint *textures);                               \
+    void createTransformFeedbacks(GLsizei n, GLuint *ids);                                         \
+    void createVertexArrays(GLsizei n, VertexArrayID *arraysPacked);                               \
+    void disableVertexArrayAttrib(VertexArrayID vaobjPacked, GLuint index);                        \
+    void enableVertexArrayAttrib(VertexArrayID vaobjPacked, GLuint index);                         \
+    void flushMappedNamedBufferRange(BufferID bufferPacked, GLintptr offset, GLsizeiptr length);   \
+    void generateTextureMipmap(TextureID texturePacked);                                           \
+    void getCompressedTextureImage(TextureID texturePacked, GLint level, GLsizei bufSize,          \
+                                   void *pixels);                                                  \
+    void getCompressedTextureSubImage(TextureID texturePacked, GLint level, GLint xoffset,         \
+                                      GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, \
+                                      GLsizei depth, GLsizei bufSize, void *pixels);               \
+    void getNamedBufferParameteri64v(BufferID bufferPacked, GLenum pname, GLint64 *params);        \
+    void getNamedBufferParameteriv(BufferID bufferPacked, GLenum pname, GLint *params);            \
+    void getNamedBufferPointerv(BufferID bufferPacked, GLenum pname, void **params);               \
+    void getNamedBufferSubData(BufferID bufferPacked, GLintptr offset, GLsizeiptr size,            \
+                               void *data);                                                        \
+    void getNamedFramebufferAttachmentParameteriv(FramebufferID framebufferPacked,                 \
+                                                  GLenum attachment, GLenum pname, GLint *params); \
+    void getNamedFramebufferParameteriv(FramebufferID framebufferPacked, GLenum pname,             \
+                                        GLint *param);                                             \
+    void getNamedRenderbufferParameteriv(RenderbufferID renderbufferPacked, GLenum pname,          \
+                                         GLint *params);                                           \
+    void getQueryBufferObjecti64v(GLuint id, BufferID bufferPacked, GLenum pname,                  \
+                                  GLintptr offset);                                                \
+    void getQueryBufferObjectiv(GLuint id, BufferID bufferPacked, GLenum pname, GLintptr offset);  \
+    void getQueryBufferObjectui64v(GLuint id, BufferID bufferPacked, GLenum pname,                 \
+                                   GLintptr offset);                                               \
+    void getQueryBufferObjectuiv(GLuint id, BufferID bufferPacked, GLenum pname, GLintptr offset); \
+    void getTextureImage(TextureID texturePacked, GLint level, GLenum format, GLenum type,         \
+                         GLsizei bufSize, void *pixels);                                           \
+    void getTextureLevelParameterfv(TextureID texturePacked, GLint level, GLenum pname,            \
+                                    GLfloat *params);                                              \
+    void getTextureLevelParameteriv(TextureID texturePacked, GLint level, GLenum pname,            \
+                                    GLint *params);                                                \
+    void getTextureParameterIiv(TextureID texturePacked, GLenum pname, GLint *params);             \
+    void getTextureParameterIuiv(TextureID texturePacked, GLenum pname, GLuint *params);           \
+    void getTextureParameterfv(TextureID texturePacked, GLenum pname, GLfloat *params);            \
+    void getTextureParameteriv(TextureID texturePacked, GLenum pname, GLint *params);              \
+    void getTextureSubImage(TextureID texturePacked, GLint level, GLint xoffset, GLint yoffset,    \
+                            GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,           \
+                            GLenum format, GLenum type, GLsizei bufSize, void *pixels);            \
+    void getTransformFeedbacki64_v(GLuint xfb, GLenum pname, GLuint index, GLint64 *param);        \
+    void getTransformFeedbacki_v(GLuint xfb, GLenum pname, GLuint index, GLint *param);            \
+    void getTransformFeedbackiv(GLuint xfb, GLenum pname, GLint *param);                           \
+    void getVertexArrayIndexed64iv(VertexArrayID vaobjPacked, GLuint index, GLenum pname,          \
+                                   GLint64 *param);                                                \
+    void getVertexArrayIndexediv(VertexArrayID vaobjPacked, GLuint index, GLenum pname,            \
+                                 GLint *param);                                                    \
+    void getVertexArrayiv(VertexArrayID vaobjPacked, GLenum pname, GLint *param);                  \
+    void getnColorTable(GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table);  \
+    void getnCompressedTexImage(GLenum target, GLint lod, GLsizei bufSize, void *pixels);          \
+    void getnConvolutionFilter(GLenum target, GLenum format, GLenum type, GLsizei bufSize,         \
+                               void *image);                                                       \
+    void getnHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type,                 \
+                       GLsizei bufSize, void *values);                                             \
+    void getnMapdv(GLenum target, GLenum query, GLsizei bufSize, GLdouble *v);                     \
+    void getnMapfv(GLenum target, GLenum query, GLsizei bufSize, GLfloat *v);                      \
+    void getnMapiv(GLenum target, GLenum query, GLsizei bufSize, GLint *v);                        \
+    void getnMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize,   \
+                    void *values);                                                                 \
+    void getnPixelMapfv(GLenum map, GLsizei bufSize, GLfloat *values);                             \
+    void getnPixelMapuiv(GLenum map, GLsizei bufSize, GLuint *values);                             \
+    void getnPixelMapusv(GLenum map, GLsizei bufSize, GLushort *values);                           \
+    void getnPolygonStipple(GLsizei bufSize, GLubyte *pattern);                                    \
+    void getnSeparableFilter(GLenum target, GLenum format, GLenum type, GLsizei rowBufSize,        \
+                             void *row, GLsizei columnBufSize, void *column, void *span);          \
+    void getnTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize,     \
+                      void *pixels);                                                               \
+    void getnUniformdv(ShaderProgramID programPacked, UniformLocation locationPacked,              \
+                       GLsizei bufSize, GLdouble *params);                                         \
+    void invalidateNamedFramebufferData(FramebufferID framebufferPacked, GLsizei numAttachments,   \
+                                        const GLenum *attachments);                                \
+    void invalidateNamedFramebufferSubData(FramebufferID framebufferPacked,                        \
+                                           GLsizei numAttachments, const GLenum *attachments,      \
+                                           GLint x, GLint y, GLsizei width, GLsizei height);       \
+    void *mapNamedBuffer(BufferID bufferPacked, GLenum access);                                    \
+    void *mapNamedBufferRange(BufferID bufferPacked, GLintptr offset, GLsizeiptr length,           \
+                              GLbitfield access);                                                  \
+    void namedBufferData(BufferID bufferPacked, GLsizeiptr size, const void *data, GLenum usage);  \
+    void namedBufferStorage(BufferID bufferPacked, GLsizeiptr size, const void *data,              \
+                            GLbitfield flags);                                                     \
+    void namedBufferSubData(BufferID bufferPacked, GLintptr offset, GLsizeiptr size,               \
+                            const void *data);                                                     \
+    void namedFramebufferDrawBuffer(FramebufferID framebufferPacked, GLenum buf);                  \
+    void namedFramebufferDrawBuffers(FramebufferID framebufferPacked, GLsizei n,                   \
+                                     const GLenum *bufs);                                          \
+    void namedFramebufferParameteri(FramebufferID framebufferPacked, GLenum pname, GLint param);   \
+    void namedFramebufferReadBuffer(FramebufferID framebufferPacked, GLenum src);                  \
+    void namedFramebufferRenderbuffer(FramebufferID framebufferPacked, GLenum attachment,          \
+                                      GLenum renderbuffertarget,                                   \
+                                      RenderbufferID renderbufferPacked);                          \
+    void namedFramebufferTexture(FramebufferID framebufferPacked, GLenum attachment,               \
+                                 TextureID texturePacked, GLint level);                            \
+    void namedFramebufferTextureLayer(FramebufferID framebufferPacked, GLenum attachment,          \
+                                      TextureID texturePacked, GLint level, GLint layer);          \
+    void namedRenderbufferStorage(RenderbufferID renderbufferPacked, GLenum internalformat,        \
+                                  GLsizei width, GLsizei height);                                  \
+    void namedRenderbufferStorageMultisample(RenderbufferID renderbufferPacked, GLsizei samples,   \
+                                             GLenum internalformat, GLsizei width,                 \
+                                             GLsizei height);                                      \
+    void textureBarrier();                                                                         \
+    void textureBuffer(TextureID texturePacked, GLenum internalformat, BufferID bufferPacked);     \
+    void textureBufferRange(TextureID texturePacked, GLenum internalformat, BufferID bufferPacked, \
+                            GLintptr offset, GLsizeiptr size);                                     \
+    void textureParameterIiv(TextureID texturePacked, GLenum pname, const GLint *params);          \
+    void textureParameterIuiv(TextureID texturePacked, GLenum pname, const GLuint *params);        \
+    void textureParameterf(TextureID texturePacked, GLenum pname, GLfloat param);                  \
+    void textureParameterfv(TextureID texturePacked, GLenum pname, const GLfloat *param);          \
+    void textureParameteri(TextureID texturePacked, GLenum pname, GLint param);                    \
+    void textureParameteriv(TextureID texturePacked, GLenum pname, const GLint *param);            \
+    void textureStorage1D(TextureID texturePacked, GLsizei levels, GLenum internalformat,          \
+                          GLsizei width);                                                          \
+    void textureStorage2D(TextureID texturePacked, GLsizei levels, GLenum internalformat,          \
+                          GLsizei width, GLsizei height);                                          \
+    void textureStorage2DMultisample(TextureID texturePacked, GLsizei samples,                     \
+                                     GLenum internalformat, GLsizei width, GLsizei height,         \
+                                     GLboolean fixedsamplelocations);                              \
+    void textureStorage3D(TextureID texturePacked, GLsizei levels, GLenum internalformat,          \
+                          GLsizei width, GLsizei height, GLsizei depth);                           \
+    void textureStorage3DMultisample(TextureID texturePacked, GLsizei samples,                     \
+                                     GLenum internalformat, GLsizei width, GLsizei height,         \
+                                     GLsizei depth, GLboolean fixedsamplelocations);               \
+    void textureSubImage1D(TextureID texturePacked, GLint level, GLint xoffset, GLsizei width,     \
+                           GLenum format, GLenum type, const void *pixels);                        \
+    void textureSubImage2D(TextureID texturePacked, GLint level, GLint xoffset, GLint yoffset,     \
+                           GLsizei width, GLsizei height, GLenum format, GLenum type,              \
+                           const void *pixels);                                                    \
+    void textureSubImage3D(TextureID texturePacked, GLint level, GLint xoffset, GLint yoffset,     \
+                           GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,            \
+                           GLenum format, GLenum type, const void *pixels);                        \
+    void transformFeedbackBufferBase(GLuint xfb, GLuint index, BufferID bufferPacked);             \
+    void transformFeedbackBufferRange(GLuint xfb, GLuint index, BufferID bufferPacked,             \
+                                      GLintptr offset, GLsizeiptr size);                           \
+    GLboolean unmapNamedBuffer(BufferID bufferPacked);                                             \
+    void vertexArrayAttribBinding(VertexArrayID vaobjPacked, GLuint attribindex,                   \
+                                  GLuint bindingindex);                                            \
+    void vertexArrayAttribFormat(VertexArrayID vaobjPacked, GLuint attribindex, GLint size,        \
+                                 GLenum type, GLboolean normalized, GLuint relativeoffset);        \
+    void vertexArrayAttribIFormat(VertexArrayID vaobjPacked, GLuint attribindex, GLint size,       \
+                                  GLenum type, GLuint relativeoffset);                             \
+    void vertexArrayAttribLFormat(VertexArrayID vaobjPacked, GLuint attribindex, GLint size,       \
+                                  GLenum type, GLuint relativeoffset);                             \
+    void vertexArrayBindingDivisor(VertexArrayID vaobjPacked, GLuint bindingindex,                 \
+                                   GLuint divisor);                                                \
+    void vertexArrayElementBuffer(VertexArrayID vaobjPacked, BufferID bufferPacked);               \
+    void vertexArrayVertexBuffer(VertexArrayID vaobjPacked, GLuint bindingindex,                   \
+                                 BufferID bufferPacked, GLintptr offset, GLsizei stride);          \
+    void vertexArrayVertexBuffers(VertexArrayID vaobjPacked, GLuint first, GLsizei count,          \
+                                  const BufferID *buffersPacked, const GLintptr *offsets,          \
+                                  const GLsizei *strides);                                         \
+    void multiDrawArraysIndirectCount(GLenum mode, const void *indirect, GLintptr drawcount,       \
+                                      GLsizei maxdrawcount, GLsizei stride);                       \
+    void multiDrawElementsIndirectCount(GLenum mode, GLenum type, const void *indirect,            \
+                                        GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); \
+    void polygonOffsetClamp(GLfloat factor, GLfloat units, GLfloat clamp);                         \
+    void specializeShader(GLuint shader, const GLchar *pEntryPoint,                                \
+                          GLuint numSpecializationConstants, const GLuint *pConstantIndex,         \
+                          const GLuint *pConstantValue);
+
+#endif  // ANGLE_CONTEXT_API_4_AUTOGEN_H_
diff --git a/src/libANGLE/Context_gles_ext_autogen.h b/src/libANGLE/Context_gles_ext_autogen.h
index 9f090a9..584f8b8 100644
--- a/src/libANGLE/Context_gles_ext_autogen.h
+++ b/src/libANGLE/Context_gles_ext_autogen.h
@@ -305,6 +305,8 @@
                        GLbitfield flags);                                                          \
     /* GL_EXT_compressed_ETC1_RGB8_sub_texture */                                                  \
     /* GL_EXT_copy_image */                                                                        \
+    /* GL_EXT_debug_label */                                                                       \
+    void labelObject(GLenum type, GLuint object, GLsizei length, const GLchar *label);             \
     /* GL_EXT_debug_marker */                                                                      \
     void insertEventMarker(GLsizei length, const GLchar *marker);                                  \
     void popGroupMarker();                                                                         \
@@ -386,6 +388,7 @@
     /* GL_EXT_semaphore_fd */                                                                      \
     void importSemaphoreFd(SemaphoreID semaphorePacked, HandleType handleTypePacked, GLint fd);    \
     /* GL_EXT_separate_shader_objects */                                                           \
+    /* GL_EXT_shader_io_blocks */                                                                  \
     /* GL_EXT_tessellation_shader */                                                               \
     /* GL_EXT_texture_buffer */                                                                    \
     /* GL_EXT_texture_compression_bptc */                                                          \
@@ -422,6 +425,7 @@
     /* GL_OES_mapbuffer */                                                                         \
     void *mapBuffer(BufferBinding targetPacked, GLenum access);                                    \
     /* GL_OES_sample_shading */                                                                    \
+    /* GL_OES_shader_io_blocks */                                                                  \
     /* GL_OES_texture_3D */                                                                        \
     void framebufferTexture3D(GLenum target, GLenum attachment, TextureTarget textargetPacked,     \
                               TextureID texturePacked, GLint level, GLint zoffset);                \
diff --git a/src/libANGLE/Device.cpp b/src/libANGLE/Device.cpp
index e549af6..0bff8d0 100644
--- a/src/libANGLE/Device.cpp
+++ b/src/libANGLE/Device.cpp
@@ -110,9 +110,9 @@
     return error;
 }
 
-EGLint Device::getType()
+EGLint Device::getType() const
 {
-    return getImplementation()->getType();
+    return mImplementation.get()->getType();
 }
 
 void Device::initDeviceExtensions()
diff --git a/src/libANGLE/Device.h b/src/libANGLE/Device.h
index e28e532..8fbdf72 100644
--- a/src/libANGLE/Device.h
+++ b/src/libANGLE/Device.h
@@ -33,8 +33,8 @@
     EGLLabelKHR getLabel() const override;
 
     Error getAttribute(EGLint attribute, EGLAttrib *value);
-    Display *getOwningDisplay() { return mOwningDisplay; }
-    EGLint getType();
+    Display *getOwningDisplay() const { return mOwningDisplay; }
+    EGLint getType() const;
 
     const DeviceExtensions &getExtensions() const;
     const std::string &getExtensionString() const;
diff --git a/src/libANGLE/Display.cpp b/src/libANGLE/Display.cpp
index 030e09f..7f5da30 100644
--- a/src/libANGLE/Display.cpp
+++ b/src/libANGLE/Display.cpp
@@ -864,33 +864,30 @@
     initVendorString();
 
     // Populate the Display's EGLDeviceEXT if the Display wasn't created using one
-    if (mPlatform != EGL_PLATFORM_DEVICE_EXT)
-    {
-        if (mDisplayExtensions.deviceQuery)
-        {
-            std::unique_ptr<rx::DeviceImpl> impl(mImplementation->createDevice());
-            ASSERT(impl != nullptr);
-            error = impl->initialize();
-            if (error.isError())
-            {
-                ERR() << "Failed to initialize display because device creation failed: "
-                      << error.getMessage();
-                mImplementation->terminate();
-                return error;
-            }
-            mDevice = new Device(this, impl.release());
-        }
-        else
-        {
-            mDevice = nullptr;
-        }
-    }
-    else
+    if (mPlatform == EGL_PLATFORM_DEVICE_EXT)
     {
         // For EGL_PLATFORM_DEVICE_EXT, mDevice should always be populated using
         // an external device
         ASSERT(mDevice != nullptr);
     }
+    else if (GetClientExtensions().deviceQueryEXT)
+    {
+        std::unique_ptr<rx::DeviceImpl> impl(mImplementation->createDevice());
+        ASSERT(impl);
+        error = impl->initialize();
+        if (error.isError())
+        {
+            ERR() << "Failed to initialize display because device creation failed: "
+                  << error.getMessage();
+            mImplementation->terminate();
+            return error;
+        }
+        mDevice = new Device(this, impl.release());
+    }
+    else
+    {
+        mDevice = nullptr;
+    }
 
     mInitialized = true;
 
@@ -1666,6 +1663,7 @@
     extensions.debug                     = true;
     extensions.explicitContext           = true;
     extensions.featureControlANGLE       = true;
+    extensions.deviceQueryEXT            = true;
 
     return extensions;
 }
@@ -1752,7 +1750,7 @@
     return mImplementation->validateImageClientBuffer(context, target, clientBuffer, attribs);
 }
 
-Error Display::valdiatePixmap(Config *config,
+Error Display::valdiatePixmap(const Config *config,
                               EGLNativePixmapType pixmap,
                               const AttributeMap &attributes) const
 {
@@ -2044,8 +2042,10 @@
     bufferVector->push_back(std::move(scratchBuffer));
 }
 
-egl::Error Display::handleGPUSwitch()
+Error Display::handleGPUSwitch()
 {
-    return mImplementation->handleGPUSwitch();
+    ANGLE_TRY(mImplementation->handleGPUSwitch());
+    initVendorString();
+    return NoError();
 }
 }  // namespace egl
diff --git a/src/libANGLE/Display.h b/src/libANGLE/Display.h
index 4ac6336..11359de 100644
--- a/src/libANGLE/Display.h
+++ b/src/libANGLE/Display.h
@@ -199,7 +199,7 @@
                                     EGLenum target,
                                     EGLClientBuffer clientBuffer,
                                     const egl::AttributeMap &attribs) const;
-    Error valdiatePixmap(Config *config,
+    Error valdiatePixmap(const Config *config,
                          EGLNativePixmapType pixmap,
                          const AttributeMap &attributes) const;
 
diff --git a/src/libANGLE/Error.h b/src/libANGLE/Error.h
index b7d7e6a..2b09aec 100644
--- a/src/libANGLE/Error.h
+++ b/src/libANGLE/Error.h
@@ -186,6 +186,22 @@
     return err.isError();
 }
 
+// TODO(jmadill): Remove this when refactor is complete. http://anglebug.com/3041
+inline bool IsError(bool value)
+{
+    return !value;
+}
+
+// Utility macro for handling implementation methods inside Validation.
+#define ANGLE_HANDLE_VALIDATION_ERR(X) \
+    do                                 \
+    {                                  \
+        (void)(X);                     \
+        return false;                  \
+    } while (0)
+
+#define ANGLE_VALIDATION_TRY(EXPR) ANGLE_TRY_TEMPLATE(EXPR, ANGLE_HANDLE_VALIDATION_ERR)
+
 #include "Error.inc"
 
 #endif  // LIBANGLE_ERROR_H_
diff --git a/src/libANGLE/FrameCapture.cpp b/src/libANGLE/FrameCapture.cpp
index e5f7da8..61417dc 100644
--- a/src/libANGLE/FrameCapture.cpp
+++ b/src/libANGLE/FrameCapture.cpp
@@ -527,14 +527,14 @@
 {
     std::ostringstream callOut;
 
-    if (call.entryPoint == gl::EntryPoint::CreateShader ||
-        call.entryPoint == gl::EntryPoint::CreateProgram)
+    if (call.entryPoint == EntryPoint::GLCreateShader ||
+        call.entryPoint == EntryPoint::GLCreateProgram)
     {
         GLuint id = call.params.getReturnValue().value.GLuintVal;
         callOut << "gShaderProgramMap[" << id << "] = ";
     }
 
-    if (call.entryPoint == gl::EntryPoint::FenceSync)
+    if (call.entryPoint == EntryPoint::GLFenceSync)
     {
         GLsync sync = call.params.getReturnValue().value.GLsyncVal;
         callOut << "gSyncMap[" << SyncIndexValue(sync) << "] = ";
@@ -543,8 +543,8 @@
     // Depending on how a buffer is mapped, we may need to track its location for readback
     bool trackBufferPointer = false;
 
-    if (call.entryPoint == gl::EntryPoint::MapBufferRange ||
-        call.entryPoint == gl::EntryPoint::MapBufferRangeEXT)
+    if (call.entryPoint == EntryPoint::GLMapBufferRange ||
+        call.entryPoint == EntryPoint::GLMapBufferRangeEXT)
     {
         GLbitfield access =
             call.params.getParam("access", ParamType::TGLbitfield, 3).value.GLbitfieldVal;
@@ -552,8 +552,7 @@
         trackBufferPointer = access & GL_MAP_WRITE_BIT;
     }
 
-    if (call.entryPoint == gl::EntryPoint::MapBuffer ||
-        call.entryPoint == gl::EntryPoint::MapBufferOES)
+    if (call.entryPoint == EntryPoint::GLMapBuffer || call.entryPoint == EntryPoint::GLMapBufferOES)
     {
         GLenum access = call.params.getParam("access", ParamType::TGLenum, 1).value.GLenumVal;
 
@@ -1616,7 +1615,7 @@
 
     switch (call.entryPoint)
     {
-        case gl::EntryPoint::GenBuffers:
+        case EntryPoint::GLGenBuffers:
         {
             const ParamCapture &buffers =
                 call.params.getParam("buffersPacked", ParamType::TBufferIDPointer, 1);
@@ -1624,7 +1623,7 @@
             break;
         }
 
-        case gl::EntryPoint::GenFencesNV:
+        case EntryPoint::GLGenFencesNV:
         {
             const ParamCapture &fences =
                 call.params.getParam("fencesPacked", ParamType::TFenceNVIDPointer, 1);
@@ -1632,8 +1631,8 @@
             break;
         }
 
-        case gl::EntryPoint::GenFramebuffers:
-        case gl::EntryPoint::GenFramebuffersOES:
+        case EntryPoint::GLGenFramebuffers:
+        case EntryPoint::GLGenFramebuffersOES:
         {
             const ParamCapture &framebuffers =
                 call.params.getParam("framebuffersPacked", ParamType::TFramebufferIDPointer, 1);
@@ -1641,7 +1640,7 @@
             break;
         }
 
-        case gl::EntryPoint::GenProgramPipelines:
+        case EntryPoint::GLGenProgramPipelines:
         {
             const ParamCapture &pipelines =
                 call.params.getParam("pipelinesPacked", ParamType::TProgramPipelineIDPointer, 1);
@@ -1649,8 +1648,8 @@
             break;
         }
 
-        case gl::EntryPoint::GenQueries:
-        case gl::EntryPoint::GenQueriesEXT:
+        case EntryPoint::GLGenQueries:
+        case EntryPoint::GLGenQueriesEXT:
         {
             const ParamCapture &queries =
                 call.params.getParam("idsPacked", ParamType::TQueryIDPointer, 1);
@@ -1658,8 +1657,8 @@
             break;
         }
 
-        case gl::EntryPoint::GenRenderbuffers:
-        case gl::EntryPoint::GenRenderbuffersOES:
+        case EntryPoint::GLGenRenderbuffers:
+        case EntryPoint::GLGenRenderbuffersOES:
         {
             const ParamCapture &renderbuffers =
                 call.params.getParam("renderbuffersPacked", ParamType::TRenderbufferIDPointer, 1);
@@ -1667,7 +1666,7 @@
             break;
         }
 
-        case gl::EntryPoint::GenSamplers:
+        case EntryPoint::GLGenSamplers:
         {
             const ParamCapture &samplers =
                 call.params.getParam("samplersPacked", ParamType::TSamplerIDPointer, 1);
@@ -1675,7 +1674,7 @@
             break;
         }
 
-        case gl::EntryPoint::GenSemaphoresEXT:
+        case EntryPoint::GLGenSemaphoresEXT:
         {
             const ParamCapture &semaphores =
                 call.params.getParam("semaphoresPacked", ParamType::TSemaphoreIDPointer, 1);
@@ -1683,7 +1682,7 @@
             break;
         }
 
-        case gl::EntryPoint::GenTextures:
+        case EntryPoint::GLGenTextures:
         {
             const ParamCapture &textures =
                 call.params.getParam("texturesPacked", ParamType::TTextureIDPointer, 1);
@@ -1691,7 +1690,7 @@
             break;
         }
 
-        case gl::EntryPoint::GenTransformFeedbacks:
+        case EntryPoint::GLGenTransformFeedbacks:
         {
             const ParamCapture &xfbs =
                 call.params.getParam("idsPacked", ParamType::TTransformFeedbackIDPointer, 1);
@@ -1699,8 +1698,8 @@
             break;
         }
 
-        case gl::EntryPoint::GenVertexArrays:
-        case gl::EntryPoint::GenVertexArraysOES:
+        case EntryPoint::GLGenVertexArrays:
+        case EntryPoint::GLGenVertexArraysOES:
         {
             const ParamCapture &vertexArrays =
                 call.params.getParam("arraysPacked", ParamType::TVertexArrayIDPointer, 1);
@@ -2820,7 +2819,7 @@
         {
             ASSERT(attrib.location != -1);
 
-            if (angle::BeginsWith(attrib.name, "gl_"))
+            if (gl::IsBuiltInName(attrib.name))
             {
                 // Don't try to bind built-in attributes
                 continue;
@@ -3351,29 +3350,34 @@
     replayState.setBufferBinding(context, gl::BufferBinding::Array, nullptr);
 }
 
-bool SkipCall(gl::EntryPoint entryPoint)
+bool SkipCall(EntryPoint entryPoint)
 {
     switch (entryPoint)
     {
-        case gl::EntryPoint::DebugMessageCallback:
-        case gl::EntryPoint::DebugMessageCallbackKHR:
-        case gl::EntryPoint::DebugMessageControl:
-        case gl::EntryPoint::DebugMessageControlKHR:
-        case gl::EntryPoint::DebugMessageInsert:
-        case gl::EntryPoint::DebugMessageInsertKHR:
-        case gl::EntryPoint::GetDebugMessageLog:
-        case gl::EntryPoint::GetDebugMessageLogKHR:
-        case gl::EntryPoint::GetObjectLabelKHR:
-        case gl::EntryPoint::GetObjectPtrLabelKHR:
-        case gl::EntryPoint::GetPointervKHR:
-        case gl::EntryPoint::InsertEventMarkerEXT:
-        case gl::EntryPoint::ObjectLabelKHR:
-        case gl::EntryPoint::ObjectPtrLabelKHR:
-        case gl::EntryPoint::PopDebugGroupKHR:
-        case gl::EntryPoint::PopGroupMarkerEXT:
-        case gl::EntryPoint::PushDebugGroupKHR:
-        case gl::EntryPoint::PushGroupMarkerEXT:
-            // Purposefully skip KHR_debug and EXT_debug_marker entry points
+        case EntryPoint::GLDebugMessageCallback:
+        case EntryPoint::GLDebugMessageCallbackKHR:
+        case EntryPoint::GLDebugMessageControl:
+        case EntryPoint::GLDebugMessageControlKHR:
+        case EntryPoint::GLDebugMessageInsert:
+        case EntryPoint::GLDebugMessageInsertKHR:
+        case EntryPoint::GLGetDebugMessageLog:
+        case EntryPoint::GLGetDebugMessageLogKHR:
+        case EntryPoint::GLGetObjectLabelEXT:
+        case EntryPoint::GLGetObjectLabelKHR:
+        case EntryPoint::GLGetObjectPtrLabelKHR:
+        case EntryPoint::GLGetPointervKHR:
+        case EntryPoint::GLInsertEventMarkerEXT:
+        case EntryPoint::GLLabelObjectEXT:
+        case EntryPoint::GLObjectLabelKHR:
+        case EntryPoint::GLObjectPtrLabelKHR:
+        case EntryPoint::GLPopDebugGroupKHR:
+        case EntryPoint::GLPopGroupMarkerEXT:
+        case EntryPoint::GLPushDebugGroupKHR:
+        case EntryPoint::GLPushGroupMarkerEXT:
+            // Purposefully skip entry points from:
+            // - KHR_debug
+            // - EXT_debug_label
+            // - EXT_debug_marker
             // There is no need to capture these for replaying a trace in our harness
             return true;
 
@@ -3502,12 +3506,12 @@
     return mParamCaptures[mClientArrayDataParam];
 }
 
-CallCapture::CallCapture(gl::EntryPoint entryPointIn, ParamBuffer &&paramsIn)
+CallCapture::CallCapture(EntryPoint entryPointIn, ParamBuffer &&paramsIn)
     : entryPoint(entryPointIn), params(std::move(paramsIn))
 {}
 
 CallCapture::CallCapture(const std::string &customFunctionNameIn, ParamBuffer &&paramsIn)
-    : entryPoint(gl::EntryPoint::Invalid),
+    : entryPoint(EntryPoint::GLInvalid),
       customFunctionName(customFunctionNameIn),
       params(std::move(paramsIn))
 {}
@@ -3529,13 +3533,13 @@
 
 const char *CallCapture::name() const
 {
-    if (entryPoint == gl::EntryPoint::Invalid)
+    if (entryPoint == EntryPoint::GLInvalid)
     {
         ASSERT(!customFunctionName.empty());
         return customFunctionName.c_str();
     }
 
-    return gl::GetEntryPointName(entryPoint);
+    return angle::GetEntryPointName(entryPoint);
 }
 
 ReplayContext::ReplayContext(size_t readBufferSizebytes,
@@ -3656,7 +3660,7 @@
     int depthParamOffset   = -1;
     switch (call.entryPoint)
     {
-        case gl::EntryPoint::CompressedTexSubImage3D:
+        case EntryPoint::GLCompressedTexSubImage3D:
             xoffsetParamOffset = 2;
             yoffsetParamOffset = 3;
             zoffsetParamOffset = 4;
@@ -3665,20 +3669,20 @@
             depthParamOffset   = 7;
             dataParamOffset    = 10;
             break;
-        case gl::EntryPoint::CompressedTexImage3D:
+        case EntryPoint::GLCompressedTexImage3D:
             widthParamOffset  = 3;
             heightParamOffset = 4;
             depthParamOffset  = 5;
             dataParamOffset   = 8;
             break;
-        case gl::EntryPoint::CompressedTexSubImage2D:
+        case EntryPoint::GLCompressedTexSubImage2D:
             xoffsetParamOffset = 2;
             yoffsetParamOffset = 3;
             widthParamOffset   = 4;
             heightParamOffset  = 5;
             dataParamOffset    = 8;
             break;
-        case gl::EntryPoint::CompressedTexImage2D:
+        case EntryPoint::GLCompressedTexImage2D:
             widthParamOffset  = 3;
             heightParamOffset = 4;
             dataParamOffset   = 7;
@@ -3847,7 +3851,7 @@
 {
     switch (call.entryPoint)
     {
-        case gl::EntryPoint::EGLImageTargetTexture2DOES:
+        case EntryPoint::GLEGLImageTargetTexture2DOES:
         {
             // We don't support reading EGLImages. Instead, just pull from a tiny null texture.
             // TODO (anglebug.com/4964): Read back the image data and populate the texture.
@@ -3856,7 +3860,7 @@
                                         1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixelData.data());
             break;
         }
-        case gl::EntryPoint::EGLImageTargetRenderbufferStorageOES:
+        case EntryPoint::GLEGLImageTargetRenderbufferStorageOES:
         {
             UNIMPLEMENTED();
             break;
@@ -3870,7 +3874,7 @@
 {
     switch (call.entryPoint)
     {
-        case gl::EntryPoint::VertexAttribPointer:
+        case EntryPoint::GLVertexAttribPointer:
         {
             // Get array location
             GLuint index = call.params.getParam("index", ParamType::TGLuint, 0).value.GLuintVal;
@@ -3886,7 +3890,7 @@
             break;
         }
 
-        case gl::EntryPoint::DeleteBuffers:
+        case EntryPoint::GLDeleteBuffers:
         {
             GLsizei count = call.params.getParam("n", ParamType::TGLsizei, 0).value.GLsizeiVal;
             const gl::BufferID *bufferIDs =
@@ -3909,7 +3913,7 @@
             break;
         }
 
-        case gl::EntryPoint::GenBuffers:
+        case EntryPoint::GLGenBuffers:
         {
             GLsizei count = call.params.getParam("n", ParamType::TGLsizei, 0).value.GLsizeiVal;
             const gl::BufferID *bufferIDs =
@@ -3926,7 +3930,7 @@
             break;
         }
 
-        case gl::EntryPoint::DrawArrays:
+        case EntryPoint::GLDrawArrays:
         {
             if (context->getStateCache().hasAnyActiveClientAttrib())
             {
@@ -3940,7 +3944,7 @@
             break;
         }
 
-        case gl::EntryPoint::DrawElements:
+        case EntryPoint::GLDrawElements:
         {
             if (context->getStateCache().hasAnyActiveClientAttrib())
             {
@@ -3976,7 +3980,7 @@
             break;
         }
 
-        case gl::EntryPoint::CompileShader:
+        case EntryPoint::GLCompileShader:
         {
             // Refresh the cached shader sources.
             gl::ShaderProgramID shaderID =
@@ -3988,7 +3992,7 @@
             break;
         }
 
-        case gl::EntryPoint::LinkProgram:
+        case EntryPoint::GLLinkProgram:
         {
             // Refresh the cached program sources.
             gl::ShaderProgramID programID =
@@ -4000,23 +4004,23 @@
             break;
         }
 
-        case gl::EntryPoint::CompressedTexImage1D:
-        case gl::EntryPoint::CompressedTexSubImage1D:
+        case EntryPoint::GLCompressedTexImage1D:
+        case EntryPoint::GLCompressedTexSubImage1D:
         {
             UNIMPLEMENTED();
             break;
         }
 
-        case gl::EntryPoint::CompressedTexImage2D:
-        case gl::EntryPoint::CompressedTexImage3D:
-        case gl::EntryPoint::CompressedTexSubImage2D:
-        case gl::EntryPoint::CompressedTexSubImage3D:
+        case EntryPoint::GLCompressedTexImage2D:
+        case EntryPoint::GLCompressedTexImage3D:
+        case EntryPoint::GLCompressedTexSubImage2D:
+        case EntryPoint::GLCompressedTexSubImage3D:
         {
             captureCompressedTextureData(context, call);
             break;
         }
 
-        case gl::EntryPoint::DeleteTextures:
+        case EntryPoint::GLDeleteTextures:
         {
             // Free any TextureLevelDataMap entries being tracked for this texture
             // This is to cover the scenario where a texture has been created, its
@@ -4040,8 +4044,8 @@
             break;
         }
 
-        case gl::EntryPoint::MapBuffer:
-        case gl::EntryPoint::MapBufferOES:
+        case EntryPoint::GLMapBuffer:
+        case EntryPoint::GLMapBufferOES:
         {
             gl::BufferBinding target =
                 call.params.getParam("targetPacked", ParamType::TBufferBinding, 0)
@@ -4062,14 +4066,14 @@
             break;
         }
 
-        case gl::EntryPoint::UnmapNamedBuffer:
+        case EntryPoint::GLUnmapNamedBuffer:
         {
             UNIMPLEMENTED();
             break;
         }
 
-        case gl::EntryPoint::MapBufferRange:
-        case gl::EntryPoint::MapBufferRangeEXT:
+        case EntryPoint::GLMapBufferRange:
+        case EntryPoint::GLMapBufferRangeEXT:
         {
             GLintptr offset =
                 call.params.getParam("offset", ParamType::TGLintptr, 1).value.GLintptrVal;
@@ -4087,8 +4091,8 @@
             break;
         }
 
-        case gl::EntryPoint::UnmapBuffer:
-        case gl::EntryPoint::UnmapBufferOES:
+        case EntryPoint::GLUnmapBuffer:
+        case EntryPoint::GLUnmapBufferOES:
         {
             // See if we need to capture the buffer contents
             captureMappedBufferSnapshot(context, call);
@@ -4102,8 +4106,8 @@
             break;
         }
 
-        case gl::EntryPoint::BufferData:
-        case gl::EntryPoint::BufferSubData:
+        case EntryPoint::GLBufferData:
+        case EntryPoint::GLBufferSubData:
         {
             gl::BufferBinding target =
                 call.params.getParam("targetPacked", ParamType::TBufferBinding, 0)
@@ -4160,7 +4164,7 @@
     const CallCapture &lastCall = mFrameCalls.back();
     switch (lastCall.entryPoint)
     {
-        case gl::EntryPoint::LinkProgram:
+        case EntryPoint::GLLinkProgram:
         {
             const ParamCapture &param =
                 lastCall.params.getParam("programPacked", ParamType::TShaderProgramID, 0);
@@ -4169,10 +4173,10 @@
             CaptureUpdateUniformLocations(program, &mFrameCalls);
             break;
         }
-        case gl::EntryPoint::UseProgram:
+        case EntryPoint::GLUseProgram:
             CaptureUpdateCurrentProgram(lastCall, &mFrameCalls);
             break;
-        case gl::EntryPoint::DeleteProgram:
+        case EntryPoint::GLDeleteProgram:
         {
             const ParamCapture &param =
                 lastCall.params.getParam("programPacked", ParamType::TShaderProgramID, 0);
@@ -4421,7 +4425,7 @@
 
 DataCounters::~DataCounters() = default;
 
-int DataCounters::getAndIncrement(gl::EntryPoint entryPoint, const std::string &paramName)
+int DataCounters::getAndIncrement(EntryPoint entryPoint, const std::string &paramName)
 {
     Counter counterKey = {entryPoint, paramName};
     return mData[counterKey]++;
@@ -4546,7 +4550,7 @@
     {
         INFO() << "frame index: " << mFrameIndex << " " << call.name();
 
-        if (call.entryPoint == gl::EntryPoint::Invalid)
+        if (call.entryPoint == EntryPoint::GLInvalid)
         {
             if (call.customFunctionName == "UpdateClientArrayPointer")
             {
diff --git a/src/libANGLE/FrameCapture.h b/src/libANGLE/FrameCapture.h
index 93c6a16..4aa1a73 100644
--- a/src/libANGLE/FrameCapture.h
+++ b/src/libANGLE/FrameCapture.h
@@ -96,7 +96,7 @@
 
 struct CallCapture
 {
-    CallCapture(gl::EntryPoint entryPointIn, ParamBuffer &&paramsIn);
+    CallCapture(EntryPoint entryPointIn, ParamBuffer &&paramsIn);
     CallCapture(const std::string &customFunctionNameIn, ParamBuffer &&paramsIn);
     ~CallCapture();
 
@@ -105,7 +105,7 @@
 
     const char *name() const;
 
-    gl::EntryPoint entryPoint;
+    EntryPoint entryPoint;
     std::string customFunctionName;
     ParamBuffer params;
 };
@@ -171,11 +171,11 @@
     DataCounters();
     ~DataCounters();
 
-    int getAndIncrement(gl::EntryPoint entryPoint, const std::string &paramName);
+    int getAndIncrement(EntryPoint entryPoint, const std::string &paramName);
 
   private:
     // <CallName, ParamName>
-    using Counter = std::pair<gl::EntryPoint, std::string>;
+    using Counter = std::pair<EntryPoint, std::string>;
     std::map<Counter, int> mData;
 };
 
diff --git a/src/libANGLE/GLES1Renderer.cpp b/src/libANGLE/GLES1Renderer.cpp
index 3fbf034..285f1a7 100644
--- a/src/libANGLE/GLES1Renderer.cpp
+++ b/src/libANGLE/GLES1Renderer.cpp
@@ -549,7 +549,7 @@
                                          State *glState,
                                          ShaderProgramID vertexShader,
                                          ShaderProgramID fragmentShader,
-                                         const std::unordered_map<GLint, std::string> &attribLocs,
+                                         const angle::HashMap<GLint, std::string> &attribLocs,
                                          ShaderProgramID *programOut)
 {
     ShaderProgramID program = mShaderPrograms->createProgram(context->getImplementation());
@@ -615,7 +615,7 @@
     ANGLE_TRY(compileShader(context, ShaderType::Fragment, fragmentStream.str().c_str(),
                             &fragmentShader));
 
-    std::unordered_map<GLint, std::string> attribLocs;
+    angle::HashMap<GLint, std::string> attribLocs;
 
     attribLocs[(GLint)kVertexAttribIndex]    = "pos";
     attribLocs[(GLint)kNormalAttribIndex]    = "normal";
diff --git a/src/libANGLE/GLES1Renderer.h b/src/libANGLE/GLES1Renderer.h
index 5fef075..51a3732 100644
--- a/src/libANGLE/GLES1Renderer.h
+++ b/src/libANGLE/GLES1Renderer.h
@@ -66,7 +66,7 @@
                               State *glState,
                               ShaderProgramID vshader,
                               ShaderProgramID fshader,
-                              const std::unordered_map<GLint, std::string> &attribLocs,
+                              const angle::HashMap<GLint, std::string> &attribLocs,
                               ShaderProgramID *programOut);
     angle::Result initializeRendererProgram(Context *context, State *glState);
 
diff --git a/src/libANGLE/LoggingAnnotator.cpp b/src/libANGLE/LoggingAnnotator.cpp
index 09ee1e1..290b6c0 100644
--- a/src/libANGLE/LoggingAnnotator.cpp
+++ b/src/libANGLE/LoggingAnnotator.cpp
@@ -19,16 +19,14 @@
 }
 
 void LoggingAnnotator::beginEvent(gl::Context *context,
-                                  gl::EntryPoint entryPoint,
+                                  EntryPoint entryPoint,
                                   const char *eventName,
                                   const char *eventMessage)
 {
     ANGLE_TRACE_EVENT_BEGIN0("gpu.angle", eventName);
 }
 
-void LoggingAnnotator::endEvent(gl::Context *context,
-                                const char *eventName,
-                                gl::EntryPoint entryPoint)
+void LoggingAnnotator::endEvent(gl::Context *context, const char *eventName, EntryPoint entryPoint)
 {
     ANGLE_TRACE_EVENT_END0("gpu.angle", eventName);
 }
diff --git a/src/libANGLE/LoggingAnnotator.h b/src/libANGLE/LoggingAnnotator.h
index 68d90c1..e59feaa 100644
--- a/src/libANGLE/LoggingAnnotator.h
+++ b/src/libANGLE/LoggingAnnotator.h
@@ -25,10 +25,10 @@
     LoggingAnnotator() {}
     ~LoggingAnnotator() override {}
     void beginEvent(gl::Context *context,
-                    gl::EntryPoint entryPoint,
+                    EntryPoint entryPoint,
                     const char *eventName,
                     const char *eventMessage) override;
-    void endEvent(gl::Context *context, const char *eventName, gl::EntryPoint entryPoint) override;
+    void endEvent(gl::Context *context, const char *eventName, EntryPoint entryPoint) override;
     void setMarker(const char *markerName) override;
     bool getStatus() override;
     void logMessage(const gl::LogMessage &msg) const override;
diff --git a/src/libANGLE/Program.cpp b/src/libANGLE/Program.cpp
index 8f3026f..7d0f6c9 100644
--- a/src/libANGLE/Program.cpp
+++ b/src/libANGLE/Program.cpp
@@ -651,6 +651,49 @@
     return true;
 }
 
+void UpdateInterfaceVariable(std::vector<sh::ShaderVariable> &block, sh::ShaderVariable &var)
+{
+    if (!var.isStruct())
+    {
+        var.resetEffectiveLocation();
+        block.emplace_back(var);
+    }
+
+    for (sh::ShaderVariable &field : var.fields)
+    {
+        ASSERT(!var.name.empty() || var.isShaderIOBlock);
+
+        // Shader I/O block naming is similar to UBOs and SSBOs:
+        //
+        //     in Block
+        //     {
+        //         type field;  // produces "field"
+        //     };
+        //
+        //     in Block2
+        //     {
+        //         type field;  // produces "Block2.field"
+        //     } block2;
+        //
+        const std::string &baseName = var.isShaderIOBlock ? var.structName : var.name;
+        const std::string prefix    = var.name.empty() ? "" : baseName + ".";
+
+        if (!field.isStruct())
+        {
+            field.updateEffectiveLocation(var);
+            field.name = prefix + field.name;
+            block.emplace_back(field);
+        }
+
+        for (sh::ShaderVariable &nested : field.fields)
+        {
+            nested.updateEffectiveLocation(field);
+            nested.name = prefix + field.name + "." + nested.name;
+            block.emplace_back(nested);
+        }
+    }
+}
+
 void WriteShaderVariableBuffer(BinaryOutputStream *stream, const ShaderVariableBuffer &var)
 {
     stream->writeInt(var.binding);
@@ -883,6 +926,7 @@
     stream->writeBool(var.active);
     stream->writeInt(var.binding);
     stream->writeString(var.structName);
+    stream->writeString(var.mappedStructName);
     stream->writeInt(var.hasParentArrayIndex() ? var.parentArrayIndex() : -1);
 
     stream->writeInt(var.imageUnitFormat);
@@ -901,10 +945,11 @@
     var->name       = stream->readString();
     var->mappedName = stream->readString();
     stream->readIntVector<unsigned int>(&var->arraySizes);
-    var->staticUse  = stream->readBool();
-    var->active     = stream->readBool();
-    var->binding    = stream->readInt<int>();
-    var->structName = stream->readString();
+    var->staticUse        = stream->readBool();
+    var->active           = stream->readBool();
+    var->binding          = stream->readInt<int>();
+    var->structName       = stream->readString();
+    var->mappedStructName = stream->readString();
     var->setParentArrayIndex(stream->readInt<int>());
 
     var->imageUnitFormat     = stream->readInt<GLenum>();
@@ -1231,6 +1276,19 @@
     return ShaderType::InvalidEnum;
 }
 
+ShaderType ProgramState::getAttachedTransformFeedbackStage() const
+{
+    if (mAttachedShaders[ShaderType::Geometry])
+    {
+        return ShaderType::Geometry;
+    }
+    if (mAttachedShaders[ShaderType::TessEvaluation])
+    {
+        return ShaderType::TessEvaluation;
+    }
+    return ShaderType::Vertex;
+}
+
 Program::Program(rx::GLImplFactory *factory, ShaderProgramManager *manager, ShaderProgramID handle)
     : mSerial(factory->generateSerial()),
       mProgram(factory->createProgram(mState)),
@@ -1766,24 +1824,12 @@
             mExecutable->mProgramInputs.emplace_back(attribute);
         }
     }
-    else if (shader->getType() == ShaderType::Fragment)
+    else
     {
         for (const sh::ShaderVariable &varying : shader->getInputVaryings())
         {
-            if (varying.isStruct())
-            {
-                for (const sh::ShaderVariable &field : varying.fields)
-                {
-                    sh::ShaderVariable fieldVarying = sh::ShaderVariable(field);
-                    fieldVarying.location           = varying.location;
-                    fieldVarying.name               = varying.name + "." + field.name;
-                    mExecutable->mProgramInputs.emplace_back(fieldVarying);
-                }
-            }
-            else
-            {
-                mExecutable->mProgramInputs.emplace_back(varying);
-            }
+            sh::ShaderVariable var = sh::ShaderVariable(varying);
+            UpdateInterfaceVariable(mExecutable->mProgramInputs, var);
         }
     }
 }
@@ -1809,20 +1855,8 @@
     // Copy over each output varying, since the Shader could go away
     for (const sh::ShaderVariable &varying : shader->getOutputVaryings())
     {
-        if (varying.isStruct())
-        {
-            for (const sh::ShaderVariable &field : varying.fields)
-            {
-                sh::ShaderVariable fieldVarying = sh::ShaderVariable(field);
-                fieldVarying.location           = varying.location;
-                fieldVarying.name               = varying.name + "." + field.name;
-                mExecutable->mOutputVariables.emplace_back(fieldVarying);
-            }
-        }
-        else
-        {
-            mExecutable->mOutputVariables.emplace_back(varying);
-        }
+        sh::ShaderVariable var = sh::ShaderVariable(varying);
+        UpdateInterfaceVariable(mExecutable->mOutputVariables, var);
     }
 }
 
@@ -3302,7 +3336,7 @@
     {
         if (isSeparable())
         {
-            if (!fragmentShader && !vertexShader)
+            if (!fragmentShader && !vertexShader && !geometryShader)
             {
                 infoLog << "No compiled shaders.";
                 return false;
@@ -3321,6 +3355,13 @@
                 infoLog << "Vertex shader is not compiled.";
                 return false;
             }
+
+            ASSERT(!geometryShader || geometryShader->getType() == ShaderType::Geometry);
+            if (geometryShader && !geometryShader->isCompiled())
+            {
+                infoLog << "Geometry shader is not compiled.";
+                return false;
+            }
         }
         else
         {
@@ -3549,8 +3590,8 @@
                                      bool isSeparable,
                                      gl::InfoLog &infoLog)
 {
-    bool namesMatch     = input.name == output.name;
-    bool locationsMatch = (input.location != -1) && (input.location == output.location);
+    bool namesMatch     = input.isSameNameAtLinkTime(output);
+    bool locationsMatch = input.location != -1 && input.location == output.location;
 
     // An output variable is considered to match an input variable in the subsequent
     // shader if:
@@ -3634,7 +3675,8 @@
         // if it is not active. GLSL ES 3.00.6 section 4.3.10.
         if (!match && input->staticUse)
         {
-            infoLog << GetShaderTypeString(inputShaderType) << " varying " << input->name
+            const std::string &name = input->isShaderIOBlock ? input->structName : input->name;
+            infoLog << GetShaderTypeString(inputShaderType) << " varying " << name
                     << " does not match any " << GetShaderTypeString(outputShaderType)
                     << " varying";
             return false;
@@ -4097,7 +4139,8 @@
     {
         return LinkMismatchError::PRECISION_MISMATCH;
     }
-    if (variable1.structName != variable2.structName)
+    if (!variable1.isShaderIOBlock && !variable2.isShaderIOBlock &&
+        variable1.structName != variable2.structName)
     {
         return LinkMismatchError::STRUCT_NAME_MISMATCH;
     }
@@ -4121,6 +4164,11 @@
             return LinkMismatchError::FIELD_NAME_MISMATCH;
         }
 
+        if (member1.interpolation != member2.interpolation)
+        {
+            return LinkMismatchError::INTERPOLATION_TYPE_MISMATCH;
+        }
+
         LinkMismatchError linkErrorOnField = LinkValidateVariablesBase(
             member1, member2, validatePrecision, true, mismatchedStructOrBlockMemberName);
         if (linkErrorOnField != LinkMismatchError::NO_MISMATCH)
@@ -4172,8 +4220,8 @@
     }
 
     // Explicit locations must match if the names match.
-    if ((outputVarying.name == inputVarying.name) &&
-        (outputVarying.location != inputVarying.location))
+    if (outputVarying.isSameNameAtLinkTime(inputVarying) &&
+        outputVarying.location != inputVarying.location)
     {
         return LinkMismatchError::LOCATION_MISMATCH;
     }
@@ -4443,6 +4491,9 @@
 
     // First, go through output varyings and create two maps (one by name, one by location) for
     // faster lookup when matching input varyings.
+    //
+    // Note that shader I/O blocks may or may not provide a name, and matching would be done by
+    // block name instead if either of the shader stages doesn't provide an instance name.
 
     ShaderMap<std::map<std::string, size_t>> outputVaryingNameToIndex;
     ShaderMap<std::map<int, size_t>> outputVaryingLocationToIndex;
@@ -4466,9 +4517,18 @@
             ref->frontShader      = &varying;
             ref->frontShaderStage = stage;
 
-            // Always map by name.  Even if location is provided in this stage, it may not be in the
-            // paired stage.
-            outputVaryingNameToIndex[stage][varying.name] = merged.size() - 1;
+            ASSERT(!varying.name.empty() || varying.isShaderIOBlock);
+
+            // Map by name, or if shader I/O block, block name.  Even if location is provided in
+            // this stage, it may not be in the paired stage.
+            if (varying.isShaderIOBlock)
+            {
+                outputVaryingNameToIndex[stage][varying.structName] = merged.size() - 1;
+            }
+            else
+            {
+                outputVaryingNameToIndex[stage][varying.name] = merged.size() - 1;
+            }
 
             // If location is provided, also keep it in a map by location.
             if (varying.location != -1)
@@ -4507,7 +4567,11 @@
                 // If not found, try to match by name.
                 if (mergedIndex == merged.size())
                 {
-                    auto byNameIter = outputVaryingNameToIndex[previousStage].find(varying.name);
+                    ASSERT(varying.isShaderIOBlock || !varying.name.empty());
+                    const std::string &name =
+                        varying.isShaderIOBlock ? varying.structName : varying.name;
+
+                    auto byNameIter = outputVaryingNameToIndex[previousStage].find(name);
                     if (byNameIter != outputVaryingNameToIndex[previousStage].end())
                     {
                         mergedIndex = byNameIter->second;
diff --git a/src/libANGLE/Program.h b/src/libANGLE/Program.h
index 408591d..e02cd35 100644
--- a/src/libANGLE/Program.h
+++ b/src/libANGLE/Program.h
@@ -192,12 +192,12 @@
     int getBindingByLocation(GLuint location) const;
     int getBinding(const sh::ShaderVariable &variable) const;
 
-    using const_iterator = std::unordered_map<std::string, ProgramBinding>::const_iterator;
+    using const_iterator = angle::HashMap<std::string, ProgramBinding>::const_iterator;
     const_iterator begin() const;
     const_iterator end() const;
 
   private:
-    std::unordered_map<std::string, ProgramBinding> mBindings;
+    angle::HashMap<std::string, ProgramBinding> mBindings;
 };
 
 class ProgramState final : angle::NonCopyable
@@ -372,6 +372,8 @@
 
     int getBaseInstanceLocation() const { return mBaseInstanceLocation; }
 
+    ShaderType getAttachedTransformFeedbackStage() const;
+
   private:
     friend class MemoryProgramCache;
     friend class Program;
diff --git a/src/libANGLE/ProgramExecutable.cpp b/src/libANGLE/ProgramExecutable.cpp
index 0237bc2..05345da 100644
--- a/src/libANGLE/ProgramExecutable.cpp
+++ b/src/libANGLE/ProgramExecutable.cpp
@@ -399,9 +399,9 @@
     InfoLog &infoLog,
     const ShaderMap<const ProgramState *> &programStates) const
 {
-    std::unordered_map<std::string, const sh::ShaderVariable *> uniformMap;
+    angle::HashMap<std::string, const sh::ShaderVariable *> uniformMap;
     using BlockAndFieldPair = std::pair<const sh::InterfaceBlock *, const sh::ShaderVariable *>;
-    std::unordered_map<std::string, std::vector<BlockAndFieldPair>> uniformBlockFieldMap;
+    angle::HashMap<std::string, std::vector<BlockAndFieldPair>> uniformBlockFieldMap;
 
     for (ShaderType shaderType : kAllGraphicsShaderTypes)
     {
@@ -538,4 +538,17 @@
 {
     return !isCompute() && mYUVOutput;
 }
+
+ShaderType ProgramExecutable::getLinkedTransformFeedbackStage() const
+{
+    if (mLinkedGraphicsShaderStages[ShaderType::Geometry])
+    {
+        return ShaderType::Geometry;
+    }
+    if (mLinkedGraphicsShaderStages[ShaderType::TessEvaluation])
+    {
+        return ShaderType::TessEvaluation;
+    }
+    return ShaderType::Vertex;
+}
 }  // namespace gl
diff --git a/src/libANGLE/ProgramExecutable.h b/src/libANGLE/ProgramExecutable.h
index d12bdfc..394e1d1 100644
--- a/src/libANGLE/ProgramExecutable.h
+++ b/src/libANGLE/ProgramExecutable.h
@@ -152,6 +152,8 @@
                            : mLinkedGraphicsShaderStages.count();
     }
 
+    ShaderType getLinkedTransformFeedbackStage() const;
+
     // A PPO can have both graphics and compute programs attached, so
     // we don't know if the PPO is a 'graphics' or 'compute' PPO until the
     // actual draw/dispatch call.
diff --git a/src/libANGLE/ProgramPipeline.cpp b/src/libANGLE/ProgramPipeline.cpp
index 76eb76a..5c437b6 100644
--- a/src/libANGLE/ProgramPipeline.cpp
+++ b/src/libANGLE/ProgramPipeline.cpp
@@ -92,41 +92,16 @@
     Program *shaderProgram,
     std::vector<angle::ObserverBinding> *programObserverBindings)
 {
-    if (stages == GL_ALL_SHADER_BITS)
+    for (size_t singleShaderBit : angle::BitSet16<16>(static_cast<uint16_t>(stages)))
     {
-        for (const ShaderType shaderType : gl::AllShaderTypes())
+        // Cast back to a bit after the iterator returns an index.
+        ShaderType shaderType = GetShaderTypeFromBitfield(angle::Bit<size_t>(singleShaderBit));
+        if (shaderType == ShaderType::InvalidEnum)
         {
-            size_t index = static_cast<size_t>(shaderType);
-            ASSERT(index < programObserverBindings->size());
-            useProgramStage(context, shaderType, shaderProgram,
-                            &programObserverBindings->at(index));
+            break;
         }
-    }
-    else
-    {
-        if (stages & GL_VERTEX_SHADER_BIT)
-        {
-            size_t index = static_cast<size_t>(ShaderType::Vertex);
-            ASSERT(index < programObserverBindings->size());
-            useProgramStage(context, ShaderType::Vertex, shaderProgram,
-                            &programObserverBindings->at(index));
-        }
-
-        if (stages & GL_FRAGMENT_SHADER_BIT)
-        {
-            size_t index = static_cast<size_t>(ShaderType::Fragment);
-            ASSERT(index < programObserverBindings->size());
-            useProgramStage(context, ShaderType::Fragment, shaderProgram,
-                            &programObserverBindings->at(index));
-        }
-
-        if (stages & GL_COMPUTE_SHADER_BIT)
-        {
-            size_t index = static_cast<size_t>(ShaderType::Compute);
-            ASSERT(index < programObserverBindings->size());
-            useProgramStage(context, ShaderType::Compute, shaderProgram,
-                            &programObserverBindings->at(index));
-        }
+        useProgramStage(context, shaderType, shaderProgram,
+                        &programObserverBindings->at(static_cast<size_t>(shaderType)));
     }
 }
 
diff --git a/src/libANGLE/ResourceManager.cpp b/src/libANGLE/ResourceManager.cpp
index e130e5b..530999c 100644
--- a/src/libANGLE/ResourceManager.cpp
+++ b/src/libANGLE/ResourceManager.cpp
@@ -33,7 +33,7 @@
 IDType AllocateEmptyObject(HandleAllocator *handleAllocator,
                            ResourceMap<ResourceType, IDType> *objectMap)
 {
-    IDType handle = FromGL<IDType>(handleAllocator->allocate());
+    IDType handle = PackParam<IDType>(handleAllocator->allocate());
     objectMap->assign(handle, nullptr);
     return handle;
 }
diff --git a/src/libANGLE/ResourceMap.h b/src/libANGLE/ResourceMap.h
index b4cea85..b24c1e6 100644
--- a/src/libANGLE/ResourceMap.h
+++ b/src/libANGLE/ResourceMap.h
@@ -47,7 +47,7 @@
     void clear();
 
     using IndexAndResource = std::pair<GLuint, ResourceType *>;
-    using HashMap          = std::unordered_map<GLuint, ResourceType *>;
+    using HashMap          = angle::HashMap<GLuint, ResourceType *>;
 
     class Iterator final
     {
@@ -297,8 +297,8 @@
 }
 
 template <typename ResourceType, typename IDType>
-typename ResourceMap<ResourceType, IDType>::Iterator &ResourceMap<ResourceType, IDType>::Iterator::
-operator++()
+typename ResourceMap<ResourceType, IDType>::Iterator &
+ResourceMap<ResourceType, IDType>::Iterator::operator++()
 {
     if (mFlatIndex < static_cast<GLuint>(mOrigin.mFlatResourcesSize))
     {
@@ -313,15 +313,15 @@
 }
 
 template <typename ResourceType, typename IDType>
-const typename ResourceMap<ResourceType, IDType>::IndexAndResource
-    *ResourceMap<ResourceType, IDType>::Iterator::operator->() const
+const typename ResourceMap<ResourceType, IDType>::IndexAndResource *
+ResourceMap<ResourceType, IDType>::Iterator::operator->() const
 {
     return &mValue;
 }
 
 template <typename ResourceType, typename IDType>
-const typename ResourceMap<ResourceType, IDType>::IndexAndResource
-    &ResourceMap<ResourceType, IDType>::Iterator::operator*() const
+const typename ResourceMap<ResourceType, IDType>::IndexAndResource &
+ResourceMap<ResourceType, IDType>::Iterator::operator*() const
 {
     return mValue;
 }
diff --git a/src/libANGLE/Stream.cpp b/src/libANGLE/Stream.cpp
index e3f8d24..ad04de3 100644
--- a/src/libANGLE/Stream.cpp
+++ b/src/libANGLE/Stream.cpp
@@ -237,7 +237,7 @@
     return (context == mContext);
 }
 
-Error Stream::validateD3D11Texture(void *texture, const AttributeMap &attributes) const
+Error Stream::validateD3D11Texture(const void *texture, const AttributeMap &attributes) const
 {
     ASSERT(mConsumerType == ConsumerType::GLTextureRGB ||
            mConsumerType == ConsumerType::GLTextureYUV);
diff --git a/src/libANGLE/Stream.h b/src/libANGLE/Stream.h
index 0daa9b0..b53c90b 100644
--- a/src/libANGLE/Stream.h
+++ b/src/libANGLE/Stream.h
@@ -100,7 +100,7 @@
     bool isConsumerBoundToContext(const gl::Context *context) const;
 
     // Producer methods
-    Error validateD3D11Texture(void *texture, const AttributeMap &attributes) const;
+    Error validateD3D11Texture(const void *texture, const AttributeMap &attributes) const;
     Error postD3D11Texture(void *texture, const AttributeMap &attributes);
 
   private:
diff --git a/src/libANGLE/Surface.cpp b/src/libANGLE/Surface.cpp
index 95ef973..5244575 100644
--- a/src/libANGLE/Surface.cpp
+++ b/src/libANGLE/Surface.cpp
@@ -34,9 +34,11 @@
       config((configIn != nullptr) ? new egl::Config(*configIn) : nullptr),
       attributes(attributesIn),
       timestampsEnabled(false),
-      directComposition(false)
+      directComposition(false),
+      isFixedSize(false)
 {
     directComposition = attributes.get(EGL_DIRECT_COMPOSITION_ANGLE, EGL_FALSE) == EGL_TRUE;
+    isFixedSize       = attributes.get(EGL_FIXED_SIZE_ANGLE, EGL_FALSE) == EGL_TRUE;
 }
 
 SurfaceState::~SurfaceState()
@@ -70,7 +72,6 @@
       mHorizontalResolution(EGL_UNKNOWN),
       mVerticalResolution(EGL_UNKNOWN),
       mMultisampleResolve(EGL_MULTISAMPLE_RESOLVE_DEFAULT),
-      mFixedSize(false),
       mFixedWidth(0),
       mFixedHeight(0),
       mTextureFormat(TextureFormat::NoTexture),
@@ -115,8 +116,7 @@
         mInitState = gl::InitState::MayNeedInit;
     }
 
-    mFixedSize = (attributes.get(EGL_FIXED_SIZE_ANGLE, EGL_FALSE) == EGL_TRUE);
-    if (mFixedSize)
+    if (mState.isFixedSize)
     {
         mFixedWidth  = static_cast<size_t>(attributes.get(EGL_WIDTH, 0));
         mFixedHeight = static_cast<size_t>(attributes.get(EGL_HEIGHT, 0));
@@ -199,7 +199,14 @@
     {
         GLenum internalFormat =
             static_cast<GLenum>(mState.attributes.get(EGL_TEXTURE_INTERNAL_FORMAT_ANGLE));
-        GLenum type  = static_cast<GLenum>(mState.attributes.get(EGL_TEXTURE_TYPE_ANGLE));
+        GLenum type = static_cast<GLenum>(mState.attributes.get(EGL_TEXTURE_TYPE_ANGLE));
+
+        // GL_RGBA + GL_HALF_FLOAT is not a valid format/type combination in GLES like it is in
+        // desktop GL. Adjust the frontend format to be sized RGBA16F.
+        if (internalFormat == GL_RGBA && type == GL_HALF_FLOAT)
+        {
+            internalFormat = GL_RGBA16F;
+        }
         mColorFormat = gl::Format(internalFormat, type);
     }
     if (mBuftype == EGL_D3D_TEXTURE_ANGLE)
@@ -290,8 +297,11 @@
     return NoError();
 }
 
-Error Surface::swapWithDamage(const gl::Context *context, EGLint *rects, EGLint n_rects)
+Error Surface::swapWithDamage(const gl::Context *context, const EGLint *rects, EGLint n_rects)
 {
+    ANGLE_TRACE_EVENT0("gpu.angle", "egl::Surface::swapWithDamage");
+    context->onPreSwap();
+
     context->getState().getOverlay()->onSwap();
 
     ANGLE_TRY(mImplementation->swapWithDamage(context, rects, n_rects));
@@ -301,6 +311,9 @@
 
 Error Surface::swapWithFrameToken(const gl::Context *context, EGLFrameTokenANGLE frameToken)
 {
+    ANGLE_TRACE_EVENT0("gpu.angle", "egl::Surface::swapWithFrameToken");
+    context->onPreSwap();
+
     context->getState().getOverlay()->onSwap();
 
     ANGLE_TRY(mImplementation->swapWithFrameToken(context, frameToken));
@@ -456,22 +469,22 @@
 
 EGLint Surface::isFixedSize() const
 {
-    return mFixedSize;
+    return mState.isFixedSize;
 }
 
 EGLint Surface::getWidth() const
 {
-    return mFixedSize ? static_cast<EGLint>(mFixedWidth) : mImplementation->getWidth();
+    return mState.isFixedSize ? static_cast<EGLint>(mFixedWidth) : mImplementation->getWidth();
 }
 
 EGLint Surface::getHeight() const
 {
-    return mFixedSize ? static_cast<EGLint>(mFixedHeight) : mImplementation->getHeight();
+    return mState.isFixedSize ? static_cast<EGLint>(mFixedHeight) : mImplementation->getHeight();
 }
 
 egl::Error Surface::getUserWidth(const egl::Display *display, EGLint *value) const
 {
-    if (mFixedSize)
+    if (mState.isFixedSize)
     {
         *value = static_cast<EGLint>(mFixedWidth);
         return NoError();
@@ -484,7 +497,7 @@
 
 egl::Error Surface::getUserHeight(const egl::Display *display, EGLint *value) const
 {
-    if (mFixedSize)
+    if (mState.isFixedSize)
     {
         *value = static_cast<EGLint>(mFixedHeight);
         return NoError();
diff --git a/src/libANGLE/Surface.h b/src/libANGLE/Surface.h
index e4ba286..21b6ca1 100644
--- a/src/libANGLE/Surface.h
+++ b/src/libANGLE/Surface.h
@@ -58,6 +58,7 @@
     SupportedCompositorTiming supportedCompositorTimings;
     SupportedTimestamps supportedTimestamps;
     bool directComposition;
+    bool isFixedSize;
 };
 
 class Surface : public LabeledObject, public gl::FramebufferAttachmentObject
@@ -74,7 +75,7 @@
     Error makeCurrent(const gl::Context *context);
     Error unMakeCurrent(const gl::Context *context);
     Error swap(const gl::Context *context);
-    Error swapWithDamage(const gl::Context *context, EGLint *rects, EGLint n_rects);
+    Error swapWithDamage(const gl::Context *context, const EGLint *rects, EGLint n_rects);
     Error swapWithFrameToken(const gl::Context *context, EGLFrameTokenANGLE frameToken);
     Error postSubBuffer(const gl::Context *context,
                         EGLint x,
diff --git a/src/libANGLE/Surface_unittest.cpp b/src/libANGLE/Surface_unittest.cpp
index aa6fe10..6b76bc1 100644
--- a/src/libANGLE/Surface_unittest.cpp
+++ b/src/libANGLE/Surface_unittest.cpp
@@ -33,7 +33,7 @@
     MOCK_METHOD2(createDefaultFramebuffer,
                  rx::FramebufferImpl *(const gl::Context *, const gl::FramebufferState &data));
     MOCK_METHOD1(swap, egl::Error(const gl::Context *));
-    MOCK_METHOD3(swapWithDamage, egl::Error(const gl::Context *, EGLint *, EGLint));
+    MOCK_METHOD3(swapWithDamage, egl::Error(const gl::Context *, const EGLint *, EGLint));
     MOCK_METHOD5(postSubBuffer, egl::Error(const gl::Context *, EGLint, EGLint, EGLint, EGLint));
     MOCK_METHOD2(querySurfacePointerANGLE, egl::Error(EGLint, void **));
     MOCK_METHOD3(bindTexImage, egl::Error(const gl::Context *context, gl::Texture *, EGLint));
diff --git a/src/libANGLE/Texture.cpp b/src/libANGLE/Texture.cpp
index 86658d3..e0b003e 100644
--- a/src/libANGLE/Texture.cpp
+++ b/src/libANGLE/Texture.cpp
@@ -813,8 +813,10 @@
 
 void Texture::setMinFilter(const Context *context, GLenum minFilter)
 {
-    mState.mSamplerState.setMinFilter(minFilter);
-    signalDirtyState(DIRTY_BIT_MIN_FILTER);
+    if (mState.mSamplerState.setMinFilter(minFilter))
+    {
+        signalDirtyState(DIRTY_BIT_MIN_FILTER);
+    }
 }
 
 GLenum Texture::getMinFilter() const
@@ -824,8 +826,10 @@
 
 void Texture::setMagFilter(const Context *context, GLenum magFilter)
 {
-    mState.mSamplerState.setMagFilter(magFilter);
-    signalDirtyState(DIRTY_BIT_MAG_FILTER);
+    if (mState.mSamplerState.setMagFilter(magFilter))
+    {
+        signalDirtyState(DIRTY_BIT_MAG_FILTER);
+    }
 }
 
 GLenum Texture::getMagFilter() const
@@ -835,8 +839,10 @@
 
 void Texture::setWrapS(const Context *context, GLenum wrapS)
 {
-    mState.mSamplerState.setWrapS(wrapS);
-    signalDirtyState(DIRTY_BIT_WRAP_S);
+    if (mState.mSamplerState.setWrapS(wrapS))
+    {
+        signalDirtyState(DIRTY_BIT_WRAP_S);
+    }
 }
 
 GLenum Texture::getWrapS() const
@@ -846,8 +852,12 @@
 
 void Texture::setWrapT(const Context *context, GLenum wrapT)
 {
-    mState.mSamplerState.setWrapT(wrapT);
-    signalDirtyState(DIRTY_BIT_WRAP_T);
+    if (mState.mSamplerState.getWrapT() == wrapT)
+        return;
+    if (mState.mSamplerState.setWrapT(wrapT))
+    {
+        signalDirtyState(DIRTY_BIT_WRAP_T);
+    }
 }
 
 GLenum Texture::getWrapT() const
@@ -857,8 +867,10 @@
 
 void Texture::setWrapR(const Context *context, GLenum wrapR)
 {
-    mState.mSamplerState.setWrapR(wrapR);
-    signalDirtyState(DIRTY_BIT_WRAP_R);
+    if (mState.mSamplerState.setWrapR(wrapR))
+    {
+        signalDirtyState(DIRTY_BIT_WRAP_R);
+    }
 }
 
 GLenum Texture::getWrapR() const
@@ -868,8 +880,10 @@
 
 void Texture::setMaxAnisotropy(const Context *context, float maxAnisotropy)
 {
-    mState.mSamplerState.setMaxAnisotropy(maxAnisotropy);
-    signalDirtyState(DIRTY_BIT_MAX_ANISOTROPY);
+    if (mState.mSamplerState.setMaxAnisotropy(maxAnisotropy))
+    {
+        signalDirtyState(DIRTY_BIT_MAX_ANISOTROPY);
+    }
 }
 
 float Texture::getMaxAnisotropy() const
@@ -879,8 +893,10 @@
 
 void Texture::setMinLod(const Context *context, GLfloat minLod)
 {
-    mState.mSamplerState.setMinLod(minLod);
-    signalDirtyState(DIRTY_BIT_MIN_LOD);
+    if (mState.mSamplerState.setMinLod(minLod))
+    {
+        signalDirtyState(DIRTY_BIT_MIN_LOD);
+    }
 }
 
 GLfloat Texture::getMinLod() const
@@ -890,8 +906,10 @@
 
 void Texture::setMaxLod(const Context *context, GLfloat maxLod)
 {
-    mState.mSamplerState.setMaxLod(maxLod);
-    signalDirtyState(DIRTY_BIT_MAX_LOD);
+    if (mState.mSamplerState.setMaxLod(maxLod))
+    {
+        signalDirtyState(DIRTY_BIT_MAX_LOD);
+    }
 }
 
 GLfloat Texture::getMaxLod() const
@@ -901,8 +919,10 @@
 
 void Texture::setCompareMode(const Context *context, GLenum compareMode)
 {
-    mState.mSamplerState.setCompareMode(compareMode);
-    signalDirtyState(DIRTY_BIT_COMPARE_MODE);
+    if (mState.mSamplerState.setCompareMode(compareMode))
+    {
+        signalDirtyState(DIRTY_BIT_COMPARE_MODE);
+    }
 }
 
 GLenum Texture::getCompareMode() const
@@ -912,8 +932,10 @@
 
 void Texture::setCompareFunc(const Context *context, GLenum compareFunc)
 {
-    mState.mSamplerState.setCompareFunc(compareFunc);
-    signalDirtyState(DIRTY_BIT_COMPARE_FUNC);
+    if (mState.mSamplerState.setCompareFunc(compareFunc))
+    {
+        signalDirtyState(DIRTY_BIT_COMPARE_FUNC);
+    }
 }
 
 GLenum Texture::getCompareFunc() const
@@ -923,8 +945,10 @@
 
 void Texture::setSRGBDecode(const Context *context, GLenum sRGBDecode)
 {
-    mState.mSamplerState.setSRGBDecode(sRGBDecode);
-    signalDirtyState(DIRTY_BIT_SRGB_DECODE);
+    if (mState.mSamplerState.setSRGBDecode(sRGBDecode))
+    {
+        signalDirtyState(DIRTY_BIT_SRGB_DECODE);
+    }
 }
 
 GLenum Texture::getSRGBDecode() const
diff --git a/src/libANGLE/Thread.cpp b/src/libANGLE/Thread.cpp
index 7c05b77..6726a45 100644
--- a/src/libANGLE/Thread.cpp
+++ b/src/libANGLE/Thread.cpp
@@ -19,6 +19,10 @@
 
 namespace egl
 {
+namespace
+{
+Debug *sDebug = nullptr;
+}  // namespace
 
 Thread::Thread()
     : mLabel(nullptr),
@@ -42,18 +46,29 @@
     mError = EGL_SUCCESS;
 }
 
-void Thread::setError(const Error &error,
-                      const Debug *debug,
+void Thread::setError(EGLint error,
                       const char *command,
-                      const LabeledObject *object)
+                      const LabeledObject *object,
+                      const char *message)
 {
-    ASSERT(debug != nullptr);
+    mError = error;
+    if (error != EGL_SUCCESS && message)
+    {
+        EnsureDebugAllocated();
+        sDebug->insertMessage(error, command, ErrorCodeToMessageType(error), getLabel(),
+                              object ? object->getLabel() : nullptr, message);
+    }
+}
 
+void Thread::setError(const Error &error, const char *command, const LabeledObject *object)
+{
     mError = error.getCode();
     if (error.isError() && !error.getMessage().empty())
     {
-        debug->insertMessage(error.getCode(), command, ErrorCodeToMessageType(error.getCode()),
-                             getLabel(), object ? object->getLabel() : nullptr, error.getMessage());
+        EnsureDebugAllocated();
+        sDebug->insertMessage(error.getCode(), command, ErrorCodeToMessageType(error.getCode()),
+                              getLabel(), object ? object->getLabel() : nullptr,
+                              error.getMessage());
     }
 }
 
@@ -108,4 +123,24 @@
     }
     return nullptr;
 }
+
+void EnsureDebugAllocated()
+{
+    // All EGL calls use a global lock, this is thread safe
+    if (sDebug == nullptr)
+    {
+        sDebug = new Debug();
+    }
+}
+
+void DeallocateDebug()
+{
+    SafeDelete(sDebug);
+}
+
+Debug *GetDebug()
+{
+    EnsureDebugAllocated();
+    return sDebug;
+}
 }  // namespace egl
diff --git a/src/libANGLE/Thread.h b/src/libANGLE/Thread.h
index 7f4cc52..d547088 100644
--- a/src/libANGLE/Thread.h
+++ b/src/libANGLE/Thread.h
@@ -39,10 +39,14 @@
     EGLLabelKHR getLabel() const override;
 
     void setSuccess();
-    void setError(const Error &error,
-                  const Debug *debug,
+
+    void setError(EGLint error,
                   const char *command,
-                  const LabeledObject *object);
+                  const LabeledObject *object,
+                  const char *message);
+
+    // TODO: Remove egl::Error. http://anglebug.com/3041
+    void setError(const Error &error, const char *command, const LabeledObject *object);
     EGLint getError() const;
 
     void setAPI(EGLenum api);
@@ -61,6 +65,10 @@
     gl::Context *mContext;
 };
 
+void EnsureDebugAllocated();
+void DeallocateDebug();
+Debug *GetDebug();
+
 }  // namespace egl
 
 #endif  // LIBANGLE_THREAD_H_
diff --git a/src/libANGLE/VaryingPacking.cpp b/src/libANGLE/VaryingPacking.cpp
index 25155eb..efd5150 100644
--- a/src/libANGLE/VaryingPacking.cpp
+++ b/src/libANGLE/VaryingPacking.cpp
@@ -24,28 +24,67 @@
 // true if varying x has a higher priority in packing than y
 bool ComparePackedVarying(const PackedVarying &x, const PackedVarying &y)
 {
-    // If the PackedVarying 'x' or 'y' to be compared is an array element, this clones an equivalent
-    // non-array shader variable 'vx' or 'vy' for actual comparison instead.
+    // If the PackedVarying 'x' or 'y' to be compared is an array element for transform feedback,
+    // this clones an equivalent non-array shader variable 'vx' or 'vy' for actual comparison
+    // instead.  For I/O block arrays, the array index is used in the comparison.
     sh::ShaderVariable vx, vy;
     const sh::ShaderVariable *px, *py;
 
     px = &x.varying();
     py = &y.varying();
 
-    if (x.isArrayElement())
+    if (x.isTransformFeedbackArrayElement())
     {
         vx = *px;
         vx.arraySizes.clear();
         px = &vx;
     }
 
-    if (y.isArrayElement())
+    if (y.isTransformFeedbackArrayElement())
     {
         vy = *py;
         vy.arraySizes.clear();
         py = &vy;
     }
 
+    // Make sure struct fields end up together.
+    if (x.isStructField() != y.isStructField())
+    {
+        return x.isStructField();
+    }
+
+    if (x.isStructField())
+    {
+        ASSERT(y.isStructField());
+
+        if (x.getParentStructName() != y.getParentStructName())
+        {
+            return x.getParentStructName() < y.getParentStructName();
+        }
+    }
+
+    // For I/O block fields, order first by array index:
+    if (!x.isTransformFeedbackArrayElement() && !y.isTransformFeedbackArrayElement())
+    {
+        if (x.arrayIndex != y.arrayIndex)
+        {
+            return x.arrayIndex < y.arrayIndex;
+        }
+    }
+
+    // Then order by field index
+    if (x.fieldIndex != y.fieldIndex)
+    {
+        return x.fieldIndex < y.fieldIndex;
+    }
+
+    // Then order by secondary field index
+    if (x.secondaryFieldIndex != y.secondaryFieldIndex)
+    {
+        return x.secondaryFieldIndex < y.secondaryFieldIndex;
+    }
+
+    // Otherwise order by variable
     return gl::CompareShaderVar(*px, *py);
 }
 
@@ -77,18 +116,27 @@
 PackedVarying::PackedVarying(VaryingInShaderRef &&frontVaryingIn,
                              VaryingInShaderRef &&backVaryingIn,
                              sh::InterpolationType interpolationIn)
-    : PackedVarying(std::move(frontVaryingIn), std::move(backVaryingIn), interpolationIn, 0)
+    : PackedVarying(std::move(frontVaryingIn),
+                    std::move(backVaryingIn),
+                    interpolationIn,
+                    GL_INVALID_INDEX,
+                    0,
+                    0)
 {}
 
 PackedVarying::PackedVarying(VaryingInShaderRef &&frontVaryingIn,
                              VaryingInShaderRef &&backVaryingIn,
                              sh::InterpolationType interpolationIn,
-                             GLuint fieldIndexIn)
+                             GLuint arrayIndexIn,
+                             GLuint fieldIndexIn,
+                             GLuint secondaryFieldIndexIn)
     : frontVarying(std::move(frontVaryingIn)),
       backVarying(std::move(backVaryingIn)),
       interpolation(interpolationIn),
-      arrayIndex(GL_INVALID_INDEX),
-      fieldIndex(fieldIndexIn)
+      arrayIndex(arrayIndexIn),
+      isTransformFeedback(false),
+      fieldIndex(fieldIndexIn),
+      secondaryFieldIndex(secondaryFieldIndexIn)
 {}
 
 PackedVarying::~PackedVarying() = default;
@@ -106,7 +154,9 @@
     std::swap(backVarying, other.backVarying);
     std::swap(interpolation, other.interpolation);
     std::swap(arrayIndex, other.arrayIndex);
+    std::swap(isTransformFeedback, other.isTransformFeedback);
     std::swap(fieldIndex, other.fieldIndex);
+    std::swap(secondaryFieldIndex, other.secondaryFieldIndex);
 
     return *this;
 }
@@ -124,10 +174,15 @@
     mRegisterList.clear();
     mPackedVaryings.clear();
 
-    for (std::vector<std::string> inactiveVaryingMappedNames : mInactiveVaryingMappedNames)
+    for (std::vector<std::string> &inactiveVaryingMappedNames : mInactiveVaryingMappedNames)
     {
         inactiveVaryingMappedNames.clear();
     }
+
+    for (std::vector<std::string> &activeBuiltIns : mActiveOutputBuiltIns)
+    {
+        activeBuiltIns.clear();
+    }
 }
 
 void VaryingPacking::clearRegisterMap()
@@ -170,7 +225,7 @@
     // GLSL ES 3.10 section 4.3.6: Output variables cannot be arrays of arrays or arrays of
     // structures, so we may use getBasicTypeElementCount().
     const unsigned int elementCount = varying.getBasicTypeElementCount();
-    varyingRows *= (packedVarying.isArrayElement() ? 1 : elementCount);
+    varyingRows *= (packedVarying.isTransformFeedbackArrayElement() ? 1 : elementCount);
 
     unsigned int maxVaryingVectors = static_cast<unsigned int>(mRegisterMap.size());
 
@@ -265,7 +320,8 @@
                     registerInfo.registerRow    = row + arrayIndex;
                     registerInfo.registerColumn = bestColumn;
                     registerInfo.varyingArrayIndex =
-                        (packedVarying.isArrayElement() ? packedVarying.arrayIndex : arrayIndex);
+                        (packedVarying.isTransformFeedbackArrayElement() ? packedVarying.arrayIndex
+                                                                         : arrayIndex);
                     registerInfo.varyingRowIndex = 0;
                     // Do not record register info for builtins.
                     // TODO(jmadill): Clean this up.
@@ -327,7 +383,8 @@
     const unsigned int arrayElementCount = varying.getBasicTypeElementCount();
     for (unsigned int arrayElement = 0; arrayElement < arrayElementCount; ++arrayElement)
     {
-        if (packedVarying.isArrayElement() && arrayElement != packedVarying.arrayIndex)
+        if (packedVarying.isTransformFeedbackArrayElement() &&
+            arrayElement != packedVarying.arrayIndex)
         {
             continue;
         }
@@ -364,12 +421,12 @@
     VaryingInShaderRef backVarying(ref.backShaderStage, output);
 
     mPackedVaryings.emplace_back(std::move(frontVarying), std::move(backVarying), interpolation);
-    if (input)
+    if (input && !input->isBuiltIn())
     {
         (*uniqueFullNames)[ref.frontShaderStage].insert(
             mPackedVaryings.back().fullName(ref.frontShaderStage));
     }
-    if (output)
+    if (output && !output->isBuiltIn())
     {
         (*uniqueFullNames)[ref.backShaderStage].insert(
             mPackedVaryings.back().fullName(ref.backShaderStage));
@@ -377,7 +434,9 @@
 }
 
 void VaryingPacking::packUserVaryingField(const ProgramVaryingRef &ref,
+                                          GLuint arrayIndex,
                                           GLuint fieldIndex,
+                                          GLuint secondaryFieldIndex,
                                           VaryingUniqueFullNames *uniqueFullNames)
 {
     const sh::ShaderVariable *input  = ref.frontShader;
@@ -389,24 +448,47 @@
     const sh::ShaderVariable *frontField = input ? &input->fields[fieldIndex] : nullptr;
     const sh::ShaderVariable *backField  = output ? &output->fields[fieldIndex] : nullptr;
 
+    if (secondaryFieldIndex != GL_INVALID_INDEX)
+    {
+        frontField = frontField ? &frontField->fields[secondaryFieldIndex] : nullptr;
+        backField  = backField ? &backField->fields[secondaryFieldIndex] : nullptr;
+    }
+
     VaryingInShaderRef frontVarying(ref.frontShaderStage, frontField);
     VaryingInShaderRef backVarying(ref.backShaderStage, backField);
 
     if (input)
     {
-        ASSERT(!frontField->isStruct() && !frontField->isArray());
-        frontVarying.parentStructName       = input->name;
-        frontVarying.parentStructMappedName = input->mappedName;
+        if (frontField->isShaderIOBlock)
+        {
+            frontVarying.parentStructName       = input->structName;
+            frontVarying.parentStructMappedName = input->mappedStructName;
+        }
+        else
+        {
+            ASSERT(!frontField->isStruct() && !frontField->isArray());
+            frontVarying.parentStructName       = input->name;
+            frontVarying.parentStructMappedName = input->mappedName;
+        }
     }
     if (output)
     {
-        ASSERT(!backField->isStruct() && !backField->isArray());
-        backVarying.parentStructName       = output->name;
-        backVarying.parentStructMappedName = output->mappedName;
+        if (backField->isShaderIOBlock)
+        {
+            backVarying.parentStructName       = output->structName;
+            backVarying.parentStructMappedName = output->mappedStructName;
+        }
+        else
+        {
+            ASSERT(!backField->isStruct() && !backField->isArray());
+            backVarying.parentStructName       = output->name;
+            backVarying.parentStructMappedName = output->mappedName;
+        }
     }
 
     mPackedVaryings.emplace_back(std::move(frontVarying), std::move(backVarying), interpolation,
-                                 fieldIndex);
+                                 arrayIndex, fieldIndex,
+                                 secondaryFieldIndex == GL_INVALID_INDEX ? 0 : secondaryFieldIndex);
 
     if (input)
     {
@@ -429,7 +511,8 @@
 
     mPackedVaryings.emplace_back(std::move(frontVarying), std::move(backVarying),
                                  input->interpolation);
-    mPackedVaryings.back().arrayIndex = static_cast<GLuint>(subscript);
+    mPackedVaryings.back().arrayIndex          = static_cast<GLuint>(subscript);
+    mPackedVaryings.back().isTransformFeedback = true;
 }
 
 void VaryingPacking::packUserVaryingFieldTF(const ProgramVaryingRef &ref,
@@ -445,7 +528,7 @@
     frontVarying.parentStructMappedName = input->mappedName;
 
     mPackedVaryings.emplace_back(std::move(frontVarying), std::move(backVarying),
-                                 input->interpolation, fieldIndex);
+                                 input->interpolation, GL_INVALID_INDEX, fieldIndex, 0);
 }
 
 bool VaryingPacking::collectAndPackUserVaryings(gl::InfoLog &infoLog,
@@ -454,22 +537,31 @@
                                                 const bool isSeparableProgram)
 {
     VaryingUniqueFullNames uniqueFullNames;
-    mPackedVaryings.clear();
-    clearRegisterMap();
+
+    reset();
 
     for (const ProgramVaryingRef &ref : mergedVaryings)
     {
         const sh::ShaderVariable *input  = ref.frontShader;
         const sh::ShaderVariable *output = ref.backShader;
 
+        const bool isActiveBuiltInInput  = input && input->isBuiltIn() && input->active;
+        const bool isActiveBuiltInOutput = output && output->isBuiltIn() && output->active;
+
+        // Keep track of output builtins that are used by the shader, such as gl_Position,
+        // gl_PointSize etc.
+        if (isActiveBuiltInInput)
+        {
+            mActiveOutputBuiltIns[ref.frontShaderStage].push_back(input->name);
+        }
+
         // Only pack statically used varyings that have a matched input or output, plus special
         // builtins. Note that we pack all statically used user-defined varyings even if they are
         // not active. GLES specs are a bit vague on whether it's allowed to only pack active
         // varyings, though GLES 3.1 spec section 11.1.2.1 says that "device-dependent
         // optimizations" may be used to make vertex shader outputs fit.
-        if ((input && output && output->staticUse) ||
-            (input && input->isBuiltIn() && input->active) ||
-            (output && output->isBuiltIn() && output->active) ||
+        if ((input && output && output->staticUse) || isActiveBuiltInInput ||
+            isActiveBuiltInOutput ||
             (isSeparableProgram && ((input && input->active) || (output && output->active))))
         {
             const sh::ShaderVariable *varying = output ? output : input;
@@ -481,11 +573,44 @@
             {
                 if (varying->isStruct())
                 {
-                    ASSERT(!(varying->isArray() && varying == input));
+                    const std::vector<unsigned int> &arraySizes = varying->arraySizes;
+                    size_t arrayDimensions                      = arraySizes.size();
 
-                    for (GLuint fieldIndex = 0; fieldIndex < varying->fields.size(); ++fieldIndex)
+                    // Geometry shader inputs have an extra level of array-ness that should be
+                    // removed.
+                    if (varying == output && ref.backShaderStage == ShaderType::Geometry)
                     {
-                        packUserVaryingField(ref, fieldIndex, &uniqueFullNames);
+                        ASSERT(arrayDimensions > 0);
+                        --arrayDimensions;
+                    }
+
+                    ASSERT(arrayDimensions <= 1);
+                    const bool isArray     = arrayDimensions > 0;
+                    const GLuint arraySize = isArray ? arraySizes[0] : 1;
+
+                    for (GLuint arrayIndex = 0; arrayIndex < arraySize; ++arrayIndex)
+                    {
+                        const GLuint effectiveArrayIndex = isArray ? arrayIndex : GL_INVALID_INDEX;
+                        for (GLuint fieldIndex = 0; fieldIndex < varying->fields.size();
+                             ++fieldIndex)
+                        {
+                            if (varying->fields[fieldIndex].isStruct())
+                            {
+
+                                for (GLuint nestedIndex = 0;
+                                     nestedIndex < varying->fields[fieldIndex].fields.size();
+                                     nestedIndex++)
+                                {
+                                    packUserVaryingField(ref, effectiveArrayIndex, fieldIndex,
+                                                         nestedIndex, &uniqueFullNames);
+                                }
+                            }
+                            else
+                            {
+                                packUserVaryingField(ref, effectiveArrayIndex, fieldIndex,
+                                                     GL_INVALID_INDEX, &uniqueFullNames);
+                            }
+                        }
                     }
                     if (input)
                     {
@@ -508,7 +633,10 @@
         // program, in which case the input shader may not exist in this program.
         if (!input && !isSeparableProgram)
         {
-            mInactiveVaryingMappedNames[ref.backShaderStage].push_back(output->mappedName);
+            if (!output->isBuiltIn())
+            {
+                mInactiveVaryingMappedNames[ref.backShaderStage].push_back(output->mappedName);
+            }
             continue;
         }
 
@@ -560,11 +688,13 @@
             }
         }
 
-        if (input && uniqueFullNames[ref.frontShaderStage].count(input->name) == 0)
+        if (input && !input->isBuiltIn() &&
+            uniqueFullNames[ref.frontShaderStage].count(input->name) == 0)
         {
             mInactiveVaryingMappedNames[ref.frontShaderStage].push_back(input->mappedName);
         }
-        if (output && uniqueFullNames[ref.backShaderStage].count(output->name) == 0)
+        if (output && !output->isBuiltIn() &&
+            uniqueFullNames[ref.backShaderStage].count(output->name) == 0)
         {
             mInactiveVaryingMappedNames[ref.backShaderStage].push_back(output->mappedName);
         }
diff --git a/src/libANGLE/VaryingPacking.h b/src/libANGLE/VaryingPacking.h
index 251191d..3a37c85 100644
--- a/src/libANGLE/VaryingPacking.h
+++ b/src/libANGLE/VaryingPacking.h
@@ -66,7 +66,9 @@
     PackedVarying(VaryingInShaderRef &&frontVaryingIn,
                   VaryingInShaderRef &&backVaryingIn,
                   sh::InterpolationType interpolationIn,
-                  GLuint fieldIndexIn);
+                  GLuint arrayIndexIn,
+                  GLuint fieldIndexIn,
+                  GLuint secondaryFieldIndexIn);
     PackedVarying(PackedVarying &&other);
     ~PackedVarying();
 
@@ -78,7 +80,10 @@
                                     : !backVarying.parentStructName.empty();
     }
 
-    bool isArrayElement() const { return arrayIndex != GL_INVALID_INDEX; }
+    bool isTransformFeedbackArrayElement() const
+    {
+        return isTransformFeedback && arrayIndex != GL_INVALID_INDEX;
+    }
 
     // Return either front or back varying, whichever is available.  Only used when the name of the
     // varying is not important, but only the type is interesting.
@@ -87,6 +92,12 @@
         return frontVarying.varying ? *frontVarying.varying : *backVarying.varying;
     }
 
+    const std::string &getParentStructName() const
+    {
+        ASSERT(isStructField());
+        return frontVarying.varying ? frontVarying.parentStructName : backVarying.parentStructName;
+    }
+
     std::string fullName(ShaderType stage) const
     {
         ASSERT(stage == frontVarying.stage || stage == backVarying.stage);
@@ -119,11 +130,15 @@
     // Cached so we can store sh::ShaderVariable to point to varying fields.
     sh::InterpolationType interpolation;
 
+    // Used by varyings that are captured with transform feedback, xor arrays of shader I/O blocks,
+    // distinguished by isTransformFeedback;
     GLuint arrayIndex;
+    bool isTransformFeedback;
 
     // Field index in the struct.  In Vulkan, this is used to assign a
     // struct-typed varying location to the location of its first field.
     GLuint fieldIndex;
+    GLuint secondaryFieldIndex;
 };
 
 struct PackedVaryingRegister final
@@ -221,6 +236,11 @@
         return mInactiveVaryingMappedNames;
     }
 
+    const ShaderMap<std::vector<std::string>> &getActiveOutputBuiltIns() const
+    {
+        return mActiveOutputBuiltIns;
+    }
+
     void reset();
 
   private:
@@ -236,7 +256,9 @@
     using VaryingUniqueFullNames = ShaderMap<std::set<std::string>>;
     void packUserVarying(const ProgramVaryingRef &ref, VaryingUniqueFullNames *uniqueFullNames);
     void packUserVaryingField(const ProgramVaryingRef &ref,
+                              GLuint arrayIndex,
                               GLuint fieldIndex,
+                              GLuint secondaryFieldIndex,
                               VaryingUniqueFullNames *uniqueFullNames);
     void packUserVaryingTF(const ProgramVaryingRef &ref, size_t subscript);
     void packUserVaryingFieldTF(const ProgramVaryingRef &ref,
@@ -249,6 +271,7 @@
     std::vector<PackedVaryingRegister> mRegisterList;
     std::vector<PackedVarying> mPackedVaryings;
     ShaderMap<std::vector<std::string>> mInactiveVaryingMappedNames;
+    ShaderMap<std::vector<std::string>> mActiveOutputBuiltIns;
 
     PackMode mPackMode;
 };
diff --git a/src/libANGLE/angletypes.cpp b/src/libANGLE/angletypes.cpp
index dc8f88e..8bcc622 100644
--- a/src/libANGLE/angletypes.cpp
+++ b/src/libANGLE/angletypes.cpp
@@ -198,69 +198,129 @@
     return state;
 }
 
-void SamplerState::setMinFilter(GLenum minFilter)
+bool SamplerState::setMinFilter(GLenum minFilter)
 {
-    mMinFilter                    = minFilter;
-    mCompleteness.typed.minFilter = static_cast<uint8_t>(FromGLenum<FilterMode>(minFilter));
+    if (mMinFilter != minFilter)
+    {
+        mMinFilter                    = minFilter;
+        mCompleteness.typed.minFilter = static_cast<uint8_t>(FromGLenum<FilterMode>(minFilter));
+        return true;
+    }
+    return false;
 }
 
-void SamplerState::setMagFilter(GLenum magFilter)
+bool SamplerState::setMagFilter(GLenum magFilter)
 {
-    mMagFilter                    = magFilter;
-    mCompleteness.typed.magFilter = static_cast<uint8_t>(FromGLenum<FilterMode>(magFilter));
+    if (mMagFilter != magFilter)
+    {
+        mMagFilter                    = magFilter;
+        mCompleteness.typed.magFilter = static_cast<uint8_t>(FromGLenum<FilterMode>(magFilter));
+        return true;
+    }
+    return false;
 }
 
-void SamplerState::setWrapS(GLenum wrapS)
+bool SamplerState::setWrapS(GLenum wrapS)
 {
-    mWrapS                    = wrapS;
-    mCompleteness.typed.wrapS = static_cast<uint8_t>(FromGLenum<WrapMode>(wrapS));
+    if (mWrapS != wrapS)
+    {
+        mWrapS                    = wrapS;
+        mCompleteness.typed.wrapS = static_cast<uint8_t>(FromGLenum<WrapMode>(wrapS));
+        return true;
+    }
+    return false;
 }
 
-void SamplerState::setWrapT(GLenum wrapT)
+bool SamplerState::setWrapT(GLenum wrapT)
 {
-    mWrapT = wrapT;
-    updateWrapTCompareMode();
+    if (mWrapT != wrapT)
+    {
+        mWrapT = wrapT;
+        updateWrapTCompareMode();
+        return true;
+    }
+    return false;
 }
 
-void SamplerState::setWrapR(GLenum wrapR)
+bool SamplerState::setWrapR(GLenum wrapR)
 {
-    mWrapR = wrapR;
+    if (mWrapR != wrapR)
+    {
+        mWrapR = wrapR;
+        return true;
+    }
+    return false;
 }
 
-void SamplerState::setMaxAnisotropy(float maxAnisotropy)
+bool SamplerState::setMaxAnisotropy(float maxAnisotropy)
 {
-    mMaxAnisotropy = maxAnisotropy;
+    if (mMaxAnisotropy != maxAnisotropy)
+    {
+        mMaxAnisotropy = maxAnisotropy;
+        return true;
+    }
+    return false;
 }
 
-void SamplerState::setMinLod(GLfloat minLod)
+bool SamplerState::setMinLod(GLfloat minLod)
 {
-    mMinLod = minLod;
+    if (mMinLod != minLod)
+    {
+        mMinLod = minLod;
+        return true;
+    }
+    return false;
 }
 
-void SamplerState::setMaxLod(GLfloat maxLod)
+bool SamplerState::setMaxLod(GLfloat maxLod)
 {
-    mMaxLod = maxLod;
+    if (mMaxLod != maxLod)
+    {
+        mMaxLod = maxLod;
+        return true;
+    }
+    return false;
 }
 
-void SamplerState::setCompareMode(GLenum compareMode)
+bool SamplerState::setCompareMode(GLenum compareMode)
 {
-    mCompareMode = compareMode;
-    updateWrapTCompareMode();
+    if (mCompareMode != compareMode)
+    {
+        mCompareMode = compareMode;
+        updateWrapTCompareMode();
+        return true;
+    }
+    return false;
 }
 
-void SamplerState::setCompareFunc(GLenum compareFunc)
+bool SamplerState::setCompareFunc(GLenum compareFunc)
 {
-    mCompareFunc = compareFunc;
+    if (mCompareFunc != compareFunc)
+    {
+        mCompareFunc = compareFunc;
+        return true;
+    }
+    return false;
 }
 
-void SamplerState::setSRGBDecode(GLenum sRGBDecode)
+bool SamplerState::setSRGBDecode(GLenum sRGBDecode)
 {
-    mSRGBDecode = sRGBDecode;
+    if (mSRGBDecode != sRGBDecode)
+    {
+        mSRGBDecode = sRGBDecode;
+        return true;
+    }
+    return false;
 }
 
-void SamplerState::setBorderColor(const ColorGeneric &color)
+bool SamplerState::setBorderColor(const ColorGeneric &color)
 {
-    mBorderColor = color;
+    if (mBorderColor != color)
+    {
+        mBorderColor = color;
+        return true;
+    }
+    return false;
 }
 
 void SamplerState::updateWrapTCompareMode()
diff --git a/src/libANGLE/angletypes.h b/src/libANGLE/angletypes.h
index 8ad62d7..ed64d1f 100644
--- a/src/libANGLE/angletypes.h
+++ b/src/libANGLE/angletypes.h
@@ -287,49 +287,49 @@
 
     GLenum getMinFilter() const { return mMinFilter; }
 
-    void setMinFilter(GLenum minFilter);
+    bool setMinFilter(GLenum minFilter);
 
     GLenum getMagFilter() const { return mMagFilter; }
 
-    void setMagFilter(GLenum magFilter);
+    bool setMagFilter(GLenum magFilter);
 
     GLenum getWrapS() const { return mWrapS; }
 
-    void setWrapS(GLenum wrapS);
+    bool setWrapS(GLenum wrapS);
 
     GLenum getWrapT() const { return mWrapT; }
 
-    void setWrapT(GLenum wrapT);
+    bool setWrapT(GLenum wrapT);
 
     GLenum getWrapR() const { return mWrapR; }
 
-    void setWrapR(GLenum wrapR);
+    bool setWrapR(GLenum wrapR);
 
     float getMaxAnisotropy() const { return mMaxAnisotropy; }
 
-    void setMaxAnisotropy(float maxAnisotropy);
+    bool setMaxAnisotropy(float maxAnisotropy);
 
     GLfloat getMinLod() const { return mMinLod; }
 
-    void setMinLod(GLfloat minLod);
+    bool setMinLod(GLfloat minLod);
 
     GLfloat getMaxLod() const { return mMaxLod; }
 
-    void setMaxLod(GLfloat maxLod);
+    bool setMaxLod(GLfloat maxLod);
 
     GLenum getCompareMode() const { return mCompareMode; }
 
-    void setCompareMode(GLenum compareMode);
+    bool setCompareMode(GLenum compareMode);
 
     GLenum getCompareFunc() const { return mCompareFunc; }
 
-    void setCompareFunc(GLenum compareFunc);
+    bool setCompareFunc(GLenum compareFunc);
 
     GLenum getSRGBDecode() const { return mSRGBDecode; }
 
-    void setSRGBDecode(GLenum sRGBDecode);
+    bool setSRGBDecode(GLenum sRGBDecode);
 
-    void setBorderColor(const ColorGeneric &color);
+    bool setBorderColor(const ColorGeneric &color);
 
     const ColorGeneric &getBorderColor() const { return mBorderColor; }
 
@@ -848,6 +848,9 @@
 using TransformFeedbackBuffersArray =
     std::array<T, gl::IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS>;
 
+template <typename T>
+using QueryTypeMap = angle::PackedEnumMap<QueryType, T>;
+
 constexpr size_t kBarrierVectorDefaultSize = 16;
 
 template <typename T>
diff --git a/src/libANGLE/capture_gles_1_0_autogen.cpp b/src/libANGLE/capture_gles_1_0_autogen.cpp
index 1f601c8..b33dcda 100644
--- a/src/libANGLE/capture_gles_1_0_autogen.cpp
+++ b/src/libANGLE/capture_gles_1_0_autogen.cpp
@@ -30,7 +30,7 @@
     paramBuffer.addValueParam("funcPacked", ParamType::TAlphaTestFunc, funcPacked);
     paramBuffer.addValueParam("ref", ParamType::TGLfloat, ref);
 
-    return CallCapture(gl::EntryPoint::AlphaFunc, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLAlphaFunc, std::move(paramBuffer));
 }
 
 CallCapture CaptureAlphaFuncx(const State &glState,
@@ -43,7 +43,7 @@
     paramBuffer.addValueParam("funcPacked", ParamType::TAlphaTestFunc, funcPacked);
     paramBuffer.addValueParam("ref", ParamType::TGLfixed, ref);
 
-    return CallCapture(gl::EntryPoint::AlphaFuncx, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLAlphaFuncx, std::move(paramBuffer));
 }
 
 CallCapture CaptureClearColorx(const State &glState,
@@ -60,7 +60,7 @@
     paramBuffer.addValueParam("blue", ParamType::TGLfixed, blue);
     paramBuffer.addValueParam("alpha", ParamType::TGLfixed, alpha);
 
-    return CallCapture(gl::EntryPoint::ClearColorx, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLClearColorx, std::move(paramBuffer));
 }
 
 CallCapture CaptureClearDepthx(const State &glState, bool isCallValid, GLfixed depth)
@@ -69,7 +69,7 @@
 
     paramBuffer.addValueParam("depth", ParamType::TGLfixed, depth);
 
-    return CallCapture(gl::EntryPoint::ClearDepthx, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLClearDepthx, std::move(paramBuffer));
 }
 
 CallCapture CaptureClientActiveTexture(const State &glState, bool isCallValid, GLenum texture)
@@ -78,7 +78,7 @@
 
     paramBuffer.addEnumParam("texture", GLenumGroup::TextureUnit, ParamType::TGLenum, texture);
 
-    return CallCapture(gl::EntryPoint::ClientActiveTexture, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLClientActiveTexture, std::move(paramBuffer));
 }
 
 CallCapture CaptureClipPlanef(const State &glState, bool isCallValid, GLenum p, const GLfloat *eqn)
@@ -102,7 +102,7 @@
         paramBuffer.addParam(std::move(eqnParam));
     }
 
-    return CallCapture(gl::EntryPoint::ClipPlanef, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLClipPlanef, std::move(paramBuffer));
 }
 
 CallCapture CaptureClipPlanex(const State &glState,
@@ -129,7 +129,7 @@
         paramBuffer.addParam(std::move(equationParam));
     }
 
-    return CallCapture(gl::EntryPoint::ClipPlanex, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLClipPlanex, std::move(paramBuffer));
 }
 
 CallCapture CaptureColor4f(const State &glState,
@@ -146,7 +146,7 @@
     paramBuffer.addValueParam("blue", ParamType::TGLfloat, blue);
     paramBuffer.addValueParam("alpha", ParamType::TGLfloat, alpha);
 
-    return CallCapture(gl::EntryPoint::Color4f, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLColor4f, std::move(paramBuffer));
 }
 
 CallCapture CaptureColor4ub(const State &glState,
@@ -163,7 +163,7 @@
     paramBuffer.addValueParam("blue", ParamType::TGLubyte, blue);
     paramBuffer.addValueParam("alpha", ParamType::TGLubyte, alpha);
 
-    return CallCapture(gl::EntryPoint::Color4ub, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLColor4ub, std::move(paramBuffer));
 }
 
 CallCapture CaptureColor4x(const State &glState,
@@ -180,7 +180,7 @@
     paramBuffer.addValueParam("blue", ParamType::TGLfixed, blue);
     paramBuffer.addValueParam("alpha", ParamType::TGLfixed, alpha);
 
-    return CallCapture(gl::EntryPoint::Color4x, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLColor4x, std::move(paramBuffer));
 }
 
 CallCapture CaptureColorPointer(const State &glState,
@@ -212,7 +212,7 @@
         paramBuffer.addParam(std::move(pointerParam));
     }
 
-    return CallCapture(gl::EntryPoint::ColorPointer, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLColorPointer, std::move(paramBuffer));
 }
 
 CallCapture CaptureDepthRangex(const State &glState, bool isCallValid, GLfixed n, GLfixed f)
@@ -222,7 +222,7 @@
     paramBuffer.addValueParam("n", ParamType::TGLfixed, n);
     paramBuffer.addValueParam("f", ParamType::TGLfixed, f);
 
-    return CallCapture(gl::EntryPoint::DepthRangex, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDepthRangex, std::move(paramBuffer));
 }
 
 CallCapture CaptureDisableClientState(const State &glState,
@@ -233,7 +233,7 @@
 
     paramBuffer.addValueParam("arrayPacked", ParamType::TClientVertexArrayType, arrayPacked);
 
-    return CallCapture(gl::EntryPoint::DisableClientState, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDisableClientState, std::move(paramBuffer));
 }
 
 CallCapture CaptureEnableClientState(const State &glState,
@@ -244,7 +244,7 @@
 
     paramBuffer.addValueParam("arrayPacked", ParamType::TClientVertexArrayType, arrayPacked);
 
-    return CallCapture(gl::EntryPoint::EnableClientState, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLEnableClientState, std::move(paramBuffer));
 }
 
 CallCapture CaptureFogf(const State &glState, bool isCallValid, GLenum pname, GLfloat param)
@@ -254,7 +254,7 @@
     paramBuffer.addEnumParam("pname", GLenumGroup::FogParameter, ParamType::TGLenum, pname);
     paramBuffer.addValueParam("param", ParamType::TGLfloat, param);
 
-    return CallCapture(gl::EntryPoint::Fogf, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLFogf, std::move(paramBuffer));
 }
 
 CallCapture CaptureFogfv(const State &glState,
@@ -281,7 +281,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::Fogfv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLFogfv, std::move(paramBuffer));
 }
 
 CallCapture CaptureFogx(const State &glState, bool isCallValid, GLenum pname, GLfixed param)
@@ -291,7 +291,7 @@
     paramBuffer.addEnumParam("pname", GLenumGroup::FogPName, ParamType::TGLenum, pname);
     paramBuffer.addValueParam("param", ParamType::TGLfixed, param);
 
-    return CallCapture(gl::EntryPoint::Fogx, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLFogx, std::move(paramBuffer));
 }
 
 CallCapture CaptureFogxv(const State &glState, bool isCallValid, GLenum pname, const GLfixed *param)
@@ -315,7 +315,7 @@
         paramBuffer.addParam(std::move(paramParam));
     }
 
-    return CallCapture(gl::EntryPoint::Fogxv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLFogxv, std::move(paramBuffer));
 }
 
 CallCapture CaptureFrustumf(const State &glState,
@@ -336,7 +336,7 @@
     paramBuffer.addValueParam("n", ParamType::TGLfloat, n);
     paramBuffer.addValueParam("f", ParamType::TGLfloat, f);
 
-    return CallCapture(gl::EntryPoint::Frustumf, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLFrustumf, std::move(paramBuffer));
 }
 
 CallCapture CaptureFrustumx(const State &glState,
@@ -357,7 +357,7 @@
     paramBuffer.addValueParam("n", ParamType::TGLfixed, n);
     paramBuffer.addValueParam("f", ParamType::TGLfixed, f);
 
-    return CallCapture(gl::EntryPoint::Frustumx, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLFrustumx, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetClipPlanef(const State &glState,
@@ -384,7 +384,7 @@
         paramBuffer.addParam(std::move(equationParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetClipPlanef, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetClipPlanef, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetClipPlanex(const State &glState,
@@ -411,7 +411,7 @@
         paramBuffer.addParam(std::move(equationParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetClipPlanex, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetClipPlanex, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetFixedv(const State &glState, bool isCallValid, GLenum pname, GLfixed *params)
@@ -435,7 +435,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetFixedv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetFixedv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetLightfv(const State &glState,
@@ -464,7 +464,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetLightfv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetLightfv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetLightxv(const State &glState,
@@ -493,7 +493,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetLightxv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetLightxv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetMaterialfv(const State &glState,
@@ -522,7 +522,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetMaterialfv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetMaterialfv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetMaterialxv(const State &glState,
@@ -551,7 +551,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetMaterialxv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetMaterialxv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetTexEnvfv(const State &glState,
@@ -581,7 +581,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetTexEnvfv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetTexEnvfv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetTexEnviv(const State &glState,
@@ -610,7 +610,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetTexEnviv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetTexEnviv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetTexEnvxv(const State &glState,
@@ -640,7 +640,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetTexEnvxv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetTexEnvxv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetTexParameterxv(const State &glState,
@@ -670,7 +670,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetTexParameterxv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetTexParameterxv, std::move(paramBuffer));
 }
 
 CallCapture CaptureLightModelf(const State &glState, bool isCallValid, GLenum pname, GLfloat param)
@@ -680,7 +680,7 @@
     paramBuffer.addEnumParam("pname", GLenumGroup::LightModelParameter, ParamType::TGLenum, pname);
     paramBuffer.addValueParam("param", ParamType::TGLfloat, param);
 
-    return CallCapture(gl::EntryPoint::LightModelf, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLLightModelf, std::move(paramBuffer));
 }
 
 CallCapture CaptureLightModelfv(const State &glState,
@@ -707,7 +707,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::LightModelfv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLLightModelfv, std::move(paramBuffer));
 }
 
 CallCapture CaptureLightModelx(const State &glState, bool isCallValid, GLenum pname, GLfixed param)
@@ -717,7 +717,7 @@
     paramBuffer.addEnumParam("pname", GLenumGroup::LightModelParameter, ParamType::TGLenum, pname);
     paramBuffer.addValueParam("param", ParamType::TGLfixed, param);
 
-    return CallCapture(gl::EntryPoint::LightModelx, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLLightModelx, std::move(paramBuffer));
 }
 
 CallCapture CaptureLightModelxv(const State &glState,
@@ -744,7 +744,7 @@
         paramBuffer.addParam(std::move(paramParam));
     }
 
-    return CallCapture(gl::EntryPoint::LightModelxv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLLightModelxv, std::move(paramBuffer));
 }
 
 CallCapture CaptureLightf(const State &glState,
@@ -759,7 +759,7 @@
     paramBuffer.addValueParam("pnamePacked", ParamType::TLightParameter, pnamePacked);
     paramBuffer.addValueParam("param", ParamType::TGLfloat, param);
 
-    return CallCapture(gl::EntryPoint::Lightf, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLLightf, std::move(paramBuffer));
 }
 
 CallCapture CaptureLightfv(const State &glState,
@@ -788,7 +788,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::Lightfv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLLightfv, std::move(paramBuffer));
 }
 
 CallCapture CaptureLightx(const State &glState,
@@ -803,7 +803,7 @@
     paramBuffer.addValueParam("pnamePacked", ParamType::TLightParameter, pnamePacked);
     paramBuffer.addValueParam("param", ParamType::TGLfixed, param);
 
-    return CallCapture(gl::EntryPoint::Lightx, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLLightx, std::move(paramBuffer));
 }
 
 CallCapture CaptureLightxv(const State &glState,
@@ -832,7 +832,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::Lightxv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLLightxv, std::move(paramBuffer));
 }
 
 CallCapture CaptureLineWidthx(const State &glState, bool isCallValid, GLfixed width)
@@ -841,14 +841,14 @@
 
     paramBuffer.addValueParam("width", ParamType::TGLfixed, width);
 
-    return CallCapture(gl::EntryPoint::LineWidthx, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLLineWidthx, std::move(paramBuffer));
 }
 
 CallCapture CaptureLoadIdentity(const State &glState, bool isCallValid)
 {
     ParamBuffer paramBuffer;
 
-    return CallCapture(gl::EntryPoint::LoadIdentity, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLLoadIdentity, std::move(paramBuffer));
 }
 
 CallCapture CaptureLoadMatrixf(const State &glState, bool isCallValid, const GLfloat *m)
@@ -870,7 +870,7 @@
         paramBuffer.addParam(std::move(mParam));
     }
 
-    return CallCapture(gl::EntryPoint::LoadMatrixf, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLLoadMatrixf, std::move(paramBuffer));
 }
 
 CallCapture CaptureLoadMatrixx(const State &glState, bool isCallValid, const GLfixed *m)
@@ -892,7 +892,7 @@
         paramBuffer.addParam(std::move(mParam));
     }
 
-    return CallCapture(gl::EntryPoint::LoadMatrixx, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLLoadMatrixx, std::move(paramBuffer));
 }
 
 CallCapture CaptureLogicOp(const State &glState, bool isCallValid, LogicalOperation opcodePacked)
@@ -901,7 +901,7 @@
 
     paramBuffer.addValueParam("opcodePacked", ParamType::TLogicalOperation, opcodePacked);
 
-    return CallCapture(gl::EntryPoint::LogicOp, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLLogicOp, std::move(paramBuffer));
 }
 
 CallCapture CaptureMaterialf(const State &glState,
@@ -916,7 +916,7 @@
     paramBuffer.addValueParam("pnamePacked", ParamType::TMaterialParameter, pnamePacked);
     paramBuffer.addValueParam("param", ParamType::TGLfloat, param);
 
-    return CallCapture(gl::EntryPoint::Materialf, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLMaterialf, std::move(paramBuffer));
 }
 
 CallCapture CaptureMaterialfv(const State &glState,
@@ -945,7 +945,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::Materialfv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLMaterialfv, std::move(paramBuffer));
 }
 
 CallCapture CaptureMaterialx(const State &glState,
@@ -960,7 +960,7 @@
     paramBuffer.addValueParam("pnamePacked", ParamType::TMaterialParameter, pnamePacked);
     paramBuffer.addValueParam("param", ParamType::TGLfixed, param);
 
-    return CallCapture(gl::EntryPoint::Materialx, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLMaterialx, std::move(paramBuffer));
 }
 
 CallCapture CaptureMaterialxv(const State &glState,
@@ -989,7 +989,7 @@
         paramBuffer.addParam(std::move(paramParam));
     }
 
-    return CallCapture(gl::EntryPoint::Materialxv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLMaterialxv, std::move(paramBuffer));
 }
 
 CallCapture CaptureMatrixMode(const State &glState, bool isCallValid, MatrixType modePacked)
@@ -998,7 +998,7 @@
 
     paramBuffer.addValueParam("modePacked", ParamType::TMatrixType, modePacked);
 
-    return CallCapture(gl::EntryPoint::MatrixMode, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLMatrixMode, std::move(paramBuffer));
 }
 
 CallCapture CaptureMultMatrixf(const State &glState, bool isCallValid, const GLfloat *m)
@@ -1020,7 +1020,7 @@
         paramBuffer.addParam(std::move(mParam));
     }
 
-    return CallCapture(gl::EntryPoint::MultMatrixf, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLMultMatrixf, std::move(paramBuffer));
 }
 
 CallCapture CaptureMultMatrixx(const State &glState, bool isCallValid, const GLfixed *m)
@@ -1042,7 +1042,7 @@
         paramBuffer.addParam(std::move(mParam));
     }
 
-    return CallCapture(gl::EntryPoint::MultMatrixx, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLMultMatrixx, std::move(paramBuffer));
 }
 
 CallCapture CaptureMultiTexCoord4f(const State &glState,
@@ -1061,7 +1061,7 @@
     paramBuffer.addValueParam("r", ParamType::TGLfloat, r);
     paramBuffer.addValueParam("q", ParamType::TGLfloat, q);
 
-    return CallCapture(gl::EntryPoint::MultiTexCoord4f, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLMultiTexCoord4f, std::move(paramBuffer));
 }
 
 CallCapture CaptureMultiTexCoord4x(const State &glState,
@@ -1080,7 +1080,7 @@
     paramBuffer.addValueParam("r", ParamType::TGLfixed, r);
     paramBuffer.addValueParam("q", ParamType::TGLfixed, q);
 
-    return CallCapture(gl::EntryPoint::MultiTexCoord4x, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLMultiTexCoord4x, std::move(paramBuffer));
 }
 
 CallCapture CaptureNormal3f(const State &glState,
@@ -1095,7 +1095,7 @@
     paramBuffer.addValueParam("ny", ParamType::TGLfloat, ny);
     paramBuffer.addValueParam("nz", ParamType::TGLfloat, nz);
 
-    return CallCapture(gl::EntryPoint::Normal3f, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLNormal3f, std::move(paramBuffer));
 }
 
 CallCapture CaptureNormal3x(const State &glState,
@@ -1110,7 +1110,7 @@
     paramBuffer.addValueParam("ny", ParamType::TGLfixed, ny);
     paramBuffer.addValueParam("nz", ParamType::TGLfixed, nz);
 
-    return CallCapture(gl::EntryPoint::Normal3x, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLNormal3x, std::move(paramBuffer));
 }
 
 CallCapture CaptureNormalPointer(const State &glState,
@@ -1140,7 +1140,7 @@
         paramBuffer.addParam(std::move(pointerParam));
     }
 
-    return CallCapture(gl::EntryPoint::NormalPointer, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLNormalPointer, std::move(paramBuffer));
 }
 
 CallCapture CaptureOrthof(const State &glState,
@@ -1161,7 +1161,7 @@
     paramBuffer.addValueParam("n", ParamType::TGLfloat, n);
     paramBuffer.addValueParam("f", ParamType::TGLfloat, f);
 
-    return CallCapture(gl::EntryPoint::Orthof, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLOrthof, std::move(paramBuffer));
 }
 
 CallCapture CaptureOrthox(const State &glState,
@@ -1182,7 +1182,7 @@
     paramBuffer.addValueParam("n", ParamType::TGLfixed, n);
     paramBuffer.addValueParam("f", ParamType::TGLfixed, f);
 
-    return CallCapture(gl::EntryPoint::Orthox, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLOrthox, std::move(paramBuffer));
 }
 
 CallCapture CapturePointParameterf(const State &glState,
@@ -1195,7 +1195,7 @@
     paramBuffer.addValueParam("pnamePacked", ParamType::TPointParameter, pnamePacked);
     paramBuffer.addValueParam("param", ParamType::TGLfloat, param);
 
-    return CallCapture(gl::EntryPoint::PointParameterf, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLPointParameterf, std::move(paramBuffer));
 }
 
 CallCapture CapturePointParameterfv(const State &glState,
@@ -1222,7 +1222,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::PointParameterfv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLPointParameterfv, std::move(paramBuffer));
 }
 
 CallCapture CapturePointParameterx(const State &glState,
@@ -1235,7 +1235,7 @@
     paramBuffer.addValueParam("pnamePacked", ParamType::TPointParameter, pnamePacked);
     paramBuffer.addValueParam("param", ParamType::TGLfixed, param);
 
-    return CallCapture(gl::EntryPoint::PointParameterx, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLPointParameterx, std::move(paramBuffer));
 }
 
 CallCapture CapturePointParameterxv(const State &glState,
@@ -1262,7 +1262,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::PointParameterxv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLPointParameterxv, std::move(paramBuffer));
 }
 
 CallCapture CapturePointSize(const State &glState, bool isCallValid, GLfloat size)
@@ -1271,7 +1271,7 @@
 
     paramBuffer.addValueParam("size", ParamType::TGLfloat, size);
 
-    return CallCapture(gl::EntryPoint::PointSize, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLPointSize, std::move(paramBuffer));
 }
 
 CallCapture CapturePointSizex(const State &glState, bool isCallValid, GLfixed size)
@@ -1280,7 +1280,7 @@
 
     paramBuffer.addValueParam("size", ParamType::TGLfixed, size);
 
-    return CallCapture(gl::EntryPoint::PointSizex, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLPointSizex, std::move(paramBuffer));
 }
 
 CallCapture CapturePolygonOffsetx(const State &glState,
@@ -1293,21 +1293,21 @@
     paramBuffer.addValueParam("factor", ParamType::TGLfixed, factor);
     paramBuffer.addValueParam("units", ParamType::TGLfixed, units);
 
-    return CallCapture(gl::EntryPoint::PolygonOffsetx, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLPolygonOffsetx, std::move(paramBuffer));
 }
 
 CallCapture CapturePopMatrix(const State &glState, bool isCallValid)
 {
     ParamBuffer paramBuffer;
 
-    return CallCapture(gl::EntryPoint::PopMatrix, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLPopMatrix, std::move(paramBuffer));
 }
 
 CallCapture CapturePushMatrix(const State &glState, bool isCallValid)
 {
     ParamBuffer paramBuffer;
 
-    return CallCapture(gl::EntryPoint::PushMatrix, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLPushMatrix, std::move(paramBuffer));
 }
 
 CallCapture CaptureRotatef(const State &glState,
@@ -1324,7 +1324,7 @@
     paramBuffer.addValueParam("y", ParamType::TGLfloat, y);
     paramBuffer.addValueParam("z", ParamType::TGLfloat, z);
 
-    return CallCapture(gl::EntryPoint::Rotatef, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLRotatef, std::move(paramBuffer));
 }
 
 CallCapture CaptureRotatex(const State &glState,
@@ -1341,7 +1341,7 @@
     paramBuffer.addValueParam("y", ParamType::TGLfixed, y);
     paramBuffer.addValueParam("z", ParamType::TGLfixed, z);
 
-    return CallCapture(gl::EntryPoint::Rotatex, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLRotatex, std::move(paramBuffer));
 }
 
 CallCapture CaptureSampleCoveragex(const State &glState,
@@ -1354,7 +1354,7 @@
     paramBuffer.addValueParam("value", ParamType::TGLclampx, value);
     paramBuffer.addValueParam("invert", ParamType::TGLboolean, invert);
 
-    return CallCapture(gl::EntryPoint::SampleCoveragex, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLSampleCoveragex, std::move(paramBuffer));
 }
 
 CallCapture CaptureScalef(const State &glState, bool isCallValid, GLfloat x, GLfloat y, GLfloat z)
@@ -1365,7 +1365,7 @@
     paramBuffer.addValueParam("y", ParamType::TGLfloat, y);
     paramBuffer.addValueParam("z", ParamType::TGLfloat, z);
 
-    return CallCapture(gl::EntryPoint::Scalef, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLScalef, std::move(paramBuffer));
 }
 
 CallCapture CaptureScalex(const State &glState, bool isCallValid, GLfixed x, GLfixed y, GLfixed z)
@@ -1376,7 +1376,7 @@
     paramBuffer.addValueParam("y", ParamType::TGLfixed, y);
     paramBuffer.addValueParam("z", ParamType::TGLfixed, z);
 
-    return CallCapture(gl::EntryPoint::Scalex, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLScalex, std::move(paramBuffer));
 }
 
 CallCapture CaptureShadeModel(const State &glState, bool isCallValid, ShadingModel modePacked)
@@ -1385,7 +1385,7 @@
 
     paramBuffer.addValueParam("modePacked", ParamType::TShadingModel, modePacked);
 
-    return CallCapture(gl::EntryPoint::ShadeModel, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLShadeModel, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexCoordPointer(const State &glState,
@@ -1417,7 +1417,7 @@
         paramBuffer.addParam(std::move(pointerParam));
     }
 
-    return CallCapture(gl::EntryPoint::TexCoordPointer, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexCoordPointer, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexEnvf(const State &glState,
@@ -1432,7 +1432,7 @@
     paramBuffer.addValueParam("pnamePacked", ParamType::TTextureEnvParameter, pnamePacked);
     paramBuffer.addValueParam("param", ParamType::TGLfloat, param);
 
-    return CallCapture(gl::EntryPoint::TexEnvf, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexEnvf, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexEnvfv(const State &glState,
@@ -1462,7 +1462,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::TexEnvfv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexEnvfv, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexEnvi(const State &glState,
@@ -1477,7 +1477,7 @@
     paramBuffer.addValueParam("pnamePacked", ParamType::TTextureEnvParameter, pnamePacked);
     paramBuffer.addValueParam("param", ParamType::TGLint, param);
 
-    return CallCapture(gl::EntryPoint::TexEnvi, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexEnvi, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexEnviv(const State &glState,
@@ -1507,7 +1507,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::TexEnviv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexEnviv, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexEnvx(const State &glState,
@@ -1522,7 +1522,7 @@
     paramBuffer.addValueParam("pnamePacked", ParamType::TTextureEnvParameter, pnamePacked);
     paramBuffer.addValueParam("param", ParamType::TGLfixed, param);
 
-    return CallCapture(gl::EntryPoint::TexEnvx, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexEnvx, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexEnvxv(const State &glState,
@@ -1552,7 +1552,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::TexEnvxv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexEnvxv, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexParameterx(const State &glState,
@@ -1567,7 +1567,7 @@
     paramBuffer.addEnumParam("pname", GLenumGroup::GetTextureParameter, ParamType::TGLenum, pname);
     paramBuffer.addValueParam("param", ParamType::TGLfixed, param);
 
-    return CallCapture(gl::EntryPoint::TexParameterx, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexParameterx, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexParameterxv(const State &glState,
@@ -1597,7 +1597,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::TexParameterxv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexParameterxv, std::move(paramBuffer));
 }
 
 CallCapture CaptureTranslatef(const State &glState,
@@ -1612,7 +1612,7 @@
     paramBuffer.addValueParam("y", ParamType::TGLfloat, y);
     paramBuffer.addValueParam("z", ParamType::TGLfloat, z);
 
-    return CallCapture(gl::EntryPoint::Translatef, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTranslatef, std::move(paramBuffer));
 }
 
 CallCapture CaptureTranslatex(const State &glState,
@@ -1627,7 +1627,7 @@
     paramBuffer.addValueParam("y", ParamType::TGLfixed, y);
     paramBuffer.addValueParam("z", ParamType::TGLfixed, z);
 
-    return CallCapture(gl::EntryPoint::Translatex, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTranslatex, std::move(paramBuffer));
 }
 
 CallCapture CaptureVertexPointer(const State &glState,
@@ -1659,7 +1659,7 @@
         paramBuffer.addParam(std::move(pointerParam));
     }
 
-    return CallCapture(gl::EntryPoint::VertexPointer, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLVertexPointer, std::move(paramBuffer));
 }
 
 }  // namespace gl
diff --git a/src/libANGLE/capture_gles_2_0_autogen.cpp b/src/libANGLE/capture_gles_2_0_autogen.cpp
index b03c49f..0b04a74 100644
--- a/src/libANGLE/capture_gles_2_0_autogen.cpp
+++ b/src/libANGLE/capture_gles_2_0_autogen.cpp
@@ -26,7 +26,7 @@
 
     paramBuffer.addEnumParam("texture", GLenumGroup::TextureUnit, ParamType::TGLenum, texture);
 
-    return CallCapture(gl::EntryPoint::ActiveTexture, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLActiveTexture, std::move(paramBuffer));
 }
 
 CallCapture CaptureAttachShader(const State &glState,
@@ -39,7 +39,7 @@
     paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("shaderPacked", ParamType::TShaderProgramID, shaderPacked);
 
-    return CallCapture(gl::EntryPoint::AttachShader, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLAttachShader, std::move(paramBuffer));
 }
 
 CallCapture CaptureBindAttribLocation(const State &glState,
@@ -69,7 +69,7 @@
         paramBuffer.addParam(std::move(nameParam));
     }
 
-    return CallCapture(gl::EntryPoint::BindAttribLocation, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBindAttribLocation, std::move(paramBuffer));
 }
 
 CallCapture CaptureBindBuffer(const State &glState,
@@ -82,7 +82,7 @@
     paramBuffer.addValueParam("targetPacked", ParamType::TBufferBinding, targetPacked);
     paramBuffer.addValueParam("bufferPacked", ParamType::TBufferID, bufferPacked);
 
-    return CallCapture(gl::EntryPoint::BindBuffer, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBindBuffer, std::move(paramBuffer));
 }
 
 CallCapture CaptureBindFramebuffer(const State &glState,
@@ -95,7 +95,7 @@
     paramBuffer.addEnumParam("target", GLenumGroup::FramebufferTarget, ParamType::TGLenum, target);
     paramBuffer.addValueParam("framebufferPacked", ParamType::TFramebufferID, framebufferPacked);
 
-    return CallCapture(gl::EntryPoint::BindFramebuffer, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBindFramebuffer, std::move(paramBuffer));
 }
 
 CallCapture CaptureBindRenderbuffer(const State &glState,
@@ -108,7 +108,7 @@
     paramBuffer.addEnumParam("target", GLenumGroup::RenderbufferTarget, ParamType::TGLenum, target);
     paramBuffer.addValueParam("renderbufferPacked", ParamType::TRenderbufferID, renderbufferPacked);
 
-    return CallCapture(gl::EntryPoint::BindRenderbuffer, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBindRenderbuffer, std::move(paramBuffer));
 }
 
 CallCapture CaptureBindTexture(const State &glState,
@@ -121,7 +121,7 @@
     paramBuffer.addValueParam("targetPacked", ParamType::TTextureType, targetPacked);
     paramBuffer.addValueParam("texturePacked", ParamType::TTextureID, texturePacked);
 
-    return CallCapture(gl::EntryPoint::BindTexture, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBindTexture, std::move(paramBuffer));
 }
 
 CallCapture CaptureBlendColor(const State &glState,
@@ -138,7 +138,7 @@
     paramBuffer.addValueParam("blue", ParamType::TGLfloat, blue);
     paramBuffer.addValueParam("alpha", ParamType::TGLfloat, alpha);
 
-    return CallCapture(gl::EntryPoint::BlendColor, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBlendColor, std::move(paramBuffer));
 }
 
 CallCapture CaptureBlendEquation(const State &glState, bool isCallValid, GLenum mode)
@@ -147,7 +147,7 @@
 
     paramBuffer.addEnumParam("mode", GLenumGroup::BlendEquationModeEXT, ParamType::TGLenum, mode);
 
-    return CallCapture(gl::EntryPoint::BlendEquation, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBlendEquation, std::move(paramBuffer));
 }
 
 CallCapture CaptureBlendEquationSeparate(const State &glState,
@@ -162,7 +162,7 @@
     paramBuffer.addEnumParam("modeAlpha", GLenumGroup::BlendEquationModeEXT, ParamType::TGLenum,
                              modeAlpha);
 
-    return CallCapture(gl::EntryPoint::BlendEquationSeparate, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBlendEquationSeparate, std::move(paramBuffer));
 }
 
 CallCapture CaptureBlendFunc(const State &glState, bool isCallValid, GLenum sfactor, GLenum dfactor)
@@ -172,7 +172,7 @@
     paramBuffer.addEnumParam("sfactor", GLenumGroup::BlendingFactor, ParamType::TGLenum, sfactor);
     paramBuffer.addEnumParam("dfactor", GLenumGroup::BlendingFactor, ParamType::TGLenum, dfactor);
 
-    return CallCapture(gl::EntryPoint::BlendFunc, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBlendFunc, std::move(paramBuffer));
 }
 
 CallCapture CaptureBlendFuncSeparate(const State &glState,
@@ -193,7 +193,7 @@
     paramBuffer.addEnumParam("dfactorAlpha", GLenumGroup::BlendingFactor, ParamType::TGLenum,
                              dfactorAlpha);
 
-    return CallCapture(gl::EntryPoint::BlendFuncSeparate, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBlendFuncSeparate, std::move(paramBuffer));
 }
 
 CallCapture CaptureBufferData(const State &glState,
@@ -226,7 +226,7 @@
 
     paramBuffer.addValueParam("usagePacked", ParamType::TBufferUsage, usagePacked);
 
-    return CallCapture(gl::EntryPoint::BufferData, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBufferData, std::move(paramBuffer));
 }
 
 CallCapture CaptureBufferSubData(const State &glState,
@@ -258,7 +258,7 @@
         paramBuffer.addParam(std::move(dataParam));
     }
 
-    return CallCapture(gl::EntryPoint::BufferSubData, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBufferSubData, std::move(paramBuffer));
 }
 
 CallCapture CaptureCheckFramebufferStatus(const State &glState,
@@ -274,7 +274,7 @@
     InitParamValue(ParamType::TGLenum, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::CheckFramebufferStatus, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLCheckFramebufferStatus, std::move(paramBuffer));
 }
 
 CallCapture CaptureClear(const State &glState, bool isCallValid, GLbitfield mask)
@@ -283,7 +283,7 @@
 
     paramBuffer.addEnumParam("mask", GLenumGroup::ClearBufferMask, ParamType::TGLbitfield, mask);
 
-    return CallCapture(gl::EntryPoint::Clear, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLClear, std::move(paramBuffer));
 }
 
 CallCapture CaptureClearColor(const State &glState,
@@ -300,7 +300,7 @@
     paramBuffer.addValueParam("blue", ParamType::TGLfloat, blue);
     paramBuffer.addValueParam("alpha", ParamType::TGLfloat, alpha);
 
-    return CallCapture(gl::EntryPoint::ClearColor, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLClearColor, std::move(paramBuffer));
 }
 
 CallCapture CaptureClearDepthf(const State &glState, bool isCallValid, GLfloat d)
@@ -309,7 +309,7 @@
 
     paramBuffer.addValueParam("d", ParamType::TGLfloat, d);
 
-    return CallCapture(gl::EntryPoint::ClearDepthf, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLClearDepthf, std::move(paramBuffer));
 }
 
 CallCapture CaptureClearStencil(const State &glState, bool isCallValid, GLint s)
@@ -318,7 +318,7 @@
 
     paramBuffer.addValueParam("s", ParamType::TGLint, s);
 
-    return CallCapture(gl::EntryPoint::ClearStencil, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLClearStencil, std::move(paramBuffer));
 }
 
 CallCapture CaptureColorMask(const State &glState,
@@ -335,7 +335,7 @@
     paramBuffer.addValueParam("blue", ParamType::TGLboolean, blue);
     paramBuffer.addValueParam("alpha", ParamType::TGLboolean, alpha);
 
-    return CallCapture(gl::EntryPoint::ColorMask, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLColorMask, std::move(paramBuffer));
 }
 
 CallCapture CaptureCompileShader(const State &glState,
@@ -346,7 +346,7 @@
 
     paramBuffer.addValueParam("shaderPacked", ParamType::TShaderProgramID, shaderPacked);
 
-    return CallCapture(gl::EntryPoint::CompileShader, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLCompileShader, std::move(paramBuffer));
 }
 
 CallCapture CaptureCompressedTexImage2D(const State &glState,
@@ -387,7 +387,7 @@
         paramBuffer.addParam(std::move(dataParam));
     }
 
-    return CallCapture(gl::EntryPoint::CompressedTexImage2D, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLCompressedTexImage2D, std::move(paramBuffer));
 }
 
 CallCapture CaptureCompressedTexSubImage2D(const State &glState,
@@ -430,7 +430,7 @@
         paramBuffer.addParam(std::move(dataParam));
     }
 
-    return CallCapture(gl::EntryPoint::CompressedTexSubImage2D, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLCompressedTexSubImage2D, std::move(paramBuffer));
 }
 
 CallCapture CaptureCopyTexImage2D(const State &glState,
@@ -456,7 +456,7 @@
     paramBuffer.addValueParam("height", ParamType::TGLsizei, height);
     paramBuffer.addValueParam("border", ParamType::TGLint, border);
 
-    return CallCapture(gl::EntryPoint::CopyTexImage2D, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLCopyTexImage2D, std::move(paramBuffer));
 }
 
 CallCapture CaptureCopyTexSubImage2D(const State &glState,
@@ -481,7 +481,7 @@
     paramBuffer.addValueParam("width", ParamType::TGLsizei, width);
     paramBuffer.addValueParam("height", ParamType::TGLsizei, height);
 
-    return CallCapture(gl::EntryPoint::CopyTexSubImage2D, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLCopyTexSubImage2D, std::move(paramBuffer));
 }
 
 CallCapture CaptureCreateProgram(const State &glState, bool isCallValid, GLuint returnValue)
@@ -492,7 +492,7 @@
     InitParamValue(ParamType::TGLuint, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::CreateProgram, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLCreateProgram, std::move(paramBuffer));
 }
 
 CallCapture CaptureCreateShader(const State &glState,
@@ -508,7 +508,7 @@
     InitParamValue(ParamType::TGLuint, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::CreateShader, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLCreateShader, std::move(paramBuffer));
 }
 
 CallCapture CaptureCullFace(const State &glState, bool isCallValid, CullFaceMode modePacked)
@@ -517,7 +517,7 @@
 
     paramBuffer.addValueParam("modePacked", ParamType::TCullFaceMode, modePacked);
 
-    return CallCapture(gl::EntryPoint::CullFace, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLCullFace, std::move(paramBuffer));
 }
 
 CallCapture CaptureDeleteBuffers(const State &glState,
@@ -545,7 +545,7 @@
         paramBuffer.addParam(std::move(buffersPackedParam));
     }
 
-    return CallCapture(gl::EntryPoint::DeleteBuffers, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDeleteBuffers, std::move(paramBuffer));
 }
 
 CallCapture CaptureDeleteFramebuffers(const State &glState,
@@ -576,7 +576,7 @@
         paramBuffer.addParam(std::move(framebuffersPackedParam));
     }
 
-    return CallCapture(gl::EntryPoint::DeleteFramebuffers, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDeleteFramebuffers, std::move(paramBuffer));
 }
 
 CallCapture CaptureDeleteProgram(const State &glState,
@@ -587,7 +587,7 @@
 
     paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
 
-    return CallCapture(gl::EntryPoint::DeleteProgram, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDeleteProgram, std::move(paramBuffer));
 }
 
 CallCapture CaptureDeleteRenderbuffers(const State &glState,
@@ -619,7 +619,7 @@
         paramBuffer.addParam(std::move(renderbuffersPackedParam));
     }
 
-    return CallCapture(gl::EntryPoint::DeleteRenderbuffers, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDeleteRenderbuffers, std::move(paramBuffer));
 }
 
 CallCapture CaptureDeleteShader(const State &glState,
@@ -630,7 +630,7 @@
 
     paramBuffer.addValueParam("shaderPacked", ParamType::TShaderProgramID, shaderPacked);
 
-    return CallCapture(gl::EntryPoint::DeleteShader, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDeleteShader, std::move(paramBuffer));
 }
 
 CallCapture CaptureDeleteTextures(const State &glState,
@@ -659,7 +659,7 @@
         paramBuffer.addParam(std::move(texturesPackedParam));
     }
 
-    return CallCapture(gl::EntryPoint::DeleteTextures, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDeleteTextures, std::move(paramBuffer));
 }
 
 CallCapture CaptureDepthFunc(const State &glState, bool isCallValid, GLenum func)
@@ -668,7 +668,7 @@
 
     paramBuffer.addEnumParam("func", GLenumGroup::DepthFunction, ParamType::TGLenum, func);
 
-    return CallCapture(gl::EntryPoint::DepthFunc, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDepthFunc, std::move(paramBuffer));
 }
 
 CallCapture CaptureDepthMask(const State &glState, bool isCallValid, GLboolean flag)
@@ -677,7 +677,7 @@
 
     paramBuffer.addValueParam("flag", ParamType::TGLboolean, flag);
 
-    return CallCapture(gl::EntryPoint::DepthMask, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDepthMask, std::move(paramBuffer));
 }
 
 CallCapture CaptureDepthRangef(const State &glState, bool isCallValid, GLfloat n, GLfloat f)
@@ -687,7 +687,7 @@
     paramBuffer.addValueParam("n", ParamType::TGLfloat, n);
     paramBuffer.addValueParam("f", ParamType::TGLfloat, f);
 
-    return CallCapture(gl::EntryPoint::DepthRangef, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDepthRangef, std::move(paramBuffer));
 }
 
 CallCapture CaptureDetachShader(const State &glState,
@@ -700,7 +700,7 @@
     paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
     paramBuffer.addValueParam("shaderPacked", ParamType::TShaderProgramID, shaderPacked);
 
-    return CallCapture(gl::EntryPoint::DetachShader, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDetachShader, std::move(paramBuffer));
 }
 
 CallCapture CaptureDisable(const State &glState, bool isCallValid, GLenum cap)
@@ -709,7 +709,7 @@
 
     paramBuffer.addEnumParam("cap", GLenumGroup::EnableCap, ParamType::TGLenum, cap);
 
-    return CallCapture(gl::EntryPoint::Disable, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDisable, std::move(paramBuffer));
 }
 
 CallCapture CaptureDisableVertexAttribArray(const State &glState, bool isCallValid, GLuint index)
@@ -718,7 +718,7 @@
 
     paramBuffer.addValueParam("index", ParamType::TGLuint, index);
 
-    return CallCapture(gl::EntryPoint::DisableVertexAttribArray, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDisableVertexAttribArray, std::move(paramBuffer));
 }
 
 CallCapture CaptureDrawArrays(const State &glState,
@@ -733,7 +733,7 @@
     paramBuffer.addValueParam("first", ParamType::TGLint, first);
     paramBuffer.addValueParam("count", ParamType::TGLsizei, count);
 
-    return CallCapture(gl::EntryPoint::DrawArrays, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDrawArrays, std::move(paramBuffer));
 }
 
 CallCapture CaptureDrawElements(const State &glState,
@@ -765,7 +765,7 @@
         paramBuffer.addParam(std::move(indicesParam));
     }
 
-    return CallCapture(gl::EntryPoint::DrawElements, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDrawElements, std::move(paramBuffer));
 }
 
 CallCapture CaptureEnable(const State &glState, bool isCallValid, GLenum cap)
@@ -774,7 +774,7 @@
 
     paramBuffer.addEnumParam("cap", GLenumGroup::EnableCap, ParamType::TGLenum, cap);
 
-    return CallCapture(gl::EntryPoint::Enable, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLEnable, std::move(paramBuffer));
 }
 
 CallCapture CaptureEnableVertexAttribArray(const State &glState, bool isCallValid, GLuint index)
@@ -783,21 +783,21 @@
 
     paramBuffer.addValueParam("index", ParamType::TGLuint, index);
 
-    return CallCapture(gl::EntryPoint::EnableVertexAttribArray, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLEnableVertexAttribArray, std::move(paramBuffer));
 }
 
 CallCapture CaptureFinish(const State &glState, bool isCallValid)
 {
     ParamBuffer paramBuffer;
 
-    return CallCapture(gl::EntryPoint::Finish, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLFinish, std::move(paramBuffer));
 }
 
 CallCapture CaptureFlush(const State &glState, bool isCallValid)
 {
     ParamBuffer paramBuffer;
 
-    return CallCapture(gl::EntryPoint::Flush, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLFlush, std::move(paramBuffer));
 }
 
 CallCapture CaptureFramebufferRenderbuffer(const State &glState,
@@ -816,7 +816,7 @@
                              ParamType::TGLenum, renderbuffertarget);
     paramBuffer.addValueParam("renderbufferPacked", ParamType::TRenderbufferID, renderbufferPacked);
 
-    return CallCapture(gl::EntryPoint::FramebufferRenderbuffer, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLFramebufferRenderbuffer, std::move(paramBuffer));
 }
 
 CallCapture CaptureFramebufferTexture2D(const State &glState,
@@ -836,7 +836,7 @@
     paramBuffer.addValueParam("texturePacked", ParamType::TTextureID, texturePacked);
     paramBuffer.addValueParam("level", ParamType::TGLint, level);
 
-    return CallCapture(gl::EntryPoint::FramebufferTexture2D, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLFramebufferTexture2D, std::move(paramBuffer));
 }
 
 CallCapture CaptureFrontFace(const State &glState, bool isCallValid, GLenum mode)
@@ -845,7 +845,7 @@
 
     paramBuffer.addEnumParam("mode", GLenumGroup::FrontFaceDirection, ParamType::TGLenum, mode);
 
-    return CallCapture(gl::EntryPoint::FrontFace, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLFrontFace, std::move(paramBuffer));
 }
 
 CallCapture CaptureGenBuffers(const State &glState,
@@ -873,7 +873,7 @@
         paramBuffer.addParam(std::move(buffersPackedParam));
     }
 
-    return CallCapture(gl::EntryPoint::GenBuffers, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGenBuffers, std::move(paramBuffer));
 }
 
 CallCapture CaptureGenFramebuffers(const State &glState,
@@ -904,7 +904,7 @@
         paramBuffer.addParam(std::move(framebuffersPackedParam));
     }
 
-    return CallCapture(gl::EntryPoint::GenFramebuffers, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGenFramebuffers, std::move(paramBuffer));
 }
 
 CallCapture CaptureGenRenderbuffers(const State &glState,
@@ -935,7 +935,7 @@
         paramBuffer.addParam(std::move(renderbuffersPackedParam));
     }
 
-    return CallCapture(gl::EntryPoint::GenRenderbuffers, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGenRenderbuffers, std::move(paramBuffer));
 }
 
 CallCapture CaptureGenTextures(const State &glState,
@@ -963,7 +963,7 @@
         paramBuffer.addParam(std::move(texturesPackedParam));
     }
 
-    return CallCapture(gl::EntryPoint::GenTextures, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGenTextures, std::move(paramBuffer));
 }
 
 CallCapture CaptureGenerateMipmap(const State &glState, bool isCallValid, TextureType targetPacked)
@@ -972,7 +972,7 @@
 
     paramBuffer.addValueParam("targetPacked", ParamType::TTextureType, targetPacked);
 
-    return CallCapture(gl::EntryPoint::GenerateMipmap, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGenerateMipmap, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetActiveAttrib(const State &glState,
@@ -1052,7 +1052,7 @@
         paramBuffer.addParam(std::move(nameParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetActiveAttrib, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetActiveAttrib, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetActiveUniform(const State &glState,
@@ -1132,7 +1132,7 @@
         paramBuffer.addParam(std::move(nameParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetActiveUniform, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetActiveUniform, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetAttachedShaders(const State &glState,
@@ -1180,7 +1180,7 @@
         paramBuffer.addParam(std::move(shadersPackedParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetAttachedShaders, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetAttachedShaders, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetAttribLocation(const State &glState,
@@ -1212,7 +1212,7 @@
     InitParamValue(ParamType::TGLint, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::GetAttribLocation, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetAttribLocation, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetBooleanv(const State &glState,
@@ -1239,7 +1239,7 @@
         paramBuffer.addParam(std::move(dataParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetBooleanv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetBooleanv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetBufferParameteriv(const State &glState,
@@ -1268,7 +1268,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetBufferParameteriv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetBufferParameteriv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetError(const State &glState, bool isCallValid, GLenum returnValue)
@@ -1279,7 +1279,7 @@
     InitParamValue(ParamType::TGLenum, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::GetError, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetError, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetFloatv(const State &glState, bool isCallValid, GLenum pname, GLfloat *data)
@@ -1303,7 +1303,7 @@
         paramBuffer.addParam(std::move(dataParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetFloatv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetFloatv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetFramebufferAttachmentParameteriv(const State &glState,
@@ -1336,7 +1336,8 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetFramebufferAttachmentParameteriv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetFramebufferAttachmentParameteriv,
+                       std::move(paramBuffer));
 }
 
 CallCapture CaptureGetIntegerv(const State &glState, bool isCallValid, GLenum pname, GLint *data)
@@ -1359,7 +1360,7 @@
         paramBuffer.addParam(std::move(dataParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetIntegerv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetIntegerv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetProgramInfoLog(const State &glState,
@@ -1406,7 +1407,7 @@
         paramBuffer.addParam(std::move(infoLogParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetProgramInfoLog, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetProgramInfoLog, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetProgramiv(const State &glState,
@@ -1435,7 +1436,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetProgramiv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetProgramiv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetRenderbufferParameteriv(const State &glState,
@@ -1465,7 +1466,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetRenderbufferParameteriv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetRenderbufferParameteriv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetShaderInfoLog(const State &glState,
@@ -1512,7 +1513,7 @@
         paramBuffer.addParam(std::move(infoLogParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetShaderInfoLog, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetShaderInfoLog, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetShaderPrecisionFormat(const State &glState,
@@ -1559,7 +1560,7 @@
         paramBuffer.addParam(std::move(precisionParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetShaderPrecisionFormat, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetShaderPrecisionFormat, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetShaderSource(const State &glState,
@@ -1606,7 +1607,7 @@
         paramBuffer.addParam(std::move(sourceParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetShaderSource, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetShaderSource, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetShaderiv(const State &glState,
@@ -1634,7 +1635,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetShaderiv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetShaderiv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetString(const State &glState,
@@ -1650,7 +1651,7 @@
     InitParamValue(ParamType::TGLubyteConstPointer, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::GetString, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetString, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetTexParameterfv(const State &glState,
@@ -1680,7 +1681,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetTexParameterfv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetTexParameterfv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetTexParameteriv(const State &glState,
@@ -1709,7 +1710,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetTexParameteriv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetTexParameteriv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetUniformLocation(const State &glState,
@@ -1741,7 +1742,7 @@
     InitParamValue(ParamType::TGLint, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::GetUniformLocation, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetUniformLocation, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetUniformfv(const State &glState,
@@ -1771,7 +1772,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetUniformfv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetUniformfv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetUniformiv(const State &glState,
@@ -1800,7 +1801,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetUniformiv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetUniformiv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetVertexAttribPointerv(const State &glState,
@@ -1830,7 +1831,7 @@
         paramBuffer.addParam(std::move(pointerParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetVertexAttribPointerv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetVertexAttribPointerv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetVertexAttribfv(const State &glState,
@@ -1859,7 +1860,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetVertexAttribfv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetVertexAttribfv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetVertexAttribiv(const State &glState,
@@ -1887,7 +1888,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetVertexAttribiv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetVertexAttribiv, std::move(paramBuffer));
 }
 
 CallCapture CaptureHint(const State &glState, bool isCallValid, GLenum target, GLenum mode)
@@ -1897,7 +1898,7 @@
     paramBuffer.addEnumParam("target", GLenumGroup::HintTarget, ParamType::TGLenum, target);
     paramBuffer.addEnumParam("mode", GLenumGroup::HintMode, ParamType::TGLenum, mode);
 
-    return CallCapture(gl::EntryPoint::Hint, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLHint, std::move(paramBuffer));
 }
 
 CallCapture CaptureIsBuffer(const State &glState,
@@ -1913,7 +1914,7 @@
     InitParamValue(ParamType::TGLboolean, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::IsBuffer, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLIsBuffer, std::move(paramBuffer));
 }
 
 CallCapture CaptureIsEnabled(const State &glState,
@@ -1929,7 +1930,7 @@
     InitParamValue(ParamType::TGLboolean, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::IsEnabled, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLIsEnabled, std::move(paramBuffer));
 }
 
 CallCapture CaptureIsFramebuffer(const State &glState,
@@ -1945,7 +1946,7 @@
     InitParamValue(ParamType::TGLboolean, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::IsFramebuffer, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLIsFramebuffer, std::move(paramBuffer));
 }
 
 CallCapture CaptureIsProgram(const State &glState,
@@ -1961,7 +1962,7 @@
     InitParamValue(ParamType::TGLboolean, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::IsProgram, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLIsProgram, std::move(paramBuffer));
 }
 
 CallCapture CaptureIsRenderbuffer(const State &glState,
@@ -1977,7 +1978,7 @@
     InitParamValue(ParamType::TGLboolean, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::IsRenderbuffer, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLIsRenderbuffer, std::move(paramBuffer));
 }
 
 CallCapture CaptureIsShader(const State &glState,
@@ -1993,7 +1994,7 @@
     InitParamValue(ParamType::TGLboolean, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::IsShader, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLIsShader, std::move(paramBuffer));
 }
 
 CallCapture CaptureIsTexture(const State &glState,
@@ -2009,7 +2010,7 @@
     InitParamValue(ParamType::TGLboolean, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::IsTexture, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLIsTexture, std::move(paramBuffer));
 }
 
 CallCapture CaptureLineWidth(const State &glState, bool isCallValid, GLfloat width)
@@ -2018,7 +2019,7 @@
 
     paramBuffer.addValueParam("width", ParamType::TGLfloat, width);
 
-    return CallCapture(gl::EntryPoint::LineWidth, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLLineWidth, std::move(paramBuffer));
 }
 
 CallCapture CaptureLinkProgram(const State &glState,
@@ -2029,7 +2030,7 @@
 
     paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
 
-    return CallCapture(gl::EntryPoint::LinkProgram, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLLinkProgram, std::move(paramBuffer));
 }
 
 CallCapture CapturePixelStorei(const State &glState, bool isCallValid, GLenum pname, GLint param)
@@ -2039,7 +2040,7 @@
     paramBuffer.addEnumParam("pname", GLenumGroup::PixelStoreParameter, ParamType::TGLenum, pname);
     paramBuffer.addValueParam("param", ParamType::TGLint, param);
 
-    return CallCapture(gl::EntryPoint::PixelStorei, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLPixelStorei, std::move(paramBuffer));
 }
 
 CallCapture CapturePolygonOffset(const State &glState,
@@ -2052,7 +2053,7 @@
     paramBuffer.addValueParam("factor", ParamType::TGLfloat, factor);
     paramBuffer.addValueParam("units", ParamType::TGLfloat, units);
 
-    return CallCapture(gl::EntryPoint::PolygonOffset, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLPolygonOffset, std::move(paramBuffer));
 }
 
 CallCapture CaptureReadPixels(const State &glState,
@@ -2089,14 +2090,14 @@
         paramBuffer.addParam(std::move(pixelsParam));
     }
 
-    return CallCapture(gl::EntryPoint::ReadPixels, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLReadPixels, std::move(paramBuffer));
 }
 
 CallCapture CaptureReleaseShaderCompiler(const State &glState, bool isCallValid)
 {
     ParamBuffer paramBuffer;
 
-    return CallCapture(gl::EntryPoint::ReleaseShaderCompiler, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLReleaseShaderCompiler, std::move(paramBuffer));
 }
 
 CallCapture CaptureRenderbufferStorage(const State &glState,
@@ -2114,7 +2115,7 @@
     paramBuffer.addValueParam("width", ParamType::TGLsizei, width);
     paramBuffer.addValueParam("height", ParamType::TGLsizei, height);
 
-    return CallCapture(gl::EntryPoint::RenderbufferStorage, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLRenderbufferStorage, std::move(paramBuffer));
 }
 
 CallCapture CaptureSampleCoverage(const State &glState,
@@ -2127,7 +2128,7 @@
     paramBuffer.addValueParam("value", ParamType::TGLfloat, value);
     paramBuffer.addValueParam("invert", ParamType::TGLboolean, invert);
 
-    return CallCapture(gl::EntryPoint::SampleCoverage, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLSampleCoverage, std::move(paramBuffer));
 }
 
 CallCapture CaptureScissor(const State &glState,
@@ -2144,7 +2145,7 @@
     paramBuffer.addValueParam("width", ParamType::TGLsizei, width);
     paramBuffer.addValueParam("height", ParamType::TGLsizei, height);
 
-    return CallCapture(gl::EntryPoint::Scissor, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLScissor, std::move(paramBuffer));
 }
 
 CallCapture CaptureShaderBinary(const State &glState,
@@ -2197,7 +2198,7 @@
 
     paramBuffer.addValueParam("length", ParamType::TGLsizei, length);
 
-    return CallCapture(gl::EntryPoint::ShaderBinary, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLShaderBinary, std::move(paramBuffer));
 }
 
 CallCapture CaptureShaderSource(const State &glState,
@@ -2244,7 +2245,7 @@
         paramBuffer.addParam(std::move(lengthParam));
     }
 
-    return CallCapture(gl::EntryPoint::ShaderSource, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLShaderSource, std::move(paramBuffer));
 }
 
 CallCapture CaptureStencilFunc(const State &glState,
@@ -2259,7 +2260,7 @@
     paramBuffer.addValueParam("ref", ParamType::TGLint, ref);
     paramBuffer.addValueParam("mask", ParamType::TGLuint, mask);
 
-    return CallCapture(gl::EntryPoint::StencilFunc, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLStencilFunc, std::move(paramBuffer));
 }
 
 CallCapture CaptureStencilFuncSeparate(const State &glState,
@@ -2276,7 +2277,7 @@
     paramBuffer.addValueParam("ref", ParamType::TGLint, ref);
     paramBuffer.addValueParam("mask", ParamType::TGLuint, mask);
 
-    return CallCapture(gl::EntryPoint::StencilFuncSeparate, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLStencilFuncSeparate, std::move(paramBuffer));
 }
 
 CallCapture CaptureStencilMask(const State &glState, bool isCallValid, GLuint mask)
@@ -2285,7 +2286,7 @@
 
     paramBuffer.addValueParam("mask", ParamType::TGLuint, mask);
 
-    return CallCapture(gl::EntryPoint::StencilMask, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLStencilMask, std::move(paramBuffer));
 }
 
 CallCapture CaptureStencilMaskSeparate(const State &glState,
@@ -2298,7 +2299,7 @@
     paramBuffer.addEnumParam("face", GLenumGroup::StencilFaceDirection, ParamType::TGLenum, face);
     paramBuffer.addValueParam("mask", ParamType::TGLuint, mask);
 
-    return CallCapture(gl::EntryPoint::StencilMaskSeparate, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLStencilMaskSeparate, std::move(paramBuffer));
 }
 
 CallCapture CaptureStencilOp(const State &glState,
@@ -2313,7 +2314,7 @@
     paramBuffer.addEnumParam("zfail", GLenumGroup::StencilOp, ParamType::TGLenum, zfail);
     paramBuffer.addEnumParam("zpass", GLenumGroup::StencilOp, ParamType::TGLenum, zpass);
 
-    return CallCapture(gl::EntryPoint::StencilOp, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLStencilOp, std::move(paramBuffer));
 }
 
 CallCapture CaptureStencilOpSeparate(const State &glState,
@@ -2330,7 +2331,7 @@
     paramBuffer.addEnumParam("dpfail", GLenumGroup::StencilOp, ParamType::TGLenum, dpfail);
     paramBuffer.addEnumParam("dppass", GLenumGroup::StencilOp, ParamType::TGLenum, dppass);
 
-    return CallCapture(gl::EntryPoint::StencilOpSeparate, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLStencilOpSeparate, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexImage2D(const State &glState,
@@ -2372,7 +2373,7 @@
         paramBuffer.addParam(std::move(pixelsParam));
     }
 
-    return CallCapture(gl::EntryPoint::TexImage2D, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexImage2D, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexParameterf(const State &glState,
@@ -2387,7 +2388,7 @@
     paramBuffer.addEnumParam("pname", GLenumGroup::TextureParameterName, ParamType::TGLenum, pname);
     paramBuffer.addValueParam("param", ParamType::TGLfloat, param);
 
-    return CallCapture(gl::EntryPoint::TexParameterf, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexParameterf, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexParameterfv(const State &glState,
@@ -2417,7 +2418,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::TexParameterfv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexParameterfv, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexParameteri(const State &glState,
@@ -2432,7 +2433,7 @@
     paramBuffer.addEnumParam("pname", GLenumGroup::TextureParameterName, ParamType::TGLenum, pname);
     paramBuffer.addValueParam("param", ParamType::TGLint, param);
 
-    return CallCapture(gl::EntryPoint::TexParameteri, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexParameteri, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexParameteriv(const State &glState,
@@ -2462,7 +2463,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::TexParameteriv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexParameteriv, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexSubImage2D(const State &glState,
@@ -2504,7 +2505,7 @@
         paramBuffer.addParam(std::move(pixelsParam));
     }
 
-    return CallCapture(gl::EntryPoint::TexSubImage2D, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexSubImage2D, std::move(paramBuffer));
 }
 
 CallCapture CaptureUniform1f(const State &glState,
@@ -2517,7 +2518,7 @@
     paramBuffer.addValueParam("locationPacked", ParamType::TUniformLocation, locationPacked);
     paramBuffer.addValueParam("v0", ParamType::TGLfloat, v0);
 
-    return CallCapture(gl::EntryPoint::Uniform1f, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLUniform1f, std::move(paramBuffer));
 }
 
 CallCapture CaptureUniform1fv(const State &glState,
@@ -2546,7 +2547,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::Uniform1fv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLUniform1fv, std::move(paramBuffer));
 }
 
 CallCapture CaptureUniform1i(const State &glState,
@@ -2559,7 +2560,7 @@
     paramBuffer.addValueParam("locationPacked", ParamType::TUniformLocation, locationPacked);
     paramBuffer.addValueParam("v0", ParamType::TGLint, v0);
 
-    return CallCapture(gl::EntryPoint::Uniform1i, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLUniform1i, std::move(paramBuffer));
 }
 
 CallCapture CaptureUniform1iv(const State &glState,
@@ -2588,7 +2589,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::Uniform1iv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLUniform1iv, std::move(paramBuffer));
 }
 
 CallCapture CaptureUniform2f(const State &glState,
@@ -2603,7 +2604,7 @@
     paramBuffer.addValueParam("v0", ParamType::TGLfloat, v0);
     paramBuffer.addValueParam("v1", ParamType::TGLfloat, v1);
 
-    return CallCapture(gl::EntryPoint::Uniform2f, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLUniform2f, std::move(paramBuffer));
 }
 
 CallCapture CaptureUniform2fv(const State &glState,
@@ -2632,7 +2633,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::Uniform2fv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLUniform2fv, std::move(paramBuffer));
 }
 
 CallCapture CaptureUniform2i(const State &glState,
@@ -2647,7 +2648,7 @@
     paramBuffer.addValueParam("v0", ParamType::TGLint, v0);
     paramBuffer.addValueParam("v1", ParamType::TGLint, v1);
 
-    return CallCapture(gl::EntryPoint::Uniform2i, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLUniform2i, std::move(paramBuffer));
 }
 
 CallCapture CaptureUniform2iv(const State &glState,
@@ -2676,7 +2677,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::Uniform2iv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLUniform2iv, std::move(paramBuffer));
 }
 
 CallCapture CaptureUniform3f(const State &glState,
@@ -2693,7 +2694,7 @@
     paramBuffer.addValueParam("v1", ParamType::TGLfloat, v1);
     paramBuffer.addValueParam("v2", ParamType::TGLfloat, v2);
 
-    return CallCapture(gl::EntryPoint::Uniform3f, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLUniform3f, std::move(paramBuffer));
 }
 
 CallCapture CaptureUniform3fv(const State &glState,
@@ -2722,7 +2723,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::Uniform3fv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLUniform3fv, std::move(paramBuffer));
 }
 
 CallCapture CaptureUniform3i(const State &glState,
@@ -2739,7 +2740,7 @@
     paramBuffer.addValueParam("v1", ParamType::TGLint, v1);
     paramBuffer.addValueParam("v2", ParamType::TGLint, v2);
 
-    return CallCapture(gl::EntryPoint::Uniform3i, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLUniform3i, std::move(paramBuffer));
 }
 
 CallCapture CaptureUniform3iv(const State &glState,
@@ -2768,7 +2769,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::Uniform3iv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLUniform3iv, std::move(paramBuffer));
 }
 
 CallCapture CaptureUniform4f(const State &glState,
@@ -2787,7 +2788,7 @@
     paramBuffer.addValueParam("v2", ParamType::TGLfloat, v2);
     paramBuffer.addValueParam("v3", ParamType::TGLfloat, v3);
 
-    return CallCapture(gl::EntryPoint::Uniform4f, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLUniform4f, std::move(paramBuffer));
 }
 
 CallCapture CaptureUniform4fv(const State &glState,
@@ -2816,7 +2817,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::Uniform4fv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLUniform4fv, std::move(paramBuffer));
 }
 
 CallCapture CaptureUniform4i(const State &glState,
@@ -2835,7 +2836,7 @@
     paramBuffer.addValueParam("v2", ParamType::TGLint, v2);
     paramBuffer.addValueParam("v3", ParamType::TGLint, v3);
 
-    return CallCapture(gl::EntryPoint::Uniform4i, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLUniform4i, std::move(paramBuffer));
 }
 
 CallCapture CaptureUniform4iv(const State &glState,
@@ -2864,7 +2865,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::Uniform4iv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLUniform4iv, std::move(paramBuffer));
 }
 
 CallCapture CaptureUniformMatrix2fv(const State &glState,
@@ -2896,7 +2897,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::UniformMatrix2fv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLUniformMatrix2fv, std::move(paramBuffer));
 }
 
 CallCapture CaptureUniformMatrix3fv(const State &glState,
@@ -2928,7 +2929,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::UniformMatrix3fv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLUniformMatrix3fv, std::move(paramBuffer));
 }
 
 CallCapture CaptureUniformMatrix4fv(const State &glState,
@@ -2960,7 +2961,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::UniformMatrix4fv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLUniformMatrix4fv, std::move(paramBuffer));
 }
 
 CallCapture CaptureUseProgram(const State &glState, bool isCallValid, ShaderProgramID programPacked)
@@ -2969,7 +2970,7 @@
 
     paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
 
-    return CallCapture(gl::EntryPoint::UseProgram, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLUseProgram, std::move(paramBuffer));
 }
 
 CallCapture CaptureValidateProgram(const State &glState,
@@ -2980,7 +2981,7 @@
 
     paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
 
-    return CallCapture(gl::EntryPoint::ValidateProgram, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLValidateProgram, std::move(paramBuffer));
 }
 
 CallCapture CaptureVertexAttrib1f(const State &glState, bool isCallValid, GLuint index, GLfloat x)
@@ -2990,7 +2991,7 @@
     paramBuffer.addValueParam("index", ParamType::TGLuint, index);
     paramBuffer.addValueParam("x", ParamType::TGLfloat, x);
 
-    return CallCapture(gl::EntryPoint::VertexAttrib1f, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLVertexAttrib1f, std::move(paramBuffer));
 }
 
 CallCapture CaptureVertexAttrib1fv(const State &glState,
@@ -3017,7 +3018,7 @@
         paramBuffer.addParam(std::move(vParam));
     }
 
-    return CallCapture(gl::EntryPoint::VertexAttrib1fv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLVertexAttrib1fv, std::move(paramBuffer));
 }
 
 CallCapture CaptureVertexAttrib2f(const State &glState,
@@ -3032,7 +3033,7 @@
     paramBuffer.addValueParam("x", ParamType::TGLfloat, x);
     paramBuffer.addValueParam("y", ParamType::TGLfloat, y);
 
-    return CallCapture(gl::EntryPoint::VertexAttrib2f, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLVertexAttrib2f, std::move(paramBuffer));
 }
 
 CallCapture CaptureVertexAttrib2fv(const State &glState,
@@ -3059,7 +3060,7 @@
         paramBuffer.addParam(std::move(vParam));
     }
 
-    return CallCapture(gl::EntryPoint::VertexAttrib2fv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLVertexAttrib2fv, std::move(paramBuffer));
 }
 
 CallCapture CaptureVertexAttrib3f(const State &glState,
@@ -3076,7 +3077,7 @@
     paramBuffer.addValueParam("y", ParamType::TGLfloat, y);
     paramBuffer.addValueParam("z", ParamType::TGLfloat, z);
 
-    return CallCapture(gl::EntryPoint::VertexAttrib3f, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLVertexAttrib3f, std::move(paramBuffer));
 }
 
 CallCapture CaptureVertexAttrib3fv(const State &glState,
@@ -3103,7 +3104,7 @@
         paramBuffer.addParam(std::move(vParam));
     }
 
-    return CallCapture(gl::EntryPoint::VertexAttrib3fv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLVertexAttrib3fv, std::move(paramBuffer));
 }
 
 CallCapture CaptureVertexAttrib4f(const State &glState,
@@ -3122,7 +3123,7 @@
     paramBuffer.addValueParam("z", ParamType::TGLfloat, z);
     paramBuffer.addValueParam("w", ParamType::TGLfloat, w);
 
-    return CallCapture(gl::EntryPoint::VertexAttrib4f, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLVertexAttrib4f, std::move(paramBuffer));
 }
 
 CallCapture CaptureVertexAttrib4fv(const State &glState,
@@ -3149,7 +3150,7 @@
         paramBuffer.addParam(std::move(vParam));
     }
 
-    return CallCapture(gl::EntryPoint::VertexAttrib4fv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLVertexAttrib4fv, std::move(paramBuffer));
 }
 
 CallCapture CaptureVertexAttribPointer(const State &glState,
@@ -3185,7 +3186,7 @@
         paramBuffer.addParam(std::move(pointerParam));
     }
 
-    return CallCapture(gl::EntryPoint::VertexAttribPointer, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLVertexAttribPointer, std::move(paramBuffer));
 }
 
 CallCapture CaptureViewport(const State &glState,
@@ -3202,7 +3203,7 @@
     paramBuffer.addValueParam("width", ParamType::TGLsizei, width);
     paramBuffer.addValueParam("height", ParamType::TGLsizei, height);
 
-    return CallCapture(gl::EntryPoint::Viewport, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLViewport, std::move(paramBuffer));
 }
 
 }  // namespace gl
diff --git a/src/libANGLE/capture_gles_3_0_autogen.cpp b/src/libANGLE/capture_gles_3_0_autogen.cpp
index 469f358..103b1e2 100644
--- a/src/libANGLE/capture_gles_3_0_autogen.cpp
+++ b/src/libANGLE/capture_gles_3_0_autogen.cpp
@@ -30,7 +30,7 @@
     paramBuffer.addValueParam("targetPacked", ParamType::TQueryType, targetPacked);
     paramBuffer.addValueParam("idPacked", ParamType::TQueryID, idPacked);
 
-    return CallCapture(gl::EntryPoint::BeginQuery, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBeginQuery, std::move(paramBuffer));
 }
 
 CallCapture CaptureBeginTransformFeedback(const State &glState,
@@ -42,7 +42,7 @@
     paramBuffer.addValueParam("primitiveModePacked", ParamType::TPrimitiveMode,
                               primitiveModePacked);
 
-    return CallCapture(gl::EntryPoint::BeginTransformFeedback, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBeginTransformFeedback, std::move(paramBuffer));
 }
 
 CallCapture CaptureBindBufferBase(const State &glState,
@@ -57,7 +57,7 @@
     paramBuffer.addValueParam("index", ParamType::TGLuint, index);
     paramBuffer.addValueParam("bufferPacked", ParamType::TBufferID, bufferPacked);
 
-    return CallCapture(gl::EntryPoint::BindBufferBase, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBindBufferBase, std::move(paramBuffer));
 }
 
 CallCapture CaptureBindBufferRange(const State &glState,
@@ -76,7 +76,7 @@
     paramBuffer.addValueParam("offset", ParamType::TGLintptr, offset);
     paramBuffer.addValueParam("size", ParamType::TGLsizeiptr, size);
 
-    return CallCapture(gl::EntryPoint::BindBufferRange, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBindBufferRange, std::move(paramBuffer));
 }
 
 CallCapture CaptureBindSampler(const State &glState,
@@ -89,7 +89,7 @@
     paramBuffer.addValueParam("unit", ParamType::TGLuint, unit);
     paramBuffer.addValueParam("samplerPacked", ParamType::TSamplerID, samplerPacked);
 
-    return CallCapture(gl::EntryPoint::BindSampler, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBindSampler, std::move(paramBuffer));
 }
 
 CallCapture CaptureBindTransformFeedback(const State &glState,
@@ -103,7 +103,7 @@
                              target);
     paramBuffer.addValueParam("idPacked", ParamType::TTransformFeedbackID, idPacked);
 
-    return CallCapture(gl::EntryPoint::BindTransformFeedback, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBindTransformFeedback, std::move(paramBuffer));
 }
 
 CallCapture CaptureBindVertexArray(const State &glState,
@@ -114,7 +114,7 @@
 
     paramBuffer.addValueParam("arrayPacked", ParamType::TVertexArrayID, arrayPacked);
 
-    return CallCapture(gl::EntryPoint::BindVertexArray, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBindVertexArray, std::move(paramBuffer));
 }
 
 CallCapture CaptureBlitFramebuffer(const State &glState,
@@ -144,7 +144,7 @@
     paramBuffer.addEnumParam("filter", GLenumGroup::BlitFramebufferFilter, ParamType::TGLenum,
                              filter);
 
-    return CallCapture(gl::EntryPoint::BlitFramebuffer, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBlitFramebuffer, std::move(paramBuffer));
 }
 
 CallCapture CaptureClearBufferfi(const State &glState,
@@ -161,7 +161,7 @@
     paramBuffer.addValueParam("depth", ParamType::TGLfloat, depth);
     paramBuffer.addValueParam("stencil", ParamType::TGLint, stencil);
 
-    return CallCapture(gl::EntryPoint::ClearBufferfi, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLClearBufferfi, std::move(paramBuffer));
 }
 
 CallCapture CaptureClearBufferfv(const State &glState,
@@ -190,7 +190,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ClearBufferfv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLClearBufferfv, std::move(paramBuffer));
 }
 
 CallCapture CaptureClearBufferiv(const State &glState,
@@ -219,7 +219,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ClearBufferiv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLClearBufferiv, std::move(paramBuffer));
 }
 
 CallCapture CaptureClearBufferuiv(const State &glState,
@@ -248,7 +248,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ClearBufferuiv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLClearBufferuiv, std::move(paramBuffer));
 }
 
 CallCapture CaptureClientWaitSync(const State &glState,
@@ -268,7 +268,7 @@
     InitParamValue(ParamType::TGLenum, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::ClientWaitSync, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLClientWaitSync, std::move(paramBuffer));
 }
 
 CallCapture CaptureCompressedTexImage3D(const State &glState,
@@ -311,7 +311,7 @@
         paramBuffer.addParam(std::move(dataParam));
     }
 
-    return CallCapture(gl::EntryPoint::CompressedTexImage3D, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLCompressedTexImage3D, std::move(paramBuffer));
 }
 
 CallCapture CaptureCompressedTexSubImage3D(const State &glState,
@@ -358,7 +358,7 @@
         paramBuffer.addParam(std::move(dataParam));
     }
 
-    return CallCapture(gl::EntryPoint::CompressedTexSubImage3D, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLCompressedTexSubImage3D, std::move(paramBuffer));
 }
 
 CallCapture CaptureCopyBufferSubData(const State &glState,
@@ -377,7 +377,7 @@
     paramBuffer.addValueParam("writeOffset", ParamType::TGLintptr, writeOffset);
     paramBuffer.addValueParam("size", ParamType::TGLsizeiptr, size);
 
-    return CallCapture(gl::EntryPoint::CopyBufferSubData, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLCopyBufferSubData, std::move(paramBuffer));
 }
 
 CallCapture CaptureCopyTexSubImage3D(const State &glState,
@@ -404,7 +404,7 @@
     paramBuffer.addValueParam("width", ParamType::TGLsizei, width);
     paramBuffer.addValueParam("height", ParamType::TGLsizei, height);
 
-    return CallCapture(gl::EntryPoint::CopyTexSubImage3D, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLCopyTexSubImage3D, std::move(paramBuffer));
 }
 
 CallCapture CaptureDeleteQueries(const State &glState,
@@ -431,7 +431,7 @@
         paramBuffer.addParam(std::move(idsPackedParam));
     }
 
-    return CallCapture(gl::EntryPoint::DeleteQueries, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDeleteQueries, std::move(paramBuffer));
 }
 
 CallCapture CaptureDeleteSamplers(const State &glState,
@@ -460,7 +460,7 @@
         paramBuffer.addParam(std::move(samplersPackedParam));
     }
 
-    return CallCapture(gl::EntryPoint::DeleteSamplers, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDeleteSamplers, std::move(paramBuffer));
 }
 
 CallCapture CaptureDeleteSync(const State &glState, bool isCallValid, GLsync sync)
@@ -469,7 +469,7 @@
 
     paramBuffer.addValueParam("sync", ParamType::TGLsync, sync);
 
-    return CallCapture(gl::EntryPoint::DeleteSync, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDeleteSync, std::move(paramBuffer));
 }
 
 CallCapture CaptureDeleteTransformFeedbacks(const State &glState,
@@ -498,7 +498,7 @@
         paramBuffer.addParam(std::move(idsPackedParam));
     }
 
-    return CallCapture(gl::EntryPoint::DeleteTransformFeedbacks, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDeleteTransformFeedbacks, std::move(paramBuffer));
 }
 
 CallCapture CaptureDeleteVertexArrays(const State &glState,
@@ -527,7 +527,7 @@
         paramBuffer.addParam(std::move(arraysPackedParam));
     }
 
-    return CallCapture(gl::EntryPoint::DeleteVertexArrays, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDeleteVertexArrays, std::move(paramBuffer));
 }
 
 CallCapture CaptureDrawArraysInstanced(const State &glState,
@@ -544,7 +544,7 @@
     paramBuffer.addValueParam("count", ParamType::TGLsizei, count);
     paramBuffer.addValueParam("instancecount", ParamType::TGLsizei, instancecount);
 
-    return CallCapture(gl::EntryPoint::DrawArraysInstanced, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDrawArraysInstanced, std::move(paramBuffer));
 }
 
 CallCapture CaptureDrawBuffers(const State &glState,
@@ -571,7 +571,7 @@
         paramBuffer.addParam(std::move(bufsParam));
     }
 
-    return CallCapture(gl::EntryPoint::DrawBuffers, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDrawBuffers, std::move(paramBuffer));
 }
 
 CallCapture CaptureDrawElementsInstanced(const State &glState,
@@ -606,7 +606,7 @@
 
     paramBuffer.addValueParam("instancecount", ParamType::TGLsizei, instancecount);
 
-    return CallCapture(gl::EntryPoint::DrawElementsInstanced, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDrawElementsInstanced, std::move(paramBuffer));
 }
 
 CallCapture CaptureDrawRangeElements(const State &glState,
@@ -642,7 +642,7 @@
         paramBuffer.addParam(std::move(indicesParam));
     }
 
-    return CallCapture(gl::EntryPoint::DrawRangeElements, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDrawRangeElements, std::move(paramBuffer));
 }
 
 CallCapture CaptureEndQuery(const State &glState, bool isCallValid, QueryType targetPacked)
@@ -651,14 +651,14 @@
 
     paramBuffer.addValueParam("targetPacked", ParamType::TQueryType, targetPacked);
 
-    return CallCapture(gl::EntryPoint::EndQuery, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLEndQuery, std::move(paramBuffer));
 }
 
 CallCapture CaptureEndTransformFeedback(const State &glState, bool isCallValid)
 {
     ParamBuffer paramBuffer;
 
-    return CallCapture(gl::EntryPoint::EndTransformFeedback, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLEndTransformFeedback, std::move(paramBuffer));
 }
 
 CallCapture CaptureFenceSync(const State &glState,
@@ -677,7 +677,7 @@
     InitParamValue(ParamType::TGLsync, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::FenceSync, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLFenceSync, std::move(paramBuffer));
 }
 
 CallCapture CaptureFlushMappedBufferRange(const State &glState,
@@ -692,7 +692,7 @@
     paramBuffer.addValueParam("offset", ParamType::TGLintptr, offset);
     paramBuffer.addValueParam("length", ParamType::TGLsizeiptr, length);
 
-    return CallCapture(gl::EntryPoint::FlushMappedBufferRange, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLFlushMappedBufferRange, std::move(paramBuffer));
 }
 
 CallCapture CaptureFramebufferTextureLayer(const State &glState,
@@ -712,7 +712,7 @@
     paramBuffer.addValueParam("level", ParamType::TGLint, level);
     paramBuffer.addValueParam("layer", ParamType::TGLint, layer);
 
-    return CallCapture(gl::EntryPoint::FramebufferTextureLayer, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLFramebufferTextureLayer, std::move(paramBuffer));
 }
 
 CallCapture CaptureGenQueries(const State &glState, bool isCallValid, GLsizei n, QueryID *idsPacked)
@@ -736,7 +736,7 @@
         paramBuffer.addParam(std::move(idsPackedParam));
     }
 
-    return CallCapture(gl::EntryPoint::GenQueries, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGenQueries, std::move(paramBuffer));
 }
 
 CallCapture CaptureGenSamplers(const State &glState,
@@ -764,7 +764,7 @@
         paramBuffer.addParam(std::move(samplersPackedParam));
     }
 
-    return CallCapture(gl::EntryPoint::GenSamplers, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGenSamplers, std::move(paramBuffer));
 }
 
 CallCapture CaptureGenTransformFeedbacks(const State &glState,
@@ -791,7 +791,7 @@
         paramBuffer.addParam(std::move(idsPackedParam));
     }
 
-    return CallCapture(gl::EntryPoint::GenTransformFeedbacks, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGenTransformFeedbacks, std::move(paramBuffer));
 }
 
 CallCapture CaptureGenVertexArrays(const State &glState,
@@ -819,7 +819,7 @@
         paramBuffer.addParam(std::move(arraysPackedParam));
     }
 
-    return CallCapture(gl::EntryPoint::GenVertexArrays, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGenVertexArrays, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetActiveUniformBlockName(const State &glState,
@@ -870,7 +870,7 @@
         paramBuffer.addParam(std::move(uniformBlockNameParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetActiveUniformBlockName, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetActiveUniformBlockName, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetActiveUniformBlockiv(const State &glState,
@@ -901,7 +901,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetActiveUniformBlockiv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetActiveUniformBlockiv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetActiveUniformsiv(const State &glState,
@@ -951,7 +951,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetActiveUniformsiv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetActiveUniformsiv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetBufferParameteri64v(const State &glState,
@@ -981,7 +981,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetBufferParameteri64v, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetBufferParameteri64v, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetBufferPointerv(const State &glState,
@@ -1011,7 +1011,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetBufferPointerv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetBufferPointerv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetFragDataLocation(const State &glState,
@@ -1043,7 +1043,7 @@
     InitParamValue(ParamType::TGLint, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::GetFragDataLocation, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetFragDataLocation, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetInteger64i_v(const State &glState,
@@ -1072,7 +1072,7 @@
         paramBuffer.addParam(std::move(dataParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetInteger64i_v, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetInteger64i_v, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetInteger64v(const State &glState,
@@ -1099,7 +1099,7 @@
         paramBuffer.addParam(std::move(dataParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetInteger64v, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetInteger64v, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetIntegeri_v(const State &glState,
@@ -1127,7 +1127,7 @@
         paramBuffer.addParam(std::move(dataParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetIntegeri_v, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetIntegeri_v, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetInternalformativ(const State &glState,
@@ -1161,7 +1161,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetInternalformativ, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetInternalformativ, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetProgramBinary(const State &glState,
@@ -1224,7 +1224,7 @@
         paramBuffer.addParam(std::move(binaryParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetProgramBinary, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetProgramBinary, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetQueryObjectuiv(const State &glState,
@@ -1255,7 +1255,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetQueryObjectuiv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetQueryObjectuiv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetQueryiv(const State &glState,
@@ -1283,7 +1283,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetQueryiv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetQueryiv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetSamplerParameterfv(const State &glState,
@@ -1313,7 +1313,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetSamplerParameterfv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetSamplerParameterfv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetSamplerParameteriv(const State &glState,
@@ -1342,7 +1342,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetSamplerParameteriv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetSamplerParameteriv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetStringi(const State &glState,
@@ -1360,7 +1360,7 @@
     InitParamValue(ParamType::TGLubyteConstPointer, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::GetStringi, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetStringi, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetSynciv(const State &glState,
@@ -1408,7 +1408,7 @@
         paramBuffer.addParam(std::move(valuesParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetSynciv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetSynciv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetTransformFeedbackVarying(const State &glState,
@@ -1489,7 +1489,7 @@
         paramBuffer.addParam(std::move(nameParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetTransformFeedbackVarying, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetTransformFeedbackVarying, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetUniformBlockIndex(const State &glState,
@@ -1523,7 +1523,7 @@
     InitParamValue(ParamType::TGLuint, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::GetUniformBlockIndex, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetUniformBlockIndex, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetUniformIndices(const State &glState,
@@ -1571,7 +1571,7 @@
         paramBuffer.addParam(std::move(uniformIndicesParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetUniformIndices, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetUniformIndices, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetUniformuiv(const State &glState,
@@ -1601,7 +1601,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetUniformuiv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetUniformuiv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetVertexAttribIiv(const State &glState,
@@ -1629,7 +1629,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetVertexAttribIiv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetVertexAttribIiv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetVertexAttribIuiv(const State &glState,
@@ -1658,7 +1658,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetVertexAttribIuiv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetVertexAttribIuiv, std::move(paramBuffer));
 }
 
 CallCapture CaptureInvalidateFramebuffer(const State &glState,
@@ -1688,7 +1688,7 @@
         paramBuffer.addParam(std::move(attachmentsParam));
     }
 
-    return CallCapture(gl::EntryPoint::InvalidateFramebuffer, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLInvalidateFramebuffer, std::move(paramBuffer));
 }
 
 CallCapture CaptureInvalidateSubFramebuffer(const State &glState,
@@ -1728,7 +1728,7 @@
     paramBuffer.addValueParam("width", ParamType::TGLsizei, width);
     paramBuffer.addValueParam("height", ParamType::TGLsizei, height);
 
-    return CallCapture(gl::EntryPoint::InvalidateSubFramebuffer, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLInvalidateSubFramebuffer, std::move(paramBuffer));
 }
 
 CallCapture CaptureIsQuery(const State &glState,
@@ -1744,7 +1744,7 @@
     InitParamValue(ParamType::TGLboolean, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::IsQuery, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLIsQuery, std::move(paramBuffer));
 }
 
 CallCapture CaptureIsSampler(const State &glState,
@@ -1760,7 +1760,7 @@
     InitParamValue(ParamType::TGLboolean, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::IsSampler, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLIsSampler, std::move(paramBuffer));
 }
 
 CallCapture CaptureIsSync(const State &glState,
@@ -1776,7 +1776,7 @@
     InitParamValue(ParamType::TGLboolean, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::IsSync, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLIsSync, std::move(paramBuffer));
 }
 
 CallCapture CaptureIsTransformFeedback(const State &glState,
@@ -1792,7 +1792,7 @@
     InitParamValue(ParamType::TGLboolean, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::IsTransformFeedback, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLIsTransformFeedback, std::move(paramBuffer));
 }
 
 CallCapture CaptureIsVertexArray(const State &glState,
@@ -1808,7 +1808,7 @@
     InitParamValue(ParamType::TGLboolean, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::IsVertexArray, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLIsVertexArray, std::move(paramBuffer));
 }
 
 CallCapture CaptureMapBufferRange(const State &glState,
@@ -1831,14 +1831,14 @@
     InitParamValue(ParamType::TvoidPointer, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::MapBufferRange, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLMapBufferRange, std::move(paramBuffer));
 }
 
 CallCapture CapturePauseTransformFeedback(const State &glState, bool isCallValid)
 {
     ParamBuffer paramBuffer;
 
-    return CallCapture(gl::EntryPoint::PauseTransformFeedback, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLPauseTransformFeedback, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramBinary(const State &glState,
@@ -1872,7 +1872,7 @@
 
     paramBuffer.addValueParam("length", ParamType::TGLsizei, length);
 
-    return CallCapture(gl::EntryPoint::ProgramBinary, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramBinary, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramParameteri(const State &glState,
@@ -1888,7 +1888,7 @@
                              pname);
     paramBuffer.addValueParam("value", ParamType::TGLint, value);
 
-    return CallCapture(gl::EntryPoint::ProgramParameteri, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramParameteri, std::move(paramBuffer));
 }
 
 CallCapture CaptureReadBuffer(const State &glState, bool isCallValid, GLenum src)
@@ -1897,7 +1897,7 @@
 
     paramBuffer.addEnumParam("src", GLenumGroup::ReadBufferMode, ParamType::TGLenum, src);
 
-    return CallCapture(gl::EntryPoint::ReadBuffer, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLReadBuffer, std::move(paramBuffer));
 }
 
 CallCapture CaptureRenderbufferStorageMultisample(const State &glState,
@@ -1917,14 +1917,14 @@
     paramBuffer.addValueParam("width", ParamType::TGLsizei, width);
     paramBuffer.addValueParam("height", ParamType::TGLsizei, height);
 
-    return CallCapture(gl::EntryPoint::RenderbufferStorageMultisample, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLRenderbufferStorageMultisample, std::move(paramBuffer));
 }
 
 CallCapture CaptureResumeTransformFeedback(const State &glState, bool isCallValid)
 {
     ParamBuffer paramBuffer;
 
-    return CallCapture(gl::EntryPoint::ResumeTransformFeedback, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLResumeTransformFeedback, std::move(paramBuffer));
 }
 
 CallCapture CaptureSamplerParameterf(const State &glState,
@@ -1939,7 +1939,7 @@
     paramBuffer.addEnumParam("pname", GLenumGroup::SamplerParameterName, ParamType::TGLenum, pname);
     paramBuffer.addValueParam("param", ParamType::TGLfloat, param);
 
-    return CallCapture(gl::EntryPoint::SamplerParameterf, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLSamplerParameterf, std::move(paramBuffer));
 }
 
 CallCapture CaptureSamplerParameterfv(const State &glState,
@@ -1969,7 +1969,7 @@
         paramBuffer.addParam(std::move(paramParam));
     }
 
-    return CallCapture(gl::EntryPoint::SamplerParameterfv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLSamplerParameterfv, std::move(paramBuffer));
 }
 
 CallCapture CaptureSamplerParameteri(const State &glState,
@@ -1984,7 +1984,7 @@
     paramBuffer.addEnumParam("pname", GLenumGroup::SamplerParameterName, ParamType::TGLenum, pname);
     paramBuffer.addValueParam("param", ParamType::TGLint, param);
 
-    return CallCapture(gl::EntryPoint::SamplerParameteri, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLSamplerParameteri, std::move(paramBuffer));
 }
 
 CallCapture CaptureSamplerParameteriv(const State &glState,
@@ -2014,7 +2014,7 @@
         paramBuffer.addParam(std::move(paramParam));
     }
 
-    return CallCapture(gl::EntryPoint::SamplerParameteriv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLSamplerParameteriv, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexImage3D(const State &glState,
@@ -2058,7 +2058,7 @@
         paramBuffer.addParam(std::move(pixelsParam));
     }
 
-    return CallCapture(gl::EntryPoint::TexImage3D, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexImage3D, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexStorage2D(const State &glState,
@@ -2078,7 +2078,7 @@
     paramBuffer.addValueParam("width", ParamType::TGLsizei, width);
     paramBuffer.addValueParam("height", ParamType::TGLsizei, height);
 
-    return CallCapture(gl::EntryPoint::TexStorage2D, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexStorage2D, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexStorage3D(const State &glState,
@@ -2100,7 +2100,7 @@
     paramBuffer.addValueParam("height", ParamType::TGLsizei, height);
     paramBuffer.addValueParam("depth", ParamType::TGLsizei, depth);
 
-    return CallCapture(gl::EntryPoint::TexStorage3D, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexStorage3D, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexSubImage3D(const State &glState,
@@ -2147,7 +2147,7 @@
         paramBuffer.addParam(std::move(pixelsParam));
     }
 
-    return CallCapture(gl::EntryPoint::TexSubImage3D, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexSubImage3D, std::move(paramBuffer));
 }
 
 CallCapture CaptureTransformFeedbackVaryings(const State &glState,
@@ -2181,7 +2181,7 @@
     paramBuffer.addEnumParam("bufferMode", GLenumGroup::DefaultGroup, ParamType::TGLenum,
                              bufferMode);
 
-    return CallCapture(gl::EntryPoint::TransformFeedbackVaryings, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTransformFeedbackVaryings, std::move(paramBuffer));
 }
 
 CallCapture CaptureUniform1ui(const State &glState,
@@ -2194,7 +2194,7 @@
     paramBuffer.addValueParam("locationPacked", ParamType::TUniformLocation, locationPacked);
     paramBuffer.addValueParam("v0", ParamType::TGLuint, v0);
 
-    return CallCapture(gl::EntryPoint::Uniform1ui, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLUniform1ui, std::move(paramBuffer));
 }
 
 CallCapture CaptureUniform1uiv(const State &glState,
@@ -2223,7 +2223,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::Uniform1uiv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLUniform1uiv, std::move(paramBuffer));
 }
 
 CallCapture CaptureUniform2ui(const State &glState,
@@ -2238,7 +2238,7 @@
     paramBuffer.addValueParam("v0", ParamType::TGLuint, v0);
     paramBuffer.addValueParam("v1", ParamType::TGLuint, v1);
 
-    return CallCapture(gl::EntryPoint::Uniform2ui, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLUniform2ui, std::move(paramBuffer));
 }
 
 CallCapture CaptureUniform2uiv(const State &glState,
@@ -2267,7 +2267,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::Uniform2uiv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLUniform2uiv, std::move(paramBuffer));
 }
 
 CallCapture CaptureUniform3ui(const State &glState,
@@ -2284,7 +2284,7 @@
     paramBuffer.addValueParam("v1", ParamType::TGLuint, v1);
     paramBuffer.addValueParam("v2", ParamType::TGLuint, v2);
 
-    return CallCapture(gl::EntryPoint::Uniform3ui, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLUniform3ui, std::move(paramBuffer));
 }
 
 CallCapture CaptureUniform3uiv(const State &glState,
@@ -2313,7 +2313,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::Uniform3uiv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLUniform3uiv, std::move(paramBuffer));
 }
 
 CallCapture CaptureUniform4ui(const State &glState,
@@ -2332,7 +2332,7 @@
     paramBuffer.addValueParam("v2", ParamType::TGLuint, v2);
     paramBuffer.addValueParam("v3", ParamType::TGLuint, v3);
 
-    return CallCapture(gl::EntryPoint::Uniform4ui, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLUniform4ui, std::move(paramBuffer));
 }
 
 CallCapture CaptureUniform4uiv(const State &glState,
@@ -2361,7 +2361,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::Uniform4uiv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLUniform4uiv, std::move(paramBuffer));
 }
 
 CallCapture CaptureUniformBlockBinding(const State &glState,
@@ -2376,7 +2376,7 @@
     paramBuffer.addValueParam("uniformBlockIndex", ParamType::TGLuint, uniformBlockIndex);
     paramBuffer.addValueParam("uniformBlockBinding", ParamType::TGLuint, uniformBlockBinding);
 
-    return CallCapture(gl::EntryPoint::UniformBlockBinding, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLUniformBlockBinding, std::move(paramBuffer));
 }
 
 CallCapture CaptureUniformMatrix2x3fv(const State &glState,
@@ -2408,7 +2408,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::UniformMatrix2x3fv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLUniformMatrix2x3fv, std::move(paramBuffer));
 }
 
 CallCapture CaptureUniformMatrix2x4fv(const State &glState,
@@ -2440,7 +2440,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::UniformMatrix2x4fv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLUniformMatrix2x4fv, std::move(paramBuffer));
 }
 
 CallCapture CaptureUniformMatrix3x2fv(const State &glState,
@@ -2472,7 +2472,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::UniformMatrix3x2fv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLUniformMatrix3x2fv, std::move(paramBuffer));
 }
 
 CallCapture CaptureUniformMatrix3x4fv(const State &glState,
@@ -2504,7 +2504,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::UniformMatrix3x4fv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLUniformMatrix3x4fv, std::move(paramBuffer));
 }
 
 CallCapture CaptureUniformMatrix4x2fv(const State &glState,
@@ -2536,7 +2536,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::UniformMatrix4x2fv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLUniformMatrix4x2fv, std::move(paramBuffer));
 }
 
 CallCapture CaptureUniformMatrix4x3fv(const State &glState,
@@ -2568,7 +2568,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::UniformMatrix4x3fv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLUniformMatrix4x3fv, std::move(paramBuffer));
 }
 
 CallCapture CaptureUnmapBuffer(const State &glState,
@@ -2584,7 +2584,7 @@
     InitParamValue(ParamType::TGLboolean, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::UnmapBuffer, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLUnmapBuffer, std::move(paramBuffer));
 }
 
 CallCapture CaptureVertexAttribDivisor(const State &glState,
@@ -2597,7 +2597,7 @@
     paramBuffer.addValueParam("index", ParamType::TGLuint, index);
     paramBuffer.addValueParam("divisor", ParamType::TGLuint, divisor);
 
-    return CallCapture(gl::EntryPoint::VertexAttribDivisor, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLVertexAttribDivisor, std::move(paramBuffer));
 }
 
 CallCapture CaptureVertexAttribI4i(const State &glState,
@@ -2616,7 +2616,7 @@
     paramBuffer.addValueParam("z", ParamType::TGLint, z);
     paramBuffer.addValueParam("w", ParamType::TGLint, w);
 
-    return CallCapture(gl::EntryPoint::VertexAttribI4i, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLVertexAttribI4i, std::move(paramBuffer));
 }
 
 CallCapture CaptureVertexAttribI4iv(const State &glState,
@@ -2643,7 +2643,7 @@
         paramBuffer.addParam(std::move(vParam));
     }
 
-    return CallCapture(gl::EntryPoint::VertexAttribI4iv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLVertexAttribI4iv, std::move(paramBuffer));
 }
 
 CallCapture CaptureVertexAttribI4ui(const State &glState,
@@ -2662,7 +2662,7 @@
     paramBuffer.addValueParam("z", ParamType::TGLuint, z);
     paramBuffer.addValueParam("w", ParamType::TGLuint, w);
 
-    return CallCapture(gl::EntryPoint::VertexAttribI4ui, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLVertexAttribI4ui, std::move(paramBuffer));
 }
 
 CallCapture CaptureVertexAttribI4uiv(const State &glState,
@@ -2689,7 +2689,7 @@
         paramBuffer.addParam(std::move(vParam));
     }
 
-    return CallCapture(gl::EntryPoint::VertexAttribI4uiv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLVertexAttribI4uiv, std::move(paramBuffer));
 }
 
 CallCapture CaptureVertexAttribIPointer(const State &glState,
@@ -2723,7 +2723,7 @@
         paramBuffer.addParam(std::move(pointerParam));
     }
 
-    return CallCapture(gl::EntryPoint::VertexAttribIPointer, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLVertexAttribIPointer, std::move(paramBuffer));
 }
 
 CallCapture CaptureWaitSync(const State &glState,
@@ -2738,7 +2738,7 @@
     paramBuffer.addEnumParam("flags", GLenumGroup::DefaultGroup, ParamType::TGLbitfield, flags);
     paramBuffer.addValueParam("timeout", ParamType::TGLuint64, timeout);
 
-    return CallCapture(gl::EntryPoint::WaitSync, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLWaitSync, std::move(paramBuffer));
 }
 
 }  // namespace gl
diff --git a/src/libANGLE/capture_gles_3_1_autogen.cpp b/src/libANGLE/capture_gles_3_1_autogen.cpp
index 592bbf1..9c8f436 100644
--- a/src/libANGLE/capture_gles_3_1_autogen.cpp
+++ b/src/libANGLE/capture_gles_3_1_autogen.cpp
@@ -30,7 +30,7 @@
     paramBuffer.addValueParam("pipelinePacked", ParamType::TProgramPipelineID, pipelinePacked);
     paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
 
-    return CallCapture(gl::EntryPoint::ActiveShaderProgram, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLActiveShaderProgram, std::move(paramBuffer));
 }
 
 CallCapture CaptureBindImageTexture(const State &glState,
@@ -53,7 +53,7 @@
     paramBuffer.addEnumParam("access", GLenumGroup::BufferAccessARB, ParamType::TGLenum, access);
     paramBuffer.addEnumParam("format", GLenumGroup::InternalFormat, ParamType::TGLenum, format);
 
-    return CallCapture(gl::EntryPoint::BindImageTexture, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBindImageTexture, std::move(paramBuffer));
 }
 
 CallCapture CaptureBindProgramPipeline(const State &glState,
@@ -64,7 +64,7 @@
 
     paramBuffer.addValueParam("pipelinePacked", ParamType::TProgramPipelineID, pipelinePacked);
 
-    return CallCapture(gl::EntryPoint::BindProgramPipeline, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBindProgramPipeline, std::move(paramBuffer));
 }
 
 CallCapture CaptureBindVertexBuffer(const State &glState,
@@ -81,7 +81,7 @@
     paramBuffer.addValueParam("offset", ParamType::TGLintptr, offset);
     paramBuffer.addValueParam("stride", ParamType::TGLsizei, stride);
 
-    return CallCapture(gl::EntryPoint::BindVertexBuffer, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBindVertexBuffer, std::move(paramBuffer));
 }
 
 CallCapture CaptureCreateShaderProgramv(const State &glState,
@@ -116,7 +116,7 @@
     InitParamValue(ParamType::TGLuint, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::CreateShaderProgramv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLCreateShaderProgramv, std::move(paramBuffer));
 }
 
 CallCapture CaptureDeleteProgramPipelines(const State &glState,
@@ -148,7 +148,7 @@
         paramBuffer.addParam(std::move(pipelinesPackedParam));
     }
 
-    return CallCapture(gl::EntryPoint::DeleteProgramPipelines, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDeleteProgramPipelines, std::move(paramBuffer));
 }
 
 CallCapture CaptureDispatchCompute(const State &glState,
@@ -163,7 +163,7 @@
     paramBuffer.addValueParam("num_groups_y", ParamType::TGLuint, num_groups_y);
     paramBuffer.addValueParam("num_groups_z", ParamType::TGLuint, num_groups_z);
 
-    return CallCapture(gl::EntryPoint::DispatchCompute, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDispatchCompute, std::move(paramBuffer));
 }
 
 CallCapture CaptureDispatchComputeIndirect(const State &glState,
@@ -174,7 +174,7 @@
 
     paramBuffer.addValueParam("indirect", ParamType::TGLintptr, indirect);
 
-    return CallCapture(gl::EntryPoint::DispatchComputeIndirect, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDispatchComputeIndirect, std::move(paramBuffer));
 }
 
 CallCapture CaptureDrawArraysIndirect(const State &glState,
@@ -202,7 +202,7 @@
         paramBuffer.addParam(std::move(indirectParam));
     }
 
-    return CallCapture(gl::EntryPoint::DrawArraysIndirect, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDrawArraysIndirect, std::move(paramBuffer));
 }
 
 CallCapture CaptureDrawElementsIndirect(const State &glState,
@@ -232,7 +232,7 @@
         paramBuffer.addParam(std::move(indirectParam));
     }
 
-    return CallCapture(gl::EntryPoint::DrawElementsIndirect, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDrawElementsIndirect, std::move(paramBuffer));
 }
 
 CallCapture CaptureFramebufferParameteri(const State &glState,
@@ -248,7 +248,7 @@
                              pname);
     paramBuffer.addValueParam("param", ParamType::TGLint, param);
 
-    return CallCapture(gl::EntryPoint::FramebufferParameteri, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLFramebufferParameteri, std::move(paramBuffer));
 }
 
 CallCapture CaptureGenProgramPipelines(const State &glState,
@@ -277,7 +277,7 @@
         paramBuffer.addParam(std::move(pipelinesPackedParam));
     }
 
-    return CallCapture(gl::EntryPoint::GenProgramPipelines, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGenProgramPipelines, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetBooleani_v(const State &glState,
@@ -306,7 +306,7 @@
         paramBuffer.addParam(std::move(dataParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetBooleani_v, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetBooleani_v, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetFramebufferParameteriv(const State &glState,
@@ -336,7 +336,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetFramebufferParameteriv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetFramebufferParameteriv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetMultisamplefv(const State &glState,
@@ -365,7 +365,7 @@
         paramBuffer.addParam(std::move(valParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetMultisamplefv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetMultisamplefv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetProgramInterfaceiv(const State &glState,
@@ -398,7 +398,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetProgramInterfaceiv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetProgramInterfaceiv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetProgramPipelineInfoLog(const State &glState,
@@ -445,7 +445,7 @@
         paramBuffer.addParam(std::move(infoLogParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetProgramPipelineInfoLog, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetProgramPipelineInfoLog, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetProgramPipelineiv(const State &glState,
@@ -475,7 +475,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetProgramPipelineiv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetProgramPipelineiv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetProgramResourceIndex(const State &glState,
@@ -511,7 +511,7 @@
     InitParamValue(ParamType::TGLuint, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::GetProgramResourceIndex, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetProgramResourceIndex, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetProgramResourceLocation(const State &glState,
@@ -547,7 +547,7 @@
     InitParamValue(ParamType::TGLint, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::GetProgramResourceLocation, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetProgramResourceLocation, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetProgramResourceName(const State &glState,
@@ -598,7 +598,7 @@
         paramBuffer.addParam(std::move(nameParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetProgramResourceName, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetProgramResourceName, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetProgramResourceiv(const State &glState,
@@ -672,7 +672,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetProgramResourceiv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetProgramResourceiv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetTexLevelParameterfv(const State &glState,
@@ -704,7 +704,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetTexLevelParameterfv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetTexLevelParameterfv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetTexLevelParameteriv(const State &glState,
@@ -735,7 +735,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetTexLevelParameteriv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetTexLevelParameteriv, std::move(paramBuffer));
 }
 
 CallCapture CaptureIsProgramPipeline(const State &glState,
@@ -751,7 +751,7 @@
     InitParamValue(ParamType::TGLboolean, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::IsProgramPipeline, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLIsProgramPipeline, std::move(paramBuffer));
 }
 
 CallCapture CaptureMemoryBarrier(const State &glState, bool isCallValid, GLbitfield barriers)
@@ -761,7 +761,7 @@
     paramBuffer.addEnumParam("barriers", GLenumGroup::MemoryBarrierMask, ParamType::TGLbitfield,
                              barriers);
 
-    return CallCapture(gl::EntryPoint::MemoryBarrier, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLMemoryBarrier, std::move(paramBuffer));
 }
 
 CallCapture CaptureMemoryBarrierByRegion(const State &glState,
@@ -773,7 +773,7 @@
     paramBuffer.addEnumParam("barriers", GLenumGroup::MemoryBarrierMask, ParamType::TGLbitfield,
                              barriers);
 
-    return CallCapture(gl::EntryPoint::MemoryBarrierByRegion, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLMemoryBarrierByRegion, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform1f(const State &glState,
@@ -788,7 +788,7 @@
     paramBuffer.addValueParam("locationPacked", ParamType::TUniformLocation, locationPacked);
     paramBuffer.addValueParam("v0", ParamType::TGLfloat, v0);
 
-    return CallCapture(gl::EntryPoint::ProgramUniform1f, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform1f, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform1fv(const State &glState,
@@ -820,7 +820,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniform1fv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform1fv, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform1i(const State &glState,
@@ -835,7 +835,7 @@
     paramBuffer.addValueParam("locationPacked", ParamType::TUniformLocation, locationPacked);
     paramBuffer.addValueParam("v0", ParamType::TGLint, v0);
 
-    return CallCapture(gl::EntryPoint::ProgramUniform1i, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform1i, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform1iv(const State &glState,
@@ -867,7 +867,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniform1iv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform1iv, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform1ui(const State &glState,
@@ -882,7 +882,7 @@
     paramBuffer.addValueParam("locationPacked", ParamType::TUniformLocation, locationPacked);
     paramBuffer.addValueParam("v0", ParamType::TGLuint, v0);
 
-    return CallCapture(gl::EntryPoint::ProgramUniform1ui, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform1ui, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform1uiv(const State &glState,
@@ -914,7 +914,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniform1uiv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform1uiv, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform2f(const State &glState,
@@ -931,7 +931,7 @@
     paramBuffer.addValueParam("v0", ParamType::TGLfloat, v0);
     paramBuffer.addValueParam("v1", ParamType::TGLfloat, v1);
 
-    return CallCapture(gl::EntryPoint::ProgramUniform2f, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform2f, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform2fv(const State &glState,
@@ -963,7 +963,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniform2fv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform2fv, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform2i(const State &glState,
@@ -980,7 +980,7 @@
     paramBuffer.addValueParam("v0", ParamType::TGLint, v0);
     paramBuffer.addValueParam("v1", ParamType::TGLint, v1);
 
-    return CallCapture(gl::EntryPoint::ProgramUniform2i, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform2i, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform2iv(const State &glState,
@@ -1012,7 +1012,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniform2iv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform2iv, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform2ui(const State &glState,
@@ -1029,7 +1029,7 @@
     paramBuffer.addValueParam("v0", ParamType::TGLuint, v0);
     paramBuffer.addValueParam("v1", ParamType::TGLuint, v1);
 
-    return CallCapture(gl::EntryPoint::ProgramUniform2ui, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform2ui, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform2uiv(const State &glState,
@@ -1061,7 +1061,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniform2uiv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform2uiv, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform3f(const State &glState,
@@ -1080,7 +1080,7 @@
     paramBuffer.addValueParam("v1", ParamType::TGLfloat, v1);
     paramBuffer.addValueParam("v2", ParamType::TGLfloat, v2);
 
-    return CallCapture(gl::EntryPoint::ProgramUniform3f, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform3f, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform3fv(const State &glState,
@@ -1112,7 +1112,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniform3fv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform3fv, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform3i(const State &glState,
@@ -1131,7 +1131,7 @@
     paramBuffer.addValueParam("v1", ParamType::TGLint, v1);
     paramBuffer.addValueParam("v2", ParamType::TGLint, v2);
 
-    return CallCapture(gl::EntryPoint::ProgramUniform3i, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform3i, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform3iv(const State &glState,
@@ -1163,7 +1163,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniform3iv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform3iv, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform3ui(const State &glState,
@@ -1182,7 +1182,7 @@
     paramBuffer.addValueParam("v1", ParamType::TGLuint, v1);
     paramBuffer.addValueParam("v2", ParamType::TGLuint, v2);
 
-    return CallCapture(gl::EntryPoint::ProgramUniform3ui, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform3ui, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform3uiv(const State &glState,
@@ -1214,7 +1214,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniform3uiv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform3uiv, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform4f(const State &glState,
@@ -1235,7 +1235,7 @@
     paramBuffer.addValueParam("v2", ParamType::TGLfloat, v2);
     paramBuffer.addValueParam("v3", ParamType::TGLfloat, v3);
 
-    return CallCapture(gl::EntryPoint::ProgramUniform4f, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform4f, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform4fv(const State &glState,
@@ -1267,7 +1267,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniform4fv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform4fv, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform4i(const State &glState,
@@ -1288,7 +1288,7 @@
     paramBuffer.addValueParam("v2", ParamType::TGLint, v2);
     paramBuffer.addValueParam("v3", ParamType::TGLint, v3);
 
-    return CallCapture(gl::EntryPoint::ProgramUniform4i, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform4i, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform4iv(const State &glState,
@@ -1320,7 +1320,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniform4iv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform4iv, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform4ui(const State &glState,
@@ -1341,7 +1341,7 @@
     paramBuffer.addValueParam("v2", ParamType::TGLuint, v2);
     paramBuffer.addValueParam("v3", ParamType::TGLuint, v3);
 
-    return CallCapture(gl::EntryPoint::ProgramUniform4ui, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform4ui, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform4uiv(const State &glState,
@@ -1373,7 +1373,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniform4uiv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform4uiv, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniformMatrix2fv(const State &glState,
@@ -1407,7 +1407,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniformMatrix2fv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniformMatrix2fv, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniformMatrix2x3fv(const State &glState,
@@ -1441,7 +1441,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniformMatrix2x3fv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniformMatrix2x3fv, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniformMatrix2x4fv(const State &glState,
@@ -1475,7 +1475,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniformMatrix2x4fv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniformMatrix2x4fv, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniformMatrix3fv(const State &glState,
@@ -1509,7 +1509,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniformMatrix3fv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniformMatrix3fv, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniformMatrix3x2fv(const State &glState,
@@ -1543,7 +1543,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniformMatrix3x2fv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniformMatrix3x2fv, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniformMatrix3x4fv(const State &glState,
@@ -1577,7 +1577,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniformMatrix3x4fv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniformMatrix3x4fv, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniformMatrix4fv(const State &glState,
@@ -1611,7 +1611,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniformMatrix4fv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniformMatrix4fv, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniformMatrix4x2fv(const State &glState,
@@ -1645,7 +1645,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniformMatrix4x2fv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniformMatrix4x2fv, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniformMatrix4x3fv(const State &glState,
@@ -1679,7 +1679,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniformMatrix4x3fv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniformMatrix4x3fv, std::move(paramBuffer));
 }
 
 CallCapture CaptureSampleMaski(const State &glState,
@@ -1692,7 +1692,7 @@
     paramBuffer.addValueParam("maskNumber", ParamType::TGLuint, maskNumber);
     paramBuffer.addEnumParam("mask", GLenumGroup::DefaultGroup, ParamType::TGLbitfield, mask);
 
-    return CallCapture(gl::EntryPoint::SampleMaski, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLSampleMaski, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexStorage2DMultisample(const State &glState,
@@ -1714,7 +1714,7 @@
     paramBuffer.addValueParam("height", ParamType::TGLsizei, height);
     paramBuffer.addValueParam("fixedsamplelocations", ParamType::TGLboolean, fixedsamplelocations);
 
-    return CallCapture(gl::EntryPoint::TexStorage2DMultisample, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexStorage2DMultisample, std::move(paramBuffer));
 }
 
 CallCapture CaptureUseProgramStages(const State &glState,
@@ -1730,7 +1730,7 @@
                              stages);
     paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
 
-    return CallCapture(gl::EntryPoint::UseProgramStages, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLUseProgramStages, std::move(paramBuffer));
 }
 
 CallCapture CaptureValidateProgramPipeline(const State &glState,
@@ -1741,7 +1741,7 @@
 
     paramBuffer.addValueParam("pipelinePacked", ParamType::TProgramPipelineID, pipelinePacked);
 
-    return CallCapture(gl::EntryPoint::ValidateProgramPipeline, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLValidateProgramPipeline, std::move(paramBuffer));
 }
 
 CallCapture CaptureVertexAttribBinding(const State &glState,
@@ -1754,7 +1754,7 @@
     paramBuffer.addValueParam("attribindex", ParamType::TGLuint, attribindex);
     paramBuffer.addValueParam("bindingindex", ParamType::TGLuint, bindingindex);
 
-    return CallCapture(gl::EntryPoint::VertexAttribBinding, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLVertexAttribBinding, std::move(paramBuffer));
 }
 
 CallCapture CaptureVertexAttribFormat(const State &glState,
@@ -1773,7 +1773,7 @@
     paramBuffer.addValueParam("normalized", ParamType::TGLboolean, normalized);
     paramBuffer.addValueParam("relativeoffset", ParamType::TGLuint, relativeoffset);
 
-    return CallCapture(gl::EntryPoint::VertexAttribFormat, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLVertexAttribFormat, std::move(paramBuffer));
 }
 
 CallCapture CaptureVertexAttribIFormat(const State &glState,
@@ -1790,7 +1790,7 @@
     paramBuffer.addValueParam("typePacked", ParamType::TVertexAttribType, typePacked);
     paramBuffer.addValueParam("relativeoffset", ParamType::TGLuint, relativeoffset);
 
-    return CallCapture(gl::EntryPoint::VertexAttribIFormat, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLVertexAttribIFormat, std::move(paramBuffer));
 }
 
 CallCapture CaptureVertexBindingDivisor(const State &glState,
@@ -1803,7 +1803,7 @@
     paramBuffer.addValueParam("bindingindex", ParamType::TGLuint, bindingindex);
     paramBuffer.addValueParam("divisor", ParamType::TGLuint, divisor);
 
-    return CallCapture(gl::EntryPoint::VertexBindingDivisor, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLVertexBindingDivisor, std::move(paramBuffer));
 }
 
 }  // namespace gl
diff --git a/src/libANGLE/capture_gles_3_2_autogen.cpp b/src/libANGLE/capture_gles_3_2_autogen.cpp
index 05f4cbd..b6a748d 100644
--- a/src/libANGLE/capture_gles_3_2_autogen.cpp
+++ b/src/libANGLE/capture_gles_3_2_autogen.cpp
@@ -24,7 +24,7 @@
 {
     ParamBuffer paramBuffer;
 
-    return CallCapture(gl::EntryPoint::BlendBarrier, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBlendBarrier, std::move(paramBuffer));
 }
 
 CallCapture CaptureBlendEquationSeparatei(const State &glState,
@@ -41,7 +41,7 @@
     paramBuffer.addEnumParam("modeAlpha", GLenumGroup::BlendEquationModeEXT, ParamType::TGLenum,
                              modeAlpha);
 
-    return CallCapture(gl::EntryPoint::BlendEquationSeparatei, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBlendEquationSeparatei, std::move(paramBuffer));
 }
 
 CallCapture CaptureBlendEquationi(const State &glState, bool isCallValid, GLuint buf, GLenum mode)
@@ -51,7 +51,7 @@
     paramBuffer.addValueParam("buf", ParamType::TGLuint, buf);
     paramBuffer.addEnumParam("mode", GLenumGroup::BlendEquationModeEXT, ParamType::TGLenum, mode);
 
-    return CallCapture(gl::EntryPoint::BlendEquationi, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBlendEquationi, std::move(paramBuffer));
 }
 
 CallCapture CaptureBlendFuncSeparatei(const State &glState,
@@ -70,7 +70,7 @@
     paramBuffer.addEnumParam("srcAlpha", GLenumGroup::BlendingFactor, ParamType::TGLenum, srcAlpha);
     paramBuffer.addEnumParam("dstAlpha", GLenumGroup::BlendingFactor, ParamType::TGLenum, dstAlpha);
 
-    return CallCapture(gl::EntryPoint::BlendFuncSeparatei, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBlendFuncSeparatei, std::move(paramBuffer));
 }
 
 CallCapture CaptureBlendFunci(const State &glState,
@@ -85,7 +85,7 @@
     paramBuffer.addEnumParam("src", GLenumGroup::BlendingFactor, ParamType::TGLenum, src);
     paramBuffer.addEnumParam("dst", GLenumGroup::BlendingFactor, ParamType::TGLenum, dst);
 
-    return CallCapture(gl::EntryPoint::BlendFunci, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBlendFunci, std::move(paramBuffer));
 }
 
 CallCapture CaptureColorMaski(const State &glState,
@@ -104,7 +104,7 @@
     paramBuffer.addValueParam("b", ParamType::TGLboolean, b);
     paramBuffer.addValueParam("a", ParamType::TGLboolean, a);
 
-    return CallCapture(gl::EntryPoint::ColorMaski, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLColorMaski, std::move(paramBuffer));
 }
 
 CallCapture CaptureCopyImageSubData(const State &glState,
@@ -145,7 +145,7 @@
     paramBuffer.addValueParam("srcHeight", ParamType::TGLsizei, srcHeight);
     paramBuffer.addValueParam("srcDepth", ParamType::TGLsizei, srcDepth);
 
-    return CallCapture(gl::EntryPoint::CopyImageSubData, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLCopyImageSubData, std::move(paramBuffer));
 }
 
 CallCapture CaptureDebugMessageCallback(const State &glState,
@@ -173,7 +173,7 @@
         paramBuffer.addParam(std::move(userParamParam));
     }
 
-    return CallCapture(gl::EntryPoint::DebugMessageCallback, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDebugMessageCallback, std::move(paramBuffer));
 }
 
 CallCapture CaptureDebugMessageControl(const State &glState,
@@ -210,7 +210,7 @@
 
     paramBuffer.addValueParam("enabled", ParamType::TGLboolean, enabled);
 
-    return CallCapture(gl::EntryPoint::DebugMessageControl, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDebugMessageControl, std::move(paramBuffer));
 }
 
 CallCapture CaptureDebugMessageInsert(const State &glState,
@@ -246,7 +246,7 @@
         paramBuffer.addParam(std::move(bufParam));
     }
 
-    return CallCapture(gl::EntryPoint::DebugMessageInsert, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDebugMessageInsert, std::move(paramBuffer));
 }
 
 CallCapture CaptureDisablei(const State &glState, bool isCallValid, GLenum target, GLuint index)
@@ -256,7 +256,7 @@
     paramBuffer.addEnumParam("target", GLenumGroup::EnableCap, ParamType::TGLenum, target);
     paramBuffer.addValueParam("index", ParamType::TGLuint, index);
 
-    return CallCapture(gl::EntryPoint::Disablei, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDisablei, std::move(paramBuffer));
 }
 
 CallCapture CaptureDrawElementsBaseVertex(const State &glState,
@@ -291,7 +291,7 @@
 
     paramBuffer.addValueParam("basevertex", ParamType::TGLint, basevertex);
 
-    return CallCapture(gl::EntryPoint::DrawElementsBaseVertex, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDrawElementsBaseVertex, std::move(paramBuffer));
 }
 
 CallCapture CaptureDrawElementsInstancedBaseVertex(const State &glState,
@@ -329,7 +329,8 @@
     paramBuffer.addValueParam("instancecount", ParamType::TGLsizei, instancecount);
     paramBuffer.addValueParam("basevertex", ParamType::TGLint, basevertex);
 
-    return CallCapture(gl::EntryPoint::DrawElementsInstancedBaseVertex, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDrawElementsInstancedBaseVertex,
+                       std::move(paramBuffer));
 }
 
 CallCapture CaptureDrawRangeElementsBaseVertex(const State &glState,
@@ -369,7 +370,7 @@
 
     paramBuffer.addValueParam("basevertex", ParamType::TGLint, basevertex);
 
-    return CallCapture(gl::EntryPoint::DrawRangeElementsBaseVertex, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDrawRangeElementsBaseVertex, std::move(paramBuffer));
 }
 
 CallCapture CaptureEnablei(const State &glState, bool isCallValid, GLenum target, GLuint index)
@@ -379,7 +380,7 @@
     paramBuffer.addEnumParam("target", GLenumGroup::EnableCap, ParamType::TGLenum, target);
     paramBuffer.addValueParam("index", ParamType::TGLuint, index);
 
-    return CallCapture(gl::EntryPoint::Enablei, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLEnablei, std::move(paramBuffer));
 }
 
 CallCapture CaptureFramebufferTexture(const State &glState,
@@ -397,7 +398,7 @@
     paramBuffer.addValueParam("texturePacked", ParamType::TTextureID, texturePacked);
     paramBuffer.addValueParam("level", ParamType::TGLint, level);
 
-    return CallCapture(gl::EntryPoint::FramebufferTexture, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLFramebufferTexture, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetDebugMessageLog(const State &glState,
@@ -518,7 +519,7 @@
     InitParamValue(ParamType::TGLuint, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::GetDebugMessageLog, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetDebugMessageLog, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetGraphicsResetStatus(const State &glState,
@@ -531,7 +532,7 @@
     InitParamValue(ParamType::TGLenum, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::GetGraphicsResetStatus, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetGraphicsResetStatus, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetObjectLabel(const State &glState,
@@ -581,7 +582,7 @@
         paramBuffer.addParam(std::move(labelParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetObjectLabel, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetObjectLabel, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetObjectPtrLabel(const State &glState,
@@ -642,7 +643,7 @@
         paramBuffer.addParam(std::move(labelParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetObjectPtrLabel, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetObjectPtrLabel, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetPointerv(const State &glState, bool isCallValid, GLenum pname, void **params)
@@ -666,7 +667,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetPointerv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetPointerv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetSamplerParameterIiv(const State &glState,
@@ -695,7 +696,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetSamplerParameterIiv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetSamplerParameterIiv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetSamplerParameterIuiv(const State &glState,
@@ -725,7 +726,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetSamplerParameterIuiv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetSamplerParameterIuiv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetTexParameterIiv(const State &glState,
@@ -754,7 +755,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetTexParameterIiv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetTexParameterIiv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetTexParameterIuiv(const State &glState,
@@ -784,7 +785,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetTexParameterIuiv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetTexParameterIuiv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetnUniformfv(const State &glState,
@@ -816,7 +817,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetnUniformfv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetnUniformfv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetnUniformiv(const State &glState,
@@ -847,7 +848,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetnUniformiv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetnUniformiv, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetnUniformuiv(const State &glState,
@@ -879,7 +880,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetnUniformuiv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetnUniformuiv, std::move(paramBuffer));
 }
 
 CallCapture CaptureIsEnabledi(const State &glState,
@@ -897,7 +898,7 @@
     InitParamValue(ParamType::TGLboolean, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::IsEnabledi, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLIsEnabledi, std::move(paramBuffer));
 }
 
 CallCapture CaptureMinSampleShading(const State &glState, bool isCallValid, GLfloat value)
@@ -906,7 +907,7 @@
 
     paramBuffer.addValueParam("value", ParamType::TGLfloat, value);
 
-    return CallCapture(gl::EntryPoint::MinSampleShading, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLMinSampleShading, std::move(paramBuffer));
 }
 
 CallCapture CaptureObjectLabel(const State &glState,
@@ -939,7 +940,7 @@
         paramBuffer.addParam(std::move(labelParam));
     }
 
-    return CallCapture(gl::EntryPoint::ObjectLabel, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLObjectLabel, std::move(paramBuffer));
 }
 
 CallCapture CaptureObjectPtrLabel(const State &glState,
@@ -982,7 +983,7 @@
         paramBuffer.addParam(std::move(labelParam));
     }
 
-    return CallCapture(gl::EntryPoint::ObjectPtrLabel, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLObjectPtrLabel, std::move(paramBuffer));
 }
 
 CallCapture CapturePatchParameteri(const State &glState,
@@ -995,14 +996,14 @@
     paramBuffer.addEnumParam("pname", GLenumGroup::PatchParameterName, ParamType::TGLenum, pname);
     paramBuffer.addValueParam("value", ParamType::TGLint, value);
 
-    return CallCapture(gl::EntryPoint::PatchParameteri, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLPatchParameteri, std::move(paramBuffer));
 }
 
 CallCapture CapturePopDebugGroup(const State &glState, bool isCallValid)
 {
     ParamBuffer paramBuffer;
 
-    return CallCapture(gl::EntryPoint::PopDebugGroup, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLPopDebugGroup, std::move(paramBuffer));
 }
 
 CallCapture CapturePrimitiveBoundingBox(const State &glState,
@@ -1027,7 +1028,7 @@
     paramBuffer.addValueParam("maxZ", ParamType::TGLfloat, maxZ);
     paramBuffer.addValueParam("maxW", ParamType::TGLfloat, maxW);
 
-    return CallCapture(gl::EntryPoint::PrimitiveBoundingBox, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLPrimitiveBoundingBox, std::move(paramBuffer));
 }
 
 CallCapture CapturePushDebugGroup(const State &glState,
@@ -1059,7 +1060,7 @@
         paramBuffer.addParam(std::move(messageParam));
     }
 
-    return CallCapture(gl::EntryPoint::PushDebugGroup, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLPushDebugGroup, std::move(paramBuffer));
 }
 
 CallCapture CaptureReadnPixels(const State &glState,
@@ -1098,7 +1099,7 @@
         paramBuffer.addParam(std::move(dataParam));
     }
 
-    return CallCapture(gl::EntryPoint::ReadnPixels, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLReadnPixels, std::move(paramBuffer));
 }
 
 CallCapture CaptureSamplerParameterIiv(const State &glState,
@@ -1128,7 +1129,7 @@
         paramBuffer.addParam(std::move(paramParam));
     }
 
-    return CallCapture(gl::EntryPoint::SamplerParameterIiv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLSamplerParameterIiv, std::move(paramBuffer));
 }
 
 CallCapture CaptureSamplerParameterIuiv(const State &glState,
@@ -1158,7 +1159,7 @@
         paramBuffer.addParam(std::move(paramParam));
     }
 
-    return CallCapture(gl::EntryPoint::SamplerParameterIuiv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLSamplerParameterIuiv, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexBuffer(const State &glState,
@@ -1174,7 +1175,7 @@
                              internalformat);
     paramBuffer.addValueParam("bufferPacked", ParamType::TBufferID, bufferPacked);
 
-    return CallCapture(gl::EntryPoint::TexBuffer, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexBuffer, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexBufferRange(const State &glState,
@@ -1194,7 +1195,7 @@
     paramBuffer.addValueParam("offset", ParamType::TGLintptr, offset);
     paramBuffer.addValueParam("size", ParamType::TGLsizeiptr, size);
 
-    return CallCapture(gl::EntryPoint::TexBufferRange, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexBufferRange, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexParameterIiv(const State &glState,
@@ -1224,7 +1225,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::TexParameterIiv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexParameterIiv, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexParameterIuiv(const State &glState,
@@ -1254,7 +1255,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::TexParameterIuiv, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexParameterIuiv, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexStorage3DMultisample(const State &glState,
@@ -1278,7 +1279,7 @@
     paramBuffer.addValueParam("depth", ParamType::TGLsizei, depth);
     paramBuffer.addValueParam("fixedsamplelocations", ParamType::TGLboolean, fixedsamplelocations);
 
-    return CallCapture(gl::EntryPoint::TexStorage3DMultisample, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexStorage3DMultisample, std::move(paramBuffer));
 }
 
 }  // namespace gl
diff --git a/src/libANGLE/capture_gles_ext_autogen.cpp b/src/libANGLE/capture_gles_ext_autogen.cpp
index 755a519..3a364cf 100644
--- a/src/libANGLE/capture_gles_ext_autogen.cpp
+++ b/src/libANGLE/capture_gles_ext_autogen.cpp
@@ -36,7 +36,7 @@
     paramBuffer.addValueParam("instanceCount", ParamType::TGLsizei, instanceCount);
     paramBuffer.addValueParam("baseInstance", ParamType::TGLuint, baseInstance);
 
-    return CallCapture(gl::EntryPoint::DrawArraysInstancedBaseInstanceANGLE,
+    return CallCapture(angle::EntryPoint::GLDrawArraysInstancedBaseInstanceANGLE,
                        std::move(paramBuffer));
 }
 
@@ -77,7 +77,7 @@
     paramBuffer.addValueParam("baseVertex", ParamType::TGLint, baseVertex);
     paramBuffer.addValueParam("baseInstance", ParamType::TGLuint, baseInstance);
 
-    return CallCapture(gl::EntryPoint::DrawElementsInstancedBaseVertexBaseInstanceANGLE,
+    return CallCapture(angle::EntryPoint::GLDrawElementsInstancedBaseVertexBaseInstanceANGLE,
                        std::move(paramBuffer));
 }
 
@@ -164,7 +164,7 @@
 
     paramBuffer.addValueParam("drawcount", ParamType::TGLsizei, drawcount);
 
-    return CallCapture(gl::EntryPoint::MultiDrawArraysInstancedBaseInstanceANGLE,
+    return CallCapture(angle::EntryPoint::GLMultiDrawArraysInstancedBaseInstanceANGLE,
                        std::move(paramBuffer));
 }
 
@@ -273,7 +273,7 @@
 
     paramBuffer.addValueParam("drawcount", ParamType::TGLsizei, drawcount);
 
-    return CallCapture(gl::EntryPoint::MultiDrawElementsInstancedBaseVertexBaseInstanceANGLE,
+    return CallCapture(angle::EntryPoint::GLMultiDrawElementsInstancedBaseVertexBaseInstanceANGLE,
                        std::move(paramBuffer));
 }
 
@@ -305,7 +305,7 @@
     paramBuffer.addValueParam("unpackUnmultiplyAlpha", ParamType::TGLboolean,
                               unpackUnmultiplyAlpha);
 
-    return CallCapture(gl::EntryPoint::CopyTexture3DANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLCopyTexture3DANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureCopySubTexture3DANGLE(const State &glState,
@@ -350,7 +350,7 @@
     paramBuffer.addValueParam("unpackUnmultiplyAlpha", ParamType::TGLboolean,
                               unpackUnmultiplyAlpha);
 
-    return CallCapture(gl::EntryPoint::CopySubTexture3DANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLCopySubTexture3DANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureBlitFramebufferANGLE(const State &glState,
@@ -380,7 +380,7 @@
     paramBuffer.addEnumParam("filter", GLenumGroup::BlitFramebufferFilter, ParamType::TGLenum,
                              filter);
 
-    return CallCapture(gl::EntryPoint::BlitFramebufferANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBlitFramebufferANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureRenderbufferStorageMultisampleANGLE(const State &glState,
@@ -400,7 +400,8 @@
     paramBuffer.addValueParam("width", ParamType::TGLsizei, width);
     paramBuffer.addValueParam("height", ParamType::TGLsizei, height);
 
-    return CallCapture(gl::EntryPoint::RenderbufferStorageMultisampleANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLRenderbufferStorageMultisampleANGLE,
+                       std::move(paramBuffer));
 }
 
 CallCapture CaptureGetTexImageANGLE(const State &glState,
@@ -433,7 +434,7 @@
         paramBuffer.addParam(std::move(pixelsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetTexImageANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetTexImageANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetRenderbufferImageANGLE(const State &glState,
@@ -464,7 +465,7 @@
         paramBuffer.addParam(std::move(pixelsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetRenderbufferImageANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetRenderbufferImageANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetTexLevelParameterivANGLE(const State &glState,
@@ -495,7 +496,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetTexLevelParameterivANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetTexLevelParameterivANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetTexLevelParameterfvANGLE(const State &glState,
@@ -527,7 +528,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetTexLevelParameterfvANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetTexLevelParameterfvANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureDrawArraysInstancedANGLE(const State &glState,
@@ -544,7 +545,7 @@
     paramBuffer.addValueParam("count", ParamType::TGLsizei, count);
     paramBuffer.addValueParam("primcount", ParamType::TGLsizei, primcount);
 
-    return CallCapture(gl::EntryPoint::DrawArraysInstancedANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDrawArraysInstancedANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureDrawElementsInstancedANGLE(const State &glState,
@@ -579,7 +580,7 @@
 
     paramBuffer.addValueParam("primcount", ParamType::TGLsizei, primcount);
 
-    return CallCapture(gl::EntryPoint::DrawElementsInstancedANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDrawElementsInstancedANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureVertexAttribDivisorANGLE(const State &glState,
@@ -592,7 +593,7 @@
     paramBuffer.addValueParam("index", ParamType::TGLuint, index);
     paramBuffer.addValueParam("divisor", ParamType::TGLuint, divisor);
 
-    return CallCapture(gl::EntryPoint::VertexAttribDivisorANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLVertexAttribDivisorANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexStorageMemFlags2DANGLE(const State &glState,
@@ -622,7 +623,7 @@
     paramBuffer.addEnumParam("usageFlags", GLenumGroup::DefaultGroup, ParamType::TGLbitfield,
                              usageFlags);
 
-    return CallCapture(gl::EntryPoint::TexStorageMemFlags2DANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexStorageMemFlags2DANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexStorageMemFlags2DMultisampleANGLE(const State &glState,
@@ -654,7 +655,7 @@
     paramBuffer.addEnumParam("usageFlags", GLenumGroup::DefaultGroup, ParamType::TGLbitfield,
                              usageFlags);
 
-    return CallCapture(gl::EntryPoint::TexStorageMemFlags2DMultisampleANGLE,
+    return CallCapture(angle::EntryPoint::GLTexStorageMemFlags2DMultisampleANGLE,
                        std::move(paramBuffer));
 }
 
@@ -687,7 +688,7 @@
     paramBuffer.addEnumParam("usageFlags", GLenumGroup::DefaultGroup, ParamType::TGLbitfield,
                              usageFlags);
 
-    return CallCapture(gl::EntryPoint::TexStorageMemFlags3DANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexStorageMemFlags3DANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexStorageMemFlags3DMultisampleANGLE(const State &glState,
@@ -721,7 +722,7 @@
     paramBuffer.addEnumParam("usageFlags", GLenumGroup::DefaultGroup, ParamType::TGLbitfield,
                              usageFlags);
 
-    return CallCapture(gl::EntryPoint::TexStorageMemFlags3DMultisampleANGLE,
+    return CallCapture(angle::EntryPoint::GLTexStorageMemFlags3DMultisampleANGLE,
                        std::move(paramBuffer));
 }
 
@@ -739,7 +740,7 @@
     paramBuffer.addValueParam("handleTypePacked", ParamType::THandleType, handleTypePacked);
     paramBuffer.addValueParam("handle", ParamType::TGLuint, handle);
 
-    return CallCapture(gl::EntryPoint::ImportMemoryZirconHandleANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLImportMemoryZirconHandleANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureMultiDrawArraysANGLE(const State &glState,
@@ -787,7 +788,7 @@
 
     paramBuffer.addValueParam("drawcount", ParamType::TGLsizei, drawcount);
 
-    return CallCapture(gl::EntryPoint::MultiDrawArraysANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLMultiDrawArraysANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureMultiDrawArraysInstancedANGLE(const State &glState,
@@ -855,7 +856,7 @@
 
     paramBuffer.addValueParam("drawcount", ParamType::TGLsizei, drawcount);
 
-    return CallCapture(gl::EntryPoint::MultiDrawArraysInstancedANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLMultiDrawArraysInstancedANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureMultiDrawElementsANGLE(const State &glState,
@@ -906,7 +907,7 @@
 
     paramBuffer.addValueParam("drawcount", ParamType::TGLsizei, drawcount);
 
-    return CallCapture(gl::EntryPoint::MultiDrawElementsANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLMultiDrawElementsANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureMultiDrawElementsInstancedANGLE(const State &glState,
@@ -977,7 +978,8 @@
 
     paramBuffer.addValueParam("drawcount", ParamType::TGLsizei, drawcount);
 
-    return CallCapture(gl::EntryPoint::MultiDrawElementsInstancedANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLMultiDrawElementsInstancedANGLE,
+                       std::move(paramBuffer));
 }
 
 CallCapture CaptureProvokingVertexANGLE(const State &glState,
@@ -988,7 +990,7 @@
 
     paramBuffer.addValueParam("modePacked", ParamType::TProvokingVertexConvention, modePacked);
 
-    return CallCapture(gl::EntryPoint::ProvokingVertexANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProvokingVertexANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureRequestExtensionANGLE(const State &glState, bool isCallValid, const GLchar *name)
@@ -1010,7 +1012,7 @@
         paramBuffer.addParam(std::move(nameParam));
     }
 
-    return CallCapture(gl::EntryPoint::RequestExtensionANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLRequestExtensionANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureDisableExtensionANGLE(const State &glState, bool isCallValid, const GLchar *name)
@@ -1032,7 +1034,7 @@
         paramBuffer.addParam(std::move(nameParam));
     }
 
-    return CallCapture(gl::EntryPoint::DisableExtensionANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDisableExtensionANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetBooleanvRobustANGLE(const State &glState,
@@ -1079,7 +1081,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetBooleanvRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetBooleanvRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetBufferParameterivRobustANGLE(const State &glState,
@@ -1127,7 +1129,8 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetBufferParameterivRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetBufferParameterivRobustANGLE,
+                       std::move(paramBuffer));
 }
 
 CallCapture CaptureGetFloatvRobustANGLE(const State &glState,
@@ -1174,7 +1177,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetFloatvRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetFloatvRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetFramebufferAttachmentParameterivRobustANGLE(const State &glState,
@@ -1225,7 +1228,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetFramebufferAttachmentParameterivRobustANGLE,
+    return CallCapture(angle::EntryPoint::GLGetFramebufferAttachmentParameterivRobustANGLE,
                        std::move(paramBuffer));
 }
 
@@ -1272,7 +1275,7 @@
         paramBuffer.addParam(std::move(dataParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetIntegervRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetIntegervRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetProgramivRobustANGLE(const State &glState,
@@ -1320,7 +1323,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetProgramivRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetProgramivRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetRenderbufferParameterivRobustANGLE(const State &glState,
@@ -1368,7 +1371,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetRenderbufferParameterivRobustANGLE,
+    return CallCapture(angle::EntryPoint::GLGetRenderbufferParameterivRobustANGLE,
                        std::move(paramBuffer));
 }
 
@@ -1417,7 +1420,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetShaderivRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetShaderivRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetTexParameterfvRobustANGLE(const State &glState,
@@ -1466,7 +1469,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetTexParameterfvRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetTexParameterfvRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetTexParameterivRobustANGLE(const State &glState,
@@ -1514,7 +1517,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetTexParameterivRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetTexParameterivRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetUniformfvRobustANGLE(const State &glState,
@@ -1563,7 +1566,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetUniformfvRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetUniformfvRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetUniformivRobustANGLE(const State &glState,
@@ -1611,7 +1614,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetUniformivRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetUniformivRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetVertexAttribfvRobustANGLE(const State &glState,
@@ -1660,7 +1663,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetVertexAttribfvRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetVertexAttribfvRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetVertexAttribivRobustANGLE(const State &glState,
@@ -1708,7 +1711,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetVertexAttribivRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetVertexAttribivRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetVertexAttribPointervRobustANGLE(const State &glState,
@@ -1757,7 +1760,8 @@
         paramBuffer.addParam(std::move(pointerParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetVertexAttribPointervRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetVertexAttribPointervRobustANGLE,
+                       std::move(paramBuffer));
 }
 
 CallCapture CaptureReadPixelsRobustANGLE(const State &glState,
@@ -1848,7 +1852,7 @@
         paramBuffer.addParam(std::move(pixelsParam));
     }
 
-    return CallCapture(gl::EntryPoint::ReadPixelsRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLReadPixelsRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexImage2DRobustANGLE(const State &glState,
@@ -1893,7 +1897,7 @@
         paramBuffer.addParam(std::move(pixelsParam));
     }
 
-    return CallCapture(gl::EntryPoint::TexImage2DRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexImage2DRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexParameterfvRobustANGLE(const State &glState,
@@ -1925,7 +1929,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::TexParameterfvRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexParameterfvRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexParameterivRobustANGLE(const State &glState,
@@ -1957,7 +1961,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::TexParameterivRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexParameterivRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexSubImage2DRobustANGLE(const State &glState,
@@ -2002,7 +2006,7 @@
         paramBuffer.addParam(std::move(pixelsParam));
     }
 
-    return CallCapture(gl::EntryPoint::TexSubImage2DRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexSubImage2DRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexImage3DRobustANGLE(const State &glState,
@@ -2049,7 +2053,7 @@
         paramBuffer.addParam(std::move(pixelsParam));
     }
 
-    return CallCapture(gl::EntryPoint::TexImage3DRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexImage3DRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexSubImage3DRobustANGLE(const State &glState,
@@ -2098,7 +2102,7 @@
         paramBuffer.addParam(std::move(pixelsParam));
     }
 
-    return CallCapture(gl::EntryPoint::TexSubImage3DRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexSubImage3DRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureCompressedTexImage2DRobustANGLE(const State &glState,
@@ -2142,7 +2146,8 @@
         paramBuffer.addParam(std::move(dataParam));
     }
 
-    return CallCapture(gl::EntryPoint::CompressedTexImage2DRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLCompressedTexImage2DRobustANGLE,
+                       std::move(paramBuffer));
 }
 
 CallCapture CaptureCompressedTexSubImage2DRobustANGLE(const State &glState,
@@ -2187,7 +2192,8 @@
         paramBuffer.addParam(std::move(dataParam));
     }
 
-    return CallCapture(gl::EntryPoint::CompressedTexSubImage2DRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLCompressedTexSubImage2DRobustANGLE,
+                       std::move(paramBuffer));
 }
 
 CallCapture CaptureCompressedTexImage3DRobustANGLE(const State &glState,
@@ -2233,7 +2239,8 @@
         paramBuffer.addParam(std::move(dataParam));
     }
 
-    return CallCapture(gl::EntryPoint::CompressedTexImage3DRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLCompressedTexImage3DRobustANGLE,
+                       std::move(paramBuffer));
 }
 
 CallCapture CaptureCompressedTexSubImage3DRobustANGLE(const State &glState,
@@ -2282,7 +2289,8 @@
         paramBuffer.addParam(std::move(dataParam));
     }
 
-    return CallCapture(gl::EntryPoint::CompressedTexSubImage3DRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLCompressedTexSubImage3DRobustANGLE,
+                       std::move(paramBuffer));
 }
 
 CallCapture CaptureGetQueryivRobustANGLE(const State &glState,
@@ -2330,7 +2338,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetQueryivRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetQueryivRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetQueryObjectuivRobustANGLE(const State &glState,
@@ -2379,7 +2387,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetQueryObjectuivRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetQueryObjectuivRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetBufferPointervRobustANGLE(const State &glState,
@@ -2428,7 +2436,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetBufferPointervRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetBufferPointervRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetIntegeri_vRobustANGLE(const State &glState,
@@ -2476,7 +2484,7 @@
         paramBuffer.addParam(std::move(dataParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetIntegeri_vRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetIntegeri_vRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetInternalformativRobustANGLE(const State &glState,
@@ -2527,7 +2535,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetInternalformativRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetInternalformativRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetVertexAttribIivRobustANGLE(const State &glState,
@@ -2575,7 +2583,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetVertexAttribIivRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetVertexAttribIivRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetVertexAttribIuivRobustANGLE(const State &glState,
@@ -2624,7 +2632,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetVertexAttribIuivRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetVertexAttribIuivRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetUniformuivRobustANGLE(const State &glState,
@@ -2673,7 +2681,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetUniformuivRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetUniformuivRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetActiveUniformBlockivRobustANGLE(const State &glState,
@@ -2725,7 +2733,8 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetActiveUniformBlockivRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetActiveUniformBlockivRobustANGLE,
+                       std::move(paramBuffer));
 }
 
 CallCapture CaptureGetInteger64vRobustANGLE(const State &glState,
@@ -2772,7 +2781,7 @@
         paramBuffer.addParam(std::move(dataParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetInteger64vRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetInteger64vRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetInteger64i_vRobustANGLE(const State &glState,
@@ -2821,7 +2830,7 @@
         paramBuffer.addParam(std::move(dataParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetInteger64i_vRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetInteger64i_vRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetBufferParameteri64vRobustANGLE(const State &glState,
@@ -2870,7 +2879,8 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetBufferParameteri64vRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetBufferParameteri64vRobustANGLE,
+                       std::move(paramBuffer));
 }
 
 CallCapture CaptureSamplerParameterivRobustANGLE(const State &glState,
@@ -2902,7 +2912,7 @@
         paramBuffer.addParam(std::move(paramParam));
     }
 
-    return CallCapture(gl::EntryPoint::SamplerParameterivRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLSamplerParameterivRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureSamplerParameterfvRobustANGLE(const State &glState,
@@ -2934,7 +2944,7 @@
         paramBuffer.addParam(std::move(paramParam));
     }
 
-    return CallCapture(gl::EntryPoint::SamplerParameterfvRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLSamplerParameterfvRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetSamplerParameterivRobustANGLE(const State &glState,
@@ -2982,7 +2992,8 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetSamplerParameterivRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetSamplerParameterivRobustANGLE,
+                       std::move(paramBuffer));
 }
 
 CallCapture CaptureGetSamplerParameterfvRobustANGLE(const State &glState,
@@ -3031,7 +3042,8 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetSamplerParameterfvRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetSamplerParameterfvRobustANGLE,
+                       std::move(paramBuffer));
 }
 
 CallCapture CaptureGetFramebufferParameterivRobustANGLE(const State &glState,
@@ -3079,7 +3091,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetFramebufferParameterivRobustANGLE,
+    return CallCapture(angle::EntryPoint::GLGetFramebufferParameterivRobustANGLE,
                        std::move(paramBuffer));
 }
 
@@ -3133,7 +3145,8 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetProgramInterfaceivRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetProgramInterfaceivRobustANGLE,
+                       std::move(paramBuffer));
 }
 
 CallCapture CaptureGetBooleani_vRobustANGLE(const State &glState,
@@ -3182,7 +3195,7 @@
         paramBuffer.addParam(std::move(dataParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetBooleani_vRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetBooleani_vRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetMultisamplefvRobustANGLE(const State &glState,
@@ -3231,7 +3244,7 @@
         paramBuffer.addParam(std::move(valParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetMultisamplefvRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetMultisamplefvRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetTexLevelParameterivRobustANGLE(const State &glState,
@@ -3283,7 +3296,8 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetTexLevelParameterivRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetTexLevelParameterivRobustANGLE,
+                       std::move(paramBuffer));
 }
 
 CallCapture CaptureGetTexLevelParameterfvRobustANGLE(const State &glState,
@@ -3336,7 +3350,8 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetTexLevelParameterfvRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetTexLevelParameterfvRobustANGLE,
+                       std::move(paramBuffer));
 }
 
 CallCapture CaptureGetPointervRobustANGLERobustANGLE(const State &glState,
@@ -3383,7 +3398,8 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetPointervRobustANGLERobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetPointervRobustANGLERobustANGLE,
+                       std::move(paramBuffer));
 }
 
 CallCapture CaptureReadnPixelsRobustANGLE(const State &glState,
@@ -3475,7 +3491,7 @@
         paramBuffer.addParam(std::move(dataParam));
     }
 
-    return CallCapture(gl::EntryPoint::ReadnPixelsRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLReadnPixelsRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetnUniformfvRobustANGLE(const State &glState,
@@ -3524,7 +3540,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetnUniformfvRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetnUniformfvRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetnUniformivRobustANGLE(const State &glState,
@@ -3572,7 +3588,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetnUniformivRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetnUniformivRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetnUniformuivRobustANGLE(const State &glState,
@@ -3621,7 +3637,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetnUniformuivRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetnUniformuivRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexParameterIivRobustANGLE(const State &glState,
@@ -3653,7 +3669,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::TexParameterIivRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexParameterIivRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexParameterIuivRobustANGLE(const State &glState,
@@ -3685,7 +3701,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::TexParameterIuivRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexParameterIuivRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetTexParameterIivRobustANGLE(const State &glState,
@@ -3733,7 +3749,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetTexParameterIivRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetTexParameterIivRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetTexParameterIuivRobustANGLE(const State &glState,
@@ -3782,7 +3798,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetTexParameterIuivRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetTexParameterIuivRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureSamplerParameterIivRobustANGLE(const State &glState,
@@ -3814,7 +3830,7 @@
         paramBuffer.addParam(std::move(paramParam));
     }
 
-    return CallCapture(gl::EntryPoint::SamplerParameterIivRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLSamplerParameterIivRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureSamplerParameterIuivRobustANGLE(const State &glState,
@@ -3846,7 +3862,8 @@
         paramBuffer.addParam(std::move(paramParam));
     }
 
-    return CallCapture(gl::EntryPoint::SamplerParameterIuivRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLSamplerParameterIuivRobustANGLE,
+                       std::move(paramBuffer));
 }
 
 CallCapture CaptureGetSamplerParameterIivRobustANGLE(const State &glState,
@@ -3894,7 +3911,8 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetSamplerParameterIivRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetSamplerParameterIivRobustANGLE,
+                       std::move(paramBuffer));
 }
 
 CallCapture CaptureGetSamplerParameterIuivRobustANGLE(const State &glState,
@@ -3943,7 +3961,8 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetSamplerParameterIuivRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetSamplerParameterIuivRobustANGLE,
+                       std::move(paramBuffer));
 }
 
 CallCapture CaptureGetQueryObjectivRobustANGLE(const State &glState,
@@ -3991,7 +4010,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetQueryObjectivRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetQueryObjectivRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetQueryObjecti64vRobustANGLE(const State &glState,
@@ -4040,7 +4059,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetQueryObjecti64vRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetQueryObjecti64vRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetQueryObjectui64vRobustANGLE(const State &glState,
@@ -4089,7 +4108,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetQueryObjectui64vRobustANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetQueryObjectui64vRobustANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureImportSemaphoreZirconHandleANGLE(const State &glState,
@@ -4104,7 +4123,8 @@
     paramBuffer.addValueParam("handleTypePacked", ParamType::THandleType, handleTypePacked);
     paramBuffer.addValueParam("handle", ParamType::TGLuint, handle);
 
-    return CallCapture(gl::EntryPoint::ImportSemaphoreZirconHandleANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLImportSemaphoreZirconHandleANGLE,
+                       std::move(paramBuffer));
 }
 
 CallCapture CaptureTexImage2DExternalANGLE(const State &glState,
@@ -4129,7 +4149,7 @@
     paramBuffer.addEnumParam("format", GLenumGroup::PixelFormat, ParamType::TGLenum, format);
     paramBuffer.addEnumParam("type", GLenumGroup::PixelType, ParamType::TGLenum, type);
 
-    return CallCapture(gl::EntryPoint::TexImage2DExternalANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexImage2DExternalANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureInvalidateTextureANGLE(const State &glState,
@@ -4140,7 +4160,7 @@
 
     paramBuffer.addValueParam("targetPacked", ParamType::TTextureType, targetPacked);
 
-    return CallCapture(gl::EntryPoint::InvalidateTextureANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLInvalidateTextureANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexStorage2DMultisampleANGLE(const State &glState,
@@ -4162,7 +4182,7 @@
     paramBuffer.addValueParam("height", ParamType::TGLsizei, height);
     paramBuffer.addValueParam("fixedsamplelocations", ParamType::TGLboolean, fixedsamplelocations);
 
-    return CallCapture(gl::EntryPoint::TexStorage2DMultisampleANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexStorage2DMultisampleANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetMultisamplefvANGLE(const State &glState,
@@ -4191,7 +4211,7 @@
         paramBuffer.addParam(std::move(valParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetMultisamplefvANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetMultisamplefvANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureSampleMaskiANGLE(const State &glState,
@@ -4204,7 +4224,7 @@
     paramBuffer.addValueParam("maskNumber", ParamType::TGLuint, maskNumber);
     paramBuffer.addEnumParam("mask", GLenumGroup::DefaultGroup, ParamType::TGLbitfield, mask);
 
-    return CallCapture(gl::EntryPoint::SampleMaskiANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLSampleMaskiANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetTranslatedShaderSourceANGLE(const State &glState,
@@ -4251,7 +4271,7 @@
         paramBuffer.addParam(std::move(sourceParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetTranslatedShaderSourceANGLE, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetTranslatedShaderSourceANGLE, std::move(paramBuffer));
 }
 
 CallCapture CaptureBindUniformLocationCHROMIUM(const State &glState,
@@ -4281,7 +4301,7 @@
         paramBuffer.addParam(std::move(nameParam));
     }
 
-    return CallCapture(gl::EntryPoint::BindUniformLocationCHROMIUM, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBindUniformLocationCHROMIUM, std::move(paramBuffer));
 }
 
 CallCapture CaptureCompressedCopyTextureCHROMIUM(const State &glState,
@@ -4294,7 +4314,7 @@
     paramBuffer.addValueParam("sourceIdPacked", ParamType::TTextureID, sourceIdPacked);
     paramBuffer.addValueParam("destIdPacked", ParamType::TTextureID, destIdPacked);
 
-    return CallCapture(gl::EntryPoint::CompressedCopyTextureCHROMIUM, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLCompressedCopyTextureCHROMIUM, std::move(paramBuffer));
 }
 
 CallCapture CaptureCopyTextureCHROMIUM(const State &glState,
@@ -4325,7 +4345,7 @@
     paramBuffer.addValueParam("unpackUnmultiplyAlpha", ParamType::TGLboolean,
                               unpackUnmultiplyAlpha);
 
-    return CallCapture(gl::EntryPoint::CopyTextureCHROMIUM, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLCopyTextureCHROMIUM, std::move(paramBuffer));
 }
 
 CallCapture CaptureCopySubTextureCHROMIUM(const State &glState,
@@ -4364,7 +4384,7 @@
     paramBuffer.addValueParam("unpackUnmultiplyAlpha", ParamType::TGLboolean,
                               unpackUnmultiplyAlpha);
 
-    return CallCapture(gl::EntryPoint::CopySubTextureCHROMIUM, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLCopySubTextureCHROMIUM, std::move(paramBuffer));
 }
 
 CallCapture CaptureCoverageModulationCHROMIUM(const State &glState,
@@ -4376,7 +4396,7 @@
     paramBuffer.addEnumParam("components", GLenumGroup::DefaultGroup, ParamType::TGLenum,
                              components);
 
-    return CallCapture(gl::EntryPoint::CoverageModulationCHROMIUM, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLCoverageModulationCHROMIUM, std::move(paramBuffer));
 }
 
 CallCapture CaptureLoseContextCHROMIUM(const State &glState,
@@ -4389,7 +4409,7 @@
     paramBuffer.addValueParam("currentPacked", ParamType::TGraphicsResetStatus, currentPacked);
     paramBuffer.addValueParam("otherPacked", ParamType::TGraphicsResetStatus, otherPacked);
 
-    return CallCapture(gl::EntryPoint::LoseContextCHROMIUM, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLLoseContextCHROMIUM, std::move(paramBuffer));
 }
 
 CallCapture CaptureBindFragDataLocationEXT(const State &glState,
@@ -4419,7 +4439,7 @@
         paramBuffer.addParam(std::move(nameParam));
     }
 
-    return CallCapture(gl::EntryPoint::BindFragDataLocationEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBindFragDataLocationEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureBindFragDataLocationIndexedEXT(const State &glState,
@@ -4451,7 +4471,7 @@
         paramBuffer.addParam(std::move(nameParam));
     }
 
-    return CallCapture(gl::EntryPoint::BindFragDataLocationIndexedEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBindFragDataLocationIndexedEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetFragDataIndexEXT(const State &glState,
@@ -4483,7 +4503,7 @@
     InitParamValue(ParamType::TGLint, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::GetFragDataIndexEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetFragDataIndexEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetProgramResourceLocationIndexEXT(const State &glState,
@@ -4519,7 +4539,8 @@
     InitParamValue(ParamType::TGLint, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::GetProgramResourceLocationIndexEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetProgramResourceLocationIndexEXT,
+                       std::move(paramBuffer));
 }
 
 CallCapture CaptureBufferStorageEXT(const State &glState,
@@ -4553,7 +4574,7 @@
     paramBuffer.addEnumParam("flags", GLenumGroup::MapBufferUsageMask, ParamType::TGLbitfield,
                              flags);
 
-    return CallCapture(gl::EntryPoint::BufferStorageEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBufferStorageEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureCopyImageSubDataEXT(const State &glState,
@@ -4594,7 +4615,87 @@
     paramBuffer.addValueParam("srcHeight", ParamType::TGLsizei, srcHeight);
     paramBuffer.addValueParam("srcDepth", ParamType::TGLsizei, srcDepth);
 
-    return CallCapture(gl::EntryPoint::CopyImageSubDataEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLCopyImageSubDataEXT, std::move(paramBuffer));
+}
+
+CallCapture CaptureGetObjectLabelEXT(const State &glState,
+                                     bool isCallValid,
+                                     GLenum type,
+                                     GLuint object,
+                                     GLsizei bufSize,
+                                     GLsizei *length,
+                                     GLchar *label)
+{
+    ParamBuffer paramBuffer;
+
+    paramBuffer.addEnumParam("type", GLenumGroup::DefaultGroup, ParamType::TGLenum, type);
+    paramBuffer.addValueParam("object", ParamType::TGLuint, object);
+    paramBuffer.addValueParam("bufSize", ParamType::TGLsizei, bufSize);
+
+    if (isCallValid)
+    {
+        ParamCapture lengthParam("length", ParamType::TGLsizeiPointer);
+        InitParamValue(ParamType::TGLsizeiPointer, length, &lengthParam.value);
+        CaptureGetObjectLabelEXT_length(glState, isCallValid, type, object, bufSize, length, label,
+                                        &lengthParam);
+        paramBuffer.addParam(std::move(lengthParam));
+    }
+    else
+    {
+        ParamCapture lengthParam("length", ParamType::TGLsizeiPointer);
+        InitParamValue(ParamType::TGLsizeiPointer, static_cast<GLsizei *>(nullptr),
+                       &lengthParam.value);
+        paramBuffer.addParam(std::move(lengthParam));
+    }
+
+    if (isCallValid)
+    {
+        ParamCapture labelParam("label", ParamType::TGLcharPointer);
+        InitParamValue(ParamType::TGLcharPointer, label, &labelParam.value);
+        CaptureGetObjectLabelEXT_label(glState, isCallValid, type, object, bufSize, length, label,
+                                       &labelParam);
+        paramBuffer.addParam(std::move(labelParam));
+    }
+    else
+    {
+        ParamCapture labelParam("label", ParamType::TGLcharPointer);
+        InitParamValue(ParamType::TGLcharPointer, static_cast<GLchar *>(nullptr),
+                       &labelParam.value);
+        paramBuffer.addParam(std::move(labelParam));
+    }
+
+    return CallCapture(angle::EntryPoint::GLGetObjectLabelEXT, std::move(paramBuffer));
+}
+
+CallCapture CaptureLabelObjectEXT(const State &glState,
+                                  bool isCallValid,
+                                  GLenum type,
+                                  GLuint object,
+                                  GLsizei length,
+                                  const GLchar *label)
+{
+    ParamBuffer paramBuffer;
+
+    paramBuffer.addEnumParam("type", GLenumGroup::DefaultGroup, ParamType::TGLenum, type);
+    paramBuffer.addValueParam("object", ParamType::TGLuint, object);
+    paramBuffer.addValueParam("length", ParamType::TGLsizei, length);
+
+    if (isCallValid)
+    {
+        ParamCapture labelParam("label", ParamType::TGLcharConstPointer);
+        InitParamValue(ParamType::TGLcharConstPointer, label, &labelParam.value);
+        CaptureLabelObjectEXT_label(glState, isCallValid, type, object, length, label, &labelParam);
+        paramBuffer.addParam(std::move(labelParam));
+    }
+    else
+    {
+        ParamCapture labelParam("label", ParamType::TGLcharConstPointer);
+        InitParamValue(ParamType::TGLcharConstPointer, static_cast<const GLchar *>(nullptr),
+                       &labelParam.value);
+        paramBuffer.addParam(std::move(labelParam));
+    }
+
+    return CallCapture(angle::EntryPoint::GLLabelObjectEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureInsertEventMarkerEXT(const State &glState,
@@ -4621,14 +4722,14 @@
         paramBuffer.addParam(std::move(markerParam));
     }
 
-    return CallCapture(gl::EntryPoint::InsertEventMarkerEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLInsertEventMarkerEXT, std::move(paramBuffer));
 }
 
 CallCapture CapturePopGroupMarkerEXT(const State &glState, bool isCallValid)
 {
     ParamBuffer paramBuffer;
 
-    return CallCapture(gl::EntryPoint::PopGroupMarkerEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLPopGroupMarkerEXT, std::move(paramBuffer));
 }
 
 CallCapture CapturePushGroupMarkerEXT(const State &glState,
@@ -4655,7 +4756,7 @@
         paramBuffer.addParam(std::move(markerParam));
     }
 
-    return CallCapture(gl::EntryPoint::PushGroupMarkerEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLPushGroupMarkerEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureDiscardFramebufferEXT(const State &glState,
@@ -4685,7 +4786,7 @@
         paramBuffer.addParam(std::move(attachmentsParam));
     }
 
-    return CallCapture(gl::EntryPoint::DiscardFramebufferEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDiscardFramebufferEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureBeginQueryEXT(const State &glState,
@@ -4698,7 +4799,7 @@
     paramBuffer.addValueParam("targetPacked", ParamType::TQueryType, targetPacked);
     paramBuffer.addValueParam("idPacked", ParamType::TQueryID, idPacked);
 
-    return CallCapture(gl::EntryPoint::BeginQueryEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBeginQueryEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureDeleteQueriesEXT(const State &glState,
@@ -4725,7 +4826,7 @@
         paramBuffer.addParam(std::move(idsPackedParam));
     }
 
-    return CallCapture(gl::EntryPoint::DeleteQueriesEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDeleteQueriesEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureEndQueryEXT(const State &glState, bool isCallValid, QueryType targetPacked)
@@ -4734,7 +4835,7 @@
 
     paramBuffer.addValueParam("targetPacked", ParamType::TQueryType, targetPacked);
 
-    return CallCapture(gl::EntryPoint::EndQueryEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLEndQueryEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureGenQueriesEXT(const State &glState,
@@ -4761,7 +4862,7 @@
         paramBuffer.addParam(std::move(idsPackedParam));
     }
 
-    return CallCapture(gl::EntryPoint::GenQueriesEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGenQueriesEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetInteger64vEXT(const State &glState,
@@ -4788,7 +4889,7 @@
         paramBuffer.addParam(std::move(dataParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetInteger64vEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetInteger64vEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetQueryObjecti64vEXT(const State &glState,
@@ -4819,7 +4920,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetQueryObjecti64vEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetQueryObjecti64vEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetQueryObjectivEXT(const State &glState,
@@ -4849,7 +4950,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetQueryObjectivEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetQueryObjectivEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetQueryObjectui64vEXT(const State &glState,
@@ -4880,7 +4981,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetQueryObjectui64vEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetQueryObjectui64vEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetQueryObjectuivEXT(const State &glState,
@@ -4911,7 +5012,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetQueryObjectuivEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetQueryObjectuivEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetQueryivEXT(const State &glState,
@@ -4940,7 +5041,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetQueryivEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetQueryivEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureIsQueryEXT(const State &glState,
@@ -4956,7 +5057,7 @@
     InitParamValue(ParamType::TGLboolean, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::IsQueryEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLIsQueryEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureQueryCounterEXT(const State &glState,
@@ -4969,7 +5070,7 @@
     paramBuffer.addValueParam("idPacked", ParamType::TQueryID, idPacked);
     paramBuffer.addValueParam("targetPacked", ParamType::TQueryType, targetPacked);
 
-    return CallCapture(gl::EntryPoint::QueryCounterEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLQueryCounterEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureDrawBuffersEXT(const State &glState,
@@ -4996,7 +5097,7 @@
         paramBuffer.addParam(std::move(bufsParam));
     }
 
-    return CallCapture(gl::EntryPoint::DrawBuffersEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDrawBuffersEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureBlendEquationSeparateiEXT(const State &glState,
@@ -5013,7 +5114,7 @@
     paramBuffer.addEnumParam("modeAlpha", GLenumGroup::BlendEquationModeEXT, ParamType::TGLenum,
                              modeAlpha);
 
-    return CallCapture(gl::EntryPoint::BlendEquationSeparateiEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBlendEquationSeparateiEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureBlendEquationiEXT(const State &glState,
@@ -5026,7 +5127,7 @@
     paramBuffer.addValueParam("buf", ParamType::TGLuint, buf);
     paramBuffer.addEnumParam("mode", GLenumGroup::BlendEquationModeEXT, ParamType::TGLenum, mode);
 
-    return CallCapture(gl::EntryPoint::BlendEquationiEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBlendEquationiEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureBlendFuncSeparateiEXT(const State &glState,
@@ -5045,7 +5146,7 @@
     paramBuffer.addEnumParam("srcAlpha", GLenumGroup::BlendingFactor, ParamType::TGLenum, srcAlpha);
     paramBuffer.addEnumParam("dstAlpha", GLenumGroup::BlendingFactor, ParamType::TGLenum, dstAlpha);
 
-    return CallCapture(gl::EntryPoint::BlendFuncSeparateiEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBlendFuncSeparateiEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureBlendFunciEXT(const State &glState,
@@ -5060,7 +5161,7 @@
     paramBuffer.addEnumParam("src", GLenumGroup::BlendingFactor, ParamType::TGLenum, src);
     paramBuffer.addEnumParam("dst", GLenumGroup::BlendingFactor, ParamType::TGLenum, dst);
 
-    return CallCapture(gl::EntryPoint::BlendFunciEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBlendFunciEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureColorMaskiEXT(const State &glState,
@@ -5079,7 +5180,7 @@
     paramBuffer.addValueParam("b", ParamType::TGLboolean, b);
     paramBuffer.addValueParam("a", ParamType::TGLboolean, a);
 
-    return CallCapture(gl::EntryPoint::ColorMaskiEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLColorMaskiEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureDisableiEXT(const State &glState, bool isCallValid, GLenum target, GLuint index)
@@ -5089,7 +5190,7 @@
     paramBuffer.addEnumParam("target", GLenumGroup::EnableCap, ParamType::TGLenum, target);
     paramBuffer.addValueParam("index", ParamType::TGLuint, index);
 
-    return CallCapture(gl::EntryPoint::DisableiEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDisableiEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureEnableiEXT(const State &glState, bool isCallValid, GLenum target, GLuint index)
@@ -5099,7 +5200,7 @@
     paramBuffer.addEnumParam("target", GLenumGroup::EnableCap, ParamType::TGLenum, target);
     paramBuffer.addValueParam("index", ParamType::TGLuint, index);
 
-    return CallCapture(gl::EntryPoint::EnableiEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLEnableiEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureIsEnablediEXT(const State &glState,
@@ -5117,7 +5218,7 @@
     InitParamValue(ParamType::TGLboolean, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::IsEnablediEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLIsEnablediEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureDrawElementsBaseVertexEXT(const State &glState,
@@ -5152,7 +5253,7 @@
 
     paramBuffer.addValueParam("basevertex", ParamType::TGLint, basevertex);
 
-    return CallCapture(gl::EntryPoint::DrawElementsBaseVertexEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDrawElementsBaseVertexEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureDrawElementsInstancedBaseVertexEXT(const State &glState,
@@ -5190,7 +5291,8 @@
     paramBuffer.addValueParam("instancecount", ParamType::TGLsizei, instancecount);
     paramBuffer.addValueParam("basevertex", ParamType::TGLint, basevertex);
 
-    return CallCapture(gl::EntryPoint::DrawElementsInstancedBaseVertexEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDrawElementsInstancedBaseVertexEXT,
+                       std::move(paramBuffer));
 }
 
 CallCapture CaptureDrawRangeElementsBaseVertexEXT(const State &glState,
@@ -5230,7 +5332,7 @@
 
     paramBuffer.addValueParam("basevertex", ParamType::TGLint, basevertex);
 
-    return CallCapture(gl::EntryPoint::DrawRangeElementsBaseVertexEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDrawRangeElementsBaseVertexEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureMultiDrawElementsBaseVertexEXT(const State &glState,
@@ -5301,7 +5403,7 @@
         paramBuffer.addParam(std::move(basevertexParam));
     }
 
-    return CallCapture(gl::EntryPoint::MultiDrawElementsBaseVertexEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLMultiDrawElementsBaseVertexEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureBufferStorageExternalEXT(const State &glState,
@@ -5321,7 +5423,7 @@
     paramBuffer.addEnumParam("flags", GLenumGroup::MapBufferUsageMask, ParamType::TGLbitfield,
                              flags);
 
-    return CallCapture(gl::EntryPoint::BufferStorageExternalEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBufferStorageExternalEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureNamedBufferStorageExternalEXT(const State &glState,
@@ -5341,7 +5443,7 @@
     paramBuffer.addEnumParam("flags", GLenumGroup::MapBufferUsageMask, ParamType::TGLbitfield,
                              flags);
 
-    return CallCapture(gl::EntryPoint::NamedBufferStorageExternalEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLNamedBufferStorageExternalEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureFramebufferTextureEXT(const State &glState,
@@ -5359,7 +5461,7 @@
     paramBuffer.addValueParam("texturePacked", ParamType::TTextureID, texturePacked);
     paramBuffer.addValueParam("level", ParamType::TGLint, level);
 
-    return CallCapture(gl::EntryPoint::FramebufferTextureEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLFramebufferTextureEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureDrawArraysInstancedEXT(const State &glState,
@@ -5376,7 +5478,7 @@
     paramBuffer.addValueParam("count", ParamType::TGLsizei, count);
     paramBuffer.addValueParam("primcount", ParamType::TGLsizei, primcount);
 
-    return CallCapture(gl::EntryPoint::DrawArraysInstancedEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDrawArraysInstancedEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureDrawElementsInstancedEXT(const State &glState,
@@ -5411,7 +5513,7 @@
 
     paramBuffer.addValueParam("primcount", ParamType::TGLsizei, primcount);
 
-    return CallCapture(gl::EntryPoint::DrawElementsInstancedEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDrawElementsInstancedEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureVertexAttribDivisorEXT(const State &glState,
@@ -5424,7 +5526,7 @@
     paramBuffer.addValueParam("index", ParamType::TGLuint, index);
     paramBuffer.addValueParam("divisor", ParamType::TGLuint, divisor);
 
-    return CallCapture(gl::EntryPoint::VertexAttribDivisorEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLVertexAttribDivisorEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureFlushMappedBufferRangeEXT(const State &glState,
@@ -5439,7 +5541,7 @@
     paramBuffer.addValueParam("offset", ParamType::TGLintptr, offset);
     paramBuffer.addValueParam("length", ParamType::TGLsizeiptr, length);
 
-    return CallCapture(gl::EntryPoint::FlushMappedBufferRangeEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLFlushMappedBufferRangeEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureMapBufferRangeEXT(const State &glState,
@@ -5462,7 +5564,7 @@
     InitParamValue(ParamType::TvoidPointer, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::MapBufferRangeEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLMapBufferRangeEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureBufferStorageMemEXT(const State &glState,
@@ -5479,7 +5581,7 @@
     paramBuffer.addValueParam("memoryPacked", ParamType::TMemoryObjectID, memoryPacked);
     paramBuffer.addValueParam("offset", ParamType::TGLuint64, offset);
 
-    return CallCapture(gl::EntryPoint::BufferStorageMemEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBufferStorageMemEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureCreateMemoryObjectsEXT(const State &glState,
@@ -5510,7 +5612,7 @@
         paramBuffer.addParam(std::move(memoryObjectsPackedParam));
     }
 
-    return CallCapture(gl::EntryPoint::CreateMemoryObjectsEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLCreateMemoryObjectsEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureDeleteMemoryObjectsEXT(const State &glState,
@@ -5542,7 +5644,7 @@
         paramBuffer.addParam(std::move(memoryObjectsPackedParam));
     }
 
-    return CallCapture(gl::EntryPoint::DeleteMemoryObjectsEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDeleteMemoryObjectsEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetMemoryObjectParameterivEXT(const State &glState,
@@ -5572,7 +5674,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetMemoryObjectParameterivEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetMemoryObjectParameterivEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetUnsignedBytevEXT(const State &glState,
@@ -5599,7 +5701,7 @@
         paramBuffer.addParam(std::move(dataParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetUnsignedBytevEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetUnsignedBytevEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetUnsignedBytei_vEXT(const State &glState,
@@ -5628,7 +5730,7 @@
         paramBuffer.addParam(std::move(dataParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetUnsignedBytei_vEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetUnsignedBytei_vEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureIsMemoryObjectEXT(const State &glState,
@@ -5644,7 +5746,7 @@
     InitParamValue(ParamType::TGLboolean, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::IsMemoryObjectEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLIsMemoryObjectEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureMemoryObjectParameterivEXT(const State &glState,
@@ -5675,7 +5777,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::MemoryObjectParameterivEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLMemoryObjectParameterivEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexStorageMem2DEXT(const State &glState,
@@ -5699,7 +5801,7 @@
     paramBuffer.addValueParam("memoryPacked", ParamType::TMemoryObjectID, memoryPacked);
     paramBuffer.addValueParam("offset", ParamType::TGLuint64, offset);
 
-    return CallCapture(gl::EntryPoint::TexStorageMem2DEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexStorageMem2DEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexStorageMem2DMultisampleEXT(const State &glState,
@@ -5725,7 +5827,7 @@
     paramBuffer.addValueParam("memoryPacked", ParamType::TMemoryObjectID, memoryPacked);
     paramBuffer.addValueParam("offset", ParamType::TGLuint64, offset);
 
-    return CallCapture(gl::EntryPoint::TexStorageMem2DMultisampleEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexStorageMem2DMultisampleEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexStorageMem3DEXT(const State &glState,
@@ -5751,7 +5853,7 @@
     paramBuffer.addValueParam("memoryPacked", ParamType::TMemoryObjectID, memoryPacked);
     paramBuffer.addValueParam("offset", ParamType::TGLuint64, offset);
 
-    return CallCapture(gl::EntryPoint::TexStorageMem3DEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexStorageMem3DEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexStorageMem3DMultisampleEXT(const State &glState,
@@ -5779,7 +5881,7 @@
     paramBuffer.addValueParam("memoryPacked", ParamType::TMemoryObjectID, memoryPacked);
     paramBuffer.addValueParam("offset", ParamType::TGLuint64, offset);
 
-    return CallCapture(gl::EntryPoint::TexStorageMem3DMultisampleEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexStorageMem3DMultisampleEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureImportMemoryFdEXT(const State &glState,
@@ -5796,7 +5898,7 @@
     paramBuffer.addValueParam("handleTypePacked", ParamType::THandleType, handleTypePacked);
     paramBuffer.addValueParam("fd", ParamType::TGLint, fd);
 
-    return CallCapture(gl::EntryPoint::ImportMemoryFdEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLImportMemoryFdEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureFramebufferTexture2DMultisampleEXT(const State &glState,
@@ -5818,7 +5920,8 @@
     paramBuffer.addValueParam("level", ParamType::TGLint, level);
     paramBuffer.addValueParam("samples", ParamType::TGLsizei, samples);
 
-    return CallCapture(gl::EntryPoint::FramebufferTexture2DMultisampleEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLFramebufferTexture2DMultisampleEXT,
+                       std::move(paramBuffer));
 }
 
 CallCapture CaptureRenderbufferStorageMultisampleEXT(const State &glState,
@@ -5838,7 +5941,8 @@
     paramBuffer.addValueParam("width", ParamType::TGLsizei, width);
     paramBuffer.addValueParam("height", ParamType::TGLsizei, height);
 
-    return CallCapture(gl::EntryPoint::RenderbufferStorageMultisampleEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLRenderbufferStorageMultisampleEXT,
+                       std::move(paramBuffer));
 }
 
 CallCapture CaptureGetGraphicsResetStatusEXT(const State &glState,
@@ -5851,7 +5955,7 @@
     InitParamValue(ParamType::TGLenum, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::GetGraphicsResetStatusEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetGraphicsResetStatusEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetnUniformfvEXT(const State &glState,
@@ -5883,7 +5987,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetnUniformfvEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetnUniformfvEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetnUniformivEXT(const State &glState,
@@ -5914,7 +6018,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetnUniformivEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetnUniformivEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureReadnPixelsEXT(const State &glState,
@@ -5953,7 +6057,7 @@
         paramBuffer.addParam(std::move(dataParam));
     }
 
-    return CallCapture(gl::EntryPoint::ReadnPixelsEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLReadnPixelsEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureDeleteSemaphoresEXT(const State &glState,
@@ -5982,7 +6086,7 @@
         paramBuffer.addParam(std::move(semaphoresPackedParam));
     }
 
-    return CallCapture(gl::EntryPoint::DeleteSemaphoresEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDeleteSemaphoresEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureGenSemaphoresEXT(const State &glState,
@@ -6011,7 +6115,7 @@
         paramBuffer.addParam(std::move(semaphoresPackedParam));
     }
 
-    return CallCapture(gl::EntryPoint::GenSemaphoresEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGenSemaphoresEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetSemaphoreParameterui64vEXT(const State &glState,
@@ -6042,7 +6146,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetSemaphoreParameterui64vEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetSemaphoreParameterui64vEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureIsSemaphoreEXT(const State &glState,
@@ -6058,7 +6162,7 @@
     InitParamValue(ParamType::TGLboolean, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::IsSemaphoreEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLIsSemaphoreEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureSemaphoreParameterui64vEXT(const State &glState,
@@ -6089,7 +6193,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::SemaphoreParameterui64vEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLSemaphoreParameterui64vEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureSignalSemaphoreEXT(const State &glState,
@@ -6160,7 +6264,7 @@
         paramBuffer.addParam(std::move(dstLayoutsParam));
     }
 
-    return CallCapture(gl::EntryPoint::SignalSemaphoreEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLSignalSemaphoreEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureWaitSemaphoreEXT(const State &glState,
@@ -6231,7 +6335,7 @@
         paramBuffer.addParam(std::move(srcLayoutsParam));
     }
 
-    return CallCapture(gl::EntryPoint::WaitSemaphoreEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLWaitSemaphoreEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureImportSemaphoreFdEXT(const State &glState,
@@ -6246,7 +6350,7 @@
     paramBuffer.addValueParam("handleTypePacked", ParamType::THandleType, handleTypePacked);
     paramBuffer.addValueParam("fd", ParamType::TGLint, fd);
 
-    return CallCapture(gl::EntryPoint::ImportSemaphoreFdEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLImportSemaphoreFdEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureActiveShaderProgramEXT(const State &glState,
@@ -6259,7 +6363,7 @@
     paramBuffer.addValueParam("pipelinePacked", ParamType::TProgramPipelineID, pipelinePacked);
     paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
 
-    return CallCapture(gl::EntryPoint::ActiveShaderProgramEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLActiveShaderProgramEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureBindProgramPipelineEXT(const State &glState,
@@ -6270,7 +6374,7 @@
 
     paramBuffer.addValueParam("pipelinePacked", ParamType::TProgramPipelineID, pipelinePacked);
 
-    return CallCapture(gl::EntryPoint::BindProgramPipelineEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBindProgramPipelineEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureCreateShaderProgramvEXT(const State &glState,
@@ -6305,7 +6409,7 @@
     InitParamValue(ParamType::TGLuint, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::CreateShaderProgramvEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLCreateShaderProgramvEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureDeleteProgramPipelinesEXT(const State &glState,
@@ -6337,7 +6441,7 @@
         paramBuffer.addParam(std::move(pipelinesPackedParam));
     }
 
-    return CallCapture(gl::EntryPoint::DeleteProgramPipelinesEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDeleteProgramPipelinesEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureGenProgramPipelinesEXT(const State &glState,
@@ -6366,7 +6470,7 @@
         paramBuffer.addParam(std::move(pipelinesPackedParam));
     }
 
-    return CallCapture(gl::EntryPoint::GenProgramPipelinesEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGenProgramPipelinesEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetProgramPipelineInfoLogEXT(const State &glState,
@@ -6413,7 +6517,7 @@
         paramBuffer.addParam(std::move(infoLogParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetProgramPipelineInfoLogEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetProgramPipelineInfoLogEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetProgramPipelineivEXT(const State &glState,
@@ -6443,7 +6547,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetProgramPipelineivEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetProgramPipelineivEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureIsProgramPipelineEXT(const State &glState,
@@ -6459,7 +6563,7 @@
     InitParamValue(ParamType::TGLboolean, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::IsProgramPipelineEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLIsProgramPipelineEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramParameteriEXT(const State &glState,
@@ -6475,7 +6579,7 @@
                              pname);
     paramBuffer.addValueParam("value", ParamType::TGLint, value);
 
-    return CallCapture(gl::EntryPoint::ProgramParameteriEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramParameteriEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform1fEXT(const State &glState,
@@ -6490,7 +6594,7 @@
     paramBuffer.addValueParam("locationPacked", ParamType::TUniformLocation, locationPacked);
     paramBuffer.addValueParam("v0", ParamType::TGLfloat, v0);
 
-    return CallCapture(gl::EntryPoint::ProgramUniform1fEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform1fEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform1fvEXT(const State &glState,
@@ -6522,7 +6626,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniform1fvEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform1fvEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform1iEXT(const State &glState,
@@ -6537,7 +6641,7 @@
     paramBuffer.addValueParam("locationPacked", ParamType::TUniformLocation, locationPacked);
     paramBuffer.addValueParam("v0", ParamType::TGLint, v0);
 
-    return CallCapture(gl::EntryPoint::ProgramUniform1iEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform1iEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform1ivEXT(const State &glState,
@@ -6569,7 +6673,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniform1ivEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform1ivEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform1uiEXT(const State &glState,
@@ -6584,7 +6688,7 @@
     paramBuffer.addValueParam("locationPacked", ParamType::TUniformLocation, locationPacked);
     paramBuffer.addValueParam("v0", ParamType::TGLuint, v0);
 
-    return CallCapture(gl::EntryPoint::ProgramUniform1uiEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform1uiEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform1uivEXT(const State &glState,
@@ -6616,7 +6720,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniform1uivEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform1uivEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform2fEXT(const State &glState,
@@ -6633,7 +6737,7 @@
     paramBuffer.addValueParam("v0", ParamType::TGLfloat, v0);
     paramBuffer.addValueParam("v1", ParamType::TGLfloat, v1);
 
-    return CallCapture(gl::EntryPoint::ProgramUniform2fEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform2fEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform2fvEXT(const State &glState,
@@ -6665,7 +6769,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniform2fvEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform2fvEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform2iEXT(const State &glState,
@@ -6682,7 +6786,7 @@
     paramBuffer.addValueParam("v0", ParamType::TGLint, v0);
     paramBuffer.addValueParam("v1", ParamType::TGLint, v1);
 
-    return CallCapture(gl::EntryPoint::ProgramUniform2iEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform2iEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform2ivEXT(const State &glState,
@@ -6714,7 +6818,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniform2ivEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform2ivEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform2uiEXT(const State &glState,
@@ -6731,7 +6835,7 @@
     paramBuffer.addValueParam("v0", ParamType::TGLuint, v0);
     paramBuffer.addValueParam("v1", ParamType::TGLuint, v1);
 
-    return CallCapture(gl::EntryPoint::ProgramUniform2uiEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform2uiEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform2uivEXT(const State &glState,
@@ -6763,7 +6867,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniform2uivEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform2uivEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform3fEXT(const State &glState,
@@ -6782,7 +6886,7 @@
     paramBuffer.addValueParam("v1", ParamType::TGLfloat, v1);
     paramBuffer.addValueParam("v2", ParamType::TGLfloat, v2);
 
-    return CallCapture(gl::EntryPoint::ProgramUniform3fEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform3fEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform3fvEXT(const State &glState,
@@ -6814,7 +6918,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniform3fvEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform3fvEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform3iEXT(const State &glState,
@@ -6833,7 +6937,7 @@
     paramBuffer.addValueParam("v1", ParamType::TGLint, v1);
     paramBuffer.addValueParam("v2", ParamType::TGLint, v2);
 
-    return CallCapture(gl::EntryPoint::ProgramUniform3iEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform3iEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform3ivEXT(const State &glState,
@@ -6865,7 +6969,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniform3ivEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform3ivEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform3uiEXT(const State &glState,
@@ -6884,7 +6988,7 @@
     paramBuffer.addValueParam("v1", ParamType::TGLuint, v1);
     paramBuffer.addValueParam("v2", ParamType::TGLuint, v2);
 
-    return CallCapture(gl::EntryPoint::ProgramUniform3uiEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform3uiEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform3uivEXT(const State &glState,
@@ -6916,7 +7020,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniform3uivEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform3uivEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform4fEXT(const State &glState,
@@ -6937,7 +7041,7 @@
     paramBuffer.addValueParam("v2", ParamType::TGLfloat, v2);
     paramBuffer.addValueParam("v3", ParamType::TGLfloat, v3);
 
-    return CallCapture(gl::EntryPoint::ProgramUniform4fEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform4fEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform4fvEXT(const State &glState,
@@ -6969,7 +7073,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniform4fvEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform4fvEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform4iEXT(const State &glState,
@@ -6990,7 +7094,7 @@
     paramBuffer.addValueParam("v2", ParamType::TGLint, v2);
     paramBuffer.addValueParam("v3", ParamType::TGLint, v3);
 
-    return CallCapture(gl::EntryPoint::ProgramUniform4iEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform4iEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform4ivEXT(const State &glState,
@@ -7022,7 +7126,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniform4ivEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform4ivEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform4uiEXT(const State &glState,
@@ -7043,7 +7147,7 @@
     paramBuffer.addValueParam("v2", ParamType::TGLuint, v2);
     paramBuffer.addValueParam("v3", ParamType::TGLuint, v3);
 
-    return CallCapture(gl::EntryPoint::ProgramUniform4uiEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform4uiEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniform4uivEXT(const State &glState,
@@ -7075,7 +7179,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniform4uivEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniform4uivEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniformMatrix2fvEXT(const State &glState,
@@ -7109,7 +7213,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniformMatrix2fvEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniformMatrix2fvEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniformMatrix2x3fvEXT(const State &glState,
@@ -7144,7 +7248,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniformMatrix2x3fvEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniformMatrix2x3fvEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniformMatrix2x4fvEXT(const State &glState,
@@ -7179,7 +7283,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniformMatrix2x4fvEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniformMatrix2x4fvEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniformMatrix3fvEXT(const State &glState,
@@ -7213,7 +7317,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniformMatrix3fvEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniformMatrix3fvEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniformMatrix3x2fvEXT(const State &glState,
@@ -7248,7 +7352,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniformMatrix3x2fvEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniformMatrix3x2fvEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniformMatrix3x4fvEXT(const State &glState,
@@ -7283,7 +7387,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniformMatrix3x4fvEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniformMatrix3x4fvEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniformMatrix4fvEXT(const State &glState,
@@ -7317,7 +7421,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniformMatrix4fvEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniformMatrix4fvEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniformMatrix4x2fvEXT(const State &glState,
@@ -7352,7 +7456,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniformMatrix4x2fvEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniformMatrix4x2fvEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramUniformMatrix4x3fvEXT(const State &glState,
@@ -7387,7 +7491,7 @@
         paramBuffer.addParam(std::move(valueParam));
     }
 
-    return CallCapture(gl::EntryPoint::ProgramUniformMatrix4x3fvEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramUniformMatrix4x3fvEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureUseProgramStagesEXT(const State &glState,
@@ -7403,7 +7507,7 @@
                              stages);
     paramBuffer.addValueParam("programPacked", ParamType::TShaderProgramID, programPacked);
 
-    return CallCapture(gl::EntryPoint::UseProgramStagesEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLUseProgramStagesEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureValidateProgramPipelineEXT(const State &glState,
@@ -7414,7 +7518,7 @@
 
     paramBuffer.addValueParam("pipelinePacked", ParamType::TProgramPipelineID, pipelinePacked);
 
-    return CallCapture(gl::EntryPoint::ValidateProgramPipelineEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLValidateProgramPipelineEXT, std::move(paramBuffer));
 }
 
 CallCapture CapturePatchParameteriEXT(const State &glState,
@@ -7427,7 +7531,7 @@
     paramBuffer.addEnumParam("pname", GLenumGroup::PatchParameterName, ParamType::TGLenum, pname);
     paramBuffer.addValueParam("value", ParamType::TGLint, value);
 
-    return CallCapture(gl::EntryPoint::PatchParameteriEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLPatchParameteriEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexBufferEXT(const State &glState,
@@ -7443,7 +7547,7 @@
                              internalformat);
     paramBuffer.addValueParam("bufferPacked", ParamType::TBufferID, bufferPacked);
 
-    return CallCapture(gl::EntryPoint::TexBufferEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexBufferEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexBufferRangeEXT(const State &glState,
@@ -7463,7 +7567,7 @@
     paramBuffer.addValueParam("offset", ParamType::TGLintptr, offset);
     paramBuffer.addValueParam("size", ParamType::TGLsizeiptr, size);
 
-    return CallCapture(gl::EntryPoint::TexBufferRangeEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexBufferRangeEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexStorage1DEXT(const State &glState,
@@ -7481,7 +7585,7 @@
                              internalformat);
     paramBuffer.addValueParam("width", ParamType::TGLsizei, width);
 
-    return CallCapture(gl::EntryPoint::TexStorage1DEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexStorage1DEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexStorage2DEXT(const State &glState,
@@ -7501,7 +7605,7 @@
     paramBuffer.addValueParam("width", ParamType::TGLsizei, width);
     paramBuffer.addValueParam("height", ParamType::TGLsizei, height);
 
-    return CallCapture(gl::EntryPoint::TexStorage2DEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexStorage2DEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexStorage3DEXT(const State &glState,
@@ -7523,7 +7627,7 @@
     paramBuffer.addValueParam("height", ParamType::TGLsizei, height);
     paramBuffer.addValueParam("depth", ParamType::TGLsizei, depth);
 
-    return CallCapture(gl::EntryPoint::TexStorage3DEXT, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexStorage3DEXT, std::move(paramBuffer));
 }
 
 CallCapture CaptureDebugMessageCallbackKHR(const State &glState,
@@ -7551,7 +7655,7 @@
         paramBuffer.addParam(std::move(userParamParam));
     }
 
-    return CallCapture(gl::EntryPoint::DebugMessageCallbackKHR, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDebugMessageCallbackKHR, std::move(paramBuffer));
 }
 
 CallCapture CaptureDebugMessageControlKHR(const State &glState,
@@ -7588,7 +7692,7 @@
 
     paramBuffer.addValueParam("enabled", ParamType::TGLboolean, enabled);
 
-    return CallCapture(gl::EntryPoint::DebugMessageControlKHR, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDebugMessageControlKHR, std::move(paramBuffer));
 }
 
 CallCapture CaptureDebugMessageInsertKHR(const State &glState,
@@ -7624,7 +7728,7 @@
         paramBuffer.addParam(std::move(bufParam));
     }
 
-    return CallCapture(gl::EntryPoint::DebugMessageInsertKHR, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDebugMessageInsertKHR, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetDebugMessageLogKHR(const State &glState,
@@ -7745,7 +7849,7 @@
     InitParamValue(ParamType::TGLuint, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::GetDebugMessageLogKHR, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetDebugMessageLogKHR, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetObjectLabelKHR(const State &glState,
@@ -7795,7 +7899,7 @@
         paramBuffer.addParam(std::move(labelParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetObjectLabelKHR, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetObjectLabelKHR, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetObjectPtrLabelKHR(const State &glState,
@@ -7857,7 +7961,7 @@
         paramBuffer.addParam(std::move(labelParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetObjectPtrLabelKHR, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetObjectPtrLabelKHR, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetPointervKHR(const State &glState,
@@ -7884,7 +7988,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetPointervKHR, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetPointervKHR, std::move(paramBuffer));
 }
 
 CallCapture CaptureObjectLabelKHR(const State &glState,
@@ -7917,7 +8021,7 @@
         paramBuffer.addParam(std::move(labelParam));
     }
 
-    return CallCapture(gl::EntryPoint::ObjectLabelKHR, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLObjectLabelKHR, std::move(paramBuffer));
 }
 
 CallCapture CaptureObjectPtrLabelKHR(const State &glState,
@@ -7960,14 +8064,14 @@
         paramBuffer.addParam(std::move(labelParam));
     }
 
-    return CallCapture(gl::EntryPoint::ObjectPtrLabelKHR, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLObjectPtrLabelKHR, std::move(paramBuffer));
 }
 
 CallCapture CapturePopDebugGroupKHR(const State &glState, bool isCallValid)
 {
     ParamBuffer paramBuffer;
 
-    return CallCapture(gl::EntryPoint::PopDebugGroupKHR, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLPopDebugGroupKHR, std::move(paramBuffer));
 }
 
 CallCapture CapturePushDebugGroupKHR(const State &glState,
@@ -7999,7 +8103,7 @@
         paramBuffer.addParam(std::move(messageParam));
     }
 
-    return CallCapture(gl::EntryPoint::PushDebugGroupKHR, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLPushDebugGroupKHR, std::move(paramBuffer));
 }
 
 CallCapture CaptureMaxShaderCompilerThreadsKHR(const State &glState, bool isCallValid, GLuint count)
@@ -8008,7 +8112,7 @@
 
     paramBuffer.addValueParam("count", ParamType::TGLuint, count);
 
-    return CallCapture(gl::EntryPoint::MaxShaderCompilerThreadsKHR, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLMaxShaderCompilerThreadsKHR, std::move(paramBuffer));
 }
 
 CallCapture CaptureDeleteFencesNV(const State &glState,
@@ -8036,7 +8140,7 @@
         paramBuffer.addParam(std::move(fencesPackedParam));
     }
 
-    return CallCapture(gl::EntryPoint::DeleteFencesNV, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDeleteFencesNV, std::move(paramBuffer));
 }
 
 CallCapture CaptureFinishFenceNV(const State &glState, bool isCallValid, FenceNVID fencePacked)
@@ -8045,7 +8149,7 @@
 
     paramBuffer.addValueParam("fencePacked", ParamType::TFenceNVID, fencePacked);
 
-    return CallCapture(gl::EntryPoint::FinishFenceNV, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLFinishFenceNV, std::move(paramBuffer));
 }
 
 CallCapture CaptureGenFencesNV(const State &glState,
@@ -8072,7 +8176,7 @@
         paramBuffer.addParam(std::move(fencesPackedParam));
     }
 
-    return CallCapture(gl::EntryPoint::GenFencesNV, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGenFencesNV, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetFenceivNV(const State &glState,
@@ -8100,7 +8204,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetFenceivNV, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetFenceivNV, std::move(paramBuffer));
 }
 
 CallCapture CaptureIsFenceNV(const State &glState,
@@ -8116,7 +8220,7 @@
     InitParamValue(ParamType::TGLboolean, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::IsFenceNV, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLIsFenceNV, std::move(paramBuffer));
 }
 
 CallCapture CaptureSetFenceNV(const State &glState,
@@ -8129,7 +8233,7 @@
     paramBuffer.addValueParam("fencePacked", ParamType::TFenceNVID, fencePacked);
     paramBuffer.addEnumParam("condition", GLenumGroup::DefaultGroup, ParamType::TGLenum, condition);
 
-    return CallCapture(gl::EntryPoint::SetFenceNV, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLSetFenceNV, std::move(paramBuffer));
 }
 
 CallCapture CaptureTestFenceNV(const State &glState,
@@ -8145,7 +8249,7 @@
     InitParamValue(ParamType::TGLboolean, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::TestFenceNV, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTestFenceNV, std::move(paramBuffer));
 }
 
 CallCapture CaptureEGLImageTargetRenderbufferStorageOES(const State &glState,
@@ -8158,7 +8262,7 @@
     paramBuffer.addEnumParam("target", GLenumGroup::DefaultGroup, ParamType::TGLenum, target);
     paramBuffer.addValueParam("image", ParamType::TGLeglImageOES, image);
 
-    return CallCapture(gl::EntryPoint::EGLImageTargetRenderbufferStorageOES,
+    return CallCapture(angle::EntryPoint::GLEGLImageTargetRenderbufferStorageOES,
                        std::move(paramBuffer));
 }
 
@@ -8172,7 +8276,7 @@
     paramBuffer.addValueParam("targetPacked", ParamType::TTextureType, targetPacked);
     paramBuffer.addValueParam("image", ParamType::TGLeglImageOES, image);
 
-    return CallCapture(gl::EntryPoint::EGLImageTargetTexture2DOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLEGLImageTargetTexture2DOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureCopyImageSubDataOES(const State &glState,
@@ -8213,7 +8317,7 @@
     paramBuffer.addValueParam("srcHeight", ParamType::TGLsizei, srcHeight);
     paramBuffer.addValueParam("srcDepth", ParamType::TGLsizei, srcDepth);
 
-    return CallCapture(gl::EntryPoint::CopyImageSubDataOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLCopyImageSubDataOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureBlendEquationSeparateiOES(const State &glState,
@@ -8230,7 +8334,7 @@
     paramBuffer.addEnumParam("modeAlpha", GLenumGroup::BlendEquationModeEXT, ParamType::TGLenum,
                              modeAlpha);
 
-    return CallCapture(gl::EntryPoint::BlendEquationSeparateiOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBlendEquationSeparateiOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureBlendEquationiOES(const State &glState,
@@ -8243,7 +8347,7 @@
     paramBuffer.addValueParam("buf", ParamType::TGLuint, buf);
     paramBuffer.addEnumParam("mode", GLenumGroup::BlendEquationModeEXT, ParamType::TGLenum, mode);
 
-    return CallCapture(gl::EntryPoint::BlendEquationiOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBlendEquationiOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureBlendFuncSeparateiOES(const State &glState,
@@ -8262,7 +8366,7 @@
     paramBuffer.addEnumParam("srcAlpha", GLenumGroup::BlendingFactor, ParamType::TGLenum, srcAlpha);
     paramBuffer.addEnumParam("dstAlpha", GLenumGroup::BlendingFactor, ParamType::TGLenum, dstAlpha);
 
-    return CallCapture(gl::EntryPoint::BlendFuncSeparateiOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBlendFuncSeparateiOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureBlendFunciOES(const State &glState,
@@ -8277,7 +8381,7 @@
     paramBuffer.addEnumParam("src", GLenumGroup::BlendingFactor, ParamType::TGLenum, src);
     paramBuffer.addEnumParam("dst", GLenumGroup::BlendingFactor, ParamType::TGLenum, dst);
 
-    return CallCapture(gl::EntryPoint::BlendFunciOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBlendFunciOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureColorMaskiOES(const State &glState,
@@ -8296,7 +8400,7 @@
     paramBuffer.addValueParam("b", ParamType::TGLboolean, b);
     paramBuffer.addValueParam("a", ParamType::TGLboolean, a);
 
-    return CallCapture(gl::EntryPoint::ColorMaskiOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLColorMaskiOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureDisableiOES(const State &glState, bool isCallValid, GLenum target, GLuint index)
@@ -8306,7 +8410,7 @@
     paramBuffer.addEnumParam("target", GLenumGroup::EnableCap, ParamType::TGLenum, target);
     paramBuffer.addValueParam("index", ParamType::TGLuint, index);
 
-    return CallCapture(gl::EntryPoint::DisableiOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDisableiOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureEnableiOES(const State &glState, bool isCallValid, GLenum target, GLuint index)
@@ -8316,7 +8420,7 @@
     paramBuffer.addEnumParam("target", GLenumGroup::EnableCap, ParamType::TGLenum, target);
     paramBuffer.addValueParam("index", ParamType::TGLuint, index);
 
-    return CallCapture(gl::EntryPoint::EnableiOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLEnableiOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureIsEnablediOES(const State &glState,
@@ -8334,7 +8438,7 @@
     InitParamValue(ParamType::TGLboolean, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::IsEnablediOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLIsEnablediOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureDrawElementsBaseVertexOES(const State &glState,
@@ -8369,7 +8473,7 @@
 
     paramBuffer.addValueParam("basevertex", ParamType::TGLint, basevertex);
 
-    return CallCapture(gl::EntryPoint::DrawElementsBaseVertexOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDrawElementsBaseVertexOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureDrawElementsInstancedBaseVertexOES(const State &glState,
@@ -8407,7 +8511,8 @@
     paramBuffer.addValueParam("instancecount", ParamType::TGLsizei, instancecount);
     paramBuffer.addValueParam("basevertex", ParamType::TGLint, basevertex);
 
-    return CallCapture(gl::EntryPoint::DrawElementsInstancedBaseVertexOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDrawElementsInstancedBaseVertexOES,
+                       std::move(paramBuffer));
 }
 
 CallCapture CaptureDrawRangeElementsBaseVertexOES(const State &glState,
@@ -8447,7 +8552,7 @@
 
     paramBuffer.addValueParam("basevertex", ParamType::TGLint, basevertex);
 
-    return CallCapture(gl::EntryPoint::DrawRangeElementsBaseVertexOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDrawRangeElementsBaseVertexOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureDrawTexfOES(const State &glState,
@@ -8466,7 +8571,7 @@
     paramBuffer.addValueParam("width", ParamType::TGLfloat, width);
     paramBuffer.addValueParam("height", ParamType::TGLfloat, height);
 
-    return CallCapture(gl::EntryPoint::DrawTexfOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDrawTexfOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureDrawTexfvOES(const State &glState, bool isCallValid, const GLfloat *coords)
@@ -8488,7 +8593,7 @@
         paramBuffer.addParam(std::move(coordsParam));
     }
 
-    return CallCapture(gl::EntryPoint::DrawTexfvOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDrawTexfvOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureDrawTexiOES(const State &glState,
@@ -8507,7 +8612,7 @@
     paramBuffer.addValueParam("width", ParamType::TGLint, width);
     paramBuffer.addValueParam("height", ParamType::TGLint, height);
 
-    return CallCapture(gl::EntryPoint::DrawTexiOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDrawTexiOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureDrawTexivOES(const State &glState, bool isCallValid, const GLint *coords)
@@ -8529,7 +8634,7 @@
         paramBuffer.addParam(std::move(coordsParam));
     }
 
-    return CallCapture(gl::EntryPoint::DrawTexivOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDrawTexivOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureDrawTexsOES(const State &glState,
@@ -8548,7 +8653,7 @@
     paramBuffer.addValueParam("width", ParamType::TGLshort, width);
     paramBuffer.addValueParam("height", ParamType::TGLshort, height);
 
-    return CallCapture(gl::EntryPoint::DrawTexsOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDrawTexsOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureDrawTexsvOES(const State &glState, bool isCallValid, const GLshort *coords)
@@ -8570,7 +8675,7 @@
         paramBuffer.addParam(std::move(coordsParam));
     }
 
-    return CallCapture(gl::EntryPoint::DrawTexsvOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDrawTexsvOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureDrawTexxOES(const State &glState,
@@ -8589,7 +8694,7 @@
     paramBuffer.addValueParam("width", ParamType::TGLfixed, width);
     paramBuffer.addValueParam("height", ParamType::TGLfixed, height);
 
-    return CallCapture(gl::EntryPoint::DrawTexxOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDrawTexxOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureDrawTexxvOES(const State &glState, bool isCallValid, const GLfixed *coords)
@@ -8611,7 +8716,7 @@
         paramBuffer.addParam(std::move(coordsParam));
     }
 
-    return CallCapture(gl::EntryPoint::DrawTexxvOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDrawTexxvOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureBindFramebufferOES(const State &glState,
@@ -8624,7 +8729,7 @@
     paramBuffer.addEnumParam("target", GLenumGroup::FramebufferTarget, ParamType::TGLenum, target);
     paramBuffer.addValueParam("framebufferPacked", ParamType::TFramebufferID, framebufferPacked);
 
-    return CallCapture(gl::EntryPoint::BindFramebufferOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBindFramebufferOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureBindRenderbufferOES(const State &glState,
@@ -8637,7 +8742,7 @@
     paramBuffer.addEnumParam("target", GLenumGroup::RenderbufferTarget, ParamType::TGLenum, target);
     paramBuffer.addValueParam("renderbufferPacked", ParamType::TRenderbufferID, renderbufferPacked);
 
-    return CallCapture(gl::EntryPoint::BindRenderbufferOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBindRenderbufferOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureCheckFramebufferStatusOES(const State &glState,
@@ -8653,7 +8758,7 @@
     InitParamValue(ParamType::TGLenum, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::CheckFramebufferStatusOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLCheckFramebufferStatusOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureDeleteFramebuffersOES(const State &glState,
@@ -8684,7 +8789,7 @@
         paramBuffer.addParam(std::move(framebuffersPackedParam));
     }
 
-    return CallCapture(gl::EntryPoint::DeleteFramebuffersOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDeleteFramebuffersOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureDeleteRenderbuffersOES(const State &glState,
@@ -8716,7 +8821,7 @@
         paramBuffer.addParam(std::move(renderbuffersPackedParam));
     }
 
-    return CallCapture(gl::EntryPoint::DeleteRenderbuffersOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDeleteRenderbuffersOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureFramebufferRenderbufferOES(const State &glState,
@@ -8735,7 +8840,7 @@
                              ParamType::TGLenum, renderbuffertarget);
     paramBuffer.addValueParam("renderbufferPacked", ParamType::TRenderbufferID, renderbufferPacked);
 
-    return CallCapture(gl::EntryPoint::FramebufferRenderbufferOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLFramebufferRenderbufferOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureFramebufferTexture2DOES(const State &glState,
@@ -8755,7 +8860,7 @@
     paramBuffer.addValueParam("texturePacked", ParamType::TTextureID, texturePacked);
     paramBuffer.addValueParam("level", ParamType::TGLint, level);
 
-    return CallCapture(gl::EntryPoint::FramebufferTexture2DOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLFramebufferTexture2DOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureGenFramebuffersOES(const State &glState,
@@ -8786,7 +8891,7 @@
         paramBuffer.addParam(std::move(framebuffersPackedParam));
     }
 
-    return CallCapture(gl::EntryPoint::GenFramebuffersOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGenFramebuffersOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureGenRenderbuffersOES(const State &glState,
@@ -8817,7 +8922,7 @@
         paramBuffer.addParam(std::move(renderbuffersPackedParam));
     }
 
-    return CallCapture(gl::EntryPoint::GenRenderbuffersOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGenRenderbuffersOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureGenerateMipmapOES(const State &glState,
@@ -8828,7 +8933,7 @@
 
     paramBuffer.addValueParam("targetPacked", ParamType::TTextureType, targetPacked);
 
-    return CallCapture(gl::EntryPoint::GenerateMipmapOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGenerateMipmapOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetFramebufferAttachmentParameterivOES(const State &glState,
@@ -8861,7 +8966,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetFramebufferAttachmentParameterivOES,
+    return CallCapture(angle::EntryPoint::GLGetFramebufferAttachmentParameterivOES,
                        std::move(paramBuffer));
 }
 
@@ -8892,7 +8997,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetRenderbufferParameterivOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetRenderbufferParameterivOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureIsFramebufferOES(const State &glState,
@@ -8908,7 +9013,7 @@
     InitParamValue(ParamType::TGLboolean, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::IsFramebufferOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLIsFramebufferOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureIsRenderbufferOES(const State &glState,
@@ -8924,7 +9029,7 @@
     InitParamValue(ParamType::TGLboolean, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::IsRenderbufferOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLIsRenderbufferOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureRenderbufferStorageOES(const State &glState,
@@ -8942,7 +9047,7 @@
     paramBuffer.addValueParam("width", ParamType::TGLsizei, width);
     paramBuffer.addValueParam("height", ParamType::TGLsizei, height);
 
-    return CallCapture(gl::EntryPoint::RenderbufferStorageOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLRenderbufferStorageOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetProgramBinaryOES(const State &glState,
@@ -9005,7 +9110,7 @@
         paramBuffer.addParam(std::move(binaryParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetProgramBinaryOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetProgramBinaryOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureProgramBinaryOES(const State &glState,
@@ -9039,7 +9144,7 @@
 
     paramBuffer.addValueParam("length", ParamType::TGLint, length);
 
-    return CallCapture(gl::EntryPoint::ProgramBinaryOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLProgramBinaryOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetBufferPointervOES(const State &glState,
@@ -9069,7 +9174,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetBufferPointervOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetBufferPointervOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureMapBufferOES(const State &glState,
@@ -9087,7 +9192,7 @@
     InitParamValue(ParamType::TvoidPointer, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::MapBufferOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLMapBufferOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureUnmapBufferOES(const State &glState,
@@ -9103,7 +9208,7 @@
     InitParamValue(ParamType::TGLboolean, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::UnmapBufferOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLUnmapBufferOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureCurrentPaletteMatrixOES(const State &glState,
@@ -9114,14 +9219,15 @@
 
     paramBuffer.addValueParam("matrixpaletteindex", ParamType::TGLuint, matrixpaletteindex);
 
-    return CallCapture(gl::EntryPoint::CurrentPaletteMatrixOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLCurrentPaletteMatrixOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureLoadPaletteFromModelViewMatrixOES(const State &glState, bool isCallValid)
 {
     ParamBuffer paramBuffer;
 
-    return CallCapture(gl::EntryPoint::LoadPaletteFromModelViewMatrixOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLLoadPaletteFromModelViewMatrixOES,
+                       std::move(paramBuffer));
 }
 
 CallCapture CaptureMatrixIndexPointerOES(const State &glState,
@@ -9153,7 +9259,7 @@
         paramBuffer.addParam(std::move(pointerParam));
     }
 
-    return CallCapture(gl::EntryPoint::MatrixIndexPointerOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLMatrixIndexPointerOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureWeightPointerOES(const State &glState,
@@ -9185,7 +9291,7 @@
         paramBuffer.addParam(std::move(pointerParam));
     }
 
-    return CallCapture(gl::EntryPoint::WeightPointerOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLWeightPointerOES, std::move(paramBuffer));
 }
 
 CallCapture CapturePointSizePointerOES(const State &glState,
@@ -9215,7 +9321,7 @@
         paramBuffer.addParam(std::move(pointerParam));
     }
 
-    return CallCapture(gl::EntryPoint::PointSizePointerOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLPointSizePointerOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureQueryMatrixxOES(const State &glState,
@@ -9260,7 +9366,7 @@
     InitParamValue(ParamType::TGLbitfield, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::QueryMatrixxOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLQueryMatrixxOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureMinSampleShadingOES(const State &glState, bool isCallValid, GLfloat value)
@@ -9269,7 +9375,7 @@
 
     paramBuffer.addValueParam("value", ParamType::TGLfloat, value);
 
-    return CallCapture(gl::EntryPoint::MinSampleShadingOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLMinSampleShadingOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureCompressedTexImage3DOES(const State &glState,
@@ -9313,7 +9419,7 @@
         paramBuffer.addParam(std::move(dataParam));
     }
 
-    return CallCapture(gl::EntryPoint::CompressedTexImage3DOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLCompressedTexImage3DOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureCompressedTexSubImage3DOES(const State &glState,
@@ -9360,7 +9466,7 @@
         paramBuffer.addParam(std::move(dataParam));
     }
 
-    return CallCapture(gl::EntryPoint::CompressedTexSubImage3DOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLCompressedTexSubImage3DOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureCopyTexSubImage3DOES(const State &glState,
@@ -9387,7 +9493,7 @@
     paramBuffer.addValueParam("width", ParamType::TGLsizei, width);
     paramBuffer.addValueParam("height", ParamType::TGLsizei, height);
 
-    return CallCapture(gl::EntryPoint::CopyTexSubImage3DOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLCopyTexSubImage3DOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureFramebufferTexture3DOES(const State &glState,
@@ -9409,7 +9515,7 @@
     paramBuffer.addValueParam("level", ParamType::TGLint, level);
     paramBuffer.addValueParam("zoffset", ParamType::TGLint, zoffset);
 
-    return CallCapture(gl::EntryPoint::FramebufferTexture3DOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLFramebufferTexture3DOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexImage3DOES(const State &glState,
@@ -9455,7 +9561,7 @@
         paramBuffer.addParam(std::move(pixelsParam));
     }
 
-    return CallCapture(gl::EntryPoint::TexImage3DOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexImage3DOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexSubImage3DOES(const State &glState,
@@ -9502,7 +9608,7 @@
         paramBuffer.addParam(std::move(pixelsParam));
     }
 
-    return CallCapture(gl::EntryPoint::TexSubImage3DOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexSubImage3DOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetSamplerParameterIivOES(const State &glState,
@@ -9531,7 +9637,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetSamplerParameterIivOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetSamplerParameterIivOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetSamplerParameterIuivOES(const State &glState,
@@ -9561,7 +9667,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetSamplerParameterIuivOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetSamplerParameterIuivOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetTexParameterIivOES(const State &glState,
@@ -9590,7 +9696,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetTexParameterIivOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetTexParameterIivOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetTexParameterIuivOES(const State &glState,
@@ -9620,7 +9726,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetTexParameterIuivOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetTexParameterIuivOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureSamplerParameterIivOES(const State &glState,
@@ -9650,7 +9756,7 @@
         paramBuffer.addParam(std::move(paramParam));
     }
 
-    return CallCapture(gl::EntryPoint::SamplerParameterIivOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLSamplerParameterIivOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureSamplerParameterIuivOES(const State &glState,
@@ -9680,7 +9786,7 @@
         paramBuffer.addParam(std::move(paramParam));
     }
 
-    return CallCapture(gl::EntryPoint::SamplerParameterIuivOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLSamplerParameterIuivOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexParameterIivOES(const State &glState,
@@ -9710,7 +9816,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::TexParameterIivOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexParameterIivOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexParameterIuivOES(const State &glState,
@@ -9740,7 +9846,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::TexParameterIuivOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexParameterIuivOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexBufferOES(const State &glState,
@@ -9756,7 +9862,7 @@
                              internalformat);
     paramBuffer.addValueParam("bufferPacked", ParamType::TBufferID, bufferPacked);
 
-    return CallCapture(gl::EntryPoint::TexBufferOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexBufferOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexBufferRangeOES(const State &glState,
@@ -9776,7 +9882,7 @@
     paramBuffer.addValueParam("offset", ParamType::TGLintptr, offset);
     paramBuffer.addValueParam("size", ParamType::TGLsizeiptr, size);
 
-    return CallCapture(gl::EntryPoint::TexBufferRangeOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexBufferRangeOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetTexGenfvOES(const State &glState,
@@ -9805,7 +9911,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetTexGenfvOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetTexGenfvOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetTexGenivOES(const State &glState,
@@ -9833,7 +9939,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetTexGenivOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetTexGenivOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureGetTexGenxvOES(const State &glState,
@@ -9862,7 +9968,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::GetTexGenxvOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGetTexGenxvOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexGenfOES(const State &glState,
@@ -9877,7 +9983,7 @@
     paramBuffer.addEnumParam("pname", GLenumGroup::TextureGenParameter, ParamType::TGLenum, pname);
     paramBuffer.addValueParam("param", ParamType::TGLfloat, param);
 
-    return CallCapture(gl::EntryPoint::TexGenfOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexGenfOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexGenfvOES(const State &glState,
@@ -9906,7 +10012,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::TexGenfvOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexGenfvOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexGeniOES(const State &glState,
@@ -9921,7 +10027,7 @@
     paramBuffer.addEnumParam("pname", GLenumGroup::TextureGenParameter, ParamType::TGLenum, pname);
     paramBuffer.addValueParam("param", ParamType::TGLint, param);
 
-    return CallCapture(gl::EntryPoint::TexGeniOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexGeniOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexGenivOES(const State &glState,
@@ -9950,7 +10056,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::TexGenivOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexGenivOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexGenxOES(const State &glState,
@@ -9965,7 +10071,7 @@
     paramBuffer.addEnumParam("pname", GLenumGroup::TextureGenParameter, ParamType::TGLenum, pname);
     paramBuffer.addValueParam("param", ParamType::TGLfixed, param);
 
-    return CallCapture(gl::EntryPoint::TexGenxOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexGenxOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexGenxvOES(const State &glState,
@@ -9994,7 +10100,7 @@
         paramBuffer.addParam(std::move(paramsParam));
     }
 
-    return CallCapture(gl::EntryPoint::TexGenxvOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexGenxvOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureTexStorage3DMultisampleOES(const State &glState,
@@ -10018,7 +10124,7 @@
     paramBuffer.addValueParam("depth", ParamType::TGLsizei, depth);
     paramBuffer.addValueParam("fixedsamplelocations", ParamType::TGLboolean, fixedsamplelocations);
 
-    return CallCapture(gl::EntryPoint::TexStorage3DMultisampleOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLTexStorage3DMultisampleOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureBindVertexArrayOES(const State &glState,
@@ -10029,7 +10135,7 @@
 
     paramBuffer.addValueParam("arrayPacked", ParamType::TVertexArrayID, arrayPacked);
 
-    return CallCapture(gl::EntryPoint::BindVertexArrayOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLBindVertexArrayOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureDeleteVertexArraysOES(const State &glState,
@@ -10058,7 +10164,7 @@
         paramBuffer.addParam(std::move(arraysPackedParam));
     }
 
-    return CallCapture(gl::EntryPoint::DeleteVertexArraysOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLDeleteVertexArraysOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureGenVertexArraysOES(const State &glState,
@@ -10086,7 +10192,7 @@
         paramBuffer.addParam(std::move(arraysPackedParam));
     }
 
-    return CallCapture(gl::EntryPoint::GenVertexArraysOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLGenVertexArraysOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureIsVertexArrayOES(const State &glState,
@@ -10102,7 +10208,7 @@
     InitParamValue(ParamType::TGLboolean, returnValue, &returnValueCapture.value);
     paramBuffer.addReturnValue(std::move(returnValueCapture));
 
-    return CallCapture(gl::EntryPoint::IsVertexArrayOES, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLIsVertexArrayOES, std::move(paramBuffer));
 }
 
 CallCapture CaptureFramebufferTextureMultiviewOVR(const State &glState,
@@ -10124,7 +10230,7 @@
     paramBuffer.addValueParam("baseViewIndex", ParamType::TGLint, baseViewIndex);
     paramBuffer.addValueParam("numViews", ParamType::TGLsizei, numViews);
 
-    return CallCapture(gl::EntryPoint::FramebufferTextureMultiviewOVR, std::move(paramBuffer));
+    return CallCapture(angle::EntryPoint::GLFramebufferTextureMultiviewOVR, std::move(paramBuffer));
 }
 
 }  // namespace gl
diff --git a/src/libANGLE/capture_gles_ext_autogen.h b/src/libANGLE/capture_gles_ext_autogen.h
index 6659c2f..d2c38e4 100644
--- a/src/libANGLE/capture_gles_ext_autogen.h
+++ b/src/libANGLE/capture_gles_ext_autogen.h
@@ -8,8 +8,8 @@
 // capture_gles_ext_autogen.h:
 //   Capture functions for the OpenGL ES extension entry points.
 
-#ifndef LIBANGLE_CAPTURE_GLES_ext_AUTOGEN_H_
-#define LIBANGLE_CAPTURE_GLES_ext_AUTOGEN_H_
+#ifndef LIBANGLE_CAPTURE_GLES_EXT_AUTOGEN_H_
+#define LIBANGLE_CAPTURE_GLES_EXT_AUTOGEN_H_
 
 #include "common/PackedEnums.h"
 #include "libANGLE/FrameCapture.h"
@@ -921,6 +921,21 @@
                                               GLsizei srcHeight,
                                               GLsizei srcDepth);
 
+// GL_EXT_debug_label
+angle::CallCapture CaptureGetObjectLabelEXT(const State &glState,
+                                            bool isCallValid,
+                                            GLenum type,
+                                            GLuint object,
+                                            GLsizei bufSize,
+                                            GLsizei *length,
+                                            GLchar *label);
+angle::CallCapture CaptureLabelObjectEXT(const State &glState,
+                                         bool isCallValid,
+                                         GLenum type,
+                                         GLuint object,
+                                         GLsizei length,
+                                         const GLchar *label);
+
 // GL_EXT_debug_marker
 angle::CallCapture CaptureInsertEventMarkerEXT(const State &glState,
                                                bool isCallValid,
@@ -1581,6 +1596,8 @@
                                                      bool isCallValid,
                                                      ProgramPipelineID pipelinePacked);
 
+// GL_EXT_shader_io_blocks
+
 // GL_EXT_tessellation_shader
 angle::CallCapture CapturePatchParameteriEXT(const State &glState,
                                              bool isCallValid,
@@ -2026,6 +2043,8 @@
                                               bool isCallValid,
                                               GLfloat value);
 
+// GL_OES_shader_io_blocks
+
 // GL_OES_texture_3D
 angle::CallCapture CaptureCompressedTexImage3DOES(const State &glState,
                                                   bool isCallValid,
@@ -3555,6 +3574,29 @@
                                   const void *data,
                                   GLbitfield flags,
                                   angle::ParamCapture *paramCapture);
+void CaptureGetObjectLabelEXT_length(const State &glState,
+                                     bool isCallValid,
+                                     GLenum type,
+                                     GLuint object,
+                                     GLsizei bufSize,
+                                     GLsizei *length,
+                                     GLchar *label,
+                                     angle::ParamCapture *paramCapture);
+void CaptureGetObjectLabelEXT_label(const State &glState,
+                                    bool isCallValid,
+                                    GLenum type,
+                                    GLuint object,
+                                    GLsizei bufSize,
+                                    GLsizei *length,
+                                    GLchar *label,
+                                    angle::ParamCapture *paramCapture);
+void CaptureLabelObjectEXT_label(const State &glState,
+                                 bool isCallValid,
+                                 GLenum type,
+                                 GLuint object,
+                                 GLsizei length,
+                                 const GLchar *label,
+                                 angle::ParamCapture *paramCapture);
 void CaptureInsertEventMarkerEXT_marker(const State &glState,
                                         bool isCallValid,
                                         GLsizei length,
@@ -4474,4 +4516,4 @@
                                             angle::ParamCapture *paramCapture);
 }  // namespace gl
 
-#endif  // LIBANGLE_CAPTURE_GLES_ext_AUTOGEN_H_
+#endif  // LIBANGLE_CAPTURE_GLES_EXT_AUTOGEN_H_
diff --git a/src/libANGLE/capture_gles_ext_params.cpp b/src/libANGLE/capture_gles_ext_params.cpp
index b64a650..1f6c0bd 100644
--- a/src/libANGLE/capture_gles_ext_params.cpp
+++ b/src/libANGLE/capture_gles_ext_params.cpp
@@ -2758,6 +2758,41 @@
     // Skipped
 }
 
+void CaptureGetObjectLabelEXT_length(const State &glState,
+                                     bool isCallValid,
+                                     GLenum type,
+                                     GLuint object,
+                                     GLsizei bufSize,
+                                     GLsizei *length,
+                                     GLchar *label,
+                                     angle::ParamCapture *paramCapture)
+{
+    // Skipped
+}
+
+void CaptureGetObjectLabelEXT_label(const State &glState,
+                                    bool isCallValid,
+                                    GLenum type,
+                                    GLuint object,
+                                    GLsizei bufSize,
+                                    GLsizei *length,
+                                    GLchar *label,
+                                    angle::ParamCapture *paramCapture)
+{
+    // Skipped
+}
+
+void CaptureLabelObjectEXT_label(const State &glState,
+                                 bool isCallValid,
+                                 GLenum type,
+                                 GLuint object,
+                                 GLsizei length,
+                                 const GLchar *label,
+                                 angle::ParamCapture *paramCapture)
+{
+    // Skipped
+}
+
 void CaptureGetObjectPtrLabelKHR_ptr(const State &glState,
                                      bool isCallValid,
                                      const void *ptr,
diff --git a/src/libANGLE/entry_points_utils.h b/src/libANGLE/entry_points_utils.h
index 2b631e5..0be7f29 100644
--- a/src/libANGLE/entry_points_utils.h
+++ b/src/libANGLE/entry_points_utils.h
@@ -15,48 +15,49 @@
 #include "common/angleutils.h"
 #include "common/entry_points_enum_autogen.h"
 #include "common/mathutil.h"
+#include "libANGLE/Context.h"
 #include "libANGLE/Display.h"
 
 namespace gl
 {
 // A template struct for determining the default value to return for each entry point.
-template <EntryPoint EP, typename ReturnType>
+template <angle::EntryPoint EP, typename ReturnType>
 struct DefaultReturnValue;
 
 // Default return values for each basic return type.
-template <EntryPoint EP>
+template <angle::EntryPoint EP>
 struct DefaultReturnValue<EP, GLint>
 {
     static constexpr GLint kValue = -1;
 };
 
 // This doubles as the GLenum return value.
-template <EntryPoint EP>
+template <angle::EntryPoint EP>
 struct DefaultReturnValue<EP, GLuint>
 {
     static constexpr GLuint kValue = 0;
 };
 
-template <EntryPoint EP>
+template <angle::EntryPoint EP>
 struct DefaultReturnValue<EP, GLboolean>
 {
     static constexpr GLboolean kValue = GL_FALSE;
 };
 
-template <EntryPoint EP>
+template <angle::EntryPoint EP>
 struct DefaultReturnValue<EP, ShaderProgramID>
 {
     static constexpr ShaderProgramID kValue = {0};
 };
 
 // Catch-all rules for pointer types.
-template <EntryPoint EP, typename PointerType>
+template <angle::EntryPoint EP, typename PointerType>
 struct DefaultReturnValue<EP, const PointerType *>
 {
     static constexpr const PointerType *kValue = nullptr;
 };
 
-template <EntryPoint EP, typename PointerType>
+template <angle::EntryPoint EP, typename PointerType>
 struct DefaultReturnValue<EP, PointerType *>
 {
     static constexpr PointerType *kValue = nullptr;
@@ -64,26 +65,26 @@
 
 // Overloaded to return invalid index
 template <>
-struct DefaultReturnValue<EntryPoint::GetUniformBlockIndex, GLuint>
+struct DefaultReturnValue<angle::EntryPoint::GLGetUniformBlockIndex, GLuint>
 {
     static constexpr GLuint kValue = GL_INVALID_INDEX;
 };
 
 // Specialized enum error value.
 template <>
-struct DefaultReturnValue<EntryPoint::ClientWaitSync, GLenum>
+struct DefaultReturnValue<angle::EntryPoint::GLClientWaitSync, GLenum>
 {
     static constexpr GLenum kValue = GL_WAIT_FAILED;
 };
 
 // glTestFenceNV should still return TRUE for an invalid fence.
 template <>
-struct DefaultReturnValue<EntryPoint::TestFenceNV, GLboolean>
+struct DefaultReturnValue<angle::EntryPoint::GLTestFenceNV, GLboolean>
 {
     static constexpr GLboolean kValue = GL_TRUE;
 };
 
-template <EntryPoint EP, typename ReturnType>
+template <angle::EntryPoint EP, typename ReturnType>
 constexpr ANGLE_INLINE ReturnType GetDefaultReturnValue()
 {
     return DefaultReturnValue<EP, ReturnType>::kValue;
@@ -95,8 +96,7 @@
 #    define ANGLE_CAPTURE(...)
 #endif  // ANGLE_CAPTURE_ENABLED
 
-#define FUNC_EVENT(format, ...) \
-    EVENT(nullptr, gl::EntryPoint::Begin, __FUNCTION__, format, __VA_ARGS__)
+#define EGL_EVENT(EP, FMT, ...) EVENT(nullptr, EGL##EP, FMT, ##__VA_ARGS__)
 
 inline int CID(const Context *context)
 {
diff --git a/src/libANGLE/frame_capture_replay_autogen.cpp b/src/libANGLE/frame_capture_replay_autogen.cpp
index 3f38a73..8fa31ac 100644
--- a/src/libANGLE/frame_capture_replay_autogen.cpp
+++ b/src/libANGLE/frame_capture_replay_autogen.cpp
@@ -27,44 +27,44 @@
     const ParamBuffer &params = call.params;
     switch (call.entryPoint)
     {
-        case gl::EntryPoint::ActiveShaderProgram:
+        case angle::EntryPoint::GLActiveShaderProgram:
             context->activeShaderProgram(
                 params.getParam("pipelinePacked", ParamType::TProgramPipelineID, 0)
                     .value.ProgramPipelineIDVal,
                 params.getParam("programPacked", ParamType::TShaderProgramID, 1)
                     .value.ShaderProgramIDVal);
             break;
-        case gl::EntryPoint::ActiveTexture:
+        case angle::EntryPoint::GLActiveTexture:
             context->activeTexture(
                 params.getParam("texture", ParamType::TGLenum, 0).value.GLenumVal);
             break;
-        case gl::EntryPoint::AlphaFunc:
+        case angle::EntryPoint::GLAlphaFunc:
             context->alphaFunc(
                 params.getParam("funcPacked", ParamType::TAlphaTestFunc, 0).value.AlphaTestFuncVal,
                 params.getParam("ref", ParamType::TGLfloat, 1).value.GLfloatVal);
             break;
-        case gl::EntryPoint::AlphaFuncx:
+        case angle::EntryPoint::GLAlphaFuncx:
             context->alphaFuncx(
                 params.getParam("funcPacked", ParamType::TAlphaTestFunc, 0).value.AlphaTestFuncVal,
                 params.getParam("ref", ParamType::TGLfixed, 1).value.GLfixedVal);
             break;
-        case gl::EntryPoint::AttachShader:
+        case angle::EntryPoint::GLAttachShader:
             context->attachShader(params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                                       .value.ShaderProgramIDVal,
                                   params.getParam("shaderPacked", ParamType::TShaderProgramID, 1)
                                       .value.ShaderProgramIDVal);
             break;
-        case gl::EntryPoint::BeginQuery:
+        case angle::EntryPoint::GLBeginQuery:
             context->beginQuery(
                 params.getParam("targetPacked", ParamType::TQueryType, 0).value.QueryTypeVal,
                 params.getParam("idPacked", ParamType::TQueryID, 1).value.QueryIDVal);
             break;
-        case gl::EntryPoint::BeginTransformFeedback:
+        case angle::EntryPoint::GLBeginTransformFeedback:
             context->beginTransformFeedback(
                 params.getParam("primitiveModePacked", ParamType::TPrimitiveMode, 0)
                     .value.PrimitiveModeVal);
             break;
-        case gl::EntryPoint::BindAttribLocation:
+        case angle::EntryPoint::GLBindAttribLocation:
             context->bindAttribLocation(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -72,20 +72,20 @@
                 replayContext->getAsConstPointer<const GLchar *>(
                     params.getParam("name", ParamType::TGLcharConstPointer, 2)));
             break;
-        case gl::EntryPoint::BindBuffer:
+        case angle::EntryPoint::GLBindBuffer:
             context->bindBuffer(
                 params.getParam("targetPacked", ParamType::TBufferBinding, 0)
                     .value.BufferBindingVal,
                 params.getParam("bufferPacked", ParamType::TBufferID, 1).value.BufferIDVal);
             break;
-        case gl::EntryPoint::BindBufferBase:
+        case angle::EntryPoint::GLBindBufferBase:
             context->bindBufferBase(
                 params.getParam("targetPacked", ParamType::TBufferBinding, 0)
                     .value.BufferBindingVal,
                 params.getParam("index", ParamType::TGLuint, 1).value.GLuintVal,
                 params.getParam("bufferPacked", ParamType::TBufferID, 2).value.BufferIDVal);
             break;
-        case gl::EntryPoint::BindBufferRange:
+        case angle::EntryPoint::GLBindBufferRange:
             context->bindBufferRange(
                 params.getParam("targetPacked", ParamType::TBufferBinding, 0)
                     .value.BufferBindingVal,
@@ -94,7 +94,7 @@
                 params.getParam("offset", ParamType::TGLintptr, 3).value.GLintptrVal,
                 params.getParam("size", ParamType::TGLsizeiptr, 4).value.GLsizeiptrVal);
             break;
-        case gl::EntryPoint::BindFragDataLocation:
+        case angle::EntryPoint::GLBindFragDataLocation:
             context->bindFragDataLocation(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -102,7 +102,7 @@
                 replayContext->getAsConstPointer<const GLchar *>(
                     params.getParam("name", ParamType::TGLcharConstPointer, 2)));
             break;
-        case gl::EntryPoint::BindFragDataLocationIndexed:
+        case angle::EntryPoint::GLBindFragDataLocationIndexed:
             context->bindFragDataLocationIndexed(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -111,13 +111,13 @@
                 replayContext->getAsConstPointer<const GLchar *>(
                     params.getParam("name", ParamType::TGLcharConstPointer, 3)));
             break;
-        case gl::EntryPoint::BindFramebuffer:
+        case angle::EntryPoint::GLBindFramebuffer:
             context->bindFramebuffer(
                 params.getParam("target", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("framebufferPacked", ParamType::TFramebufferID, 1)
                     .value.FramebufferIDVal);
             break;
-        case gl::EntryPoint::BindImageTexture:
+        case angle::EntryPoint::GLBindImageTexture:
             context->bindImageTexture(
                 params.getParam("unit", ParamType::TGLuint, 0).value.GLuintVal,
                 params.getParam("texturePacked", ParamType::TTextureID, 1).value.TextureIDVal,
@@ -127,83 +127,83 @@
                 params.getParam("access", ParamType::TGLenum, 5).value.GLenumVal,
                 params.getParam("format", ParamType::TGLenum, 6).value.GLenumVal);
             break;
-        case gl::EntryPoint::BindProgramPipeline:
+        case angle::EntryPoint::GLBindProgramPipeline:
             context->bindProgramPipeline(
                 params.getParam("pipelinePacked", ParamType::TProgramPipelineID, 0)
                     .value.ProgramPipelineIDVal);
             break;
-        case gl::EntryPoint::BindRenderbuffer:
+        case angle::EntryPoint::GLBindRenderbuffer:
             context->bindRenderbuffer(
                 params.getParam("target", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("renderbufferPacked", ParamType::TRenderbufferID, 1)
                     .value.RenderbufferIDVal);
             break;
-        case gl::EntryPoint::BindSampler:
+        case angle::EntryPoint::GLBindSampler:
             context->bindSampler(
                 params.getParam("unit", ParamType::TGLuint, 0).value.GLuintVal,
                 params.getParam("samplerPacked", ParamType::TSamplerID, 1).value.SamplerIDVal);
             break;
-        case gl::EntryPoint::BindTexture:
+        case angle::EntryPoint::GLBindTexture:
             context->bindTexture(
                 params.getParam("targetPacked", ParamType::TTextureType, 0).value.TextureTypeVal,
                 params.getParam("texturePacked", ParamType::TTextureID, 1).value.TextureIDVal);
             break;
-        case gl::EntryPoint::BindTransformFeedback:
+        case angle::EntryPoint::GLBindTransformFeedback:
             context->bindTransformFeedback(
                 params.getParam("target", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("idPacked", ParamType::TTransformFeedbackID, 1)
                     .value.TransformFeedbackIDVal);
             break;
-        case gl::EntryPoint::BindVertexArray:
+        case angle::EntryPoint::GLBindVertexArray:
             context->bindVertexArray(params.getParam("arrayPacked", ParamType::TVertexArrayID, 0)
                                          .value.VertexArrayIDVal);
             break;
-        case gl::EntryPoint::BindVertexBuffer:
+        case angle::EntryPoint::GLBindVertexBuffer:
             context->bindVertexBuffer(
                 params.getParam("bindingindex", ParamType::TGLuint, 0).value.GLuintVal,
                 params.getParam("bufferPacked", ParamType::TBufferID, 1).value.BufferIDVal,
                 params.getParam("offset", ParamType::TGLintptr, 2).value.GLintptrVal,
                 params.getParam("stride", ParamType::TGLsizei, 3).value.GLsizeiVal);
             break;
-        case gl::EntryPoint::BlendBarrier:
+        case angle::EntryPoint::GLBlendBarrier:
             context->blendBarrier();
             break;
-        case gl::EntryPoint::BlendColor:
+        case angle::EntryPoint::GLBlendColor:
             context->blendColor(params.getParam("red", ParamType::TGLfloat, 0).value.GLfloatVal,
                                 params.getParam("green", ParamType::TGLfloat, 1).value.GLfloatVal,
                                 params.getParam("blue", ParamType::TGLfloat, 2).value.GLfloatVal,
                                 params.getParam("alpha", ParamType::TGLfloat, 3).value.GLfloatVal);
             break;
-        case gl::EntryPoint::BlendEquation:
+        case angle::EntryPoint::GLBlendEquation:
             context->blendEquation(params.getParam("mode", ParamType::TGLenum, 0).value.GLenumVal);
             break;
-        case gl::EntryPoint::BlendEquationSeparate:
+        case angle::EntryPoint::GLBlendEquationSeparate:
             context->blendEquationSeparate(
                 params.getParam("modeRGB", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("modeAlpha", ParamType::TGLenum, 1).value.GLenumVal);
             break;
-        case gl::EntryPoint::BlendEquationSeparatei:
+        case angle::EntryPoint::GLBlendEquationSeparatei:
             context->blendEquationSeparatei(
                 params.getParam("buf", ParamType::TGLuint, 0).value.GLuintVal,
                 params.getParam("modeRGB", ParamType::TGLenum, 1).value.GLenumVal,
                 params.getParam("modeAlpha", ParamType::TGLenum, 2).value.GLenumVal);
             break;
-        case gl::EntryPoint::BlendEquationi:
+        case angle::EntryPoint::GLBlendEquationi:
             context->blendEquationi(params.getParam("buf", ParamType::TGLuint, 0).value.GLuintVal,
                                     params.getParam("mode", ParamType::TGLenum, 1).value.GLenumVal);
             break;
-        case gl::EntryPoint::BlendFunc:
+        case angle::EntryPoint::GLBlendFunc:
             context->blendFunc(params.getParam("sfactor", ParamType::TGLenum, 0).value.GLenumVal,
                                params.getParam("dfactor", ParamType::TGLenum, 1).value.GLenumVal);
             break;
-        case gl::EntryPoint::BlendFuncSeparate:
+        case angle::EntryPoint::GLBlendFuncSeparate:
             context->blendFuncSeparate(
                 params.getParam("sfactorRGB", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("dfactorRGB", ParamType::TGLenum, 1).value.GLenumVal,
                 params.getParam("sfactorAlpha", ParamType::TGLenum, 2).value.GLenumVal,
                 params.getParam("dfactorAlpha", ParamType::TGLenum, 3).value.GLenumVal);
             break;
-        case gl::EntryPoint::BlendFuncSeparatei:
+        case angle::EntryPoint::GLBlendFuncSeparatei:
             context->blendFuncSeparatei(
                 params.getParam("buf", ParamType::TGLuint, 0).value.GLuintVal,
                 params.getParam("srcRGB", ParamType::TGLenum, 1).value.GLenumVal,
@@ -211,12 +211,12 @@
                 params.getParam("srcAlpha", ParamType::TGLenum, 3).value.GLenumVal,
                 params.getParam("dstAlpha", ParamType::TGLenum, 4).value.GLenumVal);
             break;
-        case gl::EntryPoint::BlendFunci:
+        case angle::EntryPoint::GLBlendFunci:
             context->blendFunci(params.getParam("buf", ParamType::TGLuint, 0).value.GLuintVal,
                                 params.getParam("src", ParamType::TGLenum, 1).value.GLenumVal,
                                 params.getParam("dst", ParamType::TGLenum, 2).value.GLenumVal);
             break;
-        case gl::EntryPoint::BlitFramebuffer:
+        case angle::EntryPoint::GLBlitFramebuffer:
             context->blitFramebuffer(
                 params.getParam("srcX0", ParamType::TGLint, 0).value.GLintVal,
                 params.getParam("srcY0", ParamType::TGLint, 1).value.GLintVal,
@@ -229,7 +229,7 @@
                 params.getParam("mask", ParamType::TGLbitfield, 8).value.GLbitfieldVal,
                 params.getParam("filter", ParamType::TGLenum, 9).value.GLenumVal);
             break;
-        case gl::EntryPoint::BufferData:
+        case angle::EntryPoint::GLBufferData:
             context->bufferData(
                 params.getParam("targetPacked", ParamType::TBufferBinding, 0)
                     .value.BufferBindingVal,
@@ -238,7 +238,7 @@
                     params.getParam("data", ParamType::TvoidConstPointer, 2)),
                 params.getParam("usagePacked", ParamType::TBufferUsage, 3).value.BufferUsageVal);
             break;
-        case gl::EntryPoint::BufferStorage:
+        case angle::EntryPoint::GLBufferStorage:
             context->bufferStorage(
                 params.getParam("targetPacked", ParamType::TBufferBinding, 0)
                     .value.BufferBindingVal,
@@ -247,7 +247,7 @@
                     params.getParam("data", ParamType::TvoidConstPointer, 2)),
                 params.getParam("flags", ParamType::TGLbitfield, 3).value.GLbitfieldVal);
             break;
-        case gl::EntryPoint::BufferSubData:
+        case angle::EntryPoint::GLBufferSubData:
             context->bufferSubData(
                 params.getParam("targetPacked", ParamType::TBufferBinding, 0)
                     .value.BufferBindingVal,
@@ -256,115 +256,115 @@
                 replayContext->getAsConstPointer<const void *>(
                     params.getParam("data", ParamType::TvoidConstPointer, 3)));
             break;
-        case gl::EntryPoint::CheckFramebufferStatus:
+        case angle::EntryPoint::GLCheckFramebufferStatus:
             context->checkFramebufferStatus(
                 params.getParam("target", ParamType::TGLenum, 0).value.GLenumVal);
             break;
-        case gl::EntryPoint::Clear:
+        case angle::EntryPoint::GLClear:
             context->clear(params.getParam("mask", ParamType::TGLbitfield, 0).value.GLbitfieldVal);
             break;
-        case gl::EntryPoint::ClearBufferfi:
+        case angle::EntryPoint::GLClearBufferfi:
             context->clearBufferfi(
                 params.getParam("buffer", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("drawbuffer", ParamType::TGLint, 1).value.GLintVal,
                 params.getParam("depth", ParamType::TGLfloat, 2).value.GLfloatVal,
                 params.getParam("stencil", ParamType::TGLint, 3).value.GLintVal);
             break;
-        case gl::EntryPoint::ClearBufferfv:
+        case angle::EntryPoint::GLClearBufferfv:
             context->clearBufferfv(
                 params.getParam("buffer", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("drawbuffer", ParamType::TGLint, 1).value.GLintVal,
                 replayContext->getAsConstPointer<const GLfloat *>(
                     params.getParam("value", ParamType::TGLfloatConstPointer, 2)));
             break;
-        case gl::EntryPoint::ClearBufferiv:
+        case angle::EntryPoint::GLClearBufferiv:
             context->clearBufferiv(
                 params.getParam("buffer", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("drawbuffer", ParamType::TGLint, 1).value.GLintVal,
                 replayContext->getAsConstPointer<const GLint *>(
                     params.getParam("value", ParamType::TGLintConstPointer, 2)));
             break;
-        case gl::EntryPoint::ClearBufferuiv:
+        case angle::EntryPoint::GLClearBufferuiv:
             context->clearBufferuiv(
                 params.getParam("buffer", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("drawbuffer", ParamType::TGLint, 1).value.GLintVal,
                 replayContext->getAsConstPointer<const GLuint *>(
                     params.getParam("value", ParamType::TGLuintConstPointer, 2)));
             break;
-        case gl::EntryPoint::ClearColor:
+        case angle::EntryPoint::GLClearColor:
             context->clearColor(params.getParam("red", ParamType::TGLfloat, 0).value.GLfloatVal,
                                 params.getParam("green", ParamType::TGLfloat, 1).value.GLfloatVal,
                                 params.getParam("blue", ParamType::TGLfloat, 2).value.GLfloatVal,
                                 params.getParam("alpha", ParamType::TGLfloat, 3).value.GLfloatVal);
             break;
-        case gl::EntryPoint::ClearColorx:
+        case angle::EntryPoint::GLClearColorx:
             context->clearColorx(params.getParam("red", ParamType::TGLfixed, 0).value.GLfixedVal,
                                  params.getParam("green", ParamType::TGLfixed, 1).value.GLfixedVal,
                                  params.getParam("blue", ParamType::TGLfixed, 2).value.GLfixedVal,
                                  params.getParam("alpha", ParamType::TGLfixed, 3).value.GLfixedVal);
             break;
-        case gl::EntryPoint::ClearDepthf:
+        case angle::EntryPoint::GLClearDepthf:
             context->clearDepthf(params.getParam("d", ParamType::TGLfloat, 0).value.GLfloatVal);
             break;
-        case gl::EntryPoint::ClearDepthx:
+        case angle::EntryPoint::GLClearDepthx:
             context->clearDepthx(params.getParam("depth", ParamType::TGLfixed, 0).value.GLfixedVal);
             break;
-        case gl::EntryPoint::ClearStencil:
+        case angle::EntryPoint::GLClearStencil:
             context->clearStencil(params.getParam("s", ParamType::TGLint, 0).value.GLintVal);
             break;
-        case gl::EntryPoint::ClientActiveTexture:
+        case angle::EntryPoint::GLClientActiveTexture:
             context->clientActiveTexture(
                 params.getParam("texture", ParamType::TGLenum, 0).value.GLenumVal);
             break;
-        case gl::EntryPoint::ClientWaitSync:
+        case angle::EntryPoint::GLClientWaitSync:
             context->clientWaitSync(
                 params.getParam("sync", ParamType::TGLsync, 0).value.GLsyncVal,
                 params.getParam("flags", ParamType::TGLbitfield, 1).value.GLbitfieldVal,
                 params.getParam("timeout", ParamType::TGLuint64, 2).value.GLuint64Val);
             break;
-        case gl::EntryPoint::ClipPlanef:
+        case angle::EntryPoint::GLClipPlanef:
             context->clipPlanef(params.getParam("p", ParamType::TGLenum, 0).value.GLenumVal,
                                 replayContext->getAsConstPointer<const GLfloat *>(
                                     params.getParam("eqn", ParamType::TGLfloatConstPointer, 1)));
             break;
-        case gl::EntryPoint::ClipPlanex:
+        case angle::EntryPoint::GLClipPlanex:
             context->clipPlanex(params.getParam("plane", ParamType::TGLenum, 0).value.GLenumVal,
                                 replayContext->getAsConstPointer<const GLfixed *>(params.getParam(
                                     "equation", ParamType::TGLfixedConstPointer, 1)));
             break;
-        case gl::EntryPoint::Color4f:
+        case angle::EntryPoint::GLColor4f:
             context->color4f(params.getParam("red", ParamType::TGLfloat, 0).value.GLfloatVal,
                              params.getParam("green", ParamType::TGLfloat, 1).value.GLfloatVal,
                              params.getParam("blue", ParamType::TGLfloat, 2).value.GLfloatVal,
                              params.getParam("alpha", ParamType::TGLfloat, 3).value.GLfloatVal);
             break;
-        case gl::EntryPoint::Color4ub:
+        case angle::EntryPoint::GLColor4ub:
             context->color4ub(params.getParam("red", ParamType::TGLubyte, 0).value.GLubyteVal,
                               params.getParam("green", ParamType::TGLubyte, 1).value.GLubyteVal,
                               params.getParam("blue", ParamType::TGLubyte, 2).value.GLubyteVal,
                               params.getParam("alpha", ParamType::TGLubyte, 3).value.GLubyteVal);
             break;
-        case gl::EntryPoint::Color4x:
+        case angle::EntryPoint::GLColor4x:
             context->color4x(params.getParam("red", ParamType::TGLfixed, 0).value.GLfixedVal,
                              params.getParam("green", ParamType::TGLfixed, 1).value.GLfixedVal,
                              params.getParam("blue", ParamType::TGLfixed, 2).value.GLfixedVal,
                              params.getParam("alpha", ParamType::TGLfixed, 3).value.GLfixedVal);
             break;
-        case gl::EntryPoint::ColorMask:
+        case angle::EntryPoint::GLColorMask:
             context->colorMask(
                 params.getParam("red", ParamType::TGLboolean, 0).value.GLbooleanVal,
                 params.getParam("green", ParamType::TGLboolean, 1).value.GLbooleanVal,
                 params.getParam("blue", ParamType::TGLboolean, 2).value.GLbooleanVal,
                 params.getParam("alpha", ParamType::TGLboolean, 3).value.GLbooleanVal);
             break;
-        case gl::EntryPoint::ColorMaski:
+        case angle::EntryPoint::GLColorMaski:
             context->colorMaski(params.getParam("index", ParamType::TGLuint, 0).value.GLuintVal,
                                 params.getParam("r", ParamType::TGLboolean, 1).value.GLbooleanVal,
                                 params.getParam("g", ParamType::TGLboolean, 2).value.GLbooleanVal,
                                 params.getParam("b", ParamType::TGLboolean, 3).value.GLbooleanVal,
                                 params.getParam("a", ParamType::TGLboolean, 4).value.GLbooleanVal);
             break;
-        case gl::EntryPoint::ColorPointer:
+        case angle::EntryPoint::GLColorPointer:
             context->colorPointer(
                 params.getParam("size", ParamType::TGLint, 0).value.GLintVal,
                 params.getParam("typePacked", ParamType::TVertexAttribType, 1)
@@ -373,11 +373,11 @@
                 replayContext->getAsConstPointer<const void *>(
                     params.getParam("pointer", ParamType::TvoidConstPointer, 3)));
             break;
-        case gl::EntryPoint::CompileShader:
+        case angle::EntryPoint::GLCompileShader:
             context->compileShader(params.getParam("shaderPacked", ParamType::TShaderProgramID, 0)
                                        .value.ShaderProgramIDVal);
             break;
-        case gl::EntryPoint::CompressedTexImage2D:
+        case angle::EntryPoint::GLCompressedTexImage2D:
             context->compressedTexImage2D(
                 params.getParam("targetPacked", ParamType::TTextureTarget, 0)
                     .value.TextureTargetVal,
@@ -390,7 +390,7 @@
                 replayContext->getAsConstPointer<const void *>(
                     params.getParam("data", ParamType::TvoidConstPointer, 7)));
             break;
-        case gl::EntryPoint::CompressedTexImage3D:
+        case angle::EntryPoint::GLCompressedTexImage3D:
             context->compressedTexImage3D(
                 params.getParam("targetPacked", ParamType::TTextureTarget, 0)
                     .value.TextureTargetVal,
@@ -404,7 +404,7 @@
                 replayContext->getAsConstPointer<const void *>(
                     params.getParam("data", ParamType::TvoidConstPointer, 8)));
             break;
-        case gl::EntryPoint::CompressedTexSubImage2D:
+        case angle::EntryPoint::GLCompressedTexSubImage2D:
             context->compressedTexSubImage2D(
                 params.getParam("targetPacked", ParamType::TTextureTarget, 0)
                     .value.TextureTargetVal,
@@ -418,7 +418,7 @@
                 replayContext->getAsConstPointer<const void *>(
                     params.getParam("data", ParamType::TvoidConstPointer, 8)));
             break;
-        case gl::EntryPoint::CompressedTexSubImage3D:
+        case angle::EntryPoint::GLCompressedTexSubImage3D:
             context->compressedTexSubImage3D(
                 params.getParam("targetPacked", ParamType::TTextureTarget, 0)
                     .value.TextureTargetVal,
@@ -434,7 +434,7 @@
                 replayContext->getAsConstPointer<const void *>(
                     params.getParam("data", ParamType::TvoidConstPointer, 10)));
             break;
-        case gl::EntryPoint::CopyBufferSubData:
+        case angle::EntryPoint::GLCopyBufferSubData:
             context->copyBufferSubData(
                 params.getParam("readTargetPacked", ParamType::TBufferBinding, 0)
                     .value.BufferBindingVal,
@@ -444,7 +444,7 @@
                 params.getParam("writeOffset", ParamType::TGLintptr, 3).value.GLintptrVal,
                 params.getParam("size", ParamType::TGLsizeiptr, 4).value.GLsizeiptrVal);
             break;
-        case gl::EntryPoint::CopyImageSubData:
+        case angle::EntryPoint::GLCopyImageSubData:
             context->copyImageSubData(
                 params.getParam("srcName", ParamType::TGLuint, 0).value.GLuintVal,
                 params.getParam("srcTarget", ParamType::TGLenum, 1).value.GLenumVal,
@@ -462,7 +462,7 @@
                 params.getParam("srcHeight", ParamType::TGLsizei, 13).value.GLsizeiVal,
                 params.getParam("srcDepth", ParamType::TGLsizei, 14).value.GLsizeiVal);
             break;
-        case gl::EntryPoint::CopyTexImage2D:
+        case angle::EntryPoint::GLCopyTexImage2D:
             context->copyTexImage2D(
                 params.getParam("targetPacked", ParamType::TTextureTarget, 0)
                     .value.TextureTargetVal,
@@ -474,7 +474,7 @@
                 params.getParam("height", ParamType::TGLsizei, 6).value.GLsizeiVal,
                 params.getParam("border", ParamType::TGLint, 7).value.GLintVal);
             break;
-        case gl::EntryPoint::CopyTexSubImage2D:
+        case angle::EntryPoint::GLCopyTexSubImage2D:
             context->copyTexSubImage2D(
                 params.getParam("targetPacked", ParamType::TTextureTarget, 0)
                     .value.TextureTargetVal,
@@ -486,7 +486,7 @@
                 params.getParam("width", ParamType::TGLsizei, 6).value.GLsizeiVal,
                 params.getParam("height", ParamType::TGLsizei, 7).value.GLsizeiVal);
             break;
-        case gl::EntryPoint::CopyTexSubImage3D:
+        case angle::EntryPoint::GLCopyTexSubImage3D:
             context->copyTexSubImage3D(
                 params.getParam("targetPacked", ParamType::TTextureTarget, 0)
                     .value.TextureTargetVal,
@@ -499,31 +499,31 @@
                 params.getParam("width", ParamType::TGLsizei, 7).value.GLsizeiVal,
                 params.getParam("height", ParamType::TGLsizei, 8).value.GLsizeiVal);
             break;
-        case gl::EntryPoint::CreateProgram:
+        case angle::EntryPoint::GLCreateProgram:
             context->createProgram();
             break;
-        case gl::EntryPoint::CreateShader:
+        case angle::EntryPoint::GLCreateShader:
             context->createShader(
                 params.getParam("typePacked", ParamType::TShaderType, 0).value.ShaderTypeVal);
             break;
-        case gl::EntryPoint::CreateShaderProgramv:
+        case angle::EntryPoint::GLCreateShaderProgramv:
             context->createShaderProgramv(
                 params.getParam("typePacked", ParamType::TShaderType, 0).value.ShaderTypeVal,
                 params.getParam("count", ParamType::TGLsizei, 1).value.GLsizeiVal,
                 replayContext->getAsPointerConstPointer<const GLchar *const *>(
                     params.getParam("strings", ParamType::TGLcharConstPointerPointer, 2)));
             break;
-        case gl::EntryPoint::CullFace:
+        case angle::EntryPoint::GLCullFace:
             context->cullFace(
                 params.getParam("modePacked", ParamType::TCullFaceMode, 0).value.CullFaceModeVal);
             break;
-        case gl::EntryPoint::DebugMessageCallback:
+        case angle::EntryPoint::GLDebugMessageCallback:
             context->debugMessageCallback(
                 params.getParam("callback", ParamType::TGLDEBUGPROC, 0).value.GLDEBUGPROCVal,
                 replayContext->getAsConstPointer<const void *>(
                     params.getParam("userParam", ParamType::TvoidConstPointer, 1)));
             break;
-        case gl::EntryPoint::DebugMessageControl:
+        case angle::EntryPoint::GLDebugMessageControl:
             context->debugMessageControl(
                 params.getParam("source", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("type", ParamType::TGLenum, 1).value.GLenumVal,
@@ -533,7 +533,7 @@
                     params.getParam("ids", ParamType::TGLuintConstPointer, 4)),
                 params.getParam("enabled", ParamType::TGLboolean, 5).value.GLbooleanVal);
             break;
-        case gl::EntryPoint::DebugMessageInsert:
+        case angle::EntryPoint::GLDebugMessageInsert:
             context->debugMessageInsert(
                 params.getParam("source", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("type", ParamType::TGLenum, 1).value.GLenumVal,
@@ -543,144 +543,144 @@
                 replayContext->getAsConstPointer<const GLchar *>(
                     params.getParam("buf", ParamType::TGLcharConstPointer, 5)));
             break;
-        case gl::EntryPoint::DeleteBuffers:
+        case angle::EntryPoint::GLDeleteBuffers:
             context->deleteBuffers(
                 params.getParam("n", ParamType::TGLsizei, 0).value.GLsizeiVal,
                 replayContext->getAsConstPointer<const BufferID *>(
                     params.getParam("buffersPacked", ParamType::TBufferIDConstPointer, 1)));
             break;
-        case gl::EntryPoint::DeleteFencesNV:
+        case angle::EntryPoint::GLDeleteFencesNV:
             context->deleteFencesNV(
                 params.getParam("n", ParamType::TGLsizei, 0).value.GLsizeiVal,
                 replayContext->getAsConstPointer<const FenceNVID *>(
                     params.getParam("fencesPacked", ParamType::TFenceNVIDConstPointer, 1)));
             break;
-        case gl::EntryPoint::DeleteFramebuffers:
+        case angle::EntryPoint::GLDeleteFramebuffers:
             context->deleteFramebuffers(
                 params.getParam("n", ParamType::TGLsizei, 0).value.GLsizeiVal,
                 replayContext->getAsConstPointer<const FramebufferID *>(params.getParam(
                     "framebuffersPacked", ParamType::TFramebufferIDConstPointer, 1)));
             break;
-        case gl::EntryPoint::DeleteProgram:
+        case angle::EntryPoint::GLDeleteProgram:
             context->deleteProgram(params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                                        .value.ShaderProgramIDVal);
             break;
-        case gl::EntryPoint::DeleteProgramPipelines:
+        case angle::EntryPoint::GLDeleteProgramPipelines:
             context->deleteProgramPipelines(
                 params.getParam("n", ParamType::TGLsizei, 0).value.GLsizeiVal,
                 replayContext->getAsConstPointer<const ProgramPipelineID *>(params.getParam(
                     "pipelinesPacked", ParamType::TProgramPipelineIDConstPointer, 1)));
             break;
-        case gl::EntryPoint::DeleteQueries:
+        case angle::EntryPoint::GLDeleteQueries:
             context->deleteQueries(
                 params.getParam("n", ParamType::TGLsizei, 0).value.GLsizeiVal,
                 replayContext->getAsConstPointer<const QueryID *>(
                     params.getParam("idsPacked", ParamType::TQueryIDConstPointer, 1)));
             break;
-        case gl::EntryPoint::DeleteRenderbuffers:
+        case angle::EntryPoint::GLDeleteRenderbuffers:
             context->deleteRenderbuffers(
                 params.getParam("n", ParamType::TGLsizei, 0).value.GLsizeiVal,
                 replayContext->getAsConstPointer<const RenderbufferID *>(params.getParam(
                     "renderbuffersPacked", ParamType::TRenderbufferIDConstPointer, 1)));
             break;
-        case gl::EntryPoint::DeleteSamplers:
+        case angle::EntryPoint::GLDeleteSamplers:
             context->deleteSamplers(
                 params.getParam("count", ParamType::TGLsizei, 0).value.GLsizeiVal,
                 replayContext->getAsConstPointer<const SamplerID *>(
                     params.getParam("samplersPacked", ParamType::TSamplerIDConstPointer, 1)));
             break;
-        case gl::EntryPoint::DeleteShader:
+        case angle::EntryPoint::GLDeleteShader:
             context->deleteShader(params.getParam("shaderPacked", ParamType::TShaderProgramID, 0)
                                       .value.ShaderProgramIDVal);
             break;
-        case gl::EntryPoint::DeleteSync:
+        case angle::EntryPoint::GLDeleteSync:
             context->deleteSync(params.getParam("sync", ParamType::TGLsync, 0).value.GLsyncVal);
             break;
-        case gl::EntryPoint::DeleteTextures:
+        case angle::EntryPoint::GLDeleteTextures:
             context->deleteTextures(
                 params.getParam("n", ParamType::TGLsizei, 0).value.GLsizeiVal,
                 replayContext->getAsConstPointer<const TextureID *>(
                     params.getParam("texturesPacked", ParamType::TTextureIDConstPointer, 1)));
             break;
-        case gl::EntryPoint::DeleteTransformFeedbacks:
+        case angle::EntryPoint::GLDeleteTransformFeedbacks:
             context->deleteTransformFeedbacks(
                 params.getParam("n", ParamType::TGLsizei, 0).value.GLsizeiVal,
                 replayContext->getAsConstPointer<const TransformFeedbackID *>(
                     params.getParam("idsPacked", ParamType::TTransformFeedbackIDConstPointer, 1)));
             break;
-        case gl::EntryPoint::DeleteVertexArrays:
+        case angle::EntryPoint::GLDeleteVertexArrays:
             context->deleteVertexArrays(
                 params.getParam("n", ParamType::TGLsizei, 0).value.GLsizeiVal,
                 replayContext->getAsConstPointer<const VertexArrayID *>(
                     params.getParam("arraysPacked", ParamType::TVertexArrayIDConstPointer, 1)));
             break;
-        case gl::EntryPoint::DepthFunc:
+        case angle::EntryPoint::GLDepthFunc:
             context->depthFunc(params.getParam("func", ParamType::TGLenum, 0).value.GLenumVal);
             break;
-        case gl::EntryPoint::DepthMask:
+        case angle::EntryPoint::GLDepthMask:
             context->depthMask(
                 params.getParam("flag", ParamType::TGLboolean, 0).value.GLbooleanVal);
             break;
-        case gl::EntryPoint::DepthRangef:
+        case angle::EntryPoint::GLDepthRangef:
             context->depthRangef(params.getParam("n", ParamType::TGLfloat, 0).value.GLfloatVal,
                                  params.getParam("f", ParamType::TGLfloat, 1).value.GLfloatVal);
             break;
-        case gl::EntryPoint::DepthRangex:
+        case angle::EntryPoint::GLDepthRangex:
             context->depthRangex(params.getParam("n", ParamType::TGLfixed, 0).value.GLfixedVal,
                                  params.getParam("f", ParamType::TGLfixed, 1).value.GLfixedVal);
             break;
-        case gl::EntryPoint::DetachShader:
+        case angle::EntryPoint::GLDetachShader:
             context->detachShader(params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                                       .value.ShaderProgramIDVal,
                                   params.getParam("shaderPacked", ParamType::TShaderProgramID, 1)
                                       .value.ShaderProgramIDVal);
             break;
-        case gl::EntryPoint::Disable:
+        case angle::EntryPoint::GLDisable:
             context->disable(params.getParam("cap", ParamType::TGLenum, 0).value.GLenumVal);
             break;
-        case gl::EntryPoint::DisableClientState:
+        case angle::EntryPoint::GLDisableClientState:
             context->disableClientState(
                 params.getParam("arrayPacked", ParamType::TClientVertexArrayType, 0)
                     .value.ClientVertexArrayTypeVal);
             break;
-        case gl::EntryPoint::DisableVertexAttribArray:
+        case angle::EntryPoint::GLDisableVertexAttribArray:
             context->disableVertexAttribArray(
                 params.getParam("index", ParamType::TGLuint, 0).value.GLuintVal);
             break;
-        case gl::EntryPoint::Disablei:
+        case angle::EntryPoint::GLDisablei:
             context->disablei(params.getParam("target", ParamType::TGLenum, 0).value.GLenumVal,
                               params.getParam("index", ParamType::TGLuint, 1).value.GLuintVal);
             break;
-        case gl::EntryPoint::DispatchCompute:
+        case angle::EntryPoint::GLDispatchCompute:
             context->dispatchCompute(
                 params.getParam("num_groups_x", ParamType::TGLuint, 0).value.GLuintVal,
                 params.getParam("num_groups_y", ParamType::TGLuint, 1).value.GLuintVal,
                 params.getParam("num_groups_z", ParamType::TGLuint, 2).value.GLuintVal);
             break;
-        case gl::EntryPoint::DispatchComputeIndirect:
+        case angle::EntryPoint::GLDispatchComputeIndirect:
             context->dispatchComputeIndirect(
                 params.getParam("indirect", ParamType::TGLintptr, 0).value.GLintptrVal);
             break;
-        case gl::EntryPoint::DrawArrays:
+        case angle::EntryPoint::GLDrawArrays:
             context->drawArrays(
                 params.getParam("modePacked", ParamType::TPrimitiveMode, 0).value.PrimitiveModeVal,
                 params.getParam("first", ParamType::TGLint, 1).value.GLintVal,
                 params.getParam("count", ParamType::TGLsizei, 2).value.GLsizeiVal);
             break;
-        case gl::EntryPoint::DrawArraysIndirect:
+        case angle::EntryPoint::GLDrawArraysIndirect:
             context->drawArraysIndirect(
                 params.getParam("modePacked", ParamType::TPrimitiveMode, 0).value.PrimitiveModeVal,
                 replayContext->getAsConstPointer<const void *>(
                     params.getParam("indirect", ParamType::TvoidConstPointer, 1)));
             break;
-        case gl::EntryPoint::DrawArraysInstanced:
+        case angle::EntryPoint::GLDrawArraysInstanced:
             context->drawArraysInstanced(
                 params.getParam("modePacked", ParamType::TPrimitiveMode, 0).value.PrimitiveModeVal,
                 params.getParam("first", ParamType::TGLint, 1).value.GLintVal,
                 params.getParam("count", ParamType::TGLsizei, 2).value.GLsizeiVal,
                 params.getParam("instancecount", ParamType::TGLsizei, 3).value.GLsizeiVal);
             break;
-        case gl::EntryPoint::DrawArraysInstancedBaseInstance:
+        case angle::EntryPoint::GLDrawArraysInstancedBaseInstance:
             context->drawArraysInstancedBaseInstance(
                 params.getParam("modePacked", ParamType::TPrimitiveMode, 0).value.PrimitiveModeVal,
                 params.getParam("first", ParamType::TGLint, 1).value.GLintVal,
@@ -688,12 +688,12 @@
                 params.getParam("instancecount", ParamType::TGLsizei, 3).value.GLsizeiVal,
                 params.getParam("baseinstance", ParamType::TGLuint, 4).value.GLuintVal);
             break;
-        case gl::EntryPoint::DrawBuffers:
+        case angle::EntryPoint::GLDrawBuffers:
             context->drawBuffers(params.getParam("n", ParamType::TGLsizei, 0).value.GLsizeiVal,
                                  replayContext->getAsConstPointer<const GLenum *>(
                                      params.getParam("bufs", ParamType::TGLenumConstPointer, 1)));
             break;
-        case gl::EntryPoint::DrawElements:
+        case angle::EntryPoint::GLDrawElements:
             context->drawElements(
                 params.getParam("modePacked", ParamType::TPrimitiveMode, 0).value.PrimitiveModeVal,
                 params.getParam("count", ParamType::TGLsizei, 1).value.GLsizeiVal,
@@ -702,7 +702,7 @@
                 replayContext->getAsConstPointer<const void *>(
                     params.getParam("indices", ParamType::TvoidConstPointer, 3)));
             break;
-        case gl::EntryPoint::DrawElementsBaseVertex:
+        case angle::EntryPoint::GLDrawElementsBaseVertex:
             context->drawElementsBaseVertex(
                 params.getParam("modePacked", ParamType::TPrimitiveMode, 0).value.PrimitiveModeVal,
                 params.getParam("count", ParamType::TGLsizei, 1).value.GLsizeiVal,
@@ -712,7 +712,7 @@
                     params.getParam("indices", ParamType::TvoidConstPointer, 3)),
                 params.getParam("basevertex", ParamType::TGLint, 4).value.GLintVal);
             break;
-        case gl::EntryPoint::DrawElementsIndirect:
+        case angle::EntryPoint::GLDrawElementsIndirect:
             context->drawElementsIndirect(
                 params.getParam("modePacked", ParamType::TPrimitiveMode, 0).value.PrimitiveModeVal,
                 params.getParam("typePacked", ParamType::TDrawElementsType, 1)
@@ -720,7 +720,7 @@
                 replayContext->getAsConstPointer<const void *>(
                     params.getParam("indirect", ParamType::TvoidConstPointer, 2)));
             break;
-        case gl::EntryPoint::DrawElementsInstanced:
+        case angle::EntryPoint::GLDrawElementsInstanced:
             context->drawElementsInstanced(
                 params.getParam("modePacked", ParamType::TPrimitiveMode, 0).value.PrimitiveModeVal,
                 params.getParam("count", ParamType::TGLsizei, 1).value.GLsizeiVal,
@@ -730,7 +730,7 @@
                     params.getParam("indices", ParamType::TvoidConstPointer, 3)),
                 params.getParam("instancecount", ParamType::TGLsizei, 4).value.GLsizeiVal);
             break;
-        case gl::EntryPoint::DrawElementsInstancedBaseVertex:
+        case angle::EntryPoint::GLDrawElementsInstancedBaseVertex:
             context->drawElementsInstancedBaseVertex(
                 params.getParam("modePacked", ParamType::TPrimitiveMode, 0).value.PrimitiveModeVal,
                 params.getParam("count", ParamType::TGLsizei, 1).value.GLsizeiVal,
@@ -741,7 +741,7 @@
                 params.getParam("instancecount", ParamType::TGLsizei, 4).value.GLsizeiVal,
                 params.getParam("basevertex", ParamType::TGLint, 5).value.GLintVal);
             break;
-        case gl::EntryPoint::DrawElementsInstancedBaseVertexBaseInstance:
+        case angle::EntryPoint::GLDrawElementsInstancedBaseVertexBaseInstance:
             context->drawElementsInstancedBaseVertexBaseInstance(
                 params.getParam("modePacked", ParamType::TPrimitiveMode, 0).value.PrimitiveModeVal,
                 params.getParam("count", ParamType::TGLsizei, 1).value.GLsizeiVal,
@@ -753,7 +753,7 @@
                 params.getParam("basevertex", ParamType::TGLint, 5).value.GLintVal,
                 params.getParam("baseinstance", ParamType::TGLuint, 6).value.GLuintVal);
             break;
-        case gl::EntryPoint::DrawRangeElements:
+        case angle::EntryPoint::GLDrawRangeElements:
             context->drawRangeElements(
                 params.getParam("modePacked", ParamType::TPrimitiveMode, 0).value.PrimitiveModeVal,
                 params.getParam("start", ParamType::TGLuint, 1).value.GLuintVal,
@@ -764,7 +764,7 @@
                 replayContext->getAsConstPointer<const void *>(
                     params.getParam("indices", ParamType::TvoidConstPointer, 5)));
             break;
-        case gl::EntryPoint::DrawRangeElementsBaseVertex:
+        case angle::EntryPoint::GLDrawRangeElementsBaseVertex:
             context->drawRangeElementsBaseVertex(
                 params.getParam("modePacked", ParamType::TPrimitiveMode, 0).value.PrimitiveModeVal,
                 params.getParam("start", ParamType::TGLuint, 1).value.GLuintVal,
@@ -776,76 +776,76 @@
                     params.getParam("indices", ParamType::TvoidConstPointer, 5)),
                 params.getParam("basevertex", ParamType::TGLint, 6).value.GLintVal);
             break;
-        case gl::EntryPoint::Enable:
+        case angle::EntryPoint::GLEnable:
             context->enable(params.getParam("cap", ParamType::TGLenum, 0).value.GLenumVal);
             break;
-        case gl::EntryPoint::EnableClientState:
+        case angle::EntryPoint::GLEnableClientState:
             context->enableClientState(
                 params.getParam("arrayPacked", ParamType::TClientVertexArrayType, 0)
                     .value.ClientVertexArrayTypeVal);
             break;
-        case gl::EntryPoint::EnableVertexAttribArray:
+        case angle::EntryPoint::GLEnableVertexAttribArray:
             context->enableVertexAttribArray(
                 params.getParam("index", ParamType::TGLuint, 0).value.GLuintVal);
             break;
-        case gl::EntryPoint::Enablei:
+        case angle::EntryPoint::GLEnablei:
             context->enablei(params.getParam("target", ParamType::TGLenum, 0).value.GLenumVal,
                              params.getParam("index", ParamType::TGLuint, 1).value.GLuintVal);
             break;
-        case gl::EntryPoint::EndQuery:
+        case angle::EntryPoint::GLEndQuery:
             context->endQuery(
                 params.getParam("targetPacked", ParamType::TQueryType, 0).value.QueryTypeVal);
             break;
-        case gl::EntryPoint::EndTransformFeedback:
+        case angle::EntryPoint::GLEndTransformFeedback:
             context->endTransformFeedback();
             break;
-        case gl::EntryPoint::FenceSync:
+        case angle::EntryPoint::GLFenceSync:
             context->fenceSync(
                 params.getParam("condition", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("flags", ParamType::TGLbitfield, 1).value.GLbitfieldVal);
             break;
-        case gl::EntryPoint::Finish:
+        case angle::EntryPoint::GLFinish:
             context->finish();
             break;
-        case gl::EntryPoint::FinishFenceNV:
+        case angle::EntryPoint::GLFinishFenceNV:
             context->finishFenceNV(
                 params.getParam("fencePacked", ParamType::TFenceNVID, 0).value.FenceNVIDVal);
             break;
-        case gl::EntryPoint::Flush:
+        case angle::EntryPoint::GLFlush:
             context->flush();
             break;
-        case gl::EntryPoint::FlushMappedBufferRange:
+        case angle::EntryPoint::GLFlushMappedBufferRange:
             context->flushMappedBufferRange(
                 params.getParam("targetPacked", ParamType::TBufferBinding, 0)
                     .value.BufferBindingVal,
                 params.getParam("offset", ParamType::TGLintptr, 1).value.GLintptrVal,
                 params.getParam("length", ParamType::TGLsizeiptr, 2).value.GLsizeiptrVal);
             break;
-        case gl::EntryPoint::Fogf:
+        case angle::EntryPoint::GLFogf:
             context->fogf(params.getParam("pname", ParamType::TGLenum, 0).value.GLenumVal,
                           params.getParam("param", ParamType::TGLfloat, 1).value.GLfloatVal);
             break;
-        case gl::EntryPoint::Fogfv:
+        case angle::EntryPoint::GLFogfv:
             context->fogfv(params.getParam("pname", ParamType::TGLenum, 0).value.GLenumVal,
                            replayContext->getAsConstPointer<const GLfloat *>(
                                params.getParam("params", ParamType::TGLfloatConstPointer, 1)));
             break;
-        case gl::EntryPoint::Fogx:
+        case angle::EntryPoint::GLFogx:
             context->fogx(params.getParam("pname", ParamType::TGLenum, 0).value.GLenumVal,
                           params.getParam("param", ParamType::TGLfixed, 1).value.GLfixedVal);
             break;
-        case gl::EntryPoint::Fogxv:
+        case angle::EntryPoint::GLFogxv:
             context->fogxv(params.getParam("pname", ParamType::TGLenum, 0).value.GLenumVal,
                            replayContext->getAsConstPointer<const GLfixed *>(
                                params.getParam("param", ParamType::TGLfixedConstPointer, 1)));
             break;
-        case gl::EntryPoint::FramebufferParameteri:
+        case angle::EntryPoint::GLFramebufferParameteri:
             context->framebufferParameteri(
                 params.getParam("target", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                 params.getParam("param", ParamType::TGLint, 2).value.GLintVal);
             break;
-        case gl::EntryPoint::FramebufferRenderbuffer:
+        case angle::EntryPoint::GLFramebufferRenderbuffer:
             context->framebufferRenderbuffer(
                 params.getParam("target", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("attachment", ParamType::TGLenum, 1).value.GLenumVal,
@@ -853,14 +853,14 @@
                 params.getParam("renderbufferPacked", ParamType::TRenderbufferID, 3)
                     .value.RenderbufferIDVal);
             break;
-        case gl::EntryPoint::FramebufferTexture:
+        case angle::EntryPoint::GLFramebufferTexture:
             context->framebufferTexture(
                 params.getParam("target", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("attachment", ParamType::TGLenum, 1).value.GLenumVal,
                 params.getParam("texturePacked", ParamType::TTextureID, 2).value.TextureIDVal,
                 params.getParam("level", ParamType::TGLint, 3).value.GLintVal);
             break;
-        case gl::EntryPoint::FramebufferTexture2D:
+        case angle::EntryPoint::GLFramebufferTexture2D:
             context->framebufferTexture2D(
                 params.getParam("target", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("attachment", ParamType::TGLenum, 1).value.GLenumVal,
@@ -869,7 +869,7 @@
                 params.getParam("texturePacked", ParamType::TTextureID, 3).value.TextureIDVal,
                 params.getParam("level", ParamType::TGLint, 4).value.GLintVal);
             break;
-        case gl::EntryPoint::FramebufferTexture3D:
+        case angle::EntryPoint::GLFramebufferTexture3D:
             context->framebufferTexture3D(
                 params.getParam("target", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("attachment", ParamType::TGLenum, 1).value.GLenumVal,
@@ -879,7 +879,7 @@
                 params.getParam("level", ParamType::TGLint, 4).value.GLintVal,
                 params.getParam("zoffset", ParamType::TGLint, 5).value.GLintVal);
             break;
-        case gl::EntryPoint::FramebufferTextureLayer:
+        case angle::EntryPoint::GLFramebufferTextureLayer:
             context->framebufferTextureLayer(
                 params.getParam("target", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("attachment", ParamType::TGLenum, 1).value.GLenumVal,
@@ -887,10 +887,10 @@
                 params.getParam("level", ParamType::TGLint, 3).value.GLintVal,
                 params.getParam("layer", ParamType::TGLint, 4).value.GLintVal);
             break;
-        case gl::EntryPoint::FrontFace:
+        case angle::EntryPoint::GLFrontFace:
             context->frontFace(params.getParam("mode", ParamType::TGLenum, 0).value.GLenumVal);
             break;
-        case gl::EntryPoint::Frustumf:
+        case angle::EntryPoint::GLFrustumf:
             context->frustumf(params.getParam("l", ParamType::TGLfloat, 0).value.GLfloatVal,
                               params.getParam("r", ParamType::TGLfloat, 1).value.GLfloatVal,
                               params.getParam("b", ParamType::TGLfloat, 2).value.GLfloatVal,
@@ -898,7 +898,7 @@
                               params.getParam("n", ParamType::TGLfloat, 4).value.GLfloatVal,
                               params.getParam("f", ParamType::TGLfloat, 5).value.GLfloatVal);
             break;
-        case gl::EntryPoint::Frustumx:
+        case angle::EntryPoint::GLFrustumx:
             context->frustumx(params.getParam("l", ParamType::TGLfixed, 0).value.GLfixedVal,
                               params.getParam("r", ParamType::TGLfixed, 1).value.GLfixedVal,
                               params.getParam("b", ParamType::TGLfixed, 2).value.GLfixedVal,
@@ -906,66 +906,66 @@
                               params.getParam("n", ParamType::TGLfixed, 4).value.GLfixedVal,
                               params.getParam("f", ParamType::TGLfixed, 5).value.GLfixedVal);
             break;
-        case gl::EntryPoint::GenBuffers:
+        case angle::EntryPoint::GLGenBuffers:
             context->genBuffers(params.getParam("n", ParamType::TGLsizei, 0).value.GLsizeiVal,
                                 replayContext->getReadBufferPointer<BufferID *>(params.getParam(
                                     "buffersPacked", ParamType::TBufferIDPointer, 1)));
             break;
-        case gl::EntryPoint::GenFencesNV:
+        case angle::EntryPoint::GLGenFencesNV:
             context->genFencesNV(params.getParam("n", ParamType::TGLsizei, 0).value.GLsizeiVal,
                                  replayContext->getReadBufferPointer<FenceNVID *>(params.getParam(
                                      "fencesPacked", ParamType::TFenceNVIDPointer, 1)));
             break;
-        case gl::EntryPoint::GenFramebuffers:
+        case angle::EntryPoint::GLGenFramebuffers:
             context->genFramebuffers(
                 params.getParam("n", ParamType::TGLsizei, 0).value.GLsizeiVal,
                 replayContext->getReadBufferPointer<FramebufferID *>(
                     params.getParam("framebuffersPacked", ParamType::TFramebufferIDPointer, 1)));
             break;
-        case gl::EntryPoint::GenProgramPipelines:
+        case angle::EntryPoint::GLGenProgramPipelines:
             context->genProgramPipelines(
                 params.getParam("n", ParamType::TGLsizei, 0).value.GLsizeiVal,
                 replayContext->getReadBufferPointer<ProgramPipelineID *>(
                     params.getParam("pipelinesPacked", ParamType::TProgramPipelineIDPointer, 1)));
             break;
-        case gl::EntryPoint::GenQueries:
+        case angle::EntryPoint::GLGenQueries:
             context->genQueries(params.getParam("n", ParamType::TGLsizei, 0).value.GLsizeiVal,
                                 replayContext->getReadBufferPointer<QueryID *>(
                                     params.getParam("idsPacked", ParamType::TQueryIDPointer, 1)));
             break;
-        case gl::EntryPoint::GenRenderbuffers:
+        case angle::EntryPoint::GLGenRenderbuffers:
             context->genRenderbuffers(
                 params.getParam("n", ParamType::TGLsizei, 0).value.GLsizeiVal,
                 replayContext->getReadBufferPointer<RenderbufferID *>(
                     params.getParam("renderbuffersPacked", ParamType::TRenderbufferIDPointer, 1)));
             break;
-        case gl::EntryPoint::GenSamplers:
+        case angle::EntryPoint::GLGenSamplers:
             context->genSamplers(params.getParam("count", ParamType::TGLsizei, 0).value.GLsizeiVal,
                                  replayContext->getReadBufferPointer<SamplerID *>(params.getParam(
                                      "samplersPacked", ParamType::TSamplerIDPointer, 1)));
             break;
-        case gl::EntryPoint::GenTextures:
+        case angle::EntryPoint::GLGenTextures:
             context->genTextures(params.getParam("n", ParamType::TGLsizei, 0).value.GLsizeiVal,
                                  replayContext->getReadBufferPointer<TextureID *>(params.getParam(
                                      "texturesPacked", ParamType::TTextureIDPointer, 1)));
             break;
-        case gl::EntryPoint::GenTransformFeedbacks:
+        case angle::EntryPoint::GLGenTransformFeedbacks:
             context->genTransformFeedbacks(
                 params.getParam("n", ParamType::TGLsizei, 0).value.GLsizeiVal,
                 replayContext->getReadBufferPointer<TransformFeedbackID *>(
                     params.getParam("idsPacked", ParamType::TTransformFeedbackIDPointer, 1)));
             break;
-        case gl::EntryPoint::GenVertexArrays:
+        case angle::EntryPoint::GLGenVertexArrays:
             context->genVertexArrays(
                 params.getParam("n", ParamType::TGLsizei, 0).value.GLsizeiVal,
                 replayContext->getReadBufferPointer<VertexArrayID *>(
                     params.getParam("arraysPacked", ParamType::TVertexArrayIDPointer, 1)));
             break;
-        case gl::EntryPoint::GenerateMipmap:
+        case angle::EntryPoint::GLGenerateMipmap:
             context->generateMipmap(
                 params.getParam("targetPacked", ParamType::TTextureType, 0).value.TextureTypeVal);
             break;
-        case gl::EntryPoint::GetActiveAttrib:
+        case angle::EntryPoint::GLGetActiveAttrib:
             context->getActiveAttrib(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -980,7 +980,7 @@
                 replayContext->getReadBufferPointer<GLchar *>(
                     params.getParam("name", ParamType::TGLcharPointer, 6)));
             break;
-        case gl::EntryPoint::GetActiveUniform:
+        case angle::EntryPoint::GLGetActiveUniform:
             context->getActiveUniform(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -995,7 +995,7 @@
                 replayContext->getReadBufferPointer<GLchar *>(
                     params.getParam("name", ParamType::TGLcharPointer, 6)));
             break;
-        case gl::EntryPoint::GetActiveUniformBlockName:
+        case angle::EntryPoint::GLGetActiveUniformBlockName:
             context->getActiveUniformBlockName(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -1006,7 +1006,7 @@
                 replayContext->getReadBufferPointer<GLchar *>(
                     params.getParam("uniformBlockName", ParamType::TGLcharPointer, 4)));
             break;
-        case gl::EntryPoint::GetActiveUniformBlockiv:
+        case angle::EntryPoint::GLGetActiveUniformBlockiv:
             context->getActiveUniformBlockiv(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -1015,7 +1015,7 @@
                 replayContext->getReadBufferPointer<GLint *>(
                     params.getParam("params", ParamType::TGLintPointer, 3)));
             break;
-        case gl::EntryPoint::GetActiveUniformsiv:
+        case angle::EntryPoint::GLGetActiveUniformsiv:
             context->getActiveUniformsiv(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -1026,7 +1026,7 @@
                 replayContext->getReadBufferPointer<GLint *>(
                     params.getParam("params", ParamType::TGLintPointer, 4)));
             break;
-        case gl::EntryPoint::GetAttachedShaders:
+        case angle::EntryPoint::GLGetAttachedShaders:
             context->getAttachedShaders(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -1036,25 +1036,25 @@
                 replayContext->getReadBufferPointer<ShaderProgramID *>(
                     params.getParam("shadersPacked", ParamType::TShaderProgramIDPointer, 3)));
             break;
-        case gl::EntryPoint::GetAttribLocation:
+        case angle::EntryPoint::GLGetAttribLocation:
             context->getAttribLocation(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
                 replayContext->getAsConstPointer<const GLchar *>(
                     params.getParam("name", ParamType::TGLcharConstPointer, 1)));
             break;
-        case gl::EntryPoint::GetBooleani_v:
+        case angle::EntryPoint::GLGetBooleani_v:
             context->getBooleani_v(params.getParam("target", ParamType::TGLenum, 0).value.GLenumVal,
                                    params.getParam("index", ParamType::TGLuint, 1).value.GLuintVal,
                                    replayContext->getReadBufferPointer<GLboolean *>(
                                        params.getParam("data", ParamType::TGLbooleanPointer, 2)));
             break;
-        case gl::EntryPoint::GetBooleanv:
+        case angle::EntryPoint::GLGetBooleanv:
             context->getBooleanv(params.getParam("pname", ParamType::TGLenum, 0).value.GLenumVal,
                                  replayContext->getReadBufferPointer<GLboolean *>(
                                      params.getParam("data", ParamType::TGLbooleanPointer, 1)));
             break;
-        case gl::EntryPoint::GetBufferParameteri64v:
+        case angle::EntryPoint::GLGetBufferParameteri64v:
             context->getBufferParameteri64v(
                 params.getParam("targetPacked", ParamType::TBufferBinding, 0)
                     .value.BufferBindingVal,
@@ -1062,7 +1062,7 @@
                 replayContext->getReadBufferPointer<GLint64 *>(
                     params.getParam("params", ParamType::TGLint64Pointer, 2)));
             break;
-        case gl::EntryPoint::GetBufferParameteriv:
+        case angle::EntryPoint::GLGetBufferParameteriv:
             context->getBufferParameteriv(
                 params.getParam("targetPacked", ParamType::TBufferBinding, 0)
                     .value.BufferBindingVal,
@@ -1070,7 +1070,7 @@
                 replayContext->getReadBufferPointer<GLint *>(
                     params.getParam("params", ParamType::TGLintPointer, 2)));
             break;
-        case gl::EntryPoint::GetBufferPointerv:
+        case angle::EntryPoint::GLGetBufferPointerv:
             context->getBufferPointerv(
                 params.getParam("targetPacked", ParamType::TBufferBinding, 0)
                     .value.BufferBindingVal,
@@ -1078,17 +1078,17 @@
                 replayContext->getReadBufferPointer<void **>(
                     params.getParam("params", ParamType::TvoidPointerPointer, 2)));
             break;
-        case gl::EntryPoint::GetClipPlanef:
+        case angle::EntryPoint::GLGetClipPlanef:
             context->getClipPlanef(params.getParam("plane", ParamType::TGLenum, 0).value.GLenumVal,
                                    replayContext->getReadBufferPointer<GLfloat *>(
                                        params.getParam("equation", ParamType::TGLfloatPointer, 1)));
             break;
-        case gl::EntryPoint::GetClipPlanex:
+        case angle::EntryPoint::GLGetClipPlanex:
             context->getClipPlanex(params.getParam("plane", ParamType::TGLenum, 0).value.GLenumVal,
                                    replayContext->getReadBufferPointer<GLfixed *>(
                                        params.getParam("equation", ParamType::TGLfixedPointer, 1)));
             break;
-        case gl::EntryPoint::GetDebugMessageLog:
+        case angle::EntryPoint::GLGetDebugMessageLog:
             context->getDebugMessageLog(
                 params.getParam("count", ParamType::TGLuint, 0).value.GLuintVal,
                 params.getParam("bufSize", ParamType::TGLsizei, 1).value.GLsizeiVal,
@@ -1105,41 +1105,41 @@
                 replayContext->getReadBufferPointer<GLchar *>(
                     params.getParam("messageLog", ParamType::TGLcharPointer, 7)));
             break;
-        case gl::EntryPoint::GetError:
+        case angle::EntryPoint::GLGetError:
             context->getError();
             break;
-        case gl::EntryPoint::GetFenceivNV:
+        case angle::EntryPoint::GLGetFenceivNV:
             context->getFenceivNV(
                 params.getParam("fencePacked", ParamType::TFenceNVID, 0).value.FenceNVIDVal,
                 params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                 replayContext->getReadBufferPointer<GLint *>(
                     params.getParam("params", ParamType::TGLintPointer, 2)));
             break;
-        case gl::EntryPoint::GetFixedv:
+        case angle::EntryPoint::GLGetFixedv:
             context->getFixedv(params.getParam("pname", ParamType::TGLenum, 0).value.GLenumVal,
                                replayContext->getReadBufferPointer<GLfixed *>(
                                    params.getParam("params", ParamType::TGLfixedPointer, 1)));
             break;
-        case gl::EntryPoint::GetFloatv:
+        case angle::EntryPoint::GLGetFloatv:
             context->getFloatv(params.getParam("pname", ParamType::TGLenum, 0).value.GLenumVal,
                                replayContext->getReadBufferPointer<GLfloat *>(
                                    params.getParam("data", ParamType::TGLfloatPointer, 1)));
             break;
-        case gl::EntryPoint::GetFragDataIndex:
+        case angle::EntryPoint::GLGetFragDataIndex:
             context->getFragDataIndex(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
                 replayContext->getAsConstPointer<const GLchar *>(
                     params.getParam("name", ParamType::TGLcharConstPointer, 1)));
             break;
-        case gl::EntryPoint::GetFragDataLocation:
+        case angle::EntryPoint::GLGetFragDataLocation:
             context->getFragDataLocation(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
                 replayContext->getAsConstPointer<const GLchar *>(
                     params.getParam("name", ParamType::TGLcharConstPointer, 1)));
             break;
-        case gl::EntryPoint::GetFramebufferAttachmentParameteriv:
+        case angle::EntryPoint::GLGetFramebufferAttachmentParameteriv:
             context->getFramebufferAttachmentParameteriv(
                 params.getParam("target", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("attachment", ParamType::TGLenum, 1).value.GLenumVal,
@@ -1147,40 +1147,40 @@
                 replayContext->getReadBufferPointer<GLint *>(
                     params.getParam("params", ParamType::TGLintPointer, 3)));
             break;
-        case gl::EntryPoint::GetFramebufferParameteriv:
+        case angle::EntryPoint::GLGetFramebufferParameteriv:
             context->getFramebufferParameteriv(
                 params.getParam("target", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                 replayContext->getReadBufferPointer<GLint *>(
                     params.getParam("params", ParamType::TGLintPointer, 2)));
             break;
-        case gl::EntryPoint::GetGraphicsResetStatus:
+        case angle::EntryPoint::GLGetGraphicsResetStatus:
             context->getGraphicsResetStatus();
             break;
-        case gl::EntryPoint::GetInteger64i_v:
+        case angle::EntryPoint::GLGetInteger64i_v:
             context->getInteger64i_v(
                 params.getParam("target", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("index", ParamType::TGLuint, 1).value.GLuintVal,
                 replayContext->getReadBufferPointer<GLint64 *>(
                     params.getParam("data", ParamType::TGLint64Pointer, 2)));
             break;
-        case gl::EntryPoint::GetInteger64v:
+        case angle::EntryPoint::GLGetInteger64v:
             context->getInteger64v(params.getParam("pname", ParamType::TGLenum, 0).value.GLenumVal,
                                    replayContext->getReadBufferPointer<GLint64 *>(
                                        params.getParam("data", ParamType::TGLint64Pointer, 1)));
             break;
-        case gl::EntryPoint::GetIntegeri_v:
+        case angle::EntryPoint::GLGetIntegeri_v:
             context->getIntegeri_v(params.getParam("target", ParamType::TGLenum, 0).value.GLenumVal,
                                    params.getParam("index", ParamType::TGLuint, 1).value.GLuintVal,
                                    replayContext->getReadBufferPointer<GLint *>(
                                        params.getParam("data", ParamType::TGLintPointer, 2)));
             break;
-        case gl::EntryPoint::GetIntegerv:
+        case angle::EntryPoint::GLGetIntegerv:
             context->getIntegerv(params.getParam("pname", ParamType::TGLenum, 0).value.GLenumVal,
                                  replayContext->getReadBufferPointer<GLint *>(
                                      params.getParam("data", ParamType::TGLintPointer, 1)));
             break;
-        case gl::EntryPoint::GetInternalformativ:
+        case angle::EntryPoint::GLGetInternalformativ:
             context->getInternalformativ(
                 params.getParam("target", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("internalformat", ParamType::TGLenum, 1).value.GLenumVal,
@@ -1189,42 +1189,42 @@
                 replayContext->getReadBufferPointer<GLint *>(
                     params.getParam("params", ParamType::TGLintPointer, 4)));
             break;
-        case gl::EntryPoint::GetLightfv:
+        case angle::EntryPoint::GLGetLightfv:
             context->getLightfv(params.getParam("light", ParamType::TGLenum, 0).value.GLenumVal,
                                 params.getParam("pnamePacked", ParamType::TLightParameter, 1)
                                     .value.LightParameterVal,
                                 replayContext->getReadBufferPointer<GLfloat *>(
                                     params.getParam("params", ParamType::TGLfloatPointer, 2)));
             break;
-        case gl::EntryPoint::GetLightxv:
+        case angle::EntryPoint::GLGetLightxv:
             context->getLightxv(params.getParam("light", ParamType::TGLenum, 0).value.GLenumVal,
                                 params.getParam("pnamePacked", ParamType::TLightParameter, 1)
                                     .value.LightParameterVal,
                                 replayContext->getReadBufferPointer<GLfixed *>(
                                     params.getParam("params", ParamType::TGLfixedPointer, 2)));
             break;
-        case gl::EntryPoint::GetMaterialfv:
+        case angle::EntryPoint::GLGetMaterialfv:
             context->getMaterialfv(params.getParam("face", ParamType::TGLenum, 0).value.GLenumVal,
                                    params.getParam("pnamePacked", ParamType::TMaterialParameter, 1)
                                        .value.MaterialParameterVal,
                                    replayContext->getReadBufferPointer<GLfloat *>(
                                        params.getParam("params", ParamType::TGLfloatPointer, 2)));
             break;
-        case gl::EntryPoint::GetMaterialxv:
+        case angle::EntryPoint::GLGetMaterialxv:
             context->getMaterialxv(params.getParam("face", ParamType::TGLenum, 0).value.GLenumVal,
                                    params.getParam("pnamePacked", ParamType::TMaterialParameter, 1)
                                        .value.MaterialParameterVal,
                                    replayContext->getReadBufferPointer<GLfixed *>(
                                        params.getParam("params", ParamType::TGLfixedPointer, 2)));
             break;
-        case gl::EntryPoint::GetMultisamplefv:
+        case angle::EntryPoint::GLGetMultisamplefv:
             context->getMultisamplefv(
                 params.getParam("pname", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("index", ParamType::TGLuint, 1).value.GLuintVal,
                 replayContext->getReadBufferPointer<GLfloat *>(
                     params.getParam("val", ParamType::TGLfloatPointer, 2)));
             break;
-        case gl::EntryPoint::GetObjectLabel:
+        case angle::EntryPoint::GLGetObjectLabel:
             context->getObjectLabel(
                 params.getParam("identifier", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("name", ParamType::TGLuint, 1).value.GLuintVal,
@@ -1234,7 +1234,7 @@
                 replayContext->getReadBufferPointer<GLchar *>(
                     params.getParam("label", ParamType::TGLcharPointer, 4)));
             break;
-        case gl::EntryPoint::GetObjectPtrLabel:
+        case angle::EntryPoint::GLGetObjectPtrLabel:
             context->getObjectPtrLabel(
                 replayContext->getAsConstPointer<const void *>(
                     params.getParam("ptr", ParamType::TvoidConstPointer, 0)),
@@ -1244,12 +1244,12 @@
                 replayContext->getReadBufferPointer<GLchar *>(
                     params.getParam("label", ParamType::TGLcharPointer, 3)));
             break;
-        case gl::EntryPoint::GetPointerv:
+        case angle::EntryPoint::GLGetPointerv:
             context->getPointerv(params.getParam("pname", ParamType::TGLenum, 0).value.GLenumVal,
                                  replayContext->getReadBufferPointer<void **>(
                                      params.getParam("params", ParamType::TvoidPointerPointer, 1)));
             break;
-        case gl::EntryPoint::GetProgramBinary:
+        case angle::EntryPoint::GLGetProgramBinary:
             context->getProgramBinary(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -1261,7 +1261,7 @@
                 replayContext->getReadBufferPointer<void *>(
                     params.getParam("binary", ParamType::TvoidPointer, 4)));
             break;
-        case gl::EntryPoint::GetProgramInfoLog:
+        case angle::EntryPoint::GLGetProgramInfoLog:
             context->getProgramInfoLog(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -1271,7 +1271,7 @@
                 replayContext->getReadBufferPointer<GLchar *>(
                     params.getParam("infoLog", ParamType::TGLcharPointer, 3)));
             break;
-        case gl::EntryPoint::GetProgramInterfaceiv:
+        case angle::EntryPoint::GLGetProgramInterfaceiv:
             context->getProgramInterfaceiv(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -1280,7 +1280,7 @@
                 replayContext->getReadBufferPointer<GLint *>(
                     params.getParam("params", ParamType::TGLintPointer, 3)));
             break;
-        case gl::EntryPoint::GetProgramPipelineInfoLog:
+        case angle::EntryPoint::GLGetProgramPipelineInfoLog:
             context->getProgramPipelineInfoLog(
                 params.getParam("pipelinePacked", ParamType::TProgramPipelineID, 0)
                     .value.ProgramPipelineIDVal,
@@ -1290,7 +1290,7 @@
                 replayContext->getReadBufferPointer<GLchar *>(
                     params.getParam("infoLog", ParamType::TGLcharPointer, 3)));
             break;
-        case gl::EntryPoint::GetProgramPipelineiv:
+        case angle::EntryPoint::GLGetProgramPipelineiv:
             context->getProgramPipelineiv(
                 params.getParam("pipelinePacked", ParamType::TProgramPipelineID, 0)
                     .value.ProgramPipelineIDVal,
@@ -1298,7 +1298,7 @@
                 replayContext->getReadBufferPointer<GLint *>(
                     params.getParam("params", ParamType::TGLintPointer, 2)));
             break;
-        case gl::EntryPoint::GetProgramResourceIndex:
+        case angle::EntryPoint::GLGetProgramResourceIndex:
             context->getProgramResourceIndex(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -1306,7 +1306,7 @@
                 replayContext->getAsConstPointer<const GLchar *>(
                     params.getParam("name", ParamType::TGLcharConstPointer, 2)));
             break;
-        case gl::EntryPoint::GetProgramResourceLocation:
+        case angle::EntryPoint::GLGetProgramResourceLocation:
             context->getProgramResourceLocation(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -1314,7 +1314,7 @@
                 replayContext->getAsConstPointer<const GLchar *>(
                     params.getParam("name", ParamType::TGLcharConstPointer, 2)));
             break;
-        case gl::EntryPoint::GetProgramResourceLocationIndex:
+        case angle::EntryPoint::GLGetProgramResourceLocationIndex:
             context->getProgramResourceLocationIndex(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -1322,7 +1322,7 @@
                 replayContext->getAsConstPointer<const GLchar *>(
                     params.getParam("name", ParamType::TGLcharConstPointer, 2)));
             break;
-        case gl::EntryPoint::GetProgramResourceName:
+        case angle::EntryPoint::GLGetProgramResourceName:
             context->getProgramResourceName(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -1334,7 +1334,7 @@
                 replayContext->getReadBufferPointer<GLchar *>(
                     params.getParam("name", ParamType::TGLcharPointer, 5)));
             break;
-        case gl::EntryPoint::GetProgramResourceiv:
+        case angle::EntryPoint::GLGetProgramResourceiv:
             context->getProgramResourceiv(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -1349,84 +1349,84 @@
                 replayContext->getReadBufferPointer<GLint *>(
                     params.getParam("params", ParamType::TGLintPointer, 7)));
             break;
-        case gl::EntryPoint::GetProgramiv:
+        case angle::EntryPoint::GLGetProgramiv:
             context->getProgramiv(params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                                       .value.ShaderProgramIDVal,
                                   params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                                   replayContext->getReadBufferPointer<GLint *>(
                                       params.getParam("params", ParamType::TGLintPointer, 2)));
             break;
-        case gl::EntryPoint::GetQueryObjecti64v:
+        case angle::EntryPoint::GLGetQueryObjecti64v:
             context->getQueryObjecti64v(
                 params.getParam("idPacked", ParamType::TQueryID, 0).value.QueryIDVal,
                 params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                 replayContext->getReadBufferPointer<GLint64 *>(
                     params.getParam("params", ParamType::TGLint64Pointer, 2)));
             break;
-        case gl::EntryPoint::GetQueryObjectiv:
+        case angle::EntryPoint::GLGetQueryObjectiv:
             context->getQueryObjectiv(
                 params.getParam("idPacked", ParamType::TQueryID, 0).value.QueryIDVal,
                 params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                 replayContext->getReadBufferPointer<GLint *>(
                     params.getParam("params", ParamType::TGLintPointer, 2)));
             break;
-        case gl::EntryPoint::GetQueryObjectui64v:
+        case angle::EntryPoint::GLGetQueryObjectui64v:
             context->getQueryObjectui64v(
                 params.getParam("idPacked", ParamType::TQueryID, 0).value.QueryIDVal,
                 params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                 replayContext->getReadBufferPointer<GLuint64 *>(
                     params.getParam("params", ParamType::TGLuint64Pointer, 2)));
             break;
-        case gl::EntryPoint::GetQueryObjectuiv:
+        case angle::EntryPoint::GLGetQueryObjectuiv:
             context->getQueryObjectuiv(
                 params.getParam("idPacked", ParamType::TQueryID, 0).value.QueryIDVal,
                 params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                 replayContext->getReadBufferPointer<GLuint *>(
                     params.getParam("params", ParamType::TGLuintPointer, 2)));
             break;
-        case gl::EntryPoint::GetQueryiv:
+        case angle::EntryPoint::GLGetQueryiv:
             context->getQueryiv(
                 params.getParam("targetPacked", ParamType::TQueryType, 0).value.QueryTypeVal,
                 params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                 replayContext->getReadBufferPointer<GLint *>(
                     params.getParam("params", ParamType::TGLintPointer, 2)));
             break;
-        case gl::EntryPoint::GetRenderbufferParameteriv:
+        case angle::EntryPoint::GLGetRenderbufferParameteriv:
             context->getRenderbufferParameteriv(
                 params.getParam("target", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                 replayContext->getReadBufferPointer<GLint *>(
                     params.getParam("params", ParamType::TGLintPointer, 2)));
             break;
-        case gl::EntryPoint::GetSamplerParameterIiv:
+        case angle::EntryPoint::GLGetSamplerParameterIiv:
             context->getSamplerParameterIiv(
                 params.getParam("samplerPacked", ParamType::TSamplerID, 0).value.SamplerIDVal,
                 params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                 replayContext->getReadBufferPointer<GLint *>(
                     params.getParam("params", ParamType::TGLintPointer, 2)));
             break;
-        case gl::EntryPoint::GetSamplerParameterIuiv:
+        case angle::EntryPoint::GLGetSamplerParameterIuiv:
             context->getSamplerParameterIuiv(
                 params.getParam("samplerPacked", ParamType::TSamplerID, 0).value.SamplerIDVal,
                 params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                 replayContext->getReadBufferPointer<GLuint *>(
                     params.getParam("params", ParamType::TGLuintPointer, 2)));
             break;
-        case gl::EntryPoint::GetSamplerParameterfv:
+        case angle::EntryPoint::GLGetSamplerParameterfv:
             context->getSamplerParameterfv(
                 params.getParam("samplerPacked", ParamType::TSamplerID, 0).value.SamplerIDVal,
                 params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                 replayContext->getReadBufferPointer<GLfloat *>(
                     params.getParam("params", ParamType::TGLfloatPointer, 2)));
             break;
-        case gl::EntryPoint::GetSamplerParameteriv:
+        case angle::EntryPoint::GLGetSamplerParameteriv:
             context->getSamplerParameteriv(
                 params.getParam("samplerPacked", ParamType::TSamplerID, 0).value.SamplerIDVal,
                 params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                 replayContext->getReadBufferPointer<GLint *>(
                     params.getParam("params", ParamType::TGLintPointer, 2)));
             break;
-        case gl::EntryPoint::GetShaderInfoLog:
+        case angle::EntryPoint::GLGetShaderInfoLog:
             context->getShaderInfoLog(
                 params.getParam("shaderPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -1436,7 +1436,7 @@
                 replayContext->getReadBufferPointer<GLchar *>(
                     params.getParam("infoLog", ParamType::TGLcharPointer, 3)));
             break;
-        case gl::EntryPoint::GetShaderPrecisionFormat:
+        case angle::EntryPoint::GLGetShaderPrecisionFormat:
             context->getShaderPrecisionFormat(
                 params.getParam("shadertype", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("precisiontype", ParamType::TGLenum, 1).value.GLenumVal,
@@ -1445,7 +1445,7 @@
                 replayContext->getReadBufferPointer<GLint *>(
                     params.getParam("precision", ParamType::TGLintPointer, 3)));
             break;
-        case gl::EntryPoint::GetShaderSource:
+        case angle::EntryPoint::GLGetShaderSource:
             context->getShaderSource(
                 params.getParam("shaderPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -1455,21 +1455,21 @@
                 replayContext->getReadBufferPointer<GLchar *>(
                     params.getParam("source", ParamType::TGLcharPointer, 3)));
             break;
-        case gl::EntryPoint::GetShaderiv:
+        case angle::EntryPoint::GLGetShaderiv:
             context->getShaderiv(params.getParam("shaderPacked", ParamType::TShaderProgramID, 0)
                                      .value.ShaderProgramIDVal,
                                  params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                                  replayContext->getReadBufferPointer<GLint *>(
                                      params.getParam("params", ParamType::TGLintPointer, 2)));
             break;
-        case gl::EntryPoint::GetString:
+        case angle::EntryPoint::GLGetString:
             context->getString(params.getParam("name", ParamType::TGLenum, 0).value.GLenumVal);
             break;
-        case gl::EntryPoint::GetStringi:
+        case angle::EntryPoint::GLGetStringi:
             context->getStringi(params.getParam("name", ParamType::TGLenum, 0).value.GLenumVal,
                                 params.getParam("index", ParamType::TGLuint, 1).value.GLuintVal);
             break;
-        case gl::EntryPoint::GetSynciv:
+        case angle::EntryPoint::GLGetSynciv:
             context->getSynciv(params.getParam("sync", ParamType::TGLsync, 0).value.GLsyncVal,
                                params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                                params.getParam("bufSize", ParamType::TGLsizei, 2).value.GLsizeiVal,
@@ -1478,7 +1478,7 @@
                                replayContext->getReadBufferPointer<GLint *>(
                                    params.getParam("values", ParamType::TGLintPointer, 4)));
             break;
-        case gl::EntryPoint::GetTexEnvfv:
+        case angle::EntryPoint::GLGetTexEnvfv:
             context->getTexEnvfv(params.getParam("targetPacked", ParamType::TTextureEnvTarget, 0)
                                      .value.TextureEnvTargetVal,
                                  params.getParam("pnamePacked", ParamType::TTextureEnvParameter, 1)
@@ -1486,7 +1486,7 @@
                                  replayContext->getReadBufferPointer<GLfloat *>(
                                      params.getParam("params", ParamType::TGLfloatPointer, 2)));
             break;
-        case gl::EntryPoint::GetTexEnviv:
+        case angle::EntryPoint::GLGetTexEnviv:
             context->getTexEnviv(params.getParam("targetPacked", ParamType::TTextureEnvTarget, 0)
                                      .value.TextureEnvTargetVal,
                                  params.getParam("pnamePacked", ParamType::TTextureEnvParameter, 1)
@@ -1494,7 +1494,7 @@
                                  replayContext->getReadBufferPointer<GLint *>(
                                      params.getParam("params", ParamType::TGLintPointer, 2)));
             break;
-        case gl::EntryPoint::GetTexEnvxv:
+        case angle::EntryPoint::GLGetTexEnvxv:
             context->getTexEnvxv(params.getParam("targetPacked", ParamType::TTextureEnvTarget, 0)
                                      .value.TextureEnvTargetVal,
                                  params.getParam("pnamePacked", ParamType::TTextureEnvParameter, 1)
@@ -1502,19 +1502,19 @@
                                  replayContext->getReadBufferPointer<GLfixed *>(
                                      params.getParam("params", ParamType::TGLfixedPointer, 2)));
             break;
-        case gl::EntryPoint::GetTexGenfv:
+        case angle::EntryPoint::GLGetTexGenfv:
             context->getTexGenfv(params.getParam("coord", ParamType::TGLenum, 0).value.GLenumVal,
                                  params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                                  replayContext->getReadBufferPointer<GLfloat *>(
                                      params.getParam("params", ParamType::TGLfloatPointer, 2)));
             break;
-        case gl::EntryPoint::GetTexGeniv:
+        case angle::EntryPoint::GLGetTexGeniv:
             context->getTexGeniv(params.getParam("coord", ParamType::TGLenum, 0).value.GLenumVal,
                                  params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                                  replayContext->getReadBufferPointer<GLint *>(
                                      params.getParam("params", ParamType::TGLintPointer, 2)));
             break;
-        case gl::EntryPoint::GetTexImage:
+        case angle::EntryPoint::GLGetTexImage:
             context->getTexImage(params.getParam("targetPacked", ParamType::TTextureTarget, 0)
                                      .value.TextureTargetVal,
                                  params.getParam("level", ParamType::TGLint, 1).value.GLintVal,
@@ -1523,7 +1523,7 @@
                                  replayContext->getReadBufferPointer<void *>(
                                      params.getParam("pixels", ParamType::TvoidPointer, 4)));
             break;
-        case gl::EntryPoint::GetTexLevelParameterfv:
+        case angle::EntryPoint::GLGetTexLevelParameterfv:
             context->getTexLevelParameterfv(
                 params.getParam("targetPacked", ParamType::TTextureTarget, 0)
                     .value.TextureTargetVal,
@@ -1532,7 +1532,7 @@
                 replayContext->getReadBufferPointer<GLfloat *>(
                     params.getParam("params", ParamType::TGLfloatPointer, 3)));
             break;
-        case gl::EntryPoint::GetTexLevelParameteriv:
+        case angle::EntryPoint::GLGetTexLevelParameteriv:
             context->getTexLevelParameteriv(
                 params.getParam("targetPacked", ParamType::TTextureTarget, 0)
                     .value.TextureTargetVal,
@@ -1541,42 +1541,42 @@
                 replayContext->getReadBufferPointer<GLint *>(
                     params.getParam("params", ParamType::TGLintPointer, 3)));
             break;
-        case gl::EntryPoint::GetTexParameterIiv:
+        case angle::EntryPoint::GLGetTexParameterIiv:
             context->getTexParameterIiv(
                 params.getParam("targetPacked", ParamType::TTextureType, 0).value.TextureTypeVal,
                 params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                 replayContext->getReadBufferPointer<GLint *>(
                     params.getParam("params", ParamType::TGLintPointer, 2)));
             break;
-        case gl::EntryPoint::GetTexParameterIuiv:
+        case angle::EntryPoint::GLGetTexParameterIuiv:
             context->getTexParameterIuiv(
                 params.getParam("targetPacked", ParamType::TTextureType, 0).value.TextureTypeVal,
                 params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                 replayContext->getReadBufferPointer<GLuint *>(
                     params.getParam("params", ParamType::TGLuintPointer, 2)));
             break;
-        case gl::EntryPoint::GetTexParameterfv:
+        case angle::EntryPoint::GLGetTexParameterfv:
             context->getTexParameterfv(
                 params.getParam("targetPacked", ParamType::TTextureType, 0).value.TextureTypeVal,
                 params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                 replayContext->getReadBufferPointer<GLfloat *>(
                     params.getParam("params", ParamType::TGLfloatPointer, 2)));
             break;
-        case gl::EntryPoint::GetTexParameteriv:
+        case angle::EntryPoint::GLGetTexParameteriv:
             context->getTexParameteriv(
                 params.getParam("targetPacked", ParamType::TTextureType, 0).value.TextureTypeVal,
                 params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                 replayContext->getReadBufferPointer<GLint *>(
                     params.getParam("params", ParamType::TGLintPointer, 2)));
             break;
-        case gl::EntryPoint::GetTexParameterxv:
+        case angle::EntryPoint::GLGetTexParameterxv:
             context->getTexParameterxv(
                 params.getParam("targetPacked", ParamType::TTextureType, 0).value.TextureTypeVal,
                 params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                 replayContext->getReadBufferPointer<GLfixed *>(
                     params.getParam("params", ParamType::TGLfixedPointer, 2)));
             break;
-        case gl::EntryPoint::GetTransformFeedbackVarying:
+        case angle::EntryPoint::GLGetTransformFeedbackVarying:
             context->getTransformFeedbackVarying(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -1591,14 +1591,14 @@
                 replayContext->getReadBufferPointer<GLchar *>(
                     params.getParam("name", ParamType::TGLcharPointer, 6)));
             break;
-        case gl::EntryPoint::GetUniformBlockIndex:
+        case angle::EntryPoint::GLGetUniformBlockIndex:
             context->getUniformBlockIndex(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
                 replayContext->getAsConstPointer<const GLchar *>(
                     params.getParam("uniformBlockName", ParamType::TGLcharConstPointer, 1)));
             break;
-        case gl::EntryPoint::GetUniformIndices:
+        case angle::EntryPoint::GLGetUniformIndices:
             context->getUniformIndices(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -1608,14 +1608,14 @@
                 replayContext->getReadBufferPointer<GLuint *>(
                     params.getParam("uniformIndices", ParamType::TGLuintPointer, 3)));
             break;
-        case gl::EntryPoint::GetUniformLocation:
+        case angle::EntryPoint::GLGetUniformLocation:
             context->getUniformLocation(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
                 replayContext->getAsConstPointer<const GLchar *>(
                     params.getParam("name", ParamType::TGLcharConstPointer, 1)));
             break;
-        case gl::EntryPoint::GetUniformfv:
+        case angle::EntryPoint::GLGetUniformfv:
             context->getUniformfv(params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                                       .value.ShaderProgramIDVal,
                                   params.getParam("locationPacked", ParamType::TUniformLocation, 1)
@@ -1623,7 +1623,7 @@
                                   replayContext->getReadBufferPointer<GLfloat *>(
                                       params.getParam("params", ParamType::TGLfloatPointer, 2)));
             break;
-        case gl::EntryPoint::GetUniformiv:
+        case angle::EntryPoint::GLGetUniformiv:
             context->getUniformiv(params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                                       .value.ShaderProgramIDVal,
                                   params.getParam("locationPacked", ParamType::TUniformLocation, 1)
@@ -1631,7 +1631,7 @@
                                   replayContext->getReadBufferPointer<GLint *>(
                                       params.getParam("params", ParamType::TGLintPointer, 2)));
             break;
-        case gl::EntryPoint::GetUniformuiv:
+        case angle::EntryPoint::GLGetUniformuiv:
             context->getUniformuiv(params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                                        .value.ShaderProgramIDVal,
                                    params.getParam("locationPacked", ParamType::TUniformLocation, 1)
@@ -1639,42 +1639,42 @@
                                    replayContext->getReadBufferPointer<GLuint *>(
                                        params.getParam("params", ParamType::TGLuintPointer, 2)));
             break;
-        case gl::EntryPoint::GetVertexAttribIiv:
+        case angle::EntryPoint::GLGetVertexAttribIiv:
             context->getVertexAttribIiv(
                 params.getParam("index", ParamType::TGLuint, 0).value.GLuintVal,
                 params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                 replayContext->getReadBufferPointer<GLint *>(
                     params.getParam("params", ParamType::TGLintPointer, 2)));
             break;
-        case gl::EntryPoint::GetVertexAttribIuiv:
+        case angle::EntryPoint::GLGetVertexAttribIuiv:
             context->getVertexAttribIuiv(
                 params.getParam("index", ParamType::TGLuint, 0).value.GLuintVal,
                 params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                 replayContext->getReadBufferPointer<GLuint *>(
                     params.getParam("params", ParamType::TGLuintPointer, 2)));
             break;
-        case gl::EntryPoint::GetVertexAttribPointerv:
+        case angle::EntryPoint::GLGetVertexAttribPointerv:
             context->getVertexAttribPointerv(
                 params.getParam("index", ParamType::TGLuint, 0).value.GLuintVal,
                 params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                 replayContext->getReadBufferPointer<void **>(
                     params.getParam("pointer", ParamType::TvoidPointerPointer, 2)));
             break;
-        case gl::EntryPoint::GetVertexAttribfv:
+        case angle::EntryPoint::GLGetVertexAttribfv:
             context->getVertexAttribfv(
                 params.getParam("index", ParamType::TGLuint, 0).value.GLuintVal,
                 params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                 replayContext->getReadBufferPointer<GLfloat *>(
                     params.getParam("params", ParamType::TGLfloatPointer, 2)));
             break;
-        case gl::EntryPoint::GetVertexAttribiv:
+        case angle::EntryPoint::GLGetVertexAttribiv:
             context->getVertexAttribiv(
                 params.getParam("index", ParamType::TGLuint, 0).value.GLuintVal,
                 params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                 replayContext->getReadBufferPointer<GLint *>(
                     params.getParam("params", ParamType::TGLintPointer, 2)));
             break;
-        case gl::EntryPoint::GetnUniformfv:
+        case angle::EntryPoint::GLGetnUniformfv:
             context->getnUniformfv(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -1684,7 +1684,7 @@
                 replayContext->getReadBufferPointer<GLfloat *>(
                     params.getParam("params", ParamType::TGLfloatPointer, 3)));
             break;
-        case gl::EntryPoint::GetnUniformiv:
+        case angle::EntryPoint::GLGetnUniformiv:
             context->getnUniformiv(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -1694,7 +1694,7 @@
                 replayContext->getReadBufferPointer<GLint *>(
                     params.getParam("params", ParamType::TGLintPointer, 3)));
             break;
-        case gl::EntryPoint::GetnUniformuiv:
+        case angle::EntryPoint::GLGetnUniformuiv:
             context->getnUniformuiv(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -1704,18 +1704,18 @@
                 replayContext->getReadBufferPointer<GLuint *>(
                     params.getParam("params", ParamType::TGLuintPointer, 3)));
             break;
-        case gl::EntryPoint::Hint:
+        case angle::EntryPoint::GLHint:
             context->hint(params.getParam("target", ParamType::TGLenum, 0).value.GLenumVal,
                           params.getParam("mode", ParamType::TGLenum, 1).value.GLenumVal);
             break;
-        case gl::EntryPoint::InvalidateFramebuffer:
+        case angle::EntryPoint::GLInvalidateFramebuffer:
             context->invalidateFramebuffer(
                 params.getParam("target", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("numAttachments", ParamType::TGLsizei, 1).value.GLsizeiVal,
                 replayContext->getAsConstPointer<const GLenum *>(
                     params.getParam("attachments", ParamType::TGLenumConstPointer, 2)));
             break;
-        case gl::EntryPoint::InvalidateSubFramebuffer:
+        case angle::EntryPoint::GLInvalidateSubFramebuffer:
             context->invalidateSubFramebuffer(
                 params.getParam("target", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("numAttachments", ParamType::TGLsizei, 1).value.GLsizeiVal,
@@ -1726,142 +1726,142 @@
                 params.getParam("width", ParamType::TGLsizei, 5).value.GLsizeiVal,
                 params.getParam("height", ParamType::TGLsizei, 6).value.GLsizeiVal);
             break;
-        case gl::EntryPoint::IsBuffer:
+        case angle::EntryPoint::GLIsBuffer:
             context->isBuffer(
                 params.getParam("bufferPacked", ParamType::TBufferID, 0).value.BufferIDVal);
             break;
-        case gl::EntryPoint::IsEnabled:
+        case angle::EntryPoint::GLIsEnabled:
             context->isEnabled(params.getParam("cap", ParamType::TGLenum, 0).value.GLenumVal);
             break;
-        case gl::EntryPoint::IsEnabledi:
+        case angle::EntryPoint::GLIsEnabledi:
             context->isEnabledi(params.getParam("target", ParamType::TGLenum, 0).value.GLenumVal,
                                 params.getParam("index", ParamType::TGLuint, 1).value.GLuintVal);
             break;
-        case gl::EntryPoint::IsFenceNV:
+        case angle::EntryPoint::GLIsFenceNV:
             context->isFenceNV(
                 params.getParam("fencePacked", ParamType::TFenceNVID, 0).value.FenceNVIDVal);
             break;
-        case gl::EntryPoint::IsFramebuffer:
+        case angle::EntryPoint::GLIsFramebuffer:
             context->isFramebuffer(
                 params.getParam("framebufferPacked", ParamType::TFramebufferID, 0)
                     .value.FramebufferIDVal);
             break;
-        case gl::EntryPoint::IsProgram:
+        case angle::EntryPoint::GLIsProgram:
             context->isProgram(params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                                    .value.ShaderProgramIDVal);
             break;
-        case gl::EntryPoint::IsProgramPipeline:
+        case angle::EntryPoint::GLIsProgramPipeline:
             context->isProgramPipeline(
                 params.getParam("pipelinePacked", ParamType::TProgramPipelineID, 0)
                     .value.ProgramPipelineIDVal);
             break;
-        case gl::EntryPoint::IsQuery:
+        case angle::EntryPoint::GLIsQuery:
             context->isQuery(params.getParam("idPacked", ParamType::TQueryID, 0).value.QueryIDVal);
             break;
-        case gl::EntryPoint::IsRenderbuffer:
+        case angle::EntryPoint::GLIsRenderbuffer:
             context->isRenderbuffer(
                 params.getParam("renderbufferPacked", ParamType::TRenderbufferID, 0)
                     .value.RenderbufferIDVal);
             break;
-        case gl::EntryPoint::IsSampler:
+        case angle::EntryPoint::GLIsSampler:
             context->isSampler(
                 params.getParam("samplerPacked", ParamType::TSamplerID, 0).value.SamplerIDVal);
             break;
-        case gl::EntryPoint::IsShader:
+        case angle::EntryPoint::GLIsShader:
             context->isShader(params.getParam("shaderPacked", ParamType::TShaderProgramID, 0)
                                   .value.ShaderProgramIDVal);
             break;
-        case gl::EntryPoint::IsSync:
+        case angle::EntryPoint::GLIsSync:
             context->isSync(params.getParam("sync", ParamType::TGLsync, 0).value.GLsyncVal);
             break;
-        case gl::EntryPoint::IsTexture:
+        case angle::EntryPoint::GLIsTexture:
             context->isTexture(
                 params.getParam("texturePacked", ParamType::TTextureID, 0).value.TextureIDVal);
             break;
-        case gl::EntryPoint::IsTransformFeedback:
+        case angle::EntryPoint::GLIsTransformFeedback:
             context->isTransformFeedback(
                 params.getParam("idPacked", ParamType::TTransformFeedbackID, 0)
                     .value.TransformFeedbackIDVal);
             break;
-        case gl::EntryPoint::IsVertexArray:
+        case angle::EntryPoint::GLIsVertexArray:
             context->isVertexArray(params.getParam("arrayPacked", ParamType::TVertexArrayID, 0)
                                        .value.VertexArrayIDVal);
             break;
-        case gl::EntryPoint::LightModelf:
+        case angle::EntryPoint::GLLightModelf:
             context->lightModelf(params.getParam("pname", ParamType::TGLenum, 0).value.GLenumVal,
                                  params.getParam("param", ParamType::TGLfloat, 1).value.GLfloatVal);
             break;
-        case gl::EntryPoint::LightModelfv:
+        case angle::EntryPoint::GLLightModelfv:
             context->lightModelfv(params.getParam("pname", ParamType::TGLenum, 0).value.GLenumVal,
                                   replayContext->getAsConstPointer<const GLfloat *>(params.getParam(
                                       "params", ParamType::TGLfloatConstPointer, 1)));
             break;
-        case gl::EntryPoint::LightModelx:
+        case angle::EntryPoint::GLLightModelx:
             context->lightModelx(params.getParam("pname", ParamType::TGLenum, 0).value.GLenumVal,
                                  params.getParam("param", ParamType::TGLfixed, 1).value.GLfixedVal);
             break;
-        case gl::EntryPoint::LightModelxv:
+        case angle::EntryPoint::GLLightModelxv:
             context->lightModelxv(params.getParam("pname", ParamType::TGLenum, 0).value.GLenumVal,
                                   replayContext->getAsConstPointer<const GLfixed *>(params.getParam(
                                       "param", ParamType::TGLfixedConstPointer, 1)));
             break;
-        case gl::EntryPoint::Lightf:
+        case angle::EntryPoint::GLLightf:
             context->lightf(params.getParam("light", ParamType::TGLenum, 0).value.GLenumVal,
                             params.getParam("pnamePacked", ParamType::TLightParameter, 1)
                                 .value.LightParameterVal,
                             params.getParam("param", ParamType::TGLfloat, 2).value.GLfloatVal);
             break;
-        case gl::EntryPoint::Lightfv:
+        case angle::EntryPoint::GLLightfv:
             context->lightfv(params.getParam("light", ParamType::TGLenum, 0).value.GLenumVal,
                              params.getParam("pnamePacked", ParamType::TLightParameter, 1)
                                  .value.LightParameterVal,
                              replayContext->getAsConstPointer<const GLfloat *>(
                                  params.getParam("params", ParamType::TGLfloatConstPointer, 2)));
             break;
-        case gl::EntryPoint::Lightx:
+        case angle::EntryPoint::GLLightx:
             context->lightx(params.getParam("light", ParamType::TGLenum, 0).value.GLenumVal,
                             params.getParam("pnamePacked", ParamType::TLightParameter, 1)
                                 .value.LightParameterVal,
                             params.getParam("param", ParamType::TGLfixed, 2).value.GLfixedVal);
             break;
-        case gl::EntryPoint::Lightxv:
+        case angle::EntryPoint::GLLightxv:
             context->lightxv(params.getParam("light", ParamType::TGLenum, 0).value.GLenumVal,
                              params.getParam("pnamePacked", ParamType::TLightParameter, 1)
                                  .value.LightParameterVal,
                              replayContext->getAsConstPointer<const GLfixed *>(
                                  params.getParam("params", ParamType::TGLfixedConstPointer, 2)));
             break;
-        case gl::EntryPoint::LineWidth:
+        case angle::EntryPoint::GLLineWidth:
             context->lineWidth(params.getParam("width", ParamType::TGLfloat, 0).value.GLfloatVal);
             break;
-        case gl::EntryPoint::LineWidthx:
+        case angle::EntryPoint::GLLineWidthx:
             context->lineWidthx(params.getParam("width", ParamType::TGLfixed, 0).value.GLfixedVal);
             break;
-        case gl::EntryPoint::LinkProgram:
+        case angle::EntryPoint::GLLinkProgram:
             context->linkProgram(params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                                      .value.ShaderProgramIDVal);
             break;
-        case gl::EntryPoint::LoadIdentity:
+        case angle::EntryPoint::GLLoadIdentity:
             context->loadIdentity();
             break;
-        case gl::EntryPoint::LoadMatrixf:
+        case angle::EntryPoint::GLLoadMatrixf:
             context->loadMatrixf(replayContext->getAsConstPointer<const GLfloat *>(
                 params.getParam("m", ParamType::TGLfloatConstPointer, 0)));
             break;
-        case gl::EntryPoint::LoadMatrixx:
+        case angle::EntryPoint::GLLoadMatrixx:
             context->loadMatrixx(replayContext->getAsConstPointer<const GLfixed *>(
                 params.getParam("m", ParamType::TGLfixedConstPointer, 0)));
             break;
-        case gl::EntryPoint::LogicOp:
+        case angle::EntryPoint::GLLogicOp:
             context->logicOp(params.getParam("opcodePacked", ParamType::TLogicalOperation, 0)
                                  .value.LogicalOperationVal);
             break;
-        case gl::EntryPoint::MapBuffer:
+        case angle::EntryPoint::GLMapBuffer:
             context->mapBuffer(params.getParam("targetPacked", ParamType::TBufferBinding, 0)
                                    .value.BufferBindingVal,
                                params.getParam("access", ParamType::TGLenum, 1).value.GLenumVal);
             break;
-        case gl::EntryPoint::MapBufferRange:
+        case angle::EntryPoint::GLMapBufferRange:
             context->mapBufferRange(
                 params.getParam("targetPacked", ParamType::TBufferBinding, 0)
                     .value.BufferBindingVal,
@@ -1869,57 +1869,57 @@
                 params.getParam("length", ParamType::TGLsizeiptr, 2).value.GLsizeiptrVal,
                 params.getParam("access", ParamType::TGLbitfield, 3).value.GLbitfieldVal);
             break;
-        case gl::EntryPoint::Materialf:
+        case angle::EntryPoint::GLMaterialf:
             context->materialf(params.getParam("face", ParamType::TGLenum, 0).value.GLenumVal,
                                params.getParam("pnamePacked", ParamType::TMaterialParameter, 1)
                                    .value.MaterialParameterVal,
                                params.getParam("param", ParamType::TGLfloat, 2).value.GLfloatVal);
             break;
-        case gl::EntryPoint::Materialfv:
+        case angle::EntryPoint::GLMaterialfv:
             context->materialfv(params.getParam("face", ParamType::TGLenum, 0).value.GLenumVal,
                                 params.getParam("pnamePacked", ParamType::TMaterialParameter, 1)
                                     .value.MaterialParameterVal,
                                 replayContext->getAsConstPointer<const GLfloat *>(
                                     params.getParam("params", ParamType::TGLfloatConstPointer, 2)));
             break;
-        case gl::EntryPoint::Materialx:
+        case angle::EntryPoint::GLMaterialx:
             context->materialx(params.getParam("face", ParamType::TGLenum, 0).value.GLenumVal,
                                params.getParam("pnamePacked", ParamType::TMaterialParameter, 1)
                                    .value.MaterialParameterVal,
                                params.getParam("param", ParamType::TGLfixed, 2).value.GLfixedVal);
             break;
-        case gl::EntryPoint::Materialxv:
+        case angle::EntryPoint::GLMaterialxv:
             context->materialxv(params.getParam("face", ParamType::TGLenum, 0).value.GLenumVal,
                                 params.getParam("pnamePacked", ParamType::TMaterialParameter, 1)
                                     .value.MaterialParameterVal,
                                 replayContext->getAsConstPointer<const GLfixed *>(
                                     params.getParam("param", ParamType::TGLfixedConstPointer, 2)));
             break;
-        case gl::EntryPoint::MatrixMode:
+        case angle::EntryPoint::GLMatrixMode:
             context->matrixMode(
                 params.getParam("modePacked", ParamType::TMatrixType, 0).value.MatrixTypeVal);
             break;
-        case gl::EntryPoint::MemoryBarrier:
+        case angle::EntryPoint::GLMemoryBarrier:
             context->memoryBarrier(
                 params.getParam("barriers", ParamType::TGLbitfield, 0).value.GLbitfieldVal);
             break;
-        case gl::EntryPoint::MemoryBarrierByRegion:
+        case angle::EntryPoint::GLMemoryBarrierByRegion:
             context->memoryBarrierByRegion(
                 params.getParam("barriers", ParamType::TGLbitfield, 0).value.GLbitfieldVal);
             break;
-        case gl::EntryPoint::MinSampleShading:
+        case angle::EntryPoint::GLMinSampleShading:
             context->minSampleShading(
                 params.getParam("value", ParamType::TGLfloat, 0).value.GLfloatVal);
             break;
-        case gl::EntryPoint::MultMatrixf:
+        case angle::EntryPoint::GLMultMatrixf:
             context->multMatrixf(replayContext->getAsConstPointer<const GLfloat *>(
                 params.getParam("m", ParamType::TGLfloatConstPointer, 0)));
             break;
-        case gl::EntryPoint::MultMatrixx:
+        case angle::EntryPoint::GLMultMatrixx:
             context->multMatrixx(replayContext->getAsConstPointer<const GLfixed *>(
                 params.getParam("m", ParamType::TGLfixedConstPointer, 0)));
             break;
-        case gl::EntryPoint::MultiDrawArrays:
+        case angle::EntryPoint::GLMultiDrawArrays:
             context->multiDrawArrays(
                 params.getParam("modePacked", ParamType::TPrimitiveMode, 0).value.PrimitiveModeVal,
                 replayContext->getAsConstPointer<const GLint *>(
@@ -1928,7 +1928,7 @@
                     params.getParam("count", ParamType::TGLsizeiConstPointer, 2)),
                 params.getParam("drawcount", ParamType::TGLsizei, 3).value.GLsizeiVal);
             break;
-        case gl::EntryPoint::MultiDrawElements:
+        case angle::EntryPoint::GLMultiDrawElements:
             context->multiDrawElements(
                 params.getParam("modePacked", ParamType::TPrimitiveMode, 0).value.PrimitiveModeVal,
                 replayContext->getAsConstPointer<const GLsizei *>(
@@ -1939,7 +1939,7 @@
                     params.getParam("indices", ParamType::TvoidConstPointerPointer, 3)),
                 params.getParam("drawcount", ParamType::TGLsizei, 4).value.GLsizeiVal);
             break;
-        case gl::EntryPoint::MultiDrawElementsBaseVertex:
+        case angle::EntryPoint::GLMultiDrawElementsBaseVertex:
             context->multiDrawElementsBaseVertex(
                 params.getParam("modePacked", ParamType::TPrimitiveMode, 0).value.PrimitiveModeVal,
                 replayContext->getAsConstPointer<const GLsizei *>(
@@ -1952,7 +1952,7 @@
                 replayContext->getAsConstPointer<const GLint *>(
                     params.getParam("basevertex", ParamType::TGLintConstPointer, 5)));
             break;
-        case gl::EntryPoint::MultiTexCoord4f:
+        case angle::EntryPoint::GLMultiTexCoord4f:
             context->multiTexCoord4f(
                 params.getParam("target", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("s", ParamType::TGLfloat, 1).value.GLfloatVal,
@@ -1960,7 +1960,7 @@
                 params.getParam("r", ParamType::TGLfloat, 3).value.GLfloatVal,
                 params.getParam("q", ParamType::TGLfloat, 4).value.GLfloatVal);
             break;
-        case gl::EntryPoint::MultiTexCoord4x:
+        case angle::EntryPoint::GLMultiTexCoord4x:
             context->multiTexCoord4x(
                 params.getParam("texture", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("s", ParamType::TGLfixed, 1).value.GLfixedVal,
@@ -1968,17 +1968,17 @@
                 params.getParam("r", ParamType::TGLfixed, 3).value.GLfixedVal,
                 params.getParam("q", ParamType::TGLfixed, 4).value.GLfixedVal);
             break;
-        case gl::EntryPoint::Normal3f:
+        case angle::EntryPoint::GLNormal3f:
             context->normal3f(params.getParam("nx", ParamType::TGLfloat, 0).value.GLfloatVal,
                               params.getParam("ny", ParamType::TGLfloat, 1).value.GLfloatVal,
                               params.getParam("nz", ParamType::TGLfloat, 2).value.GLfloatVal);
             break;
-        case gl::EntryPoint::Normal3x:
+        case angle::EntryPoint::GLNormal3x:
             context->normal3x(params.getParam("nx", ParamType::TGLfixed, 0).value.GLfixedVal,
                               params.getParam("ny", ParamType::TGLfixed, 1).value.GLfixedVal,
                               params.getParam("nz", ParamType::TGLfixed, 2).value.GLfixedVal);
             break;
-        case gl::EntryPoint::NormalPointer:
+        case angle::EntryPoint::GLNormalPointer:
             context->normalPointer(
                 params.getParam("typePacked", ParamType::TVertexAttribType, 0)
                     .value.VertexAttribTypeVal,
@@ -1986,7 +1986,7 @@
                 replayContext->getAsConstPointer<const void *>(
                     params.getParam("pointer", ParamType::TvoidConstPointer, 2)));
             break;
-        case gl::EntryPoint::ObjectLabel:
+        case angle::EntryPoint::GLObjectLabel:
             context->objectLabel(
                 params.getParam("identifier", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("name", ParamType::TGLuint, 1).value.GLuintVal,
@@ -1994,7 +1994,7 @@
                 replayContext->getAsConstPointer<const GLchar *>(
                     params.getParam("label", ParamType::TGLcharConstPointer, 3)));
             break;
-        case gl::EntryPoint::ObjectPtrLabel:
+        case angle::EntryPoint::GLObjectPtrLabel:
             context->objectPtrLabel(
                 replayContext->getAsConstPointer<const void *>(
                     params.getParam("ptr", ParamType::TvoidConstPointer, 0)),
@@ -2002,7 +2002,7 @@
                 replayContext->getAsConstPointer<const GLchar *>(
                     params.getParam("label", ParamType::TGLcharConstPointer, 2)));
             break;
-        case gl::EntryPoint::Orthof:
+        case angle::EntryPoint::GLOrthof:
             context->orthof(params.getParam("l", ParamType::TGLfloat, 0).value.GLfloatVal,
                             params.getParam("r", ParamType::TGLfloat, 1).value.GLfloatVal,
                             params.getParam("b", ParamType::TGLfloat, 2).value.GLfloatVal,
@@ -2010,7 +2010,7 @@
                             params.getParam("n", ParamType::TGLfloat, 4).value.GLfloatVal,
                             params.getParam("f", ParamType::TGLfloat, 5).value.GLfloatVal);
             break;
-        case gl::EntryPoint::Orthox:
+        case angle::EntryPoint::GLOrthox:
             context->orthox(params.getParam("l", ParamType::TGLfixed, 0).value.GLfixedVal,
                             params.getParam("r", ParamType::TGLfixed, 1).value.GLfixedVal,
                             params.getParam("b", ParamType::TGLfixed, 2).value.GLfixedVal,
@@ -2018,67 +2018,67 @@
                             params.getParam("n", ParamType::TGLfixed, 4).value.GLfixedVal,
                             params.getParam("f", ParamType::TGLfixed, 5).value.GLfixedVal);
             break;
-        case gl::EntryPoint::PatchParameteri:
+        case angle::EntryPoint::GLPatchParameteri:
             context->patchParameteri(
                 params.getParam("pname", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("value", ParamType::TGLint, 1).value.GLintVal);
             break;
-        case gl::EntryPoint::PauseTransformFeedback:
+        case angle::EntryPoint::GLPauseTransformFeedback:
             context->pauseTransformFeedback();
             break;
-        case gl::EntryPoint::PixelStorei:
+        case angle::EntryPoint::GLPixelStorei:
             context->pixelStorei(params.getParam("pname", ParamType::TGLenum, 0).value.GLenumVal,
                                  params.getParam("param", ParamType::TGLint, 1).value.GLintVal);
             break;
-        case gl::EntryPoint::PointParameterf:
+        case angle::EntryPoint::GLPointParameterf:
             context->pointParameterf(
                 params.getParam("pnamePacked", ParamType::TPointParameter, 0)
                     .value.PointParameterVal,
                 params.getParam("param", ParamType::TGLfloat, 1).value.GLfloatVal);
             break;
-        case gl::EntryPoint::PointParameterfv:
+        case angle::EntryPoint::GLPointParameterfv:
             context->pointParameterfv(
                 params.getParam("pnamePacked", ParamType::TPointParameter, 0)
                     .value.PointParameterVal,
                 replayContext->getAsConstPointer<const GLfloat *>(
                     params.getParam("params", ParamType::TGLfloatConstPointer, 1)));
             break;
-        case gl::EntryPoint::PointParameterx:
+        case angle::EntryPoint::GLPointParameterx:
             context->pointParameterx(
                 params.getParam("pnamePacked", ParamType::TPointParameter, 0)
                     .value.PointParameterVal,
                 params.getParam("param", ParamType::TGLfixed, 1).value.GLfixedVal);
             break;
-        case gl::EntryPoint::PointParameterxv:
+        case angle::EntryPoint::GLPointParameterxv:
             context->pointParameterxv(
                 params.getParam("pnamePacked", ParamType::TPointParameter, 0)
                     .value.PointParameterVal,
                 replayContext->getAsConstPointer<const GLfixed *>(
                     params.getParam("params", ParamType::TGLfixedConstPointer, 1)));
             break;
-        case gl::EntryPoint::PointSize:
+        case angle::EntryPoint::GLPointSize:
             context->pointSize(params.getParam("size", ParamType::TGLfloat, 0).value.GLfloatVal);
             break;
-        case gl::EntryPoint::PointSizex:
+        case angle::EntryPoint::GLPointSizex:
             context->pointSizex(params.getParam("size", ParamType::TGLfixed, 0).value.GLfixedVal);
             break;
-        case gl::EntryPoint::PolygonOffset:
+        case angle::EntryPoint::GLPolygonOffset:
             context->polygonOffset(
                 params.getParam("factor", ParamType::TGLfloat, 0).value.GLfloatVal,
                 params.getParam("units", ParamType::TGLfloat, 1).value.GLfloatVal);
             break;
-        case gl::EntryPoint::PolygonOffsetx:
+        case angle::EntryPoint::GLPolygonOffsetx:
             context->polygonOffsetx(
                 params.getParam("factor", ParamType::TGLfixed, 0).value.GLfixedVal,
                 params.getParam("units", ParamType::TGLfixed, 1).value.GLfixedVal);
             break;
-        case gl::EntryPoint::PopDebugGroup:
+        case angle::EntryPoint::GLPopDebugGroup:
             context->popDebugGroup();
             break;
-        case gl::EntryPoint::PopMatrix:
+        case angle::EntryPoint::GLPopMatrix:
             context->popMatrix();
             break;
-        case gl::EntryPoint::PrimitiveBoundingBox:
+        case angle::EntryPoint::GLPrimitiveBoundingBox:
             context->primitiveBoundingBox(
                 params.getParam("minX", ParamType::TGLfloat, 0).value.GLfloatVal,
                 params.getParam("minY", ParamType::TGLfloat, 1).value.GLfloatVal,
@@ -2089,7 +2089,7 @@
                 params.getParam("maxZ", ParamType::TGLfloat, 6).value.GLfloatVal,
                 params.getParam("maxW", ParamType::TGLfloat, 7).value.GLfloatVal);
             break;
-        case gl::EntryPoint::ProgramBinary:
+        case angle::EntryPoint::GLProgramBinary:
             context->programBinary(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -2098,14 +2098,14 @@
                     params.getParam("binary", ParamType::TvoidConstPointer, 2)),
                 params.getParam("length", ParamType::TGLsizei, 3).value.GLsizeiVal);
             break;
-        case gl::EntryPoint::ProgramParameteri:
+        case angle::EntryPoint::GLProgramParameteri:
             context->programParameteri(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
                 params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                 params.getParam("value", ParamType::TGLint, 2).value.GLintVal);
             break;
-        case gl::EntryPoint::ProgramUniform1f:
+        case angle::EntryPoint::GLProgramUniform1f:
             context->programUniform1f(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -2113,7 +2113,7 @@
                     .value.UniformLocationVal,
                 params.getParam("v0", ParamType::TGLfloat, 2).value.GLfloatVal);
             break;
-        case gl::EntryPoint::ProgramUniform1fv:
+        case angle::EntryPoint::GLProgramUniform1fv:
             context->programUniform1fv(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -2123,7 +2123,7 @@
                 replayContext->getAsConstPointer<const GLfloat *>(
                     params.getParam("value", ParamType::TGLfloatConstPointer, 3)));
             break;
-        case gl::EntryPoint::ProgramUniform1i:
+        case angle::EntryPoint::GLProgramUniform1i:
             context->programUniform1i(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -2131,7 +2131,7 @@
                     .value.UniformLocationVal,
                 params.getParam("v0", ParamType::TGLint, 2).value.GLintVal);
             break;
-        case gl::EntryPoint::ProgramUniform1iv:
+        case angle::EntryPoint::GLProgramUniform1iv:
             context->programUniform1iv(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -2141,7 +2141,7 @@
                 replayContext->getAsConstPointer<const GLint *>(
                     params.getParam("value", ParamType::TGLintConstPointer, 3)));
             break;
-        case gl::EntryPoint::ProgramUniform1ui:
+        case angle::EntryPoint::GLProgramUniform1ui:
             context->programUniform1ui(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -2149,7 +2149,7 @@
                     .value.UniformLocationVal,
                 params.getParam("v0", ParamType::TGLuint, 2).value.GLuintVal);
             break;
-        case gl::EntryPoint::ProgramUniform1uiv:
+        case angle::EntryPoint::GLProgramUniform1uiv:
             context->programUniform1uiv(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -2159,7 +2159,7 @@
                 replayContext->getAsConstPointer<const GLuint *>(
                     params.getParam("value", ParamType::TGLuintConstPointer, 3)));
             break;
-        case gl::EntryPoint::ProgramUniform2f:
+        case angle::EntryPoint::GLProgramUniform2f:
             context->programUniform2f(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -2168,7 +2168,7 @@
                 params.getParam("v0", ParamType::TGLfloat, 2).value.GLfloatVal,
                 params.getParam("v1", ParamType::TGLfloat, 3).value.GLfloatVal);
             break;
-        case gl::EntryPoint::ProgramUniform2fv:
+        case angle::EntryPoint::GLProgramUniform2fv:
             context->programUniform2fv(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -2178,7 +2178,7 @@
                 replayContext->getAsConstPointer<const GLfloat *>(
                     params.getParam("value", ParamType::TGLfloatConstPointer, 3)));
             break;
-        case gl::EntryPoint::ProgramUniform2i:
+        case angle::EntryPoint::GLProgramUniform2i:
             context->programUniform2i(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -2187,7 +2187,7 @@
                 params.getParam("v0", ParamType::TGLint, 2).value.GLintVal,
                 params.getParam("v1", ParamType::TGLint, 3).value.GLintVal);
             break;
-        case gl::EntryPoint::ProgramUniform2iv:
+        case angle::EntryPoint::GLProgramUniform2iv:
             context->programUniform2iv(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -2197,7 +2197,7 @@
                 replayContext->getAsConstPointer<const GLint *>(
                     params.getParam("value", ParamType::TGLintConstPointer, 3)));
             break;
-        case gl::EntryPoint::ProgramUniform2ui:
+        case angle::EntryPoint::GLProgramUniform2ui:
             context->programUniform2ui(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -2206,7 +2206,7 @@
                 params.getParam("v0", ParamType::TGLuint, 2).value.GLuintVal,
                 params.getParam("v1", ParamType::TGLuint, 3).value.GLuintVal);
             break;
-        case gl::EntryPoint::ProgramUniform2uiv:
+        case angle::EntryPoint::GLProgramUniform2uiv:
             context->programUniform2uiv(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -2216,7 +2216,7 @@
                 replayContext->getAsConstPointer<const GLuint *>(
                     params.getParam("value", ParamType::TGLuintConstPointer, 3)));
             break;
-        case gl::EntryPoint::ProgramUniform3f:
+        case angle::EntryPoint::GLProgramUniform3f:
             context->programUniform3f(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -2226,7 +2226,7 @@
                 params.getParam("v1", ParamType::TGLfloat, 3).value.GLfloatVal,
                 params.getParam("v2", ParamType::TGLfloat, 4).value.GLfloatVal);
             break;
-        case gl::EntryPoint::ProgramUniform3fv:
+        case angle::EntryPoint::GLProgramUniform3fv:
             context->programUniform3fv(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -2236,7 +2236,7 @@
                 replayContext->getAsConstPointer<const GLfloat *>(
                     params.getParam("value", ParamType::TGLfloatConstPointer, 3)));
             break;
-        case gl::EntryPoint::ProgramUniform3i:
+        case angle::EntryPoint::GLProgramUniform3i:
             context->programUniform3i(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -2246,7 +2246,7 @@
                 params.getParam("v1", ParamType::TGLint, 3).value.GLintVal,
                 params.getParam("v2", ParamType::TGLint, 4).value.GLintVal);
             break;
-        case gl::EntryPoint::ProgramUniform3iv:
+        case angle::EntryPoint::GLProgramUniform3iv:
             context->programUniform3iv(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -2256,7 +2256,7 @@
                 replayContext->getAsConstPointer<const GLint *>(
                     params.getParam("value", ParamType::TGLintConstPointer, 3)));
             break;
-        case gl::EntryPoint::ProgramUniform3ui:
+        case angle::EntryPoint::GLProgramUniform3ui:
             context->programUniform3ui(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -2266,7 +2266,7 @@
                 params.getParam("v1", ParamType::TGLuint, 3).value.GLuintVal,
                 params.getParam("v2", ParamType::TGLuint, 4).value.GLuintVal);
             break;
-        case gl::EntryPoint::ProgramUniform3uiv:
+        case angle::EntryPoint::GLProgramUniform3uiv:
             context->programUniform3uiv(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -2276,7 +2276,7 @@
                 replayContext->getAsConstPointer<const GLuint *>(
                     params.getParam("value", ParamType::TGLuintConstPointer, 3)));
             break;
-        case gl::EntryPoint::ProgramUniform4f:
+        case angle::EntryPoint::GLProgramUniform4f:
             context->programUniform4f(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -2287,7 +2287,7 @@
                 params.getParam("v2", ParamType::TGLfloat, 4).value.GLfloatVal,
                 params.getParam("v3", ParamType::TGLfloat, 5).value.GLfloatVal);
             break;
-        case gl::EntryPoint::ProgramUniform4fv:
+        case angle::EntryPoint::GLProgramUniform4fv:
             context->programUniform4fv(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -2297,7 +2297,7 @@
                 replayContext->getAsConstPointer<const GLfloat *>(
                     params.getParam("value", ParamType::TGLfloatConstPointer, 3)));
             break;
-        case gl::EntryPoint::ProgramUniform4i:
+        case angle::EntryPoint::GLProgramUniform4i:
             context->programUniform4i(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -2308,7 +2308,7 @@
                 params.getParam("v2", ParamType::TGLint, 4).value.GLintVal,
                 params.getParam("v3", ParamType::TGLint, 5).value.GLintVal);
             break;
-        case gl::EntryPoint::ProgramUniform4iv:
+        case angle::EntryPoint::GLProgramUniform4iv:
             context->programUniform4iv(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -2318,7 +2318,7 @@
                 replayContext->getAsConstPointer<const GLint *>(
                     params.getParam("value", ParamType::TGLintConstPointer, 3)));
             break;
-        case gl::EntryPoint::ProgramUniform4ui:
+        case angle::EntryPoint::GLProgramUniform4ui:
             context->programUniform4ui(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -2329,7 +2329,7 @@
                 params.getParam("v2", ParamType::TGLuint, 4).value.GLuintVal,
                 params.getParam("v3", ParamType::TGLuint, 5).value.GLuintVal);
             break;
-        case gl::EntryPoint::ProgramUniform4uiv:
+        case angle::EntryPoint::GLProgramUniform4uiv:
             context->programUniform4uiv(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -2339,7 +2339,7 @@
                 replayContext->getAsConstPointer<const GLuint *>(
                     params.getParam("value", ParamType::TGLuintConstPointer, 3)));
             break;
-        case gl::EntryPoint::ProgramUniformMatrix2fv:
+        case angle::EntryPoint::GLProgramUniformMatrix2fv:
             context->programUniformMatrix2fv(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -2350,7 +2350,7 @@
                 replayContext->getAsConstPointer<const GLfloat *>(
                     params.getParam("value", ParamType::TGLfloatConstPointer, 4)));
             break;
-        case gl::EntryPoint::ProgramUniformMatrix2x3fv:
+        case angle::EntryPoint::GLProgramUniformMatrix2x3fv:
             context->programUniformMatrix2x3fv(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -2361,7 +2361,7 @@
                 replayContext->getAsConstPointer<const GLfloat *>(
                     params.getParam("value", ParamType::TGLfloatConstPointer, 4)));
             break;
-        case gl::EntryPoint::ProgramUniformMatrix2x4fv:
+        case angle::EntryPoint::GLProgramUniformMatrix2x4fv:
             context->programUniformMatrix2x4fv(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -2372,7 +2372,7 @@
                 replayContext->getAsConstPointer<const GLfloat *>(
                     params.getParam("value", ParamType::TGLfloatConstPointer, 4)));
             break;
-        case gl::EntryPoint::ProgramUniformMatrix3fv:
+        case angle::EntryPoint::GLProgramUniformMatrix3fv:
             context->programUniformMatrix3fv(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -2383,7 +2383,7 @@
                 replayContext->getAsConstPointer<const GLfloat *>(
                     params.getParam("value", ParamType::TGLfloatConstPointer, 4)));
             break;
-        case gl::EntryPoint::ProgramUniformMatrix3x2fv:
+        case angle::EntryPoint::GLProgramUniformMatrix3x2fv:
             context->programUniformMatrix3x2fv(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -2394,7 +2394,7 @@
                 replayContext->getAsConstPointer<const GLfloat *>(
                     params.getParam("value", ParamType::TGLfloatConstPointer, 4)));
             break;
-        case gl::EntryPoint::ProgramUniformMatrix3x4fv:
+        case angle::EntryPoint::GLProgramUniformMatrix3x4fv:
             context->programUniformMatrix3x4fv(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -2405,7 +2405,7 @@
                 replayContext->getAsConstPointer<const GLfloat *>(
                     params.getParam("value", ParamType::TGLfloatConstPointer, 4)));
             break;
-        case gl::EntryPoint::ProgramUniformMatrix4fv:
+        case angle::EntryPoint::GLProgramUniformMatrix4fv:
             context->programUniformMatrix4fv(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -2416,7 +2416,7 @@
                 replayContext->getAsConstPointer<const GLfloat *>(
                     params.getParam("value", ParamType::TGLfloatConstPointer, 4)));
             break;
-        case gl::EntryPoint::ProgramUniformMatrix4x2fv:
+        case angle::EntryPoint::GLProgramUniformMatrix4x2fv:
             context->programUniformMatrix4x2fv(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -2427,7 +2427,7 @@
                 replayContext->getAsConstPointer<const GLfloat *>(
                     params.getParam("value", ParamType::TGLfloatConstPointer, 4)));
             break;
-        case gl::EntryPoint::ProgramUniformMatrix4x3fv:
+        case angle::EntryPoint::GLProgramUniformMatrix4x3fv:
             context->programUniformMatrix4x3fv(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -2438,12 +2438,12 @@
                 replayContext->getAsConstPointer<const GLfloat *>(
                     params.getParam("value", ParamType::TGLfloatConstPointer, 4)));
             break;
-        case gl::EntryPoint::ProvokingVertex:
+        case angle::EntryPoint::GLProvokingVertex:
             context->provokingVertex(
                 params.getParam("modePacked", ParamType::TProvokingVertexConvention, 0)
                     .value.ProvokingVertexConventionVal);
             break;
-        case gl::EntryPoint::PushDebugGroup:
+        case angle::EntryPoint::GLPushDebugGroup:
             context->pushDebugGroup(
                 params.getParam("source", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("id", ParamType::TGLuint, 1).value.GLuintVal,
@@ -2451,18 +2451,18 @@
                 replayContext->getAsConstPointer<const GLchar *>(
                     params.getParam("message", ParamType::TGLcharConstPointer, 3)));
             break;
-        case gl::EntryPoint::PushMatrix:
+        case angle::EntryPoint::GLPushMatrix:
             context->pushMatrix();
             break;
-        case gl::EntryPoint::QueryCounter:
+        case angle::EntryPoint::GLQueryCounter:
             context->queryCounter(
                 params.getParam("idPacked", ParamType::TQueryID, 0).value.QueryIDVal,
                 params.getParam("targetPacked", ParamType::TQueryType, 1).value.QueryTypeVal);
             break;
-        case gl::EntryPoint::ReadBuffer:
+        case angle::EntryPoint::GLReadBuffer:
             context->readBuffer(params.getParam("src", ParamType::TGLenum, 0).value.GLenumVal);
             break;
-        case gl::EntryPoint::ReadPixels:
+        case angle::EntryPoint::GLReadPixels:
             context->readPixels(params.getParam("x", ParamType::TGLint, 0).value.GLintVal,
                                 params.getParam("y", ParamType::TGLint, 1).value.GLintVal,
                                 params.getParam("width", ParamType::TGLsizei, 2).value.GLsizeiVal,
@@ -2472,7 +2472,7 @@
                                 replayContext->getReadBufferPointer<void *>(
                                     params.getParam("pixels", ParamType::TvoidPointer, 6)));
             break;
-        case gl::EntryPoint::ReadnPixels:
+        case angle::EntryPoint::GLReadnPixels:
             context->readnPixels(
                 params.getParam("x", ParamType::TGLint, 0).value.GLintVal,
                 params.getParam("y", ParamType::TGLint, 1).value.GLintVal,
@@ -2484,17 +2484,17 @@
                 replayContext->getReadBufferPointer<void *>(
                     params.getParam("data", ParamType::TvoidPointer, 7)));
             break;
-        case gl::EntryPoint::ReleaseShaderCompiler:
+        case angle::EntryPoint::GLReleaseShaderCompiler:
             context->releaseShaderCompiler();
             break;
-        case gl::EntryPoint::RenderbufferStorage:
+        case angle::EntryPoint::GLRenderbufferStorage:
             context->renderbufferStorage(
                 params.getParam("target", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("internalformat", ParamType::TGLenum, 1).value.GLenumVal,
                 params.getParam("width", ParamType::TGLsizei, 2).value.GLsizeiVal,
                 params.getParam("height", ParamType::TGLsizei, 3).value.GLsizeiVal);
             break;
-        case gl::EntryPoint::RenderbufferStorageMultisample:
+        case angle::EntryPoint::GLRenderbufferStorageMultisample:
             context->renderbufferStorageMultisample(
                 params.getParam("target", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("samples", ParamType::TGLsizei, 1).value.GLsizeiVal,
@@ -2502,7 +2502,7 @@
                 params.getParam("width", ParamType::TGLsizei, 3).value.GLsizeiVal,
                 params.getParam("height", ParamType::TGLsizei, 4).value.GLsizeiVal);
             break;
-        case gl::EntryPoint::RenderbufferStorageMultisampleEXT:
+        case angle::EntryPoint::GLRenderbufferStorageMultisampleEXT:
             context->renderbufferStorageMultisampleEXT(
                 params.getParam("target", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("samples", ParamType::TGLsizei, 1).value.GLsizeiVal,
@@ -2510,102 +2510,102 @@
                 params.getParam("width", ParamType::TGLsizei, 3).value.GLsizeiVal,
                 params.getParam("height", ParamType::TGLsizei, 4).value.GLsizeiVal);
             break;
-        case gl::EntryPoint::ResumeTransformFeedback:
+        case angle::EntryPoint::GLResumeTransformFeedback:
             context->resumeTransformFeedback();
             break;
-        case gl::EntryPoint::Rotatef:
+        case angle::EntryPoint::GLRotatef:
             context->rotatef(params.getParam("angle", ParamType::TGLfloat, 0).value.GLfloatVal,
                              params.getParam("x", ParamType::TGLfloat, 1).value.GLfloatVal,
                              params.getParam("y", ParamType::TGLfloat, 2).value.GLfloatVal,
                              params.getParam("z", ParamType::TGLfloat, 3).value.GLfloatVal);
             break;
-        case gl::EntryPoint::Rotatex:
+        case angle::EntryPoint::GLRotatex:
             context->rotatex(params.getParam("angle", ParamType::TGLfixed, 0).value.GLfixedVal,
                              params.getParam("x", ParamType::TGLfixed, 1).value.GLfixedVal,
                              params.getParam("y", ParamType::TGLfixed, 2).value.GLfixedVal,
                              params.getParam("z", ParamType::TGLfixed, 3).value.GLfixedVal);
             break;
-        case gl::EntryPoint::SampleCoverage:
+        case angle::EntryPoint::GLSampleCoverage:
             context->sampleCoverage(
                 params.getParam("value", ParamType::TGLfloat, 0).value.GLfloatVal,
                 params.getParam("invert", ParamType::TGLboolean, 1).value.GLbooleanVal);
             break;
-        case gl::EntryPoint::SampleCoveragex:
+        case angle::EntryPoint::GLSampleCoveragex:
             context->sampleCoveragex(
                 params.getParam("value", ParamType::TGLclampx, 0).value.GLclampxVal,
                 params.getParam("invert", ParamType::TGLboolean, 1).value.GLbooleanVal);
             break;
-        case gl::EntryPoint::SampleMaski:
+        case angle::EntryPoint::GLSampleMaski:
             context->sampleMaski(
                 params.getParam("maskNumber", ParamType::TGLuint, 0).value.GLuintVal,
                 params.getParam("mask", ParamType::TGLbitfield, 1).value.GLbitfieldVal);
             break;
-        case gl::EntryPoint::SamplerParameterIiv:
+        case angle::EntryPoint::GLSamplerParameterIiv:
             context->samplerParameterIiv(
                 params.getParam("samplerPacked", ParamType::TSamplerID, 0).value.SamplerIDVal,
                 params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                 replayContext->getAsConstPointer<const GLint *>(
                     params.getParam("param", ParamType::TGLintConstPointer, 2)));
             break;
-        case gl::EntryPoint::SamplerParameterIuiv:
+        case angle::EntryPoint::GLSamplerParameterIuiv:
             context->samplerParameterIuiv(
                 params.getParam("samplerPacked", ParamType::TSamplerID, 0).value.SamplerIDVal,
                 params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                 replayContext->getAsConstPointer<const GLuint *>(
                     params.getParam("param", ParamType::TGLuintConstPointer, 2)));
             break;
-        case gl::EntryPoint::SamplerParameterf:
+        case angle::EntryPoint::GLSamplerParameterf:
             context->samplerParameterf(
                 params.getParam("samplerPacked", ParamType::TSamplerID, 0).value.SamplerIDVal,
                 params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                 params.getParam("param", ParamType::TGLfloat, 2).value.GLfloatVal);
             break;
-        case gl::EntryPoint::SamplerParameterfv:
+        case angle::EntryPoint::GLSamplerParameterfv:
             context->samplerParameterfv(
                 params.getParam("samplerPacked", ParamType::TSamplerID, 0).value.SamplerIDVal,
                 params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                 replayContext->getAsConstPointer<const GLfloat *>(
                     params.getParam("param", ParamType::TGLfloatConstPointer, 2)));
             break;
-        case gl::EntryPoint::SamplerParameteri:
+        case angle::EntryPoint::GLSamplerParameteri:
             context->samplerParameteri(
                 params.getParam("samplerPacked", ParamType::TSamplerID, 0).value.SamplerIDVal,
                 params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                 params.getParam("param", ParamType::TGLint, 2).value.GLintVal);
             break;
-        case gl::EntryPoint::SamplerParameteriv:
+        case angle::EntryPoint::GLSamplerParameteriv:
             context->samplerParameteriv(
                 params.getParam("samplerPacked", ParamType::TSamplerID, 0).value.SamplerIDVal,
                 params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                 replayContext->getAsConstPointer<const GLint *>(
                     params.getParam("param", ParamType::TGLintConstPointer, 2)));
             break;
-        case gl::EntryPoint::Scalef:
+        case angle::EntryPoint::GLScalef:
             context->scalef(params.getParam("x", ParamType::TGLfloat, 0).value.GLfloatVal,
                             params.getParam("y", ParamType::TGLfloat, 1).value.GLfloatVal,
                             params.getParam("z", ParamType::TGLfloat, 2).value.GLfloatVal);
             break;
-        case gl::EntryPoint::Scalex:
+        case angle::EntryPoint::GLScalex:
             context->scalex(params.getParam("x", ParamType::TGLfixed, 0).value.GLfixedVal,
                             params.getParam("y", ParamType::TGLfixed, 1).value.GLfixedVal,
                             params.getParam("z", ParamType::TGLfixed, 2).value.GLfixedVal);
             break;
-        case gl::EntryPoint::Scissor:
+        case angle::EntryPoint::GLScissor:
             context->scissor(params.getParam("x", ParamType::TGLint, 0).value.GLintVal,
                              params.getParam("y", ParamType::TGLint, 1).value.GLintVal,
                              params.getParam("width", ParamType::TGLsizei, 2).value.GLsizeiVal,
                              params.getParam("height", ParamType::TGLsizei, 3).value.GLsizeiVal);
             break;
-        case gl::EntryPoint::SetFenceNV:
+        case angle::EntryPoint::GLSetFenceNV:
             context->setFenceNV(
                 params.getParam("fencePacked", ParamType::TFenceNVID, 0).value.FenceNVIDVal,
                 params.getParam("condition", ParamType::TGLenum, 1).value.GLenumVal);
             break;
-        case gl::EntryPoint::ShadeModel:
+        case angle::EntryPoint::GLShadeModel:
             context->shadeModel(
                 params.getParam("modePacked", ParamType::TShadingModel, 0).value.ShadingModelVal);
             break;
-        case gl::EntryPoint::ShaderBinary:
+        case angle::EntryPoint::GLShaderBinary:
             context->shaderBinary(
                 params.getParam("count", ParamType::TGLsizei, 0).value.GLsizeiVal,
                 replayContext->getAsConstPointer<const ShaderProgramID *>(
@@ -2615,7 +2615,7 @@
                     params.getParam("binary", ParamType::TvoidConstPointer, 3)),
                 params.getParam("length", ParamType::TGLsizei, 4).value.GLsizeiVal);
             break;
-        case gl::EntryPoint::ShaderSource:
+        case angle::EntryPoint::GLShaderSource:
             context->shaderSource(
                 params.getParam("shaderPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -2625,49 +2625,49 @@
                 replayContext->getAsConstPointer<const GLint *>(
                     params.getParam("length", ParamType::TGLintConstPointer, 3)));
             break;
-        case gl::EntryPoint::StencilFunc:
+        case angle::EntryPoint::GLStencilFunc:
             context->stencilFunc(params.getParam("func", ParamType::TGLenum, 0).value.GLenumVal,
                                  params.getParam("ref", ParamType::TGLint, 1).value.GLintVal,
                                  params.getParam("mask", ParamType::TGLuint, 2).value.GLuintVal);
             break;
-        case gl::EntryPoint::StencilFuncSeparate:
+        case angle::EntryPoint::GLStencilFuncSeparate:
             context->stencilFuncSeparate(
                 params.getParam("face", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("func", ParamType::TGLenum, 1).value.GLenumVal,
                 params.getParam("ref", ParamType::TGLint, 2).value.GLintVal,
                 params.getParam("mask", ParamType::TGLuint, 3).value.GLuintVal);
             break;
-        case gl::EntryPoint::StencilMask:
+        case angle::EntryPoint::GLStencilMask:
             context->stencilMask(params.getParam("mask", ParamType::TGLuint, 0).value.GLuintVal);
             break;
-        case gl::EntryPoint::StencilMaskSeparate:
+        case angle::EntryPoint::GLStencilMaskSeparate:
             context->stencilMaskSeparate(
                 params.getParam("face", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("mask", ParamType::TGLuint, 1).value.GLuintVal);
             break;
-        case gl::EntryPoint::StencilOp:
+        case angle::EntryPoint::GLStencilOp:
             context->stencilOp(params.getParam("fail", ParamType::TGLenum, 0).value.GLenumVal,
                                params.getParam("zfail", ParamType::TGLenum, 1).value.GLenumVal,
                                params.getParam("zpass", ParamType::TGLenum, 2).value.GLenumVal);
             break;
-        case gl::EntryPoint::StencilOpSeparate:
+        case angle::EntryPoint::GLStencilOpSeparate:
             context->stencilOpSeparate(
                 params.getParam("face", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("sfail", ParamType::TGLenum, 1).value.GLenumVal,
                 params.getParam("dpfail", ParamType::TGLenum, 2).value.GLenumVal,
                 params.getParam("dppass", ParamType::TGLenum, 3).value.GLenumVal);
             break;
-        case gl::EntryPoint::TestFenceNV:
+        case angle::EntryPoint::GLTestFenceNV:
             context->testFenceNV(
                 params.getParam("fencePacked", ParamType::TFenceNVID, 0).value.FenceNVIDVal);
             break;
-        case gl::EntryPoint::TexBuffer:
+        case angle::EntryPoint::GLTexBuffer:
             context->texBuffer(
                 params.getParam("targetPacked", ParamType::TTextureType, 0).value.TextureTypeVal,
                 params.getParam("internalformat", ParamType::TGLenum, 1).value.GLenumVal,
                 params.getParam("bufferPacked", ParamType::TBufferID, 2).value.BufferIDVal);
             break;
-        case gl::EntryPoint::TexBufferRange:
+        case angle::EntryPoint::GLTexBufferRange:
             context->texBufferRange(
                 params.getParam("targetPacked", ParamType::TTextureType, 0).value.TextureTypeVal,
                 params.getParam("internalformat", ParamType::TGLenum, 1).value.GLenumVal,
@@ -2675,7 +2675,7 @@
                 params.getParam("offset", ParamType::TGLintptr, 3).value.GLintptrVal,
                 params.getParam("size", ParamType::TGLsizeiptr, 4).value.GLsizeiptrVal);
             break;
-        case gl::EntryPoint::TexCoordPointer:
+        case angle::EntryPoint::GLTexCoordPointer:
             context->texCoordPointer(
                 params.getParam("size", ParamType::TGLint, 0).value.GLintVal,
                 params.getParam("typePacked", ParamType::TVertexAttribType, 1)
@@ -2684,14 +2684,14 @@
                 replayContext->getAsConstPointer<const void *>(
                     params.getParam("pointer", ParamType::TvoidConstPointer, 3)));
             break;
-        case gl::EntryPoint::TexEnvf:
+        case angle::EntryPoint::GLTexEnvf:
             context->texEnvf(params.getParam("targetPacked", ParamType::TTextureEnvTarget, 0)
                                  .value.TextureEnvTargetVal,
                              params.getParam("pnamePacked", ParamType::TTextureEnvParameter, 1)
                                  .value.TextureEnvParameterVal,
                              params.getParam("param", ParamType::TGLfloat, 2).value.GLfloatVal);
             break;
-        case gl::EntryPoint::TexEnvfv:
+        case angle::EntryPoint::GLTexEnvfv:
             context->texEnvfv(params.getParam("targetPacked", ParamType::TTextureEnvTarget, 0)
                                   .value.TextureEnvTargetVal,
                               params.getParam("pnamePacked", ParamType::TTextureEnvParameter, 1)
@@ -2699,14 +2699,14 @@
                               replayContext->getAsConstPointer<const GLfloat *>(
                                   params.getParam("params", ParamType::TGLfloatConstPointer, 2)));
             break;
-        case gl::EntryPoint::TexEnvi:
+        case angle::EntryPoint::GLTexEnvi:
             context->texEnvi(params.getParam("targetPacked", ParamType::TTextureEnvTarget, 0)
                                  .value.TextureEnvTargetVal,
                              params.getParam("pnamePacked", ParamType::TTextureEnvParameter, 1)
                                  .value.TextureEnvParameterVal,
                              params.getParam("param", ParamType::TGLint, 2).value.GLintVal);
             break;
-        case gl::EntryPoint::TexEnviv:
+        case angle::EntryPoint::GLTexEnviv:
             context->texEnviv(params.getParam("targetPacked", ParamType::TTextureEnvTarget, 0)
                                   .value.TextureEnvTargetVal,
                               params.getParam("pnamePacked", ParamType::TTextureEnvParameter, 1)
@@ -2714,14 +2714,14 @@
                               replayContext->getAsConstPointer<const GLint *>(
                                   params.getParam("params", ParamType::TGLintConstPointer, 2)));
             break;
-        case gl::EntryPoint::TexEnvx:
+        case angle::EntryPoint::GLTexEnvx:
             context->texEnvx(params.getParam("targetPacked", ParamType::TTextureEnvTarget, 0)
                                  .value.TextureEnvTargetVal,
                              params.getParam("pnamePacked", ParamType::TTextureEnvParameter, 1)
                                  .value.TextureEnvParameterVal,
                              params.getParam("param", ParamType::TGLfixed, 2).value.GLfixedVal);
             break;
-        case gl::EntryPoint::TexEnvxv:
+        case angle::EntryPoint::GLTexEnvxv:
             context->texEnvxv(params.getParam("targetPacked", ParamType::TTextureEnvTarget, 0)
                                   .value.TextureEnvTargetVal,
                               params.getParam("pnamePacked", ParamType::TTextureEnvParameter, 1)
@@ -2729,29 +2729,29 @@
                               replayContext->getAsConstPointer<const GLfixed *>(
                                   params.getParam("params", ParamType::TGLfixedConstPointer, 2)));
             break;
-        case gl::EntryPoint::TexGenf:
+        case angle::EntryPoint::GLTexGenf:
             context->texGenf(params.getParam("coord", ParamType::TGLenum, 0).value.GLenumVal,
                              params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                              params.getParam("param", ParamType::TGLfloat, 2).value.GLfloatVal);
             break;
-        case gl::EntryPoint::TexGenfv:
+        case angle::EntryPoint::GLTexGenfv:
             context->texGenfv(params.getParam("coord", ParamType::TGLenum, 0).value.GLenumVal,
                               params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                               replayContext->getAsConstPointer<const GLfloat *>(
                                   params.getParam("params", ParamType::TGLfloatConstPointer, 2)));
             break;
-        case gl::EntryPoint::TexGeni:
+        case angle::EntryPoint::GLTexGeni:
             context->texGeni(params.getParam("coord", ParamType::TGLenum, 0).value.GLenumVal,
                              params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                              params.getParam("param", ParamType::TGLint, 2).value.GLintVal);
             break;
-        case gl::EntryPoint::TexGeniv:
+        case angle::EntryPoint::GLTexGeniv:
             context->texGeniv(params.getParam("coord", ParamType::TGLenum, 0).value.GLenumVal,
                               params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                               replayContext->getAsConstPointer<const GLint *>(
                                   params.getParam("params", ParamType::TGLintConstPointer, 2)));
             break;
-        case gl::EntryPoint::TexImage2D:
+        case angle::EntryPoint::GLTexImage2D:
             context->texImage2D(
                 params.getParam("targetPacked", ParamType::TTextureTarget, 0)
                     .value.TextureTargetVal,
@@ -2765,7 +2765,7 @@
                 replayContext->getAsConstPointer<const void *>(
                     params.getParam("pixels", ParamType::TvoidConstPointer, 8)));
             break;
-        case gl::EntryPoint::TexImage3D:
+        case angle::EntryPoint::GLTexImage3D:
             context->texImage3D(
                 params.getParam("targetPacked", ParamType::TTextureTarget, 0)
                     .value.TextureTargetVal,
@@ -2780,67 +2780,67 @@
                 replayContext->getAsConstPointer<const void *>(
                     params.getParam("pixels", ParamType::TvoidConstPointer, 9)));
             break;
-        case gl::EntryPoint::TexParameterIiv:
+        case angle::EntryPoint::GLTexParameterIiv:
             context->texParameterIiv(
                 params.getParam("targetPacked", ParamType::TTextureType, 0).value.TextureTypeVal,
                 params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                 replayContext->getAsConstPointer<const GLint *>(
                     params.getParam("params", ParamType::TGLintConstPointer, 2)));
             break;
-        case gl::EntryPoint::TexParameterIuiv:
+        case angle::EntryPoint::GLTexParameterIuiv:
             context->texParameterIuiv(
                 params.getParam("targetPacked", ParamType::TTextureType, 0).value.TextureTypeVal,
                 params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                 replayContext->getAsConstPointer<const GLuint *>(
                     params.getParam("params", ParamType::TGLuintConstPointer, 2)));
             break;
-        case gl::EntryPoint::TexParameterf:
+        case angle::EntryPoint::GLTexParameterf:
             context->texParameterf(
                 params.getParam("targetPacked", ParamType::TTextureType, 0).value.TextureTypeVal,
                 params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                 params.getParam("param", ParamType::TGLfloat, 2).value.GLfloatVal);
             break;
-        case gl::EntryPoint::TexParameterfv:
+        case angle::EntryPoint::GLTexParameterfv:
             context->texParameterfv(
                 params.getParam("targetPacked", ParamType::TTextureType, 0).value.TextureTypeVal,
                 params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                 replayContext->getAsConstPointer<const GLfloat *>(
                     params.getParam("params", ParamType::TGLfloatConstPointer, 2)));
             break;
-        case gl::EntryPoint::TexParameteri:
+        case angle::EntryPoint::GLTexParameteri:
             context->texParameteri(
                 params.getParam("targetPacked", ParamType::TTextureType, 0).value.TextureTypeVal,
                 params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                 params.getParam("param", ParamType::TGLint, 2).value.GLintVal);
             break;
-        case gl::EntryPoint::TexParameteriv:
+        case angle::EntryPoint::GLTexParameteriv:
             context->texParameteriv(
                 params.getParam("targetPacked", ParamType::TTextureType, 0).value.TextureTypeVal,
                 params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                 replayContext->getAsConstPointer<const GLint *>(
                     params.getParam("params", ParamType::TGLintConstPointer, 2)));
             break;
-        case gl::EntryPoint::TexParameterx:
+        case angle::EntryPoint::GLTexParameterx:
             context->texParameterx(
                 params.getParam("targetPacked", ParamType::TTextureType, 0).value.TextureTypeVal,
                 params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                 params.getParam("param", ParamType::TGLfixed, 2).value.GLfixedVal);
             break;
-        case gl::EntryPoint::TexParameterxv:
+        case angle::EntryPoint::GLTexParameterxv:
             context->texParameterxv(
                 params.getParam("targetPacked", ParamType::TTextureType, 0).value.TextureTypeVal,
                 params.getParam("pname", ParamType::TGLenum, 1).value.GLenumVal,
                 replayContext->getAsConstPointer<const GLfixed *>(
                     params.getParam("params", ParamType::TGLfixedConstPointer, 2)));
             break;
-        case gl::EntryPoint::TexStorage1D:
+        case angle::EntryPoint::GLTexStorage1D:
             context->texStorage1D(
                 params.getParam("target", ParamType::TGLenum, 0).value.GLenumVal,
                 params.getParam("levels", ParamType::TGLsizei, 1).value.GLsizeiVal,
                 params.getParam("internalformat", ParamType::TGLenum, 2).value.GLenumVal,
                 params.getParam("width", ParamType::TGLsizei, 3).value.GLsizeiVal);
             break;
-        case gl::EntryPoint::TexStorage2D:
+        case angle::EntryPoint::GLTexStorage2D:
             context->texStorage2D(
                 params.getParam("targetPacked", ParamType::TTextureType, 0).value.TextureTypeVal,
                 params.getParam("levels", ParamType::TGLsizei, 1).value.GLsizeiVal,
@@ -2848,7 +2848,7 @@
                 params.getParam("width", ParamType::TGLsizei, 3).value.GLsizeiVal,
                 params.getParam("height", ParamType::TGLsizei, 4).value.GLsizeiVal);
             break;
-        case gl::EntryPoint::TexStorage2DMultisample:
+        case angle::EntryPoint::GLTexStorage2DMultisample:
             context->texStorage2DMultisample(
                 params.getParam("targetPacked", ParamType::TTextureType, 0).value.TextureTypeVal,
                 params.getParam("samples", ParamType::TGLsizei, 1).value.GLsizeiVal,
@@ -2858,7 +2858,7 @@
                 params.getParam("fixedsamplelocations", ParamType::TGLboolean, 5)
                     .value.GLbooleanVal);
             break;
-        case gl::EntryPoint::TexStorage3D:
+        case angle::EntryPoint::GLTexStorage3D:
             context->texStorage3D(
                 params.getParam("targetPacked", ParamType::TTextureType, 0).value.TextureTypeVal,
                 params.getParam("levels", ParamType::TGLsizei, 1).value.GLsizeiVal,
@@ -2867,7 +2867,7 @@
                 params.getParam("height", ParamType::TGLsizei, 4).value.GLsizeiVal,
                 params.getParam("depth", ParamType::TGLsizei, 5).value.GLsizeiVal);
             break;
-        case gl::EntryPoint::TexStorage3DMultisample:
+        case angle::EntryPoint::GLTexStorage3DMultisample:
             context->texStorage3DMultisample(
                 params.getParam("targetPacked", ParamType::TTextureType, 0).value.TextureTypeVal,
                 params.getParam("samples", ParamType::TGLsizei, 1).value.GLsizeiVal,
@@ -2878,7 +2878,7 @@
                 params.getParam("fixedsamplelocations", ParamType::TGLboolean, 6)
                     .value.GLbooleanVal);
             break;
-        case gl::EntryPoint::TexSubImage2D:
+        case angle::EntryPoint::GLTexSubImage2D:
             context->texSubImage2D(
                 params.getParam("targetPacked", ParamType::TTextureTarget, 0)
                     .value.TextureTargetVal,
@@ -2892,7 +2892,7 @@
                 replayContext->getAsConstPointer<const void *>(
                     params.getParam("pixels", ParamType::TvoidConstPointer, 8)));
             break;
-        case gl::EntryPoint::TexSubImage3D:
+        case angle::EntryPoint::GLTexSubImage3D:
             context->texSubImage3D(
                 params.getParam("targetPacked", ParamType::TTextureTarget, 0)
                     .value.TextureTargetVal,
@@ -2908,7 +2908,7 @@
                 replayContext->getAsConstPointer<const void *>(
                     params.getParam("pixels", ParamType::TvoidConstPointer, 10)));
             break;
-        case gl::EntryPoint::TransformFeedbackVaryings:
+        case angle::EntryPoint::GLTransformFeedbackVaryings:
             context->transformFeedbackVaryings(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
@@ -2917,134 +2917,134 @@
                     params.getParam("varyings", ParamType::TGLcharConstPointerPointer, 2)),
                 params.getParam("bufferMode", ParamType::TGLenum, 3).value.GLenumVal);
             break;
-        case gl::EntryPoint::Translatef:
+        case angle::EntryPoint::GLTranslatef:
             context->translatef(params.getParam("x", ParamType::TGLfloat, 0).value.GLfloatVal,
                                 params.getParam("y", ParamType::TGLfloat, 1).value.GLfloatVal,
                                 params.getParam("z", ParamType::TGLfloat, 2).value.GLfloatVal);
             break;
-        case gl::EntryPoint::Translatex:
+        case angle::EntryPoint::GLTranslatex:
             context->translatex(params.getParam("x", ParamType::TGLfixed, 0).value.GLfixedVal,
                                 params.getParam("y", ParamType::TGLfixed, 1).value.GLfixedVal,
                                 params.getParam("z", ParamType::TGLfixed, 2).value.GLfixedVal);
             break;
-        case gl::EntryPoint::Uniform1f:
+        case angle::EntryPoint::GLUniform1f:
             context->uniform1f(params.getParam("locationPacked", ParamType::TUniformLocation, 0)
                                    .value.UniformLocationVal,
                                params.getParam("v0", ParamType::TGLfloat, 1).value.GLfloatVal);
             break;
-        case gl::EntryPoint::Uniform1fv:
+        case angle::EntryPoint::GLUniform1fv:
             context->uniform1fv(params.getParam("locationPacked", ParamType::TUniformLocation, 0)
                                     .value.UniformLocationVal,
                                 params.getParam("count", ParamType::TGLsizei, 1).value.GLsizeiVal,
                                 replayContext->getAsConstPointer<const GLfloat *>(
                                     params.getParam("value", ParamType::TGLfloatConstPointer, 2)));
             break;
-        case gl::EntryPoint::Uniform1i:
+        case angle::EntryPoint::GLUniform1i:
             context->uniform1i(params.getParam("locationPacked", ParamType::TUniformLocation, 0)
                                    .value.UniformLocationVal,
                                params.getParam("v0", ParamType::TGLint, 1).value.GLintVal);
             break;
-        case gl::EntryPoint::Uniform1iv:
+        case angle::EntryPoint::GLUniform1iv:
             context->uniform1iv(params.getParam("locationPacked", ParamType::TUniformLocation, 0)
                                     .value.UniformLocationVal,
                                 params.getParam("count", ParamType::TGLsizei, 1).value.GLsizeiVal,
                                 replayContext->getAsConstPointer<const GLint *>(
                                     params.getParam("value", ParamType::TGLintConstPointer, 2)));
             break;
-        case gl::EntryPoint::Uniform1ui:
+        case angle::EntryPoint::GLUniform1ui:
             context->uniform1ui(params.getParam("locationPacked", ParamType::TUniformLocation, 0)
                                     .value.UniformLocationVal,
                                 params.getParam("v0", ParamType::TGLuint, 1).value.GLuintVal);
             break;
-        case gl::EntryPoint::Uniform1uiv:
+        case angle::EntryPoint::GLUniform1uiv:
             context->uniform1uiv(params.getParam("locationPacked", ParamType::TUniformLocation, 0)
                                      .value.UniformLocationVal,
                                  params.getParam("count", ParamType::TGLsizei, 1).value.GLsizeiVal,
                                  replayContext->getAsConstPointer<const GLuint *>(
                                      params.getParam("value", ParamType::TGLuintConstPointer, 2)));
             break;
-        case gl::EntryPoint::Uniform2f:
+        case angle::EntryPoint::GLUniform2f:
             context->uniform2f(params.getParam("locationPacked", ParamType::TUniformLocation, 0)
                                    .value.UniformLocationVal,
                                params.getParam("v0", ParamType::TGLfloat, 1).value.GLfloatVal,
                                params.getParam("v1", ParamType::TGLfloat, 2).value.GLfloatVal);
             break;
-        case gl::EntryPoint::Uniform2fv:
+        case angle::EntryPoint::GLUniform2fv:
             context->uniform2fv(params.getParam("locationPacked", ParamType::TUniformLocation, 0)
                                     .value.UniformLocationVal,
                                 params.getParam("count", ParamType::TGLsizei, 1).value.GLsizeiVal,
                                 replayContext->getAsConstPointer<const GLfloat *>(
                                     params.getParam("value", ParamType::TGLfloatConstPointer, 2)));
             break;
-        case gl::EntryPoint::Uniform2i:
+        case angle::EntryPoint::GLUniform2i:
             context->uniform2i(params.getParam("locationPacked", ParamType::TUniformLocation, 0)
                                    .value.UniformLocationVal,
                                params.getParam("v0", ParamType::TGLint, 1).value.GLintVal,
                                params.getParam("v1", ParamType::TGLint, 2).value.GLintVal);
             break;
-        case gl::EntryPoint::Uniform2iv:
+        case angle::EntryPoint::GLUniform2iv:
             context->uniform2iv(params.getParam("locationPacked", ParamType::TUniformLocation, 0)
                                     .value.UniformLocationVal,
                                 params.getParam("count", ParamType::TGLsizei, 1).value.GLsizeiVal,
                                 replayContext->getAsConstPointer<const GLint *>(
                                     params.getParam("value", ParamType::TGLintConstPointer, 2)));
             break;
-        case gl::EntryPoint::Uniform2ui:
+        case angle::EntryPoint::GLUniform2ui:
             context->uniform2ui(params.getParam("locationPacked", ParamType::TUniformLocation, 0)
                                     .value.UniformLocationVal,
                                 params.getParam("v0", ParamType::TGLuint, 1).value.GLuintVal,
                                 params.getParam("v1", ParamType::TGLuint, 2).value.GLuintVal);
             break;
-        case gl::EntryPoint::Uniform2uiv:
+        case angle::EntryPoint::GLUniform2uiv:
             context->uniform2uiv(params.getParam("locationPacked", ParamType::TUniformLocation, 0)
                                      .value.UniformLocationVal,
                                  params.getParam("count", ParamType::TGLsizei, 1).value.GLsizeiVal,
                                  replayContext->getAsConstPointer<const GLuint *>(
                                      params.getParam("value", ParamType::TGLuintConstPointer, 2)));
             break;
-        case gl::EntryPoint::Uniform3f:
+        case angle::EntryPoint::GLUniform3f:
             context->uniform3f(params.getParam("locationPacked", ParamType::TUniformLocation, 0)
                                    .value.UniformLocationVal,
                                params.getParam("v0", ParamType::TGLfloat, 1).value.GLfloatVal,
                                params.getParam("v1", ParamType::TGLfloat, 2).value.GLfloatVal,
                                params.getParam("v2", ParamType::TGLfloat, 3).value.GLfloatVal);
             break;
-        case gl::EntryPoint::Uniform3fv:
+        case angle::EntryPoint::GLUniform3fv:
             context->uniform3fv(params.getParam("locationPacked", ParamType::TUniformLocation, 0)
                                     .value.UniformLocationVal,
                                 params.getParam("count", ParamType::TGLsizei, 1).value.GLsizeiVal,
                                 replayContext->getAsConstPointer<const GLfloat *>(
                                     params.getParam("value", ParamType::TGLfloatConstPointer, 2)));
             break;
-        case gl::EntryPoint::Uniform3i:
+        case angle::EntryPoint::GLUniform3i:
             context->uniform3i(params.getParam("locationPacked", ParamType::TUniformLocation, 0)
                                    .value.UniformLocationVal,
                                params.getParam("v0", ParamType::TGLint, 1).value.GLintVal,
                                params.getParam("v1", ParamType::TGLint, 2).value.GLintVal,
                                params.getParam("v2", ParamType::TGLint, 3).value.GLintVal);
             break;
-        case gl::EntryPoint::Uniform3iv:
+        case angle::EntryPoint::GLUniform3iv:
             context->uniform3iv(params.getParam("locationPacked", ParamType::TUniformLocation, 0)
                                     .value.UniformLocationVal,
                                 params.getParam("count", ParamType::TGLsizei, 1).value.GLsizeiVal,
                                 replayContext->getAsConstPointer<const GLint *>(
                                     params.getParam("value", ParamType::TGLintConstPointer, 2)));
             break;
-        case gl::EntryPoint::Uniform3ui:
+        case angle::EntryPoint::GLUniform3ui:
             context->uniform3ui(params.getParam("locationPacked", ParamType::TUniformLocation, 0)
                                     .value.UniformLocationVal,
                                 params.getParam("v0", ParamType::TGLuint, 1).value.GLuintVal,
                                 params.getParam("v1", ParamType::TGLuint, 2).value.GLuintVal,
                                 params.getParam("v2", ParamType::TGLuint, 3).value.GLuintVal);
             break;
-        case gl::EntryPoint::Uniform3uiv:
+        case angle::EntryPoint::GLUniform3uiv:
             context->uniform3uiv(params.getParam("locationPacked", ParamType::TUniformLocation, 0)
                                      .value.UniformLocationVal,
                                  params.getParam("count", ParamType::TGLsizei, 1).value.GLsizeiVal,
                                  replayContext->getAsConstPointer<const GLuint *>(
                                      params.getParam("value", ParamType::TGLuintConstPointer, 2)));
             break;
-        case gl::EntryPoint::Uniform4f:
+        case angle::EntryPoint::GLUniform4f:
             context->uniform4f(params.getParam("locationPacked", ParamType::TUniformLocation, 0)
                                    .value.UniformLocationVal,
                                params.getParam("v0", ParamType::TGLfloat, 1).value.GLfloatVal,
@@ -3052,14 +3052,14 @@
                                params.getParam("v2", ParamType::TGLfloat, 3).value.GLfloatVal,
                                params.getParam("v3", ParamType::TGLfloat, 4).value.GLfloatVal);
             break;
-        case gl::EntryPoint::Uniform4fv:
+        case angle::EntryPoint::GLUniform4fv:
             context->uniform4fv(params.getParam("locationPacked", ParamType::TUniformLocation, 0)
                                     .value.UniformLocationVal,
                                 params.getParam("count", ParamType::TGLsizei, 1).value.GLsizeiVal,
                                 replayContext->getAsConstPointer<const GLfloat *>(
                                     params.getParam("value", ParamType::TGLfloatConstPointer, 2)));
             break;
-        case gl::EntryPoint::Uniform4i:
+        case angle::EntryPoint::GLUniform4i:
             context->uniform4i(params.getParam("locationPacked", ParamType::TUniformLocation, 0)
                                    .value.UniformLocationVal,
                                params.getParam("v0", ParamType::TGLint, 1).value.GLintVal,
@@ -3067,14 +3067,14 @@
                                params.getParam("v2", ParamType::TGLint, 3).value.GLintVal,
                                params.getParam("v3", ParamType::TGLint, 4).value.GLintVal);
             break;
-        case gl::EntryPoint::Uniform4iv:
+        case angle::EntryPoint::GLUniform4iv:
             context->uniform4iv(params.getParam("locationPacked", ParamType::TUniformLocation, 0)
                                     .value.UniformLocationVal,
                                 params.getParam("count", ParamType::TGLsizei, 1).value.GLsizeiVal,
                                 replayContext->getAsConstPointer<const GLint *>(
                                     params.getParam("value", ParamType::TGLintConstPointer, 2)));
             break;
-        case gl::EntryPoint::Uniform4ui:
+        case angle::EntryPoint::GLUniform4ui:
             context->uniform4ui(params.getParam("locationPacked", ParamType::TUniformLocation, 0)
                                     .value.UniformLocationVal,
                                 params.getParam("v0", ParamType::TGLuint, 1).value.GLuintVal,
@@ -3082,21 +3082,21 @@
                                 params.getParam("v2", ParamType::TGLuint, 3).value.GLuintVal,
                                 params.getParam("v3", ParamType::TGLuint, 4).value.GLuintVal);
             break;
-        case gl::EntryPoint::Uniform4uiv:
+        case angle::EntryPoint::GLUniform4uiv:
             context->uniform4uiv(params.getParam("locationPacked", ParamType::TUniformLocation, 0)
                                      .value.UniformLocationVal,
                                  params.getParam("count", ParamType::TGLsizei, 1).value.GLsizeiVal,
                                  replayContext->getAsConstPointer<const GLuint *>(
                                      params.getParam("value", ParamType::TGLuintConstPointer, 2)));
             break;
-        case gl::EntryPoint::UniformBlockBinding:
+        case angle::EntryPoint::GLUniformBlockBinding:
             context->uniformBlockBinding(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal,
                 params.getParam("uniformBlockIndex", ParamType::TGLuint, 1).value.GLuintVal,
                 params.getParam("uniformBlockBinding", ParamType::TGLuint, 2).value.GLuintVal);
             break;
-        case gl::EntryPoint::UniformMatrix2fv:
+        case angle::EntryPoint::GLUniformMatrix2fv:
             context->uniformMatrix2fv(
                 params.getParam("locationPacked", ParamType::TUniformLocation, 0)
                     .value.UniformLocationVal,
@@ -3105,7 +3105,7 @@
                 replayContext->getAsConstPointer<const GLfloat *>(
                     params.getParam("value", ParamType::TGLfloatConstPointer, 3)));
             break;
-        case gl::EntryPoint::UniformMatrix2x3fv:
+        case angle::EntryPoint::GLUniformMatrix2x3fv:
             context->uniformMatrix2x3fv(
                 params.getParam("locationPacked", ParamType::TUniformLocation, 0)
                     .value.UniformLocationVal,
@@ -3114,7 +3114,7 @@
                 replayContext->getAsConstPointer<const GLfloat *>(
                     params.getParam("value", ParamType::TGLfloatConstPointer, 3)));
             break;
-        case gl::EntryPoint::UniformMatrix2x4fv:
+        case angle::EntryPoint::GLUniformMatrix2x4fv:
             context->uniformMatrix2x4fv(
                 params.getParam("locationPacked", ParamType::TUniformLocation, 0)
                     .value.UniformLocationVal,
@@ -3123,7 +3123,7 @@
                 replayContext->getAsConstPointer<const GLfloat *>(
                     params.getParam("value", ParamType::TGLfloatConstPointer, 3)));
             break;
-        case gl::EntryPoint::UniformMatrix3fv:
+        case angle::EntryPoint::GLUniformMatrix3fv:
             context->uniformMatrix3fv(
                 params.getParam("locationPacked", ParamType::TUniformLocation, 0)
                     .value.UniformLocationVal,
@@ -3132,7 +3132,7 @@
                 replayContext->getAsConstPointer<const GLfloat *>(
                     params.getParam("value", ParamType::TGLfloatConstPointer, 3)));
             break;
-        case gl::EntryPoint::UniformMatrix3x2fv:
+        case angle::EntryPoint::GLUniformMatrix3x2fv:
             context->uniformMatrix3x2fv(
                 params.getParam("locationPacked", ParamType::TUniformLocation, 0)
                     .value.UniformLocationVal,
@@ -3141,7 +3141,7 @@
                 replayContext->getAsConstPointer<const GLfloat *>(
                     params.getParam("value", ParamType::TGLfloatConstPointer, 3)));
             break;
-        case gl::EntryPoint::UniformMatrix3x4fv:
+        case angle::EntryPoint::GLUniformMatrix3x4fv:
             context->uniformMatrix3x4fv(
                 params.getParam("locationPacked", ParamType::TUniformLocation, 0)
                     .value.UniformLocationVal,
@@ -3150,7 +3150,7 @@
                 replayContext->getAsConstPointer<const GLfloat *>(
                     params.getParam("value", ParamType::TGLfloatConstPointer, 3)));
             break;
-        case gl::EntryPoint::UniformMatrix4fv:
+        case angle::EntryPoint::GLUniformMatrix4fv:
             context->uniformMatrix4fv(
                 params.getParam("locationPacked", ParamType::TUniformLocation, 0)
                     .value.UniformLocationVal,
@@ -3159,7 +3159,7 @@
                 replayContext->getAsConstPointer<const GLfloat *>(
                     params.getParam("value", ParamType::TGLfloatConstPointer, 3)));
             break;
-        case gl::EntryPoint::UniformMatrix4x2fv:
+        case angle::EntryPoint::GLUniformMatrix4x2fv:
             context->uniformMatrix4x2fv(
                 params.getParam("locationPacked", ParamType::TUniformLocation, 0)
                     .value.UniformLocationVal,
@@ -3168,7 +3168,7 @@
                 replayContext->getAsConstPointer<const GLfloat *>(
                     params.getParam("value", ParamType::TGLfloatConstPointer, 3)));
             break;
-        case gl::EntryPoint::UniformMatrix4x3fv:
+        case angle::EntryPoint::GLUniformMatrix4x3fv:
             context->uniformMatrix4x3fv(
                 params.getParam("locationPacked", ParamType::TUniformLocation, 0)
                     .value.UniformLocationVal,
@@ -3177,15 +3177,15 @@
                 replayContext->getAsConstPointer<const GLfloat *>(
                     params.getParam("value", ParamType::TGLfloatConstPointer, 3)));
             break;
-        case gl::EntryPoint::UnmapBuffer:
+        case angle::EntryPoint::GLUnmapBuffer:
             context->unmapBuffer(params.getParam("targetPacked", ParamType::TBufferBinding, 0)
                                      .value.BufferBindingVal);
             break;
-        case gl::EntryPoint::UseProgram:
+        case angle::EntryPoint::GLUseProgram:
             context->useProgram(params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                                     .value.ShaderProgramIDVal);
             break;
-        case gl::EntryPoint::UseProgramStages:
+        case angle::EntryPoint::GLUseProgramStages:
             context->useProgramStages(
                 params.getParam("pipelinePacked", ParamType::TProgramPipelineID, 0)
                     .value.ProgramPipelineIDVal,
@@ -3193,73 +3193,73 @@
                 params.getParam("programPacked", ParamType::TShaderProgramID, 2)
                     .value.ShaderProgramIDVal);
             break;
-        case gl::EntryPoint::ValidateProgram:
+        case angle::EntryPoint::GLValidateProgram:
             context->validateProgram(
                 params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal);
             break;
-        case gl::EntryPoint::ValidateProgramPipeline:
+        case angle::EntryPoint::GLValidateProgramPipeline:
             context->validateProgramPipeline(
                 params.getParam("pipelinePacked", ParamType::TProgramPipelineID, 0)
                     .value.ProgramPipelineIDVal);
             break;
-        case gl::EntryPoint::VertexAttrib1f:
+        case angle::EntryPoint::GLVertexAttrib1f:
             context->vertexAttrib1f(params.getParam("index", ParamType::TGLuint, 0).value.GLuintVal,
                                     params.getParam("x", ParamType::TGLfloat, 1).value.GLfloatVal);
             break;
-        case gl::EntryPoint::VertexAttrib1fv:
+        case angle::EntryPoint::GLVertexAttrib1fv:
             context->vertexAttrib1fv(
                 params.getParam("index", ParamType::TGLuint, 0).value.GLuintVal,
                 replayContext->getAsConstPointer<const GLfloat *>(
                     params.getParam("v", ParamType::TGLfloatConstPointer, 1)));
             break;
-        case gl::EntryPoint::VertexAttrib2f:
+        case angle::EntryPoint::GLVertexAttrib2f:
             context->vertexAttrib2f(params.getParam("index", ParamType::TGLuint, 0).value.GLuintVal,
                                     params.getParam("x", ParamType::TGLfloat, 1).value.GLfloatVal,
                                     params.getParam("y", ParamType::TGLfloat, 2).value.GLfloatVal);
             break;
-        case gl::EntryPoint::VertexAttrib2fv:
+        case angle::EntryPoint::GLVertexAttrib2fv:
             context->vertexAttrib2fv(
                 params.getParam("index", ParamType::TGLuint, 0).value.GLuintVal,
                 replayContext->getAsConstPointer<const GLfloat *>(
                     params.getParam("v", ParamType::TGLfloatConstPointer, 1)));
             break;
-        case gl::EntryPoint::VertexAttrib3f:
+        case angle::EntryPoint::GLVertexAttrib3f:
             context->vertexAttrib3f(params.getParam("index", ParamType::TGLuint, 0).value.GLuintVal,
                                     params.getParam("x", ParamType::TGLfloat, 1).value.GLfloatVal,
                                     params.getParam("y", ParamType::TGLfloat, 2).value.GLfloatVal,
                                     params.getParam("z", ParamType::TGLfloat, 3).value.GLfloatVal);
             break;
-        case gl::EntryPoint::VertexAttrib3fv:
+        case angle::EntryPoint::GLVertexAttrib3fv:
             context->vertexAttrib3fv(
                 params.getParam("index", ParamType::TGLuint, 0).value.GLuintVal,
                 replayContext->getAsConstPointer<const GLfloat *>(
                     params.getParam("v", ParamType::TGLfloatConstPointer, 1)));
             break;
-        case gl::EntryPoint::VertexAttrib4f:
+        case angle::EntryPoint::GLVertexAttrib4f:
             context->vertexAttrib4f(params.getParam("index", ParamType::TGLuint, 0).value.GLuintVal,
                                     params.getParam("x", ParamType::TGLfloat, 1).value.GLfloatVal,
                                     params.getParam("y", ParamType::TGLfloat, 2).value.GLfloatVal,
                                     params.getParam("z", ParamType::TGLfloat, 3).value.GLfloatVal,
                                     params.getParam("w", ParamType::TGLfloat, 4).value.GLfloatVal);
             break;
-        case gl::EntryPoint::VertexAttrib4fv:
+        case angle::EntryPoint::GLVertexAttrib4fv:
             context->vertexAttrib4fv(
                 params.getParam("index", ParamType::TGLuint, 0).value.GLuintVal,
                 replayContext->getAsConstPointer<const GLfloat *>(
                     params.getParam("v", ParamType::TGLfloatConstPointer, 1)));
             break;
-        case gl::EntryPoint::VertexAttribBinding:
+        case angle::EntryPoint::GLVertexAttribBinding:
             context->vertexAttribBinding(
                 params.getParam("attribindex", ParamType::TGLuint, 0).value.GLuintVal,
                 params.getParam("bindingindex", ParamType::TGLuint, 1).value.GLuintVal);
             break;
-        case gl::EntryPoint::VertexAttribDivisor:
+        case angle::EntryPoint::GLVertexAttribDivisor:
             context->vertexAttribDivisor(
                 params.getParam("index", ParamType::TGLuint, 0).value.GLuintVal,
                 params.getParam("divisor", ParamType::TGLuint, 1).value.GLuintVal);
             break;
-        case gl::EntryPoint::VertexAttribFormat:
+        case angle::EntryPoint::GLVertexAttribFormat:
             context->vertexAttribFormat(
                 params.getParam("attribindex", ParamType::TGLuint, 0).value.GLuintVal,
                 params.getParam("size", ParamType::TGLint, 1).value.GLintVal,
@@ -3268,7 +3268,7 @@
                 params.getParam("normalized", ParamType::TGLboolean, 3).value.GLbooleanVal,
                 params.getParam("relativeoffset", ParamType::TGLuint, 4).value.GLuintVal);
             break;
-        case gl::EntryPoint::VertexAttribI4i:
+        case angle::EntryPoint::GLVertexAttribI4i:
             context->vertexAttribI4i(
                 params.getParam("index", ParamType::TGLuint, 0).value.GLuintVal,
                 params.getParam("x", ParamType::TGLint, 1).value.GLintVal,
@@ -3276,13 +3276,13 @@
                 params.getParam("z", ParamType::TGLint, 3).value.GLintVal,
                 params.getParam("w", ParamType::TGLint, 4).value.GLintVal);
             break;
-        case gl::EntryPoint::VertexAttribI4iv:
+        case angle::EntryPoint::GLVertexAttribI4iv:
             context->vertexAttribI4iv(
                 params.getParam("index", ParamType::TGLuint, 0).value.GLuintVal,
                 replayContext->getAsConstPointer<const GLint *>(
                     params.getParam("v", ParamType::TGLintConstPointer, 1)));
             break;
-        case gl::EntryPoint::VertexAttribI4ui:
+        case angle::EntryPoint::GLVertexAttribI4ui:
             context->vertexAttribI4ui(
                 params.getParam("index", ParamType::TGLuint, 0).value.GLuintVal,
                 params.getParam("x", ParamType::TGLuint, 1).value.GLuintVal,
@@ -3290,13 +3290,13 @@
                 params.getParam("z", ParamType::TGLuint, 3).value.GLuintVal,
                 params.getParam("w", ParamType::TGLuint, 4).value.GLuintVal);
             break;
-        case gl::EntryPoint::VertexAttribI4uiv:
+        case angle::EntryPoint::GLVertexAttribI4uiv:
             context->vertexAttribI4uiv(
                 params.getParam("index", ParamType::TGLuint, 0).value.GLuintVal,
                 replayContext->getAsConstPointer<const GLuint *>(
                     params.getParam("v", ParamType::TGLuintConstPointer, 1)));
             break;
-        case gl::EntryPoint::VertexAttribIFormat:
+        case angle::EntryPoint::GLVertexAttribIFormat:
             context->vertexAttribIFormat(
                 params.getParam("attribindex", ParamType::TGLuint, 0).value.GLuintVal,
                 params.getParam("size", ParamType::TGLint, 1).value.GLintVal,
@@ -3304,7 +3304,7 @@
                     .value.VertexAttribTypeVal,
                 params.getParam("relativeoffset", ParamType::TGLuint, 3).value.GLuintVal);
             break;
-        case gl::EntryPoint::VertexAttribIPointer:
+        case angle::EntryPoint::GLVertexAttribIPointer:
             context->vertexAttribIPointer(
                 params.getParam("index", ParamType::TGLuint, 0).value.GLuintVal,
                 params.getParam("size", ParamType::TGLint, 1).value.GLintVal,
@@ -3314,7 +3314,7 @@
                 replayContext->getAsConstPointer<const void *>(
                     params.getParam("pointer", ParamType::TvoidConstPointer, 4)));
             break;
-        case gl::EntryPoint::VertexAttribPointer:
+        case angle::EntryPoint::GLVertexAttribPointer:
             context->vertexAttribPointer(
                 params.getParam("index", ParamType::TGLuint, 0).value.GLuintVal,
                 params.getParam("size", ParamType::TGLint, 1).value.GLintVal,
@@ -3325,12 +3325,12 @@
                 replayContext->getAsConstPointer<const void *>(
                     params.getParam("pointer", ParamType::TvoidConstPointer, 5)));
             break;
-        case gl::EntryPoint::VertexBindingDivisor:
+        case angle::EntryPoint::GLVertexBindingDivisor:
             context->vertexBindingDivisor(
                 params.getParam("bindingindex", ParamType::TGLuint, 0).value.GLuintVal,
                 params.getParam("divisor", ParamType::TGLuint, 1).value.GLuintVal);
             break;
-        case gl::EntryPoint::VertexPointer:
+        case angle::EntryPoint::GLVertexPointer:
             context->vertexPointer(
                 params.getParam("size", ParamType::TGLint, 0).value.GLintVal,
                 params.getParam("typePacked", ParamType::TVertexAttribType, 1)
@@ -3339,13 +3339,13 @@
                 replayContext->getAsConstPointer<const void *>(
                     params.getParam("pointer", ParamType::TvoidConstPointer, 3)));
             break;
-        case gl::EntryPoint::Viewport:
+        case angle::EntryPoint::GLViewport:
             context->viewport(params.getParam("x", ParamType::TGLint, 0).value.GLintVal,
                               params.getParam("y", ParamType::TGLint, 1).value.GLintVal,
                               params.getParam("width", ParamType::TGLsizei, 2).value.GLsizeiVal,
                               params.getParam("height", ParamType::TGLsizei, 3).value.GLsizeiVal);
             break;
-        case gl::EntryPoint::WaitSync:
+        case angle::EntryPoint::GLWaitSync:
             context->waitSync(
                 params.getParam("sync", ParamType::TGLsync, 0).value.GLsyncVal,
                 params.getParam("flags", ParamType::TGLbitfield, 1).value.GLbitfieldVal,
diff --git a/src/libANGLE/frame_capture_utils.cpp b/src/libANGLE/frame_capture_utils.cpp
index 076cfe6..30be707 100644
--- a/src/libANGLE/frame_capture_utils.cpp
+++ b/src/libANGLE/frame_capture_utils.cpp
@@ -587,6 +587,7 @@
         SerializeShaderVariable(bos, field);
     }
     bos->writeString(shaderVariable.structName);
+    bos->writeString(shaderVariable.mappedStructName);
     bos->writeBool(shaderVariable.isRowMajorLayout);
     bos->writeInt(shaderVariable.location);
     bos->writeInt(shaderVariable.binding);
diff --git a/src/libANGLE/gl_enum_utils_autogen.cpp b/src/libANGLE/gl_enum_utils_autogen.cpp
index ba97b41..81178aa 100644
--- a/src/libANGLE/gl_enum_utils_autogen.cpp
+++ b/src/libANGLE/gl_enum_utils_autogen.cpp
@@ -1135,6 +1135,12 @@
                     return "GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS";
                 case 0x8A34:
                     return "GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT";
+                case 0x8A4F:
+                    return "GL_PROGRAM_PIPELINE_OBJECT_EXT";
+                case 0x8B40:
+                    return "GL_PROGRAM_OBJECT_EXT";
+                case 0x8B48:
+                    return "GL_SHADER_OBJECT_EXT";
                 case 0x8B49:
                     return "GL_MAX_FRAGMENT_UNIFORM_COMPONENTS";
                 case 0x8B4A:
@@ -1621,6 +1627,12 @@
                     return "GL_DEBUG_SEVERITY_MEDIUM_KHR";
                 case 0x9148:
                     return "GL_DEBUG_SEVERITY_LOW_KHR";
+                case 0x9151:
+                    return "GL_BUFFER_OBJECT_EXT";
+                case 0x9153:
+                    return "GL_QUERY_OBJECT_EXT";
+                case 0x9154:
+                    return "GL_VERTEX_ARRAY_OBJECT_EXT";
                 case 0x919D:
                     return "GL_TEXTURE_BUFFER_OFFSET";
                 case 0x919E:
diff --git a/src/libANGLE/renderer/DisplayImpl.cpp b/src/libANGLE/renderer/DisplayImpl.cpp
index d41c257..b38f9ca 100644
--- a/src/libANGLE/renderer/DisplayImpl.cpp
+++ b/src/libANGLE/renderer/DisplayImpl.cpp
@@ -10,9 +10,34 @@
 
 #include "libANGLE/Display.h"
 #include "libANGLE/Surface.h"
+#include "libANGLE/renderer/DeviceImpl.h"
 
 namespace rx
 {
+namespace
+{
+// For back-ends that do not implement EGLDevice.
+class MockDevice : public DeviceImpl
+{
+  public:
+    MockDevice() = default;
+    egl::Error initialize() override { return egl::NoError(); }
+    egl::Error getAttribute(const egl::Display *display, EGLint attribute, void **outValue) override
+    {
+        UNREACHABLE();
+        return egl::EglBadAttribute();
+    }
+    EGLint getType() override
+    {
+        UNREACHABLE();
+        return EGL_NONE;
+    }
+    void generateExtensions(egl::DeviceExtensions *outExtensions) const override
+    {
+        *outExtensions = egl::DeviceExtensions();
+    }
+};
+}  // anonymous namespace
 
 DisplayImpl::DisplayImpl(const egl::DisplayState &state)
     : mState(state), mExtensionsInitialized(false), mCapsInitialized(false), mBlobCache(nullptr)
@@ -67,7 +92,7 @@
     return egl::EglBadDisplay() << "DisplayImpl::validateImageClientBuffer unimplemented.";
 }
 
-egl::Error DisplayImpl::validatePixmap(egl::Config *config,
+egl::Error DisplayImpl::validatePixmap(const egl::Config *config,
                                        EGLNativePixmapType pixmap,
                                        const egl::AttributeMap &attributes) const
 {
@@ -86,4 +111,8 @@
     return mCaps;
 }
 
+DeviceImpl *DisplayImpl::createDevice()
+{
+    return new MockDevice();
+}
 }  // namespace rx
diff --git a/src/libANGLE/renderer/DisplayImpl.h b/src/libANGLE/renderer/DisplayImpl.h
index 84f8ff1..89d9bb6 100644
--- a/src/libANGLE/renderer/DisplayImpl.h
+++ b/src/libANGLE/renderer/DisplayImpl.h
@@ -90,13 +90,13 @@
                                                  EGLenum target,
                                                  EGLClientBuffer clientBuffer,
                                                  const egl::AttributeMap &attribs) const;
-    virtual egl::Error validatePixmap(egl::Config *config,
+    virtual egl::Error validatePixmap(const egl::Config *config,
                                       EGLNativePixmapType pixmap,
                                       const egl::AttributeMap &attributes) const;
 
     virtual std::string getVendorString() const = 0;
 
-    virtual DeviceImpl *createDevice() = 0;
+    virtual DeviceImpl *createDevice();
 
     virtual egl::Error waitClient(const gl::Context *context)                = 0;
     virtual egl::Error waitNative(const gl::Context *context, EGLint engine) = 0;
diff --git a/src/libANGLE/renderer/Format.h b/src/libANGLE/renderer/Format.h
index b17f657..0c5a316 100644
--- a/src/libANGLE/renderer/Format.h
+++ b/src/libANGLE/renderer/Format.h
@@ -52,6 +52,7 @@
 
     constexpr bool hasDepthOrStencilBits() const;
     constexpr bool isLUMA() const;
+    constexpr bool isBGRA() const;
 
     constexpr bool isSint() const;
     constexpr bool isUint() const;
@@ -189,6 +190,12 @@
     return redBits == 0 && (luminanceBits > 0 || alphaBits > 0);
 }
 
+constexpr bool Format::isBGRA() const
+{
+    return id == FormatID::B8G8R8A8_UNORM || id == FormatID::B8G8R8A8_UNORM_SRGB ||
+           id == FormatID::B8G8R8A8_TYPELESS || id == FormatID::B8G8R8A8_TYPELESS_SRGB;
+}
+
 constexpr bool Format::isSint() const
 {
     return componentType == GL_INT;
diff --git a/src/libANGLE/renderer/QueryImpl.h b/src/libANGLE/renderer/QueryImpl.h
index 34ccb80..c116738 100644
--- a/src/libANGLE/renderer/QueryImpl.h
+++ b/src/libANGLE/renderer/QueryImpl.h
@@ -39,16 +39,7 @@
 
     gl::QueryType getType() const { return mType; }
 
-    // Convenient functions
-    bool isOcclusionQuery() const { return isAnySamplesQuery() || isAnySamplesConservativeQuery(); }
-    bool isAnySamplesQuery() const { return getType() == gl::QueryType::AnySamples; }
-
-    bool isAnySamplesConservativeQuery() const
-    {
-        return getType() == gl::QueryType::AnySamplesConservative;
-    }
-
-  private:
+  protected:
     gl::QueryType mType;
 };
 }  // namespace rx
diff --git a/src/libANGLE/renderer/StreamProducerImpl.h b/src/libANGLE/renderer/StreamProducerImpl.h
index 8666845..e4a65e2 100644
--- a/src/libANGLE/renderer/StreamProducerImpl.h
+++ b/src/libANGLE/renderer/StreamProducerImpl.h
@@ -23,7 +23,7 @@
 
     // Validates the ability for the producer to accept an arbitrary pointer to a frame. All
     // pointers should be validated through this function before being used to produce a frame.
-    virtual egl::Error validateD3DTexture(void *pointer,
+    virtual egl::Error validateD3DTexture(const void *pointer,
                                           const egl::AttributeMap &attributes) const = 0;
 
     // Constructs a frame from an arbitrary external pointer that points to producer specific frame
diff --git a/src/libANGLE/renderer/SurfaceImpl.cpp b/src/libANGLE/renderer/SurfaceImpl.cpp
index 8f309ce..282290c 100644
--- a/src/libANGLE/renderer/SurfaceImpl.cpp
+++ b/src/libANGLE/renderer/SurfaceImpl.cpp
@@ -25,7 +25,9 @@
     return egl::NoError();
 }
 
-egl::Error SurfaceImpl::swapWithDamage(const gl::Context *context, EGLint *rects, EGLint n_rects)
+egl::Error SurfaceImpl::swapWithDamage(const gl::Context *context,
+                                       const EGLint *rects,
+                                       EGLint n_rects)
 {
     UNREACHABLE();
     return egl::EglBadSurface() << "swapWithDamage implementation missing.";
diff --git a/src/libANGLE/renderer/SurfaceImpl.h b/src/libANGLE/renderer/SurfaceImpl.h
index b4e4a93..f0c19d0 100644
--- a/src/libANGLE/renderer/SurfaceImpl.h
+++ b/src/libANGLE/renderer/SurfaceImpl.h
@@ -56,7 +56,9 @@
     virtual egl::Error makeCurrent(const gl::Context *context);
     virtual egl::Error unMakeCurrent(const gl::Context *context);
     virtual egl::Error swap(const gl::Context *context) = 0;
-    virtual egl::Error swapWithDamage(const gl::Context *context, EGLint *rects, EGLint n_rects);
+    virtual egl::Error swapWithDamage(const gl::Context *context,
+                                      const EGLint *rects,
+                                      EGLint n_rects);
     virtual egl::Error swapWithFrameToken(const gl::Context *context,
                                           EGLFrameTokenANGLE frameToken);
     virtual egl::Error postSubBuffer(const gl::Context *context,
diff --git a/src/libANGLE/renderer/d3d/ProgramD3D.cpp b/src/libANGLE/renderer/d3d/ProgramD3D.cpp
index aecf1c0..d2cec44 100644
--- a/src/libANGLE/renderer/d3d/ProgramD3D.cpp
+++ b/src/libANGLE/renderer/d3d/ProgramD3D.cpp
@@ -2078,6 +2078,27 @@
                 shadersD3D[shaderType]->generateWorkarounds(&mShaderWorkarounds[shaderType]);
 
                 mShaderUniformsDirty.set(shaderType);
+
+                const std::set<std::string> &slowCompilingUniformBlockSet =
+                    shadersD3D[shaderType]->getSlowCompilingUniformBlockSet();
+                if (slowCompilingUniformBlockSet.size() > 0)
+                {
+                    std::ostringstream stream;
+                    stream << "You could get a better shader compiling performance if you re-write"
+                           << " the uniform block(s)\n[ ";
+                    for (const std::string &str : slowCompilingUniformBlockSet)
+                    {
+                        stream << str << " ";
+                    }
+                    stream << "]\nin the " << gl::GetShaderTypeString(shaderType) << " shader.\n";
+
+                    stream << "You could get more details from "
+                              "https://chromium.googlesource.com/angle/angle/+/refs/heads/master/"
+                              "src/libANGLE/renderer/d3d/d3d11/"
+                              "UniformBlockToStructuredBufferTranslation.md\n";
+                    ANGLE_PERF_WARNING(context->getState().getDebug(), GL_DEBUG_SEVERITY_MEDIUM,
+                                       stream.str().c_str());
+                }
             }
         }
 
diff --git a/src/libANGLE/renderer/d3d/ShaderD3D.cpp b/src/libANGLE/renderer/d3d/ShaderD3D.cpp
index 6d197a8..f91bd68 100644
--- a/src/libANGLE/renderer/d3d/ShaderD3D.cpp
+++ b/src/libANGLE/renderer/d3d/ShaderD3D.cpp
@@ -240,6 +240,11 @@
     return mUsedImage2DFunctionNames.find(functionName) != mUsedImage2DFunctionNames.end();
 }
 
+const std::set<std::string> &ShaderD3D::getSlowCompilingUniformBlockSet() const
+{
+    return mSlowCompilingUniformBlockSet;
+}
+
 const std::map<std::string, unsigned int> &GetUniformRegisterMap(
     const std::map<std::string, unsigned int> *uniformRegisterMap)
 {
@@ -247,6 +252,13 @@
     return *uniformRegisterMap;
 }
 
+const std::set<std::string> &GetSlowCompilingUniformBlockSet(
+    const std::set<std::string> *slowCompilingUniformBlockSet)
+{
+    ASSERT(slowCompilingUniformBlockSet);
+    return *slowCompilingUniformBlockSet;
+}
+
 const std::set<std::string> &GetUsedImage2DFunctionNames(
     const std::set<std::string> *usedImage2DFunctionNames)
 {
@@ -330,6 +342,9 @@
             }
         }
 
+        mSlowCompilingUniformBlockSet =
+            GetSlowCompilingUniformBlockSet(sh::GetSlowCompilingUniformBlockSet(compilerHandle));
+
         for (const sh::InterfaceBlock &interfaceBlock : mState.getShaderStorageBlocks())
         {
             if (interfaceBlock.active)
diff --git a/src/libANGLE/renderer/d3d/ShaderD3D.h b/src/libANGLE/renderer/d3d/ShaderD3D.h
index b5a5ef5..4d5c609 100644
--- a/src/libANGLE/renderer/d3d/ShaderD3D.h
+++ b/src/libANGLE/renderer/d3d/ShaderD3D.h
@@ -59,6 +59,7 @@
     unsigned int getReadonlyImage2DRegisterIndex() const { return mReadonlyImage2DRegisterIndex; }
     unsigned int getImage2DRegisterIndex() const { return mImage2DRegisterIndex; }
     bool useImage2DFunction(const std::string &functionName) const;
+    const std::set<std::string> &getSlowCompilingUniformBlockSet() const;
     void appendDebugInfo(const std::string &info) const { mDebugInfo += info; }
 
     void generateWorkarounds(angle::CompilerWorkaroundsD3D *workarounds) const;
@@ -104,6 +105,7 @@
     std::map<std::string, unsigned int> mUniformRegisterMap;
     std::map<std::string, unsigned int> mUniformBlockRegisterMap;
     std::map<std::string, bool> mUniformBlockUseStructuredBufferMap;
+    std::set<std::string> mSlowCompilingUniformBlockSet;
     std::map<std::string, unsigned int> mShaderStorageBlockRegisterMap;
     unsigned int mReadonlyImage2DRegisterIndex;
     unsigned int mImage2DRegisterIndex;
diff --git a/src/libANGLE/renderer/d3d/d3d11/Context11.cpp b/src/libANGLE/renderer/d3d/d3d11/Context11.cpp
index c1eacff..adc6c6a 100644
--- a/src/libANGLE/renderer/d3d/d3d11/Context11.cpp
+++ b/src/libANGLE/renderer/d3d/d3d11/Context11.cpp
@@ -741,7 +741,8 @@
 
 angle::Result Context11::pushGroupMarker(GLsizei length, const char *marker)
 {
-    mRenderer->getAnnotator()->beginEvent(nullptr, gl::EntryPoint::Begin, marker, marker);
+    mRenderer->getAnnotator()->beginEvent(nullptr, angle::EntryPoint::GLPushGroupMarkerEXT, marker,
+                                          marker);
     mMarkerStack.push(std::string(marker));
     return angle::Result::Continue;
 }
@@ -753,7 +754,8 @@
     {
         marker = mMarkerStack.top().c_str();
         mMarkerStack.pop();
-        mRenderer->getAnnotator()->endEvent(nullptr, marker, gl::EntryPoint::Begin);
+        mRenderer->getAnnotator()->endEvent(nullptr, marker,
+                                            angle::EntryPoint::GLPopGroupMarkerEXT);
     }
     return angle::Result::Continue;
 }
diff --git a/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.cpp b/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.cpp
index 9f801d8..533aa67 100644
--- a/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.cpp
+++ b/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.cpp
@@ -20,7 +20,7 @@
 DebugAnnotator11::~DebugAnnotator11() {}
 
 void DebugAnnotator11::beginEvent(gl::Context *context,
-                                  gl::EntryPoint entryPoint,
+                                  angle::EntryPoint entryPoint,
                                   const char *eventName,
                                   const char *eventMessage)
 {
@@ -35,7 +35,7 @@
 
 void DebugAnnotator11::endEvent(gl::Context *context,
                                 const char *eventName,
-                                gl::EntryPoint entryPoint)
+                                angle::EntryPoint entryPoint)
 {
     angle::LoggingAnnotator::endEvent(context, eventName, entryPoint);
     if (loggingEnabledForThisThread())
diff --git a/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.h b/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.h
index e1ed021..17c9efd 100644
--- a/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.h
+++ b/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.h
@@ -24,10 +24,12 @@
     void initialize(ID3D11DeviceContext *context);
     void release();
     void beginEvent(gl::Context *context,
-                    gl::EntryPoint entryPoint,
+                    angle::EntryPoint entryPoint,
                     const char *eventName,
                     const char *eventMessage) override;
-    void endEvent(gl::Context *context, const char *eventName, gl::EntryPoint entryPoint) override;
+    void endEvent(gl::Context *context,
+                  const char *eventName,
+                  angle::EntryPoint entryPoint) override;
     void setMarker(const char *markerName) override;
     bool getStatus() override;
 
diff --git a/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp b/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
index 85eb72f..bd44ac7 100644
--- a/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
+++ b/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
@@ -1287,8 +1287,6 @@
     // D3D11 does not support present with dirty rectangles until DXGI 1.2.
     outExtensions->postSubBuffer = mRenderer11DeviceCaps.supportsDXGI1_2;
 
-    outExtensions->deviceQuery = true;
-
     outExtensions->image                 = true;
     outExtensions->imageBase             = true;
     outExtensions->glTexture2DImage      = true;
diff --git a/src/libANGLE/renderer/d3d/d3d11/StreamProducerD3DTexture.cpp b/src/libANGLE/renderer/d3d/d3d11/StreamProducerD3DTexture.cpp
index 7afccbb..bd6fef1 100644
--- a/src/libANGLE/renderer/d3d/d3d11/StreamProducerD3DTexture.cpp
+++ b/src/libANGLE/renderer/d3d/d3d11/StreamProducerD3DTexture.cpp
@@ -112,10 +112,11 @@
     SafeRelease(mTexture);
 }
 
-egl::Error StreamProducerD3DTexture::validateD3DTexture(void *pointer,
+egl::Error StreamProducerD3DTexture::validateD3DTexture(const void *pointer,
                                                         const egl::AttributeMap &attributes) const
 {
-    ID3D11Texture2D *textureD3D = static_cast<ID3D11Texture2D *>(pointer);
+    // We must remove the const qualifier because "GetDevice" and "GetDesc" are non-const in D3D11.
+    ID3D11Texture2D *textureD3D = static_cast<ID3D11Texture2D *>(const_cast<void *>(pointer));
 
     // Check that the texture originated from our device
     ID3D11Device *device;
diff --git a/src/libANGLE/renderer/d3d/d3d11/StreamProducerD3DTexture.h b/src/libANGLE/renderer/d3d/d3d11/StreamProducerD3DTexture.h
index 287fad0..bcb0057 100644
--- a/src/libANGLE/renderer/d3d/d3d11/StreamProducerD3DTexture.h
+++ b/src/libANGLE/renderer/d3d/d3d11/StreamProducerD3DTexture.h
@@ -21,7 +21,7 @@
     StreamProducerD3DTexture(Renderer11 *renderer);
     ~StreamProducerD3DTexture() override;
 
-    egl::Error validateD3DTexture(void *pointer,
+    egl::Error validateD3DTexture(const void *pointer,
                                   const egl::AttributeMap &attributes) const override;
     void postD3DTexture(void *pointer, const egl::AttributeMap &attributes) override;
     egl::Stream::GLTextureDescription getGLFrameDescription(int planeIndex) override;
diff --git a/src/libANGLE/renderer/d3d/d3d11/UniformBlockToStructuredBufferTranslation.md b/src/libANGLE/renderer/d3d/d3d11/UniformBlockToStructuredBufferTranslation.md
new file mode 100644
index 0000000..fe100b5
--- /dev/null
+++ b/src/libANGLE/renderer/d3d/d3d11/UniformBlockToStructuredBufferTranslation.md
@@ -0,0 +1,154 @@
+# Uniform Block to StructuredBuffer Translation
+
+## Background
+In ANGLE's D3D11 backend, we normally translate GLSL uniform blocks to
+HLSL constant buffers. We run into a compile performance issue with
+[fxc](https://docs.microsoft.com/en-us/windows/win32/direct3dtools/fxc)
+and dynamic constant buffer indexing,
+[anglebug.com/3682](https://bugs.chromium.org/p/angleproject/issues/detail?id=3682)
+
+## Solution
+We translate a uniform block into a StructuredBuffer when the following three
+conditions are satisfied:
+* The uniform block has only one array member, and the array size is larger than or
+equal to 50;
+* In the shader, all the accesses of the member are through indexing operator;
+* The type of the array member must be any of the following:
+  * a scalar or vector type.
+  * a mat2x4, mat3x4 or mat4x4 matrix type in column major layout, a mat4x2, mat4x2 or
+  mat4x3 matrix type in row major layout.
+  * a structure type with no array or structure members, where all of the structure's
+  fields satisify the prior type conditions.
+
+## Analysis
+A typical use case for uniform block to StructuredBuffer translation is for shaders with
+one large array member in a uniform block. For example:
+```
+// GLSL code
+uniform buffer {
+    TYPE buf [100];
+};
+```
+Will be translated into
+```
+// HLSL code
+StructuredBuffer <TYPETRANSLATED>  bufTranslated: register(tN);
+```
+
+However, even with the above limitation, there are still many shaders where we cannot
+apply our translation. They are divided into two classes. The first case is when the
+shader accesses a "whole entity" uniform block array member element. The second is when
+the shader uses the std140 layout.
+
+### Operate uniform block array member as whole entity
+According to ESSL spec 3.0, 5.7 Structure and Array Operations,  the following operators
+are allowed to operate on arrays as whole entities:
+
+|  Operator NameName         |    Operator    |
+|  :----------------         |    :------:    |
+|  field or method selector  |        .       |
+|  assignment                |     ==  !=     |
+|  Ternary operator          |       ?:       |
+|  Sequence operator         |       ,        |
+|  indexing                  |       []       |
+
+However, after translating to StructuredBuffer, the uniform array member cannot be used as
+a whole entity since its type has been changed. The member is no longer an array.
+After the change, we only support the indexed operation since it is the most common use case.
+Other operator usage is unsupported. Example unsupported usages:
+
+| Operator On the Uniform Array Member    |                  examples                        |
+|             :------                     |                  :------                         |
+| indexing             | TYPE var = buf[INDEX];                                              |
+| method selector      | buf.length();   // Angle don’t support it, too.                     |
+| equality == !=       | TYPE var[NUMBER] = {…}; <br> if (var == buf);                       |
+| assignment =         | TYPE var[NUMBER] = {…}; <br> var = buf;                             |
+| Ternary operator ?:  | // Angle don’t support it, too.                                     |
+| Sequence operator ,  | TYPE var1[NUMBER] = {…}; <br> TYPE var2[NUMBER] = (var1, buf);      |
+| Function arguments   | void func(TYPE a[NUMBER]); <br> func(buf);                          |
+| Function return type | TYPE[NUMBER] func() { return buf;}  <br> TYPE var[NUMBER] = func(); |
+
+### Std140 limitation
+GLSL uniform blocks follow std140 layout packing rules. StructuredBufer has a different set
+of packing rules. So we may need to explicitly pad the type `TYPETRANSLATED` to follow std140
+rules. Alternately, we can just simply only support those types which don't need to be padded.
+These are the supported translation types which do not require translation emulation:
+
+|         GLSL TYPE          |     TRANSLATED HLSL TYPE      |
+|         :------            |          :------              |
+|   vec4/ivec4/uvec4/bvec4   |     float4/int4/uint4/bool4   |
+|   mat2x4 (column_major)    |     float2x4 (row_major)      |
+|   mat3x4 (column_major)    |     float3x4 (row_major)      |
+|   mat4x4 (column_major)    |     float4x4 (row_major)      |
+|   mat4x2 (row_major)       |     float4x3 (column_major)   |
+|   mat4x3 (row_major)       |     float4x3 (column_major)   |
+|   mat4x4 (row_major)       |     float4x4 (column_major)   |
+
+These are the supported translation types which require some basic translation emulation:
+
+|         GLSL TYPE          |     TRANSLATED HLSL TYPE      |     examples        |
+|         :------            |          :------              |     :------         |
+|float/int/uint/bool   |float4/int4/uint4/bool4|GLSL: float var = buf[0]; <br> HLSL: float var = buf[0].x;  |
+|vec2/ivec2/uvec2/bvec2|float4/int4/uint4/bool4|GLSL: vec2 var = buf[0]; <br> HLSL: float2 var = buf[0].xy; |
+|vec3/ivec3/uvec3/bvec3|float4/int4/uint4/bool4|GLSL: vec3 var = buf[0]; <br> HLSL: float3 var = buf[0].xyz;|
+
+These are the unsupported translation types which require more complex translation emulation:
+
+|         GLSL TYPE          |     TRANSLATED HLSL TYPE      |
+|         :------            |          :------              |
+|   mat2x2 (column_major)    |     float2x4 (row_major)      |
+|   mat2x3 (column_major)    |     float2x4 (row_major)      |
+|   mat3x2 (column_major)    |     float3x4 (row_major)      |
+|   mat3x3 (column_major)    |     float3x4 (row_major)      |
+|   mat4x2 (column_major)    |     float4x4 (row_major)      |
+|   mat4x3 (column_major)    |     float4x4 (row_major)      |
+|   mat2x2 (row_major)       |     float4x2 (column_major)   |
+|   mat2x3 (row_major)       |     float4x3 (column_major)   |
+|   mat2x4 (row_major)       |     float4x4 (column_major)   |
+|   mat3x2 (row_major)       |     float4x2 (column_major)   |
+|   mat3x3 (row_major)       |     float4x3 (column_major)   |
+|   mat3x4 (row_major)       |     float4x4 (column_major)   |
+
+
+Take mat3x2(column_major) for an example, the uniform buffer's memory layout is as shown below.
+
+|index|0                      |1                         |...      |
+|:--- |      :------          |        :------           |  :---   |
+|data |1 2 x x 3 4 x x 5 6 x x|7 8 x x 9 10 x x 11 12 x x|...      |
+
+
+And the declaration of the uniform block in vertex shader may be as shown below.
+```
+layout(std140) uniform buffer {
+    mat3x2 buf [100];
+};
+
+void main(void) {
+    ...
+    vec2 var = buf[0][2]
+    ...
+}
+```
+Will be translated to
+
+```
+#pragma pack_matrix(row_major)
+StructuredBuffer<float3x4> bufTranslated: register(t0);
+
+float3x2 GetFloat3x2FromFloat3x4Rowmajor(float3x4 mat)
+{
+    float3x2 res = { 0.0 };
+    res[0] = mat[0].xy;
+    res[1] = mat[1].xy;
+    res[2] = mat[2].xy;
+    return res;
+}
+
+VS_OUTPUT main(VS_INPUT input) {
+    ...
+    float3x2 var = GetFloat3x2FromFloat3x4Rowmajor(bufTranslated[0])
+}
+```
+
+When accessing the element of the `buf` variable, we would need to extract a float3x2 from
+a float3x4 for every element.
\ No newline at end of file
diff --git a/src/libANGLE/renderer/d3d/d3d9/Context9.cpp b/src/libANGLE/renderer/d3d/d3d9/Context9.cpp
index a4987bd..54653e5 100644
--- a/src/libANGLE/renderer/d3d/d3d9/Context9.cpp
+++ b/src/libANGLE/renderer/d3d/d3d9/Context9.cpp
@@ -376,7 +376,8 @@
 
 angle::Result Context9::pushGroupMarker(GLsizei length, const char *marker)
 {
-    mRenderer->getAnnotator()->beginEvent(nullptr, gl::EntryPoint::Begin, marker, marker);
+    mRenderer->getAnnotator()->beginEvent(nullptr, angle::EntryPoint::GLPushGroupMarkerEXT, marker,
+                                          marker);
     mMarkerStack.push(std::string(marker));
     return angle::Result::Continue;
 }
@@ -388,7 +389,8 @@
     {
         marker = mMarkerStack.top().c_str();
         mMarkerStack.pop();
-        mRenderer->getAnnotator()->endEvent(nullptr, marker, gl::EntryPoint::Begin);
+        mRenderer->getAnnotator()->endEvent(nullptr, marker,
+                                            angle::EntryPoint::GLPopGroupMarkerEXT);
     }
     return angle::Result::Continue;
 }
diff --git a/src/libANGLE/renderer/d3d/d3d9/DebugAnnotator9.cpp b/src/libANGLE/renderer/d3d/d3d9/DebugAnnotator9.cpp
index 83c02c9..0522f24 100644
--- a/src/libANGLE/renderer/d3d/d3d9/DebugAnnotator9.cpp
+++ b/src/libANGLE/renderer/d3d/d3d9/DebugAnnotator9.cpp
@@ -14,7 +14,7 @@
 {
 
 void DebugAnnotator9::beginEvent(gl::Context *context,
-                                 gl::EntryPoint entryPoint,
+                                 angle::EntryPoint entryPoint,
                                  const char *eventName,
                                  const char *eventMessage)
 {
@@ -26,7 +26,7 @@
 
 void DebugAnnotator9::endEvent(gl::Context *context,
                                const char *eventName,
-                               gl::EntryPoint entryPoint)
+                               angle::EntryPoint entryPoint)
 {
     angle::LoggingAnnotator::endEvent(context, eventName, entryPoint);
     D3DPERF_EndEvent();
diff --git a/src/libANGLE/renderer/d3d/d3d9/DebugAnnotator9.h b/src/libANGLE/renderer/d3d/d3d9/DebugAnnotator9.h
index f315f09..0343834 100644
--- a/src/libANGLE/renderer/d3d/d3d9/DebugAnnotator9.h
+++ b/src/libANGLE/renderer/d3d/d3d9/DebugAnnotator9.h
@@ -19,10 +19,12 @@
   public:
     DebugAnnotator9() {}
     void beginEvent(gl::Context *context,
-                    gl::EntryPoint entryPoint,
+                    angle::EntryPoint entryPoint,
                     const char *eventName,
                     const char *eventMessage) override;
-    void endEvent(gl::Context *context, const char *eventName, gl::EntryPoint entryPoint) override;
+    void endEvent(gl::Context *context,
+                  const char *eventName,
+                  angle::EntryPoint entryPoint) override;
     void setMarker(const char *markerName) override;
     bool getStatus() override;
 
diff --git a/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp b/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp
index 96d9f82..38163d8 100644
--- a/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp
+++ b/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp
@@ -588,7 +588,6 @@
     outExtensions->querySurfacePointer = true;
     outExtensions->windowFixedSize     = true;
     outExtensions->postSubBuffer       = true;
-    outExtensions->deviceQuery         = true;
 
     outExtensions->image               = true;
     outExtensions->imageBase           = true;
diff --git a/src/libANGLE/renderer/d3d/d3d9/ShaderCache.h b/src/libANGLE/renderer/d3d/d3d9/ShaderCache.h
index 3d35ee5..bd1a4cf 100644
--- a/src/libANGLE/renderer/d3d/d3d9/ShaderCache.h
+++ b/src/libANGLE/renderer/d3d/d3d9/ShaderCache.h
@@ -95,7 +95,7 @@
         return mDevice->CreatePixelShader(function, shader);
     }
 
-    typedef std::unordered_map<std::string, ShaderObject *> Map;
+    typedef angle::HashMap<std::string, ShaderObject *> Map;
     Map mMap;
     std::mutex mMutex;
 
diff --git a/src/libANGLE/renderer/gl/BUILD.gn b/src/libANGLE/renderer/gl/BUILD.gn
index 7b2e15a..2d09226 100644
--- a/src/libANGLE/renderer/gl/BUILD.gn
+++ b/src/libANGLE/renderer/gl/BUILD.gn
@@ -178,7 +178,7 @@
   ]
 }
 
-if (is_mac) {
+if (angle_enable_cgl) {
   _gl_backend_sources += [
     "cgl/ContextCGL.cpp",
     "cgl/ContextCGL.h",
@@ -197,6 +197,27 @@
   ]
 }
 
+if (angle_enable_eagl) {
+  _gl_backend_sources += [
+    "eagl/ContextEAGL.cpp",
+    "eagl/ContextEAGL.h",
+    "eagl/DeviceEAGL.cpp",
+    "eagl/DeviceEAGL.h",
+    "eagl/DisplayEAGL.h",
+    "eagl/DisplayEAGL.mm",
+    "eagl/FunctionsEAGL.h",
+    "eagl/FunctionsEAGL.mm",
+    "eagl/IOSurfaceSurfaceEAGL.h",
+    "eagl/IOSurfaceSurfaceEAGL.mm",
+    "eagl/PbufferSurfaceEAGL.cpp",
+    "eagl/PbufferSurfaceEAGL.h",
+    "eagl/RendererEAGL.cpp",
+    "eagl/RendererEAGL.h",
+    "eagl/WindowSurfaceEAGL.h",
+    "eagl/WindowSurfaceEAGL.mm",
+  ]
+}
+
 if (angle_enable_gl_null) {
   _gl_backend_sources += [
     "null_functions.cpp",
@@ -209,6 +230,9 @@
   if (angle_enable_gl_null) {
     defines += [ "ANGLE_ENABLE_OPENGL_NULL" ]
   }
+  if (is_mac || is_ios) {
+    defines += [ "GL_SILENCE_DEPRECATION" ]
+  }
   include_dirs = [ "../../../third_party/khronos" ]
 }
 
@@ -235,13 +259,19 @@
       "Xext",
     ]
   }
-  if (is_mac) {
+  if (is_mac || is_ios) {
     frameworks = [
-      "Cocoa.framework",
       "IOSurface.framework",
-      "OpenGL.framework",
       "QuartzCore.framework",
     ]
+    if (angle_enable_eagl) {
+      frameworks += [ "OpenGLES.framework" ]
+    } else if (angle_enable_cgl) {
+      frameworks += [ "OpenGL.framework" ]
+    }
+    if (is_mac) {
+      frameworks += [ "Cocoa.framework" ]
+    }
   }
   if (ozone_platform_gbm) {
     configs += [ ":libdrm" ]
diff --git a/src/libANGLE/renderer/gl/QueryGL.cpp b/src/libANGLE/renderer/gl/QueryGL.cpp
index a048b84..5061cad 100644
--- a/src/libANGLE/renderer/gl/QueryGL.cpp
+++ b/src/libANGLE/renderer/gl/QueryGL.cpp
@@ -60,7 +60,6 @@
                                  const FunctionsGL *functions,
                                  StateManagerGL *stateManager)
     : QueryGL(type),
-      mType(type),
       mFunctions(functions),
       mStateManager(stateManager),
       mActiveQuery(0),
diff --git a/src/libANGLE/renderer/gl/QueryGL.h b/src/libANGLE/renderer/gl/QueryGL.h
index a11ffd7..a73d051 100644
--- a/src/libANGLE/renderer/gl/QueryGL.h
+++ b/src/libANGLE/renderer/gl/QueryGL.h
@@ -59,8 +59,6 @@
     template <typename T>
     angle::Result getResultBase(const gl::Context *context, T *params);
 
-    gl::QueryType mType;
-
     const FunctionsGL *mFunctions;
     StateManagerGL *mStateManager;
 
diff --git a/src/libANGLE/renderer/gl/RendererGL.h b/src/libANGLE/renderer/gl/RendererGL.h
index 1c36c82..dc2ce56 100644
--- a/src/libANGLE/renderer/gl/RendererGL.h
+++ b/src/libANGLE/renderer/gl/RendererGL.h
@@ -166,7 +166,7 @@
     mutable MultiviewImplementationTypeGL mMultiviewImplementationType;
 
     // The thread-to-context mapping for the currently active worker threads.
-    std::unordered_map<std::thread::id, std::unique_ptr<WorkerContext>> mCurrentWorkerContexts;
+    angle::HashMap<std::thread::id, std::unique_ptr<WorkerContext>> mCurrentWorkerContexts;
     // The worker contexts available to use.
     std::list<std::unique_ptr<WorkerContext>> mWorkerContextPool;
     // Protect the concurrent accesses to worker contexts.
diff --git a/src/libANGLE/renderer/gl/TextureGL.cpp b/src/libANGLE/renderer/gl/TextureGL.cpp
index 71a7c7e..077828c 100644
--- a/src/libANGLE/renderer/gl/TextureGL.cpp
+++ b/src/libANGLE/renderer/gl/TextureGL.cpp
@@ -1645,12 +1645,11 @@
 
 angle::Result TextureGL::setMinFilter(const gl::Context *context, GLenum filter)
 {
-    if (filter != mAppliedSampler.getMinFilter())
+    if (mAppliedSampler.setMinFilter(filter))
     {
         const FunctionsGL *functions = GetFunctionsGL(context);
         StateManagerGL *stateManager = GetStateManagerGL(context);
 
-        mAppliedSampler.setMinFilter(filter);
         mLocalDirtyBits.set(gl::Texture::DIRTY_BIT_MIN_FILTER);
 
         // Signal to the GL layer that the Impl has dirty bits.
@@ -1664,12 +1663,11 @@
 }
 angle::Result TextureGL::setMagFilter(const gl::Context *context, GLenum filter)
 {
-    if (filter != mAppliedSampler.getMagFilter())
+    if (mAppliedSampler.setMagFilter(filter))
     {
         const FunctionsGL *functions = GetFunctionsGL(context);
         StateManagerGL *stateManager = GetStateManagerGL(context);
 
-        mAppliedSampler.setMagFilter(filter);
         mLocalDirtyBits.set(gl::Texture::DIRTY_BIT_MAG_FILTER);
 
         // Signal to the GL layer that the Impl has dirty bits.
diff --git a/src/libANGLE/renderer/gl/cgl/DisplayCGL.mm b/src/libANGLE/renderer/gl/cgl/DisplayCGL.mm
index b5a631a..849f940 100644
--- a/src/libANGLE/renderer/gl/cgl/DisplayCGL.mm
+++ b/src/libANGLE/renderer/gl/cgl/DisplayCGL.mm
@@ -479,7 +479,6 @@
 {
     outExtensions->iosurfaceClientBuffer = true;
     outExtensions->surfacelessContext    = true;
-    outExtensions->deviceQuery           = true;
 
     // Contexts are virtualized so textures and semaphores can be shared globally
     outExtensions->displayTextureShareGroup   = true;
diff --git a/src/libANGLE/renderer/gl/eagl/DeviceEAGL.cpp b/src/libANGLE/renderer/gl/eagl/DeviceEAGL.cpp
index 7863cde..00bcdb2 100644
--- a/src/libANGLE/renderer/gl/eagl/DeviceEAGL.cpp
+++ b/src/libANGLE/renderer/gl/eagl/DeviceEAGL.cpp
@@ -56,4 +56,4 @@
 
 }  // namespace rx
 
-#endif  // defined(ANGLE_ENABLE_EAGL)
\ No newline at end of file
+#endif  // defined(ANGLE_ENABLE_EAGL)
diff --git a/src/libANGLE/renderer/gl/eagl/DisplayEAGL.mm b/src/libANGLE/renderer/gl/eagl/DisplayEAGL.mm
index a795037..d4c2a01 100644
--- a/src/libANGLE/renderer/gl/eagl/DisplayEAGL.mm
+++ b/src/libANGLE/renderer/gl/eagl/DisplayEAGL.mm
@@ -309,7 +309,6 @@
 {
     outExtensions->iosurfaceClientBuffer = true;
     outExtensions->surfacelessContext    = true;
-    outExtensions->deviceQuery           = true;
 
     // Contexts are virtualized so textures ans semaphores can be shared globally
     outExtensions->displayTextureShareGroup   = true;
diff --git a/src/libANGLE/renderer/gl/eagl/FunctionsEAGL.mm b/src/libANGLE/renderer/gl/eagl/FunctionsEAGL.mm
index 076d072..d7aa344 100644
--- a/src/libANGLE/renderer/gl/eagl/FunctionsEAGL.mm
+++ b/src/libANGLE/renderer/gl/eagl/FunctionsEAGL.mm
@@ -20,4 +20,4 @@
 
 SOFT_LINK_CLASS(OpenGLES, EAGLContext)
 
-#endif  // defined(ANGLE_ENABLE_EAGL)
\ No newline at end of file
+#endif  // defined(ANGLE_ENABLE_EAGL)
diff --git a/src/libANGLE/renderer/gl/eagl/IOSurfaceSurfaceEAGL.mm b/src/libANGLE/renderer/gl/eagl/IOSurfaceSurfaceEAGL.mm
index b80337c..238d920 100644
--- a/src/libANGLE/renderer/gl/eagl/IOSurfaceSurfaceEAGL.mm
+++ b/src/libANGLE/renderer/gl/eagl/IOSurfaceSurfaceEAGL.mm
@@ -83,8 +83,8 @@
       mWidth(0),
       mHeight(0),
       mPlane(0),
-      mRowStrideInPixels(0),
       mFormatIndex(-1),
+      mRowStrideInPixels(0),
       mAlphaInitialized(false)
 {
     // Keep reference to the IOSurface so it doesn't get deleted while the pbuffer exists.
@@ -113,6 +113,7 @@
     mAlphaInitialized = !hasEmulatedAlphaChannel();
 
 #    if defined(ANGLE_PLATFORM_IOS_SIMULATOR)
+    ANGLE_UNUSED_VARIABLE(mEAGLContext);
     mBoundTextureID = 0;
     EGLAttrib usageHint =
         attribs.get(EGL_IOSURFACE_USAGE_HINT_ANGLE,
diff --git a/src/libANGLE/renderer/gl/egl/DisplayEGL.cpp b/src/libANGLE/renderer/gl/egl/DisplayEGL.cpp
index 52e8000..59b455f 100644
--- a/src/libANGLE/renderer/gl/egl/DisplayEGL.cpp
+++ b/src/libANGLE/renderer/gl/egl/DisplayEGL.cpp
@@ -566,12 +566,6 @@
     return true;
 }
 
-DeviceImpl *DisplayEGL::createDevice()
-{
-    UNIMPLEMENTED();
-    return nullptr;
-}
-
 egl::Error DisplayEGL::waitClient(const gl::Context *context)
 {
     UNIMPLEMENTED();
diff --git a/src/libANGLE/renderer/gl/egl/DisplayEGL.h b/src/libANGLE/renderer/gl/egl/DisplayEGL.h
index 972c211..5b0493e 100644
--- a/src/libANGLE/renderer/gl/egl/DisplayEGL.h
+++ b/src/libANGLE/renderer/gl/egl/DisplayEGL.h
@@ -76,8 +76,6 @@
 
     bool isValidNativeWindow(EGLNativeWindowType window) const override;
 
-    DeviceImpl *createDevice() override;
-
     egl::Error waitClient(const gl::Context *context) override;
     egl::Error waitNative(const gl::Context *context, EGLint engine) override;
 
@@ -135,7 +133,7 @@
         EGLSurface surface = EGL_NO_SURFACE;
         EGLContext context = EGL_NO_CONTEXT;
     };
-    std::unordered_map<std::thread::id, CurrentNativeContext> mCurrentNativeContexts;
+    angle::HashMap<std::thread::id, CurrentNativeContext> mCurrentNativeContexts;
 
   private:
     void generateCaps(egl::Caps *outCaps) const override;
diff --git a/src/libANGLE/renderer/gl/egl/FunctionsEGL.cpp b/src/libANGLE/renderer/gl/egl/FunctionsEGL.cpp
index 2d3b12c..1decd38 100644
--- a/src/libANGLE/renderer/gl/egl/FunctionsEGL.cpp
+++ b/src/libANGLE/renderer/gl/egl/FunctionsEGL.cpp
@@ -441,7 +441,7 @@
 }
 
 EGLBoolean FunctionsEGL::swapBuffersWithDamageKHR(EGLSurface surface,
-                                                  EGLint *rects,
+                                                  const EGLint *rects,
                                                   EGLint n_rects) const
 {
     return mFnPtrs->swapBuffersWithDamageKHRPtr(mEGLDisplay, surface, rects, n_rects);
diff --git a/src/libANGLE/renderer/gl/egl/FunctionsEGL.h b/src/libANGLE/renderer/gl/egl/FunctionsEGL.h
index 7daa5eb..dcac40a 100644
--- a/src/libANGLE/renderer/gl/egl/FunctionsEGL.h
+++ b/src/libANGLE/renderer/gl/egl/FunctionsEGL.h
@@ -78,7 +78,9 @@
 
     EGLint waitSyncKHR(EGLSyncKHR sync, EGLint flags) const;
 
-    EGLBoolean swapBuffersWithDamageKHR(EGLSurface surface, EGLint *rects, EGLint n_rects) const;
+    EGLBoolean swapBuffersWithDamageKHR(EGLSurface surface,
+                                        const EGLint *rects,
+                                        EGLint n_rects) const;
 
     EGLBoolean presentationTimeANDROID(EGLSurface surface, EGLnsecsANDROID time) const;
 
diff --git a/src/libANGLE/renderer/gl/egl/SurfaceEGL.cpp b/src/libANGLE/renderer/gl/egl/SurfaceEGL.cpp
index ccd60bb..cf9d0d0 100644
--- a/src/libANGLE/renderer/gl/egl/SurfaceEGL.cpp
+++ b/src/libANGLE/renderer/gl/egl/SurfaceEGL.cpp
@@ -46,7 +46,9 @@
     return egl::NoError();
 }
 
-egl::Error SurfaceEGL::swapWithDamage(const gl::Context *context, EGLint *rects, EGLint n_rects)
+egl::Error SurfaceEGL::swapWithDamage(const gl::Context *context,
+                                      const EGLint *rects,
+                                      EGLint n_rects)
 {
     EGLBoolean success;
     if (mHasSwapBuffersWithDamage)
diff --git a/src/libANGLE/renderer/gl/egl/SurfaceEGL.h b/src/libANGLE/renderer/gl/egl/SurfaceEGL.h
index fc4f02b..3f34ad7 100644
--- a/src/libANGLE/renderer/gl/egl/SurfaceEGL.h
+++ b/src/libANGLE/renderer/gl/egl/SurfaceEGL.h
@@ -25,7 +25,9 @@
 
     egl::Error makeCurrent(const gl::Context *context) override;
     egl::Error swap(const gl::Context *context) override;
-    egl::Error swapWithDamage(const gl::Context *context, EGLint *rects, EGLint n_rects) override;
+    egl::Error swapWithDamage(const gl::Context *context,
+                              const EGLint *rects,
+                              EGLint n_rects) override;
     egl::Error postSubBuffer(const gl::Context *context,
                              EGLint x,
                              EGLint y,
diff --git a/src/libANGLE/renderer/gl/glx/DisplayGLX.cpp b/src/libANGLE/renderer/gl/glx/DisplayGLX.cpp
index 46a50d5..da378ef 100644
--- a/src/libANGLE/renderer/gl/glx/DisplayGLX.cpp
+++ b/src/libANGLE/renderer/gl/glx/DisplayGLX.cpp
@@ -462,7 +462,7 @@
     return new PixmapSurfaceGLX(state, nativePixmap, mGLX.getDisplay(), mGLX, fbConfig);
 }
 
-egl::Error DisplayGLX::validatePixmap(egl::Config *config,
+egl::Error DisplayGLX::validatePixmap(const egl::Config *config,
                                       EGLNativePixmapType pixmap,
                                       const egl::AttributeMap &attributes) const
 {
@@ -495,12 +495,6 @@
     return new ContextGL(state, errorSet, mRenderer, robustnessVideoMemoryPurgeStatus);
 }
 
-DeviceImpl *DisplayGLX::createDevice()
-{
-    UNIMPLEMENTED();
-    return nullptr;
-}
-
 egl::Error DisplayGLX::initializeContext(glx::FBConfig config,
                                          const egl::AttributeMap &eglAttributes,
                                          glx::Context *context)
@@ -902,6 +896,7 @@
     outExtensions->displaySemaphoreShareGroup = true;
 
     outExtensions->surfacelessContext = true;
+    outExtensions->windowFixedSize    = true;
 
     if (!mRenderer->getFeatures().disableSyncControlSupport.enabled)
     {
diff --git a/src/libANGLE/renderer/gl/glx/DisplayGLX.h b/src/libANGLE/renderer/gl/glx/DisplayGLX.h
index b76a4ce..0646c43 100644
--- a/src/libANGLE/renderer/gl/glx/DisplayGLX.h
+++ b/src/libANGLE/renderer/gl/glx/DisplayGLX.h
@@ -53,7 +53,7 @@
                                      NativePixmapType nativePixmap,
                                      const egl::AttributeMap &attribs) override;
 
-    egl::Error validatePixmap(egl::Config *config,
+    egl::Error validatePixmap(const egl::Config *config,
                               EGLNativePixmapType pixmap,
                               const egl::AttributeMap &attributes) const override;
 
@@ -70,8 +70,6 @@
 
     bool isValidNativeWindow(EGLNativeWindowType window) const override;
 
-    DeviceImpl *createDevice() override;
-
     std::string getVendorString() const override;
 
     egl::Error waitClient(const gl::Context *context) override;
@@ -127,7 +125,7 @@
     XVisualInfo *mVisuals;
     glx::Context mContext;
     glx::Context mSharedContext;
-    std::unordered_map<std::thread::id, glx::Context> mCurrentContexts;
+    angle::HashMap<std::thread::id, glx::Context> mCurrentContexts;
     // A pbuffer the context is current on during ANGLE initialization
     glx::Pbuffer mInitPbuffer;
 
diff --git a/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.cpp b/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.cpp
index 11956a7..c19370f 100644
--- a/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.cpp
+++ b/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.cpp
@@ -10,6 +10,7 @@
 
 #include "common/debug.h"
 
+#include "libANGLE/Surface.h"
 #include "libANGLE/renderer/gl/glx/DisplayGLX.h"
 #include "libANGLE/renderer/gl/glx/FunctionsGLX.h"
 
@@ -140,10 +141,13 @@
     mGLXDisplay->setSwapInterval(mGLXWindow, &mSwapControl);
     mGLX.swapBuffers(mGLXWindow);
 
-    egl::Error error = checkForResize();
-    if (error.isError())
+    if (!mState.isFixedSize)
     {
-        return error;
+        egl::Error error = checkForResize();
+        if (error.isError())
+        {
+            return error;
+        }
     }
 
     return egl::NoError();
@@ -235,6 +239,24 @@
     return mGLXWindow;
 }
 
+void WindowSurfaceGLX::setFixedWidth(EGLint width)
+{
+    mParentWidth = width;
+    mGLX.waitGL();
+    XResizeWindow(mDisplay, mWindow, mParentWidth, mParentHeight);
+    mGLX.waitX();
+    XSync(mDisplay, False);
+}
+
+void WindowSurfaceGLX::setFixedHeight(EGLint height)
+{
+    mParentHeight = height;
+    mGLX.waitGL();
+    XResizeWindow(mDisplay, mWindow, mParentWidth, mParentHeight);
+    mGLX.waitX();
+    XSync(mDisplay, False);
+}
+
 bool WindowSurfaceGLX::getWindowDimensions(Window window,
                                            unsigned int *width,
                                            unsigned int *height) const
diff --git a/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.h b/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.h
index ad5fe97..2a1dd77 100644
--- a/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.h
+++ b/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.h
@@ -56,6 +56,9 @@
     egl::Error checkForResize() override;
     glx::Drawable getDrawable() const override;
 
+    void setFixedWidth(EGLint width) override;
+    void setFixedHeight(EGLint height) override;
+
     egl::Error getSyncValues(EGLuint64KHR *ust, EGLuint64KHR *msc, EGLuint64KHR *sbc) override;
     egl::Error getMscRate(EGLint *numerator, EGLint *denominator) override;
 
diff --git a/src/libANGLE/renderer/gl/renderergl_utils.cpp b/src/libANGLE/renderer/gl/renderergl_utils.cpp
index c217cf8..0294718 100644
--- a/src/libANGLE/renderer/gl/renderergl_utils.cpp
+++ b/src/libANGLE/renderer/gl/renderergl_utils.cpp
@@ -1554,6 +1554,11 @@
                                 functions->isAtLeastGLES(gl::Version(3, 2)) ||
                                 functions->hasGLExtension("GL_ARB_gpu_shader5") ||
                                 functions->hasGLESExtension("GL_EXT_gpu_shader5");
+    extensions->shaderIoBlocksOES = functions->isAtLeastGL(gl::Version(3, 2)) ||
+                                    functions->isAtLeastGLES(gl::Version(3, 2)) ||
+                                    functions->hasGLESExtension("GL_OES_shader_io_blocks") ||
+                                    functions->hasGLESExtension("GL_EXT_shader_io_blocks");
+    extensions->shaderIoBlocksEXT = extensions->shaderIoBlocksOES;
 
     extensions->shadowSamplersEXT = functions->isAtLeastGL(gl::Version(2, 0)) ||
                                     functions->isAtLeastGLES(gl::Version(3, 0)) ||
diff --git a/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp b/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp
index a5bf4a9..545b0ac 100644
--- a/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp
+++ b/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp
@@ -472,12 +472,6 @@
     return new ContextWGL(state, errorSet, mRenderer);
 }
 
-DeviceImpl *DisplayWGL::createDevice()
-{
-    UNREACHABLE();
-    return nullptr;
-}
-
 egl::ConfigSet DisplayWGL::generateConfigs()
 {
     egl::ConfigSet configs;
diff --git a/src/libANGLE/renderer/gl/wgl/DisplayWGL.h b/src/libANGLE/renderer/gl/wgl/DisplayWGL.h
index ee19d07..775913f 100644
--- a/src/libANGLE/renderer/gl/wgl/DisplayWGL.h
+++ b/src/libANGLE/renderer/gl/wgl/DisplayWGL.h
@@ -63,8 +63,6 @@
                                     EGLClientBuffer clientBuffer,
                                     const egl::AttributeMap &attribs) const override;
 
-    DeviceImpl *createDevice() override;
-
     std::string getVendorString() const override;
 
     egl::Error waitClient(const gl::Context *context) override;
@@ -120,7 +118,7 @@
         HDC dc     = nullptr;
         HGLRC glrc = nullptr;
     };
-    std::unordered_map<std::thread::id, CurrentNativeContext> mCurrentData;
+    angle::HashMap<std::thread::id, CurrentNativeContext> mCurrentData;
 
     HMODULE mOpenGLModule;
 
diff --git a/src/libANGLE/renderer/glslang_wrapper_utils.cpp b/src/libANGLE/renderer/glslang_wrapper_utils.cpp
index 18b215e..24c556c 100644
--- a/src/libANGLE/renderer/glslang_wrapper_utils.cpp
+++ b/src/libANGLE/renderer/glslang_wrapper_utils.cpp
@@ -50,6 +50,11 @@
                                                  \
     } while (0)
 
+// Enable this for debug logging of pre-transform SPIR-V:
+#if !defined(ANGLE_DEBUG_SPIRV_TRANSFORMER)
+#    define ANGLE_DEBUG_SPIRV_TRANSFORMER 0
+#endif  // !defined(ANGLE_DEBUG_SPIRV_TRANSFORMER)
+
 namespace rx
 {
 namespace
@@ -258,6 +263,17 @@
     return info;
 }
 
+// Add location information for an in/out variable
+void AddVaryingLocationInfo(ShaderInterfaceVariableInfoMap &infoMap,
+                            const gl::VaryingInShaderRef &ref,
+                            const bool isStructField,
+                            const uint32_t location,
+                            const uint32_t component)
+{
+    const std::string &name = isStructField ? ref.parentStructMappedName : ref.varying->mappedName;
+    AddLocationInfo(&infoMap, name, location, component, ref.stage, 0, 0);
+}
+
 // Modify an existing out variable and add transform feedback information.
 ShaderInterfaceVariableInfo *SetXfbInfo(ShaderInterfaceVariableInfoMap *infoMap,
                                         const std::string &varName,
@@ -425,13 +441,14 @@
 
     // In Vulkan GLSL, struct fields are not allowed to have location assignments.  The varying of a
     // struct type is thus given a location equal to the one assigned to its first field.
-    if (varying.isStructField() && varying.fieldIndex > 0)
+    if (varying.isStructField() && (varying.fieldIndex > 0 || varying.secondaryFieldIndex > 0))
     {
         return false;
     }
 
     // Similarly, assign array varying locations to the assigned location of the first element.
-    if (varyingReg.varyingArrayIndex != 0 || (varying.isArrayElement() && varying.arrayIndex != 0))
+    if (varyingReg.varyingArrayIndex != 0 ||
+        (varying.arrayIndex != GL_INVALID_INDEX && varying.arrayIndex != 0))
     {
         return false;
     }
@@ -449,7 +466,7 @@
 // values for the SPIR-V transformation.
 void GenerateTransformFeedbackExtensionOutputs(const gl::ProgramState &programState,
                                                const gl::ProgramLinkedResources &resources,
-                                               std::string *vertexShader,
+                                               std::string *xfbShaderSource,
                                                uint32_t *locationsUsedForXfbExtensionOut)
 {
     const std::vector<gl::TransformFeedbackVarying> &tfVaryings =
@@ -485,7 +502,7 @@
         }
     }
 
-    *vertexShader = SubstituteTransformFeedbackMarkers(*vertexShader, xfbDecl, xfbOut);
+    *xfbShaderSource = SubstituteTransformFeedbackMarkers(*xfbShaderSource, xfbDecl, xfbOut);
 }
 
 void AssignAttributeLocations(const gl::ProgramExecutable &programExecutable,
@@ -559,6 +576,7 @@
 void AssignVaryingLocations(const GlslangSourceOptions &options,
                             const gl::ProgramExecutable &programExecutable,
                             const gl::ShaderType shaderType,
+                            const gl::ShaderType frontShaderType,
                             GlslangProgramInterfaceInfo *programInterfaceInfo,
                             ShaderMapInterfaceVariableInfoMap *variableInfoMapOut)
 {
@@ -604,19 +622,18 @@
         // being "_ufield".  In such a case, use |parentStructMappedName|.
         if (varying.frontVarying.varying && (varying.frontVarying.stage == shaderType))
         {
-            const std::string &name = varying.isStructField()
-                                          ? varying.frontVarying.parentStructMappedName
-                                          : varying.frontVarying.varying->mappedName;
-            AddLocationInfo(&(*variableInfoMapOut)[varying.frontVarying.stage], name, location,
-                            component, varying.frontVarying.stage, 0, 0);
+            ShaderInterfaceVariableInfoMap &infoMap =
+                (*variableInfoMapOut)[varying.frontVarying.stage];
+            AddVaryingLocationInfo(infoMap, varying.frontVarying, varying.isStructField(), location,
+                                   component);
         }
+
         if (varying.backVarying.varying && (varying.backVarying.stage == shaderType))
         {
-            const std::string &name = varying.isStructField()
-                                          ? varying.backVarying.parentStructMappedName
-                                          : varying.backVarying.varying->mappedName;
-            AddLocationInfo(&(*variableInfoMapOut)[varying.backVarying.stage], name, location,
-                            component, varying.backVarying.stage, 0, 0);
+            ShaderInterfaceVariableInfoMap &infoMap =
+                (*variableInfoMapOut)[varying.backVarying.stage];
+            AddVaryingLocationInfo(infoMap, varying.backVarying, varying.isStructField(), location,
+                                   component);
         }
     }
 
@@ -625,11 +642,7 @@
         programExecutable.getResources().varyingPacking.getInactiveVaryingMappedNames();
     for (const std::string &varyingName : inactiveVaryingMappedNames[shaderType])
     {
-        bool isBuiltin = angle::BeginsWith(varyingName, "gl_");
-        if (isBuiltin)
-        {
-            continue;
-        }
+        ASSERT(!gl::IsBuiltInName(varyingName));
 
         // If name is already in the map, it will automatically have marked all other stages
         // inactive.
@@ -643,6 +656,33 @@
         ShaderInterfaceVariableInfo *info = &(*variableInfoMapOut)[shaderType][varyingName];
         ASSERT(info->location == ShaderInterfaceVariableInfo::kInvalid);
     }
+
+    // Add an entry for active builtins varyings.  This will allow inactive builtins, such as
+    // gl_PointSize, gl_ClipDistance etc to be removed.
+    const gl::ShaderMap<std::vector<std::string>> &activeOutputBuiltIns =
+        programExecutable.getResources().varyingPacking.getActiveOutputBuiltIns();
+    for (const std::string &builtInName : activeOutputBuiltIns[shaderType])
+    {
+        ASSERT(gl::IsBuiltInName(builtInName));
+
+        ShaderInterfaceVariableInfo *info = &(*variableInfoMapOut)[shaderType][builtInName];
+        info->activeStages.set(shaderType);
+        info->varyingIsOutput = true;
+    }
+
+    // If an output builtin is active in the previous stage, assume it's active in the input of the
+    // current stage as well.
+    if (frontShaderType != gl::ShaderType::InvalidEnum)
+    {
+        for (const std::string &builtInName : activeOutputBuiltIns[frontShaderType])
+        {
+            ASSERT(gl::IsBuiltInName(builtInName));
+
+            ShaderInterfaceVariableInfo *info = &(*variableInfoMapOut)[shaderType][builtInName];
+            info->activeStages.set(shaderType);
+            info->varyingIsInput = true;
+        }
+    }
 }
 
 // Calculates XFB layout qualifier arguments for each tranform feedback varying.  Stores calculated
@@ -1064,13 +1104,28 @@
     size_t copyInstruction(const uint32_t *instruction, size_t wordCount);
     uint32_t getNewId();
 
+    // Instruction generators:
+    void writeCopyObject(uint32_t id, uint32_t typeId, uint32_t operandId);
+    void writeCompositeConstruct(uint32_t id,
+                                 uint32_t typeId,
+                                 const angle::FixedVector<uint32_t, 4> &constituents);
+    void writeCompositeExtract(uint32_t id, uint32_t typeId, uint32_t compositeId, uint32_t field);
+    void writeLoad(uint32_t id, uint32_t typeId, uint32_t tempVarId);
+    void writeStore(uint32_t pointerId, uint32_t objectId);
+    void writeTypePointer(uint32_t id, uint32_t storageClass, uint32_t typeId);
+    void writeVariable(uint32_t id, uint32_t typeId, uint32_t storageClass);
+    void writeVectorShuffle(uint32_t id,
+                            uint32_t typeId,
+                            uint32_t vec1Id,
+                            uint32_t vec2Id,
+                            const angle::FixedVector<uint32_t, 4> &fields);
+
     // SPIR-V to transform:
     const std::vector<uint32_t> &mSpirvBlobIn;
     const gl::ShaderType mShaderType;
 
     // Input shader variable info map:
     const ShaderInterfaceVariableInfoMap &mVariableInfoMap;
-    ShaderInterfaceVariableInfo mBuiltinVariableInfo;
 
     // Transformed SPIR-V:
     SpirvBlob *mSpirvBlobOut;
@@ -1083,6 +1138,7 @@
 
     // Shader variable info per id, if id is a shader variable.
     std::vector<const ShaderInterfaceVariableInfo *> mVariableInfoById;
+    ShaderInterfaceVariableInfo mBuiltinVariableInfo;
 };
 
 void SpirvTransformerBase::onTransformBegin()
@@ -1134,6 +1190,195 @@
     return (*mSpirvBlobOut)[kHeaderIndexIndexBound]++;
 }
 
+void SpirvTransformerBase::writeCopyObject(uint32_t id, uint32_t typeId, uint32_t operandId)
+{
+    // SPIR-V 1.0 Section 3.32 Instructions, OpCopyObject
+    constexpr size_t kTypeIdIndex                 = 1;
+    constexpr size_t kIdIndex                     = 2;
+    constexpr size_t kOperandIdIndex              = 3;
+    constexpr size_t kCopyObjectInstructionLength = 4;
+
+    std::array<uint32_t, kCopyObjectInstructionLength> copyObject = {};
+
+    // Fill the fields.
+    SetSpirvInstructionOp(copyObject.data(), spv::OpCopyObject);
+    SetSpirvInstructionLength(copyObject.data(), kCopyObjectInstructionLength);
+    copyObject[kTypeIdIndex]    = typeId;
+    copyObject[kIdIndex]        = id;
+    copyObject[kOperandIdIndex] = operandId;
+
+    copyInstruction(copyObject.data(), kCopyObjectInstructionLength);
+}
+
+void SpirvTransformerBase::writeCompositeConstruct(
+    uint32_t id,
+    uint32_t typeId,
+    const angle::FixedVector<uint32_t, 4> &constituents)
+{
+    // SPIR-V 1.0 Section 3.32 Instructions, OpCompositeConstruct
+    constexpr size_t kTypeIdIndex                             = 1;
+    constexpr size_t kIdIndex                                 = 2;
+    constexpr size_t kConstituentsIndexStart                  = 3;
+    constexpr size_t kConstituentsMaxCount                    = 4;
+    constexpr size_t kCompositeConstructInstructionBaseLength = 3;
+
+    ASSERT(kConstituentsMaxCount == constituents.max_size());
+    std::array<uint32_t, kCompositeConstructInstructionBaseLength + kConstituentsMaxCount>
+        compositeConstruct = {};
+
+    // Fill the fields.
+    SetSpirvInstructionOp(compositeConstruct.data(), spv::OpCompositeConstruct);
+    SetSpirvInstructionLength(compositeConstruct.data(),
+                              kCompositeConstructInstructionBaseLength + constituents.size());
+    compositeConstruct[kTypeIdIndex] = typeId;
+    compositeConstruct[kIdIndex]     = id;
+
+    for (size_t constituentIndex = 0; constituentIndex < constituents.size(); ++constituentIndex)
+    {
+        compositeConstruct[kConstituentsIndexStart + constituentIndex] =
+            constituents[constituentIndex];
+    }
+
+    copyInstruction(compositeConstruct.data(),
+                    kCompositeConstructInstructionBaseLength + constituents.size());
+}
+
+void SpirvTransformerBase::writeCompositeExtract(uint32_t id,
+                                                 uint32_t typeId,
+                                                 uint32_t compositeId,
+                                                 uint32_t field)
+{
+    // SPIR-V 1.0 Section 3.32 Instructions, OpCompositeExtract
+    constexpr size_t kTypeIdIndex                       = 1;
+    constexpr size_t kIdIndex                           = 2;
+    constexpr size_t kCompositeIdIndex                  = 3;
+    constexpr size_t kFieldIndex                        = 4;
+    constexpr size_t kCompositeExtractInstructionLength = 5;
+
+    std::array<uint32_t, kCompositeExtractInstructionLength> compositeExtract = {};
+
+    // Fill the fields.
+    SetSpirvInstructionOp(compositeExtract.data(), spv::OpCompositeExtract);
+    SetSpirvInstructionLength(compositeExtract.data(), kCompositeExtractInstructionLength);
+    compositeExtract[kTypeIdIndex]      = typeId;
+    compositeExtract[kIdIndex]          = id;
+    compositeExtract[kCompositeIdIndex] = compositeId;
+    compositeExtract[kFieldIndex]       = field;
+
+    copyInstruction(compositeExtract.data(), kCompositeExtractInstructionLength);
+}
+
+void SpirvTransformerBase::writeLoad(uint32_t pointerId, uint32_t typeId, uint32_t resultId)
+{
+    // SPIR-V 1.0 Section 3.32 Instructions, OpLoad
+    constexpr size_t kResultTypeIndex         = 1;
+    constexpr size_t kResultIdIndex           = 2;
+    constexpr size_t kPointerIdIndex          = 3;
+    constexpr size_t kOpLoadInstructionLength = 4;
+
+    std::array<uint32_t, kOpLoadInstructionLength> load = {};
+
+    SetSpirvInstructionOp(load.data(), spv::OpLoad);
+    SetSpirvInstructionLength(load.data(), kOpLoadInstructionLength);
+    load[kResultTypeIndex] = typeId;
+    load[kResultIdIndex]   = resultId;
+    load[kPointerIdIndex]  = pointerId;
+    copyInstruction(load.data(), kOpLoadInstructionLength);
+}
+
+void SpirvTransformerBase::writeStore(uint32_t pointerId, uint32_t objectId)
+{
+    // SPIR-V 1.0 Section 3.32 Instructions, OpStore
+    constexpr size_t kPointerIdIndex         = 1;
+    constexpr size_t kObjectIdIndex          = 2;
+    constexpr size_t kStoreInstructionLength = 3;
+
+    std::array<uint32_t, kStoreInstructionLength> store = {};
+
+    // Fill the fields.
+    SetSpirvInstructionOp(store.data(), spv::OpStore);
+    SetSpirvInstructionLength(store.data(), kStoreInstructionLength);
+    store[kPointerIdIndex] = pointerId;
+    store[kObjectIdIndex]  = objectId;
+
+    copyInstruction(store.data(), kStoreInstructionLength);
+}
+
+void SpirvTransformerBase::writeTypePointer(uint32_t id, uint32_t storageClass, uint32_t typeId)
+{
+    // SPIR-V 1.0 Section 3.32 Instructions, OpTypePointer
+    constexpr size_t kIdIndex                      = 1;
+    constexpr size_t kStorageClassIndex            = 2;
+    constexpr size_t kTypeIdIndex                  = 3;
+    constexpr size_t kTypePointerInstructionLength = 4;
+
+    std::array<uint32_t, kTypePointerInstructionLength> typePointer = {};
+
+    // Fill the fields.
+    SetSpirvInstructionOp(typePointer.data(), spv::OpTypePointer);
+    SetSpirvInstructionLength(typePointer.data(), kTypePointerInstructionLength);
+    typePointer[kIdIndex]           = id;
+    typePointer[kStorageClassIndex] = storageClass;
+    typePointer[kTypeIdIndex]       = typeId;
+
+    copyInstruction(typePointer.data(), kTypePointerInstructionLength);
+}
+
+void SpirvTransformerBase::writeVariable(uint32_t id, uint32_t typeId, uint32_t storageClass)
+{
+    // SPIR-V 1.0 Section 3.32 Instructions, OpVariable
+    constexpr size_t kTypeIdIndex               = 1;
+    constexpr size_t kIdIndex                   = 2;
+    constexpr size_t kStorageClassIndex         = 3;
+    constexpr size_t kVariableInstructionLength = 4;
+
+    std::array<uint32_t, kVariableInstructionLength> variable = {};
+
+    // Fill the fields.
+    SetSpirvInstructionOp(variable.data(), spv::OpVariable);
+    SetSpirvInstructionLength(variable.data(), kVariableInstructionLength);
+    variable[kTypeIdIndex]       = typeId;
+    variable[kIdIndex]           = id;
+    variable[kStorageClassIndex] = storageClass;
+
+    copyInstruction(variable.data(), kVariableInstructionLength);
+}
+
+void SpirvTransformerBase::writeVectorShuffle(uint32_t id,
+                                              uint32_t typeId,
+                                              uint32_t vec1Id,
+                                              uint32_t vec2Id,
+                                              const angle::FixedVector<uint32_t, 4> &fields)
+{
+    // SPIR-V 1.0 Section 3.32 Instructions, OpVectorShuffle
+    constexpr size_t kTypeIdIndex                        = 1;
+    constexpr size_t kIdIndex                            = 2;
+    constexpr size_t kVec1IdIndex                        = 3;
+    constexpr size_t kVec2IdIndex                        = 4;
+    constexpr size_t kFieldsIndexStart                   = 5;
+    constexpr size_t kFieldsMaxCount                     = 4;
+    constexpr size_t kVectorShuffleInstructionBaseLength = 5;
+
+    ASSERT(kFieldsMaxCount == fields.max_size());
+    std::array<uint32_t, kVectorShuffleInstructionBaseLength + kFieldsMaxCount> vectorShuffle = {};
+
+    // Fill the fields.
+    SetSpirvInstructionOp(vectorShuffle.data(), spv::OpVectorShuffle);
+    SetSpirvInstructionLength(vectorShuffle.data(),
+                              kVectorShuffleInstructionBaseLength + fields.size());
+    vectorShuffle[kTypeIdIndex] = typeId;
+    vectorShuffle[kIdIndex]     = id;
+    vectorShuffle[kVec1IdIndex] = vec1Id;
+    vectorShuffle[kVec2IdIndex] = vec2Id;
+
+    for (size_t fieldIndex = 0; fieldIndex < fields.size(); ++fieldIndex)
+    {
+        vectorShuffle[kFieldsIndexStart + fieldIndex] = fields[fieldIndex];
+    }
+
+    copyInstruction(vectorShuffle.data(), kVectorShuffleInstructionBaseLength + fields.size());
+}
+
 // A SPIR-V transformer.  It walks the instructions and modifies them as necessary, for example to
 // assign bindings or locations.
 class SpirvTransformer final : public SpirvTransformerBase
@@ -1148,7 +1393,9 @@
         : SpirvTransformerBase(spirvBlobIn, variableInfoMap, shaderType, spirvBlobOut),
           mHasTransformFeedbackOutput(false),
           mRemoveEarlyFragmentTestsOptimization(removeEarlyFragmentTestsOptimization),
-          mRemoveDebugInfo(removeDebugInfo)
+          mRemoveDebugInfo(removeDebugInfo),
+          mOutputPerVertex{},
+          mInputPerVertex{}
     {}
 
     bool transform();
@@ -1161,7 +1408,9 @@
     void transformInstruction();
 
     // Instructions that are purely informational:
+    void visitDecorate(const uint32_t *instruction);
     void visitName(const uint32_t *instruction);
+    void visitMemberName(const uint32_t *instruction);
     void visitTypeHelper(const uint32_t *instruction, size_t idIndex, size_t typeIdIndex);
     void visitTypeArray(const uint32_t *instruction);
     void visitTypePointer(const uint32_t *instruction);
@@ -1171,18 +1420,20 @@
     // transformed.  If false is returned, the instruction should be copied as-is.
     bool transformAccessChain(const uint32_t *instruction, size_t wordCount);
     bool transformCapability(const uint32_t *instruction, size_t wordCount);
+    bool transformDebugInfo(const uint32_t *instruction, size_t wordCount);
+    bool transformEmitVertex(const uint32_t *instruction, size_t wordCount);
     bool transformEntryPoint(const uint32_t *instruction, size_t wordCount);
     bool transformDecorate(const uint32_t *instruction, size_t wordCount);
+    bool transformMemberDecorate(const uint32_t *instruction, size_t wordCount);
     bool transformTypePointer(const uint32_t *instruction, size_t wordCount);
+    bool transformTypeStruct(const uint32_t *instruction, size_t wordCount);
     bool transformReturn(const uint32_t *instruction, size_t wordCount);
     bool transformVariable(const uint32_t *instruction, size_t wordCount);
     bool transformExecutionMode(const uint32_t *instruction, size_t wordCount);
 
-    // Any other instructions:
+    // Helpers:
     void writeInputPreamble();
-    void writeOpLoad(uint32_t id, uint32_t typeId, uint32_t tempVarId);
-    void writeOpStore(uint32_t tempVarId, uint32_t destId);
-    void writeOpVariable(uint32_t id, uint32_t typeId, uint32_t storageClassId);
+    void writeOutputPrologue();
 
     // Special flags:
     bool mHasTransformFeedbackOutput;
@@ -1202,6 +1453,12 @@
     // name based on the Storage Class.
     std::vector<const char *> mNamesById;
 
+    // Tracks whether a given type is an I/O block.  I/O blocks are identified by their type name
+    // instead of variable name, but otherwise look like varyings of struct type (which are
+    // identified by their instance name).  To disambiguate them, the `OpDecorate %N Block`
+    // instruction is used which decorates I/O block types.
+    std::vector<bool> mIsIOBlockById;
+
     // Each OpTypePointer instruction that defines a type with the Output storage class is
     // duplicated with a similar instruction but which defines a type with the Private storage
     // class.  If inactive varyings are encountered, its type is changed to the Private one.  The
@@ -1214,6 +1471,18 @@
     std::vector<TransformedIDs> mTypePointerTransformedId;
     std::vector<uint32_t> mFixedVaryingId;
     std::vector<uint32_t> mFixedVaryingTypeId;
+
+    // gl_PerVertex is unique in that it's the only builtin of struct type.  This struct is pruned
+    // by removing trailing inactive members.  We therefore need to keep track of what's its type id
+    // as well as which is the last active member.  Note that intermediate stages, i.e. geometry and
+    // tessellation have two gl_PerVertex declarations, one for input and one for output.
+    struct PerVertexData
+    {
+        uint32_t typeId;
+        uint32_t maxActiveMember;
+    };
+    PerVertexData mOutputPerVertex;
+    PerVertexData mInputPerVertex;
 };
 
 bool SpirvTransformer::transform()
@@ -1241,6 +1510,10 @@
     // variable.
     mNamesById.resize(indexBound, nullptr);
 
+    // Allocate storage for id-to-flag map.  Used to disambiguate I/O blocks instances from varyings
+    // of struct type.
+    mIsIOBlockById.resize(indexBound, false);
+
     // Allocate storage for id-to-info map.  If %i is the id of a name in mVariableInfoMap, index i
     // in this vector will hold a pointer to the ShaderInterfaceVariableInfo object associated with
     // that name in mVariableInfoMap.
@@ -1264,9 +1537,15 @@
 
         switch (opCode)
         {
+            case spv::OpDecorate:
+                visitDecorate(instruction);
+                break;
             case spv::OpName:
                 visitName(instruction);
                 break;
+            case spv::OpMemberName:
+                visitMemberName(instruction);
+                break;
             case spv::OpTypeArray:
                 visitTypeArray(instruction);
                 break;
@@ -1338,6 +1617,9 @@
                 transformed = transformAccessChain(instruction, wordCount);
                 break;
 
+            case spv::OpEmitVertex:
+                transformed = transformEmitVertex(instruction, wordCount);
+                break;
             case spv::OpReturn:
                 transformed = transformReturn(instruction, wordCount);
                 break;
@@ -1359,11 +1641,7 @@
             case spv::OpLine:
             case spv::OpNoLine:
             case spv::OpModuleProcessed:
-                if (mRemoveDebugInfo)
-                {
-                    // Strip debug info to reduce binary size.
-                    transformed = true;
-                }
+                transformed = transformDebugInfo(instruction, wordCount);
                 break;
             case spv::OpCapability:
                 transformed = transformCapability(instruction, wordCount);
@@ -1374,9 +1652,15 @@
             case spv::OpDecorate:
                 transformed = transformDecorate(instruction, wordCount);
                 break;
+            case spv::OpMemberDecorate:
+                transformed = transformMemberDecorate(instruction, wordCount);
+                break;
             case spv::OpTypePointer:
                 transformed = transformTypePointer(instruction, wordCount);
                 break;
+            case spv::OpTypeStruct:
+                transformed = transformTypeStruct(instruction, wordCount);
+                break;
             case spv::OpVariable:
                 transformed = transformVariable(instruction, wordCount);
                 break;
@@ -1405,22 +1689,65 @@
     {
         const ShaderInterfaceVariableInfo *info = mVariableInfoById[id];
         if (info && info->useRelaxedPrecision && info->activeStages[mShaderType] &&
-            !info->varyingIsOutput)
+            info->varyingIsInput)
         {
             // This is an input varying, need to cast the mediump value that came from
             // the previous stage into a highp value that the code wants to work with.
+            ASSERT(mFixedVaryingTypeId[id] != 0);
 
             // Build OpLoad instruction to load the mediump value into a temporary
-            uint32_t tempVar = getNewId();
-            writeOpLoad(mFixedVaryingId[id], mFixedVaryingTypeId[id], tempVar);
+            uint32_t tempVar     = getNewId();
+            uint32_t tempVarType = mTypePointerTransformedId[mFixedVaryingTypeId[id]].typeID;
+            ASSERT(tempVarType != 0);
+
+            writeLoad(mFixedVaryingId[id], tempVarType, tempVar);
 
             // Build OpStore instruction to cast the mediump value to highp for use in
             // the function
-            writeOpStore(tempVar, id);
+            writeStore(id, tempVar);
         }
     }
 }
 
+// Called by transformInstruction to insert necessary instructions for casting varying
+void SpirvTransformer::writeOutputPrologue()
+{
+    for (uint32_t id = 0; id < mVariableInfoById.size(); id++)
+    {
+        const ShaderInterfaceVariableInfo *info = mVariableInfoById[id];
+        if (info && info->useRelaxedPrecision && info->activeStages[mShaderType] &&
+            info->varyingIsOutput)
+        {
+            ASSERT(mFixedVaryingTypeId[id] != 0);
+
+            // Build OpLoad instruction to load the highp value into a temporary
+            uint32_t tempVar     = getNewId();
+            uint32_t tempVarType = mTypePointerTransformedId[mFixedVaryingTypeId[id]].typeID;
+            ASSERT(tempVarType != 0);
+
+            writeLoad(id, tempVarType, tempVar);
+
+            // Build OpStore instruction to cast the highp value to mediump for output
+            writeStore(mFixedVaryingId[id], tempVar);
+        }
+    }
+}
+
+void SpirvTransformer::visitDecorate(const uint32_t *instruction)
+{
+    // SPIR-V 1.0 Section 3.32 Instructions, OpDecorate
+    constexpr size_t kIdIndex         = 1;
+    constexpr size_t kDecorationIndex = 2;
+
+    const uint32_t id   = instruction[kIdIndex];
+    uint32_t decoration = instruction[kDecorationIndex];
+
+    if (decoration == spv::DecorationBlock)
+    {
+        mIsIOBlockById[id] = true;
+    }
+}
+
 void SpirvTransformer::visitName(const uint32_t *instruction)
 {
     // We currently don't have any big-endian devices in the list of supported platforms.  Literal
@@ -1442,6 +1769,63 @@
     mNamesById[id] = name;
 }
 
+void SpirvTransformer::visitMemberName(const uint32_t *instruction)
+{
+    ASSERT(IsLittleEndian());
+
+    // SPIR-V 1.0 Section 3.32 Instructions, OpMemberName
+    constexpr size_t kIdIndex     = 1;
+    constexpr size_t kMemberIndex = 2;
+    constexpr size_t kNameIndex   = 3;
+
+    const uint32_t id     = instruction[kIdIndex];
+    const uint32_t member = instruction[kMemberIndex];
+    const char *name      = reinterpret_cast<const char *>(&instruction[kNameIndex]);
+
+    // The names and ids are unique
+    ASSERT(id < mNamesById.size());
+    ASSERT(mNamesById[id] != nullptr);
+
+    if (strcmp(mNamesById[id], "gl_PerVertex") != 0)
+    {
+        return;
+    }
+
+    auto infoIter = mVariableInfoMap.find(name);
+
+    // Assume output gl_PerVertex is encountered first.  When the storage class of these types are
+    // determined, the variables can be swapped if this assumption was incorrect.
+    if (mOutputPerVertex.typeId == 0 || id == mOutputPerVertex.typeId)
+    {
+        mOutputPerVertex.typeId = id;
+
+        // Keep track of the range of members that are active.
+        const bool isActive =
+            infoIter != mVariableInfoMap.end() && infoIter->second.varyingIsOutput;
+
+        if (isActive && member > mOutputPerVertex.maxActiveMember)
+        {
+            mOutputPerVertex.maxActiveMember = member;
+        }
+    }
+    else if (mInputPerVertex.typeId == 0 || id == mInputPerVertex.typeId)
+    {
+        mInputPerVertex.typeId = id;
+
+        // Keep track of the range of members that are active.
+        const bool isActive = infoIter != mVariableInfoMap.end() && infoIter->second.varyingIsInput;
+
+        if (isActive && member > mInputPerVertex.maxActiveMember)
+        {
+            mInputPerVertex.maxActiveMember = member;
+        }
+    }
+    else
+    {
+        UNREACHABLE();
+    }
+}
+
 void SpirvTransformer::visitTypeHelper(const uint32_t *instruction,
                                        const size_t idIndex,
                                        const size_t typeIdIndex)
@@ -1452,6 +1836,8 @@
     // Every type id is declared only once.
     ASSERT(id < mNamesById.size());
     ASSERT(mNamesById[id] == nullptr);
+    ASSERT(id < mIsIOBlockById.size());
+    ASSERT(!mIsIOBlockById[id]);
 
     // Carry the name forward from the base type.  This is only necessary for interface blocks,
     // as the variable info is associated with the block name instead of the variable name (to
@@ -1459,8 +1845,11 @@
     // type name or the variable name is used to associate with info based on the variable's
     // storage class.
     ASSERT(typeId < mNamesById.size());
-
     mNamesById[id] = mNamesById[typeId];
+
+    // Similarly, carry forward the information regarding whether this type is an I/O block.
+    ASSERT(typeId < mIsIOBlockById.size());
+    mIsIOBlockById[id] = mIsIOBlockById[typeId];
 }
 
 void SpirvTransformer::visitTypeArray(const uint32_t *instruction)
@@ -1475,10 +1864,26 @@
 void SpirvTransformer::visitTypePointer(const uint32_t *instruction)
 {
     // SPIR-V 1.0 Section 3.32 Instructions, OpTypePointer
-    constexpr size_t kIdIndex     = 1;
-    constexpr size_t kTypeIdIndex = 3;
+    constexpr size_t kIdIndex           = 1;
+    constexpr size_t kStorageClassIndex = 2;
+    constexpr size_t kTypeIdIndex       = 3;
 
     visitTypeHelper(instruction, kIdIndex, kTypeIdIndex);
+
+    const uint32_t typeId       = instruction[kTypeIdIndex];
+    const uint32_t storageClass = instruction[kStorageClassIndex];
+
+    // Verify that the ids associated with input and output gl_PerVertex are correct.
+    if (typeId == mOutputPerVertex.typeId || typeId == mInputPerVertex.typeId)
+    {
+        // If assumption about the first gl_PerVertex encountered being Output is wrong, swap the
+        // two ids.
+        if ((typeId == mOutputPerVertex.typeId && storageClass == spv::StorageClassInput) ||
+            (typeId == mInputPerVertex.typeId && storageClass == spv::StorageClassOutput))
+        {
+            std::swap(mOutputPerVertex.typeId, mInputPerVertex.typeId);
+        }
+    }
 }
 
 void SpirvTransformer::visitVariable(const uint32_t *instruction)
@@ -1495,6 +1900,7 @@
 
     ASSERT(typeId < mNamesById.size());
     ASSERT(id < mNamesById.size());
+    ASSERT(typeId < mIsIOBlockById.size());
 
     // If storage class indicates that this is not a shader interface variable, ignore it.
     const bool isInterfaceBlockVariable =
@@ -1514,15 +1920,17 @@
 
     // For interface block variables, the name that's used to associate info is the block name
     // rather than the variable name.
-    const char *name = mNamesById[isInterfaceBlockVariable ? typeId : id];
+    const bool isIOBlock = mIsIOBlockById[typeId];
+    const char *name     = mNamesById[isInterfaceBlockVariable || isIOBlock ? typeId : id];
+
     ASSERT(name != nullptr);
 
     // Handle builtins, which all start with "gl_".  Either the variable name could be an indication
     // of a builtin variable (such as with gl_FragCoord) or the type name (such as with
     // gl_PerVertex).
-    const bool isNameBuiltin = isInOut && angle::BeginsWith(name, "gl_");
+    const bool isNameBuiltin = isInOut && gl::IsBuiltInName(name);
     const bool isTypeBuiltin =
-        isInOut && mNamesById[typeId] != nullptr && angle::BeginsWith(mNamesById[typeId], "gl_");
+        isInOut && mNamesById[typeId] != nullptr && gl::IsBuiltInName(mNamesById[typeId]);
     if (isNameBuiltin || isTypeBuiltin)
     {
         // Make all builtins point to this no-op info.  Adding this entry allows us to ASSERT that
@@ -1691,6 +2099,29 @@
     return true;
 }
 
+bool SpirvTransformer::transformMemberDecorate(const uint32_t *instruction, size_t wordCount)
+{
+    // SPIR-V 1.0 Section 3.32 Instructions, OpMemberDecorate
+    constexpr size_t kTypeIdIndex     = 1;
+    constexpr size_t kMemberIndex     = 2;
+    constexpr size_t kDecorationIndex = 3;
+
+    uint32_t typeId     = instruction[kTypeIdIndex];
+    uint32_t member     = instruction[kMemberIndex];
+    uint32_t decoration = instruction[kDecorationIndex];
+
+    // Transform only OpMemberDecorate %gl_PerVertex N BuiltIn B
+    if ((typeId != mOutputPerVertex.typeId && typeId != mInputPerVertex.typeId) ||
+        decoration != spv::DecorationBuiltIn)
+    {
+        return false;
+    }
+
+    // Drop stripped fields.
+    return typeId == mOutputPerVertex.typeId ? member > mOutputPerVertex.maxActiveMember
+                                             : member > mInputPerVertex.maxActiveMember;
+}
+
 bool SpirvTransformer::transformCapability(const uint32_t *instruction, size_t wordCount)
 {
     if (!mHasTransformFeedbackOutput)
@@ -1733,6 +2164,43 @@
     return true;
 }
 
+bool SpirvTransformer::transformDebugInfo(const uint32_t *instruction, size_t wordCount)
+{
+    if (mRemoveDebugInfo)
+    {
+        // Strip debug info to reduce binary size.
+        return true;
+    }
+
+    // In the case of OpMemberName, unconditionally remove stripped gl_PerVertex members.
+    if (GetSpirvInstructionOp(instruction) == spv::OpMemberName)
+    {
+        // SPIR-V 1.0 Section 3.32 Instructions, OpMemberName
+        constexpr size_t kIdIndex     = 1;
+        constexpr size_t kMemberIndex = 2;
+
+        const uint32_t id     = instruction[kIdIndex];
+        const uint32_t member = instruction[kMemberIndex];
+
+        // Remove the instruction if it's a stripped member of gl_PerVertex.
+        return (id == mOutputPerVertex.typeId && member > mOutputPerVertex.maxActiveMember) ||
+               (id == mInputPerVertex.typeId && member > mInputPerVertex.maxActiveMember);
+    }
+
+    return false;
+}
+
+bool SpirvTransformer::transformEmitVertex(const uint32_t *instruction, size_t wordCount)
+{
+    // This is only possible in geometry shaders.
+    ASSERT(mShaderType == gl::ShaderType::Geometry);
+
+    // Write the temporary variables that hold varyings data before EmitVertex().
+    writeOutputPrologue();
+
+    return false;
+}
+
 bool SpirvTransformer::transformEntryPoint(const uint32_t *instruction, size_t wordCount)
 {
     // Remove inactive varyings from the shader interface declaration.
@@ -1832,7 +2300,7 @@
     // storage class, in case it may be necessary later.
 
     // Cannot create a Private type declaration from builtins such as gl_PerVertex.
-    if (mNamesById[typeId] != nullptr && angle::BeginsWith(mNamesById[typeId], "gl_"))
+    if (mNamesById[typeId] != nullptr && gl::IsBuiltInName(mNamesById[typeId]))
     {
         return false;
     }
@@ -1861,6 +2329,33 @@
     return false;
 }
 
+bool SpirvTransformer::transformTypeStruct(const uint32_t *instruction, size_t wordCount)
+{
+    // SPIR-V 1.0 Section 3.32 Instructions, OpTypeStruct
+    constexpr size_t kIdIndex                         = 1;
+    constexpr size_t kTypeStructInstructionBaseLength = 2;
+
+    const uint32_t id = instruction[kIdIndex];
+
+    if (id != mOutputPerVertex.typeId && id != mInputPerVertex.typeId)
+    {
+        return false;
+    }
+
+    const uint32_t maxMembers = id == mOutputPerVertex.typeId ? mOutputPerVertex.maxActiveMember
+                                                              : mInputPerVertex.maxActiveMember;
+
+    // Change the definition of the gl_PerVertex struct by stripping unused fields at the end.
+    const uint32_t memberCount = maxMembers + 1;
+    const size_t newLength     = kTypeStructInstructionBaseLength + memberCount;
+    ASSERT(wordCount >= newLength);
+
+    const size_t instructionOffset = copyInstruction(instruction, newLength);
+    SetSpirvInstructionLength(&(*mSpirvBlobOut)[instructionOffset], newLength);
+
+    return true;
+}
+
 bool SpirvTransformer::transformReturn(const uint32_t *instruction, size_t wordCount)
 {
     if (mOpFunctionId != mEntryPointId)
@@ -1869,20 +2364,16 @@
         return false;
     }
 
-    for (uint32_t id = 0; id < mVariableInfoById.size(); id++)
+    // For geometry shaders, this operations is done before every EmitVertex() instead.
+    // Additionally, this transformation (which affects output varyings) doesn't apply to fragment
+    // shaders.
+    if (mShaderType == gl::ShaderType::Geometry || mShaderType == gl::ShaderType::Fragment)
     {
-        const ShaderInterfaceVariableInfo *info = mVariableInfoById[id];
-        if (info && info->useRelaxedPrecision && info->activeStages[mShaderType] &&
-            info->varyingIsOutput)
-        {
-            // Build OpLoad instruction to load the highp value into a temporary
-            uint32_t tempVar = getNewId();
-            writeOpLoad(id, mFixedVaryingTypeId[id], tempVar);
-
-            // Build OpStore instruction to cast the highp value to mediump for output
-            writeOpStore(tempVar, mFixedVaryingId[id]);
-        }
+        return false;
     }
+
+    writeOutputPrologue();
+
     return false;
 }
 
@@ -1908,7 +2399,8 @@
 
     // Furthermore, if it's not an inactive varying output, there's nothing to do.  Note that
     // inactive varying inputs are already pruned by the translator.
-    ASSERT(storageClass != spv::StorageClassInput || info->activeStages[mShaderType]);
+    // However, input or output storage class for interface block will not be pruned when a shader
+    // is compiled separately.
     if (info->activeStages[mShaderType])
     {
         if (info->useRelaxedPrecision &&
@@ -1921,15 +2413,16 @@
 
             // Make original variable a private global
             ASSERT(mTypePointerTransformedId[typeId].privateID != 0);
-            writeOpVariable(id, mTypePointerTransformedId[typeId].privateID,
-                            spv::StorageClassPrivate);
+            writeVariable(id, mTypePointerTransformedId[typeId].privateID,
+                          spv::StorageClassPrivate);
 
             return true;
         }
         return false;
     }
 
-    ASSERT(storageClass == spv::StorageClassOutput);
+    // Copy the declaration even though the variable is inactive for the separately compiled shader.
+    ASSERT(storageClass == spv::StorageClassOutput || storageClass == spv::StorageClassInput);
 
     // Copy the variable declaration for modification.  Change its type to the corresponding type
     // with the Private storage class, as well as changing the storage class respecified in this
@@ -1994,56 +2487,6 @@
     return false;
 }
 
-void SpirvTransformer::writeOpStore(uint32_t tempVarId, uint32_t destId)
-{
-    constexpr size_t kIdIndex                  = 1;
-    constexpr size_t kObjectIndex              = 2;
-    constexpr size_t kOpStoreInstructionLength = 3;
-
-    uint32_t opStore[kOpStoreInstructionLength];
-    SetSpirvInstructionOp(opStore, spv::OpStore);
-    SetSpirvInstructionLength(opStore, kOpStoreInstructionLength);
-    opStore[kIdIndex]     = destId;
-    opStore[kObjectIndex] = tempVarId;
-    copyInstruction(opStore, kOpStoreInstructionLength);
-}
-
-void SpirvTransformer::writeOpLoad(uint32_t id, uint32_t typeId, uint32_t tempVarId)
-{
-    constexpr size_t kResultTypeIndex         = 1;
-    constexpr size_t kResultIdIndex           = 2;
-    constexpr size_t kLoadIdIndex             = 3;
-    constexpr size_t kOpLoadInstructionLength = 4;
-
-    // Build OpLoad instruction
-    ASSERT(typeId != 0);
-    ASSERT(mTypePointerTransformedId[typeId].typeID != 0);
-
-    uint32_t opLoad[kOpLoadInstructionLength];
-    SetSpirvInstructionOp(opLoad, spv::OpLoad);
-    SetSpirvInstructionLength(opLoad, kOpLoadInstructionLength);
-    opLoad[kResultTypeIndex] = mTypePointerTransformedId[typeId].typeID;
-    opLoad[kResultIdIndex]   = tempVarId;
-    opLoad[kLoadIdIndex]     = id;
-    copyInstruction(opLoad, kOpLoadInstructionLength);
-}
-
-void SpirvTransformer::writeOpVariable(uint32_t id, uint32_t typeId, uint32_t storageClassId)
-{
-    constexpr size_t kResultTypeIndex             = 1;
-    constexpr size_t kResultIdIndex               = 2;
-    constexpr size_t kStorageClassIdIndex         = 3;
-    constexpr size_t kOpVariableInstructionLength = 4;
-
-    uint32_t opVariable[kOpVariableInstructionLength];
-    SetSpirvInstructionOp(opVariable, spv::OpVariable);
-    SetSpirvInstructionLength(opVariable, kOpVariableInstructionLength);
-    opVariable[kResultTypeIndex]     = typeId;
-    opVariable[kResultIdIndex]       = id;
-    opVariable[kStorageClassIdIndex] = storageClassId;
-    copyInstruction(opVariable, kOpVariableInstructionLength);
-}
-
 struct AliasingAttributeMap
 {
     // The SPIR-V id of the aliasing attribute with the most components.  This attribute will be
@@ -2121,21 +2564,6 @@
                              uint32_t resultId);
     bool transformLoad(const uint32_t *instruction, size_t wordCount);
 
-    // Generated instructions:
-    void writeCopyObject(uint32_t id, uint32_t typeId, uint32_t operandId);
-    void writeCompositeConstruct(uint32_t id,
-                                 uint32_t typeId,
-                                 const angle::FixedVector<uint32_t, 4> &constituents);
-    void writeCompositeExtract(uint32_t id, uint32_t typeId, uint32_t compositeId, uint32_t field);
-    void writeStore(uint32_t pointerId, uint32_t objectId);
-    void writeTypePointer(uint32_t id, uint32_t storageClass, uint32_t typeId);
-    void writeVariable(uint32_t id, uint32_t typeId, uint32_t storageClass);
-    void writeVectorShuffle(uint32_t id,
-                            uint32_t typeId,
-                            uint32_t vec1Id,
-                            uint32_t vec2Id,
-                            const angle::FixedVector<uint32_t, 4> &fields);
-
     void declareExpandedMatrixVectors();
     void writeExpandedMatrixInitialization();
 
@@ -2928,184 +3356,6 @@
     return true;
 }
 
-void SpirvVertexAttributeAliasingTransformer::writeCopyObject(uint32_t id,
-                                                              uint32_t typeId,
-                                                              uint32_t operandId)
-{
-    // SPIR-V 1.0 Section 3.32 Instructions, OpCopyObject
-    constexpr size_t kTypeIdIndex                 = 1;
-    constexpr size_t kIdIndex                     = 2;
-    constexpr size_t kOperandIdIndex              = 3;
-    constexpr size_t kCopyObjectInstructionLength = 4;
-
-    std::array<uint32_t, kCopyObjectInstructionLength> copyObject = {};
-
-    // Fill the fields.
-    SetSpirvInstructionOp(copyObject.data(), spv::OpCopyObject);
-    SetSpirvInstructionLength(copyObject.data(), kCopyObjectInstructionLength);
-    copyObject[kTypeIdIndex]    = typeId;
-    copyObject[kIdIndex]        = id;
-    copyObject[kOperandIdIndex] = operandId;
-
-    copyInstruction(copyObject.data(), kCopyObjectInstructionLength);
-}
-
-void SpirvVertexAttributeAliasingTransformer::writeCompositeConstruct(
-    uint32_t id,
-    uint32_t typeId,
-    const angle::FixedVector<uint32_t, 4> &constituents)
-{
-    // SPIR-V 1.0 Section 3.32 Instructions, OpCompositeConstruct
-    constexpr size_t kTypeIdIndex                             = 1;
-    constexpr size_t kIdIndex                                 = 2;
-    constexpr size_t kConstituentsIndexStart                  = 3;
-    constexpr size_t kConstituentsMaxCount                    = 4;
-    constexpr size_t kCompositeConstructInstructionBaseLength = 3;
-
-    ASSERT(kConstituentsMaxCount == constituents.max_size());
-    std::array<uint32_t, kCompositeConstructInstructionBaseLength + kConstituentsMaxCount>
-        compositeConstruct = {};
-
-    // Fill the fields.
-    SetSpirvInstructionOp(compositeConstruct.data(), spv::OpCompositeConstruct);
-    SetSpirvInstructionLength(compositeConstruct.data(),
-                              kCompositeConstructInstructionBaseLength + constituents.size());
-    compositeConstruct[kTypeIdIndex] = typeId;
-    compositeConstruct[kIdIndex]     = id;
-
-    for (size_t constituentIndex = 0; constituentIndex < constituents.size(); ++constituentIndex)
-    {
-        compositeConstruct[kConstituentsIndexStart + constituentIndex] =
-            constituents[constituentIndex];
-    }
-
-    copyInstruction(compositeConstruct.data(),
-                    kCompositeConstructInstructionBaseLength + constituents.size());
-}
-
-void SpirvVertexAttributeAliasingTransformer::writeCompositeExtract(uint32_t id,
-                                                                    uint32_t typeId,
-                                                                    uint32_t compositeId,
-                                                                    uint32_t field)
-{
-    // SPIR-V 1.0 Section 3.32 Instructions, OpCompositeExtract
-    constexpr size_t kTypeIdIndex                       = 1;
-    constexpr size_t kIdIndex                           = 2;
-    constexpr size_t kCompositeIdIndex                  = 3;
-    constexpr size_t kFieldIndex                        = 4;
-    constexpr size_t kCompositeExtractInstructionLength = 5;
-
-    std::array<uint32_t, kCompositeExtractInstructionLength> compositeExtract = {};
-
-    // Fill the fields.
-    SetSpirvInstructionOp(compositeExtract.data(), spv::OpCompositeExtract);
-    SetSpirvInstructionLength(compositeExtract.data(), kCompositeExtractInstructionLength);
-    compositeExtract[kTypeIdIndex]      = typeId;
-    compositeExtract[kIdIndex]          = id;
-    compositeExtract[kCompositeIdIndex] = compositeId;
-    compositeExtract[kFieldIndex]       = field;
-
-    copyInstruction(compositeExtract.data(), kCompositeExtractInstructionLength);
-}
-
-void SpirvVertexAttributeAliasingTransformer::writeStore(uint32_t pointerId, uint32_t objectId)
-{
-    // SPIR-V 1.0 Section 3.32 Instructions, OpStore
-    constexpr size_t kPointerIdIndex         = 1;
-    constexpr size_t kObjectIdIndex          = 2;
-    constexpr size_t kStoreInstructionLength = 3;
-
-    std::array<uint32_t, kStoreInstructionLength> store = {};
-
-    // Fill the fields.
-    SetSpirvInstructionOp(store.data(), spv::OpStore);
-    SetSpirvInstructionLength(store.data(), kStoreInstructionLength);
-    store[kPointerIdIndex] = pointerId;
-    store[kObjectIdIndex]  = objectId;
-
-    copyInstruction(store.data(), kStoreInstructionLength);
-}
-
-void SpirvVertexAttributeAliasingTransformer::writeTypePointer(uint32_t id,
-                                                               uint32_t storageClass,
-                                                               uint32_t typeId)
-{
-    // SPIR-V 1.0 Section 3.32 Instructions, OpTypePointer
-    constexpr size_t kIdIndex                      = 1;
-    constexpr size_t kStorageClassIndex            = 2;
-    constexpr size_t kTypeIdIndex                  = 3;
-    constexpr size_t kTypePointerInstructionLength = 4;
-
-    std::array<uint32_t, kTypePointerInstructionLength> typePointer = {};
-
-    // Fill the fields.
-    SetSpirvInstructionOp(typePointer.data(), spv::OpTypePointer);
-    SetSpirvInstructionLength(typePointer.data(), kTypePointerInstructionLength);
-    typePointer[kIdIndex]           = id;
-    typePointer[kStorageClassIndex] = storageClass;
-    typePointer[kTypeIdIndex]       = typeId;
-
-    copyInstruction(typePointer.data(), kTypePointerInstructionLength);
-}
-
-void SpirvVertexAttributeAliasingTransformer::writeVariable(uint32_t id,
-                                                            uint32_t typeId,
-                                                            uint32_t storageClass)
-{
-    // SPIR-V 1.0 Section 3.32 Instructions, OpVariable
-    constexpr size_t kTypeIdIndex               = 1;
-    constexpr size_t kIdIndex                   = 2;
-    constexpr size_t kStorageClassIndex         = 3;
-    constexpr size_t kVariableInstructionLength = 4;
-
-    std::array<uint32_t, kVariableInstructionLength> variable = {};
-
-    // Fill the fields.
-    SetSpirvInstructionOp(variable.data(), spv::OpVariable);
-    SetSpirvInstructionLength(variable.data(), kVariableInstructionLength);
-    variable[kTypeIdIndex]       = typeId;
-    variable[kIdIndex]           = id;
-    variable[kStorageClassIndex] = storageClass;
-
-    copyInstruction(variable.data(), kVariableInstructionLength);
-}
-
-void SpirvVertexAttributeAliasingTransformer::writeVectorShuffle(
-    uint32_t id,
-    uint32_t typeId,
-    uint32_t vec1Id,
-    uint32_t vec2Id,
-    const angle::FixedVector<uint32_t, 4> &fields)
-{
-    // SPIR-V 1.0 Section 3.32 Instructions, OpVectorShuffle
-    constexpr size_t kTypeIdIndex                        = 1;
-    constexpr size_t kIdIndex                            = 2;
-    constexpr size_t kVec1IdIndex                        = 3;
-    constexpr size_t kVec2IdIndex                        = 4;
-    constexpr size_t kFieldsIndexStart                   = 5;
-    constexpr size_t kFieldsMaxCount                     = 4;
-    constexpr size_t kVectorShuffleInstructionBaseLength = 5;
-
-    ASSERT(kFieldsMaxCount == fields.max_size());
-    std::array<uint32_t, kVectorShuffleInstructionBaseLength + kFieldsMaxCount> vectorShuffle = {};
-
-    // Fill the fields.
-    SetSpirvInstructionOp(vectorShuffle.data(), spv::OpVectorShuffle);
-    SetSpirvInstructionLength(vectorShuffle.data(),
-                              kVectorShuffleInstructionBaseLength + fields.size());
-    vectorShuffle[kTypeIdIndex] = typeId;
-    vectorShuffle[kIdIndex]     = id;
-    vectorShuffle[kVec1IdIndex] = vec1Id;
-    vectorShuffle[kVec2IdIndex] = vec2Id;
-
-    for (size_t fieldIndex = 0; fieldIndex < fields.size(); ++fieldIndex)
-    {
-        vectorShuffle[kFieldsIndexStart + fieldIndex] = fields[fieldIndex];
-    }
-
-    copyInstruction(vectorShuffle.data(), kVectorShuffleInstructionBaseLength + fields.size());
-}
-
 void SpirvVertexAttributeAliasingTransformer::declareExpandedMatrixVectors()
 {
     // Go through matrix attributes and expand them.
@@ -3387,6 +3637,7 @@
 void GlslangAssignLocations(const GlslangSourceOptions &options,
                             const gl::ProgramExecutable &programExecutable,
                             const gl::ShaderType shaderType,
+                            const gl::ShaderType frontShaderType,
                             GlslangProgramInterfaceInfo *programInterfaceInfo,
                             ShaderMapInterfaceVariableInfoMap *variableInfoMapOut)
 {
@@ -3409,15 +3660,16 @@
     if (!programExecutable.hasLinkedShaderStage(gl::ShaderType::Compute))
     {
         // Assign varying locations.
-        AssignVaryingLocations(options, programExecutable, shaderType, programInterfaceInfo,
-                               variableInfoMapOut);
+        AssignVaryingLocations(options, programExecutable, shaderType, frontShaderType,
+                               programInterfaceInfo, variableInfoMapOut);
 
         if (!programExecutable.getLinkedTransformFeedbackVaryings().empty() &&
-            options.supportsTransformFeedbackExtension && (shaderType == gl::ShaderType::Vertex))
+            options.supportsTransformFeedbackExtension &&
+            (shaderType == programExecutable.getLinkedTransformFeedbackStage()))
         {
             AssignTransformFeedbackExtensionQualifiers(
-                programExecutable, programInterfaceInfo->locationsUsedForXfbExtension,
-                gl::ShaderType::Vertex, &(*variableInfoMapOut)[gl::ShaderType::Vertex]);
+                programExecutable, programInterfaceInfo->locationsUsedForXfbExtension, shaderType,
+                &(*variableInfoMapOut)[shaderType]);
         }
     }
 
@@ -3442,40 +3694,58 @@
         (*shaderSourcesOut)[shaderType] = glShader ? glShader->getTranslatedSource() : "";
     }
 
-    std::string *vertexSource = &(*shaderSourcesOut)[gl::ShaderType::Vertex];
+    gl::ShaderType xfbStage = programState.getAttachedTransformFeedbackStage();
+    std::string *xfbSource  = &(*shaderSourcesOut)[xfbStage];
 
     // Write transform feedback output code.
-    if (!vertexSource->empty())
+    if (!xfbSource->empty())
     {
-        if (programState.getLinkedTransformFeedbackVaryings().empty())
-        {
-            *vertexSource = SubstituteTransformFeedbackMarkers(*vertexSource, "", "");
-        }
-        else
+        if (!programState.getLinkedTransformFeedbackVaryings().empty())
         {
             if (options.supportsTransformFeedbackExtension)
             {
                 GenerateTransformFeedbackExtensionOutputs(
-                    programState, resources, vertexSource,
+                    programState, resources, xfbSource,
                     &programInterfaceInfo->locationsUsedForXfbExtension);
             }
             else if (options.emulateTransformFeedback)
             {
-                GenerateTransformFeedbackEmulationOutputs(
-                    options, programState, programInterfaceInfo, vertexSource,
-                    &(*variableInfoMapOut)[gl::ShaderType::Vertex]);
+                ASSERT(xfbStage == gl::ShaderType::Vertex);
+                GenerateTransformFeedbackEmulationOutputs(options, programState,
+                                                          programInterfaceInfo, xfbSource,
+                                                          &(*variableInfoMapOut)[xfbStage]);
             }
             else
             {
-                *vertexSource = SubstituteTransformFeedbackMarkers(*vertexSource, "", "");
+                *xfbSource = SubstituteTransformFeedbackMarkers(*xfbSource, "", "");
             }
         }
+        else
+        {
+            *xfbSource = SubstituteTransformFeedbackMarkers(*xfbSource, "", "");
+        }
     }
 
+    std::string *tessEvalSources = &(*shaderSourcesOut)[gl::ShaderType::TessEvaluation];
+    if (xfbStage > gl::ShaderType::TessEvaluation && !tessEvalSources->empty())
+    {
+        *tessEvalSources = SubstituteTransformFeedbackMarkers(*tessEvalSources, "", "");
+    }
+
+    std::string *vertexSource = &(*shaderSourcesOut)[gl::ShaderType::Vertex];
+    if (xfbStage > gl::ShaderType::Vertex && !vertexSource->empty())
+    {
+        *vertexSource = SubstituteTransformFeedbackMarkers(*vertexSource, "", "");
+    }
+
+    gl::ShaderType frontShaderType = gl::ShaderType::InvalidEnum;
+
     for (const gl::ShaderType shaderType : programState.getExecutable().getLinkedShaderStages())
     {
-        GlslangAssignLocations(options, programState.getExecutable(), shaderType,
+        GlslangAssignLocations(options, programState.getExecutable(), shaderType, frontShaderType,
                                programInterfaceInfo, variableInfoMapOut);
+
+        frontShaderType = shaderType;
     }
 }
 
@@ -3492,6 +3762,14 @@
         return angle::Result::Continue;
     }
 
+#if defined(ANGLE_DEBUG_SPIRV_TRANSFORMER) && ANGLE_DEBUG_SPIRV_TRANSFORMER
+    spvtools::SpirvTools spirvTools(SPV_ENV_VULKAN_1_1);
+    spirvTools.SetMessageConsumer(ValidateSpirvMessage);
+    std::string readableSpirv;
+    spirvTools.Disassemble(initialSpirvBlob, &readableSpirv, 0);
+    fprintf(stderr, "%s\n", readableSpirv.c_str());
+#endif  // defined(ANGLE_DEBUG_SPIRV_TRANSFORMER) && ANGLE_DEBUG_SPIRV_TRANSFORMER
+
     // Transform the SPIR-V code by assigning location/set/binding values.
     SpirvTransformer transformer(initialSpirvBlob, removeEarlyFragmentTestsOptimization,
                                  removeDebugInfo, variableInfoMap, shaderType, spirvBlobOut);
diff --git a/src/libANGLE/renderer/glslang_wrapper_utils.h b/src/libANGLE/renderer/glslang_wrapper_utils.h
index 2bd2c61..a91a3ff 100644
--- a/src/libANGLE/renderer/glslang_wrapper_utils.h
+++ b/src/libANGLE/renderer/glslang_wrapper_utils.h
@@ -86,7 +86,9 @@
     // mismatch between the shaders. For example, either the VS casts highp->mediump
     // or the FS casts mediump->highp.
     bool useRelaxedPrecision = false;
-    // Indicate if varying is input or output
+    // Indicate if varying is input or output, or both (in case of for example gl_Position in a
+    // geometry shader)
+    bool varyingIsInput  = false;
     bool varyingIsOutput = false;
     // For vertex attributes, this is the number of components / locations.  These are used by the
     // vertex attribute aliasing transformation only.
@@ -96,7 +98,7 @@
 
 // TODO: http://anglebug.com/4524: Need a different hash key than a string, since
 // that's slow to calculate.
-using ShaderInterfaceVariableInfoMap = std::unordered_map<std::string, ShaderInterfaceVariableInfo>;
+using ShaderInterfaceVariableInfoMap    = angle::HashMap<std::string, ShaderInterfaceVariableInfo>;
 using ShaderMapInterfaceVariableInfoMap = gl::ShaderMap<ShaderInterfaceVariableInfoMap>;
 
 void GlslangInitialize();
@@ -120,6 +122,7 @@
 void GlslangAssignLocations(const GlslangSourceOptions &options,
                             const gl::ProgramExecutable &programExecutable,
                             const gl::ShaderType shaderType,
+                            const gl::ShaderType frontShaderType,
                             GlslangProgramInterfaceInfo *programInterfaceInfo,
                             gl::ShaderMap<ShaderInterfaceVariableInfoMap> *variableInfoMapOut);
 
diff --git a/src/libANGLE/renderer/metal/DisplayMtl.h b/src/libANGLE/renderer/metal/DisplayMtl.h
index b00de1b..b49ca4b 100644
--- a/src/libANGLE/renderer/metal/DisplayMtl.h
+++ b/src/libANGLE/renderer/metal/DisplayMtl.h
@@ -48,8 +48,6 @@
 
     std::string getVendorString() const override;
 
-    DeviceImpl *createDevice() override;
-
     egl::Error waitClient(const gl::Context *context) override;
     egl::Error waitNative(const gl::Context *context, EGLint engine) override;
 
diff --git a/src/libANGLE/renderer/metal/DisplayMtl.mm b/src/libANGLE/renderer/metal/DisplayMtl.mm
index 247d76a..ac65c1c 100644
--- a/src/libANGLE/renderer/metal/DisplayMtl.mm
+++ b/src/libANGLE/renderer/metal/DisplayMtl.mm
@@ -24,7 +24,6 @@
 
 namespace rx
 {
-
 bool IsMetalDisplayAvailable()
 {
     // We only support macos 10.13+ and 11 for now. Since they are requirements for Metal 2.0.
@@ -153,12 +152,6 @@
     }
 }
 
-DeviceImpl *DisplayMtl::createDevice()
-{
-    UNIMPLEMENTED();
-    return nullptr;
-}
-
 egl::Error DisplayMtl::waitClient(const gl::Context *context)
 {
     auto contextMtl      = GetImplAs<ContextMtl>(context);
diff --git a/src/libANGLE/renderer/metal/ProgramMtl.mm b/src/libANGLE/renderer/metal/ProgramMtl.mm
index 50e2f63..fb4c448 100644
--- a/src/libANGLE/renderer/metal/ProgramMtl.mm
+++ b/src/libANGLE/renderer/metal/ProgramMtl.mm
@@ -346,7 +346,7 @@
                                   &xfbOnlyShaderCodes[gl::ShaderType::Vertex],
                                   &mMslShaderTranslateInfo, &mMslXfbOnlyVertexShaderInfo));
 
-    for (gl::ShaderType shaderType : gl::AllGLES2ShaderTypes())
+    for (gl::ShaderType shaderType : gl::kAllGLES2ShaderTypes)
     {
         // Create actual Metal shader library
         ANGLE_TRY(createMslShaderLib(contextMtl, shaderType, infoLog,
@@ -373,7 +373,7 @@
     gl::ShaderMap<size_t> requiredBufferSize;
     requiredBufferSize.fill(0);
 
-    for (gl::ShaderType shaderType : gl::AllGLES2ShaderTypes())
+    for (gl::ShaderType shaderType : gl::kAllGLES2ShaderTypes)
     {
         gl::Shader *shader = mState.getAttachedShader(shaderType);
         if (shader)
@@ -406,7 +406,7 @@
 
                 bool found = false;
 
-                for (gl::ShaderType shaderType : gl::AllGLES2ShaderTypes())
+                for (gl::ShaderType shaderType : gl::kAllGLES2ShaderTypes)
                 {
                     auto it = layoutMap[shaderType].find(uniformName);
                     if (it != layoutMap[shaderType].end())
@@ -420,13 +420,13 @@
             }
         }
 
-        for (gl::ShaderType shaderType : gl::AllGLES2ShaderTypes())
+        for (gl::ShaderType shaderType : gl::kAllGLES2ShaderTypes)
         {
             mDefaultUniformBlocks[shaderType].uniformLayout.push_back(layoutInfo[shaderType]);
         }
     }
 
-    for (gl::ShaderType shaderType : gl::AllGLES2ShaderTypes())
+    for (gl::ShaderType shaderType : gl::kAllGLES2ShaderTypes)
     {
         if (requiredBufferSize[shaderType] > 0)
         {
@@ -613,7 +613,7 @@
 
     if (linkedUniform.typeInfo->type == entryPointType)
     {
-        for (gl::ShaderType shaderType : gl::AllGLES2ShaderTypes())
+        for (gl::ShaderType shaderType : gl::kAllGLES2ShaderTypes)
         {
             DefaultUniformBlock &uniformBlock     = mDefaultUniformBlocks[shaderType];
             const sh::BlockMemberInfo &layoutInfo = uniformBlock.uniformLayout[location];
@@ -632,7 +632,7 @@
     }
     else
     {
-        for (gl::ShaderType shaderType : gl::AllGLES2ShaderTypes())
+        for (gl::ShaderType shaderType : gl::kAllGLES2ShaderTypes)
         {
             DefaultUniformBlock &uniformBlock     = mDefaultUniformBlocks[shaderType];
             const sh::BlockMemberInfo &layoutInfo = uniformBlock.uniformLayout[location];
@@ -766,7 +766,7 @@
     const gl::VariableLocation &locationInfo = mState.getUniformLocations()[location];
     const gl::LinkedUniform &linkedUniform   = mState.getUniforms()[locationInfo.index];
 
-    for (gl::ShaderType shaderType : gl::AllGLES2ShaderTypes())
+    for (gl::ShaderType shaderType : gl::kAllGLES2ShaderTypes)
     {
         DefaultUniformBlock &uniformBlock     = mDefaultUniformBlocks[shaderType];
         const sh::BlockMemberInfo &layoutInfo = uniformBlock.uniformLayout[location];
@@ -923,7 +923,7 @@
 
 angle::Result ProgramMtl::commitUniforms(ContextMtl *context, mtl::RenderCommandEncoder *cmdEncoder)
 {
-    for (gl::ShaderType shaderType : gl::AllGLES2ShaderTypes())
+    for (gl::ShaderType shaderType : gl::kAllGLES2ShaderTypes)
     {
         if (!mDefaultUniformBlocksDirty[shaderType] || !mCurrentShaderVariants[shaderType])
         {
@@ -953,7 +953,7 @@
 
     const gl::ActiveTexturesCache &completeTextures = glState.getActiveTexturesCache();
 
-    for (gl::ShaderType shaderType : gl::AllGLES2ShaderTypes())
+    for (gl::ShaderType shaderType : gl::kAllGLES2ShaderTypes)
     {
         if ((!mSamplerBindingsDirty[shaderType] && !forceUpdate) ||
             !mCurrentShaderVariants[shaderType])
@@ -1038,7 +1038,7 @@
 
     const gl::State &glState = context->getState();
 
-    for (gl::ShaderType shaderType : gl::AllGLES2ShaderTypes())
+    for (gl::ShaderType shaderType : gl::kAllGLES2ShaderTypes)
     {
         if (!mCurrentShaderVariants[shaderType])
         {
@@ -1199,12 +1199,12 @@
     [bufferEncoder.metalArgBufferEncoder setArgumentBuffer:argumentBuffer->get()
                                                     offset:argumentBufferOffset];
 
-    static_assert(MTLRenderStageVertex == (0x1 << static_cast<uint32_t>(gl::ShaderType::Vertex)),
-                  "Expected gl ShaderType enum and Metal enum to relative to each other");
-    static_assert(
-        MTLRenderStageFragment == (0x1 << static_cast<uint32_t>(gl::ShaderType::Fragment)),
-        "Expected gl ShaderType enum and Metal enum to relative to each other");
-    auto mtlRenderStage = static_cast<MTLRenderStages>(0x1 << static_cast<uint32_t>(shaderType));
+    constexpr gl::ShaderMap<MTLRenderStages> kShaderStageMap = {
+        {gl::ShaderType::Vertex, mtl::kRenderStageVertex},
+        {gl::ShaderType::Fragment, mtl::kRenderStageFragment},
+    };
+
+    auto mtlRenderStage = kShaderStageMap[shaderType];
 
     for (uint32_t bufferIndex = 0; bufferIndex < blocks.size(); ++bufferIndex)
     {
diff --git a/src/libANGLE/renderer/metal/mtl_format_utils.h b/src/libANGLE/renderer/metal/mtl_format_utils.h
index bbb27d4..d714722 100644
--- a/src/libANGLE/renderer/metal/mtl_format_utils.h
+++ b/src/libANGLE/renderer/metal/mtl_format_utils.h
@@ -162,7 +162,7 @@
     void setCompressedFormatCaps(MTLPixelFormat formatId, bool filterable);
 
     std::array<Format, angle::kNumANGLEFormats> mPixelFormatTable;
-    std::unordered_map<MTLPixelFormat, FormatCaps> mNativePixelFormatCapsTable;
+    angle::HashMap<MTLPixelFormat, FormatCaps> mNativePixelFormatCapsTable;
     // One for tightly packed buffers, one for general cases.
     std::array<VertexFormat, angle::kNumANGLEFormats> mVertexFormatTables[2];
 
diff --git a/src/libANGLE/renderer/metal/mtl_glslang_utils.mm b/src/libANGLE/renderer/metal/mtl_glslang_utils.mm
index caa0e56..2744428 100644
--- a/src/libANGLE/renderer/metal/mtl_glslang_utils.mm
+++ b/src/libANGLE/renderer/metal/mtl_glslang_utils.mm
@@ -31,7 +31,7 @@
 // Original mapping of front end from sampler name to multiple sampler slots (in form of
 // slot:count pair)
 using OriginalSamplerBindingMap =
-    std::unordered_map<std::string, std::vector<std::pair<uint32_t, uint32_t>>>;
+    angle::HashMap<std::string, std::vector<std::pair<uint32_t, uint32_t>>>;
 
 angle::Result HandleError(ErrorHandler *context, GlslangError)
 {
@@ -79,8 +79,8 @@
 void BindBuffers(spirv_cross::CompilerMSL *compiler,
                  const spirv_cross::SmallVector<spirv_cross::Resource> &resources,
                  gl::ShaderType shaderType,
-                 const std::unordered_map<std::string, uint32_t> &uboOriginalBindings,
-                 const std::unordered_map<uint32_t, uint32_t> &xfbOriginalBindings,
+                 const angle::HashMap<std::string, uint32_t> &uboOriginalBindings,
+                 const angle::HashMap<uint32_t, uint32_t> &xfbOriginalBindings,
                  std::array<uint32_t, kMaxGLUBOBindings> *uboBindingsRemapOut,
                  std::array<uint32_t, kMaxShaderXFBs> *xfbBindingRemapOut,
                  bool *uboArgumentBufferUsed)
@@ -275,8 +275,8 @@
     SpirvToMslCompiler(std::vector<uint32_t> &&spriv) : spirv_cross::CompilerMSL(spriv) {}
 
     void compileEx(gl::ShaderType shaderType,
-                   const std::unordered_map<std::string, uint32_t> &uboOriginalBindings,
-                   const std::unordered_map<uint32_t, uint32_t> &xfbOriginalBindings,
+                   const angle::HashMap<std::string, uint32_t> &uboOriginalBindings,
+                   const angle::HashMap<uint32_t, uint32_t> &xfbOriginalBindings,
                    const OriginalSamplerBindingMap &originalSamplerBindings,
                    TranslatedShaderInfo *mslShaderInfoOut)
     {
@@ -350,14 +350,13 @@
     }
 };
 
-angle::Result ConvertSpirvToMsl(
-    Context *context,
-    gl::ShaderType shaderType,
-    const std::unordered_map<std::string, uint32_t> &uboOriginalBindings,
-    const std::unordered_map<uint32_t, uint32_t> &xfbOriginalBindings,
-    const OriginalSamplerBindingMap &originalSamplerBindings,
-    std::vector<uint32_t> *sprivCode,
-    TranslatedShaderInfo *translatedShaderInfoOut)
+angle::Result ConvertSpirvToMsl(Context *context,
+                                gl::ShaderType shaderType,
+                                const angle::HashMap<std::string, uint32_t> &uboOriginalBindings,
+                                const angle::HashMap<uint32_t, uint32_t> &xfbOriginalBindings,
+                                const OriginalSamplerBindingMap &originalSamplerBindings,
+                                std::vector<uint32_t> *sprivCode,
+                                TranslatedShaderInfo *translatedShaderInfoOut)
 {
     if (!sprivCode || sprivCode->empty())
     {
@@ -432,7 +431,8 @@
             &xfbOnlyVariableMaps[gl::ShaderType::Vertex]);
 
         GlslangAssignLocations(options, programState.getExecutable(), gl::ShaderType::Vertex,
-                               &xfbOnlyInterfaceInfo, &xfbOnlyVariableMaps);
+                               gl::ShaderType::InvalidEnum, &xfbOnlyInterfaceInfo,
+                               &xfbOnlyVariableMaps);
         *xfbOnlyVSVariableInfoMapOut = std::move(xfbOnlyVariableMaps[gl::ShaderType::Vertex]);
     }
 }
@@ -478,7 +478,7 @@
                              TranslatedShaderInfo *mslXfbOnlyShaderInfoOut /** nullable */)
 {
     // Retrieve original uniform buffer bindings generated by front end. We will need to do a remap.
-    std::unordered_map<std::string, uint32_t> uboOriginalBindings;
+    angle::HashMap<std::string, uint32_t> uboOriginalBindings;
     const std::vector<gl::InterfaceBlock> &blocks = programState.getUniformBlocks();
     for (uint32_t bufferIdx = 0; bufferIdx < blocks.size(); ++bufferIdx)
     {
@@ -489,7 +489,7 @@
         }
     }
     // Retrieve original XFB buffers bindings produced by front end.
-    std::unordered_map<uint32_t, uint32_t> xfbOriginalBindings;
+    angle::HashMap<uint32_t, uint32_t> xfbOriginalBindings;
     for (uint32_t bufferIdx = 0; bufferIdx < kMaxShaderXFBs; ++bufferIdx)
     {
         std::string bufferName = rx::GetXfbBufferName(bufferIdx);
@@ -515,7 +515,7 @@
     }
 
     // Do the actual translation
-    for (gl::ShaderType shaderType : gl::AllGLES2ShaderTypes())
+    for (gl::ShaderType shaderType : gl::kAllGLES2ShaderTypes)
     {
         std::vector<uint32_t> &sprivCode = spirvShaderCode->at(shaderType);
         ANGLE_TRY(ConvertSpirvToMsl(context, shaderType, uboOriginalBindings, xfbOriginalBindings,
diff --git a/src/libANGLE/renderer/metal/mtl_state_cache.h b/src/libANGLE/renderer/metal/mtl_state_cache.h
index 768c369..2b3677c 100644
--- a/src/libANGLE/renderer/metal/mtl_state_cache.h
+++ b/src/libANGLE/renderer/metal/mtl_state_cache.h
@@ -475,7 +475,7 @@
     bool hasDefaultAttribs(const RenderPipelineDesc &desc) const;
 
     // One table with default attrib and one table without.
-    std::unordered_map<RenderPipelineDesc, AutoObjCPtr<id<MTLRenderPipelineState>>>
+    angle::HashMap<RenderPipelineDesc, AutoObjCPtr<id<MTLRenderPipelineState>>>
         mRenderPipelineStates[2];
 
     RenderPipelineCacheSpecializeShaderFactory *mSpecializedShaderFactory;
@@ -503,8 +503,8 @@
 
   private:
     AutoObjCPtr<id<MTLDepthStencilState>> mNullDepthStencilState = nil;
-    std::unordered_map<DepthStencilDesc, AutoObjCPtr<id<MTLDepthStencilState>>> mDepthStencilStates;
-    std::unordered_map<SamplerDesc, AutoObjCPtr<id<MTLSamplerState>>> mSamplerStates;
+    angle::HashMap<DepthStencilDesc, AutoObjCPtr<id<MTLDepthStencilState>>> mDepthStencilStates;
+    angle::HashMap<SamplerDesc, AutoObjCPtr<id<MTLSamplerState>>> mSamplerStates;
 };
 
 }  // namespace mtl
diff --git a/src/libANGLE/renderer/null/DisplayNULL.cpp b/src/libANGLE/renderer/null/DisplayNULL.cpp
index d22fe35..6650d3c 100644
--- a/src/libANGLE/renderer/null/DisplayNULL.cpp
+++ b/src/libANGLE/renderer/null/DisplayNULL.cpp
@@ -200,7 +200,6 @@
     outExtensions->createContextRobustness            = true;
     outExtensions->postSubBuffer                      = true;
     outExtensions->createContext                      = true;
-    outExtensions->deviceQuery                        = true;
     outExtensions->image                              = true;
     outExtensions->imageBase                          = true;
     outExtensions->glTexture2DImage                   = true;
diff --git a/src/libANGLE/renderer/vulkan/CommandProcessor.cpp b/src/libANGLE/renderer/vulkan/CommandProcessor.cpp
index dc58bf5..4150619 100644
--- a/src/libANGLE/renderer/vulkan/CommandProcessor.cpp
+++ b/src/libANGLE/renderer/vulkan/CommandProcessor.cpp
@@ -432,7 +432,7 @@
 
             ANGLE_TRY(mCommandQueue.queueSubmitOneOff(
                 this, task->getPriority(), task->getOneOffCommandBufferVk(), task->getOneOffFence(),
-                task->getQueueSerial()));
+                SubmitPolicy::EnsureSubmitted, task->getQueueSerial()));
             ANGLE_TRY(mCommandQueue.checkCompletedCommands(this));
             break;
         }
@@ -652,6 +652,7 @@
                                                   egl::ContextPriority contextPriority,
                                                   VkCommandBuffer commandBufferHandle,
                                                   const Fence *fence,
+                                                  SubmitPolicy submitPolicy,
                                                   Serial submitQueueSerial)
 {
     ANGLE_TRY(checkAndPopPendingError(context));
@@ -659,6 +660,12 @@
     CommandProcessorTask task;
     task.initOneOffQueueSubmit(commandBufferHandle, contextPriority, fence, submitQueueSerial);
     queueCommand(std::move(task));
+    if (submitPolicy == SubmitPolicy::EnsureSubmitted)
+    {
+        // Caller has synchronization requirement to have work in GPU pipe when returning from this
+        // function.
+        ANGLE_TRY(waitForWorkComplete(context));
+    }
 
     return angle::Result::Continue;
 }
@@ -1091,6 +1098,7 @@
                                               egl::ContextPriority contextPriority,
                                               VkCommandBuffer commandBufferHandle,
                                               const Fence *fence,
+                                              SubmitPolicy submitPolicy,
                                               Serial submitQueueSerial)
 {
     VkSubmitInfo submitInfo = {};
diff --git a/src/libANGLE/renderer/vulkan/CommandProcessor.h b/src/libANGLE/renderer/vulkan/CommandProcessor.h
index 6b2f891..514aec0 100644
--- a/src/libANGLE/renderer/vulkan/CommandProcessor.h
+++ b/src/libANGLE/renderer/vulkan/CommandProcessor.h
@@ -27,6 +27,12 @@
 
 namespace vk
 {
+enum class SubmitPolicy
+{
+    AllowDeferred,
+    EnsureSubmitted,
+};
+
 class FenceRecycler
 {
   public:
@@ -201,6 +207,7 @@
                                             egl::ContextPriority contextPriority,
                                             VkCommandBuffer commandBufferHandle,
                                             const Fence *fence,
+                                            SubmitPolicy submitPolicy,
                                             Serial submitQueueSerial)  = 0;
     virtual VkResult queuePresent(egl::ContextPriority contextPriority,
                                   const VkPresentInfoKHR &presentInfo) = 0;
@@ -255,6 +262,7 @@
                                     egl::ContextPriority contextPriority,
                                     VkCommandBuffer commandBufferHandle,
                                     const Fence *fence,
+                                    SubmitPolicy submitPolicy,
                                     Serial submitQueueSerial) override;
 
     VkResult queuePresent(egl::ContextPriority contextPriority,
@@ -363,6 +371,7 @@
                                     egl::ContextPriority contextPriority,
                                     VkCommandBuffer commandBufferHandle,
                                     const Fence *fence,
+                                    SubmitPolicy submitPolicy,
                                     Serial submitQueueSerial) override;
     VkResult queuePresent(egl::ContextPriority contextPriority,
                           const VkPresentInfoKHR &presentInfo) override;
diff --git a/src/libANGLE/renderer/vulkan/ContextVk.cpp b/src/libANGLE/renderer/vulkan/ContextVk.cpp
index 625bff1..3bc7bf2 100644
--- a/src/libANGLE/renderer/vulkan/ContextVk.cpp
+++ b/src/libANGLE/renderer/vulkan/ContextVk.cpp
@@ -317,6 +317,13 @@
     mDescriptorImageInfos.clear();
 }
 
+ANGLE_INLINE void ContextVk::onRenderPassFinished()
+{
+    pauseRenderPassQueriesIfActive();
+
+    mRenderPassCommandBuffer = nullptr;
+}
+
 // ContextVk::ScopedDescriptorSetUpdates implementation.
 class ContextVk::ScopedDescriptorSetUpdates final : angle::NonCopyable
 {
@@ -364,12 +371,11 @@
       mCurrentWindowSurface(nullptr),
       mCurrentRotationDrawFramebuffer(SurfaceRotation::Identity),
       mCurrentRotationReadFramebuffer(SurfaceRotation::Identity),
+      mActiveRenderPassQueries{},
       mVertexArray(nullptr),
       mDrawFramebuffer(nullptr),
       mProgram(nullptr),
       mExecutable(nullptr),
-      mActiveQueryAnySamples(nullptr),
-      mActiveQueryAnySamplesConservative(nullptr),
       mLastIndexBufferOffset(0),
       mCurrentDrawElementsType(gl::DrawElementsType::InvalidEnum),
       mXfbBaseVertex(0),
@@ -537,9 +543,7 @@
                                               gl::TextureType type,
                                               gl::Texture **textureOut)
 {
-    // At some point, we'll need to support multisample and we'll pass "this" instead of nullptr
-    // and implement the necessary interface.
-    return mIncompleteTextures.getIncompleteTexture(context, type, nullptr, textureOut);
+    return mIncompleteTextures.getIncompleteTexture(context, type, this, textureOut);
 }
 
 angle::Result ContextVk::initialize()
@@ -560,6 +564,13 @@
                                                                vk::kDefaultTimestampQueryPoolSize));
     }
 
+    if (getFeatures().supportsTransformFeedbackExtension.enabled)
+    {
+        ANGLE_TRY(mQueryPools[gl::QueryType::TransformFeedbackPrimitivesWritten].init(
+            this, VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT,
+            vk::kDefaultTransformFeedbackQueryPoolSize));
+    }
+
     // Init gles to vulkan index type map
     initIndexTypeMap();
 
@@ -602,7 +613,7 @@
     }
 
     mGraphicsPipelineDesc.reset(new vk::GraphicsPipelineDesc());
-    mGraphicsPipelineDesc->initDefaults();
+    mGraphicsPipelineDesc->initDefaults(this);
 
     // Initialize current value/default attribute buffers.
     for (vk::DynamicBuffer &buffer : mDefaultAttribBuffers)
@@ -774,7 +785,9 @@
     DirtyBits dirtyBits = mGraphicsDirtyBits & dirtyBitMask;
 
     if (dirtyBits.none())
+    {
         return angle::Result::Continue;
+    }
 
     // Flush any relevant dirty bits.
     for (size_t dirtyBit : dirtyBits)
@@ -1085,6 +1098,11 @@
     {
         const vk::GraphicsPipelineDesc *descPtr;
 
+        // The desc's specialization constant depends on program's
+        // specConstUsageBits. We need to update it if program has changed.
+        SpecConstUsageBits usageBits = getCurrentProgramSpecConstUsageBits();
+        updateGraphicsPipelineDescWithSpecConstUsageBits(usageBits);
+
         // Draw call shader patching, shader compilation, and pipeline cache query.
         ANGLE_TRY(mExecutable->getGraphicsPipeline(
             this, mCurrentDrawMode, *mGraphicsPipelineDesc,
@@ -1112,7 +1130,7 @@
         mGraphicsPipelineTransition.reset();
     }
 
-    resumeTransformFeedbackIfStarted();
+    pauseTransformFeedbackIfStarted({});
 
     commandBuffer->bindGraphicsPipeline(mCurrentGraphicsPipeline->getPipeline());
     // Update the queue serial for the pipeline object.
@@ -1684,8 +1702,11 @@
         ANGLE_VK_TRY(this, commandBuffer.end());
 
         Serial throwAwaySerial;
+        // vkEvent's are externally synchronized, therefore need work to be submitted before calling
+        // vkGetEventStatus
         ANGLE_TRY(mRenderer->queueSubmitOneOff(this, std::move(commandBuffer), mContextPriority,
-                                               nullptr, &throwAwaySerial));
+                                               nullptr, vk::SubmitPolicy::EnsureSubmitted,
+                                               &throwAwaySerial));
         scratchResourceUseList.releaseResourceUsesAndUpdateSerials(throwAwaySerial);
 
         // Wait for GPU to be ready.  This is a short busy wait.
@@ -1722,13 +1743,14 @@
         // another thread had submitted work.
         ANGLE_TRY(finishToSerial(getLastSubmittedQueueSerial()));
 
-        uint64_t gpuTimestampCycles = 0;
+        vk::QueryResult gpuTimestampCycles(1);
         ANGLE_TRY(timestampQuery.getUint64Result(this, &gpuTimestampCycles));
 
         // Use the first timestamp queried as origin.
         if (mGpuEventTimestampOrigin == 0)
         {
-            mGpuEventTimestampOrigin = gpuTimestampCycles;
+            mGpuEventTimestampOrigin =
+                gpuTimestampCycles.getResult(vk::QueryResult::kDefaultResultIndex);
         }
 
         // Take these CPU and GPU timestamps if there is better confidence.
@@ -1737,7 +1759,7 @@
         {
             tightestRangeS = confidenceRangeS;
             TcpuS          = cpuTimestampS;
-            TgpuCycles     = gpuTimestampCycles;
+            TgpuCycles     = gpuTimestampCycles.getResult(vk::QueryResult::kDefaultResultIndex);
         }
     }
 
@@ -1794,8 +1816,8 @@
         }
 
         // See if the results are available.
-        uint64_t gpuTimestampCycles = 0;
-        bool available              = false;
+        vk::QueryResult gpuTimestampCycles(1);
+        bool available = false;
         ANGLE_TRY(eventQuery.queryHelper.getUint64ResultNonBlocking(this, &gpuTimestampCycles,
                                                                     &available));
         if (!available)
@@ -1806,9 +1828,10 @@
         mGpuEventQueryPool.freeQuery(this, &eventQuery.queryHelper);
 
         GpuEvent gpuEvent;
-        gpuEvent.gpuTimestampCycles = gpuTimestampCycles;
-        gpuEvent.name               = eventQuery.name;
-        gpuEvent.phase              = eventQuery.phase;
+        gpuEvent.gpuTimestampCycles =
+            gpuTimestampCycles.getResult(vk::QueryResult::kDefaultResultIndex);
+        gpuEvent.name  = eventQuery.name;
+        gpuEvent.phase = eventQuery.phase;
 
         mGpuEvents.emplace_back(gpuEvent);
 
@@ -2456,7 +2479,7 @@
     mComputeDirtyBits.set(DIRTY_BIT_EVENT_LOG);
 }
 
-void ContextVk::endEventLog(gl::EntryPoint entryPoint)
+void ContextVk::endEventLog(angle::EntryPoint entryPoint)
 {
     ASSERT(mRenderPassCommands);
     mRenderPassCommands->getCommandBuffer().endDebugUtilsLabelEXT();
@@ -2907,6 +2930,8 @@
                 mDrawFramebuffer->setReadOnlyDepthFeedbackLoopMode(false);
                 updateFlipViewportDrawFramebuffer(glState);
                 updateSurfaceRotationDrawFramebuffer(glState);
+                SpecConstUsageBits usageBits = getCurrentProgramSpecConstUsageBits();
+                updateGraphicsPipelineDescWithSpecConstUsageBits(usageBits);
                 updateViewport(mDrawFramebuffer, glState.getViewport(), glState.getNearPlane(),
                                glState.getFarPlane(), isViewportFlipEnabledForDrawFBO());
                 updateColorMasks(glState.getBlendStateExt());
@@ -3065,7 +3090,17 @@
     updateFlipViewportReadFramebuffer(glState);
     updateSurfaceRotationDrawFramebuffer(glState);
     updateSurfaceRotationReadFramebuffer(glState);
-    invalidateDriverUniforms();
+
+    if (getFeatures().forceDriverUniformOverSpecConst.enabled)
+    {
+        invalidateDriverUniforms();
+    }
+    else
+    {
+        // Force update mGraphicsPipelineDesc
+        mCurrentGraphicsPipeline = nullptr;
+        invalidateCurrentGraphicsPipeline();
+    }
 
     const gl::ProgramExecutable *executable = mState.getProgramExecutable();
     if (executable && executable->hasTransformFeedbackOutput() &&
@@ -3121,22 +3156,46 @@
     mFlipViewportForReadFramebuffer  = readFramebuffer->isDefault();
 }
 
-void ContextVk::updateSurfaceRotationDrawFramebuffer(const gl::State &glState)
+SpecConstUsageBits ContextVk::getCurrentProgramSpecConstUsageBits() const
 {
-    gl::Framebuffer *drawFramebuffer = glState.getDrawFramebuffer();
-    mCurrentRotationDrawFramebuffer =
-        DetermineSurfaceRotation(drawFramebuffer, mCurrentWindowSurface);
-
-    // DetermineSurfaceRotation() does not encode yflip information. Shader code uses
-    // SurfaceRotation specialization constant to determine yflip as well. We add yflip information
-    // to the SurfaceRotation here so the shader does yflip properly.
-    SurfaceRotation rotationAndFlip = mCurrentRotationDrawFramebuffer;
-    if (isViewportFlipEnabledForDrawFBO())
+    SpecConstUsageBits usageBits;
+    if (mState.getProgram())
     {
-        ASSERT(ToUnderlying(rotationAndFlip) < ToUnderlying(SurfaceRotation::FlippedIdentity));
+        usageBits = mState.getProgram()->getState().getSpecConstUsageBits();
+    }
+    else if (mState.getProgramPipeline())
+    {
+        usageBits = mState.getProgramPipeline()->getState().getSpecConstUsageBits();
+    }
+    return usageBits;
+}
+
+void ContextVk::updateGraphicsPipelineDescWithSpecConstUsageBits(SpecConstUsageBits usageBits)
+{
+    SurfaceRotation rotationAndFlip = mCurrentRotationDrawFramebuffer;
+    ASSERT(ToUnderlying(rotationAndFlip) < ToUnderlying(SurfaceRotation::FlippedIdentity));
+    bool yFlipped =
+        isViewportFlipEnabledForDrawFBO() && usageBits.test(sh::vk::SpecConstUsage::YFlip);
+
+    // If program is not using rotation at all, we force it to use the Identity or FlippedIdentity
+    // slot to improve the program cache hit rate
+    if (!usageBits.test(sh::vk::SpecConstUsage::Rotation))
+    {
+        rotationAndFlip = yFlipped ? SurfaceRotation::FlippedIdentity : SurfaceRotation::Identity;
+    }
+    else if (yFlipped)
+    {
+        // DetermineSurfaceRotation() does not encode yflip information. Shader code uses
+        // SurfaceRotation specialization constant to determine yflip as well. We add yflip
+        // information to the SurfaceRotation here so the shader does yflip properly.
         rotationAndFlip = static_cast<SurfaceRotation>(
             ToUnderlying(SurfaceRotation::FlippedIdentity) + ToUnderlying(rotationAndFlip));
     }
+    else
+    {
+        // If program is not using yflip, then we just use the non-flipped slot to increase the
+        // chance of pipeline program cache hit even if drawable is yflipped.
+    }
 
     if (rotationAndFlip != mGraphicsPipelineDesc->getSurfaceRotation())
     {
@@ -3145,6 +3204,26 @@
         // program object will be retrieved.
         mGraphicsPipelineDesc->updateSurfaceRotation(&mGraphicsPipelineTransition, rotationAndFlip);
     }
+
+    if (usageBits.test(sh::vk::SpecConstUsage::DrawableSize))
+    {
+        const gl::Box &dimensions = getState().getDrawFramebuffer()->getDimensions();
+        mGraphicsPipelineDesc->updateDrawableSize(&mGraphicsPipelineTransition, dimensions.width,
+                                                  dimensions.height);
+    }
+    else
+    {
+        // Always set specialization constant to 1x1 if it is not used so that pipeline program with
+        // only drawable size difference will be able to be reused.
+        mGraphicsPipelineDesc->updateDrawableSize(&mGraphicsPipelineTransition, 1, 1);
+    }
+}
+
+void ContextVk::updateSurfaceRotationDrawFramebuffer(const gl::State &glState)
+{
+    gl::Framebuffer *drawFramebuffer = glState.getDrawFramebuffer();
+    mCurrentRotationDrawFramebuffer =
+        DetermineSurfaceRotation(drawFramebuffer, mCurrentWindowSurface);
 }
 
 void ContextVk::updateSurfaceRotationReadFramebuffer(const gl::State &glState)
@@ -3345,6 +3424,9 @@
     invalidateCurrentGraphicsPipeline();
     mGraphicsPipelineDesc->updateRenderPassDesc(&mGraphicsPipelineTransition,
                                                 framebufferVk->getRenderPassDesc());
+    const gl::Box &dimensions = framebufferVk->getState().getDimensions();
+    mGraphicsPipelineDesc->updateDrawableSize(&mGraphicsPipelineTransition, dimensions.width,
+                                              dimensions.height);
 }
 
 void ContextVk::invalidateCurrentTransformFeedbackBuffers()
@@ -3552,8 +3634,17 @@
 {
     ASSERT(queryType == gl::QueryType::AnySamples ||
            queryType == gl::QueryType::AnySamplesConservative ||
+           queryType == gl::QueryType::PrimitivesGenerated ||
+           queryType == gl::QueryType::TransformFeedbackPrimitivesWritten ||
            queryType == gl::QueryType::Timestamp || queryType == gl::QueryType::TimeElapsed);
 
+    // For PrimitivesGenerated queries, use the same pool as TransformFeedbackPrimitivesWritten.
+    // They are served with the same Vulkan query.
+    if (queryType == gl::QueryType::PrimitivesGenerated)
+    {
+        queryType = gl::QueryType::TransformFeedbackPrimitivesWritten;
+    }
+
     // Assert that timestamp extension is available if needed.
     ASSERT(queryType != gl::QueryType::Timestamp && queryType != gl::QueryType::TimeElapsed ||
            mRenderer->getQueueFamilyProperties().timestampValidBits > 0);
@@ -3613,12 +3704,23 @@
     }
 }
 
-ANGLE_INLINE void ContextVk::resumeTransformFeedbackIfStarted()
+void ContextVk::pauseTransformFeedbackIfStartedAndRebindBuffersOnResume()
 {
-    if (mRenderPassCommands->isTransformFeedbackStarted())
+    DirtyBits rebindTransformFeedbackOnResume;
+    rebindTransformFeedbackOnResume.set(DIRTY_BIT_TRANSFORM_FEEDBACK_STATE);
+    pauseTransformFeedbackIfStarted(rebindTransformFeedbackOnResume);
+}
+
+ANGLE_INLINE void ContextVk::pauseTransformFeedbackIfStarted(DirtyBits onResumeOps)
+{
+    // Note that UtilsVk may have already paused transform feedback, so don't pause it again if it's
+    // already paused.
+    if (mRenderPassCommands->isTransformFeedbackStarted() &&
+        !mGraphicsDirtyBits.test(DIRTY_BIT_TRANSFORM_FEEDBACK_RESUME))
     {
         ASSERT(getFeatures().supportsTransformFeedbackExtension.enabled);
         mGraphicsDirtyBits.set(DIRTY_BIT_TRANSFORM_FEEDBACK_RESUME);
+        mGraphicsDirtyBits |= onResumeOps;
         mRenderPassCommands->pauseTransformFeedback();
     }
 }
@@ -4318,7 +4420,8 @@
 
     Serial throwAwaySerial;
     ANGLE_TRY(mRenderer->queueSubmitOneOff(this, std::move(commandBuffer), mContextPriority,
-                                           &fence.get(), &throwAwaySerial));
+                                           &fence.get(), vk::SubmitPolicy::EnsureSubmitted,
+                                           &throwAwaySerial));
 
     // Wait for the submission to finish.  Given no semaphores, there is hope that it would execute
     // in parallel with what's already running on the GPU.
@@ -4326,7 +4429,9 @@
     scratchResourceUseList.releaseResourceUsesAndUpdateSerials(throwAwaySerial);
 
     // Get the query results
-    ANGLE_TRY(timestampQuery.getUint64Result(this, timestampOut));
+    vk::QueryResult result(1);
+    ANGLE_TRY(timestampQuery.getUint64Result(this, &result));
+    *timestampOut = result.getResult(vk::QueryResult::kDefaultResultIndex);
     timestampQueryPool.get().freeQuery(this, &timestampQuery);
 
     // Convert results to nanoseconds.
@@ -4453,7 +4558,7 @@
 
     ANGLE_TRY(mDrawFramebuffer->startNewRenderPass(this, renderArea, &mRenderPassCommandBuffer));
 
-    ANGLE_TRY(resumeOcclusionQueryIfActive());
+    ANGLE_TRY(resumeRenderPassQueriesIfActive());
 
     const gl::DepthStencilState &dsState = mState.getDepthStencilState();
     vk::ResourceAccess depthAccess       = GetDepthAccess(dsState);
@@ -4520,8 +4625,6 @@
         return angle::Result::Continue;
     }
 
-    ANGLE_TRY(pauseOcclusionQueryIfActive());
-
     mCurrentTransformFeedbackBuffers.clear();
     mCurrentIndirectBuffer = nullptr;
 
@@ -4550,7 +4653,7 @@
 
     addOverlayUsedBuffersCount(mRenderPassCommands);
 
-    resumeTransformFeedbackIfStarted();
+    pauseTransformFeedbackIfStartedAndRebindBuffersOnResume();
 
     mRenderPassCommands->endRenderPass(this);
 
@@ -4677,88 +4780,71 @@
     return angle::Result::Continue;
 }
 
-void ContextVk::beginOcclusionQuery(QueryVk *queryVk)
+angle::Result ContextVk::beginRenderPassQuery(QueryVk *queryVk)
 {
-    // To avoid complexity, we always start and end occlusion query inside renderpass. if renderpass
-    // not yet started, we just remember it and defer the start call.
-    if (mRenderPassCommands->started())
+    // To avoid complexity, we always start and end these queries inside the render pass.  If the
+    // render pass has not yet started, the query is deferred until it does.
+    if (mRenderPassCommandBuffer)
     {
-        queryVk->getQueryHelper()->beginOcclusionQuery(this, mRenderPassCommandBuffer);
+        ANGLE_TRY(queryVk->getQueryHelper()->beginRenderPassQuery(this));
     }
-    if (queryVk->isAnySamplesQuery())
-    {
-        ASSERT(mActiveQueryAnySamples == nullptr);
-        mActiveQueryAnySamples = queryVk;
-    }
-    else if (queryVk->isAnySamplesConservativeQuery())
-    {
-        ASSERT(mActiveQueryAnySamplesConservative == nullptr);
-        mActiveQueryAnySamplesConservative = queryVk;
-    }
-    else
-    {
-        UNREACHABLE();
-    }
+
+    gl::QueryType type = queryVk->getType();
+
+    ASSERT(mActiveRenderPassQueries[type] == nullptr);
+    mActiveRenderPassQueries[type] = queryVk;
+
+    return angle::Result::Continue;
 }
 
-void ContextVk::endOcclusionQuery(QueryVk *queryVk)
+void ContextVk::endRenderPassQuery(QueryVk *queryVk)
 {
-    if (mRenderPassCommands->started() && mRenderPassCommandBuffer)
+    if (mRenderPassCommandBuffer)
     {
-        queryVk->getQueryHelper()->endOcclusionQuery(this, mRenderPassCommandBuffer);
+        queryVk->getQueryHelper()->endRenderPassQuery(this);
     }
-    if (queryVk->isAnySamplesQuery())
-    {
-        ASSERT(mActiveQueryAnySamples == queryVk);
-        mActiveQueryAnySamples = nullptr;
-    }
-    else if (queryVk->isAnySamplesConservativeQuery())
-    {
-        ASSERT(mActiveQueryAnySamplesConservative == queryVk);
-        mActiveQueryAnySamplesConservative = nullptr;
-    }
-    else
-    {
-        UNREACHABLE();
-    }
+
+    gl::QueryType type = queryVk->getType();
+
+    ASSERT(mActiveRenderPassQueries[type] == queryVk);
+    mActiveRenderPassQueries[type] = nullptr;
 }
 
-angle::Result ContextVk::pauseOcclusionQueryIfActive()
+void ContextVk::pauseRenderPassQueriesIfActive()
 {
     if (mRenderPassCommandBuffer == nullptr)
     {
-        return angle::Result::Continue;
+        return;
     }
 
-    if (mActiveQueryAnySamples)
+    for (QueryVk *activeQuery : mActiveRenderPassQueries)
     {
-        mActiveQueryAnySamples->getQueryHelper()->endOcclusionQuery(this, mRenderPassCommandBuffer);
-        ANGLE_TRY(mActiveQueryAnySamples->stashQueryHelper(this));
+        if (activeQuery)
+        {
+            activeQuery->onRenderPassEnd(this);
+        }
     }
-    if (mActiveQueryAnySamplesConservative)
+}
+
+angle::Result ContextVk::resumeRenderPassQueriesIfActive()
+{
+    ASSERT(mRenderPassCommandBuffer);
+
+    // Note: these queries should be processed in order.  See comment in QueryVk::onRenderPassStart.
+    for (QueryVk *activeQuery : mActiveRenderPassQueries)
     {
-        mActiveQueryAnySamplesConservative->getQueryHelper()->endOcclusionQuery(
-            this, mRenderPassCommandBuffer);
-        ANGLE_TRY(mActiveQueryAnySamplesConservative->stashQueryHelper(this));
+        if (activeQuery)
+        {
+            ANGLE_TRY(activeQuery->onRenderPassStart(this));
+        }
     }
 
     return angle::Result::Continue;
 }
 
-angle::Result ContextVk::resumeOcclusionQueryIfActive()
+QueryVk *ContextVk::getActiveRenderPassQuery(gl::QueryType queryType) const
 {
-    if (mActiveQueryAnySamples)
-    {
-        mActiveQueryAnySamples->getQueryHelper()->beginOcclusionQuery(this,
-                                                                      mRenderPassCommandBuffer);
-    }
-    if (mActiveQueryAnySamplesConservative)
-    {
-        mActiveQueryAnySamplesConservative->getQueryHelper()->beginOcclusionQuery(
-            this, mRenderPassCommandBuffer);
-    }
-
-    return angle::Result::Continue;
+    return mActiveRenderPassQueries[queryType];
 }
 
 bool ContextVk::isRobustResourceInitEnabled() const
@@ -4835,6 +4921,15 @@
     mGraphicsDirtyBits.set(DIRTY_BIT_DESCRIPTOR_SETS);
 }
 
+angle::Result ContextVk::initializeMultisampleTextureToBlack(const gl::Context *context,
+                                                             gl::Texture *glTexture)
+{
+    ASSERT(glTexture->getType() == gl::TextureType::_2DMultisample);
+    TextureVk *textureVk = vk::GetImpl(glTexture);
+
+    return textureVk->initializeContents(context, gl::ImageIndex::Make2DMultisample());
+}
+
 angle::Result ContextVk::updateRenderPassDepthStencilAccess()
 {
     if (hasStartedRenderPass() && mDrawFramebuffer->getDepthStencilRenderTarget())
diff --git a/src/libANGLE/renderer/vulkan/ContextVk.h b/src/libANGLE/renderer/vulkan/ContextVk.h
index eb1579b..7ca6109 100644
--- a/src/libANGLE/renderer/vulkan/ContextVk.h
+++ b/src/libANGLE/renderer/vulkan/ContextVk.h
@@ -37,7 +37,7 @@
 static constexpr uint32_t kMaxGpuEventNameLen = 32;
 using EventName                               = std::array<char, kMaxGpuEventNameLen>;
 
-class ContextVk : public ContextImpl, public vk::Context
+class ContextVk : public ContextImpl, public vk::Context, public MultisampleTextureInitializer
 {
   public:
     ContextVk(const gl::State &state, gl::ErrorSet *errorSet, RendererVk *renderer);
@@ -196,7 +196,7 @@
 
     // Record GL API calls for debuggers
     void logEvent(const char *eventString);
-    void endEventLog(gl::EntryPoint entryPoint);
+    void endEventLog(angle::EntryPoint entryPoint);
 
     bool isViewportFlipEnabledForDrawFBO() const;
     bool isViewportFlipEnabledForReadFBO() const;
@@ -320,6 +320,7 @@
         const gl::TransformFeedbackBuffersArray<vk::BufferHelper *> &buffers);
     void onEndTransformFeedback();
     angle::Result onPauseTransformFeedback();
+    void pauseTransformFeedbackIfStartedAndRebindBuffersOnResume();
 
     // When UtilsVk issues draw or dispatch calls, it binds descriptor sets that the context is not
     // aware of.  This function is called to make sure affected descriptor set bindings are dirtied
@@ -535,12 +536,14 @@
 
     bool isRobustResourceInitEnabled() const;
 
-    // occlusion query
-    void beginOcclusionQuery(QueryVk *queryVk);
-    void endOcclusionQuery(QueryVk *queryVk);
+    // Queries that begin and end automatically with render pass start and end
+    angle::Result beginRenderPassQuery(QueryVk *queryVk);
+    void endRenderPassQuery(QueryVk *queryVk);
+    void pauseRenderPassQueriesIfActive();
+    angle::Result resumeRenderPassQueriesIfActive();
 
-    angle::Result pauseOcclusionQueryIfActive();
-    angle::Result resumeOcclusionQueryIfActive();
+    // Used by QueryVk to share query helpers between transform feedback queries.
+    QueryVk *getActiveRenderPassQuery(gl::QueryType queryType) const;
 
     void updateOverlayOnPresent();
     void addOverlayUsedBuffersCount(vk::CommandBufferHelper *commandBuffer);
@@ -570,6 +573,10 @@
     // descriptor sets it binds need to be undone.
     void invalidateGraphicsPipelineAndDescriptorSets();
 
+    // Implementation of MultisampleTextureInitializer
+    angle::Result initializeMultisampleTextureToBlack(const gl::Context *context,
+                                                      gl::Texture *glTexture) override;
+
   private:
     // Dirty bits.
     enum DirtyBitType : size_t
@@ -832,7 +839,7 @@
     angle::Result flushOutsideRenderPassCommands();
     void flushDescriptorSetUpdates();
 
-    ANGLE_INLINE void onRenderPassFinished() { mRenderPassCommandBuffer = nullptr; }
+    void onRenderPassFinished();
 
     void initIndexTypeMap();
 
@@ -841,7 +848,7 @@
     void populateTransformFeedbackBufferSet(
         size_t bufferCount,
         const gl::TransformFeedbackBuffersArray<vk::BufferHelper *> &buffers);
-    void resumeTransformFeedbackIfStarted();
+    void pauseTransformFeedbackIfStarted(DirtyBits onResumeOps);
 
     // DescriptorSet writes
     template <typename T, const T *VkWriteDescriptorSet::*pInfo>
@@ -861,6 +868,9 @@
     void updateSampleShadingWithRasterizationSamples(const uint32_t rasterizationSamples);
     void updateRasterizationSamples(const uint32_t rasterizationSamples);
 
+    SpecConstUsageBits getCurrentProgramSpecConstUsageBits() const;
+    void updateGraphicsPipelineDescWithSpecConstUsageBits(SpecConstUsageBits usageBits);
+
     std::array<DirtyBitHandler, DIRTY_BIT_MAX> mGraphicsDirtyBitHandlers;
     std::array<DirtyBitHandler, DIRTY_BIT_MAX> mComputeDirtyBitHandlers;
 
@@ -886,7 +896,13 @@
     // Note that this implementation would need to change in shared resource scenarios. Likely
     // we'd instead share a single set of pools between the share groups.
     angle::PackedEnumMap<PipelineType, vk::DynamicDescriptorPool> mDriverUniformsDescriptorPools;
-    angle::PackedEnumMap<gl::QueryType, vk::DynamicQueryPool> mQueryPools;
+    gl::QueryTypeMap<vk::DynamicQueryPool> mQueryPools;
+
+    // Queries that need to be closed and reopened with the render pass:
+    //
+    // - Occlusion queries
+    // - Transform feedback queries, if not emulated
+    gl::QueryTypeMap<QueryVk *> mActiveRenderPassQueries;
 
     // Dirty bits.
     DirtyBits mGraphicsDirtyBits;
@@ -903,10 +919,6 @@
     ProgramPipelineVk *mProgramPipeline;
     ProgramExecutableVk *mExecutable;
 
-    // occlusion query
-    QueryVk *mActiveQueryAnySamples;
-    QueryVk *mActiveQueryAnySamplesConservative;
-
     // The offset we had the last time we bound the index buffer.
     const GLvoid *mLastIndexBufferOffset;
     gl::DrawElementsType mCurrentDrawElementsType;
diff --git a/src/libANGLE/renderer/vulkan/DebugAnnotatorVk.cpp b/src/libANGLE/renderer/vulkan/DebugAnnotatorVk.cpp
index a715036..cb68dc2 100644
--- a/src/libANGLE/renderer/vulkan/DebugAnnotatorVk.cpp
+++ b/src/libANGLE/renderer/vulkan/DebugAnnotatorVk.cpp
@@ -20,7 +20,7 @@
 DebugAnnotatorVk::~DebugAnnotatorVk() {}
 
 void DebugAnnotatorVk::beginEvent(gl::Context *context,
-                                  gl::EntryPoint entryPoint,
+                                  angle::EntryPoint entryPoint,
                                   const char *eventName,
                                   const char *eventMessage)
 {
@@ -34,7 +34,7 @@
 
 void DebugAnnotatorVk::endEvent(gl::Context *context,
                                 const char *eventName,
-                                gl::EntryPoint entryPoint)
+                                angle::EntryPoint entryPoint)
 {
     angle::LoggingAnnotator::endEvent(context, eventName, entryPoint);
     if (vkCmdBeginDebugUtilsLabelEXT && context && isDrawOrDispatchEntryPoint(entryPoint))
@@ -49,53 +49,53 @@
     return true;
 }
 
-bool DebugAnnotatorVk::isDrawOrDispatchEntryPoint(gl::EntryPoint entryPoint) const
+bool DebugAnnotatorVk::isDrawOrDispatchEntryPoint(angle::EntryPoint entryPoint) const
 {
     switch (entryPoint)
     {
-        case gl::EntryPoint::DispatchCompute:
-        case gl::EntryPoint::DispatchComputeIndirect:
-        case gl::EntryPoint::DrawArrays:
-        case gl::EntryPoint::DrawArraysIndirect:
-        case gl::EntryPoint::DrawArraysInstanced:
-        case gl::EntryPoint::DrawArraysInstancedANGLE:
-        case gl::EntryPoint::DrawArraysInstancedBaseInstance:
-        case gl::EntryPoint::DrawArraysInstancedBaseInstanceANGLE:
-        case gl::EntryPoint::DrawArraysInstancedEXT:
-        case gl::EntryPoint::DrawBuffer:
-        case gl::EntryPoint::DrawBuffers:
-        case gl::EntryPoint::DrawBuffersEXT:
-        case gl::EntryPoint::DrawElements:
-        case gl::EntryPoint::DrawElementsBaseVertex:
-        case gl::EntryPoint::DrawElementsBaseVertexEXT:
-        case gl::EntryPoint::DrawElementsBaseVertexOES:
-        case gl::EntryPoint::DrawElementsIndirect:
-        case gl::EntryPoint::DrawElementsInstanced:
-        case gl::EntryPoint::DrawElementsInstancedANGLE:
-        case gl::EntryPoint::DrawElementsInstancedBaseInstance:
-        case gl::EntryPoint::DrawElementsInstancedBaseVertex:
-        case gl::EntryPoint::DrawElementsInstancedBaseVertexBaseInstance:
-        case gl::EntryPoint::DrawElementsInstancedBaseVertexBaseInstanceANGLE:
-        case gl::EntryPoint::DrawElementsInstancedBaseVertexEXT:
-        case gl::EntryPoint::DrawElementsInstancedBaseVertexOES:
-        case gl::EntryPoint::DrawElementsInstancedEXT:
-        case gl::EntryPoint::DrawPixels:
-        case gl::EntryPoint::DrawRangeElements:
-        case gl::EntryPoint::DrawRangeElementsBaseVertex:
-        case gl::EntryPoint::DrawRangeElementsBaseVertexEXT:
-        case gl::EntryPoint::DrawRangeElementsBaseVertexOES:
-        case gl::EntryPoint::DrawTexfOES:
-        case gl::EntryPoint::DrawTexfvOES:
-        case gl::EntryPoint::DrawTexiOES:
-        case gl::EntryPoint::DrawTexivOES:
-        case gl::EntryPoint::DrawTexsOES:
-        case gl::EntryPoint::DrawTexsvOES:
-        case gl::EntryPoint::DrawTexxOES:
-        case gl::EntryPoint::DrawTexxvOES:
-        case gl::EntryPoint::DrawTransformFeedback:
-        case gl::EntryPoint::DrawTransformFeedbackInstanced:
-        case gl::EntryPoint::DrawTransformFeedbackStream:
-        case gl::EntryPoint::DrawTransformFeedbackStreamInstanced:
+        case angle::EntryPoint::GLDispatchCompute:
+        case angle::EntryPoint::GLDispatchComputeIndirect:
+        case angle::EntryPoint::GLDrawArrays:
+        case angle::EntryPoint::GLDrawArraysIndirect:
+        case angle::EntryPoint::GLDrawArraysInstanced:
+        case angle::EntryPoint::GLDrawArraysInstancedANGLE:
+        case angle::EntryPoint::GLDrawArraysInstancedBaseInstance:
+        case angle::EntryPoint::GLDrawArraysInstancedBaseInstanceANGLE:
+        case angle::EntryPoint::GLDrawArraysInstancedEXT:
+        case angle::EntryPoint::GLDrawBuffer:
+        case angle::EntryPoint::GLDrawBuffers:
+        case angle::EntryPoint::GLDrawBuffersEXT:
+        case angle::EntryPoint::GLDrawElements:
+        case angle::EntryPoint::GLDrawElementsBaseVertex:
+        case angle::EntryPoint::GLDrawElementsBaseVertexEXT:
+        case angle::EntryPoint::GLDrawElementsBaseVertexOES:
+        case angle::EntryPoint::GLDrawElementsIndirect:
+        case angle::EntryPoint::GLDrawElementsInstanced:
+        case angle::EntryPoint::GLDrawElementsInstancedANGLE:
+        case angle::EntryPoint::GLDrawElementsInstancedBaseInstance:
+        case angle::EntryPoint::GLDrawElementsInstancedBaseVertex:
+        case angle::EntryPoint::GLDrawElementsInstancedBaseVertexBaseInstance:
+        case angle::EntryPoint::GLDrawElementsInstancedBaseVertexBaseInstanceANGLE:
+        case angle::EntryPoint::GLDrawElementsInstancedBaseVertexEXT:
+        case angle::EntryPoint::GLDrawElementsInstancedBaseVertexOES:
+        case angle::EntryPoint::GLDrawElementsInstancedEXT:
+        case angle::EntryPoint::GLDrawPixels:
+        case angle::EntryPoint::GLDrawRangeElements:
+        case angle::EntryPoint::GLDrawRangeElementsBaseVertex:
+        case angle::EntryPoint::GLDrawRangeElementsBaseVertexEXT:
+        case angle::EntryPoint::GLDrawRangeElementsBaseVertexOES:
+        case angle::EntryPoint::GLDrawTexfOES:
+        case angle::EntryPoint::GLDrawTexfvOES:
+        case angle::EntryPoint::GLDrawTexiOES:
+        case angle::EntryPoint::GLDrawTexivOES:
+        case angle::EntryPoint::GLDrawTexsOES:
+        case angle::EntryPoint::GLDrawTexsvOES:
+        case angle::EntryPoint::GLDrawTexxOES:
+        case angle::EntryPoint::GLDrawTexxvOES:
+        case angle::EntryPoint::GLDrawTransformFeedback:
+        case angle::EntryPoint::GLDrawTransformFeedbackInstanced:
+        case angle::EntryPoint::GLDrawTransformFeedbackStream:
+        case angle::EntryPoint::GLDrawTransformFeedbackStreamInstanced:
             return true;
         default:
             return false;
diff --git a/src/libANGLE/renderer/vulkan/DebugAnnotatorVk.h b/src/libANGLE/renderer/vulkan/DebugAnnotatorVk.h
index 2d572df..167e4fb 100644
--- a/src/libANGLE/renderer/vulkan/DebugAnnotatorVk.h
+++ b/src/libANGLE/renderer/vulkan/DebugAnnotatorVk.h
@@ -20,14 +20,16 @@
     DebugAnnotatorVk();
     ~DebugAnnotatorVk() override;
     void beginEvent(gl::Context *context,
-                    gl::EntryPoint entryPoint,
+                    angle::EntryPoint entryPoint,
                     const char *eventName,
                     const char *eventMessage) override;
-    void endEvent(gl::Context *context, const char *eventName, gl::EntryPoint entryPoint) override;
+    void endEvent(gl::Context *context,
+                  const char *eventName,
+                  angle::EntryPoint entryPoint) override;
     bool getStatus() override;
 
   private:
-    bool isDrawOrDispatchEntryPoint(gl::EntryPoint entryPoint) const;
+    bool isDrawOrDispatchEntryPoint(angle::EntryPoint entryPoint) const;
 
     // Note: To avoid any race conditions between threads, this class has no private data; all
     // events are stored in ContextVk.
diff --git a/src/libANGLE/renderer/vulkan/DisplayVk.cpp b/src/libANGLE/renderer/vulkan/DisplayVk.cpp
index 0c6739c..6e159c0 100644
--- a/src/libANGLE/renderer/vulkan/DisplayVk.cpp
+++ b/src/libANGLE/renderer/vulkan/DisplayVk.cpp
@@ -85,12 +85,6 @@
     return vendorString;
 }
 
-DeviceImpl *DisplayVk::createDevice()
-{
-    UNIMPLEMENTED();
-    return nullptr;
-}
-
 egl::Error DisplayVk::waitClient(const gl::Context *context)
 {
     ANGLE_TRACE_EVENT0("gpu.angle", "DisplayVk::waitClient");
diff --git a/src/libANGLE/renderer/vulkan/DisplayVk.h b/src/libANGLE/renderer/vulkan/DisplayVk.h
index 46db037..398ad4a 100644
--- a/src/libANGLE/renderer/vulkan/DisplayVk.h
+++ b/src/libANGLE/renderer/vulkan/DisplayVk.h
@@ -64,8 +64,6 @@
 
     std::string getVendorString() const override;
 
-    DeviceImpl *createDevice() override;
-
     egl::Error waitClient(const gl::Context *context) override;
     egl::Error waitNative(const gl::Context *context, EGLint engine) override;
 
diff --git a/src/libANGLE/renderer/vulkan/FramebufferVk.cpp b/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
index 9922b4b..b454264 100644
--- a/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
+++ b/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
@@ -913,9 +913,9 @@
     destArea   = destArea.removeReversal();
 
     // Calculate the stretch factor prior to any clipping, as it needs to remain constant.
-    const float stretch[2] = {
-        std::abs(sourceArea.width / static_cast<float>(destArea.width)),
-        std::abs(sourceArea.height / static_cast<float>(destArea.height)),
+    const double stretch[2] = {
+        std::abs(sourceArea.width / static_cast<double>(destArea.width)),
+        std::abs(sourceArea.height / static_cast<double>(destArea.height)),
     };
 
     // Potentially make adjustments for pre-rotatation.  To handle various cases (e.g. clipping)
@@ -962,11 +962,12 @@
     else
     {
         // Shift dest area's x0,y0,x1,y1 by as much as the source area's got shifted (taking
-        // stretching into account)
-        float x0Shift = std::round((clippedSourceArea.x - absSourceArea.x) / stretch[0]);
-        float y0Shift = std::round((clippedSourceArea.y - absSourceArea.y) / stretch[1]);
-        float x1Shift = std::round((absSourceArea.x1() - clippedSourceArea.x1()) / stretch[0]);
-        float y1Shift = std::round((absSourceArea.y1() - clippedSourceArea.y1()) / stretch[1]);
+        // stretching into account).  Note that double is used as float doesn't have enough
+        // precision near the end of int range.
+        double x0Shift = std::round((clippedSourceArea.x - absSourceArea.x) / stretch[0]);
+        double y0Shift = std::round((clippedSourceArea.y - absSourceArea.y) / stretch[1]);
+        double x1Shift = std::round((absSourceArea.x1() - clippedSourceArea.x1()) / stretch[0]);
+        double y1Shift = std::round((absSourceArea.y1() - clippedSourceArea.y1()) / stretch[1]);
 
         // If the source area was reversed in any direction, the shift should be applied in the
         // opposite direction as well.
@@ -1068,8 +1069,8 @@
     commonParams.destOffset[1]          = destArea.y;
     commonParams.rotatedOffsetFactor[0] = std::abs(sourceArea.width);
     commonParams.rotatedOffsetFactor[1] = std::abs(sourceArea.height);
-    commonParams.stretch[0]             = stretch[0];
-    commonParams.stretch[1]             = stretch[1];
+    commonParams.stretch[0]             = static_cast<float>(stretch[0]);
+    commonParams.stretch[1]             = static_cast<float>(stretch[1]);
     commonParams.srcExtents[0]          = srcFramebufferDimensions.width;
     commonParams.srcExtents[1]          = srcFramebufferDimensions.height;
     commonParams.blitArea               = blitArea;
diff --git a/src/libANGLE/renderer/vulkan/ProgramExecutableVk.cpp b/src/libANGLE/renderer/vulkan/ProgramExecutableVk.cpp
index 69f7a26..e0991f2 100644
--- a/src/libANGLE/renderer/vulkan/ProgramExecutableVk.cpp
+++ b/src/libANGLE/renderer/vulkan/ProgramExecutableVk.cpp
@@ -227,6 +227,7 @@
             info->xfbOffset               = stream->readInt<uint32_t>();
             info->xfbStride               = stream->readInt<uint32_t>();
             info->useRelaxedPrecision     = stream->readBool();
+            info->varyingIsInput          = stream->readBool();
             info->varyingIsOutput         = stream->readBool();
             info->attributeComponentCount = stream->readInt<uint8_t>();
             info->attributeLocationCount  = stream->readInt<uint8_t>();
@@ -254,6 +255,7 @@
             stream->writeInt(it.second.xfbOffset);
             stream->writeInt(it.second.xfbStride);
             stream->writeBool(it.second.useRelaxedPrecision);
+            stream->writeBool(it.second.varyingIsInput);
             stream->writeBool(it.second.varyingIsOutput);
             stream->writeInt(it.second.attributeComponentCount);
             stream->writeInt(it.second.attributeLocationCount);
@@ -288,20 +290,6 @@
     return nullptr;
 }
 
-SpecConstUsageBits ProgramExecutableVk::getSpecConstUsageBits() const
-{
-    if (mProgram)
-    {
-        return mProgram->getState().getSpecConstUsageBits();
-    }
-    else if (mProgramPipeline)
-    {
-        return mProgramPipeline->getState().getSpecConstUsageBits();
-    }
-
-    return SpecConstUsageBits();
-}
-
 // TODO: http://anglebug.com/3570: Move/Copy all of the necessary information into
 // the ProgramExecutable, so this function can be removed.
 void ProgramExecutableVk::fillProgramStateMap(
@@ -677,11 +665,10 @@
     ASSERT(glExecutable && !glExecutable->isCompute());
 
     mTransformOptions.enableLineRasterEmulation = contextVk->isBresenhamEmulationEnabled(mode);
-    mTransformOptions.surfaceRotation           = static_cast<uint8_t>(desc.getSurfaceRotation());
+    mTransformOptions.surfaceRotation           = ToUnderlying(desc.getSurfaceRotation());
 
     // This must be called after mTransformOptions have been set.
     ProgramInfo &programInfo = getGraphicsProgramInfo(mTransformOptions);
-
     for (const gl::ShaderType shaderType : glExecutable->getLinkedShaderStages())
     {
         ProgramVk *programVk = getShaderProgram(glState, shaderType);
@@ -694,6 +681,17 @@
 
     vk::ShaderProgramHelper *shaderProgram = programInfo.getShaderProgram();
     ASSERT(shaderProgram);
+
+    // Drawable size is part of specialization constant, but does not have its own dedicated
+    // programInfo entry. We pick the programInfo entry based on the mTransformOptions and then
+    // update drawable width/height specialization constant. It will go through desc matching and if
+    // spec constant does not match, it will recompile pipeline program.
+    const vk::PackedExtent &dimensions = desc.getDrawableSize();
+    shaderProgram->setSpecializationConstant(sh::vk::SpecializationConstantId::DrawableWidth,
+                                             dimensions.width);
+    shaderProgram->setSpecializationConstant(sh::vk::SpecializationConstantId::DrawableHeight,
+                                             dimensions.height);
+
     ANGLE_TRY(renderer->getPipelineCache(&pipelineCache));
     return shaderProgram->getGraphicsPipeline(
         contextVk, &contextVk->getRenderPassCache(), *pipelineCache, getPipelineLayout(), desc,
@@ -927,7 +925,7 @@
                     // The output is lower precision than the input, adjust the input
                     info = &mVariableInfoMap[mergedVarying.backShaderStage]
                                             [mergedVarying.backShader->mappedName];
-                    info->varyingIsOutput     = false;
+                    info->varyingIsInput      = true;
                     info->useRelaxedPrecision = true;
                 }
             }
@@ -1197,7 +1195,7 @@
     const gl::ActiveTextureArray<TextureVk *> &activeImages = contextVk->getActiveImages();
 
     bool useOldRewriteStructSamplers = contextVk->useOldRewriteStructSamplers();
-    std::unordered_map<std::string, uint32_t> mappedImageNameToArrayOffset;
+    angle::HashMap<std::string, uint32_t> mappedImageNameToArrayOffset;
 
     // Write images.
     for (uint32_t imageIndex = 0; imageIndex < imageBindings.size(); ++imageIndex)
@@ -1453,7 +1451,7 @@
 
     for (const gl::ShaderType shaderType : executable->getLinkedShaderStages())
     {
-        std::unordered_map<std::string, uint32_t> mappedSamplerNameToArrayOffset;
+        angle::HashMap<std::string, uint32_t> mappedSamplerNameToArrayOffset;
         const gl::ProgramState *programState = programStates[shaderType];
         ASSERT(programState);
         for (uint32_t textureIndex = 0; textureIndex < programState->getSamplerBindings().size();
diff --git a/src/libANGLE/renderer/vulkan/ProgramExecutableVk.h b/src/libANGLE/renderer/vulkan/ProgramExecutableVk.h
index 9f3fcc9..3b439a5 100644
--- a/src/libANGLE/renderer/vulkan/ProgramExecutableVk.h
+++ b/src/libANGLE/renderer/vulkan/ProgramExecutableVk.h
@@ -181,8 +181,6 @@
 
     const PerfCounters getObjectPerfCounters() const { return mObjectPerfCounters; }
 
-    SpecConstUsageBits getSpecConstUsageBits() const;
-
   private:
     friend class ProgramVk;
     friend class ProgramPipelineVk;
diff --git a/src/libANGLE/renderer/vulkan/ProgramPipelineVk.cpp b/src/libANGLE/renderer/vulkan/ProgramPipelineVk.cpp
index 95812f0..1611416 100644
--- a/src/libANGLE/renderer/vulkan/ProgramPipelineVk.cpp
+++ b/src/libANGLE/renderer/vulkan/ProgramPipelineVk.cpp
@@ -67,6 +67,7 @@
 
     // Now that the program pipeline has all of the programs attached, the various descriptor
     // set/binding locations need to be re-assigned to their correct values.
+    gl::ShaderType frontShaderType = gl::ShaderType::InvalidEnum;
     for (const gl::ShaderType shaderType : glPipeline->getExecutable().getLinkedShaderStages())
     {
         gl::Program *glProgram =
@@ -82,8 +83,9 @@
                 programProgramInterfaceInfo.locationsUsedForXfbExtension;
 
             GlslangAssignLocations(options, glProgram->getState().getExecutable(), shaderType,
-                                   &glslangProgramInterfaceInfo,
+                                   frontShaderType, &glslangProgramInterfaceInfo,
                                    &mExecutable.getShaderInterfaceVariableInfoMap());
+            frontShaderType = shaderType;
         }
     }
 
diff --git a/src/libANGLE/renderer/vulkan/QueryVk.cpp b/src/libANGLE/renderer/vulkan/QueryVk.cpp
index 38917cb..3d9933a 100644
--- a/src/libANGLE/renderer/vulkan/QueryVk.cpp
+++ b/src/libANGLE/renderer/vulkan/QueryVk.cpp
@@ -19,6 +19,78 @@
 namespace rx
 {
 
+namespace
+{
+struct QueryReleaseHelper
+{
+    void operator()(vk::QueryHelper &&query) { queryPool->freeQuery(contextVk, &query); }
+
+    ContextVk *contextVk;
+    vk::DynamicQueryPool *queryPool;
+};
+
+bool IsRenderPassQuery(ContextVk *contextVk, gl::QueryType type)
+{
+    switch (type)
+    {
+        case gl::QueryType::AnySamples:
+        case gl::QueryType::AnySamplesConservative:
+        case gl::QueryType::PrimitivesGenerated:
+            return true;
+        case gl::QueryType::TransformFeedbackPrimitivesWritten:
+            return contextVk->getFeatures().supportsTransformFeedbackExtension.enabled;
+        default:
+            return false;
+    }
+}
+
+bool IsEmulatedTransformFeedbackQuery(ContextVk *contextVk, gl::QueryType type)
+{
+    return type == gl::QueryType::TransformFeedbackPrimitivesWritten &&
+           contextVk->getFeatures().emulateTransformFeedback.enabled;
+}
+
+QueryVk *GetShareQuery(ContextVk *contextVk, gl::QueryType type)
+{
+    QueryVk *shareQuery = nullptr;
+
+    switch (type)
+    {
+        case gl::QueryType::PrimitivesGenerated:
+            shareQuery = contextVk->getActiveRenderPassQuery(
+                gl::QueryType::TransformFeedbackPrimitivesWritten);
+            break;
+        case gl::QueryType::TransformFeedbackPrimitivesWritten:
+            shareQuery = contextVk->getActiveRenderPassQuery(gl::QueryType::PrimitivesGenerated);
+            break;
+        default:
+            break;
+    }
+
+    return shareQuery;
+}
+
+// When a render pass starts/ends, onRenderPassStart/End  is called for all active queries.  For
+// shared queries, the one that is called first would actually manage the query helper begin/end and
+// allocation, and the one that follows would share it.  PrimitivesGenerated and
+// TransformFeedbackPrimitivesWritten share queries, and the former is processed first.
+QueryVk *GetOnRenderPassStartEndShareQuery(ContextVk *contextVk, gl::QueryType type)
+{
+    static_assert(
+        gl::QueryType::PrimitivesGenerated < gl::QueryType::TransformFeedbackPrimitivesWritten,
+        "incorrect assumption about the order in which queries are started in a render pass");
+
+    if (type != gl::QueryType::TransformFeedbackPrimitivesWritten)
+    {
+        return nullptr;
+    }
+
+    // For TransformFeedbackPrimitivesWritten, return the already-processed PrimitivesGenerated
+    // share query.
+    return contextVk->getActiveRenderPassQuery(gl::QueryType::PrimitivesGenerated);
+}
+}  // anonymous namespace
+
 QueryVk::QueryVk(gl::QueryType type)
     : QueryImpl(type),
       mTransformFeedbackPrimitivesDrawn(0),
@@ -28,37 +100,177 @@
 
 QueryVk::~QueryVk() = default;
 
+angle::Result QueryVk::allocateQuery(ContextVk *contextVk)
+{
+    ASSERT(!mQueryHelper.isReferenced());
+    mQueryHelper.setUnreferenced(new vk::RefCounted<vk::QueryHelper>);
+
+    return contextVk->getQueryPool(mType)->allocateQuery(contextVk, &mQueryHelper.get());
+}
+
+void QueryVk::assignSharedQuery(QueryVk *shareQuery)
+{
+    ASSERT(!mQueryHelper.isReferenced());
+    ASSERT(shareQuery->mQueryHelper.isReferenced());
+    mQueryHelper.copyUnreferenced(shareQuery->mQueryHelper);
+}
+
+void QueryVk::releaseQueries(ContextVk *contextVk)
+{
+    ASSERT(!IsEmulatedTransformFeedbackQuery(contextVk, mType));
+
+    vk::DynamicQueryPool *queryPool = contextVk->getQueryPool(mType);
+
+    // Free the main query
+    if (mQueryHelper.isReferenced())
+    {
+        QueryReleaseHelper releaseHelper = {contextVk, queryPool};
+        mQueryHelper.resetAndRelease(&releaseHelper);
+    }
+    // Free the secondary query used to emulate TimeElapsed
+    queryPool->freeQuery(contextVk, &mQueryHelperTimeElapsedBegin);
+
+    // Free any stashed queries used to support queries that start and stop with the render pass.
+    releaseStashedQueries(contextVk);
+}
+
+void QueryVk::releaseStashedQueries(ContextVk *contextVk)
+{
+    vk::DynamicQueryPool *queryPool = contextVk->getQueryPool(mType);
+
+    for (vk::Shared<vk::QueryHelper> &query : mStashedQueryHelpers)
+    {
+        ASSERT(query.isReferenced());
+
+        QueryReleaseHelper releaseHelper = {contextVk, queryPool};
+        query.resetAndRelease(&releaseHelper);
+    }
+    mStashedQueryHelpers.clear();
+}
+
 void QueryVk::onDestroy(const gl::Context *context)
 {
     ContextVk *contextVk = vk::GetImpl(context);
-    if (getType() != gl::QueryType::TransformFeedbackPrimitivesWritten)
+    if (!IsEmulatedTransformFeedbackQuery(contextVk, mType))
     {
-        vk::DynamicQueryPool *queryPool = contextVk->getQueryPool(getType());
-        queryPool->freeQuery(contextVk, &mQueryHelper);
-        queryPool->freeQuery(contextVk, &mQueryHelperTimeElapsedBegin);
+        releaseQueries(contextVk);
     }
 }
 
-angle::Result QueryVk::stashQueryHelper(ContextVk *contextVk)
+void QueryVk::stashQueryHelper()
 {
-    ASSERT(isOcclusionQuery());
-    mStashedQueryHelpers.emplace_back(std::move(mQueryHelper));
-    mQueryHelper.deinit();
-    ANGLE_TRY(contextVk->getQueryPool(getType())->allocateQuery(contextVk, &mQueryHelper));
+    ASSERT(mQueryHelper.isReferenced());
+    mStashedQueryHelpers.push_back(std::move(mQueryHelper));
+    ASSERT(!mQueryHelper.isReferenced());
+}
+
+angle::Result QueryVk::onRenderPassStart(ContextVk *contextVk)
+{
+    ASSERT(IsRenderPassQuery(contextVk, mType));
+
+    // If there is a query helper already, stash it and allocate a new one for this render pass.
+    if (mQueryHelper.isReferenced())
+    {
+        stashQueryHelper();
+    }
+
+    QueryVk *shareQuery = GetOnRenderPassStartEndShareQuery(contextVk, mType);
+
+    if (shareQuery)
+    {
+        assignSharedQuery(shareQuery);
+
+        // shareQuery has already started the query.
+        return angle::Result::Continue;
+    }
+
+    ANGLE_TRY(allocateQuery(contextVk));
+    return mQueryHelper.get().beginRenderPassQuery(contextVk);
+}
+
+void QueryVk::onRenderPassEnd(ContextVk *contextVk)
+{
+    ASSERT(IsRenderPassQuery(contextVk, mType));
+    ASSERT(mQueryHelper.isReferenced());
+
+    QueryVk *shareQuery = GetOnRenderPassStartEndShareQuery(contextVk, mType);
+
+    // If present, share query has already taken care of ending the query.
+    if (shareQuery == nullptr)
+    {
+        mQueryHelper.get().endRenderPassQuery(contextVk);
+    }
+}
+
+angle::Result QueryVk::accumulateStashedQueryResult(ContextVk *contextVk, vk::QueryResult *result)
+{
+    for (vk::Shared<vk::QueryHelper> &query : mStashedQueryHelpers)
+    {
+        vk::QueryResult v(getQueryResultCount());
+        ANGLE_TRY(query.get().getUint64Result(contextVk, &v));
+        *result += v;
+    }
+    releaseStashedQueries(contextVk);
     return angle::Result::Continue;
 }
 
-angle::Result QueryVk::retrieveStashedQueryResult(ContextVk *contextVk, uint64_t *result)
+angle::Result QueryVk::setupBegin(ContextVk *contextVk)
 {
-    uint64_t total = 0;
-    for (vk::QueryHelper &query : mStashedQueryHelpers)
+    if (IsRenderPassQuery(contextVk, mType))
     {
-        uint64_t v;
-        ANGLE_TRY(query.getUint64Result(contextVk, &v));
-        total += v;
+        // Clean up query helpers from the previous begin/end call on the same query.  Only
+        // necessary for in-render-pass queries.  The other queries can reuse query helpers as they
+        // are able to reset it ouside the render pass where they are recorded.
+        if (mQueryHelper.isReferenced())
+        {
+            releaseQueries(contextVk);
+        }
+
+        // If either of TransformFeedbackPrimitivesWritten or PrimitivesGenerated queries are
+        // already active when the other one is begun, we have to switch to a new query helper (if
+        // in render pass), and have them share the query helper from here on.
+
+        // If this is a transform feedback query, see if the other transform feedback query is
+        // already active.
+        QueryVk *shareQuery = GetShareQuery(contextVk, mType);
+
+        // If so, make the other query stash its results and continue with a new query helper.
+        if (contextVk->hasStartedRenderPass())
+        {
+            if (shareQuery)
+            {
+                // This serves the following scenario (TF = TransformFeedbackPrimitivesWritten, PG =
+                // PrimitivesGenerated):
+                //
+                // - TF starts <-- QueryHelper1 starts
+                // - Draw
+                // - PG starts <-- QueryHelper1 stashed in TF, TF starts QueryHelper2,
+                //                                             PG shares QueryHelper2
+                // - Draw
+                shareQuery->onRenderPassEnd(contextVk);
+                shareQuery->stashQueryHelper();
+                ANGLE_TRY(shareQuery->allocateQuery(contextVk));
+
+                // Share the query helper with the other transform feedback query.  After
+                // |setupBegin()| returns, they query helper is started on behalf of the shared
+                // query.
+                assignSharedQuery(shareQuery);
+            }
+        }
+        else
+        {
+            // Keep the query helper unallocated.  When the render pass starts, a new one
+            // will be allocated / shared.
+            return angle::Result::Continue;
+        }
     }
-    mStashedQueryHelpers.clear();
-    *result = total;
+
+    // If no query helper, create a new one.
+    if (!mQueryHelper.isReferenced())
+    {
+        ANGLE_TRY(allocateQuery(contextVk));
+    }
+
     return angle::Result::Continue;
 }
 
@@ -68,49 +280,41 @@
 
     mCachedResultValid = false;
 
-    // Transform feedback query is a handled by a CPU-calculated value when emulated.
-    if (getType() == gl::QueryType::TransformFeedbackPrimitivesWritten)
+    // Transform feedback query is handled by a CPU-calculated value when emulated.
+    if (IsEmulatedTransformFeedbackQuery(contextVk, mType))
     {
+        ASSERT(!contextVk->getFeatures().supportsTransformFeedbackExtension.enabled);
         mTransformFeedbackPrimitivesDrawn = 0;
-        // We could consider using VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT.
+
         return angle::Result::Continue;
     }
 
-    if (!mQueryHelper.valid())
-    {
-        ANGLE_TRY(contextVk->getQueryPool(getType())->allocateQuery(contextVk, &mQueryHelper));
-    }
+    ANGLE_TRY(setupBegin(contextVk));
 
-    if (isOcclusionQuery())
+    switch (mType)
     {
-        // For pathological usage case where begin/end is called back to back without flush and get
-        // result, we have to force flush so that the same mQueryHelper will not encoded in the same
-        // renderpass twice without resetting it.
-        if (mQueryHelper.usedInRecordedCommands())
-        {
-            ANGLE_TRY(contextVk->flushImpl(nullptr));
-            // As soon as beginQuery is called, previous query's result will not retrievable by API.
-            // We must clear it so that it will not count against current beginQuery call.
-            mStashedQueryHelpers.clear();
-            mQueryHelper.deinit();
-            ANGLE_TRY(contextVk->getQueryPool(getType())->allocateQuery(contextVk, &mQueryHelper));
-        }
-        contextVk->beginOcclusionQuery(this);
-    }
-    else if (getType() == gl::QueryType::TimeElapsed)
-    {
-        // Note: TimeElapsed is implemented by using two Timestamp queries and taking the diff.
-        if (!mQueryHelperTimeElapsedBegin.valid())
-        {
-            ANGLE_TRY(contextVk->getQueryPool(getType())->allocateQuery(
-                contextVk, &mQueryHelperTimeElapsedBegin));
-        }
+        case gl::QueryType::AnySamples:
+        case gl::QueryType::AnySamplesConservative:
+        case gl::QueryType::PrimitivesGenerated:
+        case gl::QueryType::TransformFeedbackPrimitivesWritten:
+            ANGLE_TRY(contextVk->beginRenderPassQuery(this));
+            break;
+        case gl::QueryType::Timestamp:
+            ANGLE_TRY(mQueryHelper.get().beginQuery(contextVk));
+            break;
+        case gl::QueryType::TimeElapsed:
+            // Note: TimeElapsed is implemented by using two Timestamp queries and taking the diff.
+            if (!mQueryHelperTimeElapsedBegin.valid())
+            {
+                ANGLE_TRY(contextVk->getQueryPool(mType)->allocateQuery(
+                    contextVk, &mQueryHelperTimeElapsedBegin));
+            }
 
-        ANGLE_TRY(mQueryHelperTimeElapsedBegin.flushAndWriteTimestamp(contextVk));
-    }
-    else
-    {
-        ANGLE_TRY(mQueryHelper.beginQuery(contextVk));
+            ANGLE_TRY(mQueryHelperTimeElapsedBegin.flushAndWriteTimestamp(contextVk));
+            break;
+        default:
+            UNREACHABLE();
+            break;
     }
 
     return angle::Result::Continue;
@@ -120,12 +324,14 @@
 {
     ContextVk *contextVk = vk::GetImpl(context);
 
-    if (getType() == gl::QueryType::TransformFeedbackPrimitivesWritten)
+    // Transform feedback query is handled by a CPU-calculated value when emulated.
+    if (IsEmulatedTransformFeedbackQuery(contextVk, mType))
     {
+        ASSERT(contextVk->getFeatures().emulateTransformFeedback.enabled);
         mCachedResult = mTransformFeedbackPrimitivesDrawn;
 
-        // There could be transform feedback in progress, so add the primitives drawn so far from
-        // the current transform feedback object.
+        // There could be transform feedback in progress, so add the primitives drawn so far
+        // from the current transform feedback object.
         gl::TransformFeedback *transformFeedback =
             context->getState().getCurrentTransformFeedback();
         if (transformFeedback)
@@ -133,19 +339,52 @@
             mCachedResult += transformFeedback->getPrimitivesDrawn();
         }
         mCachedResultValid = true;
-        // We could consider using VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT.
+
+        return angle::Result::Continue;
     }
-    else if (isOcclusionQuery())
+
+    switch (mType)
     {
-        contextVk->endOcclusionQuery(this);
-    }
-    else if (getType() == gl::QueryType::TimeElapsed)
-    {
-        ANGLE_TRY(mQueryHelper.flushAndWriteTimestamp(contextVk));
-    }
-    else
-    {
-        ANGLE_TRY(mQueryHelper.endQuery(contextVk));
+        case gl::QueryType::AnySamples:
+        case gl::QueryType::AnySamplesConservative:
+        case gl::QueryType::PrimitivesGenerated:
+        case gl::QueryType::TransformFeedbackPrimitivesWritten:
+        {
+            QueryVk *shareQuery = GetShareQuery(contextVk, mType);
+            ASSERT(shareQuery == nullptr || &mQueryHelper.get() == &shareQuery->mQueryHelper.get());
+
+            contextVk->endRenderPassQuery(this);
+
+            // If another query shares its query helper with this one, its query has just ended!
+            // Make it stash its query and create a new one so it can continue.
+            if (shareQuery && shareQuery->mQueryHelper.isReferenced())
+            {
+                // This serves the following scenario (TF = TransformFeedbackPrimitivesWritten, PG =
+                // PrimitivesGenerated):
+                //
+                // - TF starts <-- QueryHelper1 starts
+                // - PG starts <-- PG shares QueryHelper1
+                // - Draw
+                // - TF ends   <-- Results = QueryHelper1,
+                //                 QueryHelper1 stashed in PG, PG starts QueryHelper2
+                // - Draw
+                // - PG ends   <-- Results = QueryHelper1 + QueryHelper2
+                if (contextVk->hasStartedRenderPass())
+                {
+                    ANGLE_TRY(shareQuery->onRenderPassStart(contextVk));
+                }
+            }
+            break;
+        }
+        case gl::QueryType::Timestamp:
+            ANGLE_TRY(mQueryHelper.get().endQuery(contextVk));
+            break;
+        case gl::QueryType::TimeElapsed:
+            ANGLE_TRY(mQueryHelper.get().flushAndWriteTimestamp(contextVk));
+            break;
+        default:
+            UNREACHABLE();
+            break;
     }
 
     return angle::Result::Continue;
@@ -153,29 +392,31 @@
 
 angle::Result QueryVk::queryCounter(const gl::Context *context)
 {
-    ASSERT(getType() == gl::QueryType::Timestamp);
+    ASSERT(mType == gl::QueryType::Timestamp);
     ContextVk *contextVk = vk::GetImpl(context);
 
     mCachedResultValid = false;
 
-    if (!mQueryHelper.valid())
+    if (!mQueryHelper.isReferenced())
     {
-        ANGLE_TRY(contextVk->getQueryPool(getType())->allocateQuery(contextVk, &mQueryHelper));
+        ANGLE_TRY(allocateQuery(contextVk));
     }
 
-    return mQueryHelper.flushAndWriteTimestamp(contextVk);
+    return mQueryHelper.get().flushAndWriteTimestamp(contextVk);
 }
 
 bool QueryVk::isUsedInRecordedCommands() const
 {
-    if (mQueryHelper.usedInRecordedCommands())
+    ASSERT(mQueryHelper.isReferenced());
+
+    if (mQueryHelper.get().usedInRecordedCommands())
     {
         return true;
     }
 
-    for (const vk::QueryHelper &query : mStashedQueryHelpers)
+    for (const vk::Shared<vk::QueryHelper> &query : mStashedQueryHelpers)
     {
-        if (query.usedInRecordedCommands())
+        if (query.get().usedInRecordedCommands())
         {
             return true;
         }
@@ -186,14 +427,16 @@
 
 bool QueryVk::isCurrentlyInUse(Serial lastCompletedSerial) const
 {
-    if (mQueryHelper.isCurrentlyInUse(lastCompletedSerial))
+    ASSERT(mQueryHelper.isReferenced());
+
+    if (mQueryHelper.get().isCurrentlyInUse(lastCompletedSerial))
     {
         return true;
     }
 
-    for (const vk::QueryHelper &query : mStashedQueryHelpers)
+    for (const vk::Shared<vk::QueryHelper> &query : mStashedQueryHelpers)
     {
-        if (query.isCurrentlyInUse(lastCompletedSerial))
+        if (query.get().isCurrentlyInUse(lastCompletedSerial))
         {
             return true;
         }
@@ -206,17 +449,17 @@
 {
     Serial lastCompletedSerial = contextVk->getLastCompletedQueueSerial();
 
-    if (mQueryHelper.usedInRunningCommands(lastCompletedSerial))
+    if (mQueryHelper.get().usedInRunningCommands(lastCompletedSerial))
     {
-        ANGLE_TRY(mQueryHelper.finishRunningCommands(contextVk));
+        ANGLE_TRY(mQueryHelper.get().finishRunningCommands(contextVk));
         lastCompletedSerial = contextVk->getLastCompletedQueueSerial();
     }
 
-    for (vk::QueryHelper &query : mStashedQueryHelpers)
+    for (vk::Shared<vk::QueryHelper> &query : mStashedQueryHelpers)
     {
-        if (query.usedInRunningCommands(lastCompletedSerial))
+        if (query.get().usedInRunningCommands(lastCompletedSerial))
         {
-            ANGLE_TRY(query.finishRunningCommands(contextVk));
+            ANGLE_TRY(query.get().finishRunningCommands(contextVk));
             lastCompletedSerial = contextVk->getLastCompletedQueueSerial();
         }
     }
@@ -235,6 +478,16 @@
     ContextVk *contextVk = vk::GetImpl(context);
     RendererVk *renderer = contextVk->getRenderer();
 
+    // Support the pathological case where begin/end is called on a render pass query but without
+    // any render passes in between.  In this case, the query helper is never allocated.
+    if (!mQueryHelper.isReferenced())
+    {
+        ASSERT(IsRenderPassQuery(contextVk, mType));
+        mCachedResult      = 0;
+        mCachedResultValid = true;
+        return angle::Result::Continue;
+    }
+
     // glGetQueryObject* requires an implicit flush of the command buffers to guarantee execution in
     // finite time.
     // Note regarding time-elapsed: end should have been called after begin, so flushing when end
@@ -245,7 +498,7 @@
         ANGLE_TRY(contextVk->flushImpl(nullptr));
 
         ASSERT(!mQueryHelperTimeElapsedBegin.usedInRecordedCommands());
-        ASSERT(!mQueryHelper.usedInRecordedCommands());
+        ASSERT(!mQueryHelper.get().usedInRecordedCommands());
     }
 
     ANGLE_TRY(contextVk->checkCompletedCommands());
@@ -268,53 +521,66 @@
         ANGLE_TRY(finishRunningCommands(contextVk));
     }
 
+    // If its a render pass query, the current query helper must have commands recorded (i.e. it's
+    // not a newly allocated query with the actual queries all stashed).  If this is not respected
+    // and !wait, |mQueryHelper.get().getUint64ResultNonBlocking()| will tell that the result is
+    // readily available, which may not be true.  The subsequent calls to |getUint64Result()| on the
+    // stashed queries will incur a wait that is not desired by the application.
+    ASSERT(!IsRenderPassQuery(contextVk, mType) || mQueryHelper.get().hasSubmittedCommands());
+
+    vk::QueryResult result(getQueryResultCount());
+
     if (wait)
     {
-        ANGLE_TRY(mQueryHelper.getUint64Result(contextVk, &mCachedResult));
-        uint64_t v;
-        ANGLE_TRY(retrieveStashedQueryResult(contextVk, &v));
-        mCachedResult += v;
+        ANGLE_TRY(mQueryHelper.get().getUint64Result(contextVk, &result));
+        ANGLE_TRY(accumulateStashedQueryResult(contextVk, &result));
     }
     else
     {
         bool available = false;
-        ANGLE_TRY(mQueryHelper.getUint64ResultNonBlocking(contextVk, &mCachedResult, &available));
+        ANGLE_TRY(mQueryHelper.get().getUint64ResultNonBlocking(contextVk, &result, &available));
         if (!available)
         {
             // If the results are not ready, do nothing.  mCachedResultValid remains false.
             return angle::Result::Continue;
         }
-        uint64_t v;
-        ANGLE_TRY(retrieveStashedQueryResult(contextVk, &v));
-        mCachedResult += v;
+        ANGLE_TRY(accumulateStashedQueryResult(contextVk, &result));
     }
 
     double timestampPeriod = renderer->getPhysicalDeviceProperties().limits.timestampPeriod;
 
     // Fix up the results to what OpenGL expects.
-    switch (getType())
+    switch (mType)
     {
         case gl::QueryType::AnySamples:
         case gl::QueryType::AnySamplesConservative:
             // OpenGL query result in these cases is binary
-            mCachedResult = !!mCachedResult;
+            mCachedResult = !!result.getResult(vk::QueryResult::kDefaultResultIndex);
             break;
         case gl::QueryType::Timestamp:
-            mCachedResult = static_cast<uint64_t>(mCachedResult * timestampPeriod);
+            mCachedResult = static_cast<uint64_t>(
+                result.getResult(vk::QueryResult::kDefaultResultIndex) * timestampPeriod);
             break;
         case gl::QueryType::TimeElapsed:
         {
-            uint64_t timeElapsedEnd = mCachedResult;
+            vk::QueryResult timeElapsedBegin(1);
 
             // Since the result of the end query of time-elapsed is already available, the
             // result of begin query must be available too.
-            ANGLE_TRY(mQueryHelperTimeElapsedBegin.getUint64Result(contextVk, &mCachedResult));
+            ANGLE_TRY(mQueryHelperTimeElapsedBegin.getUint64Result(contextVk, &timeElapsedBegin));
 
-            mCachedResult = timeElapsedEnd - mCachedResult;
-            mCachedResult = static_cast<uint64_t>(mCachedResult * timestampPeriod);
-
+            uint64_t delta = result.getResult(vk::QueryResult::kDefaultResultIndex) -
+                             timeElapsedBegin.getResult(vk::QueryResult::kDefaultResultIndex);
+            mCachedResult = static_cast<uint64_t>(delta * timestampPeriod);
             break;
         }
+        case gl::QueryType::TransformFeedbackPrimitivesWritten:
+            mCachedResult =
+                result.getResult(vk::QueryResult::kTransformFeedbackPrimitivesWrittenIndex);
+            break;
+        case gl::QueryType::PrimitivesGenerated:
+            mCachedResult = result.getResult(vk::QueryResult::kPrimitivesGeneratedIndex);
+            break;
         default:
             UNREACHABLE();
             break;
@@ -363,4 +629,16 @@
 {
     mTransformFeedbackPrimitivesDrawn += primitivesDrawn;
 }
+
+uint32_t QueryVk::getQueryResultCount() const
+{
+    switch (mType)
+    {
+        case gl::QueryType::PrimitivesGenerated:
+        case gl::QueryType::TransformFeedbackPrimitivesWritten:
+            return 2;
+        default:
+            return 1;
+    }
+}
 }  // namespace rx
diff --git a/src/libANGLE/renderer/vulkan/QueryVk.h b/src/libANGLE/renderer/vulkan/QueryVk.h
index 6d026f9..3be7ba4 100644
--- a/src/libANGLE/renderer/vulkan/QueryVk.h
+++ b/src/libANGLE/renderer/vulkan/QueryVk.h
@@ -35,9 +35,16 @@
     angle::Result isResultAvailable(const gl::Context *context, bool *available) override;
 
     void onTransformFeedbackEnd(GLsizeiptr primitivesDrawn);
-    vk::QueryHelper *getQueryHelper() { return &mQueryHelper; }
-    angle::Result stashQueryHelper(ContextVk *contextVk);
-    angle::Result retrieveStashedQueryResult(ContextVk *contextVk, uint64_t *result);
+    vk::QueryHelper *getQueryHelper()
+    {
+        ASSERT(mQueryHelper.isReferenced());
+        return &mQueryHelper.get();
+    }
+
+    // Called by ContextVk on render pass start / end for render pass queries.  These will
+    // stash and create new queries as needed.
+    angle::Result onRenderPassStart(ContextVk *contextVk);
+    void onRenderPassEnd(ContextVk *contextVk);
 
   private:
     angle::Result getResult(const gl::Context *context, bool wait);
@@ -45,11 +52,26 @@
     bool isUsedInRecordedCommands() const;
     bool isCurrentlyInUse(Serial lastCompletedSerial) const;
     angle::Result finishRunningCommands(ContextVk *contextVk);
+    void stashQueryHelper();
+    uint32_t getQueryResultCount() const;
+    angle::Result accumulateStashedQueryResult(ContextVk *contextVk, vk::QueryResult *result);
 
-    // Used for AnySamples, AnySamplesConservative, Timestamp and TimeElapsed (end).
-    vk::QueryHelper mQueryHelper;
-    // Used for occlusion query that we may end up with multiple outstanding query helper objects.
-    std::vector<vk::QueryHelper> mStashedQueryHelpers;
+    // Manage query allocations
+    angle::Result allocateQuery(ContextVk *contextVk);
+    void assignSharedQuery(QueryVk *shareQuery);
+    void releaseQueries(ContextVk *contextVk);
+    void releaseStashedQueries(ContextVk *contextVk);
+
+    // Prepare for begin by handling peculiarities such as the two transform feedback queries
+    // sharing QueryHelpers.
+    angle::Result setupBegin(ContextVk *contextVk);
+
+    // Used for all queries, except TimeElapsed (begin) or those that are emulated.  For transform
+    // feedback queries, these can be shared if the two queries are simultaneously active.
+    vk::Shared<vk::QueryHelper> mQueryHelper;
+    // Used for queries that may end up with multiple outstanding query helper objects as they end
+    // and begin again with render passes.
+    std::vector<vk::Shared<vk::QueryHelper>> mStashedQueryHelpers;
     // An additional query used for TimeElapsed (begin), as it is implemented using Timestamp.
     vk::QueryHelper mQueryHelperTimeElapsedBegin;
     // Used with TransformFeedbackPrimitivesWritten when transform feedback is emulated.
diff --git a/src/libANGLE/renderer/vulkan/README.md b/src/libANGLE/renderer/vulkan/README.md
index 6b1c2cd..8abcf2a 100644
--- a/src/libANGLE/renderer/vulkan/README.md
+++ b/src/libANGLE/renderer/vulkan/README.md
@@ -79,6 +79,7 @@
 - [OpenGL Line Segment Rasterization](doc/OpenGLLineSegmentRasterization.md)
 - [Format Tables and Emulation](doc/FormatTablesAndEmulation.md)
 - [Deferred Clears](doc/DeferredClears.md)
+- [Queries](doc/Queries.md)
 
 [VkDevice]: https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkDevice.html
 [VkQueue]: https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkQueue.html
diff --git a/src/libANGLE/renderer/vulkan/RendererVk.cpp b/src/libANGLE/renderer/vulkan/RendererVk.cpp
index 021023f..b3c68ea 100644
--- a/src/libANGLE/renderer/vulkan/RendererVk.cpp
+++ b/src/libANGLE/renderer/vulkan/RendererVk.cpp
@@ -387,6 +387,13 @@
     return VK_FALSE;
 }
 
+VKAPI_ATTR void VKAPI_CALL
+MemoryReportCallback(const VkDeviceMemoryReportCallbackDataEXT *callbackData, void *userData)
+{
+    RendererVk *rendererVk = static_cast<RendererVk *>(userData);
+    rendererVk->processMemoryReportCallback(*callbackData);
+}
+
 bool ShouldUseValidationLayers(const egl::AttributeMap &attribs)
 {
 #if defined(ANGLE_ENABLE_VULKAN_VALIDATION_LAYERS_BY_DEFAULT)
@@ -609,11 +616,15 @@
 
     // Gather global layer properties.
     uint32_t instanceLayerCount = 0;
-    ANGLE_VK_TRY(displayVk, vkEnumerateInstanceLayerProperties(&instanceLayerCount, nullptr));
+    {
+        ANGLE_SCOPED_DISABLE_LSAN();
+        ANGLE_VK_TRY(displayVk, vkEnumerateInstanceLayerProperties(&instanceLayerCount, nullptr));
+    }
 
     std::vector<VkLayerProperties> instanceLayerProps(instanceLayerCount);
     if (instanceLayerCount > 0)
     {
+        ANGLE_SCOPED_DISABLE_LSAN();
         ANGLE_VK_TRY(displayVk, vkEnumerateInstanceLayerProperties(&instanceLayerCount,
                                                                    instanceLayerProps.data()));
     }
@@ -635,12 +646,16 @@
     // Enumerate instance extensions that are provided by the vulkan
     // implementation and implicit layers.
     uint32_t instanceExtensionCount = 0;
-    ANGLE_VK_TRY(displayVk,
-                 vkEnumerateInstanceExtensionProperties(nullptr, &instanceExtensionCount, nullptr));
+    {
+        ANGLE_SCOPED_DISABLE_LSAN();
+        ANGLE_VK_TRY(displayVk, vkEnumerateInstanceExtensionProperties(
+                                    nullptr, &instanceExtensionCount, nullptr));
+    }
 
     std::vector<VkExtensionProperties> instanceExtensionProps(instanceExtensionCount);
     if (instanceExtensionCount > 0)
     {
+        ANGLE_SCOPED_DISABLE_LSAN();
         ANGLE_VK_TRY(displayVk,
                      vkEnumerateInstanceExtensionProperties(nullptr, &instanceExtensionCount,
                                                             instanceExtensionProps.data()));
@@ -651,12 +666,18 @@
     {
         uint32_t previousExtensionCount      = static_cast<uint32_t>(instanceExtensionProps.size());
         uint32_t instanceLayerExtensionCount = 0;
-        ANGLE_VK_TRY(displayVk, vkEnumerateInstanceExtensionProperties(
-                                    layerName, &instanceLayerExtensionCount, nullptr));
+        {
+            ANGLE_SCOPED_DISABLE_LSAN();
+            ANGLE_VK_TRY(displayVk, vkEnumerateInstanceExtensionProperties(
+                                        layerName, &instanceLayerExtensionCount, nullptr));
+        }
         instanceExtensionProps.resize(previousExtensionCount + instanceLayerExtensionCount);
-        ANGLE_VK_TRY(displayVk, vkEnumerateInstanceExtensionProperties(
-                                    layerName, &instanceLayerExtensionCount,
-                                    instanceExtensionProps.data() + previousExtensionCount));
+        {
+            ANGLE_SCOPED_DISABLE_LSAN();
+            ANGLE_VK_TRY(displayVk, vkEnumerateInstanceExtensionProperties(
+                                        layerName, &instanceLayerExtensionCount,
+                                        instanceExtensionProps.data() + previousExtensionCount));
+        }
     }
 
     vk::ExtensionNameList instanceExtensionNames;
@@ -723,7 +744,10 @@
     else
     {
         uint32_t apiVersion = VK_API_VERSION_1_0;
-        ANGLE_VK_TRY(displayVk, enumerateInstanceVersion(&apiVersion));
+        {
+            ANGLE_SCOPED_DISABLE_LSAN();
+            ANGLE_VK_TRY(displayVk, enumerateInstanceVersion(&apiVersion));
+        }
         if ((VK_VERSION_MAJOR(apiVersion) > 1) || (VK_VERSION_MINOR(apiVersion) >= 1))
         {
             // This is the highest version of core Vulkan functionality that ANGLE uses.
@@ -937,6 +961,10 @@
     mSubgroupProperties       = {};
     mSubgroupProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES;
 
+    mMemoryReportFeatures = {};
+    mMemoryReportFeatures.sType =
+        VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT;
+
     mExternalMemoryHostProperties = {};
     mExternalMemoryHostProperties.sType =
         VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT;
@@ -1002,6 +1030,12 @@
         vk::AddToPNextChain(&deviceFeatures, &mIndexTypeUint8Features);
     }
 
+    // Query memory report features
+    if (ExtensionFound(VK_EXT_DEVICE_MEMORY_REPORT_EXTENSION_NAME, deviceExtensionNames))
+    {
+        vk::AddToPNextChain(&deviceFeatures, &mMemoryReportFeatures);
+    }
+
     // Query external memory host properties
     if (ExtensionFound(VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME, deviceExtensionNames))
     {
@@ -1056,6 +1090,7 @@
 
     // Clean up pNext chains
     mLineRasterizationFeatures.pNext        = nullptr;
+    mMemoryReportFeatures.pNext             = nullptr;
     mProvokingVertexFeatures.pNext          = nullptr;
     mVertexAttributeDivisorFeatures.pNext   = nullptr;
     mVertexAttributeDivisorProperties.pNext = nullptr;
@@ -1166,6 +1201,12 @@
     // Initialize features and workarounds.
     initFeatures(displayVk, deviceExtensionNames);
 
+    // Enable VK_EXT_depth_clip_enable, if supported
+    if (ExtensionFound(VK_EXT_DEPTH_CLIP_ENABLE_EXTENSION_NAME, deviceExtensionNames))
+    {
+        enabledDeviceExtensions.push_back(VK_EXT_DEPTH_CLIP_ENABLE_EXTENSION_NAME);
+    }
+
     // Enable VK_KHR_get_memory_requirements2, if supported
     if (ExtensionFound(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME, deviceExtensionNames))
     {
@@ -1401,6 +1442,19 @@
         enabledDeviceExtensions.push_back(VK_KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME);
     }
 
+    if (mMemoryReportFeatures.deviceMemoryReport &&
+        (getFeatures().logMemoryReportCallbacks.enabled ||
+         getFeatures().logMemoryReportStats.enabled))
+    {
+        enabledDeviceExtensions.push_back(VK_EXT_DEVICE_MEMORY_REPORT_EXTENSION_NAME);
+
+        mMemoryReportCallback       = {};
+        mMemoryReportCallback.sType = VK_STRUCTURE_TYPE_DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT;
+        mMemoryReportCallback.pfnUserCallback = &MemoryReportCallback;
+        mMemoryReportCallback.pUserData       = this;
+        vk::AddToPNextChain(&createInfo, &mMemoryReportCallback);
+    }
+
     if (getFeatures().supportsExternalMemoryHost.enabled)
     {
         enabledDeviceExtensions.push_back(VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME);
@@ -1619,6 +1673,10 @@
     }
 
     // TODO: more extension checks for 3.2.  http://anglebug.com/5366
+    if (!mFeatures.exposeNonConformantExtensionsAndVersions.enabled)
+    {
+        maxVersion = LimitVersionTo(maxVersion, {3, 1});
+    }
 
     // Limit to ES3.0 if there are any blockers for 3.1.
 
@@ -1767,6 +1825,15 @@
     }
     ANGLE_FEATURE_CONDITION(&mFeatures, clampPointSize,
                             isNvidia && nvidiaVersion.major < uint32_t(IsWindows() ? 430 : 421));
+    // http://anglebug.com/3970#c25.
+    // The workaround requires the VK_EXT_depth_clip_enable extension and the 'depthClamp' physical
+    // device feature. This workaround caused test failures on Quadro P400/driver 418.56/Linux.
+    // Therefore, on Linux we require a major version > 418.
+    ANGLE_FEATURE_CONDITION(
+        &mFeatures, depthClamping,
+        isNvidia && mPhysicalDeviceFeatures.depthClamp &&
+            ExtensionFound(VK_EXT_DEPTH_CLIP_ENABLE_EXTENSION_NAME, deviceExtensionNames) &&
+            (!IsLinux() || nvidiaVersion.major > 418u));
 
     // Work around ineffective compute-graphics barriers on Nexus 5X.
     // TODO(syoussefi): Figure out which other vendors and driver versions are affected.
@@ -1902,6 +1969,9 @@
 
     ANGLE_FEATURE_CONDITION(&mFeatures, persistentlyMappedBuffers, true);
 
+    ANGLE_FEATURE_CONDITION(&mFeatures, logMemoryReportCallbacks, false);
+    ANGLE_FEATURE_CONDITION(&mFeatures, logMemoryReportStats, false);
+
     ANGLE_FEATURE_CONDITION(
         &mFeatures, supportsExternalMemoryHost,
         ExtensionFound(VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME, deviceExtensionNames));
@@ -2182,6 +2252,13 @@
     return hasFormatFeatureBits<&VkFormatProperties::linearTilingFeatures>(format, featureBits);
 }
 
+VkFormatFeatureFlags RendererVk::getLinearImageFormatFeatureBits(
+    VkFormat format,
+    const VkFormatFeatureFlags featureBits) const
+{
+    return getFormatFeatureBits<&VkFormatProperties::linearTilingFeatures>(format, featureBits);
+}
+
 VkFormatFeatureFlags RendererVk::getImageFormatFeatureBits(
     VkFormat format,
     const VkFormatFeatureFlags featureBits) const
@@ -2216,6 +2293,7 @@
                                             vk::PrimaryCommandBuffer &&primary,
                                             egl::ContextPriority priority,
                                             const vk::Fence *fence,
+                                            vk::SubmitPolicy submitPolicy,
                                             Serial *serialOut)
 {
     ANGLE_TRACE_EVENT0("gpu.angle", "RendererVk::queueSubmitOneOff");
@@ -2227,13 +2305,13 @@
     {
         submitQueueSerial = mCommandProcessor.reserveSubmitSerial();
         ANGLE_TRY(mCommandProcessor.queueSubmitOneOff(context, priority, primary.getHandle(), fence,
-                                                      submitQueueSerial));
+                                                      submitPolicy, submitQueueSerial));
     }
     else
     {
         submitQueueSerial = mCommandQueue.reserveSubmitSerial();
         ANGLE_TRY(mCommandQueue.queueSubmitOneOff(context, priority, primary.getHandle(), fence,
-                                                  submitQueueSerial));
+                                                  submitPolicy, submitQueueSerial));
     }
 
     *serialOut = submitQueueSerial;
@@ -2282,6 +2360,26 @@
     return IsMaskFlagSet(getFormatFeatureBits<features>(format, featureBits), featureBits);
 }
 
+bool RendererVk::haveSameFormatFeatureBits(VkFormat fmt1, VkFormat fmt2) const
+{
+    if (fmt1 == VK_FORMAT_UNDEFINED || fmt2 == VK_FORMAT_UNDEFINED)
+    {
+        return false;
+    }
+
+    constexpr VkFormatFeatureFlags kImageUsageFeatureBits =
+        VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT |
+        VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT;
+
+    VkFormatFeatureFlags fmt1LinearFeatureBits =
+        getLinearImageFormatFeatureBits(fmt1, kImageUsageFeatureBits);
+    VkFormatFeatureFlags fmt1OptimalFeatureBits =
+        getImageFormatFeatureBits(fmt1, kImageUsageFeatureBits);
+
+    return hasLinearImageFormatFeatureBits(fmt2, fmt1LinearFeatureBits) &&
+           hasImageFormatFeatureBits(fmt2, fmt1OptimalFeatureBits);
+}
+
 angle::Result RendererVk::cleanupGarbage(Serial lastCompletedQueueSerial)
 {
     std::lock_guard<std::mutex> lock(mGarbageMutex);
@@ -2575,6 +2673,11 @@
         result = mCommandQueue.queuePresent(priority, presentInfo);
     }
 
+    if (getFeatures().logMemoryReportStats.enabled)
+    {
+        mMemoryReport.logMemoryReportStats();
+    }
+
     return result;
 }
 
@@ -2607,4 +2710,114 @@
     commandBuffer->markOpen();
     mCommandBufferHelperFreeList.push_back(commandBuffer);
 }
+
+vk::MemoryReport::MemoryReport()
+    : mCurrentTotalAllocatedMemory(0),
+      mMaxTotalAllocatedMemory(0),
+      mCurrentTotalImportedMemory(0),
+      mMaxTotalImportedMemory(0)
+{}
+
+void vk::MemoryReport::processCallback(const VkDeviceMemoryReportCallbackDataEXT &callbackData,
+                                       bool logCallback)
+{
+    std::lock_guard<std::mutex> lock(mMemoryReportMutex);
+    VkDeviceSize size = 0;
+    std::string reportType;
+    switch (callbackData.type)
+    {
+        case VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_ALLOCATE_EXT:
+            reportType = "Allocate";
+            if ((mUniqueIDCounts[callbackData.memoryObjectId] += 1) > 1)
+            {
+                break;
+            }
+            size = mSizesPerType[callbackData.objectType].allocatedMemory + callbackData.size;
+            mSizesPerType[callbackData.objectType].allocatedMemory = size;
+            if (mSizesPerType[callbackData.objectType].allocatedMemoryMax < size)
+            {
+                mSizesPerType[callbackData.objectType].allocatedMemoryMax = size;
+            }
+            mCurrentTotalAllocatedMemory += callbackData.size;
+            if (mMaxTotalAllocatedMemory < mCurrentTotalAllocatedMemory)
+            {
+                mMaxTotalAllocatedMemory = mCurrentTotalAllocatedMemory;
+            }
+            break;
+        case VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_FREE_EXT:
+            reportType = "Free";
+            ASSERT(mUniqueIDCounts[callbackData.memoryObjectId] > 0);
+            mUniqueIDCounts[callbackData.memoryObjectId] -= 1;
+            size = mSizesPerType[callbackData.objectType].allocatedMemory - callbackData.size;
+            mSizesPerType[callbackData.objectType].allocatedMemory = size;
+            mCurrentTotalAllocatedMemory -= callbackData.size;
+            break;
+        case VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_IMPORT_EXT:
+            reportType = "Import";
+            if ((mUniqueIDCounts[callbackData.memoryObjectId] += 1) > 1)
+            {
+                break;
+            }
+            size = mSizesPerType[callbackData.objectType].importedMemory + callbackData.size;
+            mSizesPerType[callbackData.objectType].importedMemory = size;
+            if (mSizesPerType[callbackData.objectType].importedMemoryMax < size)
+            {
+                mSizesPerType[callbackData.objectType].importedMemoryMax = size;
+            }
+            mCurrentTotalImportedMemory += callbackData.size;
+            if (mMaxTotalImportedMemory < mCurrentTotalImportedMemory)
+            {
+                mMaxTotalImportedMemory = mCurrentTotalImportedMemory;
+            }
+            break;
+        case VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_UNIMPORT_EXT:
+            reportType = "Un-Import";
+            ASSERT(mUniqueIDCounts[callbackData.memoryObjectId] > 0);
+            mUniqueIDCounts[callbackData.memoryObjectId] -= 1;
+            size = mSizesPerType[callbackData.objectType].importedMemory - callbackData.size;
+            mSizesPerType[callbackData.objectType].importedMemory = size;
+            mCurrentTotalImportedMemory -= callbackData.size;
+            break;
+        case VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_ALLOCATION_FAILED_EXT:
+            reportType = "allocFail";
+            break;
+        default:
+            UNREACHABLE();
+            return;
+    }
+    if (logCallback)
+    {
+        INFO() << std::right << std::setw(9) << reportType << ": size=" << std::setw(10)
+               << callbackData.size << "; type=" << std::setw(15) << std::left
+               << GetVkObjectTypeName(callbackData.objectType)
+               << "; heapIdx=" << callbackData.heapIndex << "; id=" << std::hex
+               << callbackData.memoryObjectId << "; handle=" << std::hex
+               << callbackData.objectHandle << ": Total=" << std::right << std::setw(10) << std::dec
+               << size;
+    }
+}
+
+void vk::MemoryReport::logMemoryReportStats() const
+{
+    std::lock_guard<std::mutex> lock(mMemoryReportMutex);
+
+    INFO() << std::right << "GPU Memory Totals:       Allocated=" << std::setw(10)
+           << mCurrentTotalAllocatedMemory << " (max=" << std::setw(10) << mMaxTotalAllocatedMemory
+           << ");  Imported=" << std::setw(10) << mCurrentTotalImportedMemory
+           << " (max=" << std::setw(10) << mMaxTotalImportedMemory << ")";
+    INFO() << "Sub-Totals per type:";
+    for (const auto &it : mSizesPerType)
+    {
+        VkObjectType objectType         = it.first;
+        MemorySizes memorySizes         = it.second;
+        VkDeviceSize allocatedMemory    = memorySizes.allocatedMemory;
+        VkDeviceSize allocatedMemoryMax = memorySizes.allocatedMemoryMax;
+        VkDeviceSize importedMemory     = memorySizes.importedMemory;
+        VkDeviceSize importedMemoryMax  = memorySizes.importedMemoryMax;
+        INFO() << std::right << "- Type=" << std::setw(15) << GetVkObjectTypeName(objectType)
+               << ":  Allocated=" << std::setw(10) << allocatedMemory << " (max=" << std::setw(10)
+               << allocatedMemoryMax << ");  Imported=" << std::setw(10) << importedMemory
+               << " (max=" << std::setw(10) << importedMemoryMax << ")";
+    }
+}
 }  // namespace rx
diff --git a/src/libANGLE/renderer/vulkan/RendererVk.h b/src/libANGLE/renderer/vulkan/RendererVk.h
index 9bfb794..b998c94 100644
--- a/src/libANGLE/renderer/vulkan/RendererVk.h
+++ b/src/libANGLE/renderer/vulkan/RendererVk.h
@@ -53,6 +53,31 @@
 
 static constexpr size_t kMaxExtensionNames = 200;
 using ExtensionNameList                    = angle::FixedVector<const char *, kMaxExtensionNames>;
+
+// Process GPU memory reports
+class MemoryReport final : angle::NonCopyable
+{
+  public:
+    MemoryReport();
+    void processCallback(const VkDeviceMemoryReportCallbackDataEXT &callbackData, bool logCallback);
+    void logMemoryReportStats() const;
+
+  private:
+    struct MemorySizes
+    {
+        VkDeviceSize allocatedMemory;
+        VkDeviceSize allocatedMemoryMax;
+        VkDeviceSize importedMemory;
+        VkDeviceSize importedMemoryMax;
+    };
+    mutable std::mutex mMemoryReportMutex;
+    VkDeviceSize mCurrentTotalAllocatedMemory;
+    VkDeviceSize mMaxTotalAllocatedMemory;
+    angle::HashMap<VkObjectType, MemorySizes> mSizesPerType;
+    VkDeviceSize mCurrentTotalImportedMemory;
+    VkDeviceSize mMaxTotalImportedMemory;
+    angle::HashMap<uint64_t, int> mUniqueIDCounts;
+};
 }  // namespace vk
 
 // Supports one semaphore from current surface, and one semaphore passed to
@@ -161,6 +186,9 @@
     // device (first time only).
     bool hasLinearImageFormatFeatureBits(VkFormat format,
                                          const VkFormatFeatureFlags featureBits) const;
+    VkFormatFeatureFlags getLinearImageFormatFeatureBits(
+        VkFormat format,
+        const VkFormatFeatureFlags featureBits) const;
     VkFormatFeatureFlags getImageFormatFeatureBits(VkFormat format,
                                                    const VkFormatFeatureFlags featureBits) const;
     bool hasImageFormatFeatureBits(VkFormat format, const VkFormatFeatureFlags featureBits) const;
@@ -181,6 +209,7 @@
                                     vk::PrimaryCommandBuffer &&primary,
                                     egl::ContextPriority priority,
                                     const vk::Fence *fence,
+                                    vk::SubmitPolicy submitPolicy,
                                     Serial *serialOut);
 
     template <typename... ArgsT>
@@ -294,6 +323,8 @@
 
     void outputVmaStatString();
 
+    bool haveSameFormatFeatureBits(VkFormat fmt1, VkFormat fmt2) const;
+
     angle::Result cleanupGarbage(Serial lastCompletedQueueSerial);
 
     angle::Result submitFrame(vk::Context *context,
@@ -327,6 +358,13 @@
     vk::CommandBufferHelper *getCommandBufferHelper(bool hasRenderPass);
     void recycleCommandBufferHelper(vk::CommandBufferHelper *commandBuffer);
 
+    // Process GPU memory reports
+    void processMemoryReportCallback(const VkDeviceMemoryReportCallbackDataEXT &callbackData)
+    {
+        bool logCallback = getFeatures().logMemoryReportCallbacks.enabled;
+        mMemoryReport.processCallback(callbackData, logCallback);
+    }
+
   private:
     angle::Result initializeDevice(DisplayVk *displayVk, uint32_t queueFamilyIndex);
     void ensureCapsInitialized() const;
@@ -371,6 +409,8 @@
     VkPhysicalDeviceTransformFeedbackFeaturesEXT mTransformFeedbackFeatures;
     VkPhysicalDeviceIndexTypeUint8FeaturesEXT mIndexTypeUint8Features;
     VkPhysicalDeviceSubgroupProperties mSubgroupProperties;
+    VkPhysicalDeviceDeviceMemoryReportFeaturesEXT mMemoryReportFeatures;
+    VkDeviceDeviceMemoryReportCreateInfoEXT mMemoryReportCallback;
     VkPhysicalDeviceExternalMemoryHostPropertiesEXT mExternalMemoryHostProperties;
     VkPhysicalDeviceShaderFloat16Int8FeaturesKHR mShaderFloat16Int8Features;
     VkPhysicalDeviceDepthStencilResolvePropertiesKHR mDepthStencilResolveProperties;
@@ -448,6 +488,9 @@
 
     // Tracks resource serials.
     vk::ResourceSerialFactory mResourceSerialFactory;
+
+    // Process GPU memory reports
+    vk::MemoryReport mMemoryReport;
 };
 
 }  // namespace rx
diff --git a/src/libANGLE/renderer/vulkan/SecondaryCommandBuffer.cpp b/src/libANGLE/renderer/vulkan/SecondaryCommandBuffer.cpp
index 5c54e5d..5444a2d 100644
--- a/src/libANGLE/renderer/vulkan/SecondaryCommandBuffer.cpp
+++ b/src/libANGLE/renderer/vulkan/SecondaryCommandBuffer.cpp
@@ -136,16 +136,6 @@
                                                    command->size);
 }
 
-// Add any queued resetQueryPool commands to the given cmdBuffer
-void SecondaryCommandBuffer::executeQueuedResetQueryPoolCommands(VkCommandBuffer cmdBuffer)
-{
-    for (const ResetQueryPoolParams &queryParams : mResetQueryQueue)
-    {
-        vkCmdResetQueryPool(cmdBuffer, queryParams.queryPool, queryParams.firstQuery,
-                            queryParams.queryCount);
-    }
-}
-
 // Parse the cmds in this cmd buffer into given primary cmd buffer
 void SecondaryCommandBuffer::executeCommands(VkCommandBuffer cmdBuffer)
 {
diff --git a/src/libANGLE/renderer/vulkan/SecondaryCommandBuffer.h b/src/libANGLE/renderer/vulkan/SecondaryCommandBuffer.h
index a19e791..95ee8fa 100644
--- a/src/libANGLE/renderer/vulkan/SecondaryCommandBuffer.h
+++ b/src/libANGLE/renderer/vulkan/SecondaryCommandBuffer.h
@@ -670,9 +670,6 @@
 
     // Parse the cmds in this cmd buffer into given primary cmd buffer for execution
     void executeCommands(VkCommandBuffer cmdBuffer);
-    // If resetQueryPoolCommands are queued, call this to execute them all
-    //  This should only be called on a cmdBuffer without an active renderPass
-    void executeQueuedResetQueryPoolCommands(VkCommandBuffer cmdBuffer);
 
     // Calculate memory usage of this command buffer for diagnostics.
     void getMemoryUsageStats(size_t *usedMemoryOut, size_t *allocatedMemoryOut) const;
@@ -704,7 +701,6 @@
     {
         mCommands.clear();
         initialize(mAllocator);
-        mResetQueryQueue.clear();
     }
 
     // This will cause the SecondaryCommandBuffer to become invalid by clearing its allocator
@@ -821,9 +817,6 @@
 
     uint8_t *mCurrentWritePointer;
     size_t mCurrentBytesRemaining;
-    // resetQueryPool command must be executed outside RP so we queue them up for
-    //  an inside RenderPass command buffer and pre-prend them to the commands
-    std::vector<ResetQueryPoolParams> mResetQueryQueue;
 };
 
 ANGLE_INLINE SecondaryCommandBuffer::SecondaryCommandBuffer()
@@ -1357,13 +1350,6 @@
     paramStruct->stageMask        = stageMask;
 }
 
-ANGLE_INLINE void SecondaryCommandBuffer::queueResetQueryPool(VkQueryPool queryPool,
-                                                              uint32_t firstQuery,
-                                                              uint32_t queryCount)
-{
-    mResetQueryQueue.push_back({queryPool, firstQuery, queryCount});
-}
-
 ANGLE_INLINE void SecondaryCommandBuffer::resetQueryPool(VkQueryPool queryPool,
                                                          uint32_t firstQuery,
                                                          uint32_t queryCount)
diff --git a/src/libANGLE/renderer/vulkan/SurfaceVk.cpp b/src/libANGLE/renderer/vulkan/SurfaceVk.cpp
index 2832d88..13a3fd3 100644
--- a/src/libANGLE/renderer/vulkan/SurfaceVk.cpp
+++ b/src/libANGLE/renderer/vulkan/SurfaceVk.cpp
@@ -1218,7 +1218,7 @@
 }
 
 egl::Error WindowSurfaceVk::swapWithDamage(const gl::Context *context,
-                                           EGLint *rects,
+                                           const EGLint *rects,
                                            EGLint n_rects)
 {
     DisplayVk *displayVk = vk::GetImpl(context->getDisplay());
@@ -1263,7 +1263,7 @@
 }
 
 angle::Result WindowSurfaceVk::present(ContextVk *contextVk,
-                                       EGLint *rects,
+                                       const EGLint *rects,
                                        EGLint n_rects,
                                        const void *pNextChain,
                                        bool *presentOutOfDate)
@@ -1373,7 +1373,7 @@
         EGLint width  = getWidth();
         EGLint height = getHeight();
 
-        EGLint *eglRects             = rects;
+        const EGLint *eglRects       = rects;
         presentRegion.rectangleCount = n_rects;
         vkRects.resize(n_rects);
         for (EGLint i = 0; i < n_rects; i++)
@@ -1418,7 +1418,7 @@
 }
 
 angle::Result WindowSurfaceVk::swapImpl(const gl::Context *context,
-                                        EGLint *rects,
+                                        const EGLint *rects,
                                         EGLint n_rects,
                                         const void *pNextChain)
 {
diff --git a/src/libANGLE/renderer/vulkan/SurfaceVk.h b/src/libANGLE/renderer/vulkan/SurfaceVk.h
index 83d2732..7993d37 100644
--- a/src/libANGLE/renderer/vulkan/SurfaceVk.h
+++ b/src/libANGLE/renderer/vulkan/SurfaceVk.h
@@ -188,7 +188,9 @@
     FramebufferImpl *createDefaultFramebuffer(const gl::Context *context,
                                               const gl::FramebufferState &state) override;
     egl::Error swap(const gl::Context *context) override;
-    egl::Error swapWithDamage(const gl::Context *context, EGLint *rects, EGLint n_rects) override;
+    egl::Error swapWithDamage(const gl::Context *context,
+                              const EGLint *rects,
+                              EGLint n_rects) override;
     egl::Error postSubBuffer(const gl::Context *context,
                              EGLint x,
                              EGLint y,
@@ -241,7 +243,7 @@
 
   protected:
     angle::Result swapImpl(const gl::Context *context,
-                           EGLint *rects,
+                           const EGLint *rects,
                            EGLint n_rects,
                            const void *pNextChain);
 
@@ -278,7 +280,7 @@
                                           VkResult result,
                                           bool *presentOutOfDate);
     angle::Result present(ContextVk *contextVk,
-                          EGLint *rects,
+                          const EGLint *rects,
                           EGLint n_rects,
                           const void *pNextChain,
                           bool *presentOutOfDate);
diff --git a/src/libANGLE/renderer/vulkan/SyncVk.cpp b/src/libANGLE/renderer/vulkan/SyncVk.cpp
index 5376658..f4234a6 100644
--- a/src/libANGLE/renderer/vulkan/SyncVk.cpp
+++ b/src/libANGLE/renderer/vulkan/SyncVk.cpp
@@ -16,11 +16,60 @@
 #include "libANGLE/renderer/vulkan/DisplayVk.h"
 
 #if !defined(ANGLE_PLATFORM_WINDOWS)
+#    include <poll.h>
 #    include <unistd.h>
 #else
 #    include <io.h>
 #endif
 
+namespace
+{
+// Wait for file descriptor to be signaled
+VkResult SyncWaitFd(int fd, uint64_t timeoutNs)
+{
+#if !defined(ANGLE_PLATFORM_WINDOWS)
+    struct pollfd fds;
+    int ret;
+
+    // Convert nanoseconds to milliseconds
+    int timeoutMs = static_cast<int>(timeoutNs / 1000000);
+    // If timeoutNs was non-zero but less than one millisecond, make it a millisecond.
+    if (timeoutNs > 0 && timeoutNs < 1000000)
+    {
+        timeoutMs = 1;
+    }
+
+    ASSERT(fd >= 0);
+
+    fds.fd     = fd;
+    fds.events = POLLIN;
+
+    do
+    {
+        ret = poll(&fds, 1, timeoutMs);
+        if (ret > 0)
+        {
+            if (fds.revents & (POLLERR | POLLNVAL))
+            {
+                return VK_ERROR_UNKNOWN;
+            }
+            return VK_SUCCESS;
+        }
+        else if (ret == 0)
+        {
+            return VK_TIMEOUT;
+        }
+    } while (ret == -1 && (errno == EINTR || errno == EAGAIN));
+
+    return VK_ERROR_UNKNOWN;
+#else
+    UNREACHABLE();
+    return VK_ERROR_UNKNOWN;
+#endif
+}
+
+}  // anonymous namespace
+
 namespace rx
 {
 namespace vk
@@ -32,13 +81,6 @@
 void SyncHelper::releaseToRenderer(RendererVk *renderer)
 {
     renderer->collectGarbageAndReinit(&mUse, &mEvent);
-    // TODO: https://issuetracker.google.com/170312581 - Currently just stalling on worker thread
-    // here to try and avoid race condition. If this works, need some alternate solution
-    if (renderer->getFeatures().asyncCommandQueue.enabled)
-    {
-        ANGLE_TRACE_EVENT0("gpu.angle", "SyncHelper::releaseToRenderer");
-        (void)renderer->waitForCommandProcessorIdle(nullptr);
-    }
 }
 
 angle::Result SyncHelper::initialize(ContextVk *contextVk)
@@ -164,6 +206,19 @@
 {
     ASSERT(inFd >= kInvalidFenceFd);
 
+    // If valid FD provided by application - import it to fence.
+    if (inFd > kInvalidFenceFd)
+    {
+        // File descriptor ownership: EGL_ANDROID_native_fence_sync
+        // Whenever a file descriptor is passed into or returned from an
+        // EGL call in this extension, ownership of that file descriptor is
+        // transferred. The recipient of the file descriptor must close it when it is
+        // no longer needed, and the provider of the file descriptor must dup it
+        // before providing it if they require continued use of the native fence.
+        mNativeFenceFd = inFd;
+        return angle::Result::Continue;
+    }
+
     RendererVk *renderer = contextVk->getRenderer();
     VkDevice device      = renderer->getDevice();
 
@@ -183,58 +238,36 @@
     // Initialize/create a VkFence handle
     ANGLE_VK_TRY(contextVk, fence.get().init(device, fenceCreateInfo));
 
-    int importFenceFd = kInvalidFenceFd;
-    // If valid FD provided by application - import it to fence.
-    if (inFd > kInvalidFenceFd)
-    {
-        importFenceFd = inFd;
-    }
-    // If invalid FD provided by application - create one with fence.
-    else
-    {
-        /*
-          Spec: "When a fence sync object is created or when an EGL native fence sync
-          object is created with the EGL_SYNC_NATIVE_FENCE_FD_ANDROID attribute set to
-          EGL_NO_NATIVE_FENCE_FD_ANDROID, eglCreateSyncKHR also inserts a fence command
-          into the command stream of the bound client API's current context and associates it
-          with the newly created sync object.
-        */
-        // Flush first because the fence comes after current pending set of commands.
-        ANGLE_TRY(contextVk->flushImpl(nullptr));
+    // invalid FD provided by application - create one with fence.
+    /*
+      Spec: "When a fence sync object is created or when an EGL native fence sync
+      object is created with the EGL_SYNC_NATIVE_FENCE_FD_ANDROID attribute set to
+      EGL_NO_NATIVE_FENCE_FD_ANDROID, eglCreateSyncKHR also inserts a fence command
+      into the command stream of the bound client API's current context and associates it
+      with the newly created sync object.
+    */
+    // Flush first because the fence comes after current pending set of commands.
+    ANGLE_TRY(contextVk->flushImpl(nullptr));
 
-        retain(&contextVk->getResourceUseList());
-
-        Serial serialOut;
-        ANGLE_TRY(renderer->queueSubmitOneOff(contextVk, vk::PrimaryCommandBuffer(),
-                                              contextVk->getPriority(), &fence.get(), &serialOut));
-
-        VkFenceGetFdInfoKHR fenceGetFdInfo = {};
-        fenceGetFdInfo.sType               = VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR;
-        fenceGetFdInfo.fence               = fence.get().getHandle();
-        fenceGetFdInfo.handleType          = VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT_KHR;
-        ANGLE_VK_TRY(contextVk, fence.get().exportFd(device, fenceGetFdInfo, &importFenceFd));
-    }
-
-    // Spec: Importing a fence payload from a file descriptor transfers ownership of the file
-    // descriptor from the application to the Vulkan implementation. The application must not
-    // perform any operations on the file descriptor after a successful import.
-
-    // Make a dup of importFenceFd before tranfering ownership to created fence.
-    mNativeFenceFd = dup(importFenceFd);
-
-    // Import FD - after creating fence.
-    VkImportFenceFdInfoKHR importFenceFdInfo = {};
-    importFenceFdInfo.sType                  = VK_STRUCTURE_TYPE_IMPORT_FENCE_FD_INFO_KHR;
-    importFenceFdInfo.pNext                  = nullptr;
-    importFenceFdInfo.fence                  = fence.get().getHandle();
-    importFenceFdInfo.flags                  = VK_FENCE_IMPORT_TEMPORARY_BIT_KHR;
-    importFenceFdInfo.handleType             = VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT;
-    importFenceFdInfo.fd                     = importFenceFd;
-
-    ANGLE_VK_TRY(contextVk, fence.get().importFd(device, importFenceFdInfo));
-    mFenceWithFd = fence.release();
     retain(&contextVk->getResourceUseList());
 
+    Serial serialOut;
+    // exportFd is exporting VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT_KHR type handle which
+    // obeys copy semantics. This means that the fence must already be signaled or the work to
+    // signal it is in the graphics pipeline at the time we export the fd. Thus we need to
+    // EnsureSubmitted here.
+    ANGLE_TRY(renderer->queueSubmitOneOff(contextVk, vk::PrimaryCommandBuffer(),
+                                          contextVk->getPriority(), &fence.get(),
+                                          vk::SubmitPolicy::EnsureSubmitted, &serialOut));
+
+    VkFenceGetFdInfoKHR fenceGetFdInfo = {};
+    fenceGetFdInfo.sType               = VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR;
+    fenceGetFdInfo.fence               = fence.get().getHandle();
+    fenceGetFdInfo.handleType          = VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT_KHR;
+    ANGLE_VK_TRY(contextVk, fence.get().exportFd(device, fenceGetFdInfo, &mNativeFenceFd));
+
+    mFenceWithFd = fence.release();
+
     return angle::Result::Continue;
 }
 
@@ -267,21 +300,22 @@
         ANGLE_TRY(contextVk->flushImpl(nullptr));
     }
 
-    // TODO: https://issuetracker.google.com/170312581 - If we are using worker need to wait for the
-    // commands to be issued before waiting on the fence.
-    if (contextVk->getRenderer()->getFeatures().asyncCommandQueue.enabled)
+    VkResult status = VK_SUCCESS;
+    if (mUse.valid())
     {
-        ANGLE_TRACE_EVENT0("gpu.angle", "SyncHelperNativeFence::clientWait");
-        ANGLE_TRY(contextVk->getRenderer()->waitForCommandProcessorIdle(contextVk));
+        // We have a valid serial to wait on
+        ANGLE_TRY(
+            renderer->waitForSerialWithUserTimeout(context, mUse.getSerial(), timeout, &status));
     }
-
-    // Wait for mFenceWithFd to be signaled.
-    VkResult status = mFenceWithFd.wait(renderer->getDevice(), timeout);
-
-    // Check for errors, but don't consider timeout as such.
-    if (status != VK_TIMEOUT)
+    else
     {
-        ANGLE_VK_TRY(context, status);
+        // We need to wait on the file descriptor
+
+        status = SyncWaitFd(mNativeFenceFd, timeout);
+        if (status != VK_TIMEOUT)
+        {
+            ANGLE_VK_TRY(contextVk, status);
+        }
     }
 
     *outResult = status;
@@ -290,11 +324,6 @@
 
 angle::Result SyncHelperNativeFence::serverWait(ContextVk *contextVk)
 {
-    if (!mFenceWithFd.valid())
-    {
-        return angle::Result::Stop;
-    }
-
     RendererVk *renderer = contextVk->getRenderer();
     VkDevice device      = renderer->getDevice();
 
@@ -323,8 +352,16 @@
 
 angle::Result SyncHelperNativeFence::getStatus(Context *context, bool *signaled) const
 {
-    VkResult result = mFenceWithFd.getStatus(context->getDevice());
-    if (result != VK_SUCCESS && result != VK_NOT_READY)
+    // We've got a serial, check if the serial is still in use
+    if (mUse.valid())
+    {
+        *signaled = !isCurrentlyInUse(context->getRenderer()->getLastCompletedQueueSerial());
+        return angle::Result::Continue;
+    }
+
+    // We don't have a serial, check status of the file descriptor
+    VkResult result = SyncWaitFd(mNativeFenceFd, 0);
+    if (result != VK_TIMEOUT)
     {
         ANGLE_VK_TRY(context, result);
     }
diff --git a/src/libANGLE/renderer/vulkan/TextureVk.cpp b/src/libANGLE/renderer/vulkan/TextureVk.cpp
index c4440ce..aefb31c 100644
--- a/src/libANGLE/renderer/vulkan/TextureVk.cpp
+++ b/src/libANGLE/renderer/vulkan/TextureVk.cpp
@@ -82,18 +82,66 @@
     return size == image.getLevelExtents(imageLevelIndexVk) && format == image.getFormat();
 }
 
+bool CanCopyWithTransferForTexImage(RendererVk *renderer,
+                                    const vk::Format &srcFormat,
+                                    VkImageTiling srcTilingMode,
+                                    const vk::Format &destFormat,
+                                    VkImageTiling destTilingMode)
+{
+    // For glTex[Sub]Image, only accept same-format transfers.
+    bool isFormatCompatible = srcFormat.intendedFormatID == destFormat.intendedFormatID;
+
+    return isFormatCompatible &&
+           vk::CanCopyWithTransfer(renderer, srcFormat, srcTilingMode, destFormat, destTilingMode);
+}
+
 bool CanCopyWithTransferForCopyTexture(RendererVk *renderer,
                                        const vk::Format &srcFormat,
                                        VkImageTiling srcTilingMode,
                                        const vk::Format &destFormat,
                                        VkImageTiling destTilingMode)
 {
-    // NOTE(syoussefi): technically, you can transfer between formats as long as they have the same
-    // size and are compatible, but for now, let's just support same-format copies with transfer.
-    bool isFormatCompatible = srcFormat.internalFormat == destFormat.internalFormat;
+    if (!vk::CanCopyWithTransfer(renderer, srcFormat, srcTilingMode, destFormat, destTilingMode))
+    {
+        return false;
+    }
 
-    return isFormatCompatible &&
-           vk::CanCopyWithTransfer(renderer, srcFormat, srcTilingMode, destFormat, destTilingMode);
+    // If the formats are identical, we can always transfer between them.
+    if (srcFormat.intendedFormatID == destFormat.intendedFormatID)
+    {
+        return true;
+    }
+
+    // If either format is emulated, cannot transfer.
+    if (srcFormat.hasEmulatedImageFormat() || destFormat.hasEmulatedImageFormat())
+    {
+        return false;
+    }
+
+    // Otherwise, allow transfer between compatible formats.  This is derived from the specification
+    // of CHROMIUM_copy_texture.
+    const angle::Format &srcAngleFormat  = srcFormat.actualImageFormat();
+    const angle::Format &destAngleFormat = destFormat.actualImageFormat();
+
+    const bool srcIsBGRA   = srcAngleFormat.isBGRA();
+    const bool srcHasR8    = srcAngleFormat.redBits == 8;
+    const bool srcHasG8    = srcAngleFormat.greenBits == 8;
+    const bool srcHasB8    = srcAngleFormat.blueBits == 8;
+    const bool srcHasA8    = srcAngleFormat.alphaBits == 8;
+    const bool srcIsSigned = srcAngleFormat.isSnorm() || srcAngleFormat.isSint();
+
+    const bool destIsBGRA   = destAngleFormat.isBGRA();
+    const bool destHasR8    = destAngleFormat.redBits == 8;
+    const bool destHasG8    = destAngleFormat.greenBits == 8;
+    const bool destHasB8    = destAngleFormat.blueBits == 8;
+    const bool destHasA8    = destAngleFormat.alphaBits == 8;
+    const bool destIsSigned = destAngleFormat.isSnorm() || destAngleFormat.isSint();
+
+    // Copy is allowed as long as they have the same number, ordering and sign of (8-bit) channels.
+    // CHROMIUM_copy_texture expects verbatim copy between these format, so this copy is done
+    // regardless of sRGB, normalized, etc.
+    return srcIsBGRA == destIsBGRA && srcHasR8 == destHasR8 && srcHasG8 == destHasG8 &&
+           srcHasB8 == destHasB8 && srcHasA8 == destHasA8 && srcIsSigned == destIsSigned;
 }
 
 bool CanCopyWithDraw(RendererVk *renderer,
@@ -706,8 +754,8 @@
                              clippedSourceArea.width, clippedSourceArea.height, 1);
 
     // If it's possible to perform the copy with a transfer, that's the best option.
-    if (!isViewportFlipY && CanCopyWithTransferForCopyTexture(renderer, srcFormat, srcTilingMode,
-                                                              destFormat, destTilingMode))
+    if (!isViewportFlipY && CanCopyWithTransferForTexImage(renderer, srcFormat, srcTilingMode,
+                                                           destFormat, destTilingMode))
     {
         return copySubImageImplWithTransfer(contextVk, offsetImageIndex, modifiedDestOffset,
                                             destFormat, colorReadRT->getLevelIndex(),
@@ -2582,7 +2630,8 @@
                                                                  : vk::ConvertToSRGB(imageFormat);
 
     VkImageFormatListCreateInfoKHR formatListInfo = {};
-    if (renderer->getFeatures().supportsImageFormatList.enabled)
+    if (renderer->getFeatures().supportsImageFormatList.enabled &&
+        renderer->haveSameFormatFeatureBits(imageFormat, imageListFormat))
     {
         mRequiresMutableStorage = true;
 
diff --git a/src/libANGLE/renderer/vulkan/TransformFeedbackVk.cpp b/src/libANGLE/renderer/vulkan/TransformFeedbackVk.cpp
index 2b5c3d0..881387b 100644
--- a/src/libANGLE/renderer/vulkan/TransformFeedbackVk.cpp
+++ b/src/libANGLE/renderer/vulkan/TransformFeedbackVk.cpp
@@ -135,17 +135,18 @@
 
 angle::Result TransformFeedbackVk::end(const gl::Context *context)
 {
+    ContextVk *contextVk = vk::GetImpl(context);
+
     // If there's an active transform feedback query, accumulate the primitives drawn.
     const gl::State &glState = context->getState();
     gl::Query *transformFeedbackQuery =
         glState.getActiveQuery(gl::QueryType::TransformFeedbackPrimitivesWritten);
 
-    if (transformFeedbackQuery)
+    if (transformFeedbackQuery && contextVk->getFeatures().emulateTransformFeedback.enabled)
     {
         vk::GetImpl(transformFeedbackQuery)->onTransformFeedbackEnd(mState.getPrimitivesDrawn());
     }
 
-    ContextVk *contextVk = vk::GetImpl(context);
     contextVk->onEndTransformFeedback();
     return angle::Result::Continue;
 }
diff --git a/src/libANGLE/renderer/vulkan/UtilsVk.cpp b/src/libANGLE/renderer/vulkan/UtilsVk.cpp
index e18a770..32a6f2b 100644
--- a/src/libANGLE/renderer/vulkan/UtilsVk.cpp
+++ b/src/libANGLE/renderer/vulkan/UtilsVk.cpp
@@ -32,25 +32,45 @@
 
 namespace
 {
-constexpr uint32_t kConvertIndexDestinationBinding           = 0;
-constexpr uint32_t kConvertVertexDestinationBinding          = 0;
-constexpr uint32_t kConvertVertexSourceBinding               = 1;
-constexpr uint32_t kImageCopySourceBinding                   = 0;
-constexpr uint32_t kBlitResolveColorOrDepthBinding           = 0;
-constexpr uint32_t kBlitResolveStencilBinding                = 1;
-constexpr uint32_t kBlitResolveSamplerBinding                = 2;
+constexpr uint32_t kConvertIndexDestinationBinding = 0;
+
+constexpr uint32_t kConvertVertexDestinationBinding = 0;
+constexpr uint32_t kConvertVertexSourceBinding      = 1;
+
+constexpr uint32_t kImageCopySourceBinding = 0;
+
+constexpr uint32_t kBlitResolveColorOrDepthBinding = 0;
+constexpr uint32_t kBlitResolveStencilBinding      = 1;
+constexpr uint32_t kBlitResolveSamplerBinding      = 2;
+
 constexpr uint32_t kBlitResolveStencilNoExportDestBinding    = 0;
 constexpr uint32_t kBlitResolveStencilNoExportSrcBinding     = 1;
 constexpr uint32_t kBlitResolveStencilNoExportSamplerBinding = 2;
-constexpr uint32_t kOverlayCullCulledWidgetsBinding          = 0;
-constexpr uint32_t kOverlayCullWidgetCoordsBinding           = 1;
-constexpr uint32_t kOverlayDrawOutputBinding                 = 0;
-constexpr uint32_t kOverlayDrawTextWidgetsBinding            = 1;
-constexpr uint32_t kOverlayDrawGraphWidgetsBinding           = 2;
-constexpr uint32_t kOverlayDrawCulledWidgetsBinding          = 3;
-constexpr uint32_t kOverlayDrawFontBinding                   = 4;
-constexpr uint32_t kGenerateMipmapDestinationBinding         = 0;
-constexpr uint32_t kGenerateMipmapSourceBinding              = 1;
+
+constexpr uint32_t kOverlayCullCulledWidgetsBinding = 0;
+constexpr uint32_t kOverlayCullWidgetCoordsBinding  = 1;
+
+constexpr uint32_t kOverlayDrawOutputBinding        = 0;
+constexpr uint32_t kOverlayDrawTextWidgetsBinding   = 1;
+constexpr uint32_t kOverlayDrawGraphWidgetsBinding  = 2;
+constexpr uint32_t kOverlayDrawCulledWidgetsBinding = 3;
+constexpr uint32_t kOverlayDrawFontBinding          = 4;
+
+constexpr uint32_t kGenerateMipmapDestinationBinding = 0;
+constexpr uint32_t kGenerateMipmapSourceBinding      = 1;
+
+constexpr uint32_t kFloatOneAsUint = 0x3F80'0000u;
+
+bool ValidateFloatOneAsUint()
+{
+    union
+    {
+        uint32_t asUint;
+        float asFloat;
+    } one;
+    one.asUint = kFloatOneAsUint;
+    return one.asFloat == 1.0f;
+}
 
 uint32_t GetConvertVertexFlags(const UtilsVk::ConvertVertexParameters &params)
 {
@@ -89,43 +109,43 @@
     if (srcIsHalfFloat && destIsHalfFloat)
     {
         // Note that HalfFloat conversion uses the same shader as Uint.
-        flags |= ConvertVertex_comp::kUintToUint;
+        flags = ConvertVertex_comp::kUintToUint;
     }
     else if (srcIsFloat && destIsHalfFloat)
     {
-        flags |= ConvertVertex_comp::kFloatToHalf;
+        flags = ConvertVertex_comp::kFloatToHalf;
     }
     else if (srcIsSint && destIsSint)
     {
-        flags |= ConvertVertex_comp::kSintToSint;
+        flags = ConvertVertex_comp::kSintToSint;
     }
     else if (srcIsUint && destIsUint)
     {
-        flags |= ConvertVertex_comp::kUintToUint;
+        flags = ConvertVertex_comp::kUintToUint;
     }
     else if (srcIsSint)
     {
-        flags |= ConvertVertex_comp::kSintToFloat;
+        flags = ConvertVertex_comp::kSintToFloat;
     }
     else if (srcIsUint)
     {
-        flags |= ConvertVertex_comp::kUintToFloat;
+        flags = ConvertVertex_comp::kUintToFloat;
     }
     else if (srcIsSnorm)
     {
-        flags |= ConvertVertex_comp::kSnormToFloat;
+        flags = ConvertVertex_comp::kSnormToFloat;
     }
     else if (srcIsUnorm)
     {
-        flags |= ConvertVertex_comp::kUnormToFloat;
+        flags = ConvertVertex_comp::kUnormToFloat;
     }
     else if (srcIsFixed)
     {
-        flags |= ConvertVertex_comp::kFixedToFloat;
+        flags = ConvertVertex_comp::kFixedToFloat;
     }
     else if (srcIsFloat)
     {
-        flags |= ConvertVertex_comp::kFloatToFloat;
+        flags = ConvertVertex_comp::kFloatToFloat;
     }
     else
     {
@@ -1279,8 +1299,6 @@
                                            vk::BufferHelper *src,
                                            const ConvertVertexParameters &params)
 {
-    ANGLE_TRY(ensureConvertVertexResourcesInitialized(contextVk));
-
     vk::CommandBufferAccess access;
     access.onBufferComputeShaderRead(src);
     access.onBufferComputeShaderWrite(dest);
@@ -1321,6 +1339,59 @@
 
     uint32_t flags = GetConvertVertexFlags(params);
 
+    // See GLES3.0 section 2.9.1 Transferring Array Elements
+    const uint32_t srcValueBits = shaderParams.isSrcHDR ? 2 : shaderParams.Bs * 8;
+    const uint32_t srcValueMask =
+        srcValueBits == 32 ? 0xFFFFFFFFu : angle::Bit<uint32_t>(srcValueBits) - 1;
+    switch (flags)
+    {
+        case ConvertVertex_comp::kSintToSint:
+        case ConvertVertex_comp::kUintToUint:
+        case ConvertVertex_comp::kSintToFloat:
+        case ConvertVertex_comp::kUintToFloat:
+            // For integers, alpha should take a value of 1.
+            shaderParams.srcEmulatedAlpha = 1;
+            break;
+
+        case ConvertVertex_comp::kSnormToFloat:
+            // The largest signed number with as many bits as the alpha channel of the source is
+            // 0b011...1 which is srcValueMask >> 1
+            shaderParams.srcEmulatedAlpha = srcValueMask >> 1;
+            break;
+
+        case ConvertVertex_comp::kUnormToFloat:
+            // The largest unsigned number with as many bits as the alpha channel of the source is
+            // 0b11...1 which is srcValueMask
+            shaderParams.srcEmulatedAlpha = srcValueMask;
+            break;
+
+        case ConvertVertex_comp::kFixedToFloat:
+            // 1.0 in fixed point is 0x10000
+            shaderParams.srcEmulatedAlpha = 0x10000;
+            break;
+
+        case ConvertVertex_comp::kFloatToHalf:
+        case ConvertVertex_comp::kFloatToFloat:
+            ASSERT(ValidateFloatOneAsUint());
+            shaderParams.srcEmulatedAlpha = kFloatOneAsUint;
+            break;
+
+        default:
+            UNREACHABLE();
+    }
+
+    return convertVertexBufferImpl(contextVk, dest, src, flags, commandBuffer, shaderParams);
+}
+
+angle::Result UtilsVk::convertVertexBufferImpl(ContextVk *contextVk,
+                                               vk::BufferHelper *dest,
+                                               vk::BufferHelper *src,
+                                               uint32_t flags,
+                                               vk::CommandBuffer *commandBuffer,
+                                               const ConvertVertexShaderParams &shaderParams)
+{
+    ANGLE_TRY(ensureConvertVertexResourcesInitialized(contextVk));
+
     VkDescriptorSet descriptorSet;
     vk::RefCountedDescriptorPoolBinding descriptorPoolBinding;
     ANGLE_TRY(allocateDescriptorSet(contextVk, Function::ConvertVertexBuffer,
@@ -1446,7 +1517,7 @@
     shaderParams.clearDepth = params.depthStencilClearValue.depth;
 
     vk::GraphicsPipelineDesc pipelineDesc;
-    pipelineDesc.initDefaults();
+    pipelineDesc.initDefaults(contextVk);
     pipelineDesc.setCullMode(VK_CULL_MODE_NONE);
     pipelineDesc.setColorWriteMasks(0, gl::DrawBufferMask(), gl::DrawBufferMask());
     pipelineDesc.setSingleColorWriteMask(params.colorAttachmentIndexGL, params.colorMaskFlags);
@@ -1526,15 +1597,26 @@
                            imageClearProgram, &pipelineDesc, VK_NULL_HANDLE, &shaderParams,
                            sizeof(shaderParams), commandBuffer));
 
+    // Make sure transform feedback is paused
+    contextVk->pauseTransformFeedbackIfStartedAndRebindBuffersOnResume();
+
     // Make sure this draw call doesn't count towards occlusion query results.
-    ANGLE_TRY(contextVk->pauseOcclusionQueryIfActive());
+    contextVk->pauseRenderPassQueriesIfActive();
     commandBuffer->setScissor(0, 1, &scissor);
     commandBuffer->draw(3, 0);
-    ANGLE_TRY(contextVk->resumeOcclusionQueryIfActive());
+    ANGLE_TRY(contextVk->resumeRenderPassQueriesIfActive());
 
     // Make sure what's bound here is correctly reverted on the next draw.
     contextVk->invalidateGraphicsPipelineAndDescriptorSets();
 
+    // If transform feedback was active, we can't pause and resume it in the same render pass
+    // because we can't insert a memory barrier for the counter buffers.  In that case, break the
+    // render pass.
+    if (contextVk->getStartedRenderPassCommands().isTransformFeedbackStarted())
+    {
+        ANGLE_TRY(contextVk->flushCommandsAndEndRenderPass());
+    }
+
     return angle::Result::Continue;
 }
 
@@ -1692,7 +1774,7 @@
         VK_COLOR_COMPONENT_A_BIT;
 
     vk::GraphicsPipelineDesc pipelineDesc;
-    pipelineDesc.initDefaults();
+    pipelineDesc.initDefaults(contextVk);
     if (blitColor)
     {
         pipelineDesc.setColorWriteMasks(
@@ -1931,7 +2013,7 @@
     ASSERT(depthStencilRenderTarget != nullptr);
     vk::ImageHelper *depthStencilImage = &depthStencilRenderTarget->getImageForWrite();
 
-    // Change source layout prior to computation.
+    // Change layouts prior to computation.
     vk::CommandBufferAccess access;
     access.onImageComputeShaderRead(src->getAspectFlags(), src);
     access.onImageTransferWrite(depthStencilRenderTarget->getLevelIndex(), 1,
@@ -1995,10 +2077,8 @@
     memoryBarrier.srcAccessMask   = VK_ACCESS_SHADER_WRITE_BIT;
     memoryBarrier.dstAccessMask   = VK_ACCESS_TRANSFER_READ_BIT;
 
-    // Use the all pipe stage to keep the state management simple.
-    commandBuffer->pipelineBarrier(VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
-                                   VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1, &memoryBarrier, 0, nullptr,
-                                   0, nullptr);
+    commandBuffer->memoryBarrier(VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
+                                 VK_PIPELINE_STAGE_TRANSFER_BIT, &memoryBarrier);
 
     // Copy the resulting buffer into dest.
     VkBufferImageCopy region           = {};
@@ -2007,8 +2087,7 @@
     region.bufferImageHeight           = params.blitArea.height;
     region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
     region.imageSubresource.mipLevel =
-        depthStencilImage->toVkLevel(gl::LevelIndex(depthStencilRenderTarget->getLevelIndex()))
-            .get();
+        depthStencilImage->toVkLevel(depthStencilRenderTarget->getLevelIndex()).get();
     region.imageSubresource.baseArrayLayer = depthStencilRenderTarget->getLayerIndex();
     region.imageSubresource.layerCount     = 1;
     region.imageOffset.x                   = params.blitArea.x;
@@ -2136,7 +2215,7 @@
     ASSERT(src->getSamples() == 1);
 
     vk::GraphicsPipelineDesc pipelineDesc;
-    pipelineDesc.initDefaults();
+    pipelineDesc.initDefaults(contextVk);
     pipelineDesc.setCullMode(VK_CULL_MODE_NONE);
     pipelineDesc.setRenderPassDesc(renderPassDesc);
     pipelineDesc.setRasterizationSamples(dest->getSamples());
@@ -2207,6 +2286,237 @@
     return angle::Result::Continue;
 }
 
+angle::Result UtilsVk::copyImageBits(ContextVk *contextVk,
+                                     vk::ImageHelper *dest,
+                                     vk::ImageHelper *src,
+                                     const CopyImageBitsParameters &params)
+{
+    // This function is used to copy the bit representation of an image to another, and is used to
+    // support EXT_copy_image when a format is emulated.  Currently, only RGB->RGBA emulation is
+    // possible, and so this function is tailored to this specific kind of emulation.
+    //
+    // The copy can be done with various degrees of efficiency:
+    //
+    // - If the UINT reinterpretation format for src supports SAMPLED usage, texels can be read
+    //   directly from that.  Otherwise vkCmdCopyImageToBuffer can be used and data then read from
+    //   the buffer.
+    // - If the UINT reinterpretation format for dest supports STORAGE usage, texels can be written
+    //   directly to that.  Otherwise conversion can be done to a buffer and then
+    //   vkCmdCopyBufferToImage used.
+    //
+    // This requires four different shaders.  For simplicity, this function unconditionally copies
+    // src to a temp buffer, transforms to another temp buffer and copies to the dest.  No known
+    // applications use EXT_copy_image on RGB formats, so no further optimization is currently
+    // necessary.
+    //
+    // The conversion between buffers can be done with ConvertVertex.comp in UintToUint mode, so no
+    // new shader is necessary.  The srcEmulatedAlpha parameter is used to make sure the destination
+    // alpha value is correct, if dest is RGBA.
+
+    const vk::Format &srcFormat = src->getFormat();
+    const vk::Format &dstFormat = dest->getFormat();
+
+    // This path should only be necessary for when RGBA is used as fallback for RGB.  No other
+    // format which can be used with EXT_copy_image has a fallback.
+    ASSERT(srcFormat.intendedFormat().blueBits > 0 && srcFormat.intendedFormat().alphaBits == 0);
+    ASSERT(dstFormat.intendedFormat().blueBits > 0 && dstFormat.intendedFormat().alphaBits == 0);
+
+    const angle::Format &srcImageFormat = srcFormat.actualImageFormat();
+    const angle::Format &dstImageFormat = dstFormat.actualImageFormat();
+
+    // Create temporary buffers.
+    vk::RendererScoped<vk::BufferHelper> srcBuffer(contextVk->getRenderer());
+    vk::RendererScoped<vk::BufferHelper> dstBuffer(contextVk->getRenderer());
+
+    const uint32_t srcPixelBytes = srcImageFormat.pixelBytes;
+    const uint32_t dstPixelBytes = dstImageFormat.pixelBytes;
+
+    const uint32_t totalPixelCount =
+        params.copyExtents[0] * params.copyExtents[1] * params.copyExtents[2];
+    // Note that buffer sizes are rounded up a multiple of uint size, as that the granularity in
+    // which the compute shader accesses these buffers.
+    const VkDeviceSize srcBufferSize =
+        roundUpPow2<uint32_t>(srcPixelBytes * totalPixelCount, sizeof(uint32_t));
+    const VkDeviceSize dstBufferSize =
+        roundUpPow2<uint32_t>(dstPixelBytes * totalPixelCount, sizeof(uint32_t));
+
+    VkBufferCreateInfo bufferInfo = {};
+    bufferInfo.sType              = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
+    bufferInfo.flags              = 0;
+    bufferInfo.size               = srcBufferSize;
+    bufferInfo.usage       = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
+    bufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
+    bufferInfo.queueFamilyIndexCount = 0;
+    bufferInfo.pQueueFamilyIndices   = nullptr;
+
+    ANGLE_TRY(srcBuffer.get().init(contextVk, bufferInfo, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT));
+
+    bufferInfo.size  = dstBufferSize;
+    bufferInfo.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
+
+    ANGLE_TRY(dstBuffer.get().init(contextVk, bufferInfo, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT));
+
+    srcBuffer.get().retain(&contextVk->getResourceUseList());
+    dstBuffer.get().retain(&contextVk->getResourceUseList());
+
+    bool isSrc3D = src->getType() == VK_IMAGE_TYPE_3D;
+    bool isDst3D = dest->getType() == VK_IMAGE_TYPE_3D;
+
+    // Change layouts prior to computation.
+    vk::CommandBufferAccess access;
+    access.onImageTransferRead(src->getAspectFlags(), src);
+    access.onImageTransferWrite(params.dstLevel, 1, isDst3D ? 0 : params.dstOffset[2],
+                                isDst3D ? 1 : params.copyExtents[2], VK_IMAGE_ASPECT_COLOR_BIT,
+                                dest);
+
+    vk::CommandBuffer *commandBuffer;
+    ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer));
+
+    // Copy src into buffer, completely packed.
+    VkBufferImageCopy srcRegion               = {};
+    srcRegion.imageSubresource.aspectMask     = VK_IMAGE_ASPECT_COLOR_BIT;
+    srcRegion.imageSubresource.mipLevel       = src->toVkLevel(params.srcLevel).get();
+    srcRegion.imageSubresource.baseArrayLayer = isSrc3D ? 0 : params.srcOffset[2];
+    srcRegion.imageSubresource.layerCount     = isSrc3D ? 1 : params.copyExtents[2];
+    srcRegion.imageOffset.x                   = params.srcOffset[0];
+    srcRegion.imageOffset.y                   = params.srcOffset[1];
+    srcRegion.imageOffset.z                   = isSrc3D ? params.srcOffset[2] : 0;
+    srcRegion.imageExtent.width               = params.copyExtents[0];
+    srcRegion.imageExtent.height              = params.copyExtents[1];
+    srcRegion.imageExtent.depth               = isSrc3D ? params.copyExtents[2] : 1;
+
+    commandBuffer->copyImageToBuffer(src->getImage(), src->getCurrentLayout(),
+                                     srcBuffer.get().getBuffer().getHandle(), 1, &srcRegion);
+
+    // Add a barrier prior to dispatch call.
+    VkMemoryBarrier memoryBarrier = {};
+    memoryBarrier.sType           = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
+    memoryBarrier.srcAccessMask   = VK_ACCESS_TRANSFER_WRITE_BIT;
+    memoryBarrier.dstAccessMask   = VK_ACCESS_SHADER_READ_BIT;
+
+    commandBuffer->memoryBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT,
+                                 VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, &memoryBarrier);
+
+    // Set up ConvertVertex shader to convert between the formats.  Only the following three cases
+    // are possible:
+    //
+    // - RGB -> RGBA: Ns = 3, Ss = src.pixelBytes,
+    //                Nd = 4, Sd = dst.pixelBytes, use srcEmulatedAlpha
+    //
+    // - RGBA -> RGBA: Ns = 3, Ss = src.pixelBytes,
+    //                 Nd = 4, Sd = dst.pixelBytes, use srcEmulatedAlpha
+    //
+    // - RGBA -> RGB:  Ns = 3, Ss = src.pixelBytes,
+    //                 Nd = 3, Sd = dst.pixelBytes
+    //
+    // The trick here is with RGBA -> RGBA, where Ns is specified as 3, so that the emulated alpha
+    // from source is not taken (as uint), but rather one is provided such that the destination
+    // alpha would contain the correct emulated alpha.
+    //
+    ConvertVertexShaderParams shaderParams;
+    shaderParams.Ns = 3;
+    shaderParams.Bs = srcImageFormat.pixelBytes / srcImageFormat.channelCount;
+    shaderParams.Ss = srcImageFormat.pixelBytes;
+    shaderParams.Nd = dstImageFormat.channelCount;
+    shaderParams.Bd = dstImageFormat.pixelBytes / dstImageFormat.channelCount;
+    shaderParams.Sd = shaderParams.Nd * shaderParams.Bd;
+    // The component size is expected to either be 1, 2 or 4 bytes.
+    ASSERT(4 % shaderParams.Bs == 0);
+    ASSERT(4 % shaderParams.Bd == 0);
+    shaderParams.Es = 4 / shaderParams.Bs;
+    shaderParams.Ed = 4 / shaderParams.Bd;
+    // Total number of output components is simply the number of pixels by number of components in
+    // each.
+    shaderParams.componentCount = totalPixelCount * shaderParams.Nd;
+    // Total number of 4-byte outputs is the number of components divided by how many components can
+    // fit in a 4-byte value.  Note that this value is also the invocation size of the shader.
+    shaderParams.outputCount  = shaderParams.componentCount / shaderParams.Ed;
+    shaderParams.srcOffset    = 0;
+    shaderParams.destOffset   = 0;
+    shaderParams.isSrcHDR     = 0;
+    shaderParams.isSrcA2BGR10 = 0;
+
+    // Due to the requirements of EXT_copy_image, the channel size of src and dest must be
+    // identical.  Usage of srcEmulatedAlpha relies on this as it's used to output an alpha value in
+    // dest through the source.
+    ASSERT(shaderParams.Bs == shaderParams.Bd);
+
+    // The following RGB formats are allowed in EXT_copy_image:
+    //
+    // - RGB32F, RGB32UI, RGB32I
+    // - RGB16F, RGB16UI, RGB16I
+    // - RGB8, RGB8_SNORM, SRGB8, RGB8UI, RGB8I
+    //
+    // The value of emulated alpha is:
+    //
+    // - 1 for all RGB*I and RGB*UI formats
+    // - bit representation of 1.0f for RGB32F
+    // - bit representation of half-float 1.0f for RGB16F
+    // - 0xFF for RGB8 and SRGB8
+    // - 0x7F for RGB8_SNORM
+    if (dstImageFormat.isInt())
+    {
+        shaderParams.srcEmulatedAlpha = 1;
+    }
+    else if (dstImageFormat.isUnorm())
+    {
+        ASSERT(shaderParams.Bd == 1);
+        shaderParams.srcEmulatedAlpha = 0xFF;
+    }
+    else if (dstImageFormat.isSnorm())
+    {
+        ASSERT(shaderParams.Bd == 1);
+        shaderParams.srcEmulatedAlpha = 0x7F;
+    }
+    else if (shaderParams.Bd == 2)
+    {
+        ASSERT(dstImageFormat.isFloat());
+        // 1.0 in half-float is represented with 0 01111 0000000000
+        shaderParams.srcEmulatedAlpha = 0x3C00;
+    }
+    else if (shaderParams.Bd == 4)
+    {
+        ASSERT(dstImageFormat.isFloat());
+        ASSERT(ValidateFloatOneAsUint());
+        shaderParams.srcEmulatedAlpha = kFloatOneAsUint;
+    }
+    else
+    {
+        UNREACHABLE();
+    }
+
+    // Use UintToUint conversion to preserve the bit pattern during transfer.
+    const uint32_t flags = ConvertVertex_comp::kUintToUint;
+
+    ANGLE_TRY(convertVertexBufferImpl(contextVk, &dstBuffer.get(), &srcBuffer.get(), flags,
+                                      commandBuffer, shaderParams));
+
+    // Add a barrier prior to copy.
+    memoryBarrier.srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT;
+    memoryBarrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
+
+    commandBuffer->memoryBarrier(VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
+                                 VK_PIPELINE_STAGE_TRANSFER_BIT, &memoryBarrier);
+
+    // Copy buffer into dst.  It's completely packed.
+    VkBufferImageCopy dstRegion               = {};
+    dstRegion.imageSubresource.aspectMask     = VK_IMAGE_ASPECT_COLOR_BIT;
+    dstRegion.imageSubresource.mipLevel       = dest->toVkLevel(params.dstLevel).get();
+    dstRegion.imageSubresource.baseArrayLayer = isDst3D ? 0 : params.dstOffset[2];
+    dstRegion.imageSubresource.layerCount     = isDst3D ? 1 : params.copyExtents[2];
+    dstRegion.imageOffset.x                   = params.dstOffset[0];
+    dstRegion.imageOffset.y                   = params.dstOffset[1];
+    dstRegion.imageOffset.z                   = isDst3D ? params.dstOffset[2] : 0;
+    dstRegion.imageExtent.width               = params.copyExtents[0];
+    dstRegion.imageExtent.height              = params.copyExtents[1];
+    dstRegion.imageExtent.depth               = isDst3D ? params.copyExtents[2] : 1;
+
+    commandBuffer->copyBufferToImage(dstBuffer.get().getBuffer().getHandle(), dest->getImage(),
+                                     dest->getCurrentLayout(), 1, &dstRegion);
+
+    return angle::Result::Continue;
+}
+
 angle::Result UtilsVk::generateMipmap(ContextVk *contextVk,
                                       vk::ImageHelper *src,
                                       const vk::ImageView *srcLevelZeroView,
@@ -2330,8 +2640,8 @@
         ASSERT(depthStencilSrc->getSamples() == 1);
         gl::TextureType textureType = vk::Get2DTextureType(depthStencilSrc->getLayerCount(), 1);
 
-        const vk::LevelIndex levelIndex = gl_vk::GetLevelIndex(
-            depthStencilRenderTarget->getLevelIndex(), depthStencilSrc->getBaseLevel());
+        const vk::LevelIndex levelIndex =
+            depthStencilSrc->toVkLevel(depthStencilRenderTarget->getLevelIndex());
         const uint32_t layerIndex = depthStencilRenderTarget->getLayerIndex();
 
         if (params.unresolveDepth)
@@ -2363,7 +2673,7 @@
     ANGLE_TRY(ensureUnresolveResourcesInitialized(contextVk, function, totalBindingCount));
 
     vk::GraphicsPipelineDesc pipelineDesc;
-    pipelineDesc.initDefaults();
+    pipelineDesc.initDefaults(contextVk);
     pipelineDesc.setCullMode(VK_CULL_MODE_NONE);
     pipelineDesc.setRasterizationSamples(framebuffer->getSamples());
     pipelineDesc.setRenderPassDesc(framebuffer->getRenderPassDesc());
diff --git a/src/libANGLE/renderer/vulkan/UtilsVk.h b/src/libANGLE/renderer/vulkan/UtilsVk.h
index fd097bc..b9d9d65 100644
--- a/src/libANGLE/renderer/vulkan/UtilsVk.h
+++ b/src/libANGLE/renderer/vulkan/UtilsVk.h
@@ -14,6 +14,8 @@
 //        unsupported formats to their fallbacks.
 //    - Image clear: Used by FramebufferVk::clearWithDraw().
 //    - Image copy: Used by TextureVk::copySubImageImplWithDraw().
+//    - Image copy bits: Used by ImageHelper::CopyImageSubData() to perform bitwise copies between
+//      RGB formats where at least one of src and dest use RGBA as fallback.
 //    - Color blit/resolve: Used by FramebufferVk::blit() to implement blit or multisample resolve
 //      on color images.
 //    - Depth/Stencil blit/resolve: Used by FramebufferVk::blit() to implement blit or multisample
@@ -141,6 +143,15 @@
         SurfaceRotation srcRotation;
     };
 
+    struct CopyImageBitsParameters
+    {
+        int srcOffset[3];
+        gl::LevelIndex srcLevel;
+        int dstOffset[3];
+        gl::LevelIndex dstLevel;
+        uint32_t copyExtents[3];
+    };
+
     struct OverlayCullParameters
     {
         uint32_t subgroupSize[2];
@@ -236,6 +247,11 @@
                             const vk::ImageView *srcView,
                             const CopyImageParameters &params);
 
+    angle::Result copyImageBits(ContextVk *contextVk,
+                                vk::ImageHelper *dest,
+                                vk::ImageHelper *src,
+                                const CopyImageBitsParameters &params);
+
     using GenerateMipmapDestLevelViews =
         std::array<const vk::ImageView *, kGenerateMipmapMaxLevels>;
     angle::Result generateMipmap(ContextVk *contextVk,
@@ -309,21 +325,22 @@
         ConvertVertexShaderParams();
 
         // Structure matching PushConstants in ConvertVertex.comp
-        uint32_t outputCount    = 0;
-        uint32_t componentCount = 0;
-        uint32_t srcOffset      = 0;
-        uint32_t destOffset     = 0;
-        uint32_t Ns             = 0;
-        uint32_t Bs             = 0;
-        uint32_t Ss             = 0;
-        uint32_t Es             = 0;
-        uint32_t Nd             = 0;
-        uint32_t Bd             = 0;
-        uint32_t Sd             = 0;
-        uint32_t Ed             = 0;
-        uint32_t isSrcHDR       = 0;
-        uint32_t isSrcA2BGR10   = 0;
-        uint32_t _padding[2]    = {};
+        uint32_t outputCount      = 0;
+        uint32_t componentCount   = 0;
+        uint32_t srcOffset        = 0;
+        uint32_t destOffset       = 0;
+        uint32_t Ns               = 0;
+        uint32_t Bs               = 0;
+        uint32_t Ss               = 0;
+        uint32_t Es               = 0;
+        uint32_t Nd               = 0;
+        uint32_t Bd               = 0;
+        uint32_t Sd               = 0;
+        uint32_t Ed               = 0;
+        uint32_t srcEmulatedAlpha = 0;
+        uint32_t isSrcHDR         = 0;
+        uint32_t isSrcA2BGR10     = 0;
+        uint32_t _padding         = 0;
     };
 
     struct ImageClearShaderParams
@@ -495,6 +512,14 @@
                                   const gl::Rectangle &renderArea,
                                   vk::CommandBuffer **commandBufferOut);
 
+    // Set up descriptor set and call dispatch.
+    angle::Result convertVertexBufferImpl(ContextVk *contextVk,
+                                          vk::BufferHelper *dest,
+                                          vk::BufferHelper *src,
+                                          uint32_t flags,
+                                          vk::CommandBuffer *commandBuffer,
+                                          const ConvertVertexShaderParams &shaderParams);
+
     // Blits or resolves either color or depth/stencil, based on which view is given.
     angle::Result blitResolveImpl(ContextVk *contextVk,
                                   FramebufferVk *framebuffer,
diff --git a/src/libANGLE/renderer/vulkan/android/HardwareBufferImageSiblingVkAndroid.cpp b/src/libANGLE/renderer/vulkan/android/HardwareBufferImageSiblingVkAndroid.cpp
index e99ab4b..304e311 100644
--- a/src/libANGLE/renderer/vulkan/android/HardwareBufferImageSiblingVkAndroid.cpp
+++ b/src/libANGLE/renderer/vulkan/android/HardwareBufferImageSiblingVkAndroid.cpp
@@ -183,12 +183,17 @@
 
     if (bufferFormatProperties.format == VK_FORMAT_UNDEFINED)
     {
+        ANGLE_VK_CHECK(displayVk, bufferFormatProperties.externalFormat != 0, VK_ERROR_UNKNOWN);
         externalFormat.externalFormat = bufferFormatProperties.externalFormat;
 
         // VkImageCreateInfo struct: If the pNext chain includes a VkExternalFormatANDROID structure
         // whose externalFormat member is not 0, usage must not include any usages except
         // VK_IMAGE_USAGE_SAMPLED_BIT
         usage = VK_IMAGE_USAGE_SAMPLED_BIT;
+
+        // If the pNext chain includes a VkExternalFormatANDROID structure whose externalFormat
+        // member is not 0, tiling must be VK_IMAGE_TILING_OPTIMAL
+        imageTilingMode = VK_IMAGE_TILING_OPTIMAL;
     }
 
     // With the introduction of sRGB related GLES extensions any texture could be respecified
diff --git a/src/libANGLE/renderer/vulkan/display/WindowSurfaceVkSimple.h b/src/libANGLE/renderer/vulkan/display/WindowSurfaceVkSimple.h
index e5412ad..b43a962 100644
--- a/src/libANGLE/renderer/vulkan/display/WindowSurfaceVkSimple.h
+++ b/src/libANGLE/renderer/vulkan/display/WindowSurfaceVkSimple.h
@@ -15,7 +15,7 @@
 namespace rx
 {
 
-class WindowSurfaceVkSimple : public WindowSurfaceVk
+class WindowSurfaceVkSimple final : public WindowSurfaceVk
 {
   public:
     WindowSurfaceVkSimple(const egl::SurfaceState &surfaceState, EGLNativeWindowType window);
diff --git a/src/libANGLE/renderer/vulkan/doc/Queries.md b/src/libANGLE/renderer/vulkan/doc/Queries.md
new file mode 100644
index 0000000..e52365b
--- /dev/null
+++ b/src/libANGLE/renderer/vulkan/doc/Queries.md
@@ -0,0 +1,140 @@
+# Queries
+
+OpenGL queries generally have a straightforward mapping to Vulkan queries, with the exception of
+`GL_PRIMITIVES_GENERATED`.  Some Vulkan queries are active only inside a render pass, while others
+are affected by both inside and outside render pass commands.
+
+## Outside Render Pass Queries
+
+The following queries are recorded outside a render pass.  If a render pass is active when
+`begin()` or `end()` is called for these queries, it will be broken.
+
+- `GL_TIME_ELAPSED_EXT`
+- `GL_TIMESTAMP_EXT`
+
+## Inside Render Pass Queries
+
+The rest of the queries are active only inside render passes.  The context (`ContextVk`) keeps track
+of currently active "render pass queries" and automatically pauses and resumes them as render passes
+are broken and started again.
+
+- On query `begin()`: `ContextVk::beginRenderPassQuery()` is called which:
+  * If a render pass is open, immediately starts the query and keeps track of it
+  * Otherwise keeps the query tracked to be started in the next render pass
+- On query `end()`: `ContextVk::endRenderPassQuery()` is called which:
+  * If a render pass is open, stops the query
+  * Loses track of the query
+- On render pass start: `ContextVk::resumeRenderPassQueriesIfActive()` is called which starts all
+  active queries.
+- On render pass end: `ContextVk::pauseRenderPassQueriesIfActive()` is called which stops all
+  active queries.
+
+In Vulkan, a query cannot be paused or resumed, only begun and ended.  This means that GL queries
+that span multiple render passes must use multiple Vulkan queries whose results are accumulated.
+This is done on render pass start, where `QueryVk::onRenderPassStart()` would stash the previous
+Vulkan query (if any) and create a new one before starting it.  When a query is begun, the
+`QueryVk`'s "current" Vulkan query (`mQueryHelper`) is only allocated if there's a render pass
+active.
+
+**Invariant rule**: With the above algorithm, `QueryVk::mQueryHelper` is at all times either
+`nullptr` or has commands recorded.  This is important when getting query results to be able to
+ask `mQueryHelper` for availability of results.
+
+Later on, `QueryVk::getResult()` would take the sum of the current and all stashed Vulkan queries as
+the final result.
+
+### Mid-Render-Pass Clears
+
+If a clear is performed while a render pass query is active and if that clear needs to take a
+draw-based path, `UtilsVk` ensures that the draw call does not contribute to query results.  This is
+done by pausing (`ContextVk::pauseRenderPassQueriesIfActive`) the queries before the draw call and
+resuming (`ContextVk::resumeRenderPassQueriesIfActive`) afterwards.
+
+The rest of the `UtilsVk` draw-based functions start a render pass out of the knowledge of
+`ContextVk`, so queries will not be activated.  In the future, if any `UtilsVk` functions use the
+current render pass the way `UtilsVk::clearFramebuffer` does, they must also ensure that they pause
+and resume queries.
+
+### Transform Feedback Queries
+
+OpenGL has two distinct queries `GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN` and
+`GL_PRIMITIVES_GENERATED`.  In Vulkan however, these are served by a single query from
+`VK_EXT_transform_feedback`.  Additionally, Vulkan requires that only a single query of any type can
+be active at a time.  This forces ANGLE to have the two GL queries share their Vulkan queries when
+both transform feedback queries are active.
+
+To support the above use case, `QueryVk`s keep ref-counted (`vk::Shared`) Vulkan query
+(`vk::QueryHelper`) objects.  When either transform feedback query is begun:
+
+- If the other transform feedback query (`shareQuery`) is active and a render pass is active:
+  * `shareQuery`'s current Vulkan query is stopped and stashed, and a new one is allocated
+  * `shareQuery`'s new Vulkan query is taken as this query's current one with the ref-count
+     incremented
+  * The Vulkan query is started as usual
+- If the other transform feedback query is active and a render pass is not:
+  * The current Vulkan query is kept `nullptr`.  When the next render pass starts, they will share
+    their Vulkan queries.
+- If the other transform feedback query is not active, proceed as usual
+
+Breaking the `shareQuery`'s Vulkan query on begin ensures that whatever results it may have accrued
+before do not contribute to this query.
+
+Similarly, when a transform feedback query is ended, the Vulkan query is ended as usual and then:
+
+- If the other transform feedback query is active and a render pass is active:
+  * `shareQuery`'s Vulkan query (which is the same as this query's, as they share it) is stashed
+  * `shareQuery` allocates a new Vulkan query and starts it
+
+When a render pass is broken and active queries are paused
+(`ContextVk::pauseRenderPassQueriesIfActive`), only one of the queries will close the shared Vulkan
+query.
+
+When a render pass is started and active queries are resumed
+(`ContextVk::resumeRenderPassQueriesIfActive`), only one of the queries will allocate and start a
+new Vulkan query.  The other one will just take that and share it (and increment the ref-count).
+
+The above solution supports the following scenarios:
+
+- Simultaneous begin of the two queries:
+
+```
+glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN)
+glBeginQuery(GL_PRIMITIVES_GENERATED)
+glDraw*()
+```
+
+- Simultaneous end of the two queries:
+
+```
+glDraw*()
+glEndQuery(GL_PRIMITIVES_GENERATED)
+glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN)
+```
+
+- Draw calls between begin calls:
+
+```
+glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN)
+glDraw*()
+glBeginQuery(GL_PRIMITIVES_GENERATED)
+glDraw*()
+```
+
+- Draw calls between end calls:
+
+```
+glDraw*()
+glEndQuery(GL_PRIMITIVES_GENERATED)
+glDraw*()
+glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN)
+```
+
+- Queries getting deleted / rebound when the other is active, for example:
+
+```
+glDraw*()
+glEndQuery(GL_PRIMITIVES_GENERATED)
+glDeleteQueries(primitivesGenerated)
+glDraw*()
+glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN)
+```
diff --git a/src/libANGLE/renderer/vulkan/doc/TransformFeedbackViaExtension.md b/src/libANGLE/renderer/vulkan/doc/TransformFeedbackViaExtension.md
index d7f4513..fb9ee45 100644
--- a/src/libANGLE/renderer/vulkan/doc/TransformFeedbackViaExtension.md
+++ b/src/libANGLE/renderer/vulkan/doc/TransformFeedbackViaExtension.md
@@ -4,10 +4,7 @@
 
 ANGLE emulates transform feedback using the vertexPipelineStoresAndAtomics features in Vulkan.
 But some GPU vendors do not support these atomics. Also the emulation becomes more difficult in
-GLES 3.2. Therefore ANGLE must support using the VK_EXT_transform_feedback extension .
-
-But some GPU vendor does not support this feature, So we need another implementation using
-VK_EXT_transform_feedback.
+GLES 3.2. Therefore ANGLE must support using the VK_EXT_transform_feedback extension.
 
 We also expect a performance gain when we use this extension.
 
@@ -37,66 +34,12 @@
 There is no equivalent function for glTransformFeedbackVaryings in Vulkan. The Vulkan specification
 states that the last vertex processing stage shader must be declared with the XFB execution mode.
 
-So we need to modify gl shader code to have transform feedback qualifiers. The glsl code will be
-converted proper SPIR-V code.
-
-we add the below layout qualifier for built-in XFB varyings.
-
-```
-out gl_PerVertex
-
-{
-
-layout(xfb_buffer = buffer_num, xfb_offset = offset, xfb_stride = stride) varying_type varying_name;
-
-}
-```
-
- And for user xfb varyings.
-
-```
-layout(xfb_buffer = buffer_num, xfb_offset = offset, xfb_stride = stride, location = num )
-out varying_type varying_name;
-
-```
-
-There are some corner cases we should handle.
-
-If more than 2 built-in varyings are used in the shader, and only one varying is declared as a
-transformFeedback varying, we can generate a layout qualifier like this.
-
-```
-out gl_PerVertex
-
-{
-
-layout(xfb_buffer = buffer_num, xfb_offset = offset, xfb_stride = stride) varying_type varying_name1;
-
-varying_type varying_name2;
-
-...
-
-}
-```
+The SPIR-V transformer takes care of adding this execution mode, as well as decorating the variables
+that need to be captured.
 
 ANGLE modifies gl_position.z in vertex shader for the Vulkan coordinate system. So, if we capture
-the value of 'gl_position' in the XFB buffer, the captured values will be incorrect.
-
-To resolve this, we declare user declare an internal position varying and copy the value from
-'gl_position'. We capture the internal position varying during transform feedback operation.
-
-```
-layout(xfb_buffer = buffer_num, xfb_offset = offset, xfb_stride = stride, location = num )
-out vec4 xfbANGLEPosition;
-
-....
-
-void main(){
-
-...
-
-xfbANGLEPosition = gl_Position;
-(gl_Position.z = ((gl_Position.z + gl_Position.w) * 0.5));
-}
-```
-
+the value of 'gl_position' in the XFB buffer, the captured values will be incorrect. To resolve
+this, we declare an internal position varying and copy the value from 'gl_position'. We capture the
+internal position varying during transform feedback operation. For simplicity, we do this for every
+captured varying, even though we could decorate the `gl_PerVertex` struct members in SPIR-V
+directly.
diff --git a/src/libANGLE/renderer/vulkan/headless/WindowSurfaceVkHeadless.h b/src/libANGLE/renderer/vulkan/headless/WindowSurfaceVkHeadless.h
index 121906b..e78b1d3 100644
--- a/src/libANGLE/renderer/vulkan/headless/WindowSurfaceVkHeadless.h
+++ b/src/libANGLE/renderer/vulkan/headless/WindowSurfaceVkHeadless.h
@@ -15,7 +15,7 @@
 namespace rx
 {
 
-class WindowSurfaceVkHeadless : public WindowSurfaceVk
+class WindowSurfaceVkHeadless final : public WindowSurfaceVk
 {
   public:
     WindowSurfaceVkHeadless(const egl::SurfaceState &surfaceState, EGLNativeWindowType window);
diff --git a/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000000.inc b/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000000.inc
index a7db2a2..c1e77cf 100644
--- a/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000000.inc
+++ b/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000000.inc
@@ -10,156 +10,157 @@
 
 #pragma once
 constexpr uint8_t kConvertVertex_comp_00000000[] = {
-    0x1f,0x8b,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0xff,0x9d,0x99,0x7b,0x74,0x57,0xc5,
-    0x11,0xc7,0xef,0xe6,0x97,0x84,0x40,0x02,0x04,0x21,0x41,0x02,0x04,0x42,0x50,0x11,
-    0xc2,0x43,0x48,0x78,0x16,0x08,0x04,0x48,0x04,0x8a,0x10,0x50,0x50,0x44,0x41,0x1e,
-    0x02,0x42,0x0a,0xc5,0x2a,0xb5,0xb4,0xe2,0x0b,0x6b,0x6b,0x5f,0xb6,0x8a,0xaf,0x56,
-    0xb1,0xbe,0x00,0x1f,0x58,0xeb,0x03,0xc5,0x5a,0x2d,0x96,0x8a,0x58,0xab,0xad,0xd4,
-    0xd6,0xda,0x5a,0xc5,0xda,0x5a,0x6d,0x3d,0xc7,0x73,0x50,0xb4,0x62,0x77,0xee,0x7e,
-    0x86,0xdf,0x64,0xf9,0xfd,0x65,0xce,0xb9,0xe7,0x77,0xe7,0x3b,0x33,0xdf,0x99,0x9d,
-    0x9d,0xdd,0xbb,0xf7,0x26,0x93,0x57,0xdd,0x26,0x49,0x5c,0xd2,0x2e,0x29,0x4a,0xd6,
-    0xb8,0x24,0xfd,0xeb,0x94,0xe4,0x25,0x72,0x5b,0x9c,0x14,0xa6,0xbf,0x8d,0xd3,0x67,
-    0x4f,0x1f,0xb4,0xee,0xfc,0x25,0x83,0x6a,0xeb,0x86,0x88,0xbe,0x43,0x92,0x49,0xed,
-    0x44,0xd7,0xd1,0xdb,0x14,0xf8,0xdf,0x7c,0x7f,0xad,0x5e,0xb4,0xa2,0x45,0xf0,0x81,
-    0x5e,0x51,0xea,0xf1,0xfc,0x94,0x2b,0x49,0xea,0xb1,0x95,0xab,0xc9,0x5b,0x9f,0x18,
-    0xc2,0x24,0xd5,0xfc,0x2a,0xe6,0xc0,0xf2,0x0d,0x96,0x07,0x56,0x64,0xb0,0x0c,0x58,
-    0x89,0xc1,0xf2,0xc1,0x4a,0x0d,0x56,0x00,0xd6,0xc5,0x60,0x85,0x60,0xc7,0x1a,0xac,
-    0x0d,0x58,0x0f,0x83,0x15,0x81,0xf5,0x36,0x58,0x5b,0xb0,0xbe,0x06,0x6b,0x07,0xd6,
-    0xcf,0x60,0xc5,0x60,0x35,0x06,0x2b,0x01,0x1b,0x62,0xb0,0xf6,0x60,0xb5,0x52,0x63,
-    0x3f,0x2a,0x1d,0x6f,0xa3,0x1f,0xcd,0x85,0xe4,0xaa,0xb5,0x58,0x1f,0xd5,0x4c,0xec,
-    0xd7,0x53,0x0b,0xb1,0xbf,0xc8,0xff,0xf6,0x39,0xa2,0x0b,0x72,0x15,0x35,0x15,0xf9,
-    0x04,0xd7,0x9a,0xaf,0x9f,0x3b,0x9a,0x4f,0x30,0xe5,0xeb,0xef,0x5a,0xf3,0x89,0x5c,
-    0x65,0x64,0x99,0xe3,0x62,0x6a,0x26,0xf2,0x97,0x90,0xbb,0xf9,0xab,0xb3,0x1f,0x45,
-    0x5e,0x1a,0x3f,0x93,0xf2,0xc9,0x7d,0x99,0xb7,0x29,0xa4,0x9e,0x49,0xfa,0x9b,0x9f,
-    0xd6,0xbd,0x0d,0xe3,0xac,0xf2,0x39,0x15,0x71,0xaf,0xb8,0xf8,0x94,0xe1,0xe3,0x52,
-    0x9b,0xfc,0xa4,0x3c,0xc5,0x83,0x5e,0x38,0x2a,0x8e,0xd8,0x06,0x7d,0x77,0xee,0x2b,
-    0xe0,0xec,0x65,0x38,0x2b,0xb0,0xe9,0x4b,0x4e,0x82,0x55,0xfa,0x8e,0xd1,0xbe,0xf8,
-    0x3c,0x97,0xe4,0xd0,0x9f,0xde,0x10,0x9e,0x31,0xc8,0x03,0xc0,0x06,0x30,0x86,0x1a,
-    0x63,0x3f,0x10,0x5d,0xa1,0xd1,0x0f,0xa5,0x5f,0x55,0x1e,0x41,0x8e,0x2a,0x8f,0xa3,
-    0xd7,0x54,0x6e,0x88,0xf8,0x9b,0xe8,0x85,0x01,0xd4,0x79,0x26,0x73,0xad,0x72,0x33,
-    0x3d,0xad,0xf6,0xa7,0x47,0xf2,0x62,0xec,0xbb,0xf8,0xa8,0xcb,0x8c,0xdf,0x0a,0xc3,
-    0x2b,0x76,0x2d,0xcc,0x5f,0x4f,0x8f,0x6a,0x8f,0x56,0xd2,0x8b,0x17,0x32,0xbe,0xaf,
-    0x92,0xfb,0x7a,0xea,0x21,0xf2,0x45,0x60,0xa2,0xff,0x3a,0xf7,0x76,0xfc,0x1b,0x59,
-    0x23,0x1a,0xf7,0x32,0xe2,0xa8,0xfe,0x7b,0xfe,0xfa,0x2c,0x93,0x95,0xaf,0x61,0xfd,
-    0xa8,0xfd,0x0d,0xa6,0x3e,0x22,0xdf,0x6e,0xea,0x27,0xf2,0x43,0xf4,0x91,0xfa,0x3f,
-    0x26,0x7c,0xfe,0x4f,0xe5,0x5d,0xf4,0x98,0xda,0xef,0x43,0x96,0x7c,0xff,0x48,0xaf,
-    0x2c,0x63,0xdc,0xba,0x96,0x2a,0x59,0x33,0x22,0x8b,0xdd,0x89,0x2e,0xc4,0x14,0x6c,
-    0x0c,0x72,0x7f,0xb0,0xae,0x5e,0x1e,0x80,0x5f,0x06,0xde,0x1a,0x47,0x4c,0xec,0x45,
-    0x1e,0xe8,0xb2,0x71,0x07,0x71,0x6f,0xeb,0xd4,0xc8,0x3a,0xd3,0x3c,0x5b,0x5c,0xd8,
-    0x5f,0x6b,0xbc,0x24,0x3c,0xb2,0x0e,0x05,0xdb,0xc7,0x18,0x86,0xfb,0xae,0xca,0x63,
-    0x6e,0x13,0x62,0x7f,0xe4,0x91,0x02,0xe6,0x46,0xc6,0x35,0xde,0x85,0xf1,0xa9,0x5c,
-    0x1f,0xc9,0xd3,0x8c,0x2c,0x6b,0xe8,0x8c,0x48,0x3f,0x3f,0xd2,0x9f,0x15,0xc9,0x67,
-    0x47,0xf6,0xe7,0x44,0xfa,0x25,0x91,0xfe,0x3c,0xe4,0x09,0x3e,0x4b,0xa9,0xc1,0x08,
-    0xea,0x22,0x3d,0x31,0x96,0x71,0x8f,0x04,0x17,0x1b,0x59,0x4f,0xa3,0x5c,0x58,0x73,
-    0x2d,0xc6,0x66,0xb4,0x0b,0xf8,0x7d,0xde,0x46,0xe6,0x6e,0x8c,0x0b,0x7e,0x82,0x7f,
-    0xe8,0x2b,0x31,0x96,0x3d,0xf0,0x63,0x6f,0x2f,0xba,0x2f,0xf8,0x4b,0x30,0xa9,0x8f,
-    0xdc,0x7f,0xea,0xab,0x2f,0xf7,0x82,0x8d,0xf3,0xf6,0xe3,0xc9,0x41,0xee,0xeb,0xb9,
-    0x3f,0xe4,0xf5,0x13,0xf0,0x91,0xdf,0x83,0x9e,0xab,0xc1,0xff,0x4e,0x82,0x5b,0xf4,
-    0x93,0xd1,0xcb,0xaf,0xe6,0x36,0xc5,0x85,0x3a,0x6b,0xfe,0x4d,0xe4,0xdf,0x68,0x6c,
-    0x4e,0x76,0x01,0xdf,0x41,0xfe,0x53,0x5d,0xf0,0x13,0x5c,0x72,0x16,0x79,0xa2,0xbf,
-    0x1a,0xe0,0x9f,0xe8,0xb2,0x35,0x9b,0x9e,0xa3,0x66,0x5f,0x04,0xd7,0x98,0x33,0x72,
-    0xc4,0x3c,0xc5,0x05,0xfc,0x72,0x6f,0x93,0xee,0x23,0x2e,0xf8,0x9d,0x62,0x6c,0x66,
-    0x91,0xfb,0x46,0x6c,0x9a,0x5d,0xb0,0x9b,0x45,0x9d,0xa4,0x5f,0x9a,0x8d,0xfd,0x6c,
-    0x17,0x7a,0x48,0xe3,0xce,0x21,0xee,0x2e,0x93,0xdb,0xa9,0x2e,0xe0,0x3a,0x57,0xa7,
-    0xb9,0xe0,0x77,0x2a,0x73,0x35,0xcf,0xcc,0x95,0xe8,0xe6,0xfa,0x6b,0x1e,0xe3,0x96,
-    0x7b,0xa9,0xb3,0xd6,0x61,0x9e,0x89,0x7d,0x26,0xb1,0x25,0x2f,0xe9,0x53,0x91,0x47,
-    0xf9,0x18,0xb2,0x96,0x16,0xb8,0x70,0x0e,0x98,0x8f,0x5e,0xfa,0x7a,0x01,0xbe,0xa2,
-    0x5f,0xe8,0x42,0xaf,0x8b,0x4e,0x7a,0x78,0xa1,0xf1,0x5d,0xe4,0x64,0x2f,0x08,0xbd,
-    0x2d,0x7a,0xe9,0xf9,0x45,0x26,0xee,0x62,0x13,0x57,0xfa,0x7d,0xb1,0xe1,0x5d,0xea,
-    0xc2,0x1a,0x11,0x9d,0xf4,0xfe,0xd2,0x94,0xb7,0x30,0xf5,0x5b,0xc6,0x73,0x57,0x7c,
-    0x96,0x18,0xbe,0x73,0x5d,0x58,0xa7,0xcf,0x50,0xf3,0xe5,0x2e,0x60,0xcb,0x4c,0x6f,
-    0x2e,0xa7,0x0e,0x93,0xa8,0xc3,0x24,0xe3,0xbf,0x22,0x9a,0xb3,0x95,0x2e,0x60,0xbb,
-    0x4c,0x3f,0xaf,0x74,0xad,0xfb,0xb9,0xc1,0xf8,0xaf,0x22,0xbe,0xd8,0xca,0xfa,0x5c,
-    0x45,0x2d,0x64,0x6f,0x59,0xed,0xef,0x8f,0x67,0xdd,0xca,0x9a,0x19,0xe9,0xaf,0xe1,
-    0xc4,0x29,0x66,0xdf,0x29,0x4a,0x9f,0x69,0x99,0x74,0x5d,0xb7,0x35,0xf7,0xed,0xd8,
-    0x8f,0x4a,0x4c,0x2f,0xf4,0xc3,0x46,0xfb,0x65,0x10,0xcf,0xd3,0x1a,0x63,0x33,0x18,
-    0x5c,0xfb,0x74,0x08,0x7e,0x83,0x8d,0xcd,0x49,0xf0,0x2b,0xcf,0x30,0x78,0x86,0x1a,
-    0x9b,0x5a,0x70,0xe5,0xa9,0xc3,0xaf,0x36,0xc9,0xd6,0x6a,0x38,0xfc,0x75,0x86,0x6b,
-    0x24,0x5c,0x23,0x0c,0xd7,0x28,0x70,0xf5,0x1b,0x8d,0xaf,0xe0,0x87,0xfd,0x18,0x47,
-    0xa7,0xfa,0x6c,0x6d,0x3a,0xe6,0xa8,0x4d,0x7b,0x73,0xdf,0x81,0xda,0x94,0x9a,0x18,
-    0x63,0xb1,0xd1,0x3c,0xc6,0x93,0xc7,0x38,0x63,0x53,0x0f,0xae,0x63,0x9a,0x80,0x5f,
-    0xbd,0xb1,0x99,0x08,0xbf,0xf2,0x4c,0x82,0xa7,0xc1,0xd8,0x4c,0x06,0x57,0x9e,0x29,
-    0xf8,0x4d,0x36,0x63,0x6c,0x84,0x7f,0x8a,0xe1,0x3a,0x19,0xae,0x26,0xc3,0x35,0x15,
-    0x5c,0xfd,0xa6,0xe1,0x3b,0x95,0xda,0x4c,0x8b,0x6a,0xd3,0x39,0x47,0x6d,0x3a,0x99,
-    0xfb,0x63,0xa8,0x4d,0x17,0xf3,0xdc,0x98,0xc1,0x73,0xfa,0xc8,0x5e,0x86,0xcf,0x55,
-    0x70,0xce,0x02,0x9b,0x69,0xc6,0x34,0x1b,0xbc,0x99,0x75,0x30,0x03,0x4c,0x39,0xe6,
-    0xc0,0x2b,0x39,0xce,0x31,0x39,0x96,0xf1,0x0e,0x21,0x7f,0xe5,0x26,0xaf,0xae,0xe4,
-    0xd5,0xcd,0xe4,0x35,0x37,0x69,0xfd,0x7c,0x5b,0x10,0xc9,0x6b,0x22,0x79,0x6d,0x24,
-    0xaf,0x8b,0xe4,0x0b,0x22,0xf9,0xca,0x48,0xbe,0x3a,0x92,0xaf,0x8f,0xe4,0x5b,0x22,
-    0x79,0x7b,0x24,0xdf,0x9b,0xb4,0x7e,0x3e,0x3f,0x12,0xe9,0x9f,0x33,0xb2,0x9c,0x8d,
-    0x5e,0x89,0xf4,0xaf,0x47,0xfe,0x6f,0x44,0xf2,0x7b,0xd1,0x3c,0xcd,0xa3,0x6e,0xda,
-    0x3f,0x67,0xd0,0x3f,0xa7,0x1b,0x9b,0xf9,0xe0,0x9b,0x98,0xb7,0x33,0xf1,0x9b,0xcf,
-    0xbc,0xcd,0x05,0x53,0xfb,0xb3,0x22,0xce,0xb3,0x73,0x70,0x2e,0x04,0xd7,0xfe,0x58,
-    0x84,0xdf,0x42,0x38,0x17,0x80,0xa9,0xfd,0x39,0xcc,0x9d,0x72,0x2e,0x81,0x73,0xb1,
-    0xb1,0x59,0x0a,0xae,0xcf,0xb1,0x73,0xf1,0x5b,0x6a,0x6c,0x96,0xc3,0xa3,0xcf,0xf5,
-    0x95,0x60,0x72,0xd6,0xbe,0x0b,0xec,0x3c,0x7c,0x45,0x27,0xcf,0xbf,0xd5,0x49,0xf6,
-    0xf9,0x27,0xba,0x55,0xb2,0xef,0xd2,0x6b,0xab,0xe8,0xcf,0x16,0xe4,0xd5,0x26,0xd6,
-    0x97,0xe9,0x3f,0x19,0xcf,0x5a,0x64,0xd5,0x9d,0x4f,0x1e,0xa2,0x5b,0x87,0xac,0xcf,
-    0xa1,0xaf,0xb0,0x77,0xaf,0xa5,0xff,0xc4,0x66,0x0d,0xb8,0xfa,0x7f,0x8d,0xde,0xd5,
-    0x39,0xd9,0x00,0x36,0x33,0xad,0x51,0x61,0x7a,0xce,0xff,0x06,0x67,0xff,0x16,0xf4,
-    0xea,0x7b,0x31,0x3a,0xe1,0xbd,0x00,0x59,0xeb,0x7a,0x09,0x75,0xdd,0x68,0xec,0x2f,
-    0x05,0xdf,0x4e,0x7d,0x2e,0x07,0xbb,0x8c,0xfa,0x6c,0x32,0xf5,0x11,0xdd,0x15,0xfe,
-    0xda,0x46,0x3d,0xae,0x30,0x3c,0xdf,0x64,0xcc,0xdb,0xe0,0xb9,0x0a,0x4c,0x6a,0xbf,
-    0xd5,0x5b,0xc8,0xba,0xfe,0x16,0xf8,0x08,0xf6,0xd5,0x0d,0xf8,0x7e,0x1b,0x9d,0xe4,
-    0x7c,0x25,0xb2,0xf2,0x7e,0x27,0xe2,0xfd,0x2e,0x98,0xe5,0xfd,0x3e,0x78,0x13,0xef,
-    0x33,0xca,0xfb,0x03,0x74,0xc2,0x7b,0x35,0xb2,0xd6,0xe2,0x87,0xd4,0xe2,0x1a,0x13,
-    0xeb,0x47,0xe0,0x5a,0x8b,0x6b,0xc1,0xb4,0x16,0x9b,0x4d,0x2d,0x44,0x77,0x9d,0xbf,
-    0x6e,0xa6,0x16,0xd7,0x19,0x9e,0x1b,0xc9,0x59,0xf7,0xc2,0x9b,0x78,0x8f,0xba,0x91,
-    0x5c,0xae,0x07,0x93,0x33,0xc1,0x66,0xfc,0x6f,0x36,0xfe,0x3f,0x8e,0xc6,0xfc,0x13,
-    0xb0,0x15,0xe4,0xb1,0xc5,0xe4,0x21,0xba,0x5b,0xfd,0x75,0x1b,0x3c,0xb7,0x12,0xe3,
-    0x96,0x24,0x7b,0x8e,0xde,0x82,0xee,0x36,0x13,0xe3,0xa7,0xec,0x6f,0x2a,0xdf,0x41,
-    0xcc,0x4b,0xc9,0xf9,0x4e,0xde,0xf5,0xee,0x30,0xe3,0xb8,0x0b,0xbf,0x3b,0xcd,0xf3,
-    0xe6,0x6e,0xf0,0xdb,0x4d,0xdc,0xbb,0xa3,0xb8,0x5b,0x4c,0x9c,0xad,0xec,0x93,0x5a,
-    0x87,0xad,0x51,0x1d,0x36,0x23,0x6f,0x42,0xde,0x66,0x7c,0xef,0x61,0x5d,0x88,0xef,
-    0x76,0x64,0x9d,0xcf,0xfb,0x72,0x9c,0x41,0xee,0x07,0x17,0xfb,0x7b,0x91,0x75,0x1d,
-    0xee,0xe0,0x59,0xb8,0x9d,0x7d,0x59,0xf3,0xd9,0x61,0x38,0x1f,0xc8,0xc1,0xf9,0x33,
-    0x70,0xad,0xc9,0x83,0x60,0xcd,0xa6,0x7f,0x1f,0x34,0xf6,0x3f,0xa7,0xce,0x3a,0x97,
-    0x0f,0x83,0x3d,0xc4,0x5c,0xee,0x34,0x73,0x29,0xba,0x47,0xfd,0xf5,0x38,0x63,0x7f,
-    0x14,0xce,0x47,0x78,0xaf,0x96,0xba,0xec,0x44,0xf7,0xb8,0x89,0xf1,0x04,0x31,0x76,
-    0xf3,0xfc,0xfc,0x05,0xef,0x00,0x4f,0x30,0x9f,0x82,0x3d,0x69,0x70,0xe5,0x7c,0x32,
-    0xe2,0xdc,0x99,0x64,0xcf,0xd2,0xbf,0xe4,0xf9,0xa4,0x6b,0xe9,0x29,0x30,0x5d,0x4b,
-    0x4f,0x45,0xf3,0xb4,0xc9,0xe4,0xf3,0x74,0xb4,0x9f,0xff,0x2a,0xc7,0x7e,0xbe,0x1b,
-    0x5c,0xf7,0xf3,0x67,0xf0,0xdb,0x6d,0x6c,0x7e,0x1d,0xad,0x83,0x3d,0x60,0x76,0x3f,
-    0xff,0x0d,0xbe,0x7b,0xa8,0xe7,0x5e,0x53,0x4f,0xd1,0x3d,0xeb,0xaf,0xe7,0xc9,0xf1,
-    0x59,0xf2,0x7f,0x8e,0x77,0x78,0xc9,0x7f,0x2f,0xba,0xe7,0x4d,0xdc,0xdf,0x72,0x16,
-    0x50,0xf9,0x05,0x9e,0xf5,0x4f,0x33,0xe7,0xbf,0xc3,0xe6,0x05,0x63,0xf3,0x22,0xe7,
-    0x83,0x3d,0xd8,0xbc,0x84,0xdd,0x8b,0x26,0xe6,0x4b,0x51,0xcc,0xbd,0xc6,0xff,0xf7,
-    0xcc,0xa1,0x3e,0xbb,0xfe,0x00,0xa6,0x7d,0xb2,0xdf,0x8c,0x4b,0x74,0x2f,0xfb,0x6b,
-    0x3f,0x3c,0x2f,0x1b,0x9e,0x3f,0x71,0x8e,0x50,0xf9,0xcf,0xf0,0xea,0xba,0x7e,0x15,
-    0x6c,0x9f,0xe9,0x97,0xbf,0xd0,0x17,0xaf,0x9a,0xf9,0x7e,0x0d,0x5c,0xc7,0xf3,0x57,
-    0xb8,0x5f,0x33,0xfb,0xe3,0xdf,0xc0,0xf5,0xdd,0xfd,0x15,0x30,0x89,0x2d,0xfa,0xbf,
-    0x73,0x86,0x91,0xfc,0x0f,0x98,0xfc,0x05,0x7f,0xd3,0x5f,0x6f,0x93,0xff,0x9b,0x26,
-    0xdf,0xb7,0xa2,0x5e,0xfe,0x07,0xbd,0xff,0x16,0x31,0xde,0x00,0x93,0x3a,0x1e,0xc0,
-    0xff,0x6d,0xa3,0x6b,0x89,0x74,0x07,0x4c,0x4f,0xff,0x93,0x33,0x93,0x8e,0xf1,0x5f,
-    0x60,0xe2,0xfb,0x3a,0xb2,0xe6,0xf1,0x0e,0xe7,0x2d,0x95,0xff,0x4d,0x5d,0xf5,0x3d,
-    0xf1,0x5d,0xb0,0x77,0xcc,0xfc,0xbe,0x4b,0x6c,0x9d,0x97,0xfd,0xc6,0xff,0x3f,0xf8,
-    0x6f,0x20,0x97,0xff,0x82,0x89,0xef,0x7b,0xc8,0x9a,0xe7,0xfb,0x9c,0xe5,0xe4,0xec,
-    0xf1,0x7e,0x74,0x36,0xee,0x49,0x1d,0xbb,0x73,0x36,0xae,0xe0,0x5b,0xb1,0xc4,0xab,
-    0x34,0x1c,0x1f,0x80,0x0b,0xc7,0x07,0xd1,0x3b,0x80,0x7e,0x7f,0xee,0x65,0xce,0xd7,
-    0xbd,0x0d,0x5f,0x15,0x7c,0xd5,0xe6,0xec,0x79,0x30,0x3a,0x8b,0x7e,0x12,0xc9,0x49,
-    0xf4,0xad,0xc9,0x45,0x72,0x26,0x92,0x0b,0x23,0xb9,0x4d,0x24,0xb7,0x8d,0xe4,0xf6,
-    0x91,0xdc,0x29,0xfa,0xd6,0xd5,0x25,0xd2,0xf7,0x74,0xad,0xcf,0xc2,0x1f,0x32,0x46,
-    0xdd,0x93,0x3e,0xca,0x71,0x6e,0x3d,0x04,0xae,0xe7,0xae,0x8f,0xf1,0x3b,0xc4,0x3c,
-    0x1d,0x04,0x53,0xfb,0xff,0x45,0x9c,0x9f,0xe6,0xe0,0x3c,0x0c,0xae,0x67,0xe1,0xcf,
-    0xf0,0x3b,0x0c,0xe7,0x27,0x60,0x6a,0x9f,0xe7,0x42,0xad,0x45,0x27,0x35,0xcc,0x33,
-    0xdf,0x0a,0xf2,0x5d,0xa8,0xbb,0xe8,0xa4,0x9e,0xf9,0xe6,0xfb,0x46,0x81,0x0b,0xef,
-    0xbd,0xe2,0x93,0xe1,0x7b,0x82,0xcc,0x49,0x81,0xf1,0x2f,0xe2,0x9f,0x45,0xa2,0x93,
-    0x7a,0x17,0x99,0x6f,0x47,0xed,0xdc,0xd1,0xef,0xa9,0xc5,0x2e,0xe0,0x62,0x2f,0xf3,
-    0x51,0x6c,0xe2,0x95,0xb8,0xf0,0xfc,0x14,0x9e,0xb6,0xd8,0xc8,0x9c,0x96,0x18,0xce,
-    0x0e,0x39,0x38,0x3b,0xba,0x80,0xeb,0xf3,0xb3,0xd4,0x05,0x4c,0x9f,0x9f,0x32,0xcf,
-    0xa5,0x26,0xe7,0x63,0x5c,0x98,0x7b,0x7d,0x06,0x74,0x76,0x01,0xd3,0x7d,0xb1,0xdc,
-    0x7c,0xbf,0x12,0x5d,0x99,0xbf,0xba,0xf2,0x9d,0xa5,0x8c,0xbc,0xa4,0x37,0xf4,0xf9,
-    0x59,0x8e,0xae,0xab,0x89,0x71,0x2c,0x31,0x74,0xcf,0xe9,0xc6,0xf7,0x1b,0xc1,0xf5,
-    0xf9,0x59,0xe1,0xb2,0xb8,0x72,0x56,0xb8,0xd6,0x9c,0xe5,0xe6,0x5b,0x54,0x77,0x17,
-    0x7a,0x52,0xf7,0x9a,0x1e,0x2e,0x60,0xe2,0x2b,0xbd,0xdb,0xc3,0xd8,0x56,0xf2,0x3f,
-    0x20,0xb5,0xed,0xe5,0x02,0xa6,0xf9,0xf5,0x76,0xa1,0xdf,0x75,0x2f,0xae,0x72,0xc1,
-    0xa6,0xb7,0xb1,0xe9,0xe3,0xc2,0x9a,0xda,0x8d,0x4d,0xb5,0x0b,0x76,0x7d,0x88,0x29,
-    0xeb,0xa1,0xda,0xd8,0xf7,0x75,0x61,0x8d,0xc8,0xfe,0x20,0xf7,0xba,0x3f,0xc8,0x77,
-    0xa7,0xe3,0xd9,0x1f,0xfa,0x9a,0xfd,0xe1,0x38,0xf6,0x84,0x13,0xcc,0xf7,0xe3,0xc1,
-    0x39,0xbe,0x85,0x0e,0x01,0xd7,0x1e,0x38,0xc9,0x1d,0xfd,0xcd,0x62,0xa8,0x0b,0xb8,
-    0xae,0xb3,0x61,0x2e,0x60,0x33,0xcd,0xb9,0xb2,0xd6,0x05,0xae,0x61,0x26,0xe7,0x3a,
-    0x17,0xf2,0xd0,0x77,0xa0,0xe1,0xfc,0x1f,0xa0,0x05,0x7b,0x19,0xa7,0x60,0x75,0xe6,
-    0x7b,0xd9,0xff,0x01,0x63,0x72,0xd6,0xa7,0x88,0x1d,0x00,0x00
+    0x1f,0x8b,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0xff,0x9d,0x99,0x79,0x74,0x57,0xd5,
+    0x11,0xc7,0xdf,0xcd,0x46,0x20,0x21,0x80,0xac,0x09,0x12,0x88,0x01,0xb4,0x12,0x42,
+    0xc4,0x10,0x02,0x56,0x44,0x90,0x24,0x02,0xd5,0x18,0x50,0xc0,0x08,0x82,0xec,0x42,
+    0x22,0x88,0x55,0xb4,0xb4,0xa5,0x2e,0x58,0x5b,0x5b,0x77,0x71,0x6b,0x15,0xeb,0x06,
+    0x54,0xa5,0x75,0x45,0x71,0x47,0xa9,0x68,0x5d,0xaa,0xad,0xd4,0x16,0x6b,0xdd,0xb0,
+    0xb6,0x56,0xab,0xe7,0xd0,0x62,0x15,0x7b,0xe7,0xdd,0xcf,0x90,0xc9,0xe5,0xf7,0x57,
+    0x73,0xce,0x3b,0xbf,0x37,0xdf,0x99,0xf9,0xce,0xdc,0xb9,0x73,0xef,0xbb,0xef,0x25,
+    0x3b,0xab,0xbc,0x43,0x92,0xb8,0xa4,0x53,0x92,0x9f,0xac,0x70,0x49,0xfa,0xd7,0x2d,
+    0xc9,0x4a,0xe4,0xb6,0x20,0xc9,0x4b,0x7f,0xeb,0x27,0x4f,0x99,0x5c,0xb9,0xe2,0xac,
+    0x79,0x95,0xd5,0x23,0xaa,0x44,0x5f,0x94,0x64,0xa7,0x76,0xa2,0xeb,0xe2,0x6d,0x72,
+    0xfd,0x6f,0x8e,0xbf,0x5a,0xe6,0x2c,0x6e,0x15,0xbc,0xca,0x2b,0xba,0x7a,0x3c,0x27,
+    0xe5,0x4a,0x92,0xb1,0xd8,0xca,0xd5,0xe0,0xad,0xbf,0x11,0xc2,0x24,0xe5,0xfc,0x2a,
+    0xe6,0xc0,0x72,0x0c,0x96,0x05,0x96,0x6f,0xb0,0x6c,0xb0,0x42,0x83,0xe5,0x80,0x75,
+    0x35,0x58,0x2e,0x58,0x0f,0x83,0xe5,0x81,0xf5,0x31,0x58,0x07,0xb0,0x03,0x0d,0x96,
+    0x0f,0x36,0xc0,0x60,0x1d,0xc1,0x06,0x1a,0xac,0x13,0xd8,0x21,0x06,0x2b,0x00,0xab,
+    0x30,0x58,0x21,0x58,0x95,0xc1,0x3a,0x83,0x55,0x1b,0xac,0x08,0xac,0x56,0xea,0xee,
+    0x47,0xaa,0x35,0xa8,0xf7,0x23,0x3c,0x87,0xfc,0xb5,0x3e,0x2b,0xa3,0x3a,0x8a,0xfd,
+    0x4a,0xea,0x23,0xf6,0xe7,0xf9,0xdf,0x83,0xf6,0xe9,0x82,0x5c,0x46,0x9d,0x45,0x3e,
+    0xd4,0xb5,0xe7,0x1b,0xe2,0xf6,0xe7,0x13,0x4c,0xf9,0x86,0xba,0xf6,0x7c,0x22,0x97,
+    0x19,0x59,0xe6,0xbd,0x80,0x3a,0x8a,0x7c,0x26,0x72,0xb1,0xbf,0xba,0xfb,0x51,0x64,
+    0xa5,0xf1,0xb3,0x53,0x3e,0xb9,0xef,0xe9,0x6d,0xf2,0xa8,0x71,0x92,0xfe,0xe6,0xa4,
+    0x73,0xd1,0x81,0x71,0x96,0xf9,0x9c,0xf2,0xb9,0x57,0x5c,0x7c,0x7a,0xe2,0xe3,0x52,
+    0x9b,0x9c,0xa4,0x57,0x8a,0x07,0xbd,0x70,0x94,0xec,0xb3,0x0d,0xfa,0xbe,0xdc,0x97,
+    0xc0,0xd9,0xdf,0x70,0x96,0x60,0x33,0x90,0x9c,0x04,0x2b,0xf5,0x5d,0xab,0xbd,0xf2,
+    0xff,0x5e,0x92,0xc7,0xa1,0xf4,0x8c,0x70,0x1d,0x81,0x3c,0x04,0x6c,0x08,0xe3,0xa8,
+    0x30,0xf6,0x43,0xd1,0xe5,0x19,0xfd,0x70,0xfa,0x58,0xe5,0x91,0xe4,0xa9,0xf2,0x18,
+    0x7a,0x50,0xe5,0xf1,0x11,0x7f,0x03,0xfd,0x30,0x84,0x5a,0x37,0x32,0xdf,0x2a,0x37,
+    0xd1,0xeb,0x6a,0x3f,0x23,0x92,0xe7,0x62,0xdf,0xc3,0x47,0x5d,0x60,0xfc,0x16,0x1b,
+    0x5e,0xb1,0x6b,0x65,0x0e,0xfb,0x79,0x54,0xfb,0xb4,0x94,0x7e,0x3c,0x87,0xf1,0x9d,
+    0x4b,0xee,0x2b,0xa9,0x87,0xc8,0xe7,0x81,0x89,0xfe,0xbb,0xdc,0xdb,0xf1,0xaf,0x66,
+    0x9d,0x68,0xdc,0x0b,0x88,0xa3,0xfa,0xcb,0xfc,0xf5,0x75,0x76,0x9b,0x7c,0x25,0x6b,
+    0x48,0xed,0xaf,0x37,0xf5,0x11,0xf9,0x36,0x53,0x3f,0x91,0x1f,0xa0,0x97,0xd4,0xff,
+    0x11,0xe1,0xf3,0x7f,0x2a,0x6f,0xa1,0xcf,0x54,0x7e,0x91,0xb5,0x2c,0xf9,0xfe,0x91,
+    0x7e,0xb1,0x75,0xd9,0x89,0xbd,0xd4,0x41,0xd7,0x57,0x29,0xeb,0x48,0x64,0xf1,0xab,
+    0x70,0xe4,0xe0,0x42,0x1d,0x44,0x1e,0x0a,0xd6,0xdb,0xcb,0x95,0xf8,0x65,0x13,0x67,
+    0x98,0x0b,0x9c,0x95,0xd8,0x8b,0x5c,0x05,0x26,0xfa,0xc3,0xb8,0xb7,0x75,0x9b,0xc8,
+    0xda,0xd3,0xbc,0x96,0xbb,0xb0,0x0f,0x57,0x78,0x49,0x78,0x64,0x6d,0x0a,0xb6,0x93,
+    0x9c,0x6b,0x7c,0x97,0x65,0x31,0xd7,0x09,0xb1,0xff,0xe3,0x91,0x5c,0xe6,0x4a,0xc6,
+    0x39,0xce,0x85,0xf1,0xaa,0x3c,0x3e,0x92,0x8f,0x33,0xb2,0xac,0xab,0x99,0x91,0x7e,
+    0x56,0xa4,0x9f,0x13,0xc9,0xa7,0x45,0xf6,0xf3,0x23,0xfd,0xc2,0x48,0xdf,0x8a,0x7c,
+    0xb4,0xcf,0x52,0x6a,0x30,0x9a,0xba,0x48,0x8f,0x1c,0xc9,0xb8,0x8f,0x00,0x17,0x1b,
+    0x59,0x5f,0xdf,0x74,0x61,0x0d,0xb6,0x1a,0x9b,0x23,0x5d,0xc0,0xef,0xf1,0x36,0x32,
+    0x97,0x63,0x5c,0xf0,0x13,0xfc,0xdf,0xbe,0x12,0x63,0xd9,0x17,0xbf,0xf0,0xf6,0xa2,
+    0x3b,0x4a,0x6a,0xe9,0x42,0x7d,0xe4,0xfe,0x2b,0x5f,0x7d,0xb9,0x17,0x6c,0x8c,0xb7,
+    0x1f,0x47,0x0e,0x72,0x3f,0x9e,0xfb,0x3d,0x5e,0x7f,0x0c,0x3e,0xf2,0xbb,0xdb,0x73,
+    0xd5,0xf9,0xdf,0x7a,0xb8,0x45,0xdf,0x80,0x5e,0x7e,0x35,0xb7,0x63,0x5d,0xa8,0xb3,
+    0xe6,0x3f,0x89,0xfc,0x27,0x1a,0x9b,0xc9,0x2e,0xe0,0x9b,0xc8,0xff,0x5b,0x2e,0xf8,
+    0x09,0x2e,0x39,0x8b,0x3c,0xc1,0x5f,0x75,0xf0,0x4f,0x70,0x6d,0x35,0x3b,0x3e,0x43,
+    0xcd,0x1a,0xc1,0x35,0xe6,0x09,0x19,0x62,0x36,0xb9,0x80,0x5f,0xe8,0x6d,0x44,0x9e,
+    0xe2,0x82,0x5f,0x93,0xb1,0x99,0x4a,0xee,0xab,0xb1,0x39,0xd1,0x05,0xbb,0xa9,0xd4,
+    0x49,0xfa,0xe5,0x44,0x63,0x7f,0x92,0x0b,0x3d,0xa4,0x71,0xa7,0x11,0x77,0x8b,0xc9,
+    0x6d,0xba,0x0b,0xb8,0xce,0xd5,0x0c,0x17,0xfc,0xa6,0x33,0x57,0xcd,0x66,0xae,0x44,
+    0x77,0xb2,0xbf,0x9a,0x19,0xb7,0xdc,0x4b,0x9d,0xb5,0x0e,0xcd,0x26,0xf6,0xa9,0xc4,
+    0x96,0xbc,0xa4,0x4f,0x45,0x1e,0xe5,0x63,0xc8,0x5a,0x9a,0xed,0xc2,0x79,0x61,0x16,
+    0x7a,0xe9,0xeb,0xd9,0xf8,0xa6,0x7b,0xa4,0x0b,0xbd,0x2e,0x3a,0xe9,0xe1,0xb9,0xc6,
+    0x77,0x9e,0x93,0xbd,0x20,0xf4,0xb6,0xe8,0xa5,0xe7,0xe7,0x99,0xb8,0x0b,0x4c,0x5c,
+    0xe9,0xf7,0x05,0x86,0x77,0x91,0x0b,0x6b,0x44,0x74,0xd2,0xfb,0x8b,0x52,0xde,0xbc,
+    0xb0,0xff,0xf2,0x2c,0x16,0x9f,0x85,0x86,0xef,0x74,0x17,0xd6,0xe9,0xb3,0xd4,0x7c,
+    0x89,0x0b,0xd8,0x62,0xd3,0x9b,0x4b,0xa8,0x43,0x3d,0x75,0xa8,0x37,0xfe,0x4b,0xa3,
+    0x39,0x6b,0x71,0x01,0xdb,0x62,0xfa,0xb9,0xc5,0xb5,0xef,0xe7,0x3a,0xe3,0x7f,0x06,
+    0xf1,0xc5,0x56,0xd6,0xe7,0x19,0xd4,0x42,0xf6,0x96,0x65,0xfe,0x7e,0x30,0xeb,0x56,
+    0xd6,0x4c,0xad,0xbf,0x6a,0x88,0x53,0xc0,0xbe,0x93,0x9f,0x3e,0xe3,0xb2,0xd3,0x75,
+    0xdd,0xd1,0xdc,0x77,0x62,0x3f,0x2a,0x34,0xbd,0x70,0x08,0x36,0xda,0x2f,0x95,0x3c,
+    0x5f,0x2b,0x8c,0xcd,0x30,0x70,0xed,0xd3,0x2a,0xfc,0x86,0x19,0x9b,0xc3,0xe0,0x57,
+    0x9e,0xc3,0xe1,0x19,0x6e,0x6c,0xaa,0xc1,0x95,0x67,0x04,0x7e,0xd5,0x49,0x5b,0xad,
+    0x6a,0xe0,0x1f,0x61,0xb8,0x6a,0xe1,0x1a,0x69,0xb8,0x46,0x81,0xab,0xdf,0x68,0x7c,
+    0x05,0xdf,0xeb,0xc7,0x38,0x3a,0xd5,0xb7,0xd5,0xa6,0x4b,0x86,0xda,0x74,0x36,0xf7,
+    0x45,0xd4,0xa6,0xab,0xdd,0xd3,0xb0,0xd1,0x3c,0x8e,0x22,0x8f,0x31,0xc6,0x66,0x2c,
+    0xb8,0x8e,0xe9,0x68,0xfc,0xc6,0x1a,0x9b,0x71,0xf0,0x2b,0xcf,0x31,0xf0,0x8c,0x37,
+    0x36,0x13,0xc0,0x95,0xa7,0x0e,0xbf,0x09,0x66,0x8c,0xf5,0xf0,0xd7,0x19,0xae,0x63,
+    0xe1,0x6a,0x30,0x5c,0x13,0xc1,0xd5,0x6f,0x12,0xbe,0x13,0xa9,0xcd,0xa4,0xa8,0x36,
+    0xdd,0x33,0xd4,0xa6,0x9b,0xb9,0x3f,0x80,0xda,0xf4,0xb0,0xcf,0x29,0x9e,0xdb,0x1a,
+    0xf3,0x78,0x7c,0x2e,0x81,0xf3,0x04,0xb0,0x46,0x33,0xa6,0x29,0xe0,0x4d,0xac,0x83,
+    0xe3,0xc0,0xf6,0xed,0x75,0xf0,0x4a,0x8e,0x53,0x4d,0x8e,0x3d,0x79,0xd7,0x90,0xbf,
+    0x5e,0x26,0xaf,0xde,0xe4,0x55,0x6c,0xf2,0x9a,0x96,0xb4,0x7f,0xbe,0xcd,0x8c,0xe4,
+    0x65,0x91,0xbc,0x3c,0x92,0x57,0x44,0xf2,0xd9,0x91,0x7c,0x71,0x24,0x5f,0x1a,0xc9,
+    0xd7,0x45,0xf2,0xcd,0x91,0xbc,0x31,0x92,0xef,0x4e,0xda,0x3f,0x9f,0x1f,0x8a,0xf4,
+    0x2f,0x18,0x59,0xce,0x4a,0x6f,0x46,0xfa,0x77,0x23,0xff,0xf7,0x23,0xf9,0xd3,0x68,
+    0x9e,0xa6,0x53,0x37,0xed,0x9f,0x93,0xe9,0x9f,0x19,0xc6,0xa6,0x19,0x7c,0x0d,0xf3,
+    0x76,0x0a,0x7e,0xcd,0xcc,0xdb,0x34,0x30,0xb5,0x9f,0x15,0x71,0x9e,0x9a,0x81,0x73,
+    0x36,0xb8,0xf6,0xc7,0x1c,0xfc,0x66,0xc3,0x39,0x13,0x4c,0xed,0x4f,0x63,0xee,0x94,
+    0x73,0x1e,0x9c,0x73,0x8d,0xcd,0x7c,0x70,0x7d,0x8e,0x2d,0xc4,0x6f,0xbe,0xb1,0x59,
+    0x04,0x8f,0x3e,0xd7,0x4f,0x07,0x93,0xb3,0xf7,0x9d,0x60,0x4b,0xf0,0x15,0x9d,0x3c,
+    0xff,0x5a,0x92,0xb6,0xe7,0x9f,0xe8,0x96,0xca,0x1e,0x4e,0xaf,0x2d,0xa5,0x3f,0x5b,
+    0x91,0x5b,0x4c,0xac,0x33,0xe9,0x3f,0x19,0xcf,0x72,0x64,0xd5,0x9d,0x45,0x1e,0xa2,
+    0x5b,0x81,0xac,0xcf,0xa1,0x6f,0xb3,0x77,0x2f,0xa7,0xff,0xc4,0x66,0x19,0xb8,0xfa,
+    0x7f,0x87,0xde,0xd5,0x39,0x59,0x05,0xd6,0x98,0xd6,0x28,0x2f,0x3d,0xf7,0x7f,0x8f,
+    0x77,0x81,0x56,0xf4,0xea,0xfb,0x7d,0x74,0xc2,0x7b,0x36,0xb2,0xd6,0xf5,0x07,0xd4,
+    0x75,0xb5,0xb1,0x3f,0x1f,0x7c,0x23,0xf5,0xb9,0x10,0xec,0x02,0xea,0xb3,0xc6,0xd4,
+    0x47,0x74,0x17,0xf9,0x6b,0x03,0xf5,0xb8,0xc8,0xf0,0xfc,0x90,0x31,0x6f,0x80,0xe7,
+    0x12,0x30,0xa9,0xfd,0x7a,0x6f,0x21,0xeb,0xfa,0x47,0xe0,0x23,0xd9,0x57,0x57,0xe1,
+    0xfb,0x63,0x74,0x92,0xf3,0xc5,0xc8,0xca,0xfb,0x93,0x88,0xf7,0xa7,0x60,0x96,0xf7,
+    0x72,0xf0,0x06,0xde,0x6f,0x94,0xf7,0x0a,0x74,0xc2,0x7b,0x29,0xb2,0xd6,0xe2,0x2a,
+    0x6a,0x71,0xa5,0x89,0x75,0x35,0xb8,0xd6,0xe2,0x1a,0x30,0xad,0xc5,0x5a,0x53,0x0b,
+    0xd1,0x5d,0xeb,0xaf,0x9b,0xa8,0xc5,0xb5,0x86,0xe7,0x06,0x72,0xd6,0xbd,0xf0,0x46,
+    0xde,0xab,0x6e,0x20,0x97,0xeb,0xc0,0xe4,0x4c,0xb0,0x16,0xff,0x9b,0x8c,0xff,0xcf,
+    0xa2,0x31,0xff,0x1c,0x6c,0x31,0x79,0xac,0x33,0x79,0x88,0xee,0x16,0x7f,0xdd,0x0a,
+    0xcf,0x2d,0xc4,0xb8,0x39,0x69,0x3b,0x47,0xaf,0x43,0x77,0xab,0x89,0xf1,0x0b,0xf6,
+    0x37,0x95,0x6f,0x27,0xe6,0xf9,0xe4,0x7c,0x07,0xef,0x7e,0xb7,0x9b,0x71,0xdc,0x89,
+    0xdf,0x1d,0xe6,0x79,0x73,0x17,0xf8,0x6d,0x26,0xee,0x5d,0x51,0xdc,0x75,0x26,0xce,
+    0x7a,0xf6,0x49,0xad,0xc3,0xfa,0xa8,0x0e,0x6b,0x91,0xd7,0x20,0x6f,0x30,0xbe,0xbf,
+    0x64,0x5d,0x88,0xef,0x46,0x64,0x9d,0xcf,0x7b,0x32,0x9c,0x41,0xee,0x05,0x17,0xfb,
+    0xbb,0x91,0x75,0x1d,0x6e,0xe2,0x59,0xb8,0x91,0x7d,0x59,0xf3,0xd9,0x64,0x38,0x7f,
+    0x95,0x81,0xf3,0xd7,0xe0,0x5a,0x93,0xfb,0xc0,0x9a,0x4c,0xff,0xde,0x67,0xec,0xef,
+    0xa7,0xce,0x3a,0x97,0x0f,0x82,0x3d,0xc0,0x5c,0x6e,0x36,0x73,0x29,0xba,0x87,0xfd,
+    0xf5,0x28,0x63,0x7f,0x18,0xce,0x87,0x78,0xcf,0x96,0xba,0x6c,0x46,0xf7,0xa8,0x89,
+    0xf1,0x18,0x31,0xb6,0xf2,0xfc,0x7c,0x9c,0x77,0x80,0xc7,0x98,0x4f,0xc1,0x9e,0x30,
+    0xb8,0x72,0x3e,0x11,0x71,0x6e,0x4e,0xda,0xce,0xd2,0x4f,0xf2,0x7c,0xd2,0xb5,0xf4,
+    0x14,0x98,0xae,0xa5,0xa7,0xa2,0x79,0x5a,0x63,0xf2,0x79,0x3a,0xda,0xcf,0x9f,0xc9,
+    0xb0,0x9f,0x6f,0x05,0xd7,0xfd,0xfc,0x59,0xfc,0xb6,0x1a,0x9b,0xe7,0xa2,0x75,0xb0,
+    0x0d,0xcc,0xee,0xe7,0xbf,0xc1,0x77,0x1b,0xf5,0xdc,0x6e,0xea,0x29,0xba,0xe7,0xfd,
+    0xf5,0x32,0x39,0x3e,0x6f,0x72,0xfa,0x2d,0x39,0xbd,0x68,0xe2,0xbd,0x04,0x2e,0x63,
+    0x7c,0x01,0x59,0xc6,0xb8,0x1d,0xff,0x97,0x8d,0xed,0x2b,0x9c,0x17,0x54,0x7e,0x95,
+    0xf3,0xc0,0xd3,0xf4,0xc5,0xef,0xb0,0x79,0xd5,0xd8,0xbc,0xc6,0x19,0x62,0x1b,0x36,
+    0xaf,0x63,0xf7,0x9a,0x89,0xf9,0x7a,0x14,0x73,0xbb,0xf1,0xff,0x3d,0xf3,0xac,0xcf,
+    0xb7,0x3f,0x80,0x69,0x2f,0xed,0x30,0x63,0x17,0xdd,0x1b,0xfe,0xda,0x01,0xcf,0x1b,
+    0x86,0xe7,0x4f,0x9c,0x35,0x54,0xfe,0x33,0xbc,0xba,0xf6,0xdf,0x02,0xdb,0x69,0x7a,
+    0xea,0x2f,0xf4,0xce,0x5b,0xa6,0x27,0xde,0x06,0xd7,0xf1,0xfc,0x15,0xee,0xb7,0xcd,
+    0x1e,0xfa,0x0e,0xb8,0xbe,0xdf,0xbf,0x09,0x26,0xb1,0x45,0xff,0x1e,0xe7,0x1c,0xc9,
+    0x7f,0x97,0xc9,0x5f,0xf0,0x0f,0xfc,0xf5,0x11,0xf9,0x7f,0x60,0xf2,0xfd,0x30,0xea,
+    0xf7,0xbf,0xb1,0x3e,0x3e,0x24,0xc6,0xfb,0x60,0x52,0xc7,0x5d,0xf8,0x7f,0x64,0x74,
+    0xad,0x91,0x6e,0x97,0xe9,0xfb,0xbf,0x73,0xae,0xd2,0x31,0xfe,0x03,0x4c,0x7c,0xdf,
+    0x45,0xd6,0x3c,0x3e,0xe6,0x4c,0xa6,0xf2,0x3f,0xa9,0xab,0xbe,0x4b,0x7e,0x02,0xf6,
+    0xb1,0x99,0xdf,0x4f,0x88,0xad,0xf3,0xb2,0xc3,0xf8,0xff,0x0b,0xff,0x55,0xe4,0xf2,
+    0x19,0x98,0xf8,0x7e,0x8a,0xac,0x79,0x7e,0xce,0x79,0x4f,0xce,0x27,0x9f,0x47,0xe7,
+    0xe7,0x7e,0xd4,0xb1,0x2f,0xe7,0xe7,0x12,0xbe,0x31,0x4b,0xbc,0x52,0xc3,0xb1,0x1b,
+    0x5c,0x38,0x76,0x47,0xef,0x09,0xfa,0xdd,0xba,0xbf,0x39,0x83,0x0f,0x30,0x7c,0x65,
+    0xf0,0x95,0x9b,0xf3,0xe9,0x9e,0xe8,0xbc,0xba,0x37,0x92,0xb3,0xa3,0xef,0x51,0x39,
+    0x91,0x9c,0x17,0xc9,0x1d,0x23,0xb9,0x53,0x24,0x17,0x46,0x72,0xd7,0x48,0xee,0x11,
+    0x7d,0x0f,0xeb,0x1d,0xe9,0x07,0xb8,0xf6,0xe7,0xe5,0x2f,0x18,0xa3,0xee,0x11,0xff,
+    0xcd,0x70,0xb6,0xfd,0x12,0x5c,0xcf,0x66,0x5f,0xe1,0xf7,0x25,0xf3,0xb4,0x07,0x4c,
+    0xed,0xbf,0x8e,0x38,0x13,0xb7,0x3f,0xa7,0xe3,0x9f,0x3d,0x7a,0x5e,0xce,0x72,0xc1,
+    0xcf,0xf1,0x5d,0x60,0x2f,0x98,0xda,0xe7,0xba,0x50,0x6b,0xd1,0x49,0x0d,0x73,0x8d,
+    0xae,0x83,0x0b,0x75,0x17,0x5d,0x5a,0x4f,0xf3,0x0d,0x24,0xdf,0x85,0x77,0x63,0xf1,
+    0xc9,0x83,0x5b,0xe6,0x24,0xdf,0xf8,0x17,0xb8,0x30,0x4f,0xa2,0x93,0x7a,0x17,0x98,
+    0xef,0x4b,0x9d,0xdd,0xfe,0xef,0xb2,0x45,0x2e,0xe0,0x62,0x2f,0xf3,0x51,0x64,0xe2,
+    0x75,0x71,0xe1,0x19,0x2b,0x3c,0x85,0xd8,0xc8,0x9c,0x76,0x31,0x9c,0xdd,0x32,0x70,
+    0x1e,0xe0,0x02,0xae,0xcf,0xd8,0xee,0x2e,0x60,0xfa,0x8c,0x95,0x79,0xee,0x6e,0x72,
+    0xee,0xe9,0xc2,0xdc,0xeb,0x73,0xa2,0x97,0x0b,0x98,0xee,0x8b,0xc5,0xe6,0x1b,0x97,
+    0xe8,0xfa,0xf8,0xab,0x84,0x6f,0x31,0x7d,0xc8,0x4b,0x7a,0x43,0x9f,0xb1,0xc5,0xe8,
+    0x4a,0x4c,0x8c,0xbe,0xc4,0xd0,0x3d,0xe7,0x40,0xbe,0xf1,0x08,0xae,0xcf,0xd8,0x7e,
+    0xae,0x0d,0x57,0xce,0x7e,0xae,0x3d,0x67,0xb1,0xf9,0x5e,0x55,0xea,0x42,0x4f,0xea,
+    0x5e,0xd3,0xdf,0x05,0x4c,0x7c,0xa5,0x77,0xfb,0x1b,0xdb,0x32,0xfe,0x77,0xa4,0xb6,
+    0x07,0xb9,0x80,0x69,0x7e,0xe5,0x2e,0xf4,0xbb,0xee,0xc5,0x03,0x5d,0xb0,0x29,0x37,
+    0x36,0x83,0x5c,0x58,0x53,0x5b,0xb1,0x19,0xec,0x82,0xdd,0x20,0x62,0xca,0x7a,0x18,
+    0x6c,0xec,0x0f,0x76,0x61,0x8d,0xc8,0xfe,0x20,0xf7,0xba,0x3f,0xc8,0xb7,0xa9,0xc1,
+    0xec,0x0f,0x03,0xcd,0xfe,0x30,0x88,0x3d,0xe1,0x60,0xf3,0x8d,0x79,0x78,0x86,0xef,
+    0xa5,0x87,0x83,0x6b,0x0f,0x54,0xbb,0xfd,0xbf,0x6b,0x8c,0x70,0x01,0xd7,0x75,0x56,
+    0xe3,0x02,0xd6,0x68,0xce,0x9e,0x23,0x5d,0xe0,0xaa,0x31,0x39,0xd7,0xba,0x90,0x87,
+    0xbe,0x27,0x8d,0xe2,0x7f,0x05,0xad,0xd8,0xcb,0x38,0x05,0xab,0x35,0xdf,0xd4,0xfe,
+    0x07,0xe5,0x4b,0xc0,0x04,0xd4,0x1d,0x00,0x00
 };
 
 // Generated from:
@@ -198,6 +199,8 @@
 //     uint Sd;
 //     uint Ed;
 //
+//     uint srcEmulatedAlpha;
+//
 //     bool isSrcHDR;
 //     bool isSrcA2BGR10;
 // } params;
@@ -263,9 +266,7 @@
 //
 //     if(component >= params . Ns && component == 3)
 //     {
-//
-//         valueAsUint = 1;
-//
+//         valueAsUint = params . srcEmulatedAlpha;
 //     }
 //     else
 //     {
diff --git a/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000001.inc b/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000001.inc
index 8f868f2..dbf4f9c 100644
--- a/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000001.inc
+++ b/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000001.inc
@@ -10,140 +10,142 @@
 
 #pragma once
 constexpr uint8_t kConvertVertex_comp_00000001[] = {
-    0x1f,0x8b,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0xff,0x9d,0x99,0x79,0x94,0xce,0x55,
-    0x18,0xc7,0x7f,0x77,0x36,0x32,0x63,0x37,0xa1,0x98,0x8c,0x5d,0xc6,0x96,0x41,0x91,
-    0xbd,0x31,0x13,0x33,0x96,0xf6,0x4d,0xab,0x16,0x1c,0x5a,0x10,0xed,0x85,0x94,0xf6,
-    0x45,0x49,0x59,0x42,0x24,0x6d,0x5a,0x95,0x76,0x11,0xa5,0xbd,0x73,0x3a,0x47,0x49,
-    0x29,0x6d,0xda,0x4b,0xa4,0x52,0xdd,0xe7,0xbd,0x9f,0xc7,0x3c,0x73,0xbd,0x7f,0x35,
-    0xe7,0xfc,0xce,0xfb,0xfb,0x7e,0x9f,0xf5,0x3e,0xf7,0xb9,0xcb,0xfb,0x4e,0x66,0x46,
-    0x8b,0x6a,0x49,0xe2,0x92,0x1a,0x49,0xf5,0xe4,0x08,0x97,0xa4,0xfe,0xea,0x26,0x19,
-    0x89,0xbc,0xe6,0x26,0x39,0xa9,0xcf,0xd2,0xf2,0x23,0xcb,0x3b,0x4e,0x98,0x38,0xaa,
-    0x63,0x71,0xb7,0xce,0x22,0xaf,0x95,0x64,0xa6,0xf4,0x44,0x56,0xdb,0xeb,0x64,0xfb,
-    0xcf,0x2c,0xff,0x8c,0x3b,0x6d,0xf4,0x78,0xe1,0x6b,0x7b,0x41,0x1d,0xcf,0x67,0xa5,
-    0x7c,0x25,0x49,0x3f,0x74,0xe5,0x29,0xf3,0xda,0xad,0x42,0x98,0xa4,0x05,0x9f,0xca,
-    0x39,0xb8,0x2c,0xc3,0x65,0xc0,0x55,0x37,0x5c,0x26,0x5c,0x9e,0xe1,0xb2,0xe0,0xea,
-    0x18,0x2e,0x1b,0xae,0x81,0xe1,0x72,0xe0,0x1a,0x19,0xae,0x1a,0x5c,0x13,0xc3,0x55,
-    0x87,0x6b,0x66,0xb8,0x7d,0xe0,0x5a,0x1a,0xae,0x06,0x5c,0x5b,0xc3,0xe5,0xc2,0x15,
-    0x19,0x2e,0x0f,0xae,0xb3,0xe1,0x6a,0xc2,0x15,0x4b,0x8d,0xfd,0xa8,0x74,0xbc,0xa5,
-    0x7e,0x34,0x13,0xc9,0x55,0x6b,0x31,0x29,0xaa,0x99,0xe8,0x4f,0xa2,0x16,0xa2,0x3f,
-    0xd9,0x7f,0x36,0xdf,0x23,0x0b,0xb8,0x90,0x9a,0x0a,0xde,0xc7,0x55,0xf5,0x57,0xc3,
-    0xed,0xed,0x4f,0x38,0xf5,0x97,0xe7,0xaa,0xfa,0x13,0x5c,0x68,0xb0,0xcc,0x71,0x2e,
-    0x35,0x13,0x3c,0x02,0xdc,0xd8,0x3f,0xf5,0xfd,0x28,0x32,0x52,0xf1,0x33,0x53,0xfe,
-    0xe4,0x3d,0xdf,0xeb,0xe4,0x50,0xcf,0x24,0xf5,0x99,0x95,0xaa,0x7b,0x35,0xc6,0x59,
-    0xe8,0x73,0xaa,0xce,0xbb,0xf2,0x85,0x5e,0x27,0xdf,0x70,0x82,0x9b,0xe1,0x4f,0x70,
-    0x81,0x9f,0x6d,0x9d,0xd3,0xff,0xf3,0x48,0x0e,0xad,0x99,0x57,0xf1,0xd3,0x0b,0xdc,
-    0x06,0x4e,0x72,0x6e,0x4b,0xce,0x52,0xae,0xf6,0xe0,0x76,0xc6,0xfe,0x40,0x74,0x73,
-    0x8c,0xbc,0x13,0xbd,0xa7,0xb8,0x98,0x9c,0x15,0xf7,0xa2,0x6f,0x14,0xf7,0xc3,0x87,
-    0xe2,0x12,0xe6,0xb5,0x3d,0x35,0xab,0x60,0xde,0x14,0x0f,0xa3,0x3f,0x55,0xff,0x98,
-    0x08,0x9f,0x8a,0x7e,0x03,0x1f,0xf5,0x0c,0x63,0x77,0x56,0xe4,0x77,0x2c,0x73,0xd1,
-    0xd4,0xb3,0xda,0x6f,0x05,0xf4,0xd5,0x44,0xc6,0x77,0x21,0xb9,0x4f,0xa2,0x3e,0x82,
-    0x27,0x47,0xe3,0x99,0x62,0xe6,0xf4,0x12,0x64,0xb6,0x1e,0x97,0xd3,0xff,0x8a,0x6f,
-    0xf0,0xcf,0xbf,0x99,0x95,0xf8,0x66,0xd6,0x82,0xe6,0x75,0xa7,0xa9,0x8f,0xe0,0x85,
-    0x26,0x9e,0xe0,0xc7,0x99,0x13,0x89,0xf7,0x24,0xbd,0xd0,0xd6,0xf8,0x7f,0x46,0xfc,
-    0xfb,0x3f,0xc5,0xab,0xcc,0xfc,0x89,0xfd,0x1b,0x60,0x19,0xb7,0xae,0x8b,0x02,0xfa,
-    0x5f,0xb0,0xf8,0xcd,0x75,0x21,0xa6,0x70,0xbd,0xc0,0x79,0x70,0x0d,0x3d,0xae,0x89,
-    0x5d,0x26,0x79,0xd4,0x72,0xc1,0x67,0x4d,0xf4,0x05,0xd7,0x86,0x13,0x79,0x1d,0xde,
-    0x6d,0x5d,0xda,0xb1,0x66,0x34,0xaf,0xe1,0x2e,0xf4,0x42,0x91,0x47,0xe2,0x47,0xd6,
-    0x94,0x70,0x6f,0x90,0x73,0x77,0xdf,0x55,0x19,0xcc,0x6d,0x42,0xec,0x3f,0x3c,0x93,
-    0xcd,0xdc,0xa4,0xd6,0x88,0x0b,0xf5,0x50,0xdc,0x3c,0xc2,0x1d,0x22,0x7c,0x68,0x84,
-    0x7b,0x47,0xb8,0x5f,0x84,0xfb,0x47,0xf8,0xb0,0x08,0x0f,0x8a,0x70,0x05,0xb8,0xbf,
-    0xcf,0x52,0x6a,0xd0,0x98,0xba,0x48,0xef,0xf5,0x66,0xdc,0xfb,0xc1,0x8b,0x8e,0xac,
-    0xa7,0xfd,0x5d,0x58,0x83,0x53,0x8c,0x4e,0x13,0x17,0xf8,0x47,0xbc,0x8e,0xf4,0x74,
-    0x53,0x17,0xec,0x84,0xdf,0xe9,0x2b,0x71,0x00,0xfb,0xd9,0x9f,0x5e,0x5f,0x64,0x05,
-    0xfe,0x11,0x4e,0xea,0x23,0xef,0xbb,0x7d,0xf5,0xe5,0x5d,0xb8,0x3e,0x5e,0xbf,0x90,
-    0x1c,0xe4,0xbd,0x39,0xef,0xbb,0xbc,0xbc,0x05,0x36,0xf2,0xb9,0xc3,0xfb,0x6a,0xe5,
-    0x3f,0x5b,0xe3,0x5b,0xe4,0x6d,0x90,0xcb,0xa7,0xe6,0xd6,0xd6,0x85,0x3a,0x6b,0xfe,
-    0x07,0x92,0x7f,0x3b,0xa3,0xd3,0xde,0x05,0x7e,0x05,0xf9,0x17,0xb9,0x60,0x27,0xbc,
-    0xe4,0x2c,0xb8,0xa5,0x7f,0x5a,0xe1,0xbf,0xa5,0xab,0xac,0x59,0xc7,0x34,0x35,0xeb,
-    0x04,0xaf,0x31,0x3b,0xa7,0x89,0xd9,0xc5,0x05,0x7e,0xba,0xd7,0x11,0x7c,0x90,0x0b,
-    0x76,0x5d,0x8c,0x4e,0x57,0x72,0xbf,0x12,0x9d,0x62,0x17,0xf4,0xba,0x52,0x27,0xe9,
-    0x97,0x62,0xa3,0xdf,0xcd,0x85,0x1e,0xd2,0xb8,0xdd,0x89,0xbb,0xca,0xe4,0xd6,0xc3,
-    0x05,0x5e,0xe7,0xea,0x60,0x17,0xec,0x7a,0x30,0x57,0x3d,0xcd,0x5c,0x89,0xec,0x10,
-    0xff,0xf4,0x64,0xdc,0xf2,0x2e,0x75,0xd6,0x3a,0xf4,0x34,0xb1,0xfb,0x10,0x5b,0xf2,
-    0x92,0x3e,0x15,0x7c,0x08,0x79,0xf7,0x75,0xb2,0x2e,0x43,0xff,0x8a,0x5c,0xfa,0xba,
-    0xaf,0xb1,0x1d,0xe0,0x42,0xaf,0x8b,0x4c,0x7a,0x78,0x80,0xb1,0x1d,0x28,0xbd,0x44,
-    0x6f,0x8b,0x5c,0x7a,0x7e,0xa0,0xb1,0x2d,0x31,0x71,0xa5,0xdf,0x4b,0x8c,0xac,0xd4,
-    0x85,0x35,0x22,0x32,0xe9,0xfd,0xd2,0x94,0xdf,0x9c,0x94,0xac,0x4c,0xfa,0x90,0x35,
-    0x32,0xc8,0xd8,0x1c,0xee,0xc2,0x3a,0x5d,0x4b,0xfc,0xc1,0x2e,0x70,0x65,0xa6,0x37,
-    0x07,0x53,0x87,0xd6,0xd4,0xa1,0xb5,0xb1,0x1f,0x12,0xcd,0x59,0xb9,0x0b,0xdc,0x2a,
-    0xd3,0xcf,0xe5,0xae,0x6a,0x3f,0xb7,0x32,0xf6,0x43,0x89,0x2f,0xba,0xb2,0x3e,0x87,
-    0x52,0x0b,0xd9,0x5b,0x86,0x71,0xee,0x57,0xb0,0x66,0x0e,0xf6,0x4f,0x77,0xe2,0xe4,
-    0xb2,0xef,0xc8,0x59,0xd3,0xc3,0xdb,0x56,0xe3,0xdc,0xd2,0xf7,0x1a,0xec,0x47,0x79,
-    0xa6,0x17,0x5a,0xa2,0xa3,0xfd,0xd2,0x9e,0xf3,0xb5,0x9d,0xd1,0x29,0x82,0xd7,0x3e,
-    0xed,0x80,0x5d,0x91,0xd1,0xe9,0x88,0xff,0x3d,0xfd,0x8e,0x9f,0x4e,0x46,0xa7,0x0b,
-    0xfc,0x9e,0x7e,0xc7,0x4e,0x78,0xad,0x55,0x57,0xfc,0x1f,0x64,0x7c,0x75,0xc3,0x57,
-    0xb1,0xf1,0xd5,0x1d,0x5e,0xed,0x7a,0x60,0x2b,0xfc,0x3f,0x7e,0x8c,0x82,0x6d,0x6d,
-    0x6a,0xa7,0xa9,0x4d,0x4d,0xf3,0x5e,0x8b,0xda,0xd4,0x31,0x31,0x7a,0xa2,0xa3,0x79,
-    0x1c,0x4a,0x1e,0xbd,0x8c,0x4e,0x6f,0x78,0x1d,0x53,0x1f,0xec,0x7a,0x1b,0x9d,0xbe,
-    0xf8,0x57,0x3f,0xfd,0xf1,0xd3,0xcf,0xe8,0x0c,0x80,0x57,0x3f,0x03,0xb1,0x1b,0x60,
-    0xc6,0x78,0x18,0xfe,0x07,0x1a,0x5f,0x83,0xf0,0x55,0x62,0x7c,0x95,0xc2,0xab,0x5d,
-    0x19,0xb6,0xa5,0xd4,0xa6,0x2c,0xaa,0x4d,0xfd,0x34,0xb5,0xa9,0x6b,0xde,0xeb,0x51,
-    0x9b,0x06,0xe6,0xdc,0x18,0xc2,0xb9,0xae,0x31,0xcb,0xb1,0x99,0x89,0xcf,0xa1,0x70,
-    0x15,0x66,0x4c,0xc3,0xe1,0x87,0xb1,0x0e,0x86,0xc0,0xa9,0x8f,0x11,0xf8,0x95,0x1c,
-    0x47,0x44,0x39,0x36,0x24,0xc7,0x7c,0x93,0xd7,0xbe,0xe4,0xd5,0xc8,0xe4,0x75,0x54,
-    0x52,0xf5,0x7c,0x3b,0x21,0xc2,0xe3,0x22,0x3c,0x3e,0xc2,0xe7,0x45,0x78,0x42,0x84,
-    0xa7,0x47,0x78,0x66,0x84,0xef,0x88,0xf0,0xdc,0x08,0x2f,0x8b,0xf0,0x72,0x83,0xe5,
-    0xae,0xf4,0x54,0x24,0x7f,0x3d,0xc2,0xef,0x45,0x75,0x3f,0x9a,0x3a,0x68,0x3f,0x1c,
-    0x4b,0x3f,0x1c,0x63,0x74,0x8e,0x83,0x9f,0x41,0x2d,0x8f,0xc7,0xee,0x38,0xe6,0xe1,
-    0x28,0x38,0xd5,0x3f,0x31,0xf2,0x79,0x52,0x1a,0x9f,0x23,0xe1,0x75,0xbe,0x4f,0xc6,
-    0x6e,0x24,0x3e,0x4f,0x80,0x53,0xfd,0x53,0x98,0x0b,0xf5,0x79,0x1a,0x3e,0x4f,0x35,
-    0x3a,0xa7,0xc3,0xeb,0xb9,0x34,0x0a,0xbb,0xd3,0x8d,0xce,0x99,0xf8,0xd1,0x73,0xfa,
-    0x6c,0x38,0xb9,0x3b,0xdf,0x0f,0x77,0x0e,0xb6,0x22,0x93,0xf3,0x6c,0x4c,0x52,0x79,
-    0x9e,0x89,0x6c,0xb4,0x7f,0xc6,0xd0,0x3b,0xa3,0xe9,0xb7,0xb1,0xe0,0x31,0x26,0xd6,
-    0xb9,0xf4,0x93,0x8c,0x67,0x3c,0x58,0x65,0xe7,0x93,0x87,0xc8,0xce,0x03,0xeb,0xb9,
-    0x72,0x01,0x7b,0xf1,0x78,0xfa,0x49,0x74,0xc6,0xc1,0xab,0xfd,0x45,0xf4,0xa2,0xce,
-    0xc9,0xc5,0x70,0x15,0xa9,0x1a,0xe5,0xa4,0xee,0xe9,0x97,0x72,0x97,0x9f,0x82,0x5c,
-    0x6d,0x2f,0x43,0x26,0x7e,0x27,0x80,0xb5,0xae,0x57,0x50,0xd7,0xcb,0x8d,0xfe,0x95,
-    0xf0,0x0f,0x52,0x9f,0xab,0xe0,0xc6,0x52,0x9f,0x69,0xa6,0x3e,0x22,0x9b,0x9a,0xaa,
-    0x65,0xa8,0xc7,0x54,0xe3,0xe7,0x6a,0xc6,0xbc,0x1c,0x3f,0x33,0xe0,0xa4,0xf6,0x0f,
-    0x78,0x0d,0xb9,0x33,0x5f,0x03,0x5f,0xcc,0x3e,0x79,0x29,0xb6,0xd7,0x22,0x93,0x9c,
-    0xa7,0x83,0xd5,0xef,0x75,0x91,0xdf,0xeb,0xe1,0xac,0xdf,0x1b,0xe1,0x4b,0xf8,0x7e,
-    0xa2,0x7e,0x6f,0x42,0x26,0x7e,0x67,0x82,0xb5,0x16,0xb7,0x50,0x8b,0x9b,0x4d,0xac,
-    0x5b,0xe1,0xb5,0x16,0xb7,0xc1,0x69,0x2d,0x66,0x99,0x5a,0x88,0xec,0x76,0xff,0xcc,
-    0xa1,0x16,0xb7,0x1b,0x3f,0xb3,0xc9,0x59,0xf7,0xb6,0xbb,0xf8,0x5e,0x34,0x9b,0x5c,
-    0xee,0x80,0x93,0x33,0x7e,0x16,0xf6,0x73,0x8c,0xfd,0xdd,0xd1,0x98,0xef,0x81,0x3b,
-    0x8b,0x3c,0xe6,0x9b,0x3c,0x44,0x36,0xcf,0x3f,0x0b,0xf0,0x33,0x8f,0x18,0x73,0x93,
-    0xca,0x7b,0xf1,0x7c,0x64,0x0b,0x4c,0x8c,0x7b,0xd9,0xaf,0x14,0x2f,0x22,0xe6,0x54,
-    0x72,0x5e,0xcc,0x77,0xb7,0x45,0x66,0x1c,0xf7,0x61,0xb7,0xd8,0x9c,0x1f,0x4b,0xe0,
-    0x17,0x9a,0xb8,0x4b,0xa2,0xb8,0xf3,0x4d,0x9c,0xa5,0xec,0x7b,0x5a,0x87,0xa5,0x51,
-    0x1d,0x66,0x81,0xa7,0x81,0xef,0x37,0xb6,0x0f,0xb0,0x2e,0xc4,0x76,0x19,0x58,0xe7,
-    0xf3,0xc1,0x34,0x77,0x8a,0x87,0xe0,0x45,0x7f,0x39,0x58,0xd7,0xe1,0xc3,0x9c,0x6d,
-    0xcb,0xd8,0x67,0x35,0x9f,0x87,0x8d,0xcf,0x47,0xd2,0xf8,0x7c,0x14,0x5e,0x6b,0xb2,
-    0x02,0x6e,0x98,0xe9,0xdf,0x15,0x46,0xff,0x31,0xea,0xac,0x73,0xf9,0x04,0xdc,0xe3,
-    0xcc,0xe5,0x4a,0x33,0x97,0x22,0x7b,0xda,0x3f,0xcf,0x32,0xf6,0xa7,0xf1,0xf9,0x14,
-    0xdf,0x8b,0xa5,0x2e,0x2b,0x91,0x3d,0x6b,0x62,0x3c,0x47,0x8c,0x35,0x3e,0x86,0xac,
-    0x87,0xe7,0xb9,0xd3,0x3f,0xc7,0x7c,0x0a,0xf7,0x82,0xe1,0xd5,0xe7,0x0b,0x91,0xcf,
-    0x95,0xf8,0x14,0xfd,0x17,0x39,0x6f,0x74,0x2d,0xbd,0x04,0xa7,0x6b,0xe9,0xa5,0x68,
-    0x9e,0xa6,0x99,0x7c,0x5e,0x8e,0xf6,0xf3,0x57,0xd2,0xec,0xe7,0xab,0xe1,0x75,0x3f,
-    0x7f,0x15,0xbb,0xd5,0x46,0x67,0x4d,0xb4,0x0e,0xd6,0xc2,0xd9,0xfd,0xfc,0x35,0x6c,
-    0xd7,0x52,0xcf,0xf5,0xa6,0x9e,0x22,0x5b,0xe7,0x9f,0x0d,0xe4,0xb8,0x8e,0xfc,0x5f,
-    0xe7,0x3b,0xb9,0xe4,0xbf,0x1e,0xd9,0x06,0x13,0xf7,0x4d,0xce,0x76,0xc5,0x6f,0x71,
-    0x76,0xaf,0x66,0xce,0xdf,0x46,0xe7,0x2d,0xa3,0xf3,0x0e,0xe7,0xfd,0x3a,0x74,0xde,
-    0x45,0xef,0x1d,0x13,0xf3,0xdd,0x28,0xe6,0x7a,0x63,0xff,0x3e,0xe7,0xb9,0xe8,0xbe,
-    0x07,0x56,0xd9,0x07,0x9c,0xed,0x72,0x16,0x7d,0x10,0xdd,0x7d,0xf6,0x4b,0x73,0xf7,
-    0x69,0x8c,0xff,0xfd,0x8d,0x8f,0x0f,0xe1,0xc5,0xc7,0x87,0x91,0x8f,0x82,0x34,0x77,
-    0xbc,0x26,0xe6,0xbd,0x29,0xfe,0x0e,0x30,0x77,0x8d,0x8d,0xd1,0xdd,0x63,0x73,0x84,
-    0xbf,0x88,0xf0,0xd6,0x08,0x7f,0x15,0xe1,0x6f,0x23,0xbc,0x2d,0xc2,0xdf,0x47,0xf8,
-    0xe7,0x08,0x6f,0x8f,0xee,0x4a,0x3b,0x23,0x79,0xe2,0xaa,0xde,0x8d,0x3e,0x62,0x8c,
-    0xda,0xa3,0x1f,0xa7,0xb9,0xc7,0x6c,0x82,0xd7,0x73,0xf8,0x13,0xec,0x36,0x31,0x4f,
-    0x1b,0xe1,0x54,0xff,0xd3,0xc8,0xe7,0x67,0x69,0x7c,0x6e,0x81,0xd7,0xbb,0xd1,0xe7,
-    0xd8,0x6d,0xc1,0xe7,0x66,0x38,0xd5,0xff,0x92,0x5a,0x8b,0x6c,0x2b,0x58,0x65,0x5f,
-    0x53,0x77,0x91,0x7d,0x05,0xd6,0xfd,0xed,0x1b,0xbe,0xd7,0x6c,0xa5,0xd6,0xa2,0xf3,
-    0x05,0xbc,0xda,0x7f,0xc7,0x3c,0x89,0x6c,0x1b,0x58,0x73,0xff,0x21,0xcd,0xf7,0x90,
-    0x1f,0xe1,0x45,0xff,0x7b,0xb0,0xc6,0xfb,0x89,0xfd,0x74,0x1b,0x73,0x25,0x3a,0xdf,
-    0xc2,0xab,0xcf,0x5f,0xd2,0xf8,0xfc,0x15,0x5e,0xf7,0xd3,0xdf,0xe0,0x74,0x3f,0xfd,
-    0x19,0x4e,0xf5,0x7f,0x67,0xee,0x75,0x4f,0xd8,0x01,0xa7,0xfb,0xe9,0x2e,0xb3,0xfe,
-    0x77,0xa4,0xfa,0x56,0xde,0x43,0xff,0xfe,0x81,0xcf,0x9d,0x66,0x3f,0xdd,0x85,0xec,
-    0x4f,0x13,0xe3,0x2f,0x62,0xe8,0x7e,0xfa,0x37,0xfb,0xe6,0x5f,0x66,0x3f,0xdd,0x6d,
-    0x78,0xf5,0xb9,0x3b,0xf2,0xb9,0xcb,0xec,0xa7,0xff,0xd0,0x93,0xba,0x9f,0xfe,0x0b,
-    0x27,0xb6,0xdb,0xc1,0x1a,0xdf,0xb9,0xb0,0xe6,0x14,0x67,0xb8,0xd0,0xdf,0xba,0xb7,
-    0x64,0xba,0xa0,0x93,0x61,0x7e,0x17,0xc8,0x72,0x61,0x0d,0xad,0x41,0x27,0xdb,0x05,
-    0xbd,0x2c,0x7e,0x2b,0x90,0xfe,0xcf,0x36,0xfa,0x39,0xfc,0x53,0x47,0xf6,0x03,0x79,
-    0xd7,0xfd,0x20,0xc3,0xfc,0x2f,0xa2,0x99,0xd9,0x03,0x0a,0x19,0x53,0x0b,0xf3,0x7b,
-    0x60,0xdd,0x34,0xbf,0x6d,0xd5,0x83,0xd7,0x39,0xaf,0xef,0xf6,0xfe,0x0e,0xda,0xc0,
-    0x05,0x5e,0xd7,0x55,0xbe,0x0b,0x5c,0x85,0xb9,0x57,0xec,0xeb,0x82,0xaf,0x7c,0x93,
-    0x73,0x43,0xfe,0x8f,0xa1,0x77,0xe0,0x46,0xfc,0xae,0x3b,0x05,0x7d,0x19,0xa7,0x70,
-    0x0d,0xcd,0xef,0x1f,0xff,0x01,0x75,0xc0,0xeb,0xfd,0x24,0x1b,0x00,0x00
+    0x1f,0x8b,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0xff,0x9d,0x99,0x77,0x70,0x55,0x45,
+    0x14,0xc6,0xef,0x26,0x21,0x89,0x04,0x02,0x08,0x48,0x11,0x22,0x11,0x84,0x60,0x22,
+    0x20,0x84,0x00,0x06,0x90,0x16,0x13,0x25,0x31,0x20,0xd8,0xbb,0x62,0x01,0x06,0x2c,
+    0x80,0x62,0x57,0x40,0x14,0x7b,0xc1,0xae,0xd8,0x15,0xb1,0x61,0x45,0xb1,0x23,0x08,
+    0x16,0xec,0xce,0x38,0x63,0x6f,0xd8,0xb0,0x2b,0x82,0x88,0xb8,0xe7,0xee,0xef,0x98,
+    0x93,0xe5,0xfd,0x65,0x66,0xee,0xbc,0xfb,0x7d,0xa7,0xee,0xd9,0xb3,0xe5,0xbd,0x64,
+    0x67,0x75,0xcd,0x4b,0x12,0x97,0x34,0x4d,0xf2,0x93,0xbd,0x5d,0x92,0xfe,0xb5,0x4a,
+    0xb2,0x12,0x79,0x2d,0x48,0x72,0xd3,0xcf,0xea,0xda,0x71,0xb5,0xbd,0xa6,0x4d,0x9f,
+    0xd0,0xab,0xbc,0x7f,0x1f,0x91,0x17,0x26,0xd9,0xa9,0x9e,0xc8,0x5a,0x78,0x9d,0x26,
+    0xfe,0x33,0xc7,0x3f,0x53,0x0e,0x9f,0x38,0x35,0xb5,0xf7,0x82,0x96,0x9e,0xcf,0x49,
+    0x7d,0x25,0xc9,0x30,0x74,0xe5,0xa9,0xf1,0xda,0x3b,0x84,0x30,0x49,0x57,0x3e,0x95,
+    0x73,0x70,0x39,0x86,0xcb,0x82,0xcb,0x37,0x5c,0x36,0x5c,0x33,0xc3,0xe5,0xc0,0xb5,
+    0x34,0x5c,0x13,0xb8,0x36,0x86,0xcb,0x85,0x6b,0x6f,0xb8,0x3c,0xb8,0x4e,0x86,0xcb,
+    0x87,0xeb,0x62,0xb8,0xad,0xe0,0xba,0x19,0xae,0x29,0x5c,0x89,0xe1,0x0a,0xe0,0xca,
+    0x0c,0xd7,0x0c,0xae,0x8f,0xe1,0x9a,0xc3,0x95,0x1b,0xae,0x10,0x6e,0xa0,0xd4,0xdd,
+    0x8f,0x54,0x6b,0x50,0xed,0x47,0x38,0x9d,0xfc,0xb5,0x3e,0x33,0xa2,0x3a,0x8a,0xfe,
+    0x0c,0xea,0x23,0xfa,0x27,0xfb,0xcf,0xed,0xff,0x93,0x05,0x5c,0x4c,0x9d,0x05,0x17,
+    0xb8,0xc6,0xfe,0x9a,0xb9,0x2d,0xfd,0x09,0xa7,0xfe,0x0a,0x5d,0x63,0x7f,0x82,0x8b,
+    0x0d,0x96,0x79,0x2f,0xa0,0x8e,0x82,0xc7,0x83,0x3b,0xf8,0xa7,0xb5,0x1f,0x45,0x56,
+    0x1a,0x3f,0x3b,0xf5,0x27,0xef,0x6d,0xbd,0x4e,0x2e,0x35,0x4e,0xd2,0xcf,0x9c,0x74,
+    0x2e,0xf2,0x18,0x67,0xb1,0xcf,0x29,0x9f,0x77,0xe5,0x8b,0xbd,0x4e,0x5b,0xc3,0x09,
+    0xee,0x82,0x3f,0xc1,0x45,0xbe,0xe3,0x74,0x9e,0xff,0xef,0x23,0x79,0x74,0x67,0xbe,
+    0xc5,0x57,0x25,0xb8,0x07,0x9c,0xe4,0x5d,0x42,0xde,0x52,0xb2,0x52,0x70,0x4f,0x63,
+    0xbf,0x23,0xba,0xb9,0x46,0xde,0x9b,0x9e,0x54,0x5c,0x4e,0xde,0x8a,0x2b,0xe9,0x27,
+    0xc5,0xc3,0xf0,0xa1,0xb8,0x8a,0xb9,0x2d,0xa5,0x6e,0x75,0xcc,0x9d,0xe2,0x7a,0xfa,
+    0x56,0xf5,0xf7,0x89,0xf0,0x61,0xe8,0xb7,0xf1,0x51,0x8f,0x34,0x76,0x47,0x47,0x7e,
+    0x27,0x33,0x1f,0x9d,0x3d,0xab,0x3d,0x57,0x44,0x6f,0x4d,0x67,0x7c,0x27,0x91,0xfb,
+    0x0c,0xea,0x23,0xf8,0xe4,0x68,0x3c,0x33,0xcd,0xbc,0x9e,0x86,0xcc,0xd6,0xe3,0x4c,
+    0xd6,0x80,0xe2,0x8b,0xfc,0xb3,0x39,0xbb,0x01,0x5f,0xca,0x7a,0xd0,0xbc,0xae,0x36,
+    0xf5,0x11,0x7c,0xab,0x89,0x27,0xf8,0x61,0xe6,0x44,0xe2,0x3d,0x4a,0x3f,0x94,0x18,
+    0xff,0x4f,0x88,0x7f,0xff,0xa7,0x78,0x69,0x34,0x7f,0xaf,0xb0,0x4e,0x65,0xdc,0xba,
+    0x36,0x8a,0x58,0x03,0x82,0xc5,0x6f,0x73,0x17,0x62,0x0a,0x57,0x09,0x2e,0x84,0x6b,
+    0xe7,0x71,0x0b,0xec,0xb2,0xc9,0xa3,0xa5,0x63,0x9f,0x44,0x5f,0x70,0x2b,0x38,0x91,
+    0x6f,0xcd,0xbb,0xad,0x4b,0x29,0xeb,0x46,0xc7,0xb5,0x97,0x0b,0xbd,0xa0,0x78,0x1c,
+    0x36,0x65,0x1e,0x89,0x5f,0x59,0x67,0xa2,0x33,0x8e,0xa7,0xc2,0x77,0x59,0x16,0x73,
+    0x9d,0x90,0xcb,0x7a,0xcf,0x34,0x61,0xae,0xd2,0xfd,0xce,0x85,0xfa,0x28,0xee,0x16,
+    0xe1,0xde,0x11,0x1e,0x1a,0xe1,0x5d,0x23,0x3c,0x22,0xc2,0x23,0x23,0xbc,0x5b,0x84,
+    0x6b,0x22,0x5c,0x0f,0x1e,0xee,0xb3,0x94,0x9a,0x6c,0x4b,0x9d,0xa4,0x17,0x87,0x30,
+    0xee,0x4e,0xf0,0xa2,0x23,0xeb,0xab,0xb3,0x0b,0x6b,0x72,0xa6,0xd1,0x29,0x72,0x81,
+    0x7f,0xc0,0xeb,0x48,0x8f,0x6f,0xe7,0x82,0x9d,0xf0,0x7f,0xfa,0x4a,0x14,0xb3,0xc7,
+    0xfd,0xe5,0xf5,0x45,0xd6,0x45,0xf6,0x30,0x17,0xea,0x23,0xef,0x9b,0x7c,0x65,0xe5,
+    0x5d,0xb8,0xa1,0x5e,0xbf,0x2b,0x39,0xc8,0x7b,0x37,0xde,0x37,0x78,0xf9,0x0e,0xd8,
+    0xc8,0xe7,0x3a,0xef,0xab,0x87,0xff,0x2c,0xc1,0xb7,0xc8,0x7b,0x22,0x97,0x4f,0xcd,
+    0x6d,0x47,0x17,0xea,0xac,0xf9,0x97,0x91,0x7f,0xa9,0xd1,0xd9,0xc9,0x05,0x7e,0x31,
+    0xf9,0xf7,0x72,0xc1,0x4e,0x78,0xc9,0x59,0x70,0x77,0xb1,0xc3,0x7f,0x77,0xd7,0x50,
+    0xb3,0x3e,0x19,0x6a,0xb6,0x33,0xbc,0xc6,0xec,0x9b,0x21,0x66,0x3f,0x17,0xf8,0x39,
+    0x5e,0x47,0x70,0xb9,0x0b,0x76,0xfd,0x8c,0x4e,0x7f,0x72,0x3f,0x1b,0x9d,0x0a,0x17,
+    0xf4,0xfa,0x53,0x27,0xe9,0x97,0x0a,0xa3,0x3f,0xc0,0x85,0x1e,0xd2,0xb8,0x03,0x89,
+    0xbb,0xd4,0xe4,0x36,0xc8,0x05,0x5e,0xe7,0x6a,0x17,0x17,0xec,0x06,0x31,0x57,0x83,
+    0xcd,0x5c,0x89,0xac,0xd2,0x3f,0x83,0x19,0xb7,0xbc,0x4b,0x9d,0xb5,0x0e,0x83,0x4d,
+    0xec,0x61,0xc4,0x96,0xbc,0xa4,0x4f,0x05,0x0f,0x22,0xef,0xe1,0x4e,0xd6,0x69,0xe8,
+    0x5f,0x91,0x4b,0x5f,0x0f,0x37,0xb6,0xa3,0x5c,0xe8,0x75,0x91,0x49,0x0f,0x8f,0x32,
+    0xb6,0x55,0xfe,0xbd,0x23,0xbd,0x2d,0x72,0xe9,0xf9,0x2a,0x63,0x5b,0x6d,0xe2,0x4a,
+    0xbf,0x57,0x1b,0xd9,0xee,0x2e,0xac,0x11,0x91,0x49,0xef,0xef,0x9e,0xfa,0xcd,0x4d,
+    0x65,0x7b,0x48,0x7f,0xb2,0x46,0x6a,0x8c,0xcd,0x68,0x17,0xd6,0xe9,0x0a,0xe2,0xd7,
+    0xba,0xc0,0xed,0x61,0x7a,0xb3,0x96,0x3a,0x94,0x50,0x87,0x12,0x63,0x5f,0x17,0xcd,
+    0xd9,0x9e,0x2e,0x70,0x4b,0x4d,0x3f,0xef,0xe9,0x1a,0xf7,0x73,0x0f,0x63,0x3f,0x86,
+    0xf8,0xa2,0x2b,0xeb,0x73,0x0c,0xb5,0x90,0xbd,0x65,0x2c,0x77,0x81,0x7a,0xd6,0xcc,
+    0x40,0xff,0x54,0x10,0xa7,0x80,0x7d,0x47,0xce,0x9e,0x01,0xde,0x36,0x8f,0x73,0x4c,
+    0xdf,0x9b,0xb2,0x1f,0x35,0x33,0xbd,0xd0,0x0d,0x1d,0xed,0x97,0x52,0xce,0xdb,0x9e,
+    0x46,0xa7,0x0c,0x5e,0xfb,0x74,0x27,0xec,0xca,0x8c,0x4e,0x2f,0xfc,0xab,0x9f,0x3e,
+    0xf8,0xe9,0x6d,0xd7,0x04,0xbc,0xfa,0xe9,0x8b,0x9d,0xf0,0x5a,0xab,0x7e,0xf8,0xef,
+    0x6b,0x7c,0xf5,0xc7,0x57,0xb9,0xf1,0x55,0x01,0xaf,0x76,0x03,0xb0,0x15,0xfe,0x1f,
+    0x3f,0xc6,0x01,0xe9,0x5d,0xae,0xa1,0x36,0x2d,0x32,0xd4,0xa6,0xb9,0x79,0x2f,0xa4,
+    0x36,0x2d,0x4d,0x8c,0x5d,0xd0,0xd1,0x3c,0x06,0x93,0x47,0xa5,0xd1,0x19,0x02,0xaf,
+    0x63,0x1a,0x8a,0xdd,0x10,0xa3,0xb3,0x2b,0xfe,0xd5,0xcf,0x70,0xfc,0x0c,0x33,0x3a,
+    0x23,0xe0,0xd5,0xcf,0x48,0xec,0x46,0x98,0x31,0x8e,0xc2,0xff,0x48,0xe3,0x6b,0x37,
+    0x7c,0x55,0x19,0x5f,0xd5,0xf0,0x6a,0x57,0x83,0x6d,0x35,0xb5,0xa9,0x89,0x6a,0xd3,
+    0x3a,0x43,0x6d,0x5a,0x99,0xf7,0xad,0xa9,0x4d,0x1b,0x73,0x6e,0x8c,0xe6,0x9c,0xd7,
+    0x98,0xb5,0xd8,0xcc,0xd3,0x9e,0x87,0xab,0x33,0x63,0x1a,0x03,0x5f,0xcf,0x3a,0x18,
+    0x0d,0xa7,0x3e,0xc6,0xe2,0x57,0x72,0x1c,0x1b,0xe5,0xd8,0x8e,0x1c,0xdb,0x9a,0xbc,
+    0xb6,0x21,0xaf,0xf6,0x26,0xaf,0xf1,0x49,0xe3,0xf3,0xed,0x80,0x08,0x4f,0x89,0xf0,
+    0xd4,0x08,0x1f,0x1f,0xe1,0x69,0x11,0x9e,0x13,0xe1,0x79,0x11,0xbe,0x2a,0xc2,0x37,
+    0x46,0x78,0x61,0x84,0x17,0x19,0x2c,0x77,0xa7,0xc7,0x22,0xf9,0xcb,0x11,0x7e,0x27,
+    0xaa,0xfb,0xde,0xd4,0x41,0xfb,0x61,0x5f,0xfa,0x61,0x1f,0xa3,0xb3,0x1f,0xfc,0x5c,
+    0x6a,0xb9,0x3f,0x76,0xfb,0x31,0x0f,0xe3,0xe1,0x54,0xff,0xc0,0xc8,0xe7,0x41,0x19,
+    0x7c,0x1e,0x0c,0xaf,0xf3,0x7d,0x08,0x76,0x07,0xe3,0xf3,0x00,0x38,0xd5,0x3f,0x94,
+    0xb9,0x50,0x9f,0x87,0xe3,0xf3,0x30,0xa3,0x73,0x04,0xbc,0x9e,0x4b,0x13,0xb0,0x3b,
+    0xc2,0xe8,0x1c,0x85,0x1f,0x3d,0xa7,0x8f,0x81,0x93,0xbb,0xf4,0xdd,0x70,0xc7,0x62,
+    0x2b,0x32,0x39,0xcf,0x26,0x25,0x0d,0xe7,0x99,0xc8,0x26,0xfa,0x67,0x12,0xbd,0x33,
+    0x91,0x7e,0x9b,0x0c,0x9e,0x64,0x62,0x1d,0x47,0x3f,0xc9,0x78,0xa6,0x82,0x55,0x76,
+    0x02,0x79,0x88,0xec,0x78,0xb0,0x9e,0x2b,0x27,0xb2,0x17,0x4f,0xa5,0x9f,0x44,0x67,
+    0x0a,0xbc,0xda,0x9f,0x42,0x2f,0xea,0x9c,0x9c,0x0a,0x57,0x97,0xd6,0x28,0x37,0xbd,
+    0xb7,0x9f,0xce,0xdd,0x7e,0x26,0x72,0xb5,0x3d,0x03,0x99,0xf8,0x9d,0x06,0xd6,0xba,
+    0x9e,0x45,0x5d,0xcf,0x34,0xfa,0x67,0xc3,0xdf,0x4b,0x7d,0xce,0x81,0x9b,0x4c,0x7d,
+    0x66,0x9b,0xfa,0x88,0x6c,0x56,0x5a,0xcb,0x50,0x8f,0x59,0xc6,0xcf,0xb9,0x8c,0x79,
+    0x11,0x7e,0xe6,0xc2,0x49,0xed,0xef,0xf1,0x1a,0x72,0x87,0x3e,0x0f,0xbe,0x9c,0x7d,
+    0xf2,0x74,0x6c,0xcf,0x47,0x26,0x39,0xcf,0x01,0xab,0xdf,0x0b,0x22,0xbf,0x17,0xc2,
+    0x59,0xbf,0x17,0xc3,0x57,0xf1,0x7d,0x45,0xfd,0x5e,0x82,0x4c,0xfc,0xce,0x03,0x6b,
+    0x2d,0x2e,0xa3,0x16,0x97,0x9a,0x58,0x97,0xc3,0x6b,0x2d,0xae,0x80,0xd3,0x5a,0xcc,
+    0x37,0xb5,0x10,0xd9,0x95,0xfe,0xb9,0x8e,0x5a,0x5c,0x69,0xfc,0x5c,0x43,0xce,0xba,
+    0xb7,0x5d,0xcb,0xf7,0xa4,0x6b,0xc8,0xe5,0x2a,0x38,0x39,0xe3,0xe7,0x63,0x7f,0x9d,
+    0xb1,0xbf,0x3e,0x1a,0xf3,0x0d,0x70,0x47,0x93,0xc7,0x02,0x93,0x87,0xc8,0x6e,0xf2,
+    0xcf,0xcd,0xf8,0xb9,0x89,0x18,0x37,0x26,0x0d,0xf7,0xe2,0x05,0xc8,0x6e,0x36,0x31,
+    0x6e,0x61,0xbf,0x52,0x7c,0x1b,0x31,0x67,0x91,0xf3,0xed,0x7c,0x97,0xbb,0xcd,0x8c,
+    0xe3,0x0e,0xec,0x6e,0x37,0xe7,0xc7,0x9d,0xf0,0xb7,0x9a,0xb8,0x77,0x46,0x71,0x17,
+    0x98,0x38,0x77,0xb1,0xef,0x69,0x1d,0xee,0x8a,0xea,0x30,0x1f,0x3c,0x1b,0x7c,0xb7,
+    0xb1,0xbd,0x87,0x75,0x21,0xb6,0x0b,0xc1,0x3a,0x9f,0xf7,0x66,0xb8,0x53,0xdc,0x07,
+    0x2f,0xfa,0x8b,0xc0,0xba,0x0e,0xef,0xe7,0x6c,0x5b,0xc8,0x3e,0xab,0xf9,0xdc,0x6f,
+    0x7c,0x3e,0x90,0xc1,0xe7,0x83,0xf0,0x5a,0x93,0xc5,0x70,0xf5,0xa6,0x7f,0x17,0x1b,
+    0xfd,0x87,0xa8,0xb3,0xce,0xe5,0x23,0x70,0x0f,0x33,0x97,0x4b,0xcc,0x5c,0x8a,0xec,
+    0x71,0xff,0x3c,0xc9,0xd8,0x1f,0xc7,0xe7,0x63,0x7c,0x4f,0x96,0xba,0x2c,0x41,0xf6,
+    0xa4,0x89,0xf1,0x14,0x31,0x96,0xfb,0x18,0xb2,0x1e,0x9e,0xe6,0x4e,0xff,0x14,0xf3,
+    0x29,0xdc,0x33,0x86,0x57,0x9f,0xcf,0x44,0x3e,0x97,0xe0,0x53,0xf4,0x9f,0xe5,0xbc,
+    0xd1,0xb5,0xf4,0x1c,0x9c,0xae,0xa5,0xe7,0xa2,0x79,0x9a,0x6d,0xf2,0x79,0x3e,0xda,
+    0xcf,0x5f,0xc8,0xb0,0x9f,0x2f,0x83,0xd7,0xfd,0xfc,0x45,0xec,0x96,0x19,0x9d,0xe5,
+    0xd1,0x3a,0x58,0x01,0x67,0xf7,0xf3,0x97,0xb0,0x5d,0x41,0x3d,0x57,0x99,0x7a,0x8a,
+    0x6c,0xa5,0x7f,0x56,0x93,0xe3,0x4a,0x93,0xd3,0xab,0xe4,0xf4,0x8a,0x89,0xf7,0x1a,
+    0xbc,0x8c,0xf1,0x65,0xb0,0x8c,0x71,0x15,0xf6,0xab,0x8d,0xee,0xeb,0x9c,0xff,0x8a,
+    0xdf,0xe0,0x7c,0x5f,0x46,0x5f,0xbc,0x89,0xce,0x1b,0x46,0xe7,0x2d,0xee,0x04,0x2b,
+    0xd1,0x79,0x1b,0xbd,0xb7,0x4c,0xcc,0xb7,0xa3,0x98,0xab,0x8c,0xfd,0xbb,0x9c,0xf9,
+    0xa2,0xfb,0x0e,0x58,0x65,0xef,0x71,0xfe,0xcb,0x79,0xf5,0x5e,0x74,0x3f,0xea,0x98,
+    0xe1,0x7e,0xd4,0x01,0xff,0xdb,0x1a,0x1f,0xef,0xc3,0x8b,0x8f,0xf7,0x23,0x1f,0x45,
+    0x19,0xee,0x81,0x9d,0xcc,0x7b,0x67,0xfc,0x6d,0x67,0xee,0x23,0x1f,0x44,0xf7,0x93,
+    0x4f,0x23,0xfc,0x55,0x84,0xd7,0x44,0xf8,0x9b,0x08,0x7f,0x1f,0xe1,0xb5,0x11,0xfe,
+    0x31,0xc2,0xbf,0x46,0x78,0x5d,0x74,0x9f,0xda,0x10,0xc9,0xb3,0x5c,0xe3,0xfb,0xd3,
+    0x87,0x8c,0x51,0x7b,0xe6,0xa3,0x0c,0x77,0x9d,0x8f,0xe1,0xf5,0xac,0xfe,0x04,0xbb,
+    0x8f,0x99,0xa7,0x0f,0xe0,0x54,0xff,0xb3,0xc8,0xe7,0xe7,0x19,0x7c,0x7e,0x01,0xaf,
+    0xf7,0xa7,0x2f,0xb1,0xfb,0x02,0x9f,0x9f,0xc2,0xa9,0xfe,0xd7,0xd4,0x5a,0x64,0x6b,
+    0xc0,0x2a,0xfb,0x96,0xba,0x8b,0xec,0x1b,0xb0,0xee,0x81,0xdf,0xf1,0xdd,0x67,0x0d,
+    0xb5,0x16,0x9d,0xaf,0xe0,0xd5,0xfe,0x07,0xe6,0x49,0x64,0x6b,0xc1,0x9a,0xfb,0x4f,
+    0x19,0xbe,0xab,0xfc,0x0c,0x2f,0xfa,0x3f,0x82,0x35,0xde,0x2f,0xec,0xb9,0x6b,0x99,
+    0x2b,0xd1,0xf9,0x1e,0x5e,0x7d,0xfe,0x96,0xc1,0xe7,0xef,0xf0,0xba,0xe7,0xfe,0x01,
+    0xa7,0x7b,0xee,0xaf,0x70,0xaa,0xff,0x27,0x73,0xaf,0xfb,0xc6,0x7a,0x38,0xdd,0x73,
+    0x37,0x9a,0x3d,0x62,0x7d,0xfa,0x99,0x24,0x7f,0xd3,0xbf,0x7f,0xe1,0x73,0x83,0xd9,
+    0x73,0x37,0x22,0xfb,0xdb,0xc4,0xd8,0x44,0x0c,0xdd,0x73,0xff,0x61,0x6f,0xdd,0x64,
+    0xf6,0xdc,0xcd,0x86,0x57,0x9f,0x9b,0x23,0x9f,0x1b,0xcd,0x9e,0x9b,0xb8,0xd0,0x93,
+    0xba,0xe7,0x3a,0xfe,0x41,0x23,0xb6,0xeb,0xc0,0x1a,0x3f,0xdb,0x85,0x35,0xa7,0x38,
+    0xc7,0x85,0xfe,0xd6,0xbd,0xa5,0x89,0x0b,0x3a,0x39,0xc6,0x26,0xd7,0x85,0x35,0xb4,
+    0x1c,0x9d,0x3c,0x17,0xf4,0x72,0x89,0x91,0xf6,0xbf,0xd1,0xcf,0x77,0x61,0x4d,0xc8,
+    0x7e,0x20,0xef,0xba,0x1f,0x64,0x99,0xff,0x61,0x74,0x31,0x7b,0x40,0x31,0x63,0xea,
+    0x6a,0x7e,0x33,0x6c,0x9d,0xe1,0xf7,0xaf,0x36,0xf0,0x3a,0xe7,0x6d,0xdd,0x96,0xdf,
+    0x53,0xb7,0x71,0x81,0xd7,0x75,0xd5,0xce,0x05,0xae,0xce,0xdc,0x3d,0xda,0xbb,0xe0,
+    0xab,0x9d,0xc9,0xb9,0x03,0xff,0xff,0xd0,0x7b,0x72,0x47,0x7e,0x0b,0x9e,0x89,0xbe,
+    0x8c,0x53,0xb8,0x0e,0xe6,0x37,0x92,0x7f,0x01,0x71,0xd1,0x10,0x9c,0x70,0x1b,0x00,
+    0x00
 };
 
 // Generated from:
@@ -182,6 +184,8 @@
 //     uint Sd;
 //     uint Ed;
 //
+//     uint srcEmulatedAlpha;
+//
 //     bool isSrcHDR;
 //     bool isSrcA2BGR10;
 // } params;
@@ -247,9 +251,7 @@
 //
 //     if(component >= params . Ns && component == 3)
 //     {
-//
-//         valueAsUint = 1;
-//
+//         valueAsUint = params . srcEmulatedAlpha;
 //     }
 //     else
 //     {
diff --git a/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000002.inc b/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000002.inc
index 2a94fb6..71c6162 100644
--- a/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000002.inc
+++ b/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000002.inc
@@ -10,133 +10,134 @@
 
 #pragma once
 constexpr uint8_t kConvertVertex_comp_00000002[] = {
-    0x1f,0x8b,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0xff,0x9d,0x98,0x77,0x70,0x57,0x45,
-    0x10,0xc7,0xdf,0x4b,0xc2,0x2f,0x21,0xd4,0x50,0x12,0x22,0x21,0x12,0x3a,0xa4,0x10,
-    0x85,0x80,0x0e,0xd2,0x66,0x10,0x50,0x41,0x11,0x14,0x85,0x0c,0x88,0x02,0x2a,0x2a,
-    0x8a,0x80,0x0d,0xc1,0x4a,0x11,0x51,0x8a,0x8d,0x22,0x8a,0x22,0x4d,0x40,0xc4,0x0e,
-    0x04,0x51,0x9a,0xd8,0x91,0x22,0x8a,0x58,0x66,0x74,0x06,0xcb,0x0c,0x48,0x51,0x14,
-    0x2c,0x78,0xfb,0xde,0x67,0xcd,0x72,0xe6,0x2f,0x7f,0x33,0x6f,0x7e,0xb7,0xdf,0xad,
-    0xb7,0xb7,0xb7,0x77,0xef,0x25,0x27,0x35,0x4e,0x0d,0x82,0x30,0x48,0x0f,0xd2,0x82,
-    0x33,0xc2,0x20,0xfa,0x65,0x04,0x49,0x81,0x0c,0xab,0x04,0x89,0xe8,0xbf,0x47,0xaf,
-    0x7e,0xbd,0x8a,0xc6,0x8c,0x1d,0x56,0xd4,0xb6,0xa4,0x58,0xf8,0xd5,0x83,0xe4,0x48,
-    0x4e,0x78,0x35,0x9c,0x4c,0x25,0xf7,0x9f,0xe2,0x9e,0x91,0x57,0x8e,0xb8,0x51,0xf0,
-    0xa3,0xee,0xa9,0xe9,0xf0,0x94,0xc8,0x56,0x10,0x74,0x41,0x56,0x9e,0x9e,0x4e,0xba,
-    0x79,0xec,0x26,0x68,0xcc,0xbf,0x62,0x21,0x58,0x8a,0xc1,0x92,0xc0,0xd2,0x0c,0x96,
-    0x0c,0x56,0xd5,0x60,0x29,0x60,0x35,0x0d,0x56,0x09,0xac,0x8e,0xc1,0x12,0x60,0xf5,
-    0x0c,0x96,0x0a,0x96,0x63,0xb0,0x34,0xb0,0x86,0x06,0xab,0x0c,0xd6,0xc4,0x60,0xe9,
-    0x60,0x2d,0x0c,0x56,0x05,0xac,0xc0,0x60,0x55,0xc1,0x8a,0x0d,0x56,0x0d,0xac,0xad,
-    0xe4,0xd8,0xcd,0x4a,0xe7,0xdb,0xc3,0xcd,0x66,0x18,0xb1,0x6a,0x2e,0x86,0x7b,0x39,
-    0x13,0xf9,0xe1,0xe4,0x42,0xe4,0xaf,0x71,0xff,0x8d,0xfe,0xe5,0xc5,0x74,0x1e,0x39,
-    0x15,0xfa,0x80,0x67,0xef,0x60,0x05,0xf6,0x0e,0x1a,0x7b,0x87,0x3c,0x7b,0x87,0xb0,
-    0xa7,0xf4,0x51,0xe6,0x99,0x03,0x5d,0x1c,0xc6,0x74,0xb6,0x7b,0x6a,0xbb,0x59,0x24,
-    0x45,0xf2,0xc9,0x91,0x3d,0x19,0xd7,0x75,0x32,0x09,0xf2,0x19,0x44,0xff,0x29,0x51,
-    0xde,0x53,0x89,0x2b,0xcf,0xc5,0x94,0xc6,0x58,0x71,0xd1,0xc9,0x40,0x27,0x8c,0x64,
-    0x52,0x82,0x5a,0xd4,0x54,0x2a,0x36,0x32,0x19,0x0b,0x96,0xe9,0xbc,0x65,0x21,0x2f,
-    0xb2,0xb2,0xc6,0x59,0x11,0x1e,0xcb,0xe6,0x20,0x9b,0x85,0xbf,0x06,0xc6,0x5f,0x0e,
-    0x3a,0x8d,0x88,0x57,0xb0,0x5c,0x57,0x4d,0x5a,0x33,0xff,0xe7,0x11,0x9f,0x2d,0xa8,
-    0x1b,0xb1,0xd3,0x01,0xba,0x25,0x58,0x3e,0xf3,0x6b,0x65,0xe4,0xf3,0xe1,0x25,0x0c,
-    0xbf,0x98,0x5a,0x56,0xba,0x84,0x18,0xf3,0xc9,0x69,0x47,0xd6,0x55,0xe9,0xce,0xd4,
-    0xaf,0xca,0x77,0xf7,0xe8,0x3e,0xc8,0xd7,0x71,0x56,0xfa,0x19,0xbd,0xfe,0xac,0xbf,
-    0xca,0x95,0xb2,0x56,0x0d,0x1c,0xaa,0xf5,0x98,0x4b,0xdd,0x0d,0x23,0xde,0xab,0x89,
-    0x65,0x38,0xf3,0x13,0xfa,0x1a,0x30,0xe1,0x5f,0xc7,0xd8,0xce,0x67,0x24,0xfb,0x41,
-    0xfd,0x8e,0xc2,0x8f,0xf2,0x6f,0x63,0x5f,0x29,0x3d,0xc1,0x8b,0xeb,0x2e,0xf7,0x9c,
-    0x4c,0x2e,0xa7,0xef,0x65,0x2f,0xa9,0xbd,0x07,0x8c,0xbe,0xd0,0x8f,0x7a,0xf9,0x5a,
-    0x44,0x8d,0xa8,0xfe,0xf3,0x62,0xcf,0xfd,0x94,0x5e,0x41,0xbd,0xa9,0x7c,0x19,0xb4,
-    0xcc,0xe7,0x1d,0x6a,0xa3,0x1f,0x79,0x39,0x60,0xf2,0x22,0xfb,0xe7,0x00,0x72,0x3f,
-    0xe3,0xf3,0x20,0x79,0x11,0xfa,0x10,0x58,0x96,0xa3,0x0f,0xa3,0x97,0x8c,0xfc,0x11,
-    0x7c,0x1c,0x46,0xfe,0x08,0x7d,0x54,0xfd,0xfe,0xc2,0x38,0x61,0xe2,0x6a,0x1d,0xc6,
-    0xbd,0xb5,0xc0,0x51,0xa2,0x27,0x7b,0x50,0xb0,0x32,0x62,0x6e,0xe7,0xaa,0x26,0x89,
-    0xb5,0x0e,0xf0,0xf5,0xbb,0x43,0x2a,0xe1,0x43,0xe6,0x51,0x29,0x8c,0xe7,0xa3,0x74,
-    0xc2,0xa3,0xab,0x1b,0x5a,0xf6,0x51,0x7d,0x8f,0x9f,0x63,0x68,0xd9,0x43,0xa7,0x7b,
-    0xf2,0x0d,0x3d,0xf9,0xc6,0x9e,0x7c,0x53,0x8f,0x5f,0x00,0xdd,0xd5,0x45,0x29,0x73,
-    0xfe,0x8b,0x3c,0x8c,0x8a,0xea,0x3c,0x9e,0xf7,0xdf,0xe0,0x22,0x23,0xfb,0xe5,0x24,
-    0x7b,0xaa,0xd4,0xc8,0x48,0xb2,0x04,0x5f,0xe5,0x64,0x64,0xad,0xc2,0x30,0xd6,0x13,
-    0xfc,0x37,0xe9,0x4b,0x9c,0x75,0x27,0x9c,0xbc,0xf0,0x92,0xdc,0x23,0x98,0xe4,0x47,
-    0xc6,0x7f,0x39,0x41,0x19,0x0b,0xd6,0xc9,0xc9,0x4b,0x9e,0x24,0x06,0x19,0x27,0x18,
-    0x1f,0x77,0xfc,0x54,0x74,0xe4,0xff,0x98,0xb3,0x55,0xd9,0xfd,0xa7,0x63,0x5b,0xf8,
-    0x55,0xe0,0xcb,0xbf,0xc6,0x56,0x35,0x8c,0xf3,0xbc,0x9a,0xd8,0xaa,0x85,0x31,0x56,
-    0x46,0x3c,0x42,0xa7,0xb9,0xa7,0x32,0xba,0x32,0xd6,0x7c,0xd4,0x08,0xff,0x9b,0x8f,
-    0x9a,0x61,0x8c,0x4f,0x74,0x32,0x42,0x67,0x84,0x31,0x56,0x66,0x64,0x6a,0xe1,0xf3,
-    0x1e,0x64,0x6a,0x87,0xb1,0x5c,0x2d,0xe6,0x27,0xeb,0x5c,0xdb,0xc4,0x58,0x27,0x8c,
-    0xd7,0x5e,0x73,0x5c,0x37,0x8c,0x73,0xbc,0xc2,0xd8,0xcc,0x0c,0x63,0x5c,0x73,0x9c,
-    0x15,0xc6,0x7a,0x99,0xe4,0x38,0xdb,0xe4,0x58,0x78,0xf5,0xdc,0x93,0xcd,0x9c,0x64,
-    0x2c,0xf9,0xd1,0x39,0x66,0x1b,0xdf,0x0d,0xf0,0x2d,0x71,0x49,0x7d,0x09,0x7d,0xb6,
-    0xf3,0x21,0x7b,0x33,0x37,0x8c,0xcf,0xf3,0x1c,0xf8,0x52,0x8f,0xb9,0xe8,0x0a,0x3f,
-    0x2f,0x8c,0x6b,0x54,0x78,0x52,0x7b,0x79,0xe8,0x4a,0xcf,0x6f,0xe4,0xc6,0xa7,0x51,
-    0x93,0xc2,0x97,0x5a,0x6d,0x64,0xfc,0x36,0x31,0x7e,0xa5,0x4e,0x9b,0xc0,0x13,0xdd,
-    0x66,0x61,0x5c,0xdb,0xc2,0x93,0x9a,0x6d,0x16,0xd9,0x4d,0x44,0x7a,0xcd,0xc3,0xb8,
-    0x9f,0x88,0x4e,0x53,0x63,0xaf,0x45,0x18,0xef,0xaf,0xad,0xe4,0xbc,0x65,0x18,0x63,
-    0xcd,0x4d,0x4d,0xb5,0x24,0x0f,0xe9,0xe4,0x21,0xdd,0xe8,0xb7,0xf2,0xd6,0x2c,0x3f,
-    0x8c,0xb1,0x15,0xa6,0x0e,0xf3,0xc3,0x53,0xeb,0xb0,0xb2,0xd1,0x2f,0xc4,0xbf,0xc8,
-    0xca,0xbe,0x2a,0x24,0x17,0xd2,0x13,0x8a,0xc2,0xf8,0x1e,0x53,0x40,0xad,0x9f,0xe5,
-    0x9e,0x76,0xf8,0xa9,0x42,0xbf,0x90,0x33,0xa3,0xbd,0xd3,0x4d,0xe5,0x4c,0xd2,0x71,
-    0x3a,0x7d,0xa4,0xaa,0xa9,0x85,0x66,0xc8,0x68,0xbd,0x14,0xb0,0x27,0x5b,0x19,0x99,
-    0x42,0x70,0xad,0xd3,0x22,0xf4,0x0a,0x8d,0x4c,0x6b,0xec,0xab,0x9d,0x33,0xb0,0x53,
-    0x6c,0x64,0xce,0x04,0x57,0x3b,0x6d,0xd0,0x13,0x5c,0x73,0xd5,0x16,0xfb,0x6d,0x8c,
-    0xad,0x76,0xd8,0x2a,0x31,0xb6,0xda,0x83,0xab,0xde,0x59,0xe8,0xb6,0x8f,0xfa,0x4c,
-    0x52,0x44,0xdb,0xdc,0xd4,0xa8,0x20,0x37,0xd5,0xcc,0xb8,0x3a,0xb9,0xa9,0x69,0x7a,
-    0x5a,0x07,0xce,0x0c,0xf5,0x79,0x0e,0x3a,0x53,0xb1,0xd9,0x09,0xac,0xa3,0x99,0x53,
-    0x17,0xf0,0xce,0xac,0x75,0x07,0x30,0xb5,0xd1,0x15,0xbb,0x12,0x63,0x57,0x13,0x63,
-    0x06,0xf7,0x5d,0xf9,0xd5,0x32,0x71,0xd5,0x26,0xae,0xba,0x26,0xae,0x6e,0xc1,0xa9,
-    0xbd,0xf7,0x7c,0x8f,0x1e,0xe4,0xd1,0x83,0x3d,0x7a,0x88,0x47,0x0f,0xf5,0xe8,0xb1,
-    0x1e,0x3d,0xce,0xa3,0xa7,0x78,0xf4,0x74,0x8f,0x9e,0xe7,0xd1,0xf3,0x83,0x53,0xcf,
-    0x96,0x25,0x1e,0x7f,0x9d,0xa1,0xe5,0x9c,0xde,0xe6,0xf1,0xb7,0x7b,0xfa,0x3b,0x3c,
-    0xfa,0x4b,0x6f,0x9d,0xce,0x25,0x6f,0x5a,0x3f,0x3d,0xa8,0x9f,0xee,0x46,0xa6,0x27,
-    0xf8,0x64,0xd6,0xed,0x3c,0xf4,0x7a,0xb2,0x6e,0xdd,0xc0,0x54,0xfe,0x02,0xcf,0x66,
-    0xaf,0x0a,0x6c,0xf6,0x06,0xd7,0xfa,0xb8,0x10,0xbd,0xde,0xd8,0x3c,0x1f,0x4c,0xe5,
-    0x2f,0x62,0xed,0xd4,0xe6,0xc5,0xd8,0xec,0x63,0x64,0xfa,0x82,0x6b,0xaf,0xbe,0x04,
-    0xbd,0xbe,0x46,0xe6,0x52,0xec,0xe8,0xb9,0x74,0x19,0x98,0xdc,0x0b,0x97,0x82,0x5d,
-    0x8e,0xae,0xf0,0xa4,0xc7,0x0f,0x0c,0xca,0x7b,0xbc,0xf0,0x06,0xb8,0x67,0x20,0xb5,
-    0x36,0x80,0xfa,0x2c,0x85,0x1e,0x68,0x7c,0x5d,0x41,0xfd,0xc9,0x7c,0x06,0x43,0x2b,
-    0xef,0x4a,0xe2,0x10,0xde,0x10,0x68,0xed,0xb5,0x57,0xd1,0x9f,0x06,0x53,0x7f,0x22,
-    0x33,0x08,0x5c,0xf5,0xaf,0xa5,0x76,0x75,0x4d,0x46,0x80,0x75,0x8c,0x72,0x94,0x88,
-    0xee,0xa4,0xd7,0x73,0x4f,0x2d,0x85,0xaf,0xba,0x37,0xc0,0x13,0xbb,0x43,0xa1,0x35,
-    0xaf,0x37,0x92,0xd7,0x91,0x46,0xfe,0x26,0xf0,0x15,0xe4,0xe7,0x66,0xb0,0x51,0xe4,
-    0x67,0x8c,0xc9,0x8f,0xf0,0x46,0xbb,0x67,0x2e,0xf9,0x18,0x6d,0xec,0xdc,0xc2,0x9c,
-    0x97,0x63,0xe7,0x56,0xb0,0xfe,0xd1,0xfd,0x34,0x11,0xed,0xeb,0xdb,0xc1,0x4b,0xb8,
-    0x23,0x8f,0x47,0xf7,0x0e,0x78,0x12,0xf3,0x58,0x68,0xb5,0x7b,0xa7,0x67,0x77,0x3c,
-    0x98,0xb5,0x7b,0x37,0xf8,0x04,0xee,0xd6,0x6a,0xf7,0x1e,0x78,0x62,0x77,0x1c,0xb4,
-    0xe6,0xe2,0x3e,0x72,0x71,0xaf,0xf1,0x75,0x3f,0xb8,0xe6,0x62,0x22,0x98,0xe6,0x62,
-    0xb2,0xc9,0x85,0xf0,0x26,0xb9,0x67,0x1a,0xb9,0x98,0x64,0xec,0x4c,0x25,0x66,0xed,
-    0x85,0x0f,0x72,0xa7,0x9f,0x4a,0x2c,0x53,0xc0,0xe4,0xdc,0x9b,0x8c,0xfe,0x34,0xa3,
-    0xff,0x90,0x37,0xe7,0x87,0xc1,0xfa,0x13,0xc7,0x4c,0x13,0x87,0xf0,0x66,0xb8,0x67,
-    0x16,0x76,0x66,0xe0,0x63,0x7a,0x50,0x7e,0xc7,0x9b,0x09,0x6f,0x96,0xf1,0xf1,0x08,
-    0xfd,0x4d,0xe9,0xc7,0xf0,0x79,0x1f,0x31,0x3f,0xce,0x7b,0xc7,0x63,0x66,0x1e,0x4f,
-    0xa0,0xf7,0xb8,0x39,0x6f,0x66,0x83,0x3f,0x6a,0xfc,0xce,0xf6,0xfc,0xce,0x34,0x7e,
-    0xe6,0xd0,0x27,0x35,0x0f,0x73,0xbc,0x3c,0x4c,0x86,0x1e,0x03,0x3d,0xd7,0xe8,0x3e,
-    0xc9,0xbe,0x10,0xdd,0x79,0xd0,0xba,0x9e,0x4f,0x55,0x70,0xce,0x3e,0x0d,0x2e,0xf2,
-    0xf3,0xa1,0x75,0x1f,0x2e,0xe0,0x2c,0x9c,0x47,0x5f,0xd6,0x78,0x16,0x18,0x9b,0xcf,
-    0x54,0x60,0xf3,0x59,0x70,0xcd,0xc9,0x42,0xb0,0xce,0xa6,0x7e,0x17,0x1a,0xf9,0xe7,
-    0xc8,0xb3,0xae,0xe5,0x62,0xb0,0x45,0xac,0xe5,0x32,0xb3,0x96,0x8b,0xa3,0x3e,0x25,
-    0xb2,0xf1,0xdc,0x97,0x62,0x73,0x09,0xef,0x78,0x92,0x97,0x65,0xf0,0x96,0x1b,0x1f,
-    0x2b,0xf1,0xb1,0x85,0xf3,0xf3,0x05,0xee,0xb9,0x2b,0x59,0xcf,0x8c,0xa8,0x6f,0x96,
-    0xe3,0x6a,0x73,0x95,0x67,0x73,0x59,0x50,0x7e,0x0f,0x7d,0x91,0xf3,0x49,0xf7,0xd2,
-    0x6a,0x30,0xdd,0x4b,0xab,0xbd,0x75,0x1a,0x63,0xe2,0x79,0xc9,0xeb,0xe7,0x2f,0x57,
-    0xd0,0xcf,0x5f,0x01,0xd7,0x7e,0xfe,0x2a,0x7a,0xaf,0x18,0x99,0xd7,0xbc,0x7d,0xf0,
-    0x3a,0x98,0xed,0xe7,0x6f,0xa0,0xfb,0x3a,0xf9,0x5c,0x6b,0xf2,0x29,0xbc,0x35,0xee,
-    0x59,0x4f,0x8c,0x6b,0x88,0x7f,0x1d,0xef,0x97,0x12,0xff,0x5a,0x78,0xeb,0x8d,0xdf,
-    0x37,0xb9,0x0b,0x28,0xbd,0x81,0xb3,0x7e,0x13,0x6b,0xfe,0x16,0x32,0x1b,0x8c,0xcc,
-    0xdb,0xdc,0x0f,0xb6,0x21,0xb3,0x11,0xb9,0xb7,0x8d,0xcf,0x8d,0x9e,0xcf,0xb5,0x46,
-    0x7f,0x13,0x6b,0xa8,0x67,0xd7,0x66,0x30,0xad,0x93,0xad,0x66,0x5e,0x9b,0xa3,0xb5,
-    0x0e,0x22,0x4c,0xec,0x6c,0x31,0x76,0xde,0xe5,0x1e,0xa1,0xf4,0x7b,0xd8,0xd5,0x7d,
-    0xfd,0x3e,0x58,0x99,0xa9,0x97,0x0f,0xa8,0x8b,0xf7,0xcd,0x7a,0x7f,0x08,0xae,0xf3,
-    0xf9,0x08,0xdb,0x1f,0x9a,0xfe,0xf8,0x31,0xb8,0xbe,0x57,0x6e,0x03,0x13,0xdf,0xc2,
-    0xff,0x84,0x3b,0x8c,0xc4,0xbf,0xcb,0xc4,0x2f,0xf8,0x4e,0xf7,0xec,0x21,0xfe,0x9d,
-    0x26,0xde,0xdd,0x5e,0x2d,0x7f,0x4a,0xed,0xef,0xc6,0xc7,0x0e,0x30,0xc9,0xe3,0x2e,
-    0xf4,0xf7,0x18,0x5e,0xa9,0xc7,0xdb,0x65,0x6a,0xfa,0x33,0xee,0x4c,0x3a,0xc7,0xcf,
-    0xc1,0x44,0x77,0x3b,0xb4,0xc6,0xb1,0x97,0xfb,0x96,0xd2,0x5f,0x90,0x57,0x7d,0x17,
-    0xda,0x07,0xb6,0xd7,0xac,0xef,0x3e,0x7c,0xeb,0xba,0x6c,0x35,0xfa,0x5f,0xa1,0x3f,
-    0x9e,0x58,0xbe,0x06,0x13,0xdd,0x2f,0xa1,0x35,0xce,0x6f,0xb8,0xcb,0xc9,0xdd,0xe3,
-    0x1b,0x73,0x37,0x96,0xf7,0xb8,0xd3,0xc8,0x63,0x3d,0xee,0xc6,0x99,0x7c,0xb3,0x14,
-    0x7f,0xf5,0x8d,0x8d,0x6f,0xc1,0x6f,0xe2,0xfd,0xef,0x3b,0x30,0xb1,0xf9,0x9d,0xf7,
-    0x4e,0xd0,0xf0,0xdf,0xef,0x64,0xe5,0xf7,0xed,0x5c,0xc6,0xd1,0x37,0x11,0xec,0xe7,
-    0x99,0xbb,0xe8,0x7e,0x73,0xd7,0x14,0xfb,0xdf,0x23,0xa7,0xf3,0xfb,0x01,0x4c,0x73,
-    0xfd,0x23,0x98,0xcc,0x77,0x3f,0xb4,0xe6,0xe6,0x27,0xec,0x49,0x6c,0x3f,0x99,0xd8,
-    0x92,0xf8,0x56,0x1d,0xf0,0x2d,0x57,0x63,0x6b,0x4c,0x3c,0x4d,0xcd,0x77,0x96,0x5f,
-    0x2b,0xf8,0xce,0x72,0x0c,0x5c,0xfb,0xd0,0x6f,0xf4,0xa1,0x09,0x46,0xe6,0x77,0x70,
-    0xbd,0x6b,0x1d,0x07,0xeb,0x68,0xce,0xb8,0x13,0xd8,0x3a,0x6e,0xf4,0xfe,0x20,0x0e,
-    0xbd,0x8f,0xfd,0xc9,0xf7,0xb1,0x52,0xe4,0x65,0x9e,0x7f,0x22,0xa7,0xef,0xa7,0xff,
-    0x00,0x11,0x39,0xfd,0x92,0xac,0x18,0x00,0x00
+    0x1f,0x8b,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0xff,0x9d,0x98,0x79,0x94,0x8f,0x65,
+    0x14,0xc7,0xdf,0x77,0x66,0xfc,0x66,0xcc,0x82,0xb1,0xcc,0xa0,0x09,0x63,0xec,0xc6,
+    0x18,0x6b,0x3a,0x9a,0x70,0x8e,0x90,0x28,0xa5,0x54,0xe6,0x90,0x42,0xa5,0x52,0x42,
+    0x9b,0x28,0x2a,0x24,0x65,0x09,0x59,0xda,0x37,0x64,0x24,0x6d,0xb2,0xb4,0x2a,0xa4,
+    0xa6,0xb4,0xa1,0x45,0x94,0x73,0xea,0x9c,0xb6,0x73,0x48,0x21,0x59,0x7a,0xee,0xfb,
+    0x7e,0x6e,0x73,0x3d,0xcd,0x5f,0xfd,0xce,0x79,0xce,0xef,0xbd,0xdf,0xbb,0xdf,0xe7,
+    0x3e,0xcb,0xfb,0x26,0x27,0x15,0xa4,0x06,0x41,0x18,0xa4,0x07,0x69,0x41,0xc7,0x30,
+    0x88,0x7e,0xd9,0x41,0x52,0x20,0x8f,0x19,0x41,0x22,0xfa,0xef,0xdd,0x6f,0x60,0xbf,
+    0xa2,0x71,0xe3,0x47,0x14,0x75,0xec,0x54,0x2c,0xfc,0x6a,0x41,0x72,0x24,0x27,0xbc,
+    0xea,0x4e,0xa6,0x8a,0xfb,0x4f,0x71,0x63,0xf4,0xe5,0xa3,0xae,0x17,0xfc,0xa0,0x1b,
+    0x35,0x1c,0x9e,0x12,0xd9,0x0a,0x82,0xee,0xc8,0xca,0xe8,0xe3,0xa4,0x9b,0xc7,0x6e,
+    0x82,0x02,0xfe,0x15,0x0b,0xc1,0x52,0x0c,0x96,0x04,0x96,0x66,0xb0,0x64,0xb0,0x4c,
+    0x83,0xa5,0x80,0xd5,0x30,0x58,0x15,0xb0,0xda,0x06,0x4b,0x80,0xd5,0x35,0x58,0x2a,
+    0x58,0x9e,0xc1,0xd2,0xc0,0x1a,0x19,0xac,0x2a,0x58,0x13,0x83,0xa5,0x83,0xb5,0x30,
+    0x58,0x06,0x58,0xa1,0xc1,0x32,0xc1,0x8a,0x0d,0x96,0x05,0xd6,0xd1,0x60,0xd5,0xc0,
+    0xba,0x48,0xdd,0x5d,0xa6,0x5a,0x83,0xde,0x2e,0xc3,0x11,0xc4,0xaf,0xf5,0x19,0xe9,
+    0xd5,0x51,0xe4,0x47,0x52,0x1f,0x91,0xbf,0xca,0xfd,0x37,0xfe,0x97,0x17,0xd3,0xf9,
+    0xd4,0x59,0xe8,0x7d,0x9e,0xbd,0xfd,0x95,0xd8,0xdb,0x6f,0xec,0x1d,0xf0,0xec,0x1d,
+    0xc0,0x9e,0xd2,0x07,0xc9,0x3d,0x0f,0xba,0x43,0x18,0xd3,0xf5,0xdc,0xa8,0xe5,0xb2,
+    0x48,0x8a,0xe4,0x93,0x23,0x7b,0xf2,0x5c,0xc7,0xc9,0x24,0xa8,0x71,0x10,0xfd,0xa7,
+    0x44,0x73,0x91,0x4a,0x5c,0xf9,0x2e,0xa6,0x34,0x9e,0x15,0x17,0x9d,0x6c,0x74,0xc2,
+    0x48,0x26,0x25,0xa8,0x49,0x9f,0xa5,0x62,0x23,0x87,0x67,0xc1,0x72,0x9c,0xb7,0x5c,
+    0xe4,0x45,0x56,0xe6,0x3d,0x37,0xc2,0x63,0xd9,0x3c,0x64,0x73,0xf1,0x77,0xaa,0xf1,
+    0x97,0x87,0x4e,0x63,0xe2,0x15,0xac,0x81,0xb3,0xaa,0x7d,0xf4,0x7f,0x87,0xf8,0x6d,
+    0x41,0x3f,0x89,0xad,0xae,0xd0,0x2d,0xc1,0x5a,0x93,0x63,0x2b,0x23,0xdf,0x1a,0x5e,
+    0xc2,0xf0,0x8b,0xe9,0x71,0xa5,0x3b,0x11,0x67,0x6b,0xea,0x5a,0xc2,0xdc,0x2a,0xdd,
+    0x8d,0xbe,0x56,0xf9,0x5e,0x1e,0x3d,0x00,0xf9,0xda,0xce,0xca,0x40,0xa3,0x37,0x88,
+    0x1e,0x50,0xb9,0x52,0xe6,0xeb,0x54,0x87,0x6a,0x4f,0x36,0xa0,0xf7,0x46,0x10,0xef,
+    0x95,0xc4,0x32,0x92,0xfc,0x84,0xbe,0x0a,0x4c,0xf8,0xd7,0xf0,0x6c,0xf3,0x19,0xcd,
+    0x9a,0x50,0xbf,0x63,0xf0,0xa3,0xfc,0x5b,0x58,0x6f,0x4a,0x4f,0xf2,0xe2,0xba,0xc3,
+    0x8d,0x13,0xc9,0x15,0xf4,0x14,0xd6,0x93,0xda,0xbb,0xd7,0xe8,0x0b,0x3d,0xcf,0xab,
+    0xd7,0x33,0xf4,0x89,0xea,0x3f,0x27,0xf6,0xdc,0x4f,0xe9,0x32,0x7a,0x4e,0xe9,0x0d,
+    0xac,0x6b,0xc9,0xe7,0x7d,0xfa,0xc3,0xd6,0xad,0x1c,0x79,0xa9,0xd3,0x3e,0x53,0x27,
+    0x59,0x53,0xfb,0xd0,0xfb,0x9d,0x18,0xf6,0x53,0x27,0xa1,0x0f,0x80,0xe5,0x3a,0xfa,
+    0x0f,0xf4,0x92,0x91,0xff,0x13,0x9b,0x7f,0x20,0xff,0x27,0xfb,0x6d,0x08,0xff,0x10,
+    0xcf,0x09,0x13,0x47,0xfb,0x30,0xde,0x83,0x0b,0x1d,0x25,0x7a,0xb2,0x2e,0x05,0x2b,
+    0x27,0xc6,0xce,0xae,0x8b,0x92,0x98,0xfb,0x00,0x5f,0x87,0x1d,0x52,0x05,0x1f,0x92,
+    0x57,0x5a,0x18,0xe7,0xa7,0x74,0x55,0x8f,0xce,0x36,0xb4,0xac,0xad,0x06,0x1e,0xbf,
+    0xa1,0xa1,0x65,0x5d,0x35,0xf6,0xe4,0x0b,0x3c,0xf9,0x66,0x9e,0x7c,0x0b,0x8f,0xdf,
+    0x16,0xba,0x87,0x8b,0xf2,0x10,0x87,0xd1,0x41,0x7a,0xa6,0x84,0xbc,0x43,0x0e,0x1d,
+    0x91,0x91,0xf5,0x93,0x14,0xc6,0x6b,0xac,0xd4,0xc8,0x24,0x87,0x31,0xbe,0xca,0xc9,
+    0xc8,0xdc,0xa5,0x84,0xb1,0x9e,0xe0,0x87,0x5c,0x25,0x12,0x9c,0x89,0x47,0x9c,0xbc,
+    0xf0,0xaa,0xb8,0x21,0x58,0x54,0x1f,0xf7,0x7f,0xcc,0x39,0x90,0x67,0xc1,0xce,0x74,
+    0xf2,0x52,0x27,0x89,0x41,0x9e,0xab,0xf2,0xfc,0x97,0xe3,0xa7,0xa3,0x93,0x1e,0xc5,
+    0x99,0x12,0x64,0xba,0xff,0x2c,0x6c,0x0b,0xbf,0x1a,0x7c,0xf9,0xd7,0xd8,0xaa,0x87,
+    0x71,0x9d,0x57,0x13,0x5b,0x8d,0x30,0xc6,0xca,0x89,0x47,0xe8,0x0c,0x37,0x32,0xd1,
+    0xcd,0x08,0x2b,0xea,0x51,0xb3,0x92,0x7a,0xd4,0x0a,0x63,0xfc,0x1e,0x27,0x23,0x74,
+    0xed,0x30,0xc6,0xca,0x8d,0x4c,0x1d,0x7c,0x4e,0x46,0x26,0x27,0x8c,0xe5,0xea,0x90,
+    0x9f,0xcc,0x73,0x8e,0x89,0x31,0x37,0x8c,0xe7,0x5e,0x6b,0x5c,0x97,0x1a,0x97,0x19,
+    0x9b,0xf5,0xc2,0x18,0xd7,0x1a,0xd7,0x0f,0x63,0xbd,0x7a,0xd4,0x38,0xcf,0xd4,0x58,
+    0x78,0xa7,0xb8,0x91,0x47,0x4e,0xf2,0x2c,0xf5,0xd1,0x1c,0xf3,0x8c,0xef,0x46,0xf8,
+    0x96,0xb8,0xa4,0xbf,0x84,0x3e,0xdd,0xf9,0x90,0xb5,0x99,0x1f,0xc6,0xe7,0x7e,0x43,
+    0xf8,0xd2,0x8f,0xf9,0xe8,0x0a,0xbf,0x49,0x18,0xf7,0xa8,0xf0,0xa4,0xf7,0x9a,0xa0,
+    0x2b,0xe7,0x40,0x53,0xf7,0x5c,0x9f,0x9e,0x14,0xbe,0xf4,0x6a,0x53,0xe3,0xb7,0xb9,
+    0xf1,0x2b,0x7d,0xda,0x1c,0x9e,0xe8,0xb6,0x0c,0xe3,0xde,0x16,0x9e,0xf4,0x6c,0xcb,
+    0xc8,0x6e,0x22,0xd2,0x6b,0x15,0xc6,0xfb,0x8b,0xe8,0xb4,0x30,0xf6,0x5a,0x87,0xf1,
+    0xfa,0xda,0x44,0xcd,0x0b,0xc3,0x18,0x6b,0x65,0x7a,0xaa,0x90,0x3a,0x64,0x51,0x87,
+    0x2c,0xa3,0xdf,0xc6,0x9b,0xb3,0xa2,0x30,0xc6,0xca,0x4c,0x1f,0x16,0x85,0x27,0xf7,
+    0x61,0xa6,0xd1,0x2f,0xc6,0xbf,0xc8,0xca,0xba,0x2a,0xa6,0x16,0xb2,0x27,0xb4,0x0b,
+    0xe3,0xfb,0x4e,0x5b,0x7a,0xbd,0x8b,0x1b,0x9d,0xf1,0x93,0xc1,0x7e,0x21,0x67,0xc8,
+    0x69,0x4e,0x37,0x95,0x33,0x4a,0x9f,0xd3,0xd9,0x47,0x32,0x4d,0x2f,0x34,0x43,0x46,
+    0xfb,0xa5,0x90,0x73,0xaf,0x95,0x91,0x69,0x03,0xae,0x7d,0x5a,0x84,0x5e,0x1b,0x23,
+    0xd3,0x16,0xfb,0x6a,0xa7,0x1d,0x76,0x8a,0x8d,0x4c,0x7b,0x70,0xb5,0xd3,0x01,0x3d,
+    0xc1,0xb5,0x56,0x1d,0xb1,0xdf,0xc1,0xd8,0xea,0x8c,0xad,0x4e,0xc6,0xd6,0x69,0xe0,
+    0xaa,0xd7,0x05,0x5d,0xc1,0x8f,0xbb,0x1c,0xbb,0x44,0x58,0x45,0x6d,0xaa,0x57,0x52,
+    0x9b,0x2c,0xf3,0x5c,0x8d,0xda,0xd4,0x30,0x7b,0x5a,0x57,0xce,0x10,0xf5,0x79,0x06,
+    0x3a,0x33,0xb0,0x79,0x26,0x58,0x89,0xc9,0xa9,0x3b,0x78,0x37,0xe6,0xba,0x2b,0x98,
+    0xda,0xe8,0x81,0x5d,0x89,0xb1,0x87,0x89,0x31,0x9b,0x7b,0xb1,0xfc,0x6a,0x9a,0xb8,
+    0x6a,0x11,0x57,0x1d,0x13,0x57,0xcf,0xe0,0xe4,0xbd,0xb7,0xaf,0x47,0x0f,0xf1,0xe8,
+    0xa1,0x1e,0x3d,0xcc,0xa3,0x87,0x7b,0xf4,0x78,0x8f,0x9e,0xe0,0xd1,0xd3,0x3d,0x7a,
+    0x96,0x47,0x2f,0xf1,0xe8,0x47,0x82,0x93,0xcf,0x96,0xa5,0x1e,0x7f,0xbd,0xa1,0xe5,
+    0xdc,0xde,0xea,0xf1,0x3f,0xf3,0xf4,0xbf,0xf0,0xe8,0x3d,0xde,0x3c,0x9d,0x45,0xdd,
+    0xb4,0x7f,0x7a,0xd3,0x3f,0xbd,0x8c,0x4c,0x1f,0xf0,0x69,0xcc,0xdb,0xd9,0xe8,0xf5,
+    0x61,0xde,0x7a,0x82,0xa9,0xfc,0x39,0x9e,0xcd,0x7e,0x95,0xd8,0xec,0x0f,0xae,0xfd,
+    0x71,0x2e,0x7a,0xfd,0xb1,0xd9,0x17,0x4c,0xe5,0xcf,0x63,0xee,0xd4,0xe6,0xf9,0xd8,
+    0x1c,0x60,0x64,0x2e,0x00,0xd7,0xbd,0xfa,0x42,0xf4,0x2e,0x30,0x32,0x17,0x61,0x47,
+    0xcf,0xa5,0x8b,0xc1,0xe4,0x9e,0xb8,0x0c,0xec,0x12,0x74,0x85,0x27,0x7b,0xfc,0xe0,
+    0xa0,0x62,0x8f,0x17,0xde,0xa5,0x6e,0x0c,0xa6,0xd7,0x2e,0xa5,0x3f,0x4b,0xa1,0x07,
+    0x1b,0x5f,0x97,0xd1,0x7f,0x92,0xcf,0x50,0x68,0xe5,0x5d,0x4e,0x1c,0xc2,0x1b,0x06,
+    0xad,0x7b,0xed,0x15,0xec,0x4f,0x43,0xe9,0x3f,0x91,0x19,0x02,0xae,0xfa,0x57,0xd3,
+    0xbb,0x3a,0x27,0xa3,0xc0,0x4a,0xa2,0x1a,0x25,0xa2,0x3b,0xea,0xb5,0xdc,0x5b,0x4b,
+    0xe1,0xab,0xee,0x75,0xf0,0xc4,0xee,0x70,0x68,0xad,0xeb,0xf5,0xd4,0x75,0xb4,0x91,
+    0xbf,0x01,0xbc,0x8c,0xfa,0xdc,0x08,0x36,0x86,0xfa,0x8c,0x33,0xf5,0x11,0xde,0x58,
+    0x37,0x16,0x53,0x8f,0xb1,0xc6,0xce,0x4d,0xe4,0xbc,0x02,0x3b,0x37,0x83,0x0d,0x8a,
+    0xee,0xab,0x89,0x68,0x5d,0xdf,0x0a,0xde,0x89,0x3b,0xf3,0x44,0x74,0x6f,0x83,0x27,
+    0x31,0x8f,0x87,0x56,0xbb,0xb7,0x7b,0x76,0x27,0x82,0x59,0xbb,0x77,0x82,0x4f,0xe2,
+    0xae,0xad,0x76,0x27,0xc3,0x13,0xbb,0x13,0xa0,0xb5,0x16,0x77,0x51,0x8b,0x29,0xc6,
+    0xd7,0xdd,0xe0,0x5a,0x8b,0x7b,0xc0,0xb4,0x16,0xd3,0x4c,0x2d,0x84,0x37,0xd5,0x8d,
+    0x99,0xd4,0x62,0xaa,0xb1,0x33,0x83,0x98,0x75,0x2f,0xbc,0x8f,0x3b,0xfe,0x0c,0x62,
+    0x99,0x0e,0x26,0xe7,0xde,0x34,0xf4,0x67,0x1a,0xfd,0xfb,0xbd,0x9c,0x1f,0x00,0x1b,
+    0x44,0x1c,0x73,0x4c,0x1c,0xc2,0x9b,0xed,0xc6,0x5c,0xec,0xcc,0xc6,0xc7,0xac,0xa0,
+    0xe2,0x8e,0x37,0x07,0xde,0x5c,0xe3,0xe3,0x41,0xf6,0x37,0xa5,0xe7,0xe3,0xf3,0x2e,
+    0x62,0x5e,0xc0,0x7b,0xc8,0x7c,0x93,0xc7,0x43,0xe8,0x2d,0x30,0xe7,0xcd,0x42,0xf0,
+    0x79,0xc6,0xef,0x42,0xcf,0xef,0x1c,0xe3,0x67,0x11,0xfb,0xa4,0xd6,0x61,0x91,0x57,
+    0x87,0x69,0xd0,0xe3,0xa0,0x17,0x1b,0xdd,0x87,0x59,0x17,0xa2,0xbb,0x04,0x5a,0xe7,
+    0xf3,0xd1,0x4a,0xce,0xd9,0xc7,0xc0,0x45,0xfe,0x11,0x68,0x5d,0x87,0x8f,0x73,0x16,
+    0x2e,0x61,0x5f,0xd6,0x78,0x1e,0x37,0x36,0x9f,0xa8,0xc4,0xe6,0x93,0xe0,0x5a,0x93,
+    0xa7,0xc0,0xba,0x99,0xfe,0x7d,0xca,0xc8,0x3f,0x4d,0x9d,0x75,0x2e,0x9f,0x05,0x7b,
+    0x86,0xb9,0x5c,0x6e,0xe6,0xf2,0xd9,0x68,0x9f,0x12,0xd9,0x38,0xf7,0x65,0xd8,0x5c,
+    0xca,0x3b,0x9f,0xd4,0x65,0x39,0xbc,0x15,0xc6,0xc7,0x4a,0x7c,0xbc,0xc7,0xf9,0xf9,
+    0x3c,0xf7,0xdc,0x95,0xcc,0x67,0x76,0xb4,0x6f,0x56,0xe0,0x6a,0x73,0x95,0x67,0x73,
+    0x79,0x50,0x71,0x0f,0x7d,0x81,0xf3,0x49,0xd7,0xd2,0x6a,0x30,0x5d,0x4b,0xab,0xbd,
+    0x79,0x1a,0x67,0xe2,0x79,0xd1,0xdb,0xcf,0x5f,0xaa,0x64,0x3f,0x7f,0x19,0x5c,0xf7,
+    0xf3,0x57,0xd0,0x7b,0xd9,0xc8,0xbc,0xea,0xad,0x83,0x35,0x60,0x76,0x3f,0x7f,0x0d,
+    0xdd,0x35,0xd4,0x73,0x9d,0xa9,0xa7,0xf0,0xd6,0xba,0xf1,0x26,0x31,0xae,0x35,0x31,
+    0xbd,0x4e,0x4c,0x1b,0x8c,0xbf,0x37,0xc0,0x25,0xc7,0xf5,0xd0,0x92,0xe3,0x3a,0xf4,
+    0xdf,0x34,0xb2,0x6f,0x71,0x5f,0x50,0xfa,0x6d,0xee,0x03,0x1b,0xe9,0x8b,0x77,0x90,
+    0x79,0xdb,0xc8,0x6c,0xe4,0x0e,0xb1,0x05,0x99,0x77,0x91,0xdb,0x68,0x7c,0xbe,0xeb,
+    0xf9,0x5c,0x67,0xf4,0xdf,0x63,0x9e,0xf5,0x7c,0xdb,0x04,0xa6,0xbd,0xb4,0xc5,0xe4,
+    0x2e,0xbc,0xcd,0x91,0xaf,0xd8,0xce,0x66,0x63,0xe7,0x03,0xee,0x1a,0x4a,0x7f,0x88,
+    0x5d,0x5d,0xfb,0x1f,0x81,0x95,0x9b,0x9e,0xfa,0x98,0xde,0xf9,0xc8,0xf4,0xc4,0x36,
+    0x70,0xcd,0xe7,0x13,0x6c,0x6f,0x33,0x7b,0xe8,0xa7,0xe0,0xfa,0xee,0xb9,0x15,0x4c,
+    0x7c,0x0b,0xff,0x73,0xee,0x39,0x12,0xff,0x0e,0x13,0xbf,0xe0,0xdb,0xdd,0xf8,0x8a,
+    0xf8,0xb7,0x9b,0x78,0x77,0x7a,0xfd,0xfe,0x25,0xeb,0x63,0x27,0x3e,0xbe,0x00,0x93,
+    0x3a,0xee,0x40,0xff,0x2b,0xc3,0x2b,0xf5,0x78,0x3b,0x4c,0xdf,0x7f,0xcd,0xbd,0x4a,
+    0x73,0xfc,0x06,0x4c,0x74,0x3f,0x83,0xd6,0x38,0x76,0x71,0x27,0x53,0xfa,0x5b,0xea,
+    0xaa,0xef,0x4b,0xbb,0xc1,0x76,0x99,0xf9,0xdd,0x8d,0x6f,0x9d,0x97,0x2d,0x46,0xff,
+    0x3b,0xf4,0x27,0x12,0xcb,0xf7,0x60,0xa2,0xbb,0x07,0x5a,0xe3,0xdc,0xcb,0x7d,0x4f,
+    0xee,0x27,0x7b,0xcd,0xfd,0x59,0xde,0xf5,0xea,0x53,0xc7,0xba,0xdc,0x9f,0x73,0xf8,
+    0xd6,0x19,0xbd,0xb7,0x1a,0x1b,0x3f,0x80,0xdf,0xc0,0x3b,0xe2,0x8f,0x60,0x62,0xf3,
+    0x47,0xef,0xbd,0xa1,0xd1,0xbf,0xdf,0xd6,0x2a,0xee,0xe4,0x0d,0x78,0x96,0xef,0x20,
+    0x0d,0xb1,0x9f,0x6f,0xee,0xab,0x3f,0x99,0xfb,0xa8,0xd8,0xff,0x19,0x39,0xcd,0xef,
+    0x17,0x30,0xad,0xf5,0xaf,0x60,0x92,0xef,0x4f,0xd0,0x5a,0x9b,0xdf,0xb0,0x27,0xb1,
+    0xfd,0x66,0x62,0x4b,0xe2,0xbb,0x77,0xc0,0x37,0x60,0x8d,0xad,0x80,0x78,0x9a,0x9a,
+    0x6f,0x31,0x87,0x83,0xff,0x7e,0x7b,0xf8,0x0b,0x5c,0xf7,0x85,0x23,0xec,0x0b,0x93,
+    0x8c,0xcc,0xdf,0xe0,0x7a,0x1f,0x3b,0x0a,0x56,0x62,0xce,0xc1,0x63,0xd8,0x3a,0x6a,
+    0xf4,0x8e,0x13,0x87,0xde,0xd9,0x4e,0xf0,0x0d,0xad,0x14,0x79,0xc9,0xf3,0x04,0x72,
+    0xfa,0x0e,0xfb,0x0f,0xe2,0x7e,0x48,0xa9,0xf8,0x18,0x00,0x00
 };
 
 // Generated from:
@@ -175,6 +176,8 @@
 //     uint Sd;
 //     uint Ed;
 //
+//     uint srcEmulatedAlpha;
+//
 //     bool isSrcHDR;
 //     bool isSrcA2BGR10;
 // } params;
@@ -240,9 +243,7 @@
 //
 //     if(component >= params . Ns && component == 3)
 //     {
-//
-//         valueAsUint = 1;
-//
+//         valueAsUint = params . srcEmulatedAlpha;
 //     }
 //     else
 //     {
diff --git a/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000003.inc b/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000003.inc
index 2036efb..06ced61 100644
--- a/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000003.inc
+++ b/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000003.inc
@@ -11,120 +11,122 @@
 #pragma once
 constexpr uint8_t kConvertVertex_comp_00000003[] = {
     0x1f,0x8b,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0xff,0x9d,0x98,0x79,0x94,0x8f,0x65,
-    0x14,0xc7,0xdf,0x77,0x96,0xdf,0x8c,0x99,0xc1,0x58,0x86,0x2c,0x89,0xa8,0x88,0x6c,
-    0x0d,0x0a,0x49,0x47,0x1a,0x4a,0x49,0x22,0x1c,0x92,0x25,0x52,0x91,0xad,0x45,0x4d,
-    0x25,0x5b,0x28,0x4b,0xc8,0x92,0x52,0x22,0x84,0xa4,0x94,0x6c,0x09,0xe9,0x70,0x8e,
-    0xca,0x39,0x64,0x69,0x53,0x5a,0x9d,0x64,0x29,0x95,0x5d,0x3d,0xf7,0x7d,0x3f,0xd7,
-    0x5c,0xcf,0x99,0xbf,0xfa,0x9d,0xf3,0x9e,0xdf,0x7b,0xbf,0xf7,0xde,0xef,0xbd,0xcf,
-    0x7d,0xee,0xb3,0xfc,0x7e,0xc9,0x49,0x55,0xd3,0x82,0x20,0x0c,0x32,0x82,0xf4,0xa0,
-    0x4c,0x18,0x44,0x9f,0x12,0x41,0x52,0x20,0xaf,0x99,0x41,0x22,0xfa,0xce,0x6b,0xd3,
-    0xbe,0x4d,0xed,0x21,0x43,0x7b,0xd7,0xce,0x6d,0x50,0x57,0xf4,0xc5,0x82,0xe4,0xc8,
-    0x4e,0x74,0xc5,0x9d,0x4d,0xaa,0xfb,0x4e,0x71,0x4f,0xff,0x1e,0xfd,0x06,0x08,0xbe,
-    0xd7,0x3d,0xd9,0x0e,0x4f,0x89,0xb8,0x82,0xa0,0x39,0xb6,0xf2,0xb4,0x72,0xd6,0x97,
-    0xc5,0x61,0x82,0xaa,0x7c,0x2b,0x16,0x82,0xa5,0x18,0x2c,0x09,0x2c,0xdd,0x60,0xc9,
-    0x60,0x59,0x06,0x4b,0x01,0xcb,0x36,0x58,0x2a,0x58,0x69,0x83,0x25,0xc0,0x2e,0x32,
-    0x58,0x1a,0x58,0x45,0x83,0xa5,0x83,0x55,0x36,0x58,0x11,0xb0,0x6a,0x06,0xcb,0x00,
-    0xab,0x6e,0xb0,0x4c,0xb0,0x5a,0x06,0xcb,0x02,0xab,0x6b,0xb0,0xa2,0x60,0xb9,0x52,
-    0x63,0x37,0x2a,0x1d,0x6f,0x9e,0x1b,0x4d,0x2f,0x72,0xd5,0x5a,0xf4,0xf6,0x6a,0x26,
-    0xf6,0xbd,0xa9,0x85,0xd8,0xf7,0x71,0xdf,0x97,0x9e,0xd7,0xc5,0x72,0x15,0x6a,0x2a,
-    0xf2,0x0e,0x8f,0x6f,0x67,0x21,0x7c,0x3b,0x0d,0xdf,0x2e,0x8f,0x6f,0x17,0x7c,0x2a,
-    0xef,0x65,0x9c,0x15,0x91,0x73,0xc2,0x58,0x2e,0xe7,0x9e,0x52,0x6e,0x14,0x49,0x91,
-    0x7d,0x72,0xc4,0x27,0xef,0x39,0xce,0x26,0x41,0x3d,0x83,0xe8,0x3b,0x25,0xaa,0x7b,
-    0x1a,0x79,0x55,0x71,0x39,0xa5,0xf3,0xae,0x78,0x15,0x67,0x53,0xc2,0x60,0x65,0x1c,
-    0x5b,0x0e,0x1c,0xa2,0x2b,0x13,0xf1,0xc6,0x3a,0xe1,0x2b,0xcf,0x7b,0x0e,0x7c,0x15,
-    0x8c,0x6f,0x79,0x7c,0x2a,0x93,0x8f,0x60,0x95,0x5c,0xb7,0x68,0x4f,0xfc,0x9f,0x47,
-    0x62,0x5e,0x4e,0x5f,0x08,0x4f,0x13,0xe4,0x2b,0xc0,0x64,0xcc,0xd5,0xc9,0x57,0xe6,
-    0xa1,0x26,0x72,0x0d,0xe3,0x7f,0x25,0xb6,0x09,0xa3,0xaf,0x43,0xef,0xaa,0x9c,0x4b,
-    0xce,0x35,0xa9,0x61,0x53,0xe6,0x51,0xe5,0x66,0xf4,0xab,0xda,0xb7,0xf4,0xe4,0xb6,
-    0xd8,0x97,0x76,0x2c,0x77,0x18,0xbf,0x0e,0xcc,0xb7,0xca,0x5d,0x98,0x9b,0x8b,0x1d,
-    0xaa,0xfd,0x57,0x89,0x3e,0xeb,0x45,0xbe,0xf7,0x92,0x4b,0x6f,0xc6,0x2b,0x72,0x1f,
-    0x93,0x9f,0xc4,0xeb,0x6b,0xe6,0xf8,0x7e,0x74,0x76,0x7c,0xfd,0x59,0x0f,0x2a,0x3f,
-    0xc2,0x3a,0x52,0x39,0xdf,0xe4,0x25,0xf2,0x93,0xee,0xf9,0x37,0xb9,0x40,0x1e,0xce,
-    0xda,0xd1,0xbc,0x9f,0x35,0xfe,0x22,0x4f,0xf1,0xea,0x35,0x8f,0x39,0x90,0x7c,0xde,
-    0x60,0xee,0xab,0x1b,0xfe,0x37,0x85,0xdf,0x7d,0x54,0x5e,0x62,0xe6,0x4b,0xfc,0xd7,
-    0x22,0x4b,0x5d,0x76,0x98,0xba,0xc8,0x7a,0xd9,0x01,0xef,0x17,0xc4,0xdc,0x49,0x5d,
-    0x44,0xde,0x05,0x56,0xd6,0xc9,0xbb,0xf1,0x4b,0xc6,0x7e,0x0f,0x9c,0xbb,0xb1,0xdf,
-    0xc3,0xbe,0x19,0xa2,0xff,0x92,0xf7,0x84,0xc9,0xa3,0x74,0x18,0xef,0xa5,0xb5,0x9c,
-    0x24,0x7e,0xb2,0xe6,0x04,0x5b,0x4b,0x8e,0x0d,0x5d,0xd7,0x24,0x31,0xd7,0x01,0xb1,
-    0x4e,0x38,0x24,0x95,0x18,0x32,0xee,0xdf,0x18,0xbf,0xca,0x07,0x3d,0xf9,0x98,0x27,
-    0x4b,0x12,0x56,0x0e,0x8d,0x2c,0x6b,0x2a,0xc5,0xd3,0xa7,0x7a,0x72,0xba,0x67,0x9f,
-    0xe1,0xe9,0x4b,0x20,0xdf,0xe0,0xb2,0x94,0x31,0xff,0x40,0x1d,0xa4,0x17,0xaf,0x63,
-    0xdc,0x3f,0x82,0x8b,0x8d,0xac,0x97,0x9f,0x58,0x63,0x7d,0x8d,0xcd,0xcf,0xe0,0xcb,
-    0x9c,0x8d,0xf4,0xf8,0x2f,0xf8,0x09,0x7e,0xdc,0x55,0xe2,0x00,0x35,0x39,0xe5,0xec,
-    0x45,0xf7,0xab,0x7b,0x0e,0x50,0x1f,0x79,0x3f,0xeb,0x06,0x2a,0xef,0x07,0xa2,0xf5,
-    0x94,0x1c,0xd5,0xa9,0x0b,0xef,0x07,0x79,0x3f,0xe9,0xf4,0xbf,0xe3,0x23,0xdf,0xff,
-    0x38,0xae,0xc3,0xee,0xfb,0x08,0xdc,0xa2,0x3f,0x8a,0xfe,0xa8,0xc9,0xed,0x0f,0xea,
-    0xbc,0x9c,0xdc,0xfe,0x04,0x5b,0x4b,0x3e,0x22,0x1f,0x72,0xcf,0x61,0x7c,0x0f,0x99,
-    0x7a,0xfc,0x55,0x48,0x3d,0xfe,0x06,0x1f,0xe5,0x6c,0x12,0x51,0x1e,0x31,0xb6,0xd6,
-    0xd8,0x1c,0x27,0xe6,0x70,0x6c,0x4e,0x60,0x77,0x9c,0x31,0x1d,0x03,0x53,0xfb,0x93,
-    0xcc,0xbd,0xd6,0xf8,0x14,0x35,0x5e,0x62,0x6c,0x4e,0x83,0x6b,0x8d,0xcf,0xe0,0x77,
-    0x9a,0x1a,0x9f,0x33,0x35,0x3e,0x13,0xd5,0x34,0x88,0x30,0x19,0xd3,0x59,0xea,0xa3,
-    0x63,0x3c,0x67,0x78,0x93,0xc2,0x38,0xb6,0xe4,0x25,0xfd,0x25,0xf2,0xb5,0xe4,0x9d,
-    0x1c,0xca,0x79,0x12,0xf7,0x9d,0xe8,0xa5,0x1f,0x05,0x53,0xdf,0x04,0x17,0x0b,0xd1,
-    0x49,0xef,0x25,0xf0,0x8d,0xce,0x85,0x30,0x3e,0xe7,0x53,0xd1,0x47,0xbd,0x6a,0x7c,
-    0x8b,0x98,0xb8,0xd2,0xa7,0x45,0xd0,0x89,0x6f,0x66,0x18,0xf7,0xb6,0xe8,0xa4,0x67,
-    0x33,0x23,0xde,0x44,0xe4,0x97,0x15,0xca,0xfa,0x8f,0x7b,0x3b,0xc3,0xf0,0x15,0x0d,
-    0xe3,0xf5,0xf5,0x09,0xb9,0x17,0x0b,0x63,0x2c,0x2b,0x2c,0xe8,0x29,0xc1,0xa4,0x0e,
-    0x47,0xa8,0xc3,0x11,0x53,0x87,0xe2,0xe1,0x85,0x73,0x96,0x1d,0xc6,0xd8,0x12,0xd3,
-    0x87,0xd9,0xe1,0x85,0x7d,0x78,0xd8,0xf8,0x97,0x24,0xbe,0xd8,0xca,0xba,0x2a,0x49,
-    0x2d,0x64,0x4f,0x28,0x15,0xc6,0xe7,0xb9,0xe0,0xd2,0xeb,0xd7,0xb8,0xa7,0x21,0x71,
-    0x32,0x99,0x37,0x39,0x33,0x1a,0x39,0xdf,0x34,0xce,0x24,0x7d,0xcf,0x20,0x56,0x96,
-    0x89,0x55,0x0d,0x1b,0xed,0x97,0x9a,0xf4,0x4b,0x0d,0x63,0x53,0x0b,0x5c,0xfb,0xf4,
-    0x2a,0xfc,0x6a,0x19,0x9b,0xda,0xf0,0x2b,0x4f,0x5d,0x78,0xea,0x18,0x9b,0x7a,0xe0,
-    0xca,0x53,0x1f,0xbf,0x7a,0xa6,0x56,0x57,0xc3,0x5f,0xdf,0x70,0x35,0x80,0x2b,0xd7,
-    0x70,0x35,0x04,0x57,0xbf,0x46,0xf8,0x36,0x8c,0x7a,0x35,0x29,0x92,0x6d,0x6d,0x8a,
-    0x17,0x52,0x9b,0xa2,0xe6,0xbd,0x18,0xb5,0xc9,0x36,0x7b,0x5a,0x63,0xf6,0x50,0x8d,
-    0xd9,0x04,0x9f,0x71,0x70,0x5e,0x07,0xd6,0xd4,0x8c,0xe9,0x7a,0xf0,0x66,0xcc,0x5f,
-    0xe3,0xf3,0x58,0xcc,0xd1,0x1c,0x5e,0xc9,0xb1,0xb9,0x97,0x63,0xa9,0x40,0xef,0xed,
-    0x05,0x79,0x95,0x24,0xaf,0xd2,0x26,0xaf,0x16,0xde,0xde,0xde,0xda,0x93,0xbb,0x7a,
-    0x72,0x37,0x4f,0xee,0xee,0xc9,0x3d,0x3d,0x79,0x88,0x27,0x0f,0xf3,0xe4,0x31,0x9e,
-    0x3c,0xc1,0x93,0x67,0x79,0xf2,0x6c,0x23,0xcb,0xb9,0xbd,0xc0,0xd3,0xaf,0xf1,0xe4,
-    0x4d,0x5e,0xdd,0x6f,0xa4,0x0e,0xda,0x0f,0x37,0xd1,0x0f,0x2d,0x8d,0x4d,0x1e,0xf8,
-    0x18,0x6a,0xd9,0x0a,0xbf,0x3c,0xe6,0xa1,0x05,0x98,0xda,0xdf,0xec,0x71,0xde,0x52,
-    0x08,0x67,0x1b,0x70,0x9d,0xef,0x5b,0xf1,0x6b,0x03,0x67,0x6b,0x30,0xb5,0xbf,0x8d,
-    0xb9,0x50,0xce,0xdb,0xe1,0x6c,0x6b,0x6c,0xda,0x81,0xeb,0xde,0xdb,0x1e,0xbf,0x76,
-    0xc6,0xe6,0x4e,0x78,0xf4,0x9c,0xe9,0x08,0x26,0xf7,0xbc,0x85,0x60,0x77,0xe1,0xdb,
-    0x91,0x3d,0xbb,0xb3,0xd9,0xb3,0x45,0xd7,0xc9,0x3d,0x9d,0xe9,0x9d,0x4e,0xf4,0x5b,
-    0x17,0xe4,0xce,0x26,0xd6,0xdd,0xf4,0x93,0x8c,0xa7,0x1b,0xb2,0xea,0xee,0x21,0x0f,
-    0xd1,0x75,0x47,0xd6,0xbd,0xb3,0x07,0xfb,0x4d,0x37,0xfa,0x49,0x6c,0xba,0x82,0xab,
-    0xff,0x7d,0xf4,0xa2,0xce,0x49,0x3f,0xb0,0xa6,0x51,0x8d,0x12,0xd1,0x9d,0xf2,0x01,
-    0xee,0x9d,0x7d,0xd1,0xab,0xef,0x83,0xe8,0x84,0xb7,0x27,0xb2,0xd6,0x75,0x00,0x75,
-    0xed,0x6f,0xec,0x1f,0x02,0x5f,0x42,0x7d,0x06,0x82,0x75,0xa1,0x3e,0x83,0x4d,0x7d,
-    0x44,0x37,0xc8,0x3d,0x33,0xa9,0xc7,0x20,0xc3,0x33,0x94,0x31,0x2f,0x86,0xe7,0x61,
-    0xb0,0x0e,0xd1,0xfd,0x32,0x11,0xdd,0x2b,0x1f,0x05,0xcf,0xe5,0xce,0x9b,0x8f,0xef,
-    0x63,0xe8,0x24,0xe7,0x21,0xc8,0xca,0xfb,0xb8,0xc7,0xfb,0x04,0x98,0xe5,0x7d,0x0a,
-    0x3c,0x9f,0xbb,0xb2,0xf2,0x3e,0x8d,0x4e,0x78,0x87,0x21,0x6b,0x2d,0x9e,0xa1,0x16,
-    0xc3,0x4d,0xac,0x11,0xe0,0x5a,0x8b,0x91,0x60,0x5a,0x8b,0xd1,0xa6,0x16,0x23,0xa3,
-    0xbd,0x2b,0x08,0xc6,0x53,0x8b,0x51,0x86,0x67,0x2c,0x39,0xeb,0xde,0x36,0x8e,0x3b,
-    0xfa,0x58,0x72,0x19,0x03,0x26,0xe7,0xd8,0x68,0xfc,0xc7,0x1b,0xff,0xe7,0xbc,0x31,
-    0x3f,0x0f,0xd6,0x81,0x3c,0x26,0x99,0x3c,0x44,0x37,0xd1,0x3d,0x93,0xe1,0x99,0x48,
-    0x8c,0x09,0xe6,0xce,0x36,0x09,0xdd,0x64,0x13,0xe3,0x05,0xf6,0x2b,0x95,0xa7,0x12,
-    0x73,0x04,0x39,0x4f,0xe3,0x77,0xc4,0x54,0x33,0x8e,0x17,0xf1,0x9b,0x66,0xce,0x8f,
-    0xe9,0xe0,0x53,0x4c,0xdc,0xe9,0x5e,0xdc,0x49,0x26,0xce,0x0c,0xf6,0x3d,0xad,0xc3,
-    0x0c,0xaf,0x0e,0xa3,0x91,0x07,0x23,0xcf,0x34,0xbe,0x2f,0xb1,0x2e,0xc4,0x77,0x16,
-    0xb2,0xce,0xe7,0xcb,0x85,0x9c,0x9b,0xaf,0x80,0x8b,0xfd,0x6c,0x64,0x5d,0x87,0x73,
-    0x38,0xdb,0x66,0xb1,0xcf,0x6a,0x3e,0x73,0x0c,0xe7,0xab,0x85,0x70,0xbe,0x06,0xae,
-    0x35,0x99,0x0b,0xd6,0xcc,0xf4,0xef,0x5c,0x63,0xff,0x3a,0x75,0xd6,0xb9,0x9c,0x0f,
-    0x36,0x8f,0xb9,0x5c,0x64,0xe6,0x72,0x7e,0xb4,0x4f,0x89,0x6d,0x3c,0xf6,0x85,0x70,
-    0x2e,0xe0,0x37,0x9a,0xd4,0x65,0x11,0xba,0xc5,0x26,0xc6,0x52,0x62,0x6c,0x76,0x31,
-    0x64,0x3d,0xbc,0xc5,0xbd,0x75,0x29,0xf3,0x59,0x3d,0xda,0x37,0x0b,0x70,0xe5,0x5c,
-    0xe6,0x71,0x2e,0x82,0x53,0xec,0xdf,0xe6,0xbc,0xd1,0xb5,0xb4,0x1c,0x4c,0xd7,0xd2,
-    0x72,0x6f,0x9e,0x06,0x9b,0x7c,0xde,0xf1,0xf6,0xf3,0x77,0x0b,0xd9,0xcf,0x57,0x80,
-    0xeb,0x7e,0xfe,0x1e,0x7e,0x2b,0x8c,0xcd,0xfb,0xde,0x3a,0x58,0x09,0x66,0xf7,0xf3,
-    0x0f,0xf0,0x5d,0x49,0x3d,0x57,0x9b,0x7a,0x8a,0x6e,0x95,0x7b,0xd6,0x91,0xe3,0x2a,
-    0xf2,0x5f,0xc3,0x6f,0x05,0xc9,0x7f,0x35,0xba,0x75,0x26,0xee,0x87,0x9c,0xed,0x2a,
-    0xaf,0xe7,0xec,0xde,0xc4,0x9c,0x7f,0x84,0xcd,0x7a,0x63,0xb3,0x81,0xf3,0x7e,0x0b,
-    0x36,0x1b,0xb1,0xdb,0x60,0x62,0x6e,0xf4,0x62,0xae,0x36,0xfe,0x1f,0x73,0x9e,0x8b,
-    0xed,0x26,0x64,0xd5,0x6d,0xe6,0x6c,0x97,0xb3,0x68,0xb3,0xb9,0xfb,0xe4,0xf0,0x3f,
-    0x5e,0x10,0xfd,0x37,0x54,0x70,0xf7,0x29,0x0b,0x7f,0x39,0xc3,0xb1,0x05,0x7c,0x20,
-    0xf7,0xfb,0xad,0x60,0xc2,0xb9,0xd5,0xbb,0x4f,0x55,0x82,0xb3,0x82,0xe1,0xac,0xc8,
-    0x7b,0xf9,0xe8,0x7f,0x80,0x98,0xff,0x12,0x73,0xf7,0xd8,0x66,0xee,0x1e,0xc2,0xff,
-    0x29,0x76,0xf9,0xf4,0xd3,0x67,0x60,0xda,0x4f,0x9f,0x83,0xc9,0x78,0xb7,0x21,0x6b,
-    0xae,0xdb,0xe1,0x93,0xdc,0xb6,0x9b,0xdc,0x92,0xcc,0x7f,0x72,0x95,0x4d,0x6e,0x55,
-    0xc8,0xa7,0xaa,0xf9,0xdd,0xf8,0x55,0x21,0xbf,0x1b,0xbf,0x06,0xd7,0xbe,0xfc,0x86,
-    0xbe,0xcc,0x37,0x36,0xdf,0x82,0xeb,0xd9,0xbb,0x0f,0xac,0xa9,0xd9,0xf3,0xbe,0x83,
-    0x6b,0x9f,0xf1,0xfb,0x9e,0x3c,0xf4,0x7c,0xde,0xcf,0xff,0x1f,0x7d,0xb1,0x97,0x71,
-    0xee,0xc7,0x4e,0x7f,0x7f,0xfc,0x07,0x72,0xf2,0x9c,0xa8,0x7c,0x16,0x00,0x00
+    0x14,0xc7,0xdf,0x77,0x66,0xfc,0x8c,0x31,0xc6,0x36,0x63,0x4f,0x44,0x45,0x64,0x6b,
+    0x2c,0x21,0xe9,0x48,0x43,0x4d,0x49,0x22,0x1c,0x92,0x25,0x52,0x91,0xad,0x45,0x4d,
+    0x25,0x5b,0x28,0x4b,0xc8,0x92,0x52,0x22,0x84,0xa4,0x94,0x2c,0x25,0xd9,0x3a,0x39,
+    0x47,0xe5,0x1c,0xb2,0xb4,0x29,0xad,0x4e,0xd6,0x84,0x14,0x7a,0xee,0xfb,0x7e,0xae,
+    0xb9,0x9e,0x33,0x7f,0xf5,0x3b,0xe7,0x3d,0xbf,0xf7,0x7e,0xef,0xbd,0xdf,0x7b,0x9f,
+    0xfb,0xdc,0x67,0xf9,0xfd,0x92,0x93,0xaa,0x15,0x0e,0x82,0x30,0x48,0x0b,0x52,0x83,
+    0xf2,0x61,0x10,0x7d,0x4a,0x06,0x49,0x81,0xbc,0x16,0x0d,0x12,0xd1,0x77,0x4e,0x6e,
+    0x87,0xdc,0x3a,0x43,0x87,0xf5,0xa9,0x93,0xdd,0xb0,0x9e,0xe8,0x33,0x82,0xe4,0xc8,
+    0x4e,0x74,0xc5,0x9d,0x4d,0x21,0xf7,0x9d,0xe2,0x9e,0x01,0x3d,0xfb,0x0f,0x14,0x7c,
+    0x9f,0x7b,0x4a,0x38,0x3c,0x25,0xe2,0x0a,0x82,0x96,0xd8,0xca,0xd3,0xc6,0x59,0x5f,
+    0x1e,0x87,0x09,0xaa,0xf1,0xad,0x58,0x08,0x96,0x62,0xb0,0x24,0xb0,0x54,0x83,0x25,
+    0x83,0xa5,0x1b,0x2c,0x05,0xac,0x84,0xc1,0x0a,0x81,0x65,0x1a,0x2c,0x01,0x56,0xce,
+    0x60,0x85,0xc1,0x2a,0x19,0x2c,0x15,0xac,0x8a,0xc1,0x8a,0x80,0x55,0x37,0x58,0x1a,
+    0x58,0x0d,0x83,0x15,0x05,0xab,0x6d,0xb0,0x74,0xb0,0x7a,0x06,0x2b,0x06,0x96,0x6d,
+    0xb0,0x0c,0xb0,0x26,0x52,0x77,0x37,0x52,0xad,0x41,0x8e,0x1b,0x61,0x6f,0xf2,0xd7,
+    0xfa,0xf4,0xf1,0xea,0x28,0xf6,0x7d,0xa8,0x8f,0xd8,0xf7,0x75,0xdf,0x97,0x5d,0xd0,
+    0xc5,0x72,0x55,0xea,0x2c,0xf2,0x4e,0x8f,0x6f,0x57,0x01,0x7c,0xbb,0x0c,0xdf,0x6e,
+    0x8f,0x6f,0x37,0x7c,0x2a,0xef,0x63,0xec,0x95,0x90,0xcb,0x85,0xb1,0x5c,0xde,0x3d,
+    0xa5,0xdd,0x28,0x92,0x22,0xfb,0xe4,0x88,0x4f,0xde,0xb3,0x9c,0x4d,0x82,0x1a,0x07,
+    0xd1,0x77,0x4a,0x34,0x17,0x85,0xc9,0xab,0xaa,0xcb,0x29,0x95,0x77,0xc5,0xab,0x3a,
+    0x9b,0x92,0x06,0x2b,0xe3,0xd8,0xb2,0xe0,0x10,0x5d,0x99,0x88,0x37,0xd6,0x09,0x5f,
+    0x05,0xde,0xb3,0xe0,0xab,0x68,0x7c,0x2b,0xe0,0x53,0x85,0x7c,0x04,0xab,0xec,0xd8,
+    0xb5,0x4f,0xfe,0xef,0x23,0x71,0xaf,0xa0,0x5f,0x84,0xab,0x19,0xf2,0x95,0x60,0x32,
+    0xee,0x1a,0xe4,0x2c,0x73,0x51,0x0b,0xb9,0xa6,0xf1,0xbf,0x0a,0xdb,0x84,0xd1,0xd7,
+    0xa5,0xa7,0x55,0xce,0x26,0xef,0x5a,0xd4,0xb1,0x39,0x73,0xa9,0x72,0x0b,0xfa,0x58,
+    0xed,0x5b,0x7b,0x72,0x3b,0xec,0x33,0x1d,0xcb,0x1d,0xc6,0xaf,0x23,0x73,0xae,0x72,
+    0x57,0xe6,0xe7,0x12,0x87,0x6a,0x0f,0x56,0xa6,0xd7,0x7a,0x93,0xef,0xbd,0xe4,0xd2,
+    0x87,0xf1,0x8a,0xdc,0xd7,0xe4,0x27,0xf1,0xfa,0x99,0x79,0xbe,0x1f,0x9d,0x1d,0xdf,
+    0x00,0xd6,0x84,0xca,0x8f,0xb0,0xbe,0x54,0xce,0x33,0x79,0x89,0xfc,0xa4,0x7b,0xce,
+    0x27,0xe7,0xcb,0x23,0x58,0x3f,0x9a,0xf7,0xb3,0xc6,0x5f,0xe4,0xa9,0x5e,0xbd,0xe6,
+    0x33,0x07,0x92,0xcf,0x1b,0xcc,0x7f,0x0d,0xc3,0xff,0xa6,0xf0,0xbb,0x8f,0xca,0x4b,
+    0xbd,0xf9,0x5a,0xc7,0xba,0x96,0xba,0xec,0x34,0x75,0x91,0x35,0xb3,0x13,0xde,0xaf,
+    0x88,0xb9,0x8b,0xba,0x88,0xbc,0x1b,0xac,0xac,0x93,0xf7,0xe0,0x97,0x8c,0xfd,0x5e,
+    0x62,0xec,0xc1,0x7e,0x2f,0xfb,0x69,0x88,0xfe,0x6b,0xde,0x13,0x66,0x1c,0x27,0x4c,
+    0x5e,0x22,0x97,0x0d,0xe3,0x3d,0xb7,0xb6,0x93,0x84,0x47,0xd6,0xa1,0x60,0x27,0xb0,
+    0x6d,0xe4,0xba,0x28,0x89,0xb9,0x0f,0x88,0x7d,0xda,0x21,0x85,0x88,0x29,0x75,0xf8,
+    0x83,0x7a,0xa8,0x7c,0xc8,0x93,0x4f,0x7a,0x72,0x72,0x78,0xb1,0x9c,0x62,0xe4,0x68,
+    0x0d,0x7a,0xfa,0x54,0x4f,0x2e,0xea,0xd9,0x17,0xf3,0xf4,0x99,0xc8,0x37,0xb8,0x2c,
+    0xa5,0x06,0x3f,0x51,0x17,0xe9,0xcd,0xeb,0x18,0xf7,0xcf,0xe0,0x62,0x23,0xeb,0xe7,
+    0x17,0xd6,0x5c,0x3f,0x63,0xf3,0x2b,0xf8,0x72,0x67,0x23,0x3d,0xff,0x1b,0x7e,0x82,
+    0x9f,0x72,0x95,0x38,0x48,0x4d,0xce,0x38,0x7b,0xd1,0xfd,0xee,0x9e,0x83,0xd4,0x47,
+    0xde,0xcf,0xba,0x4a,0xcb,0xfb,0xc1,0x68,0x7d,0x25,0x47,0x75,0xea,0xca,0xfb,0x21,
+    0xde,0xff,0x76,0xfa,0xc3,0xf8,0x1c,0x8e,0x6a,0x95,0x12,0x1c,0x75,0xdf,0xc7,0xe0,
+    0x16,0xfd,0x71,0xf4,0xc7,0x4d,0x6e,0x7f,0x52,0xe7,0x15,0xe4,0xf6,0x17,0xd8,0x09,
+    0xf2,0x11,0xf9,0x88,0x7b,0x8e,0xe2,0x7b,0xc4,0xd4,0xe3,0x54,0x01,0xf5,0x38,0x0d,
+    0x3e,0xda,0xd9,0x24,0xa2,0xb8,0x31,0x76,0xc2,0xd8,0x9c,0x21,0xe6,0x08,0x6c,0xfe,
+    0xc1,0xee,0x0c,0x63,0x3a,0x09,0xa6,0xf6,0xff,0x32,0xf7,0x5a,0xe3,0xb3,0xd4,0x78,
+    0xa9,0xb1,0x39,0x07,0xae,0x35,0x3e,0x8f,0xdf,0x39,0x6a,0x1c,0x86,0xf9,0x35,0x3e,
+    0xcf,0x45,0x42,0x30,0x19,0x93,0xbc,0x4b,0x7d,0x74,0x8c,0x82,0x2b,0x6f,0xa1,0x30,
+    0x8e,0x2d,0x79,0x49,0x7f,0x89,0x7c,0x2d,0x79,0x27,0x42,0x39,0x63,0xe2,0xbe,0x13,
+    0xbd,0xf4,0x63,0xc2,0xf8,0x16,0x09,0xe3,0x1e,0x15,0x9d,0xf4,0x5e,0x11,0x7c,0xe5,
+    0x5c,0x48,0x0b,0xe3,0xfb,0x40,0x2a,0x7a,0xe9,0xd5,0x34,0xe3,0x9b,0x6e,0xe2,0x4a,
+    0x9f,0xa6,0xa3,0x13,0xdf,0x8c,0x30,0xee,0x6d,0xd1,0x49,0xcf,0x66,0x44,0xbc,0x89,
+    0xc8,0xaf,0x78,0x28,0xfb,0x41,0xdc,0xdb,0xc5,0x0c,0x5f,0x89,0x30,0x5e,0x5f,0x5b,
+    0xc8,0xbd,0x64,0x18,0x63,0xc5,0xc3,0xfc,0x9e,0x2a,0x49,0x1d,0x8e,0x51,0x87,0x63,
+    0xa6,0xbe,0xa5,0xc2,0x8b,0xe7,0xac,0x74,0x18,0x63,0x4b,0x4d,0x1f,0x96,0x0e,0x2f,
+    0xee,0xc3,0xa3,0xc6,0x3f,0x8b,0xf8,0x62,0x2b,0xeb,0x2a,0x8b,0x5a,0xc8,0x9e,0x50,
+    0x26,0x8c,0xcf,0x78,0xc1,0xa5,0xd7,0x9b,0xb8,0xa7,0x11,0x71,0x8a,0xd2,0xbf,0x72,
+    0x86,0x34,0x96,0x3a,0x71,0x46,0xe9,0x7b,0x1a,0xb1,0xd2,0x4d,0xac,0xea,0xd8,0x68,
+    0xbf,0xd4,0xa2,0x5f,0x6a,0x1a,0x9b,0xda,0xe0,0xda,0xa7,0x57,0xe3,0x57,0xdb,0xd8,
+    0xd4,0x81,0x5f,0x79,0xea,0xc1,0x53,0xd7,0xd8,0xd4,0x07,0x57,0x9e,0x06,0xf8,0xd5,
+    0x37,0xb5,0xba,0x06,0xfe,0x06,0x86,0xab,0x21,0x5c,0xd9,0x86,0xab,0x11,0xb8,0xfa,
+    0x35,0xc6,0xb7,0x51,0xd4,0xc7,0x49,0x91,0x6c,0x6b,0x53,0xbc,0x80,0xda,0x14,0x33,
+    0xef,0x19,0xd4,0xa6,0x84,0xd9,0xd3,0x9a,0xb2,0x87,0x6a,0xcc,0x66,0xf8,0x8c,0x87,
+    0xf3,0x3a,0xb0,0xe6,0x66,0x4c,0xd7,0x83,0xb7,0x60,0xfe,0x9a,0x5e,0xc0,0x62,0x8e,
+    0x96,0xf0,0x4a,0x8e,0x2d,0xbd,0x1c,0x4b,0x07,0x7a,0xbf,0xcf,0xcf,0xab,0x14,0x79,
+    0x65,0x9a,0xbc,0x5a,0x79,0x7b,0x7b,0x5b,0x4f,0xee,0xe6,0xc9,0xdd,0x3d,0xb9,0x87,
+    0x27,0xf7,0xf2,0xe4,0xa1,0x9e,0x3c,0xdc,0x93,0xc7,0x7a,0xf2,0x44,0x4f,0x9e,0xed,
+    0xc9,0x73,0x8c,0x2c,0xe7,0xf8,0x42,0x4f,0xbf,0xd6,0x93,0x37,0x7b,0x75,0xbf,0x91,
+    0x3a,0x68,0x3f,0xdc,0x44,0x3f,0xb4,0x36,0x36,0x39,0xe0,0x63,0xa9,0x65,0x1b,0xfc,
+    0x72,0x98,0x87,0x56,0x60,0x6a,0x7f,0xb3,0xc7,0x79,0x4b,0x01,0x9c,0xb9,0xe0,0x3a,
+    0xdf,0xb7,0xe2,0x97,0x0b,0x67,0x5b,0x30,0xb5,0xbf,0x8d,0xb9,0x50,0xce,0xdb,0xe1,
+    0x6c,0x67,0x6c,0xda,0x83,0xeb,0xde,0xdb,0x01,0xbf,0xf6,0xc6,0xe6,0x4e,0x78,0xf4,
+    0x9c,0xe9,0x04,0x26,0xf7,0xbe,0x45,0x60,0x77,0xe1,0xdb,0x89,0x3d,0xbb,0x8b,0x39,
+    0x17,0x45,0xd7,0xd9,0x3d,0x5d,0xe8,0x9d,0xce,0xf4,0x5b,0x57,0xe4,0x2e,0x26,0xd6,
+    0xdd,0xf4,0x93,0x8c,0xa7,0x3b,0xb2,0xea,0xee,0x21,0x0f,0xd1,0xf5,0x40,0xd6,0xbd,
+    0xb3,0x27,0xfb,0x4d,0x77,0xfa,0x49,0x6c,0xba,0x81,0xab,0xff,0x7d,0xf4,0xa2,0xce,
+    0x49,0x7f,0xb0,0xe6,0x51,0x8d,0x12,0xd1,0x1d,0xf3,0x01,0xee,0xa1,0xfd,0xd0,0xab,
+    0xef,0x83,0xe8,0x84,0xb7,0x17,0xb2,0xd6,0x75,0x20,0x75,0x1d,0x60,0xec,0x1f,0x02,
+    0x5f,0x4a,0x7d,0x06,0x81,0x75,0xa5,0x3e,0x43,0x4c,0x7d,0x44,0x37,0xd8,0x3d,0xb3,
+    0xa8,0xc7,0x60,0xc3,0x33,0x8c,0x31,0x2f,0x81,0xe7,0x61,0xb0,0x8e,0xd1,0x7d,0x33,
+    0x11,0xdd,0x2b,0x1f,0x05,0xcf,0xe6,0x0e,0x9c,0x87,0xef,0x63,0xe8,0x24,0xe7,0xa1,
+    0xc8,0xca,0xfb,0xb8,0xc7,0xfb,0x04,0x98,0xe5,0x7d,0x0a,0x3c,0x8f,0xbb,0xb3,0xf2,
+    0x3e,0x8d,0x4e,0x78,0x87,0x23,0x6b,0x2d,0x9e,0xa1,0x16,0x23,0x4c,0xac,0x91,0xe0,
+    0x5a,0x8b,0x51,0x60,0x5a,0x8b,0x31,0xa6,0x16,0xa3,0xa2,0xbd,0x2b,0x08,0x26,0x50,
+    0x8b,0xd1,0x86,0x67,0x1c,0x39,0xeb,0xde,0x36,0x9e,0x3b,0xfb,0x38,0x72,0x19,0x0b,
+    0x26,0xe7,0xd8,0x18,0xfc,0x27,0x18,0xff,0xe7,0xbc,0x31,0x3f,0x0f,0xd6,0x91,0x3c,
+    0x26,0x9b,0x3c,0x44,0x37,0xc9,0x3d,0x53,0xe0,0x99,0x44,0x8c,0x89,0xe6,0xce,0x36,
+    0x19,0xdd,0x14,0x13,0xe3,0x05,0xf6,0x2b,0x95,0xa7,0x11,0x73,0x24,0x39,0x4f,0xe7,
+    0x77,0xc5,0x34,0x33,0x8e,0x17,0xf1,0x9b,0x6e,0xce,0x8f,0x19,0xe0,0x53,0x4d,0xdc,
+    0x19,0x5e,0xdc,0xc9,0x26,0xce,0x4c,0xf6,0x3d,0xad,0xc3,0x4c,0xaf,0x0e,0x63,0x90,
+    0x87,0x20,0xcf,0x32,0xbe,0x2f,0xb1,0x2e,0xc4,0x77,0x36,0xb2,0xce,0xe7,0xcb,0x05,
+    0x9c,0x9b,0xaf,0x80,0x8b,0xfd,0x1c,0x64,0x5d,0x87,0x73,0x39,0xdb,0x66,0xb3,0xcf,
+    0x6a,0x3e,0x73,0x0d,0xe7,0xab,0x05,0x70,0xbe,0x06,0xae,0x35,0x99,0x07,0xd6,0xc2,
+    0xf4,0xef,0x3c,0x63,0xff,0x3a,0x75,0xd6,0xb9,0x5c,0x00,0x36,0x9f,0xb9,0x5c,0x6c,
+    0xe6,0x72,0x41,0xb4,0x4f,0x89,0x6d,0x3c,0xf6,0x45,0x70,0x2e,0xe4,0x37,0x9b,0xd4,
+    0x65,0x31,0xba,0x25,0x26,0xc6,0x32,0x62,0x6c,0x76,0x31,0x64,0x3d,0xbc,0xc5,0xbd,
+    0x75,0x19,0xf3,0x59,0x23,0xda,0x37,0xf3,0x71,0xe5,0x5c,0xee,0x71,0x2e,0x86,0x53,
+    0xec,0xdf,0xe6,0xbc,0xd1,0xb5,0xb4,0x02,0x4c,0xd7,0xd2,0x0a,0x6f,0x9e,0x86,0x98,
+    0x7c,0xde,0xf1,0xf6,0xf3,0x77,0x0b,0xd8,0xcf,0x57,0x82,0xeb,0x7e,0xfe,0x1e,0x7e,
+    0x2b,0x8d,0xcd,0xfb,0xde,0x3a,0x58,0x05,0x66,0xf7,0xf3,0x0f,0xf0,0x5d,0x45,0x3d,
+    0xd7,0x98,0x7a,0x8a,0x6e,0xb5,0x7b,0xd6,0x93,0xe3,0x6a,0x93,0xd3,0x87,0xe4,0xb4,
+    0xce,0xc4,0xfb,0x08,0x5c,0xc6,0xb8,0x16,0x59,0xc6,0xb8,0x06,0xff,0xf5,0xc6,0xf6,
+    0x63,0xce,0x7f,0x95,0x37,0x70,0xbe,0x6f,0xa4,0x2f,0x3e,0xc1,0x66,0x83,0xb1,0xd9,
+    0xc8,0x9d,0xe0,0x53,0x6c,0x36,0x61,0xb7,0xd1,0xc4,0xdc,0xe4,0xc5,0x5c,0x63,0xfc,
+    0xb7,0x70,0xe6,0x8b,0xed,0x66,0x64,0xd5,0x6d,0xe5,0xfc,0x97,0xf3,0x6a,0xab,0xb9,
+    0x1f,0x65,0xf1,0x9f,0x60,0x10,0xfd,0xa7,0x94,0x7f,0x3f,0x2a,0x0b,0x7f,0x79,0xc3,
+    0xf1,0x19,0xf8,0x20,0x7e,0x03,0x6c,0x03,0x13,0xce,0x6d,0xde,0x9d,0xab,0x32,0x9c,
+    0x15,0x0d,0x67,0x25,0xde,0x2b,0x44,0xff,0x1d,0xc4,0xfc,0x97,0x9a,0xfb,0xc9,0x76,
+    0x73,0x3f,0x11,0xfe,0xcf,0xb1,0xcb,0xa3,0xe7,0xbe,0x00,0xd3,0x9e,0xfb,0x12,0x4c,
+    0xc6,0xbb,0x1d,0x59,0x73,0xdd,0x01,0x9f,0xe4,0xb6,0xc3,0xe4,0x96,0x64,0xfe,0xcb,
+    0xab,0x62,0x72,0xab,0x4a,0x3e,0xd5,0xcc,0x6f,0xcb,0x6f,0x0a,0xf8,0x6d,0xf9,0x2d,
+    0xb8,0xf6,0xc9,0x77,0xf4,0x49,0x9e,0xb1,0xf9,0x1e,0x5c,0xcf,0xe7,0xfd,0x60,0xcd,
+    0xcd,0xbe,0xf8,0x03,0x5c,0xfb,0x8d,0xdf,0x8f,0xe4,0xa1,0x67,0xf8,0x01,0xfe,0x33,
+    0xe9,0x87,0xbd,0x8c,0xf3,0x00,0x76,0xfa,0x1b,0xe5,0x3f,0x7c,0x96,0x24,0x0b,0xc8,
+    0x16,0x00,0x00
 };
 
 // Generated from:
@@ -163,6 +165,8 @@
 //     uint Sd;
 //     uint Ed;
 //
+//     uint srcEmulatedAlpha;
+//
 //     bool isSrcHDR;
 //     bool isSrcA2BGR10;
 // } params;
@@ -228,9 +232,7 @@
 //
 //     if(component >= params . Ns && component == 3)
 //     {
-//
-//         valueAsUint = 1;
-//
+//         valueAsUint = params . srcEmulatedAlpha;
 //     }
 //     else
 //     {
diff --git a/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000004.inc b/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000004.inc
index d334771..d8c3d77 100644
--- a/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000004.inc
+++ b/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000004.inc
@@ -11,136 +11,137 @@
 #pragma once
 constexpr uint8_t kConvertVertex_comp_00000004[] = {
     0x1f,0x8b,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0xff,0x9d,0x98,0x77,0x70,0x57,0x45,
-    0x10,0xc7,0xdf,0xa5,0x0b,0xa1,0x04,0x48,0x10,0x81,0x40,0x28,0x1a,0x20,0x84,0x00,
-    0xa1,0x07,0xc4,0x41,0xc4,0x82,0x05,0x15,0x15,0x46,0x2c,0x88,0xc6,0x06,0x16,0xb0,
-    0x83,0x82,0x4a,0x13,0x0b,0x0a,0x4a,0x11,0x1b,0xd6,0x08,0x58,0xb1,0x61,0x47,0x14,
-    0x4b,0xec,0x8a,0x0d,0x7b,0x07,0x67,0x9c,0xb1,0xa0,0x20,0xa0,0xb7,0xef,0x3e,0x0b,
-    0xcb,0x4d,0xfe,0xf2,0x37,0x73,0xf3,0xde,0x7e,0x77,0xf7,0x7b,0x7b,0x7b,0x7b,0xe5,
-    0xfd,0x32,0x33,0xda,0xe7,0x26,0x89,0x4b,0xea,0x25,0x79,0xc9,0x40,0x97,0xa4,0xbf,
-    0x82,0x24,0x23,0x91,0xd7,0xfa,0x49,0x4e,0xfa,0x1c,0x36,0xfc,0x88,0xe1,0xe5,0x13,
-    0x27,0x8d,0x2b,0xaf,0xec,0x55,0x21,0xfa,0x86,0x49,0x66,0x6a,0x27,0xba,0x46,0xde,
-    0x26,0xdb,0x3f,0xb3,0x7c,0x1b,0x7f,0xe2,0x69,0x13,0x04,0xff,0xd7,0xb7,0xc6,0x1e,
-    0xcf,0x4a,0xb9,0x92,0x64,0x30,0xb6,0xd2,0xf6,0xf7,0xd6,0x1d,0x43,0x37,0x49,0x7b,
-    0x9e,0x8a,0x39,0xb0,0x2c,0x83,0x65,0x80,0xe5,0x19,0x2c,0x13,0x2c,0xdf,0x60,0x59,
-    0x60,0x8d,0x0d,0x96,0x0d,0xd6,0xcc,0x60,0x39,0x60,0xbb,0x1b,0x2c,0x17,0xac,0x95,
-    0xc1,0xf2,0xc0,0xda,0x1a,0x6c,0x37,0xb0,0x0e,0x06,0xab,0x07,0x56,0x6a,0xb0,0xfa,
-    0x60,0x65,0x06,0xcb,0x07,0xab,0x30,0x58,0x03,0xb0,0x4a,0xc9,0xb1,0x1f,0x95,0x8e,
-    0x77,0x98,0x1f,0xcd,0x49,0xc4,0xaa,0xb9,0x18,0x17,0xe5,0x4c,0xec,0xc7,0x91,0x0b,
-    0xb1,0x3f,0xc5,0x3f,0xdb,0xed,0xd0,0x05,0xb9,0x84,0x9c,0x8a,0xbc,0x39,0xe2,0xdb,
-    0x52,0x07,0xdf,0x16,0xc3,0xb7,0x35,0xe2,0xdb,0x0a,0x9f,0xca,0xff,0x32,0xce,0x56,
-    0xc8,0x55,0x2e,0xc8,0x2d,0x7c,0x6b,0xea,0x47,0x91,0x91,0xda,0x67,0xa6,0x7c,0xf2,
-    0x5e,0xe8,0x6d,0x72,0xc8,0x67,0x92,0x3e,0xb3,0xd2,0xbc,0xe7,0x12,0x57,0x89,0x8f,
-    0x29,0x8f,0x77,0xc5,0x8b,0xbc,0x77,0x01,0x3e,0x25,0xde,0xbe,0x09,0xf5,0x94,0x8b,
-    0x7f,0x11,0xef,0x05,0xe8,0x9b,0xf3,0x5e,0x04,0x5f,0x4b,0xc3,0x57,0x84,0x4d,0x5b,
-    0xe2,0x11,0xac,0xd8,0x57,0x8b,0xd6,0xc4,0xff,0x69,0x12,0xc3,0x9e,0xd4,0x85,0xf0,
-    0x0c,0x40,0xde,0x0b,0x4c,0xc6,0x5c,0x4a,0xfc,0x32,0x0f,0x5d,0x90,0x3b,0x19,0xff,
-    0xce,0xd8,0xe6,0x18,0x7d,0x37,0x6a,0x57,0xe5,0x4a,0x62,0xee,0x42,0x0e,0xab,0x98,
-    0x47,0x95,0x07,0x51,0xaf,0x6a,0x3f,0x34,0x92,0x0f,0xc5,0xbe,0x99,0x67,0x39,0xdc,
-    0xf8,0x8d,0x64,0xbe,0x45,0x96,0xbc,0x8d,0x66,0x6e,0x5a,0x7b,0x54,0xeb,0xaf,0x98,
-    0x3a,0x3b,0x89,0x78,0x4f,0x26,0x96,0x71,0x8c,0x57,0xe4,0x53,0x4c,0x7c,0xd2,0x5f,
-    0xb5,0x99,0xe3,0xd3,0xd1,0xd9,0xf1,0x8d,0x67,0x3d,0x68,0x1c,0x67,0x63,0xaf,0xfa,
-    0x0b,0x58,0x57,0x2a,0x4f,0x31,0x71,0x8a,0x7c,0xa9,0xec,0x31,0x99,0x3b,0xe5,0x69,
-    0xac,0x25,0xe5,0x9b,0x65,0xfc,0x45,0x9e,0x17,0xe5,0xef,0x2e,0xe6,0x44,0xe2,0xbb,
-    0x87,0x5a,0x28,0x35,0xfc,0xf7,0x0b,0xbf,0xff,0xa9,0xbc,0x9c,0xf9,0x13,0xfb,0x57,
-    0xb1,0xb7,0x79,0xac,0x35,0xf3,0x2b,0x79,0xdc,0x90,0x8e,0x66,0xea,0xf3,0x92,0xc7,
-    0xcd,0x26,0x8f,0xb2,0xbe,0x36,0xc3,0xf3,0x0f,0x31,0x6d,0x21,0x8f,0x22,0x6f,0x05,
-    0x6b,0xee,0xe5,0x6d,0xf8,0x65,0x62,0xbf,0x9d,0x3e,0xb6,0x61,0xbf,0x9d,0x7d,0x56,
-    0xe3,0x92,0x17,0x67,0xf2,0x2c,0xcf,0x01,0x2e,0xec,0xbd,0x65,0x5e,0x12,0x3f,0x59,
-    0xa3,0x82,0xd5,0x12,0x73,0x6f,0x5f,0x65,0x19,0xd4,0x46,0x42,0x5f,0x7f,0x7b,0x24,
-    0x9b,0x3e,0xd2,0xb5,0xe5,0xc2,0x78,0x55,0x6e,0x12,0xc9,0x7b,0x18,0x59,0xd6,0xd8,
-    0x5e,0x91,0xbe,0x34,0xd2,0x77,0x89,0xe4,0xb2,0xc8,0xbe,0x5b,0xa4,0xef,0x1e,0xe9,
-    0xfb,0x22,0xef,0x23,0x51,0xfa,0xf7,0xdd,0x5c,0xc8,0x83,0xd4,0xd0,0x40,0xc6,0x5d,
-    0x0f,0x5c,0x6c,0x64,0x7d,0xd5,0x77,0x61,0x4d,0x56,0x1b,0x9b,0x7c,0x17,0xf0,0x07,
-    0xbc,0x8d,0xcc,0x65,0x03,0x17,0xfc,0x04,0xff,0xcb,0x67,0xa2,0x11,0x67,0xe1,0x16,
-    0x6f,0x2f,0xba,0x86,0xbe,0x09,0x26,0xf9,0x91,0xf7,0x6d,0xbe,0x73,0x79,0x17,0x6c,
-    0x90,0xec,0x53,0x2e,0xc4,0x20,0xef,0x4d,0x78,0xdf,0xec,0xf5,0x4d,0xf1,0x91,0xe7,
-    0x26,0xcf,0x55,0xe8,0x9f,0x45,0x70,0x8b,0xbe,0x39,0x7a,0x79,0x6a,0x6c,0xbb,0xbb,
-    0x90,0xe7,0x87,0x88,0xad,0x85,0x0b,0x58,0x2d,0xf1,0x88,0xdc,0xcc,0xb7,0x42,0x7c,
-    0x9b,0xb9,0x9d,0xf9,0x68,0x59,0x47,0x3e,0x5a,0x81,0x5f,0xe9,0x6d,0x44,0x6e,0xed,
-    0x02,0x56,0x6b,0x6c,0x8a,0xe9,0x73,0x2a,0x36,0x6d,0x5c,0xb0,0x2b,0x66,0x7c,0x32,
-    0xcf,0x6d,0x4c,0x8c,0x6d,0x5d,0x98,0x7b,0xcd,0x71,0x09,0x39,0x5e,0x6e,0x38,0xdb,
-    0xb9,0x80,0x6b,0x8e,0xdb,0xbb,0xe0,0xd7,0x8e,0x1c,0x77,0x34,0x39,0x16,0x5d,0x07,
-    0xdf,0x3a,0x32,0x26,0x79,0x97,0xfc,0xe8,0x18,0x3b,0x9a,0xbe,0x3b,0xd1,0xb7,0xc4,
-    0x25,0xf5,0x25,0x72,0x3f,0xdf,0x87,0xac,0xbd,0xce,0x2e,0x9c,0xf7,0xa5,0xe8,0xa5,
-    0x1e,0x3b,0xe3,0x2b,0xfa,0xae,0x2e,0xd4,0xa8,0xe8,0xa4,0xf6,0xba,0x1a,0xdf,0x72,
-    0x17,0xce,0xaf,0x32,0xf4,0x52,0xab,0xe5,0xa6,0xdf,0x0a,0xd3,0xaf,0xd4,0x69,0x85,
-    0xe1,0xed,0xe1,0x42,0x6d,0x8b,0x4e,0x6a,0xb6,0x47,0xca,0x9b,0x93,0xfa,0xf5,0x94,
-    0x3c,0x52,0xdb,0xdd,0x0d,0x5f,0xa5,0x0b,0xeb,0xeb,0x65,0x72,0xde,0xcb,0x05,0xac,
-    0xa7,0xa9,0xa9,0x5e,0xe4,0xa1,0x88,0x3c,0x14,0x19,0xff,0xde,0xd1,0x9c,0xf5,0x71,
-    0x01,0x5b,0x6e,0xea,0xb0,0x8f,0xdb,0xb5,0x0e,0x0b,0x8d,0x7f,0x3f,0xfa,0x17,0x5b,
-    0x59,0x57,0xfd,0xc8,0x85,0xec,0x09,0xfd,0x5d,0x38,0xff,0xfb,0x52,0xeb,0x7d,0x7d,
-    0xeb,0x4d,0x3f,0xf5,0xd9,0x2f,0xe4,0x8c,0xe9,0xe3,0x7d,0x73,0x39,0xc3,0xf4,0xbd,
-    0x1e,0xfb,0x48,0xbe,0xa9,0x85,0x0e,0xd8,0x68,0xbd,0x74,0xe1,0x9c,0xec,0x64,0x6c,
-    0xca,0xc0,0xb5,0x4e,0xbb,0xe2,0x57,0x66,0x6c,0xca,0xe1,0x57,0x9e,0x0a,0x78,0xba,
-    0x19,0x9b,0xee,0xe0,0xca,0xd3,0x03,0x3f,0xc1,0x35,0x57,0x3d,0xe1,0xef,0x61,0xb8,
-    0x7a,0xc1,0x55,0x69,0xb8,0x7a,0x83,0xef,0xc8,0x31,0xbe,0x82,0x6f,0xf7,0x63,0x14,
-    0xd9,0xe6,0xa6,0x51,0x1d,0xb9,0x69,0x60,0xde,0x1b,0x92,0x9b,0xc6,0x66,0x4f,0xeb,
-    0xcf,0x99,0xa2,0x7d,0x0e,0xc0,0x67,0x36,0x9c,0x03,0xc1,0xaa,0xcc,0x98,0xf6,0x06,
-    0x1f,0xc4,0x5c,0xf7,0xdf,0x81,0x05,0x8e,0xc1,0xf0,0x4a,0x8c,0x83,0x4d,0x8c,0x05,
-    0xdc,0x87,0xe5,0xd7,0xc4,0xc4,0xd5,0x94,0xb8,0x0a,0x4d,0x5c,0x43,0x92,0x5d,0xf7,
-    0xde,0x03,0x22,0xf9,0xd8,0x48,0x1e,0x13,0xc9,0xc7,0x47,0xf2,0xd8,0x48,0x9e,0x14,
-    0xc9,0x17,0x47,0xf2,0xcc,0x48,0xbe,0x36,0x92,0x17,0x47,0xf2,0x12,0x23,0xcb,0xb9,
-    0x7e,0x6f,0xa4,0x7f,0xda,0xc8,0x72,0x8e,0xbf,0x16,0xe9,0xdf,0x8b,0xfc,0x3f,0x88,
-    0xe4,0x2f,0x93,0x5d,0xcf,0xa6,0x6f,0xa2,0x79,0xdb,0x97,0x3c,0x6a,0x3d,0xed,0x47,
-    0x3d,0x0d,0x35,0x36,0xc3,0xc0,0x67,0x30,0x8f,0xfb,0xe3,0x37,0x8c,0x79,0x1c,0x02,
-    0xa6,0xf6,0x07,0x46,0x9c,0x07,0xd5,0xc1,0x39,0x1c,0x5c,0xeb,0xe5,0x60,0xfc,0x86,
-    0xc3,0x79,0x00,0x98,0xda,0x1f,0xc2,0x5c,0x2a,0xe7,0x61,0x70,0x1e,0x6a,0x6c,0x46,
-    0x80,0xeb,0xde,0x7d,0x04,0x7e,0x23,0x8c,0xcd,0x91,0xf0,0xe8,0x39,0x75,0x14,0xd8,
-    0xc8,0x34,0xf7,0x01,0x3b,0x1a,0x5f,0xd1,0xc9,0x9e,0x3f,0x2a,0xd9,0xb9,0xe7,0x8b,
-    0xee,0x18,0xdf,0x46,0x51,0x7b,0xc7,0x50,0xaf,0xa3,0x91,0x47,0x99,0xbe,0x8e,0xa3,
-    0x1e,0x65,0x3c,0x63,0x90,0x55,0x77,0x02,0x71,0x88,0xee,0x78,0x64,0xdd,0x7b,0x4f,
-    0x64,0xbf,0x1a,0x43,0x3d,0x8a,0xcd,0xb1,0xe0,0xea,0x7f,0x2a,0xb5,0xac,0x73,0x72,
-    0x1a,0x58,0x55,0x9a,0xa3,0x9c,0xf4,0x0e,0x7b,0x06,0xf7,0xdc,0x6a,0xf4,0xea,0x7b,
-    0x26,0x3a,0xe1,0x1d,0x8b,0xac,0x79,0x9d,0x40,0x5e,0xc7,0x1b,0xfb,0xb3,0xc0,0x97,
-    0x91,0x9f,0x73,0xc0,0xce,0x26,0x3f,0x13,0x4d,0x7e,0x44,0x77,0xae,0x6f,0x8b,0xc8,
-    0xc7,0xb9,0x86,0xe7,0x3c,0xc6,0x7c,0x3f,0x3c,0xe7,0x83,0x49,0xee,0x6b,0xbc,0x85,
-    0xdc,0x5b,0x2f,0x04,0xaf,0xe4,0x4e,0x3d,0x19,0xdf,0x8b,0xd0,0x49,0xcc,0x93,0x90,
-    0x95,0xf7,0x92,0x88,0x77,0x32,0x98,0xe5,0xbd,0x0c,0x7c,0x0a,0x77,0x71,0xe5,0x9d,
-    0x8a,0x4e,0x78,0x2f,0x46,0xd6,0x5c,0x5c,0x4e,0x2e,0xa6,0x99,0xbe,0xae,0x00,0xd7,
-    0x5c,0x5c,0x09,0xa6,0xb9,0x98,0x61,0x72,0x21,0xba,0xe9,0xbe,0xcd,0x21,0x17,0xd3,
-    0x0d,0xcf,0x6c,0x62,0xd6,0xbd,0xf1,0x2a,0xbe,0x01,0x66,0x13,0xcb,0x4c,0x30,0x39,
-    0x07,0x67,0xe0,0x3f,0xc7,0xf8,0x5f,0x1d,0x8d,0xf9,0x1a,0xb0,0x91,0xc4,0x31,0xd7,
-    0xc4,0x21,0xba,0xeb,0x7c,0xbb,0x1e,0x9e,0xeb,0xe8,0xe3,0xda,0x64,0xe7,0x9d,0x6f,
-    0x2e,0xba,0xeb,0x4d,0x1f,0x37,0xb0,0xdf,0xa9,0x3c,0x9f,0x3e,0x2f,0x27,0xe6,0x1b,
-    0xf9,0x4e,0x99,0x6f,0xc6,0x71,0x13,0x7e,0x37,0x9a,0xf3,0x67,0x01,0xf8,0x3c,0xd3,
-    0xef,0x82,0xa8,0xdf,0xb9,0xa6,0x9f,0x85,0xec,0x9b,0x9a,0x87,0x85,0x51,0x1e,0x66,
-    0x20,0x4f,0x44,0x5e,0x64,0x7c,0x6f,0x66,0x5d,0x88,0xef,0x62,0x64,0x9d,0xcf,0x5b,
-    0xea,0x38,0x77,0x6f,0x05,0x17,0xfb,0x25,0xc8,0xba,0x0e,0x6f,0xe3,0x6c,0x5c,0xcc,
-    0x3e,0xad,0xf1,0xdc,0x66,0x38,0x6f,0xaf,0x83,0xf3,0x0e,0x70,0xcd,0xc9,0x52,0xb0,
-    0x41,0xa6,0x7e,0x97,0x1a,0xfb,0x3b,0xc9,0xb3,0xce,0xe5,0xdd,0x60,0x77,0x31,0x97,
-    0x35,0x66,0x2e,0x45,0x77,0x5f,0x5a,0x7f,0x61,0xec,0xf7,0xc1,0x79,0x2f,0xdf,0x80,
-    0x92,0x97,0x1a,0x74,0xcb,0x4c,0x1f,0x2b,0xe8,0x63,0x8d,0xef,0xa3,0x34,0xdd,0x23,
-    0xc3,0x9d,0x6b,0x05,0xf3,0x29,0xd8,0x83,0x06,0x57,0xce,0x07,0x23,0xce,0x1a,0x38,
-    0x4b,0xd3,0x3d,0x34,0x9c,0x57,0xba,0x96,0x1e,0x06,0xd3,0xb5,0xf4,0x70,0x34,0x4f,
-    0x13,0x4d,0x3c,0x8f,0x44,0xfb,0xf9,0xa3,0x75,0xec,0xe7,0x2b,0xc1,0x75,0x3f,0x7f,
-    0x0c,0xbf,0x95,0xc6,0xe6,0xf1,0x68,0x1d,0x3c,0x01,0x66,0xf7,0xf3,0x27,0xf1,0x7d,
-    0x82,0x7c,0xae,0x32,0xf9,0x14,0xdd,0x53,0xbe,0x3d,0x47,0x8c,0x4f,0x19,0xee,0x67,
-    0x38,0xdf,0x57,0x33,0x8f,0xcf,0x82,0x69,0x7e,0x9e,0x06,0x93,0x31,0xae,0xc2,0xff,
-    0x39,0xe3,0xff,0x3c,0xf7,0x07,0x95,0x5f,0xe0,0x7e,0xa0,0x7c,0x2f,0x62,0xf3,0x82,
-    0xb1,0x59,0x4d,0x9f,0x6b,0xb1,0x79,0x09,0xbb,0xd5,0xa6,0xcf,0x97,0xa2,0x3e,0x57,
-    0x19,0xff,0x35,0xcc,0xb3,0x9e,0x6f,0x2f,0x83,0x69,0x2d,0xad,0x35,0x63,0x17,0xdd,
-    0x2b,0x69,0x5f,0x81,0xe7,0x15,0xc3,0xf3,0x3a,0x77,0x0f,0x95,0xdf,0x80,0x57,0xd7,
-    0xfe,0x9b,0x60,0xb5,0xa6,0xa6,0xde,0x22,0x37,0x6f,0x9a,0x9a,0x78,0x1b,0x5c,0xc7,
-    0xf3,0x0e,0xdc,0x6f,0x9b,0x3d,0xf4,0x5d,0x70,0xfd,0x16,0x7d,0x0d,0x4c,0xfa,0x16,
-    0xfd,0xfb,0xdc,0x7b,0x24,0xfe,0x75,0x26,0x7e,0xc1,0x3f,0xf4,0xed,0x13,0xe2,0xff,
-    0xd0,0xc4,0xfb,0x51,0x54,0xef,0x1f,0xb3,0x3e,0x3e,0xa2,0x8f,0x0f,0xc0,0x24,0x8f,
-    0xeb,0xf0,0xff,0xc4,0xe8,0xaa,0x23,0xdd,0x3a,0x53,0xf7,0x9f,0x72,0xcf,0xd2,0x31,
-    0x7e,0x06,0x26,0xbe,0xef,0x21,0x6b,0x1c,0xeb,0xb9,0xa3,0xa9,0xfc,0x39,0x79,0xd5,
-    0xef,0xa7,0x2f,0xc0,0xd6,0x9b,0xf9,0xfd,0x82,0xbe,0x75,0x5e,0xd6,0x1a,0xff,0xaf,
-    0xf0,0x9f,0x4c,0x2c,0x5f,0x83,0x89,0xef,0x97,0xc8,0x1a,0xe7,0xb7,0xdc,0xff,0xce,
-    0xe2,0x7b,0xef,0x3b,0x30,0xe5,0xfa,0x3e,0xaa,0xef,0x1f,0xc0,0x96,0xa7,0x73,0x11,
-    0x7c,0x7e,0x04,0x9f,0xc5,0x3d,0xfc,0x27,0x78,0x7e,0xa4,0xcf,0x6f,0xc0,0xf4,0x9b,
-    0xf2,0x67,0xee,0x98,0xf9,0xfe,0x96,0x29,0xf2,0x46,0xfe,0xef,0x29,0x45,0xb7,0xc1,
-    0xf8,0x6d,0x34,0x7e,0xbf,0xe0,0x27,0x77,0xa9,0x5f,0xa2,0xbb,0x7f,0x0b,0xe6,0xbc,
-    0x39,0x77,0xff,0x22,0xfe,0x0b,0x97,0xdc,0xec,0x61,0x38,0x7e,0x05,0x17,0x8e,0x5f,
-    0xa3,0x6f,0x9c,0x62,0x38,0x5a,0x9a,0xef,0x87,0x56,0x86,0xaf,0x35,0x7c,0x6d,0xcc,
-    0xdd,0xfa,0x37,0x73,0x57,0x16,0xfe,0xdf,0xb1,0xd3,0xdc,0xff,0x01,0xa6,0x75,0xf0,
-    0x27,0x98,0x8c,0xef,0x37,0x64,0xcd,0xf5,0x26,0xf8,0x24,0xb6,0x4d,0x26,0xb6,0x0c,
-    0xf3,0x9f,0x75,0x5b,0x13,0x5b,0x09,0xf1,0xb4,0x37,0xff,0x1b,0xb9,0x3a,0xfe,0x27,
-    0xc9,0x00,0xd7,0x7d,0x34,0x93,0xff,0x34,0xa6,0x18,0x9b,0x2c,0x17,0x70,0xbd,0x2b,
-    0x66,0xbb,0x80,0x55,0x99,0x33,0x3a,0xc7,0x05,0xae,0x6c,0xf3,0xad,0x9d,0xeb,0x42,
-    0x1c,0x7a,0x9f,0xcc,0x73,0xe1,0xff,0xbe,0x6a,0xec,0x65,0x9c,0x82,0xe5,0x9a,0xef,
-    0xed,0xff,0x00,0x13,0x2e,0x54,0x90,0x9c,0x19,0x00,0x00
+    0x10,0xc7,0xdf,0x25,0xe1,0x97,0x48,0x42,0x87,0x04,0xa4,0x25,0x04,0x31,0x98,0x10,
+    0x5a,0x08,0x3d,0xe2,0x28,0x62,0xc1,0x8a,0x28,0x30,0x22,0x16,0x34,0xa2,0x62,0x03,
+    0x3b,0x28,0x58,0xa2,0x88,0x22,0x76,0xc5,0xde,0x69,0x16,0x14,0x0b,0x45,0xb1,0xa0,
+    0x60,0x09,0x62,0xc5,0xde,0x7b,0x99,0x71,0xc6,0x82,0x82,0x88,0xb7,0xef,0x3e,0x2b,
+    0xcb,0x4d,0xfe,0x32,0x33,0x6f,0x7e,0x6f,0xbf,0xbb,0xfb,0xdd,0xbd,0xbd,0xbd,0xf2,
+    0x92,0x9d,0x55,0x9a,0x9b,0x24,0x2e,0x69,0x9c,0xe4,0x25,0x35,0x2e,0x49,0xff,0x5a,
+    0x24,0x59,0x89,0xbc,0xe6,0x27,0x99,0xf4,0x77,0xc4,0xc8,0x51,0x23,0x2b,0xa7,0x4c,
+    0x9d,0x58,0x59,0xd5,0xaf,0x97,0xe8,0x9b,0x26,0xd9,0xa9,0x9d,0xe8,0x9a,0x79,0x9b,
+    0x46,0xfe,0x37,0xc7,0x3f,0x93,0x8f,0x9a,0x74,0xb2,0x2a,0x9a,0x7b,0x3c,0x27,0xe5,
+    0x4a,0x92,0x61,0xd8,0xca,0xb3,0x97,0xb7,0xde,0x29,0x84,0x49,0x4a,0xf9,0x55,0xcc,
+    0x81,0xe5,0x18,0x2c,0x0b,0x2c,0xcf,0x60,0xd9,0x60,0x05,0x06,0xcb,0x01,0x6b,0x6e,
+    0xb0,0x46,0x60,0xad,0x0d,0x96,0x01,0x6b,0x6b,0xb0,0x5c,0xb0,0x0e,0x06,0xcb,0x03,
+    0x2b,0x36,0xd8,0x0e,0x60,0x5d,0x0d,0xd6,0x18,0xac,0xcc,0x60,0xf9,0x60,0x15,0x06,
+    0x2b,0x00,0xeb,0x65,0xb0,0x26,0x60,0x55,0x06,0x6b,0x0a,0x36,0x40,0xea,0xee,0x47,
+    0xaa,0x35,0x18,0xe1,0x47,0x78,0x0c,0xf9,0x6b,0x7d,0x26,0x46,0x75,0x14,0xfb,0x89,
+    0xd4,0x47,0xec,0x8f,0xf3,0xbf,0x5d,0xfe,0xd3,0x05,0xb9,0x84,0x3a,0x8b,0xbc,0x29,
+    0xe2,0xdb,0xdc,0x00,0xdf,0x66,0xc3,0xb7,0x25,0xe2,0xdb,0x02,0x9f,0xca,0x42,0x9c,
+    0x4f,0x1d,0x45,0x1e,0x8a,0xdc,0xce,0x3f,0xad,0xfc,0x28,0xb2,0x52,0xfb,0xec,0x94,
+    0x4f,0xde,0xdb,0x78,0x9b,0x0c,0x35,0x4e,0xd2,0xdf,0x9c,0x74,0x2e,0x72,0xc9,0xab,
+    0xc4,0xe7,0x94,0xc7,0xbb,0xe2,0x85,0xde,0xbb,0x05,0x3e,0x25,0xde,0xbe,0x25,0x3d,
+    0x96,0x8b,0x7f,0x21,0xef,0x2d,0xd0,0x17,0xf1,0x5e,0x08,0x5f,0x7b,0xc3,0x57,0x88,
+    0x4d,0x31,0xf9,0x08,0xd6,0xc9,0x5b,0x6b,0x9f,0xfc,0xdf,0x47,0xf2,0xe8,0x46,0xbf,
+    0x08,0xd7,0x60,0xe4,0x9d,0xc1,0x64,0xdc,0x65,0x8c,0x41,0xe6,0xa2,0x1c,0xb9,0xbb,
+    0xf1,0xdf,0x05,0xdb,0x8c,0xd1,0xf7,0xa4,0xa7,0x55,0xae,0x22,0xef,0x72,0xea,0x38,
+    0x84,0xb9,0x54,0xb9,0x86,0x3e,0x56,0xfb,0xe1,0x91,0x7c,0x00,0xf6,0xad,0x3d,0xcb,
+    0xc1,0xc6,0x6f,0x34,0x73,0x2e,0xb2,0xd4,0x6e,0x1c,0xf3,0xd3,0xd1,0xa3,0xda,0x83,
+    0x9d,0xe8,0xb5,0x63,0xc8,0xf7,0x58,0x72,0x99,0xc8,0x78,0x45,0x3e,0xce,0xe4,0x27,
+    0xf1,0x6a,0xcd,0x3c,0x9f,0x80,0xce,0x8e,0x6f,0x32,0x6b,0x42,0xf3,0x38,0x15,0x7b,
+    0xd5,0x9f,0xc5,0x7a,0x53,0x79,0xba,0xc9,0x53,0xe4,0xf3,0xfd,0xb3,0x35,0x7b,0x9b,
+    0x3c,0x93,0xf5,0xa4,0x7c,0x97,0x19,0x7f,0x91,0xaf,0x8d,0xea,0x77,0x2f,0x73,0x22,
+    0xf9,0xdd,0x4f,0x3f,0x94,0x19,0xfe,0x85,0xc2,0xef,0xff,0x54,0x5e,0x1c,0xcd,0xdf,
+    0x4a,0xd6,0xb9,0xf8,0xbf,0x8c,0xbf,0xad,0x6b,0xbd,0xb1,0x97,0xba,0xfe,0x98,0x8e,
+    0x6e,0xc6,0x2a,0xa9,0xeb,0x26,0x53,0x57,0x59,0x73,0x9b,0xe0,0xf9,0x9b,0x1c,0x37,
+    0x53,0x57,0x91,0xb7,0x80,0x15,0x79,0xf9,0x1f,0xfc,0xb2,0xb1,0xdf,0x4a,0x8c,0x7f,
+    0xb0,0xdf,0xca,0x7e,0xec,0xd0,0x3b,0xde,0x33,0xb6,0x6f,0x5c,0xd8,0xa3,0x2b,0xbc,
+    0x24,0x7e,0xb2,0x6e,0x05,0xab,0x27,0xe7,0x6a,0xdf,0x75,0x59,0xf4,0x4a,0x42,0xac,
+    0x3f,0x3d,0xd2,0x88,0x18,0x32,0xce,0x96,0x2e,0x8c,0x57,0xe5,0x56,0x91,0xdc,0xde,
+    0xc8,0xb2,0xee,0xca,0x22,0x7d,0xf7,0x48,0x5f,0x11,0xc9,0x3d,0x22,0xfb,0x5e,0x91,
+    0xbe,0x4f,0xa4,0x1f,0x88,0xbc,0x9b,0xcf,0x52,0xc6,0xdc,0x98,0x03,0x48,0x7a,0x6a,
+    0x28,0xe3,0xce,0x07,0x17,0x1b,0x59,0x6f,0x05,0x2e,0xac,0xd1,0x5a,0x63,0xd3,0xc4,
+    0x05,0xfc,0x21,0x6f,0x23,0x73,0xd9,0xd4,0x05,0x3f,0xc1,0x37,0xfa,0x4a,0x34,0xe7,
+    0xcc,0xdc,0xe4,0xed,0x45,0xd7,0x4c,0xce,0x3e,0x17,0xea,0x23,0xef,0x5b,0x7c,0x50,
+    0x79,0x17,0xac,0xc6,0xdb,0xb7,0x24,0x07,0x79,0x6f,0xc5,0xfb,0x5f,0x5e,0xdf,0x1a,
+    0x1f,0xf9,0xfd,0x43,0xc6,0xe4,0x7f,0x8b,0xe0,0x16,0x7d,0x5b,0xf4,0xf2,0xab,0xb9,
+    0xb5,0x73,0xa1,0xce,0x8f,0x90,0xdb,0x8e,0x2e,0x60,0xf5,0xe4,0x23,0x72,0x1b,0xff,
+    0x14,0xe2,0xdb,0xc6,0x6d,0xab,0x47,0x87,0x06,0xea,0xd1,0x11,0xfc,0x62,0x6f,0x93,
+    0xf6,0xa2,0x0b,0x58,0xbd,0xb1,0xe9,0x4c,0xcc,0x19,0xd8,0x14,0xbb,0x60,0xd7,0x99,
+    0xf1,0xc9,0x3c,0x17,0x9b,0x1c,0x4b,0x5c,0x98,0x7b,0xad,0x71,0x17,0x6a,0xbc,0xd8,
+    0x70,0x96,0xba,0x80,0x6b,0x8d,0xbb,0xba,0xe0,0x57,0x4a,0x8d,0xbb,0x99,0x1a,0x8b,
+    0x6e,0x27,0xff,0x74,0x63,0x4c,0xf2,0x2e,0xf5,0xd1,0x31,0x76,0x33,0xb1,0x77,0x21,
+    0xb6,0xe4,0x25,0xfd,0x25,0xf2,0x40,0x1f,0x43,0xd6,0x5e,0xb9,0x0b,0xf7,0x82,0xee,
+    0xe8,0xa5,0x1f,0xcb,0xf1,0x15,0x7d,0xa5,0x0b,0x3d,0x2a,0x3a,0xe9,0xbd,0x4a,0xe3,
+    0xdb,0xd3,0x85,0x33,0xad,0x07,0x7a,0xe9,0xd5,0x9e,0x26,0x6e,0x6f,0x13,0x57,0xfa,
+    0xb4,0xb7,0xe1,0xed,0xeb,0x42,0x6f,0x8b,0x4e,0x7a,0xb6,0x6f,0xca,0x9b,0x49,0xfd,
+    0xaa,0xa4,0x96,0xf4,0x76,0x1f,0xc3,0xd7,0xcf,0x85,0xf5,0xf5,0x22,0x35,0xaf,0x76,
+    0x01,0xab,0x32,0x3d,0x55,0x4d,0x1d,0x8a,0xa8,0x43,0x91,0xf1,0xef,0x1f,0xcd,0xd9,
+    0x00,0x17,0xb0,0xc5,0xa6,0x0f,0x07,0xb8,0xed,0xfb,0xb0,0xd0,0xf8,0x0f,0x22,0xbe,
+    0xd8,0xca,0xba,0x1a,0x44,0x2d,0x64,0x4f,0x18,0xec,0xc2,0x9d,0x60,0x20,0xbd,0x3e,
+    0xc0,0x3f,0xd5,0xc4,0xc9,0x67,0xbf,0x90,0x33,0xa7,0xbf,0xf7,0xcd,0xe5,0x4c,0xd3,
+    0xf7,0xc6,0xec,0x23,0x05,0xa6,0x17,0xba,0x62,0xa3,0xfd,0x52,0xce,0xb9,0xd9,0xdd,
+    0xd8,0x54,0x80,0x6b,0x9f,0xf6,0xc0,0xaf,0xc2,0xd8,0x54,0xc2,0xaf,0x3c,0xbd,0xe0,
+    0xe9,0x69,0x6c,0x7a,0x83,0x2b,0x4f,0x1f,0xfc,0x04,0xd7,0x5a,0xf5,0x85,0xbf,0x8f,
+    0xe1,0xea,0x07,0x57,0x95,0xe1,0xaa,0x06,0x57,0xbf,0xfe,0xf8,0x56,0xa7,0x7b,0x71,
+    0x56,0x2a,0xdb,0xda,0x34,0x6b,0xa0,0x36,0x4d,0xcc,0x7b,0x53,0x6a,0xd3,0xdc,0xec,
+    0x69,0x83,0x38,0x53,0x34,0xe6,0x60,0x7c,0x66,0xc1,0x39,0x14,0x6c,0x88,0x19,0xd3,
+    0xae,0xe0,0x35,0xcc,0xf5,0xa0,0xff,0xb0,0xc0,0x31,0x0c,0x5e,0xc9,0x71,0x98,0xc9,
+    0xb1,0x05,0xf7,0x66,0xf9,0x6b,0x69,0xf2,0x6a,0x45,0x5e,0x6d,0x4c,0x5e,0xbb,0x27,
+    0xdb,0xef,0xbd,0x7b,0x47,0xf2,0xe1,0x91,0x3c,0x3e,0x92,0x27,0x44,0xf2,0xd1,0x91,
+    0x3c,0x35,0x92,0xcf,0x8d,0xe4,0x4b,0x23,0x79,0x4e,0x24,0xcf,0x8b,0xe4,0x5b,0x8d,
+    0x2c,0xe7,0xfc,0x03,0x91,0x7e,0x85,0x91,0xe5,0x1c,0x7f,0x25,0xd2,0xbf,0x15,0xf9,
+    0xbf,0x13,0xc9,0x9f,0x25,0xdb,0x9f,0x4d,0x5f,0x46,0xf3,0xb6,0x07,0x75,0xd4,0x7e,
+    0xda,0x93,0x7e,0x1a,0x6e,0x6c,0x46,0x80,0xd7,0x31,0x8f,0x7b,0xe1,0x37,0x82,0x79,
+    0xdc,0x1d,0x4c,0xed,0xf7,0x89,0x38,0xf7,0x6d,0x80,0x73,0x24,0xb8,0xf6,0xcb,0x7e,
+    0xf8,0x8d,0x84,0x73,0x6f,0x30,0xb5,0xdf,0x9f,0xb9,0x54,0xce,0x03,0xe1,0x3c,0xc0,
+    0xd8,0x1c,0x04,0xae,0x7b,0xf7,0x28,0xfc,0x0e,0x32,0x36,0x87,0xc0,0xa3,0xe7,0xd4,
+    0xa1,0x60,0xa3,0xd3,0xda,0x07,0xec,0x30,0x7c,0x45,0x27,0x7b,0xfe,0xd8,0x64,0xdb,
+    0x9e,0x2f,0xba,0x31,0xfe,0x19,0x4b,0xef,0x8d,0xa1,0x5f,0xc7,0x21,0x8f,0x35,0xb1,
+    0x8e,0xa0,0x1f,0x65,0x3c,0xe3,0x91,0x55,0x77,0x24,0x79,0x88,0x6e,0x02,0xb2,0xee,
+    0xbd,0x47,0xb1,0x5f,0x8d,0xa7,0x1f,0xc5,0xe6,0x70,0x70,0xf5,0x3f,0x9e,0x5e,0xd6,
+    0x39,0x99,0x04,0x36,0x24,0xad,0x51,0x26,0xbd,0xd3,0x9e,0xc8,0xbd,0xb7,0x16,0xbd,
+    0xfa,0x9e,0x84,0x4e,0x78,0x8f,0x46,0xd6,0xba,0x9e,0x4c,0x5d,0x27,0x1b,0xfb,0x53,
+    0xc0,0x17,0x51,0x9f,0xd3,0xc0,0x4e,0xa5,0x3e,0x53,0x4c,0x7d,0x44,0x77,0xba,0x7f,
+    0x6e,0xa6,0x1e,0xa7,0x1b,0x9e,0x33,0x18,0xf3,0x42,0x78,0xce,0x04,0x93,0xda,0x2f,
+    0xf0,0x16,0x72,0x6f,0x3d,0x1b,0xbc,0x8a,0x3b,0xf6,0x34,0x7c,0xcf,0x41,0x27,0x39,
+    0x4f,0x45,0x56,0xde,0xf3,0x22,0xde,0x69,0x60,0x96,0xf7,0x02,0xf0,0xe9,0xdc,0xcd,
+    0x95,0x77,0x06,0x3a,0xe1,0x3d,0x17,0x59,0x6b,0x71,0x21,0xb5,0x98,0x69,0x62,0x5d,
+    0x04,0xae,0xb5,0xb8,0x18,0x4c,0x6b,0x51,0x67,0x6a,0x21,0xba,0x4b,0xfc,0x33,0x9b,
+    0x5a,0x5c,0x62,0x78,0x66,0x91,0xb3,0xee,0x8d,0x97,0xf3,0x4d,0x30,0x8b,0x5c,0x2e,
+    0x05,0x93,0x73,0xb0,0x0e,0xff,0xd9,0xc6,0xff,0x8a,0x68,0xcc,0x57,0x82,0x8d,0x26,
+    0x8f,0xb9,0x26,0x0f,0xd1,0x5d,0xe5,0x9f,0xab,0xe1,0xb9,0x8a,0x18,0x73,0x92,0x6d,
+    0x77,0xbe,0xb9,0xe8,0xae,0x36,0x31,0xae,0x61,0xbf,0x53,0xf9,0x3a,0x62,0x5e,0x48,
+    0xce,0xd7,0xf3,0xdd,0x72,0x9d,0x19,0xc7,0x0d,0xf8,0x5d,0x6f,0xce,0x9f,0x1b,0xc1,
+    0xaf,0x35,0x71,0x6f,0x8c,0xe2,0xce,0x35,0x71,0x6e,0x62,0xdf,0xd4,0x3a,0xdc,0x14,
+    0xd5,0xa1,0x0e,0x79,0x0a,0xf2,0xcd,0xc6,0xf7,0x16,0xd6,0x85,0xf8,0xce,0x43,0xd6,
+    0xf9,0xbc,0xad,0x81,0x73,0xf7,0x76,0x70,0xb1,0xbf,0x15,0x59,0xd7,0xe1,0x1d,0x9c,
+    0x8d,0xf3,0xd8,0xa7,0x35,0x9f,0x3b,0x0c,0xe7,0x9d,0x0d,0x70,0xde,0x05,0xae,0x35,
+    0xb9,0x1b,0xac,0xc6,0xf4,0xef,0xdd,0xc6,0xfe,0x1e,0xea,0xac,0x73,0x79,0x1f,0xd8,
+    0xbd,0xcc,0xe5,0x02,0x33,0x97,0xa2,0x9b,0x9f,0xf6,0x5f,0x18,0xfb,0x7c,0x38,0x1f,
+    0xe0,0x9b,0x50,0xea,0xb2,0x00,0xdd,0x22,0x13,0xe3,0x41,0x62,0xac,0xf6,0x31,0xca,
+    0xd2,0x3d,0x32,0xdc,0xb9,0x1e,0x64,0x3e,0x05,0x7b,0xd8,0xe0,0xca,0xf9,0x70,0xc4,
+    0xb9,0x00,0xce,0xb2,0x74,0x0f,0x0d,0xe7,0x95,0xae,0xa5,0x25,0x60,0xba,0x96,0x96,
+    0x44,0xf3,0x34,0xc5,0xe4,0xf3,0x68,0xb4,0x9f,0x3f,0xd6,0xc0,0x7e,0xbe,0x14,0x5c,
+    0xf7,0xf3,0xc7,0xf1,0x5b,0x6a,0x6c,0x9e,0x88,0xd6,0xc1,0x93,0x60,0x76,0x3f,0x7f,
+    0x0a,0xdf,0x27,0xa9,0xe7,0x72,0x53,0x4f,0xd1,0x2d,0xf3,0xcf,0x2a,0x72,0x5c,0x66,
+    0x72,0x7a,0x9a,0x9c,0x56,0x9a,0x78,0xcf,0x80,0xcb,0x18,0x57,0x20,0xcb,0x18,0x97,
+    0xe3,0xbf,0xca,0xd8,0x3e,0xcb,0xfd,0x41,0xe5,0xe7,0xb8,0x1f,0x3c,0x4f,0x5f,0x3c,
+    0x8f,0xcd,0x73,0xc6,0xe6,0x05,0xee,0x14,0x6b,0xb0,0x59,0x8d,0xdd,0x0b,0x26,0xe6,
+    0xea,0x28,0xe6,0x72,0xe3,0xff,0x22,0xf3,0xac,0xe7,0xdb,0x4b,0x60,0xda,0x4b,0x6b,
+    0xcd,0xd8,0x5f,0x4a,0xe3,0x24,0x29,0x26,0x3c,0x6b,0x0c,0xcf,0xab,0xdc,0x3d,0x54,
+    0x7e,0x0d,0x5e,0x5d,0xfb,0xeb,0xc0,0xea,0x4d,0x4f,0xbd,0x4e,0xef,0xac,0x33,0x3d,
+    0xb1,0x1e,0x5c,0xc7,0xf3,0x06,0xdc,0xeb,0xcd,0x1e,0xfa,0x26,0xb8,0x7e,0x8b,0xbe,
+    0x02,0x26,0xb1,0x45,0xff,0x36,0xf7,0x1e,0xc9,0x7f,0x83,0xc9,0x5f,0xf0,0x77,0xfd,
+    0xf3,0x01,0xf9,0xbf,0x6b,0xf2,0x7d,0x2f,0xea,0xf7,0xf7,0x59,0x1f,0xef,0x11,0xe3,
+    0x1d,0x30,0xa9,0xe3,0x06,0xfc,0x3f,0x30,0xba,0xda,0x48,0xb7,0xc1,0xf4,0xfd,0x87,
+    0xdc,0xb3,0x74,0x8c,0x1f,0x81,0x89,0xef,0x5b,0xc8,0x9a,0xc7,0xc7,0xdc,0xd1,0x54,
+    0xfe,0x84,0xba,0xea,0xf7,0xd3,0xa7,0x60,0x1f,0x9b,0xf9,0xfd,0x94,0xd8,0x3a,0x2f,
+    0x6b,0x8d,0xff,0xe7,0xf8,0x4f,0x23,0x97,0x2f,0xc0,0xc4,0xf7,0x33,0x64,0xcd,0xf3,
+    0x2b,0xee,0x7f,0xa7,0xf0,0xbd,0xf7,0x35,0x98,0x72,0x7d,0x43,0xaf,0x69,0x3f,0x7e,
+    0x0b,0xb6,0x38,0x9d,0x8b,0xe0,0xf3,0x1d,0xf8,0x65,0xdc,0xc3,0xbf,0x87,0xe7,0x3b,
+    0x62,0x7e,0x09,0xa6,0xdf,0x94,0x3f,0x70,0xc7,0x2c,0xf0,0xb7,0x4c,0x91,0x7f,0xe2,
+    0x7f,0x40,0x65,0xe8,0x7e,0x34,0x7e,0x3f,0x19,0xbf,0x9f,0xf1,0x93,0xbb,0xd4,0xcf,
+    0xd1,0xdd,0xbf,0x1d,0x73,0x5e,0xc4,0xdd,0xbf,0x90,0xff,0x99,0x4b,0x6d,0x76,0x34,
+    0x1c,0xbf,0x80,0x0b,0xc7,0x2f,0xd1,0x37,0x4e,0x27,0x38,0xda,0x9b,0xef,0x87,0x0e,
+    0x86,0xaf,0x23,0x7c,0x9d,0xcd,0xdd,0xfa,0x57,0x73,0x57,0x16,0xfe,0xdf,0xb0,0xd3,
+    0xda,0xff,0x0e,0xa6,0x7d,0xf0,0x07,0x98,0x8c,0xef,0x57,0x64,0xad,0xf5,0x46,0xf8,
+    0x24,0xb7,0x8d,0x26,0xb7,0x2c,0xf3,0x7f,0xec,0x62,0x93,0x5b,0x09,0xf9,0x94,0x9a,
+    0xff,0x1b,0x65,0x35,0xf0,0x7f,0x92,0x6c,0x70,0xdd,0xb3,0x72,0xf8,0x9f,0xc6,0x74,
+    0x63,0xd3,0xc8,0x05,0x5c,0xef,0x8a,0x19,0x17,0xb0,0x21,0xe6,0x8c,0xce,0x75,0x81,
+    0x2b,0x63,0xbe,0xb5,0xf3,0x5c,0xc8,0x43,0xef,0x93,0x3b,0xb8,0xf0,0xff,0xbe,0x5a,
+    0xec,0x65,0x9c,0x82,0xe5,0x99,0xef,0xed,0x7f,0x01,0x53,0x20,0xca,0x0a,0xc4,0x19,
+    0x00,0x00
 };
 
 // Generated from:
@@ -179,6 +180,8 @@
 //     uint Sd;
 //     uint Ed;
 //
+//     uint srcEmulatedAlpha;
+//
 //     bool isSrcHDR;
 //     bool isSrcA2BGR10;
 // } params;
@@ -244,9 +247,7 @@
 //
 //     if(component >= params . Ns && component == 3)
 //     {
-//
-//         valueAsUint = valueMask >> 1;
-//
+//         valueAsUint = params . srcEmulatedAlpha;
 //     }
 //     else
 //     {
diff --git a/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000005.inc b/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000005.inc
index b431b32..423d541 100644
--- a/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000005.inc
+++ b/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000005.inc
@@ -11,123 +11,124 @@
 #pragma once
 constexpr uint8_t kConvertVertex_comp_00000005[] = {
     0x1f,0x8b,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0xff,0x9d,0x98,0x79,0x94,0x8f,0x65,
-    0x14,0xc7,0x7f,0xef,0xec,0xc6,0x60,0x66,0x30,0x63,0x19,0x32,0x51,0x8d,0x4c,0xb6,
-    0x06,0x65,0x4b,0x47,0x1a,0x4a,0x49,0x22,0x1c,0x92,0x25,0x52,0x91,0xd0,0x26,0x2a,
-    0xb2,0xa6,0x2c,0x21,0x4b,0x4a,0x49,0xd9,0x93,0x52,0x42,0x92,0x3d,0x39,0xc7,0x39,
-    0x2a,0xe7,0x90,0xa5,0x4d,0x69,0x75,0x92,0x6d,0xa8,0xe8,0xb9,0xef,0xfb,0xb9,0x5c,
-    0xcf,0x99,0xbf,0x9a,0x73,0x9e,0xf3,0x3e,0xf7,0x7b,0xef,0xfd,0x3e,0xf7,0xb9,0xcf,
-    0x7d,0x96,0xdf,0xc4,0xc7,0x55,0x4f,0x8e,0xc5,0x82,0x58,0x6a,0x2c,0x25,0x56,0x25,
-    0x88,0x85,0x7f,0x19,0xb1,0xb8,0x98,0x74,0x4b,0xc6,0x92,0xc2,0x6f,0x61,0xdb,0x0e,
-    0x6d,0x6b,0x0f,0x19,0xda,0xa7,0x76,0x41,0x83,0xba,0xa2,0x2f,0x1d,0x8b,0x0f,0xed,
-    0x44,0x57,0xc6,0xd9,0x24,0xba,0x6f,0x82,0x6b,0x03,0x7a,0xf6,0x1f,0x28,0xf8,0x21,
-    0xd7,0xd2,0x1d,0x9e,0x10,0x72,0xc5,0x62,0x2d,0xb0,0x95,0xd6,0xda,0x59,0x5f,0x11,
-    0x0d,0x13,0xab,0xce,0x57,0xb1,0x00,0x2c,0xc1,0x60,0x71,0x60,0x29,0x06,0x8b,0x07,
-    0x4b,0x33,0x58,0x02,0x58,0xba,0xc1,0x12,0xc1,0xca,0x19,0x2c,0x09,0xac,0x82,0xc1,
-    0x92,0xc1,0x72,0x0c,0x96,0x02,0x56,0xcd,0x60,0x25,0xc0,0x6a,0x18,0x2c,0x15,0x2c,
-    0xcf,0x60,0x25,0xc1,0xf2,0x0d,0x96,0x06,0x56,0xd7,0x60,0xa5,0xc0,0x0a,0x24,0xc7,
-    0x6e,0x56,0x3a,0xdf,0x42,0x37,0x9b,0xde,0xc4,0xaa,0xb9,0xe8,0xe3,0xe5,0x4c,0xec,
-    0xfb,0x90,0x0b,0xb1,0xef,0xeb,0xbe,0x97,0x5f,0xd0,0x45,0x72,0x2e,0x39,0x15,0x79,
-    0xaf,0xc7,0xb7,0xaf,0x18,0xbe,0x7d,0x86,0x6f,0xbf,0xc7,0xb7,0x1f,0x3e,0x95,0x0f,
-    0x31,0xcf,0x1c,0xe4,0x9c,0x20,0x92,0x2b,0xba,0x56,0xd6,0xcd,0x22,0x2e,0xb4,0x8f,
-    0x0f,0xf9,0xa4,0x5f,0xde,0xd9,0x24,0x91,0xcf,0x58,0xf8,0x4d,0x08,0xf3,0x9e,0x4c,
-    0x5c,0xb9,0x2e,0xa6,0x14,0xfa,0x8a,0x67,0x39,0xef,0x0c,0x7c,0x72,0x9d,0x7d,0x26,
-    0xf5,0x94,0x8c,0x7f,0x16,0xfd,0x0c,0xf4,0xd9,0xf4,0xb3,0xe0,0xab,0x6c,0xf8,0xb2,
-    0xb0,0xa9,0x46,0x3c,0x82,0x55,0x75,0xd5,0xa2,0x35,0xf1,0x7f,0x9a,0xc4,0x70,0x25,
-    0x75,0x21,0x3c,0x4d,0x90,0xaf,0x02,0x93,0x39,0xe7,0x11,0xbf,0xac,0x43,0x2d,0xe4,
-    0x9a,0xc6,0xff,0x6a,0x6c,0x93,0x8c,0xbe,0x0e,0xb5,0xab,0x72,0x01,0x31,0xd7,0x22,
-    0x87,0x4d,0x59,0x47,0x95,0x9b,0x53,0xaf,0x6a,0xdf,0xca,0x93,0xdb,0x61,0x5f,0xce,
-    0xb1,0xdc,0x69,0xfc,0x3a,0xb2,0xde,0x22,0x4b,0xde,0xba,0xb2,0x36,0x55,0x1c,0xaa,
-    0xf5,0x57,0x95,0x3a,0xeb,0x4d,0xbc,0xf7,0x11,0x4b,0x1f,0xe6,0x2b,0x72,0x5f,0x13,
-    0x9f,0x8c,0xd7,0xcf,0xac,0xf1,0x03,0xe8,0xec,0xfc,0x06,0xb0,0x1f,0x34,0x8e,0x41,
-    0xd8,0xab,0xfe,0x71,0xf6,0x95,0xca,0x23,0x4c,0x9c,0x22,0x3f,0xed,0xda,0xf9,0xf8,
-    0x8b,0xf2,0x48,0xf6,0x92,0xf2,0x8d,0x37,0xfe,0x22,0x4f,0xf3,0xf2,0xb7,0x80,0x35,
-    0x91,0xf8,0xde,0xa6,0x16,0xf2,0x0c,0xff,0x12,0xe1,0x77,0x7f,0x2a,0x2f,0x63,0xfd,
-    0x24,0x2f,0x7b,0x4d,0x5e,0x64,0xbf,0xec,0x85,0xe7,0x6b,0xc6,0xd8,0x47,0x5e,0x44,
-    0xde,0x0f,0x96,0xed,0xe4,0x03,0xf8,0xc5,0x63,0x7f,0x10,0xce,0x03,0xd8,0x1f,0xe4,
-    0xdc,0x0c,0xd0,0x7f,0x43,0x3f,0xc9,0xc4,0x5d,0x64,0xea,0x48,0xe4,0xca,0x41,0x74,
-    0xb6,0xe6,0x3b,0x49,0x78,0x64,0x0f,0x0a,0x56,0x84,0x6d,0x43,0x57,0x45,0x71,0xac,
-    0x7d,0x8c,0xb1,0x8b,0x1c,0x92,0xc8,0x98,0x32,0xef,0x3f,0x99,0xbf,0xca,0xc7,0x3c,
-    0xf9,0xac,0x91,0xc3,0xfd,0x16,0x5c,0xaa,0x4f,0x09,0x2e,0xd5,0x97,0xf4,0xe4,0x34,
-    0xcf,0xbe,0x8c,0xa7,0xcf,0xf0,0xf4,0x15,0x90,0x6f,0x74,0x51,0x4a,0x0e,0x7e,0x26,
-    0x2f,0x52,0x23,0xcd,0x98,0xf7,0x2f,0xe0,0x62,0x23,0xfb,0xe7,0x57,0xf6,0x5c,0x3f,
-    0x63,0xf3,0x1b,0xf8,0x3b,0xce,0x46,0x6a,0xfe,0x77,0xfc,0x04,0x3f,0xed,0x32,0x71,
-    0x94,0x9c,0x9c,0x75,0xf6,0xa2,0xfb,0xc3,0xb5,0xa3,0xe4,0x47,0xfa,0xff,0xba,0x4c,
-    0x4b,0xff,0x68,0xb8,0xbf,0xe2,0xc3,0x3c,0x0d,0xa2,0x7f,0x8c,0xfe,0x19,0xa7,0xff,
-    0x0b,0x1f,0xf9,0x9e,0x72,0x5c,0x27,0xdc,0xf7,0x24,0xdc,0xa2,0x3f,0x85,0xfe,0x94,
-    0x89,0xed,0x34,0x79,0x7e,0x97,0xd8,0xce,0x80,0x15,0x11,0x8f,0xc8,0xc7,0x5d,0x3b,
-    0x81,0xef,0x71,0x93,0x8f,0xbf,0x8b,0xc9,0xc7,0x3f,0xe0,0xa3,0x9d,0x4d,0x52,0x18,
-    0x7b,0x84,0x15,0x19,0x9b,0x73,0x8c,0xf9,0x2c,0x36,0xe7,0xb1,0x3b,0xc7,0x9c,0xce,
-    0x82,0xa9,0xbd,0x14,0xda,0x59,0x93,0xe3,0x20,0x88,0x72,0xbc,0xcc,0xd8,0xc4,0x05,
-    0x11,0xae,0x39,0x8e,0xe7,0x92,0x17,0x5c,0x72,0x9c,0x18,0x5c,0xcc,0xb1,0xe8,0x12,
-    0x5c,0x4b,0x0c,0xa2,0x39,0x49,0x5f,0xf2,0xa3,0x73,0x14,0x5c,0x79,0x4b,0x30,0xb6,
-    0xc4,0x25,0xf5,0x25,0xf2,0xf5,0x6e,0x0c,0x39,0xa3,0x52,0x83,0xe8,0x3e,0x17,0x5c,
-    0xf4,0x52,0x8f,0xa9,0xf8,0x8a,0xbe,0x54,0x10,0xd5,0xa8,0xe8,0xa4,0xf6,0x4a,0x19,
-    0xdf,0xd2,0x41,0x74,0x3f,0xa5,0xa1,0x97,0x5a,0x2d,0x6d,0xc6,0x4d,0x37,0xe3,0x4a,
-    0x9d,0xa6,0x1b,0xde,0xcc,0x20,0xaa,0x6d,0xd1,0x49,0xcd,0x66,0x86,0xbc,0x49,0xa1,
-    0x5f,0xd9,0x40,0xce,0x83,0xa8,0xb6,0x33,0x0c,0x5f,0xb9,0x20,0xda,0x5f,0x5b,0xc9,
-    0x79,0xf9,0x20,0xc2,0xca,0x06,0x17,0x6b,0xaa,0x3c,0x79,0x38,0x49,0x1e,0x4e,0x9a,
-    0xfc,0x66,0x05,0x97,0xae,0x59,0x76,0x10,0x61,0xcb,0x4c,0x1d,0x66,0x07,0x97,0xd6,
-    0xe1,0x09,0xe3,0x5f,0x91,0xf1,0xc5,0x56,0xf6,0x55,0x45,0x72,0x21,0x67,0x42,0xa5,
-    0x20,0xba,0xdf,0x05,0x97,0x5a,0xbf,0xce,0xb5,0x86,0x8c,0x53,0x92,0xfa,0x95,0x3b,
-    0xa4,0x91,0xe4,0x98,0x3b,0x4a,0xfb,0xa9,0x8c,0x95,0x66,0xc6,0xaa,0x81,0x8d,0xd6,
-    0x4b,0x2d,0xf6,0x64,0x4d,0x63,0x93,0x0f,0xae,0x75,0x7a,0x0d,0x7e,0xf9,0xc6,0xa6,
-    0x36,0xfc,0xca,0x53,0x17,0x9e,0x3a,0xc6,0xa6,0x1e,0xb8,0xf2,0xd4,0xc7,0xaf,0x9e,
-    0xc9,0xd5,0xb5,0xf0,0xd7,0x37,0x5c,0x0d,0xe0,0x2a,0x30,0x5c,0x0d,0xc1,0xd5,0xaf,
-    0x11,0xbe,0x0d,0xc3,0xbd,0x11,0x17,0xca,0x36,0x37,0x65,0x8a,0xc9,0x4d,0x29,0xd3,
-    0x2f,0x4d,0x6e,0xd2,0xcd,0x99,0xd6,0x98,0x33,0x54,0xc7,0x6c,0x82,0xcf,0x04,0x38,
-    0x9b,0x81,0x35,0x35,0x73,0xba,0x01,0xbc,0x39,0xeb,0xd7,0xf8,0x02,0x16,0x71,0xb4,
-    0x80,0x57,0x62,0x6c,0x61,0x62,0xcc,0xe0,0xbd,0x2b,0x7f,0x99,0x26,0xae,0xb2,0xc4,
-    0x55,0xde,0xc4,0xd5,0xd2,0x3b,0xeb,0xdb,0x78,0x72,0x37,0x4f,0xee,0xee,0xc9,0x3d,
-    0x3c,0xb9,0x97,0x27,0x0f,0xf5,0xe4,0x61,0x9e,0x3c,0xce,0x93,0x27,0x79,0xf2,0x1c,
-    0x4f,0x9e,0x6b,0x64,0xb9,0xb7,0x17,0x7a,0xfa,0x75,0xde,0x5d,0xb5,0xd9,0x93,0xb7,
-    0x79,0xeb,0x70,0x13,0x79,0xd1,0xfa,0xb8,0x99,0xfa,0x68,0x65,0x6c,0x0a,0xc1,0xc7,
-    0xb2,0x2e,0xad,0xf1,0x2b,0x64,0x5d,0x5a,0x82,0xa9,0xfd,0x2d,0x1e,0xe7,0xad,0xc5,
-    0x70,0xb6,0x05,0xd7,0xf5,0xbf,0x0d,0xbf,0xb6,0x70,0xb6,0x01,0x53,0xfb,0xdb,0x59,
-    0x1b,0xe5,0xbc,0x03,0xce,0x76,0xc6,0xa6,0x3d,0xb8,0x9e,0xc5,0x1d,0xf0,0x6b,0x6f,
-    0x6c,0xee,0x82,0x47,0xef,0x9d,0x4e,0x60,0x1d,0xc3,0x5c,0x46,0xd8,0xdd,0xf8,0x76,
-    0xe2,0x9e,0xec,0x62,0xee,0x49,0xd1,0x75,0x76,0xad,0x0b,0xb5,0xd4,0x99,0xfa,0xeb,
-    0x8a,0xdc,0xc5,0x8c,0x75,0x0f,0xf5,0x25,0xf3,0xe9,0x8e,0xac,0xba,0x7b,0x89,0x43,
-    0x74,0x3d,0x90,0xf5,0x2c,0xed,0xc9,0xf9,0xd3,0x9d,0xfa,0x12,0x9b,0x6e,0xe0,0xea,
-    0x7f,0x3f,0xb5,0xa9,0x6b,0xd2,0x1f,0xac,0x69,0x98,0xa3,0xa4,0xf0,0xcd,0xf9,0x20,
-    0xef,0xd2,0x7e,0xe8,0xd5,0xf7,0x21,0x74,0xc2,0xdb,0x0b,0x59,0xf3,0x3a,0x90,0xbc,
-    0x0e,0x30,0xf6,0x0f,0x83,0x2f,0x25,0x3f,0x8f,0x80,0x0d,0x22,0x3f,0x43,0x4c,0x7e,
-    0x44,0x37,0xd8,0xb5,0xd9,0xe4,0x63,0xb0,0xe1,0x79,0x94,0x39,0x2f,0x81,0xe7,0x31,
-    0x30,0xc9,0xfd,0x62,0x67,0x21,0xef,0xcc,0x27,0xc0,0x0b,0x78,0x03,0x0f,0xc7,0xf7,
-    0x49,0x74,0x12,0xf3,0x50,0x64,0xe5,0x7d,0xca,0xe3,0x1d,0x0e,0x66,0x79,0x9f,0x01,
-    0x1f,0xc1,0xdb,0x59,0x79,0x9f,0x45,0x27,0xbc,0xc3,0x90,0x35,0x17,0xa3,0xc8,0xc5,
-    0x48,0x33,0xd6,0x73,0xe0,0x9a,0x8b,0xd1,0x60,0x9a,0x8b,0xb1,0x26,0x17,0xa2,0x1b,
-    0xe3,0xda,0x44,0x72,0x31,0xc6,0xf0,0x4c,0x20,0x66,0x3d,0xeb,0x9e,0xe7,0xcd,0x3e,
-    0x81,0x58,0xc6,0x81,0xc9,0xbd,0x36,0x16,0xff,0x89,0xc6,0xff,0x05,0x6f,0xce,0x2f,
-    0x82,0x75,0x24,0x8e,0x29,0x26,0x0e,0xd1,0x4d,0x76,0x6d,0x2a,0x3c,0x93,0x19,0x63,
-    0x92,0x79,0xc3,0x4d,0x41,0x37,0xd5,0x8c,0xf1,0x12,0xe7,0x97,0xca,0xd3,0x19,0x73,
-    0x14,0x31,0xcf,0xe0,0x77,0xc5,0x74,0x33,0x8f,0x97,0xf1,0x9b,0x61,0xee,0x93,0x99,
-    0xe0,0xd3,0xcc,0xb8,0x33,0xbd,0x71,0xa7,0x98,0x71,0x66,0x71,0x0e,0x6a,0x1e,0x66,
-    0x79,0x79,0x18,0x8b,0x3c,0x04,0x79,0xb6,0xf1,0x7d,0x85,0x7d,0x21,0xbe,0x73,0x90,
-    0x75,0x3d,0x5f,0x2d,0xe6,0x1e,0x7d,0x0d,0x5c,0xec,0xe7,0x22,0xeb,0x3e,0x9c,0xc7,
-    0x5d,0x37,0x87,0x73,0x57,0xe3,0x99,0x67,0x38,0x5f,0x2f,0x86,0xf3,0x0d,0x70,0xcd,
-    0xc9,0x7c,0xb0,0xe6,0xa6,0x7e,0xe7,0x1b,0xfb,0x37,0xc9,0xb3,0xae,0xe5,0x5b,0x60,
-    0x0b,0x58,0xcb,0xc5,0x66,0x2d,0x45,0xb7,0x28,0xac,0xbf,0x68,0xee,0x8b,0xe0,0x5c,
-    0xc8,0x6f,0x36,0xc9,0xcb,0x62,0x74,0x4b,0xcd,0x18,0xcb,0x19,0x63,0x8b,0x1b,0x23,
-    0x2f,0x3c,0x23,0xa3,0x37,0xd4,0x72,0xd6,0x53,0xb0,0x15,0x06,0x57,0xce,0x15,0x1e,
-    0xe7,0x62,0x38,0xf3,0xc2,0x33,0x34,0xba,0x7f,0x74,0x2f,0xad,0x04,0xd3,0xbd,0xb4,
-    0xd2,0x5b,0xa7,0x21,0x26,0x9e,0xf7,0xbc,0xf3,0xfc,0xfd,0x62,0xce,0xf3,0x55,0xe0,
-    0x7a,0x9e,0x7f,0x80,0xdf,0x2a,0x63,0xf3,0xa1,0xb7,0x0f,0x56,0x83,0xd9,0xf3,0xfc,
-    0x23,0x7c,0x57,0x93,0xcf,0xb5,0x26,0x9f,0xa2,0x5b,0xe3,0xda,0x7a,0x62,0x5c,0x63,
-    0xb8,0x3f,0xe6,0xbe,0x96,0xf9,0xac,0x43,0x96,0xf9,0xac,0xc5,0x76,0xbd,0xb1,0xfd,
-    0x84,0xbb,0x5f,0xe5,0x0d,0xdc,0xed,0x9b,0xa8,0x81,0x4f,0xb1,0xd9,0x60,0x6c,0x36,
-    0xc2,0xbf,0x1d,0x9b,0x4d,0xd8,0x6d,0x34,0x63,0x6e,0xf2,0xc6,0x5c,0x6b,0xfc,0xb7,
-    0xe0,0x3f,0x88,0xf7,0xf9,0x56,0x30,0xf1,0xdd,0x8c,0xac,0xb6,0xdb,0x79,0x1b,0xa8,
-    0xed,0x67,0x60,0xfa,0xb6,0xdf,0xc1,0x5b,0x61,0x3c,0xef,0xa7,0xcf,0xb1,0xd9,0x01,
-    0xdf,0x36,0x30,0xb5,0xdf,0xc9,0x5b,0x42,0xee,0xbe,0x9d,0xde,0xdb,0xab,0x22,0xf9,
-    0xcd,0xe6,0xed,0x95,0xc5,0xff,0x1a,0x25,0xfe,0x4a,0x86,0x63,0x17,0xb8,0x70,0xec,
-    0xf2,0xde,0x98,0x55,0xe1,0xa8,0x6c,0xde,0x6f,0x39,0x86,0xaf,0x0a,0x7c,0x97,0x99,
-    0xb7,0xcf,0x6e,0xf3,0xb6,0x11,0xfe,0x2f,0xb0,0x1b,0x4e,0xbd,0x7e,0x09,0xa6,0xf5,
-    0xfa,0x15,0x98,0xcc,0x6f,0x37,0xb2,0xe6,0x6b,0x0f,0x7c,0x12,0xdb,0x1e,0x13,0x5b,
-    0x9c,0xf9,0x9f,0x60,0x35,0x13,0x5b,0x2e,0xf1,0x54,0x37,0xbf,0x53,0xbf,0x2d,0xe6,
-    0x77,0xea,0x77,0xe0,0x5a,0xf7,0xdf,0x53,0xf7,0x23,0x8c,0xcd,0x0f,0xe0,0x7a,0xb7,
-    0x1f,0x06,0x6b,0x6a,0xce,0xd4,0x1f,0xe1,0x3a,0x6c,0xfc,0x7e,0x22,0x0e,0xbd,0xff,
-    0x8f,0xf0,0xff,0x97,0x7e,0xd8,0xcb,0x3c,0x8f,0x60,0xa7,0xbf,0x77,0xfe,0x03,0x83,
-    0x27,0x82,0x36,0xfc,0x16,0x00,0x00
+    0x14,0xc7,0x7f,0xef,0xcc,0x98,0x19,0x63,0x8c,0x19,0xcb,0x8c,0x65,0x6c,0x51,0x8d,
+    0xc8,0xd6,0x58,0xb2,0xa5,0x23,0xa1,0x94,0x24,0xc2,0x21,0x61,0x32,0xa9,0x48,0x68,
+    0x13,0x85,0x18,0xa4,0x2c,0x21,0x4b,0x4a,0x49,0xd9,0x93,0x52,0xb2,0x94,0x6c,0x51,
+    0x72,0x8e,0x73,0x54,0xce,0x21,0x4b,0x9b,0xd2,0xea,0x24,0xdb,0x44,0x7a,0xee,0xfb,
+    0x7e,0x2e,0xd7,0x73,0xe6,0xaf,0x7e,0xe7,0xbc,0xe7,0xf7,0xde,0xef,0xbd,0xf7,0x7b,
+    0xef,0x73,0x9f,0xfb,0x2c,0xbf,0x5f,0x7c,0x5c,0x8d,0xa4,0x58,0x2c,0x88,0xa5,0xc4,
+    0x92,0x63,0x55,0x83,0x58,0xf8,0xc9,0x88,0xc5,0xc5,0xe4,0xb5,0x44,0x2c,0x31,0xfc,
+    0x6e,0xd7,0xb1,0x4b,0xc7,0xba,0xc3,0x86,0xe7,0xd5,0xcd,0x6d,0x54,0x5f,0xf4,0x69,
+    0xb1,0xf8,0xd0,0x4e,0x74,0xa5,0x9c,0x4d,0x31,0xf7,0x9d,0xe0,0x9e,0x41,0x7d,0x07,
+    0x0e,0x16,0xfc,0x88,0x7b,0xd2,0x1d,0x9e,0x10,0x72,0xc5,0x62,0xad,0xb1,0x95,0xa7,
+    0xbd,0xb3,0xbe,0x32,0x0a,0x13,0xab,0xc1,0xb7,0x62,0x01,0x58,0x82,0xc1,0xe2,0xc0,
+    0x92,0x0d,0x16,0x0f,0x96,0x6a,0xb0,0x04,0xb0,0x74,0x83,0x15,0x03,0x2b,0x6b,0xb0,
+    0x44,0xb0,0xf2,0x06,0x4b,0x02,0xcb,0x36,0x58,0x32,0x58,0x35,0x83,0x15,0x07,0xab,
+    0x69,0xb0,0x14,0xb0,0x1c,0x83,0x95,0x00,0xab,0x63,0xb0,0x54,0xb0,0xfa,0x06,0x2b,
+    0x09,0x96,0x6b,0xb0,0x34,0xb0,0xa6,0x52,0x77,0x37,0x52,0xad,0x41,0x3b,0x37,0xc2,
+    0xfe,0xe4,0xaf,0xf5,0xc9,0xf3,0xea,0x28,0xf6,0x79,0xd4,0x47,0xec,0x07,0xb8,0xef,
+    0x2b,0x2e,0xea,0x22,0xb9,0x3a,0x75,0x16,0x79,0xbf,0xc7,0x77,0xa0,0x08,0xbe,0x03,
+    0x86,0xef,0xa0,0xc7,0x77,0x10,0x3e,0x95,0x8f,0x30,0xf6,0x6c,0xe4,0x2a,0x41,0x24,
+    0x57,0x70,0x4f,0x19,0x37,0x8a,0xb8,0xd0,0x3e,0x3e,0xe4,0x93,0xf7,0x72,0xce,0x26,
+    0x91,0x1a,0xc7,0xc2,0xef,0x84,0x70,0x2e,0x92,0xc8,0xab,0xba,0xcb,0x29,0x99,0x77,
+    0xc5,0x33,0x9d,0x77,0x06,0x3e,0xd5,0x9d,0x7d,0x69,0x7a,0x2c,0x09,0xff,0x4c,0xde,
+    0x33,0xd0,0x67,0xf1,0x9e,0x09,0x5f,0x25,0xc3,0x97,0x89,0x4d,0x35,0xf2,0x11,0xac,
+    0x8a,0xb3,0xd6,0x3e,0xf9,0xbf,0x8f,0xe4,0x71,0x15,0xfd,0x22,0x5c,0xcd,0x91,0xaf,
+    0x06,0x93,0x71,0xe7,0x30,0x06,0x99,0x8b,0xda,0xc8,0xb5,0x8c,0xff,0x35,0xd8,0x26,
+    0x1a,0x7d,0x3d,0x7a,0x5a,0xe5,0x5c,0xf2,0xae,0x4d,0x1d,0x5b,0x30,0x97,0x2a,0xb7,
+    0xa2,0x8f,0xd5,0xbe,0xad,0x27,0x77,0xc2,0xbe,0xac,0x63,0xb9,0xd3,0xf8,0x75,0x65,
+    0xce,0x45,0x96,0xda,0xf5,0x64,0x7e,0x2a,0x3b,0x54,0x7b,0xb0,0x0a,0xbd,0xd6,0x9f,
+    0x7c,0xef,0x23,0x97,0x3c,0xc6,0x2b,0xf2,0x00,0x93,0x9f,0xc4,0xcb,0x37,0xf3,0xfc,
+    0x00,0x3a,0x3b,0xbe,0x41,0xac,0x09,0xcd,0x63,0x08,0xf6,0xaa,0x7f,0x9c,0xf5,0xa6,
+    0xf2,0x28,0x93,0xa7,0xc8,0x4f,0xbb,0xe7,0x42,0xfc,0x25,0x79,0x0c,0xeb,0x49,0xf9,
+    0x26,0x1a,0x7f,0x91,0x67,0x78,0xf5,0x5b,0xc4,0x9c,0x48,0x7e,0x6f,0xd1,0x0f,0x39,
+    0x86,0x7f,0x99,0xf0,0xbb,0x8f,0xca,0x2b,0xbc,0xf9,0xdb,0xc8,0x3a,0x97,0x3a,0xed,
+    0x37,0x75,0x92,0x35,0xb4,0x1f,0xde,0x6f,0x88,0x79,0x80,0x3a,0x89,0x7c,0x10,0x2c,
+    0xcb,0xc9,0x87,0xf0,0x8b,0xc7,0xfe,0x30,0x31,0x0e,0x61,0x7f,0x98,0xfd,0x35,0x40,
+    0xff,0x2d,0xef,0x89,0x66,0x1c,0x85,0x26,0x2f,0x91,0x2b,0x07,0xd1,0x1e,0x5c,0xc7,
+    0x49,0xc2,0x23,0xeb,0x52,0xb0,0x42,0x6c,0x1b,0xbb,0xae,0x8a,0xa3,0x17,0x62,0xc4,
+    0x3e,0xe3,0x90,0x62,0xc4,0x94,0x3a,0xfc,0x45,0x3d,0x54,0x3e,0xe1,0xc9,0xe7,0x8c,
+    0x2c,0xeb,0xaa,0x78,0x70,0xb9,0x3e,0x25,0xb8,0x5c,0x5f,0xd2,0x93,0xd3,0x3c,0xfb,
+    0x0c,0x4f,0x5f,0xc6,0xd3,0x57,0x44,0xbe,0xd1,0x65,0x29,0x35,0xf8,0x85,0xba,0x48,
+    0xcf,0xb4,0x64,0xdc,0xbf,0x82,0x8b,0x8d,0xac,0xa7,0xdf,0x58,0x83,0xf9,0xc6,0xe6,
+    0x77,0xf0,0xb7,0x9d,0x8d,0xac,0x81,0x3f,0xf0,0x13,0xfc,0xb4,0xab,0xc4,0x71,0x6a,
+    0x52,0xe8,0xec,0x45,0xf7,0xa7,0x7b,0x8e,0x53,0x1f,0x79,0x3f,0xef,0x2a,0x2d,0xef,
+    0xc7,0xc3,0xf5,0x16,0x1f,0xd6,0x69,0x08,0xef,0x27,0x78,0x3f,0xeb,0xf4,0x7f,0xe3,
+    0x23,0xdf,0xa7,0x1c,0xd7,0xa9,0x90,0x3f,0xfa,0x88,0xfe,0x0c,0xfa,0x33,0x26,0xb7,
+    0xb3,0xd4,0xf9,0x1d,0x72,0xfb,0x07,0xac,0x90,0x7c,0x44,0x3e,0x19,0xf2,0x45,0xbe,
+    0x27,0x4d,0x3d,0xce,0x17,0x51,0x8f,0x7f,0xc1,0xc7,0x39,0x1b,0x91,0x2f,0x80,0x15,
+    0x1a,0x1b,0x69,0x1c,0x89,0x39,0x1a,0x9b,0x20,0x88,0xec,0x04,0x97,0x31,0x9d,0x03,
+    0x53,0xfb,0xb8,0x20,0x9a,0x7b,0xad,0x71,0x7c,0x10,0xd5,0x78,0x85,0xe1,0x4c,0x08,
+    0x22,0x5c,0x6b,0x5c,0x2c,0x88,0xfc,0x04,0x97,0x1a,0x27,0x05,0x97,0x6a,0x2c,0xba,
+    0x44,0x99,0xdb,0x20,0x1a,0x93,0xbc,0x4b,0x7d,0x74,0x8c,0x49,0x26,0x76,0x09,0x62,
+    0x4b,0x5e,0xd2,0x5f,0x22,0x5f,0xef,0x62,0xc8,0x9e,0x95,0x1a,0x44,0xe7,0x7e,0x0a,
+    0x79,0x4b,0x3f,0xa6,0xe2,0x2b,0xfa,0x52,0x41,0xd4,0xa3,0xa2,0x93,0xde,0x2b,0x65,
+    0x7c,0xd3,0x83,0xe8,0xcc,0x4a,0x43,0x2f,0xbd,0x9a,0x6e,0xe2,0x96,0x36,0x71,0xa5,
+    0x4f,0x4b,0x1b,0xde,0xb2,0x41,0xd4,0xdb,0xa2,0x93,0x9e,0x2d,0x1b,0xf2,0x26,0x86,
+    0x7e,0xe5,0x02,0xd9,0x0f,0xa2,0xde,0x2e,0x63,0xf8,0x32,0x83,0x68,0x7d,0x6d,0xa7,
+    0xe6,0x59,0x41,0x84,0x95,0x0b,0x2e,0xf5,0x54,0x16,0x75,0x38,0x4d,0x1d,0x4e,0x9b,
+    0xfa,0x96,0xf7,0xe6,0xac,0x42,0x10,0x61,0x2b,0x4c,0x1f,0x56,0x08,0x2e,0xef,0xc3,
+    0x53,0xc6,0xbf,0x12,0xf1,0xc5,0x56,0xd6,0x55,0x25,0x6a,0x21,0x7b,0x42,0x76,0x10,
+    0x9d,0xf9,0x82,0x4b,0xaf,0x37,0x75,0x4f,0x63,0xe2,0x94,0xa0,0x7f,0xe5,0x4c,0x69,
+    0x22,0xf3,0xc8,0x99,0xa5,0xef,0x29,0xc4,0x4a,0x35,0xb1,0x6a,0x62,0xa3,0xfd,0x52,
+    0x9b,0x35,0x59,0xcb,0xd8,0xd4,0x01,0xd7,0x3e,0xbd,0x16,0xbf,0x3a,0xc6,0xa6,0x2e,
+    0xfc,0xca,0x53,0x1f,0x9e,0x7a,0xc6,0xa6,0x01,0xb8,0xf2,0x34,0xc4,0xaf,0x81,0xa9,
+    0xd5,0x75,0xf0,0x37,0x34,0x5c,0x8d,0xe0,0xca,0x35,0x5c,0x8d,0xc1,0xd5,0xaf,0x09,
+    0xbe,0x8d,0xc3,0x35,0x14,0x17,0xca,0xb6,0x36,0xa5,0x8a,0xa8,0x4d,0x49,0xf3,0x9e,
+    0x46,0x6d,0xd2,0xcd,0x9e,0xd6,0x8c,0x3d,0x54,0x63,0x36,0xc7,0x67,0x12,0x9c,0x2d,
+    0xc1,0x5a,0x98,0x31,0xdd,0x00,0xde,0x8a,0xf9,0x6b,0x76,0x11,0x8b,0x38,0x5a,0xc3,
+    0x2b,0x39,0xb6,0x36,0x39,0x66,0x70,0x2f,0x96,0x4f,0x69,0x93,0x57,0x19,0xf2,0x2a,
+    0x67,0xf2,0x6a,0xe3,0xed,0xf5,0x1d,0x3c,0xb9,0x97,0x27,0xf7,0xf6,0xe4,0x3e,0x9e,
+    0xdc,0xcf,0x93,0x87,0x7b,0xf2,0x08,0x4f,0x9e,0xe0,0xc9,0x53,0x3c,0x79,0x9e,0x27,
+    0xcf,0x37,0xb2,0x9c,0xe3,0x8b,0x3d,0xfd,0x06,0xef,0xac,0xda,0xee,0xc9,0x3b,0xbd,
+    0x79,0xb8,0x89,0xba,0x68,0x7f,0xdc,0x4c,0x7f,0xb4,0x35,0x36,0xed,0xc0,0x0b,0x98,
+    0x97,0xf6,0xf8,0xb5,0x63,0x5e,0xda,0x80,0xa9,0xfd,0x2d,0x1e,0xe7,0xad,0x45,0x70,
+    0x76,0x04,0xd7,0xf9,0xbf,0x0d,0xbf,0x8e,0x70,0x76,0x00,0x53,0xfb,0xdb,0x99,0x1b,
+    0xe5,0xbc,0x03,0xce,0x4e,0xc6,0xa6,0x33,0xb8,0xee,0xc5,0x5d,0xf0,0xeb,0x6c,0x6c,
+    0xee,0x82,0x47,0xcf,0x9d,0x6e,0x60,0x5d,0xc3,0x5a,0x46,0xd8,0xdd,0xf8,0x76,0xe3,
+    0x9c,0xec,0x61,0xce,0x49,0xd1,0x75,0x77,0x4f,0x0f,0x7a,0xa9,0x3b,0xfd,0xd7,0x13,
+    0xb9,0x87,0x89,0x75,0x0f,0xfd,0x25,0xe3,0xe9,0x8d,0xac,0xba,0x7b,0xc9,0x43,0x74,
+    0x7d,0x90,0x75,0x2f,0xed,0xcb,0xfe,0xd3,0x9b,0xfe,0x12,0x9b,0x5e,0xe0,0xea,0x7f,
+    0x3f,0xbd,0xa9,0x73,0x32,0x10,0xac,0x45,0x58,0xa3,0xc4,0xf0,0x0e,0xfa,0x20,0xf7,
+    0xd4,0x7c,0xf4,0xea,0xfb,0x10,0x3a,0xe1,0xed,0x87,0xac,0x75,0x1d,0x4c,0x5d,0x07,
+    0x19,0xfb,0x87,0xc1,0x97,0x53,0x9f,0x47,0xc0,0x86,0x50,0x9f,0x61,0xa6,0x3e,0xa2,
+    0x1b,0xea,0x9e,0xb9,0xd4,0x63,0xa8,0xe1,0x79,0x94,0x31,0x2f,0x83,0xe7,0x31,0x30,
+    0xa9,0xfd,0x52,0x67,0x21,0xf7,0xcc,0x27,0xc0,0x73,0xb9,0x13,0x8f,0xc4,0xf7,0x49,
+    0x74,0x92,0xf3,0x70,0x64,0xe5,0x7d,0xca,0xe3,0x1d,0x09,0x66,0x79,0x9f,0x01,0x1f,
+    0xc5,0x5d,0x5a,0x79,0x47,0xa3,0x13,0xde,0x11,0xc8,0x5a,0x8b,0xb1,0xd4,0x62,0x8c,
+    0x89,0xf5,0x2c,0xb8,0xd6,0x62,0x1c,0x98,0xd6,0xa2,0xc0,0xd4,0x42,0x74,0xe3,0xdd,
+    0x33,0x99,0x5a,0x8c,0x37,0x3c,0x93,0xc8,0x59,0xf7,0xba,0xe7,0xb8,0xc3,0x4f,0x22,
+    0x97,0x09,0x60,0x72,0xae,0x15,0xe0,0x3f,0xd9,0xf8,0x3f,0xef,0x8d,0xf9,0x05,0xb0,
+    0xae,0xe4,0x31,0xcd,0xe4,0x21,0xba,0xa9,0xee,0x99,0x0e,0xcf,0x54,0x62,0x4c,0x31,
+    0x77,0xb8,0x69,0xe8,0xa6,0x9b,0x18,0x2f,0xb2,0x7f,0xa9,0x3c,0x93,0x98,0x63,0xc9,
+    0x79,0x16,0xbf,0x33,0x66,0x9a,0x71,0xbc,0x84,0xdf,0x2c,0x73,0x9e,0xcc,0x06,0x9f,
+    0x61,0xe2,0xce,0xf6,0xe2,0x4e,0x33,0x71,0xe6,0xb0,0x0f,0x6a,0x1d,0xe6,0x78,0x75,
+    0x28,0x40,0x1e,0x86,0x3c,0xd7,0xf8,0xbe,0xcc,0xba,0x10,0xdf,0x79,0xc8,0x3a,0x9f,
+    0xaf,0x14,0x71,0x8e,0xbe,0x0a,0x2e,0xf6,0xf3,0x91,0x75,0x1d,0x2e,0xe0,0xac,0x9b,
+    0xc7,0xbe,0xab,0xf9,0x2c,0x30,0x9c,0xaf,0x15,0xc1,0xf9,0x3a,0xb8,0xd6,0x64,0x21,
+    0x58,0x2b,0xd3,0xbf,0x0b,0x8d,0xfd,0x1b,0xd4,0x59,0xe7,0xf2,0x4d,0xb0,0x45,0xcc,
+    0xe5,0x52,0x33,0x97,0xa2,0x5b,0x12,0xf6,0x5f,0x34,0xf6,0x25,0x70,0x2e,0xe6,0x37,
+    0x9c,0xd4,0x65,0x29,0xba,0xe5,0x26,0xc6,0x4a,0x62,0x6c,0x73,0x31,0x72,0xc2,0x3d,
+    0x32,0xba,0x43,0xad,0x64,0x3e,0x05,0x5b,0x65,0x70,0xe5,0x5c,0xe5,0x71,0x2e,0x85,
+    0x33,0x27,0xdc,0x43,0xa3,0xf3,0x47,0xd7,0xd2,0x6a,0x30,0x5d,0x4b,0xab,0xbd,0x79,
+    0x1a,0x66,0xf2,0x79,0xd7,0xdb,0xcf,0xdf,0x2b,0x62,0x3f,0x5f,0x03,0xae,0xfb,0xf9,
+    0xfb,0xf8,0xad,0x31,0x36,0x1f,0x78,0xeb,0x60,0x2d,0x98,0xdd,0xcf,0x3f,0xc4,0x77,
+    0x2d,0xf5,0x5c,0x6f,0xea,0x29,0xba,0x75,0xee,0xd9,0x44,0x8e,0xeb,0x4c,0x4e,0x1f,
+    0x91,0xd3,0x46,0x13,0xef,0x63,0x70,0x19,0xe3,0x06,0x64,0x19,0xe3,0x7a,0xfc,0x37,
+    0x19,0xdb,0x4f,0xb8,0x0f,0xa8,0xbc,0x99,0xf3,0x7e,0x0b,0x7d,0xb1,0x05,0x9b,0xcd,
+    0xc6,0x66,0x2b,0x77,0x84,0x1d,0xd8,0x6c,0xc3,0x6e,0xab,0x89,0xb9,0xcd,0x8b,0xb9,
+    0xde,0xf8,0x7f,0x8a,0xff,0x10,0xee,0xec,0x3b,0xc0,0xc4,0x77,0x3b,0xb2,0xda,0x7e,
+    0xc6,0x7d,0x41,0x6d,0x3f,0x07,0xd3,0xfb,0xfe,0x2e,0xee,0x0f,0x13,0xb9,0x53,0x7d,
+    0x81,0xcd,0x2e,0xf8,0x76,0x82,0xa9,0xfd,0x6e,0xee,0x17,0x72,0x1e,0xee,0xf6,0xee,
+    0x63,0x15,0xa8,0x79,0x16,0xf7,0xb1,0x4c,0xfe,0xa7,0x94,0xfc,0x2b,0x1a,0x8e,0x3d,
+    0xe0,0xc2,0xb1,0xc7,0xbb,0x77,0x56,0x81,0xa3,0x92,0xb9,0xd3,0x65,0x1b,0xbe,0xca,
+    0xf0,0x55,0x35,0xf7,0xa1,0xbd,0xe6,0xbe,0x23,0xfc,0x5f,0x62,0x37,0x92,0x1e,0xfe,
+    0x0a,0x4c,0x7b,0xf8,0x6b,0x30,0x19,0xdf,0x5e,0x64,0xad,0xd7,0x3e,0xf8,0x24,0xb7,
+    0x7d,0x26,0xb7,0x38,0xf3,0xdf,0x61,0x35,0x93,0x5b,0x75,0xf2,0xa9,0x61,0x7e,0xbb,
+    0x7e,0x57,0xc4,0x6f,0xd7,0xef,0xc1,0xb5,0xef,0x7e,0xa0,0xef,0x46,0x19,0x9b,0x1f,
+    0xc1,0xf5,0xbc,0x3f,0x0a,0xd6,0xc2,0xec,0xb3,0x3f,0xc1,0x75,0xd4,0xf8,0xfd,0x4c,
+    0x1e,0x7a,0x27,0x38,0xc6,0x7f,0x32,0xf9,0xd8,0xcb,0x38,0x8f,0x61,0xa7,0xbf,0x81,
+    0xfe,0x03,0x96,0x3c,0x99,0xa0,0x38,0x17,0x00,0x00
 };
 
 // Generated from:
@@ -166,6 +167,8 @@
 //     uint Sd;
 //     uint Ed;
 //
+//     uint srcEmulatedAlpha;
+//
 //     bool isSrcHDR;
 //     bool isSrcA2BGR10;
 // } params;
@@ -231,9 +234,7 @@
 //
 //     if(component >= params . Ns && component == 3)
 //     {
-//
-//         valueAsUint = valueMask;
-//
+//         valueAsUint = params . srcEmulatedAlpha;
 //     }
 //     else
 //     {
diff --git a/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000006.inc b/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000006.inc
index 0829596..3a8741a 100644
--- a/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000006.inc
+++ b/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000006.inc
@@ -10,121 +10,122 @@
 
 #pragma once
 constexpr uint8_t kConvertVertex_comp_00000006[] = {
-    0x1f,0x8b,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0xff,0x9d,0x98,0x79,0x94,0xce,0x65,
-    0x14,0xc7,0xdf,0xdf,0x2c,0xef,0x8c,0x99,0x61,0x66,0x2c,0x23,0x59,0x32,0x51,0x8d,
-    0x4c,0x66,0x92,0x35,0x4d,0x07,0xc9,0x52,0x93,0x8a,0x70,0x48,0x31,0x99,0x16,0xca,
-    0x16,0xa5,0x24,0xc9,0x16,0x59,0x42,0x96,0x50,0x21,0x24,0x4b,0xd6,0x24,0xa4,0x42,
-    0xe9,0xa8,0x9c,0x43,0x96,0x36,0xa5,0xd5,0x21,0x4b,0x93,0xca,0x16,0xe9,0xb9,0xef,
-    0xfb,0xb9,0xcd,0xf5,0x9c,0xf9,0xab,0x39,0xe7,0x77,0x7e,0xbf,0xfb,0xbd,0xeb,0xf3,
-    0x7d,0xee,0xb3,0xbc,0x13,0x1b,0x53,0x23,0x21,0x14,0x0a,0x42,0x49,0xa1,0xc4,0x50,
-    0x85,0x20,0x14,0xf9,0x4b,0x0f,0xc5,0x84,0xe4,0x33,0x39,0x14,0x8e,0xbc,0x5b,0xe5,
-    0xb7,0xcf,0xaf,0x33,0x60,0x60,0x61,0x9d,0x7a,0xf5,0x73,0x45,0x5f,0x26,0x14,0x1b,
-    0xb1,0x13,0x5d,0xaa,0xb3,0x89,0x77,0xef,0x38,0xf7,0xf4,0x2e,0xe8,0xd9,0x47,0xf0,
-    0x7d,0xee,0x49,0x73,0x78,0x5c,0x24,0x56,0x28,0xd4,0x14,0x5b,0x79,0x5a,0x3b,0xeb,
-    0x2b,0xa2,0x69,0x42,0x35,0x78,0x2b,0x16,0x80,0xc5,0x19,0x2c,0x06,0x2c,0xd1,0x60,
-    0xb1,0x60,0x29,0x06,0x8b,0x03,0x4b,0x33,0x58,0x3c,0x58,0x79,0x83,0x85,0xc1,0x2e,
-    0x31,0x58,0x02,0x58,0x15,0x83,0x25,0x82,0x55,0x37,0x58,0x29,0xb0,0x9a,0x06,0x4b,
-    0x02,0xcb,0x32,0x58,0x32,0x58,0xb6,0xc1,0x52,0xc0,0x72,0x0d,0x56,0x1a,0xac,0x9e,
-    0x70,0xec,0x46,0xa5,0xe3,0x6d,0xe5,0x46,0xd3,0x9d,0x5a,0x95,0x8b,0x02,0x8f,0x33,
-    0xb1,0x2f,0x80,0x0b,0xb1,0xef,0xe1,0xde,0x97,0xff,0xa7,0x8b,0xca,0x99,0x70,0x2a,
-    0xf2,0x4e,0x2f,0xde,0xae,0x12,0xe2,0xed,0x32,0xf1,0x76,0x7b,0xf1,0x76,0x13,0x4f,
-    0xe5,0x7d,0x8c,0xb3,0x0a,0x72,0xf9,0x20,0x2a,0x57,0x72,0x4f,0x39,0x37,0x8a,0x98,
-    0x88,0x7d,0x6c,0x24,0x9e,0x7c,0x57,0x70,0x36,0x61,0xf8,0x0c,0x45,0xde,0x71,0x11,
-    0xde,0x13,0xa8,0x2b,0xd3,0xd5,0x94,0xc8,0xb7,0xe2,0x19,0xce,0x3b,0x1d,0x9f,0x4c,
-    0x67,0x5f,0x96,0x7e,0x4a,0xc0,0x3f,0x83,0xef,0x74,0xf4,0x15,0xf9,0xce,0x20,0x5e,
-    0x65,0x13,0x2f,0x03,0x9b,0xea,0xd4,0x23,0x58,0x35,0xd7,0x2d,0xda,0x13,0xff,0xe7,
-    0x91,0x1a,0xae,0xa4,0x2f,0x24,0x4e,0x13,0xe4,0xab,0xc0,0x64,0xcc,0x59,0xd4,0x2f,
-    0xf3,0x50,0x1b,0xb9,0x96,0xf1,0xbf,0x1a,0xdb,0x30,0x7a,0x79,0xe7,0x30,0x4f,0x6a,
-    0x5f,0x97,0x9a,0x55,0xdf,0x84,0xfe,0x54,0x7d,0x73,0x4f,0xce,0xc7,0xbf,0xbc,0xf3,
-    0xba,0xdd,0xf8,0xb5,0x63,0x7e,0x45,0x16,0x9e,0x3a,0x31,0x17,0x55,0x1d,0xaa,0xfd,
-    0x56,0x8d,0xbe,0xea,0x4e,0x7d,0xf7,0x91,0xbb,0x80,0xf1,0x89,0xdc,0xc3,0xd4,0x23,
-    0xf9,0x0a,0xcd,0x9c,0x3e,0x88,0x2e,0x6c,0xf4,0xbd,0xe8,0x7f,0xad,0xa3,0x37,0xf6,
-    0xaa,0x1f,0xc8,0x3a,0x52,0x79,0xb0,0xa9,0x53,0xe4,0xa7,0xdc,0x73,0x21,0xb6,0x58,
-    0x1e,0xca,0xda,0xd1,0x78,0xa3,0x8c,0xbf,0xc8,0x93,0x3c,0xbe,0x66,0x33,0x07,0x52,
-    0xdf,0xab,0xcc,0x7d,0x96,0x89,0xff,0x9a,0xc4,0x77,0x7f,0x2a,0x2f,0x30,0xf3,0x25,
-    0xfe,0x6f,0xb1,0xdb,0x29,0x6f,0xef,0x46,0xe4,0x61,0x0d,0x85,0xb7,0x9d,0x86,0x37,
-    0x59,0x3f,0x3b,0xc9,0xf3,0x39,0x35,0xec,0x82,0x37,0x91,0x77,0x83,0x55,0x74,0xf2,
-    0x1e,0xfc,0x62,0xb1,0xdf,0x4b,0xce,0x3d,0xd8,0xef,0x65,0x1f,0x0d,0xd0,0x7f,0xc1,
-    0xb7,0xed,0x93,0x22,0xaf,0xce,0x72,0x41,0x74,0xaf,0xcd,0x76,0x92,0xc4,0x91,0x35,
-    0x29,0x58,0x11,0xb6,0x0d,0xdc,0x9a,0x88,0xa1,0x37,0x42,0xe4,0x3e,0xed,0x90,0x78,
-    0x72,0x0a,0x2f,0x87,0xe0,0x47,0xe5,0xc3,0x9e,0x7c,0xc2,0xc8,0xb2,0xa6,0x2e,0x78,
-    0x7a,0x29,0xc8,0xea,0x63,0x3d,0x39,0x2e,0xb8,0xd8,0x3e,0xc1,0xd3,0x97,0xf2,0xf4,
-    0x69,0xc8,0xcd,0x5c,0x95,0xc2,0xc1,0xf7,0xf0,0x22,0x3d,0x94,0xc7,0xb8,0x7f,0x00,
-    0x17,0x1b,0x59,0x4f,0x3f,0xb2,0x06,0x0b,0x8d,0xcd,0x4f,0xe0,0xcb,0x9d,0x8d,0xac,
-    0x89,0x9f,0xf1,0x13,0xfc,0x94,0x63,0xe2,0x20,0x9c,0x9c,0x75,0xf6,0xa2,0xfb,0xc5,
-    0x3d,0x07,0xe1,0x47,0xbe,0xcf,0xbb,0x81,0xc9,0xb7,0x60,0x37,0x3a,0xfb,0x43,0xd4,
-    0x20,0xdf,0x87,0xf9,0x3e,0xe3,0xf4,0xbf,0xe2,0x23,0xef,0x93,0x2e,0xd6,0x51,0xf7,
-    0x3e,0x46,0x6c,0xd1,0x1f,0x47,0x7f,0xdc,0xd4,0xf6,0x1b,0x3c,0xaf,0xa4,0xb6,0xdf,
-    0xc1,0x8a,0xa8,0x47,0xe4,0x23,0xee,0x39,0x8a,0xef,0x11,0xc3,0xc7,0x1f,0x25,0xf0,
-    0xf1,0x27,0xf8,0x48,0x67,0x23,0xf2,0x5f,0x60,0x45,0xc6,0xe6,0x24,0x39,0x87,0x61,
-    0x73,0x0a,0xbb,0x93,0x8c,0xe9,0x04,0x98,0xda,0x9f,0x66,0xee,0x95,0xe3,0x33,0x70,
-    0xbc,0xc0,0xd8,0x9c,0x05,0x57,0x8e,0xff,0xc6,0xef,0x2c,0x1c,0x9f,0x37,0x1c,0x8b,
-    0xee,0x5c,0x84,0xd7,0xe8,0x98,0xce,0xc1,0x8f,0x8e,0xf1,0xbc,0x89,0x1b,0x04,0xd1,
-    0xdc,0x52,0x97,0xf4,0x97,0xc8,0x8d,0x5d,0x0e,0x59,0x8b,0x31,0x41,0xf4,0x7c,0x17,
-    0x5c,0xf4,0x17,0xc0,0xf2,0x58,0xab,0xf1,0x41,0xb4,0x47,0x45,0x27,0xbd,0x17,0x6f,
-    0x7c,0xc3,0x41,0xf4,0xbc,0x8a,0xc3,0x57,0x7a,0x35,0x1c,0x14,0xe7,0x4d,0x34,0x79,
-    0xa5,0x4f,0x13,0x4d,0xdc,0xa4,0x20,0xda,0xdb,0xa2,0x93,0x9e,0x4d,0x8a,0xc4,0x0d,
-    0x47,0xfc,0x92,0x03,0xd9,0x0f,0xa2,0xbd,0x5d,0xca,0xc4,0x4b,0x09,0xa2,0xeb,0xeb,
-    0x23,0x38,0x2f,0x1d,0x44,0xb1,0xe4,0xa0,0xb8,0xa7,0x04,0x13,0x1e,0x8e,0xc1,0xc3,
-    0x31,0xc3,0x43,0x99,0xe0,0xe2,0x39,0x4b,0x0d,0xa2,0xd8,0x02,0xd3,0x87,0xa9,0xc1,
-    0xc5,0x7d,0x78,0xd4,0xf8,0xa7,0x93,0x5f,0x6c,0x65,0x5d,0xa5,0xc3,0x85,0xec,0x09,
-    0x65,0x83,0xe8,0x79,0x2f,0xb8,0xf4,0x7a,0x23,0xf7,0x34,0x20,0x4f,0x32,0xf3,0x26,
-    0x67,0x4c,0x43,0xe1,0x82,0x33,0x4b,0xbf,0x93,0xc8,0x95,0x62,0x72,0xd5,0xc4,0x46,
-    0xfb,0xa5,0x36,0xfd,0x52,0xcb,0xd8,0x64,0x83,0x6b,0x9f,0x5e,0x83,0x5f,0xb6,0xb1,
-    0xa9,0x43,0x7c,0xb5,0xc9,0x05,0xcb,0x31,0x3c,0x5c,0x8b,0x6f,0xae,0xc9,0x77,0x1d,
-    0xf9,0xea,0x9a,0x58,0xf5,0xc0,0xd5,0xaf,0x3e,0xbe,0x82,0xff,0xe3,0xea,0x17,0xd9,
-    0x8e,0x3b,0xb5,0x84,0x71,0x97,0x36,0xdf,0x65,0x18,0x77,0x9a,0xd9,0xaf,0x1a,0xb1,
-    0x1f,0x6a,0xce,0xc6,0xf8,0x8c,0x25,0xe6,0xf5,0x60,0x39,0x66,0x4c,0x37,0x80,0x37,
-    0x61,0x6e,0x1a,0x81,0x69,0x8c,0x3c,0xe2,0x4a,0x8d,0x79,0xa6,0xc6,0x74,0xee,0xb6,
-    0xf2,0x57,0xd6,0xd4,0x55,0x8e,0xba,0x2a,0x98,0xba,0x9a,0x7a,0xfb,0x74,0x4b,0x4f,
-    0xee,0xec,0xc9,0x5d,0x3c,0xb9,0xab,0x27,0x77,0xf3,0xe4,0xfe,0x9e,0x3c,0xc8,0x93,
-    0x47,0x7a,0xf2,0x38,0x4f,0x9e,0xe1,0xc9,0x33,0x8d,0x2c,0x67,0xf6,0x1c,0x4f,0xbf,
-    0xc6,0x3b,0x87,0x36,0x7a,0xf2,0x26,0x6f,0x1e,0x9a,0xc1,0x8b,0xf6,0xc7,0x4d,0xf4,
-    0x47,0x73,0x63,0xd3,0x02,0x7c,0x34,0xf3,0x72,0x33,0x7e,0x2d,0x98,0x97,0xa6,0x60,
-    0x6a,0xdf,0xca,0x8b,0xd9,0xba,0x84,0x98,0x6d,0xc0,0x75,0xfe,0x6f,0xc1,0xaf,0x0d,
-    0x31,0x5b,0x82,0xa9,0xfd,0xad,0xcc,0x8d,0xc6,0xbc,0x8d,0x98,0xf9,0xc6,0xa6,0x2d,
-    0xb8,0xee,0xb3,0x77,0xe0,0xd7,0xd6,0xd8,0xdc,0x49,0x1c,0x3d,0x53,0xda,0x83,0xc9,
-    0x1d,0x70,0x11,0xd8,0x5d,0xf8,0xb6,0x67,0x7f,0xee,0x68,0xf6,0x67,0xd1,0x75,0x70,
-    0x4f,0x47,0x7a,0xa9,0x03,0xfd,0xd7,0x09,0xb9,0xa3,0xc9,0x75,0x37,0xfd,0x25,0xe3,
-    0xe9,0x82,0xac,0xba,0x7b,0xa8,0x43,0x74,0x5d,0x91,0x75,0x9f,0xbc,0x97,0xbd,0xa5,
-    0x0b,0xfd,0x25,0x36,0x9d,0xc1,0xd5,0xff,0x7e,0x7a,0x53,0xe7,0xe4,0x01,0xb0,0x9c,
-    0x08,0x47,0xe1,0xc8,0x7d,0xf3,0x21,0xee,0xa4,0x85,0xe8,0xd5,0xb7,0x27,0x3a,0x89,
-    0xdb,0x0d,0x59,0x79,0x7d,0x18,0x5e,0x7b,0x19,0xfb,0x47,0xc0,0x97,0xc2,0x4f,0x1f,
-    0xb0,0xde,0xf0,0xd3,0xcf,0xf0,0x23,0xba,0xbe,0xee,0x99,0x0e,0x1f,0x7d,0x4d,0x9c,
-    0x47,0x19,0xf3,0x12,0xe2,0x0c,0x00,0x13,0xee,0x17,0x3b,0x0b,0xb9,0x63,0x3e,0x06,
-    0x5e,0x97,0xfb,0xef,0x10,0x7c,0x1f,0x47,0x27,0x35,0xf7,0x47,0xd6,0xb8,0x4f,0x78,
-    0x71,0x9f,0x04,0xb3,0x71,0x87,0x80,0x0f,0xe6,0xde,0xac,0x71,0x9f,0x46,0x27,0x71,
-    0x07,0x21,0x2b,0x17,0xcf,0xc0,0xc5,0x50,0x93,0x6b,0x18,0xb8,0x72,0xf1,0x2c,0x98,
-    0x72,0x31,0xc2,0x70,0x21,0xba,0xe1,0xee,0x19,0x03,0x17,0xc3,0x4d,0x9c,0xd1,0xd4,
-    0xac,0x7b,0xdd,0x73,0xdc,0xd7,0x47,0x53,0xcb,0x48,0x30,0x39,0xb3,0x46,0xe0,0x3f,
-    0xc6,0xf8,0x8f,0xf5,0xc6,0xfc,0x3c,0x58,0x3b,0xea,0x98,0x60,0xea,0x10,0xdd,0x78,
-    0xf7,0x4c,0x24,0xce,0x78,0x72,0x8c,0x33,0xf7,0xb3,0x09,0xe8,0x26,0x9a,0x1c,0x2f,
-    0xb0,0x7f,0xa9,0x3c,0x99,0x9c,0xc3,0xa9,0x79,0x0a,0xbf,0x29,0x26,0x9b,0x71,0xbc,
-    0x88,0xdf,0x14,0x73,0x9e,0x4c,0x05,0x9f,0x64,0xf2,0x4e,0xf5,0xf2,0x4e,0x30,0x79,
-    0xa6,0xb1,0x0f,0x2a,0x0f,0xd3,0x3c,0x1e,0x46,0x20,0xf7,0x43,0x9e,0x6e,0x7c,0x5f,
-    0x62,0x5d,0x88,0xef,0x0c,0x64,0xf9,0x9e,0xc9,0xda,0xd0,0x35,0x36,0x8b,0x73,0x6c,
-    0x06,0x7b,0xaa,0xe6,0x9a,0x65,0x7a,0x6c,0xb6,0x89,0xfb,0x32,0x5c,0x28,0xdf,0xaf,
-    0x80,0xcd,0x86,0xef,0x79,0x86,0x6f,0xd1,0xcd,0x75,0xcf,0x7c,0xea,0x9b,0x4b,0xcc,
-    0x39,0xfc,0xa6,0x92,0xda,0xe7,0xa1,0x9b,0x6f,0x72,0x2c,0x24,0xc7,0x87,0x2e,0x87,
-    0xf4,0xec,0xeb,0xdc,0x23,0x17,0xc2,0x79,0x56,0x64,0x8f,0x2a,0xc6,0x35,0xe6,0x22,
-    0x2f,0xe6,0x3c,0x62,0x8a,0xfd,0x1b,0x9c,0x11,0xda,0xef,0x8b,0xc1,0xb4,0xdf,0x17,
-    0x7b,0x5c,0xf6,0x33,0xf5,0x2c,0xf1,0xf6,0xdc,0xa5,0x25,0xec,0xb9,0xcb,0xc0,0x75,
-    0xcf,0x7d,0x13,0xbf,0x65,0xc6,0x66,0xb9,0xd7,0xab,0x2b,0xc0,0xec,0x9e,0xbb,0x12,
-    0xdf,0x15,0xf0,0xb9,0xda,0xf0,0x29,0xba,0x55,0xee,0x59,0x4b,0x8d,0xab,0xa8,0x7f,
-    0x0d,0xbf,0x41,0xa5,0xfe,0xd5,0xe8,0xd6,0x9a,0xbc,0x6f,0x73,0x1e,0xab,0xbc,0x8e,
-    0xf3,0x76,0x0b,0x7d,0xf9,0x0e,0x36,0xeb,0x8c,0xcd,0x7a,0xce,0xe8,0x8f,0xb1,0xd9,
-    0x80,0xdd,0x7a,0x93,0x73,0x83,0x97,0x73,0x35,0xba,0x8d,0xfc,0x06,0xd6,0x58,0xef,
-    0x71,0x1e,0x0f,0x61,0x2e,0xde,0x07,0xeb,0xcb,0x5d,0xf9,0x03,0x30,0xbd,0x3b,0x6f,
-    0xe6,0xbc,0x1e,0xc5,0x1d,0x66,0x0b,0x36,0x9b,0x89,0xbf,0x09,0x4c,0xed,0xb7,0x72,
-    0x9e,0xcb,0xf9,0xb3,0xd5,0xbb,0xff,0x54,0x82,0xbf,0x8a,0xdc,0x7f,0x32,0xf8,0xdf,
-    0x9e,0xd4,0x7b,0xa9,0x89,0xb1,0x0d,0x5c,0x62,0x6c,0xf3,0xee,0x79,0xd5,0x88,0x51,
-    0xd9,0xdc,0xa1,0xaa,0x98,0x78,0x55,0x89,0x77,0x99,0xb9,0x7f,0x6c,0x37,0xf7,0x0b,
-    0x89,0xff,0x09,0x76,0xca,0xc1,0xa7,0x60,0xda,0x8f,0x9f,0x81,0xc9,0xf8,0xb6,0x23,
-    0x2b,0x7f,0x3b,0x88,0x27,0xb5,0xed,0x30,0xb5,0xc5,0x98,0xff,0xc1,0x55,0x37,0xb5,
-    0x65,0x52,0x4f,0x0d,0xf3,0x3b,0xf0,0xcb,0x12,0x7e,0x07,0x7e,0x05,0xae,0x7d,0xfd,
-    0x35,0x7d,0x3d,0xd8,0xd8,0x7c,0x03,0xae,0xe7,0xeb,0x7e,0x30,0x7b,0xbf,0xfe,0x96,
-    0x58,0xfb,0x8d,0xdf,0x77,0xd4,0xa1,0x67,0xf0,0x01,0xfe,0xbf,0x51,0x88,0xbd,0x8c,
-    0xf3,0x00,0x76,0xfa,0x7b,0xe2,0x5f,0x28,0x36,0xbc,0x92,0x6c,0x16,0x00,0x00
+    0x1f,0x8b,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0xff,0x9d,0x98,0x79,0x94,0x8f,0x65,
+    0x14,0xc7,0x7f,0xef,0x6f,0x66,0x7e,0x33,0x66,0xc6,0x98,0x31,0x8c,0x64,0xc9,0x44,
+    0x45,0x84,0x64,0x4d,0xd3,0x41,0xb2,0x94,0x54,0x84,0x43,0x0a,0x99,0x16,0xca,0x16,
+    0xa5,0x24,0xc9,0x16,0x59,0x42,0x96,0x50,0x21,0x24,0x4b,0xf6,0x92,0x90,0xb2,0x9c,
+    0x9c,0xa3,0x72,0x0e,0x59,0xda,0x94,0x56,0x87,0x2c,0x49,0x42,0x96,0x9e,0xfb,0xfe,
+    0x3e,0xb7,0xb9,0x9e,0x33,0x7f,0x35,0xe7,0xbc,0xe7,0x7d,0xef,0xf7,0xae,0xcf,0xf7,
+    0xb9,0xcf,0xf2,0x9b,0x84,0x68,0xc5,0xe4,0x48,0x24,0x88,0xa4,0x46,0x52,0x22,0xa5,
+    0x82,0x48,0xf8,0x97,0x15,0x89,0x46,0xe4,0x33,0x2d,0x12,0x0b,0xdf,0xcd,0x5b,0xb5,
+    0x6d,0x55,0xbd,0xff,0x80,0xfc,0xea,0xb5,0xeb,0xd4,0x14,0x7d,0x46,0x24,0x21,0xb4,
+    0x13,0x5d,0x31,0x67,0x93,0xe4,0xde,0x89,0xee,0xe9,0xd5,0xad,0x47,0x6f,0xc1,0xf7,
+    0xbb,0x27,0xd3,0xe1,0x89,0x61,0xac,0x48,0xa4,0x11,0xb6,0xf2,0xb4,0x70,0xd6,0xd7,
+    0xc4,0xd3,0x44,0x2a,0xf2,0x56,0x2c,0x00,0x4b,0x34,0x58,0x14,0x2c,0xc5,0x60,0x09,
+    0x60,0xe9,0x06,0x4b,0x04,0xcb,0x34,0x58,0x12,0x58,0x09,0x83,0xc5,0xc0,0xae,0x30,
+    0x58,0x32,0x58,0x59,0x83,0xa5,0x80,0x55,0x30,0x58,0x11,0xb0,0x4a,0x06,0x4b,0x05,
+    0xab,0x6c,0xb0,0x34,0xb0,0x6a,0x06,0x4b,0x07,0xab,0x69,0xb0,0xa2,0x60,0xb5,0x0d,
+    0x96,0x01,0x56,0x5f,0x78,0x77,0x23,0x55,0x0e,0x9a,0xbb,0x11,0x76,0xa5,0x7e,0xe5,
+    0xa7,0x9b,0xc7,0xa3,0xd8,0x77,0x83,0x1f,0xb1,0xef,0xee,0xde,0x57,0xff,0xa7,0x8b,
+    0xcb,0xb9,0xf0,0x2c,0xf2,0x2e,0x2f,0xde,0xee,0x42,0xe2,0xed,0x36,0xf1,0xf6,0x78,
+    0xf1,0xf6,0x10,0x4f,0xe5,0xfd,0x8c,0xbd,0x2c,0x72,0x4e,0x10,0x97,0x4b,0xbb,0x27,
+    0xdb,0x8d,0x22,0x1a,0xda,0x27,0x84,0xf1,0xe4,0xbb,0xa4,0xb3,0x89,0xc1,0x71,0x24,
+    0x7c,0x27,0x86,0x73,0x91,0x4c,0x5d,0xb9,0xae,0xa6,0x14,0xbe,0x15,0xcf,0x71,0xde,
+    0x59,0xf8,0xe4,0x3a,0xfb,0xe2,0xf4,0x58,0x32,0xfe,0x39,0x7c,0x67,0xa1,0x2f,0xc5,
+    0x77,0x0e,0xf1,0xca,0x98,0x78,0x39,0xd8,0x54,0xa0,0x1e,0xc1,0xca,0x3b,0x6b,0xed,
+    0x93,0xff,0xfb,0x48,0x1d,0xd7,0xd2,0x2f,0x12,0xab,0x21,0xf2,0x75,0x60,0x32,0xee,
+    0xca,0x8c,0x41,0xe6,0xa2,0x2a,0x72,0x15,0xe3,0x7f,0x3d,0xb6,0x31,0xf4,0xf2,0xae,
+    0xc1,0x5c,0xa9,0x7d,0x2d,0xea,0x56,0x7d,0x43,0xfa,0x56,0xf5,0x4d,0x3c,0xb9,0x15,
+    0xfe,0x25,0x9c,0xd7,0xdd,0xc6,0xaf,0x0d,0x73,0x2c,0xb2,0x70,0xd5,0x81,0xf9,0x28,
+    0xe7,0x50,0xed,0xb9,0xf2,0xf4,0x56,0x57,0xea,0x7b,0x88,0xdc,0xdd,0x18,0x9f,0xc8,
+    0xdd,0x4d,0x3d,0x92,0x2f,0xdf,0xcc,0xeb,0xa3,0xe8,0x62,0x46,0xdf,0x93,0x35,0xa0,
+    0x75,0xf4,0xc2,0x5e,0xf5,0x03,0x58,0x5f,0x2a,0x0f,0x32,0x75,0x8a,0xfc,0x9c,0x7b,
+    0x2e,0x25,0x14,0xc8,0x43,0x58,0x3f,0x1a,0x6f,0xa4,0xf1,0x17,0x79,0xa2,0xc7,0xd7,
+    0x2c,0xe6,0x40,0xea,0x7b,0x93,0xf9,0xaf,0x6c,0xe2,0xbf,0x25,0xf1,0xdd,0x9f,0xca,
+    0xf3,0xbd,0xf9,0x5a,0xc3,0xba,0x56,0xde,0x3e,0x0a,0xab,0x1f,0x5a,0x4f,0x78,0xdb,
+    0x65,0x78,0x93,0x35,0xb4,0x8b,0x3c,0x5f,0x52,0xc3,0x6e,0x78,0x13,0x79,0x0f,0x58,
+    0x29,0x27,0xef,0xc5,0x2f,0x01,0xfb,0x7d,0xe4,0xdc,0x8b,0xfd,0x3e,0xf6,0xd7,0x00,
+    0xfd,0x57,0x7c,0xdb,0x3e,0x39,0x69,0xea,0x14,0xb9,0x64,0x10,0xdf,0x83,0xab,0x39,
+    0x49,0xe2,0xc8,0xba,0x14,0xec,0x24,0xb6,0x75,0xdd,0xba,0x88,0xd2,0x1b,0x11,0x72,
+    0x9f,0x71,0x48,0x12,0x39,0x85,0x97,0xc3,0xf0,0xa3,0xf2,0x11,0x4f,0x3e,0x65,0x64,
+    0x59,0x57,0x41,0x70,0xb9,0x3e,0x1a,0x5c,0xae,0x4f,0xf2,0xe4,0x98,0x67,0x5f,0xc4,
+    0xd3,0xa7,0x79,0xfa,0xe2,0xc8,0x8d,0x5d,0x95,0xc2,0xc1,0x8f,0xf0,0x22,0x3d,0x94,
+    0xc7,0xb8,0x7f,0x02,0x17,0x1b,0x59,0x4f,0x3f,0xb3,0x06,0xf3,0x8d,0xcd,0x2f,0xe0,
+    0xcb,0x9c,0x8d,0xac,0x89,0x5f,0xf1,0x13,0xfc,0x6f,0xc7,0xc4,0x21,0x38,0x39,0xe7,
+    0xec,0x45,0xf7,0x9b,0x7b,0x0e,0xc1,0x8f,0x7c,0x5f,0x70,0x4c,0xcb,0xb7,0x60,0xb7,
+    0x3a,0xfb,0xc3,0xd4,0x20,0xdf,0x47,0xf8,0x3e,0xeb,0xf4,0xbf,0xe3,0x23,0xef,0xd3,
+    0x2e,0xd6,0x31,0xf7,0x3e,0x4e,0x6c,0xd1,0x9f,0x40,0x7f,0xc2,0xd4,0xf6,0x07,0x3c,
+    0xaf,0xa0,0xb6,0x3f,0xc1,0x4e,0x52,0x8f,0xc8,0x47,0xdd,0x73,0x0c,0xdf,0xa3,0x86,
+    0x8f,0xbf,0x0a,0xe1,0xe3,0x34,0xf8,0x08,0x67,0x13,0x0b,0xc7,0x17,0xc7,0x4e,0x1a,
+    0x9b,0x33,0xe4,0x1c,0x8a,0xcd,0x59,0xec,0xce,0x30,0xa6,0x53,0x60,0x6a,0x7f,0x8e,
+    0xb9,0x57,0x8e,0xff,0x81,0xe3,0xf9,0xc6,0xe6,0x3c,0xb8,0x72,0x7c,0x01,0xbf,0xf3,
+    0x70,0x7c,0xc9,0x70,0x2c,0xba,0x8b,0xb2,0xee,0x18,0xd3,0x45,0xf8,0xd1,0x31,0x5e,
+    0x32,0x71,0x13,0x82,0x78,0x6e,0xa9,0x4b,0xfa,0x4b,0xe4,0x06,0x2e,0x87,0xac,0xc5,
+    0xc4,0x20,0x7e,0xee,0x0b,0x2e,0x7a,0xe9,0x47,0xc1,0xf2,0x58,0xab,0xc9,0x41,0xbc,
+    0x47,0x45,0x17,0xf6,0x9e,0xf1,0x4d,0x09,0xe2,0x67,0x56,0x0c,0xbd,0xf4,0x6a,0x4a,
+    0x50,0x90,0x37,0xd5,0xe4,0x95,0x3e,0x4d,0x35,0x71,0xd3,0x83,0x78,0x6f,0x8b,0x4e,
+    0x7a,0x36,0x3d,0x8c,0x1b,0x0b,0xfd,0x8a,0x06,0xb2,0x1f,0xc4,0x7b,0x3b,0xcd,0xc4,
+    0xcb,0x08,0xe2,0xeb,0x6b,0x1b,0x9c,0x17,0x0b,0xe2,0x58,0xd1,0xa0,0xa0,0xa7,0x04,
+    0x13,0x1e,0x8e,0xc3,0xc3,0x71,0xc3,0x43,0x66,0x70,0xf9,0x9c,0x65,0x05,0x71,0x6c,
+    0xbe,0xe9,0xc3,0xac,0xe0,0xf2,0x3e,0x3c,0x66,0xfc,0xb3,0xc9,0x2f,0xb6,0xb2,0xae,
+    0xb2,0xe1,0x42,0xf6,0x84,0x12,0x41,0xfc,0xcc,0x17,0x5c,0x7a,0xbd,0xbe,0x7b,0xea,
+    0x92,0x27,0x8d,0x79,0x93,0x33,0xa6,0x9e,0xf3,0x4d,0xe6,0xcc,0xd2,0xef,0x54,0x72,
+    0xa5,0x9b,0x5c,0x95,0xb0,0xd1,0x7e,0xa9,0x4a,0xbf,0x54,0x31,0x36,0xd5,0xc0,0xb5,
+    0x4f,0x6f,0xc0,0xaf,0x9a,0xb1,0xa9,0x4e,0x7c,0xb5,0xa9,0x09,0x56,0xc3,0xf0,0x70,
+    0x23,0xbe,0x35,0x4d,0xbe,0x9b,0xc8,0x57,0xcb,0xc4,0xaa,0x0d,0xae,0x7e,0x75,0xf0,
+    0xad,0x1d,0xf6,0x62,0x34,0x94,0xed,0xb8,0x8b,0x15,0x32,0xee,0xa2,0xe6,0x3b,0x83,
+    0x71,0x67,0x9a,0xfd,0xaa,0x3e,0xfb,0xa3,0xe6,0x6c,0x80,0xcf,0x18,0x62,0xde,0x0c,
+    0x56,0xc3,0x8c,0xe9,0x16,0xf0,0x86,0xcc,0x4d,0x7d,0x30,0x8d,0x91,0x47,0x5c,0xa9,
+    0x31,0xcf,0xd4,0x98,0xc5,0x9d,0x57,0xfe,0x8a,0x9b,0xba,0xb2,0xa9,0xab,0xa4,0xa9,
+    0xab,0x91,0xb7,0x8f,0x37,0xf3,0xe4,0x8e,0x9e,0xdc,0xc9,0x93,0x3b,0x7b,0x72,0x17,
+    0x4f,0xee,0xe7,0xc9,0x03,0x3d,0x79,0x84,0x27,0x8f,0xf5,0xe4,0xe9,0x9e,0x3c,0xc3,
+    0xc8,0x72,0x66,0xcf,0xf6,0xf4,0xab,0xbd,0x73,0x68,0xa3,0x27,0x6f,0xf2,0xe6,0xa1,
+    0x31,0xbc,0x68,0x7f,0xdc,0x46,0x7f,0x34,0x31,0x36,0x4d,0xc1,0x47,0x31,0x2f,0xb7,
+    0xe3,0xd7,0x94,0x79,0x69,0x04,0xa6,0xf6,0xcd,0xbd,0x98,0x2d,0x0a,0x89,0xd9,0x12,
+    0x5c,0xe7,0xff,0x0e,0xfc,0x5a,0x12,0xb3,0x19,0x98,0xda,0xdf,0xc9,0xdc,0x68,0xcc,
+    0xbb,0x88,0xd9,0xca,0xd8,0xb4,0x06,0xd7,0x7d,0xf6,0x1e,0xfc,0x5a,0x1b,0x9b,0x7b,
+    0x89,0xa3,0x67,0x4a,0x5b,0x30,0xb9,0x03,0x2e,0x04,0xbb,0x0f,0xdf,0xb6,0xec,0xcf,
+    0xed,0xcd,0xfe,0x2c,0xba,0x76,0xee,0x69,0x4f,0x2f,0xb5,0xa3,0xff,0x3a,0x20,0xb7,
+    0x37,0xb9,0xee,0xa7,0xbf,0x64,0x3c,0x9d,0x90,0x55,0xf7,0x00,0x75,0x88,0xae,0x33,
+    0xb2,0xee,0x93,0x0f,0xb2,0xb7,0x74,0xa2,0xbf,0xc4,0xa6,0x23,0xb8,0xfa,0x3f,0x4c,
+    0x6f,0xea,0x9c,0x3c,0x02,0x56,0x23,0xe4,0x28,0x16,0xde,0x37,0x1f,0xe3,0x4e,0x9a,
+    0x8f,0x5e,0x7d,0x7b,0xa0,0x93,0xb8,0x5d,0x90,0x95,0xd7,0xc7,0xe1,0xb5,0xa7,0xb1,
+    0x7f,0x02,0x7c,0x09,0xfc,0xf4,0x06,0xeb,0x05,0x3f,0x7d,0x0d,0x3f,0xa2,0xeb,0xe3,
+    0x9e,0x69,0xf0,0xd1,0xc7,0xc4,0x79,0x92,0x31,0x2f,0x26,0x4e,0x7f,0x30,0xe1,0x7e,
+    0x91,0xb3,0x90,0x3b,0xe5,0x53,0xe0,0xb5,0xb8,0xff,0x0e,0xc6,0xf7,0x69,0x74,0x52,
+    0x73,0x3f,0x64,0x8d,0xfb,0x8c,0x17,0xf7,0x59,0x30,0x1b,0x77,0x30,0xf8,0x20,0xee,
+    0xcd,0x1a,0xf7,0x79,0x74,0x12,0x77,0x20,0xb2,0x72,0xf1,0x02,0x5c,0x0c,0x31,0xb9,
+    0x86,0x82,0x2b,0x17,0x2f,0x82,0x29,0x17,0xc3,0x0d,0x17,0xa2,0x1b,0xe6,0x9e,0xd1,
+    0x70,0x31,0xcc,0xc4,0x19,0x45,0xcd,0xba,0xd7,0xbd,0xc4,0x7d,0x7d,0x14,0xb5,0x8c,
+    0x00,0x93,0x33,0x6b,0x38,0xfe,0xa3,0x8d,0xff,0x18,0x6f,0xcc,0x2f,0x83,0xb5,0xa1,
+    0x8e,0xf1,0xa6,0x0e,0xd1,0x8d,0x73,0xcf,0x04,0xe2,0x8c,0x23,0xc7,0x58,0x73,0x3f,
+    0x1b,0x8f,0x6e,0x82,0xc9,0xf1,0x0a,0xfb,0x97,0xca,0x93,0xc8,0x39,0x8c,0x9a,0x27,
+    0xf3,0x9b,0x62,0x92,0x19,0xc7,0xab,0xf8,0x4d,0x36,0xe7,0xc9,0x14,0xf0,0x89,0x26,
+    0xef,0x14,0x2f,0xef,0x78,0x93,0x67,0x2a,0xfb,0xa0,0xf2,0x30,0xd5,0xe3,0x61,0x38,
+    0x72,0x5f,0xe4,0x69,0xc6,0xf7,0x35,0xd6,0x85,0xf8,0x4e,0x47,0x96,0xef,0x19,0xac,
+    0x0d,0x5d,0x63,0x33,0x39,0xc7,0xa6,0xb3,0xa7,0x6a,0xae,0x99,0xa6,0xc7,0x66,0x99,
+    0xb8,0xaf,0xc3,0x85,0xf2,0xfd,0x06,0xd8,0x2c,0xf8,0x9e,0x6b,0xf8,0x16,0xdd,0x1c,
+    0xf7,0xcc,0xa3,0xbe,0x39,0xc4,0x9c,0xcd,0x6f,0x2a,0xa9,0x7d,0x2e,0xba,0x79,0x26,
+    0xc7,0x02,0x72,0x6c,0x75,0x39,0xa4,0x67,0xdf,0xe6,0x1e,0xb9,0x00,0xce,0x2b,0x87,
+    0x7b,0x54,0x01,0xae,0x31,0x17,0x7a,0x31,0xe7,0x12,0x53,0xec,0xdf,0xe1,0x8c,0xd0,
+    0x7e,0x5f,0x04,0xa6,0xfd,0xbe,0xc8,0xe3,0xb2,0xaf,0xa9,0x67,0xb1,0xb7,0xe7,0x2e,
+    0x29,0x64,0xcf,0x5d,0x0a,0xae,0x7b,0xee,0xbb,0xf8,0x2d,0x35,0x36,0xcb,0xbc,0x5e,
+    0x5d,0x0e,0x66,0xf7,0xdc,0x15,0xf8,0x2e,0x87,0xcf,0x55,0x86,0x4f,0xd1,0xad,0x74,
+    0xcf,0x5a,0x6a,0x5c,0x69,0x6a,0x7a,0x8f,0x9a,0xd6,0x98,0x7c,0xef,0x83,0xcb,0x18,
+    0x57,0x23,0xcb,0x18,0x57,0xe1,0xbf,0xd6,0xd8,0x7e,0xc0,0x99,0xad,0xf2,0x3a,0xce,
+    0xe4,0xcd,0xf4,0xee,0x87,0xd8,0xac,0x33,0x36,0xeb,0x39,0xc7,0x3f,0xc5,0x66,0x03,
+    0x76,0xeb,0x4d,0xce,0x0d,0x5e,0xce,0x55,0xe8,0x36,0xf2,0x3b,0x59,0x63,0x7d,0xcc,
+    0x99,0x3d,0x98,0xf9,0xfa,0x04,0xac,0x0f,0xf7,0xe9,0xcd,0x60,0x7a,0xbf,0xde,0xc2,
+    0x99,0x3e,0x92,0x7b,0xce,0x56,0x6c,0xb6,0x10,0x7f,0x13,0x98,0xda,0x6f,0xe3,0xcc,
+    0x97,0x33,0x6a,0x9b,0x77,0x47,0x2a,0x0d,0xc7,0xa5,0xb8,0x23,0xe5,0xf0,0x7f,0x41,
+    0xa9,0xf7,0x4a,0x13,0x63,0x3b,0xb8,0xc4,0xd8,0xee,0xdd,0x05,0xcb,0x13,0xa3,0x8c,
+    0xb9,0x67,0x95,0x35,0xf1,0xca,0x11,0xef,0x2a,0x73,0x47,0xd9,0x61,0xee,0x20,0x12,
+    0xff,0x33,0xec,0x94,0x83,0xcf,0xc1,0xb4,0x67,0xbf,0x00,0x93,0xf1,0xed,0x40,0x56,
+    0xfe,0x76,0x12,0x4f,0x6a,0xdb,0x69,0x6a,0x8b,0x9a,0xff,0xd5,0x55,0x30,0xb5,0xe5,
+    0x52,0x4f,0x45,0xf3,0x5b,0xf1,0xeb,0x42,0x7e,0x2b,0x7e,0x03,0xae,0x7d,0xf6,0x2d,
+    0x7d,0x36,0xc8,0xd8,0x7c,0x07,0xae,0x67,0xf0,0x01,0x30,0x7b,0x07,0xff,0x9e,0x58,
+    0x07,0x8c,0xdf,0x0f,0xd4,0xa1,0xe7,0xf4,0x41,0xfe,0x07,0x92,0x8f,0xbd,0x8c,0xf3,
+    0x20,0x76,0xfa,0x9b,0xe3,0x5f,0xbf,0x03,0x7d,0xd4,0xa8,0x16,0x00,0x00
 };
 
 // Generated from:
@@ -163,6 +164,8 @@
 //     uint Sd;
 //     uint Ed;
 //
+//     uint srcEmulatedAlpha;
+//
 //     bool isSrcHDR;
 //     bool isSrcA2BGR10;
 // } params;
@@ -228,9 +231,7 @@
 //
 //     if(component >= params . Ns && component == 3)
 //     {
-//
-//         valueAsUint = 0x10000;
-//
+//         valueAsUint = params . srcEmulatedAlpha;
 //     }
 //     else
 //     {
diff --git a/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000007.inc b/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000007.inc
index 3bf93d5..9e493b7 100644
--- a/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000007.inc
+++ b/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000007.inc
@@ -11,119 +11,119 @@
 #pragma once
 constexpr uint8_t kConvertVertex_comp_00000007[] = {
     0x1f,0x8b,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0xff,0x9d,0x98,0x79,0x94,0x8f,0x65,
-    0x14,0xc7,0xdf,0x77,0x96,0xdf,0x8c,0x31,0x83,0xb1,0x8c,0x64,0xc9,0x44,0x45,0xc4,
-    0x24,0x44,0x9a,0x42,0xb2,0x94,0x54,0x84,0x43,0x8a,0xc9,0xb4,0x50,0xb6,0x28,0xa5,
-    0x49,0x42,0x22,0x4b,0xc8,0x12,0x2a,0x84,0x64,0xc9,0x5a,0x12,0xca,0x39,0x4e,0x92,
-    0x73,0xc8,0xd2,0xa6,0xb4,0x3a,0x64,0x49,0x2a,0x95,0x25,0xa4,0xe7,0xbe,0xbf,0xcf,
+    0x14,0xc7,0xdf,0x77,0x96,0xdf,0x8c,0x99,0x31,0x66,0x2c,0x23,0x59,0x22,0xaa,0x11,
+    0x19,0x09,0x91,0x74,0x90,0x2c,0x35,0xa9,0x08,0x87,0x14,0x32,0x2d,0x94,0x2d,0x4a,
+    0x49,0x2a,0x24,0xb2,0x84,0x2c,0xa1,0x42,0x48,0x96,0xec,0x25,0xa1,0x9c,0x94,0xca,
+    0x39,0x64,0x69,0x53,0xda,0x38,0x64,0x49,0x2a,0x65,0x3b,0xa4,0xe7,0xbe,0xbf,0xcf,
     0x6d,0xae,0xe7,0xcc,0x5f,0xcd,0x39,0xef,0x79,0xdf,0xfb,0xbd,0xeb,0xf3,0x7d,0xee,
-    0xb3,0xfc,0x26,0x31,0xa1,0x5a,0x4a,0x10,0x84,0x41,0x5a,0x90,0x1a,0x64,0x86,0x41,
-    0xf4,0x97,0x19,0x24,0x04,0xf2,0x59,0x3c,0x88,0x45,0xef,0x56,0x6d,0x3b,0xb4,0xad,
-    0x33,0x70,0x50,0x7e,0x9d,0xfa,0x0d,0x72,0x44,0x5f,0x22,0x48,0x8c,0xec,0x44,0x57,
-    0xd2,0xd9,0x24,0xbb,0x77,0x92,0x7b,0xfa,0xe4,0xf5,0xea,0x2b,0xf8,0x6e,0xf7,0x94,
-    0x72,0x78,0x52,0x14,0x2b,0x08,0x9a,0x62,0x2b,0x4f,0x6b,0x67,0x7d,0x59,0x3c,0x4d,
-    0x50,0x8d,0xb7,0x62,0x21,0x58,0x92,0xc1,0x12,0xc0,0x52,0x0d,0x96,0x08,0x96,0x6e,
-    0xb0,0x24,0xb0,0x52,0x06,0x4b,0x06,0x2b,0x6b,0xb0,0x18,0xd8,0x45,0x06,0x4b,0x01,
-    0xab,0x64,0xb0,0x54,0xb0,0xaa,0x06,0x2b,0x06,0x56,0xdd,0x60,0x69,0x60,0x35,0x0c,
-    0x56,0x1c,0xac,0xb6,0xc1,0xd2,0xc1,0x72,0x0c,0x96,0x01,0x56,0x5f,0x38,0x76,0xa3,
-    0xd2,0xf1,0xb6,0x72,0xa3,0xe9,0x41,0xad,0xca,0x45,0x9e,0xc7,0x99,0xd8,0xe7,0xc1,
-    0x85,0xd8,0xf7,0x74,0xef,0x4b,0xff,0xd3,0xc5,0xe5,0x6c,0x38,0x15,0x79,0x9b,0x17,
-    0x6f,0x7b,0x11,0xf1,0xb6,0x9b,0x78,0x3b,0xbc,0x78,0x3b,0x88,0xa7,0xf2,0x6e,0xc6,
-    0x59,0x09,0xb9,0x54,0x18,0x97,0x2b,0xb8,0xa7,0x8c,0x1b,0x45,0x42,0x64,0x9f,0x18,
-    0xc5,0x93,0xef,0x72,0xce,0x26,0x06,0x9f,0x41,0xf4,0x4e,0x8a,0x78,0x4f,0xa1,0xae,
-    0x6c,0x57,0x53,0x2a,0xdf,0x8a,0x67,0x39,0xef,0x4c,0x7c,0xb2,0x9d,0x7d,0x69,0xfa,
-    0x29,0x05,0xff,0x2c,0xbe,0x33,0xd1,0x97,0xe7,0x3b,0x8b,0x78,0x15,0x4d,0xbc,0x2c,
-    0x6c,0xaa,0x52,0x8f,0x60,0x55,0x5c,0xb7,0x68,0x4f,0xfc,0x9f,0x47,0x6a,0xb8,0x9c,
-    0xbe,0x90,0x38,0x4d,0x90,0xaf,0x00,0x93,0x31,0xd7,0xa0,0x7e,0x99,0x87,0x5a,0xc8,
-    0x35,0x8d,0xff,0x95,0xd8,0xc6,0xd0,0xcb,0xbb,0x2e,0xf3,0xa4,0xf6,0xf5,0xa8,0x59,
-    0xf5,0x4d,0xe8,0x4f,0xd5,0x37,0xf7,0xe4,0xb6,0xf8,0x97,0x75,0x5e,0xb7,0x1b,0xbf,
-    0xf6,0xcc,0xaf,0xc8,0xc2,0x53,0x67,0xe6,0xa2,0xb2,0x43,0xb5,0xdf,0xaa,0xd0,0x57,
-    0x3d,0xa8,0xef,0x3e,0x72,0xe7,0x31,0x3e,0x91,0x7b,0x9a,0x7a,0x24,0x5f,0xbe,0x99,
-    0xd3,0x07,0xd1,0xc5,0x8c,0xbe,0x37,0xfd,0xaf,0x75,0xf4,0xc1,0x5e,0xf5,0x83,0x58,
-    0x47,0x2a,0x0f,0x31,0x75,0x8a,0xfc,0x94,0x7b,0xce,0x27,0x16,0xca,0x43,0x59,0x3b,
-    0x1a,0xef,0x39,0xe3,0x2f,0xf2,0x44,0x8f,0xaf,0x59,0xcc,0x81,0xd4,0xf7,0x1a,0x73,
-    0x5f,0xc3,0xc4,0x7f,0x5d,0xe2,0xbb,0x3f,0x95,0xe7,0x9b,0xf9,0x12,0x9e,0xde,0x8e,
-    0xaa,0x1d,0x76,0xa3,0xf0,0xb4,0xcd,0xf0,0x24,0xeb,0x65,0x1b,0x71,0x3f,0x21,0xe7,
-    0x76,0x78,0x12,0x79,0x07,0x58,0x79,0x27,0xef,0xc4,0x2f,0x11,0xfb,0x5d,0xe4,0xd8,
-    0x89,0xfd,0x2e,0xf6,0xcd,0x10,0xfd,0xa7,0x7c,0xdb,0xbe,0x38,0x6a,0xea,0x12,0xb9,
-    0x64,0x18,0xdf,0x5b,0x6b,0x3b,0x49,0xe2,0xc8,0x1a,0x14,0xec,0x28,0xb6,0x0d,0xdd,
-    0x1a,0x48,0xa0,0x17,0x02,0x72,0x9f,0x72,0x48,0x32,0x39,0x85,0x87,0xfd,0xf0,0xa1,
-    0xf2,0x01,0x4f,0x3e,0x66,0x64,0x59,0x43,0x67,0x3c,0xfd,0x59,0x4f,0x7f,0xde,0x93,
-    0xa5,0x60,0x6b,0x9f,0x18,0x5e,0xa8,0x4f,0xf6,0xf4,0xe9,0xc8,0xcd,0x5c,0x95,0xc2,
-    0xc1,0x37,0xf0,0x22,0x3d,0x93,0xcb,0xb8,0xbf,0x05,0x17,0x1b,0x59,0x3f,0xdf,0xb1,
-    0xe6,0xf2,0x8d,0xcd,0xf7,0xe0,0xcb,0x9c,0x8d,0xac,0x81,0x1f,0xf0,0x13,0xfc,0xa4,
-    0x63,0x62,0x1f,0x9c,0xfc,0xed,0xec,0x45,0xf7,0xa3,0x7b,0xf6,0xc1,0x8f,0x7c,0x9f,
-    0x73,0x85,0xcb,0xb7,0x60,0x37,0x38,0xfb,0xfd,0xd4,0x20,0xdf,0x07,0xf8,0x3e,0xed,
-    0xf4,0x3f,0xe1,0x23,0xef,0x13,0x2e,0xd6,0x21,0xf7,0x3e,0x4c,0x6c,0xd1,0x1f,0x41,
-    0x7f,0xc4,0xd4,0xf6,0x33,0x3c,0xaf,0xa0,0xb6,0x5f,0xc0,0x8e,0x52,0x8f,0xc8,0x07,
-    0xdd,0x73,0x08,0xdf,0x83,0x86,0x8f,0x5f,0x8b,0xe0,0xe3,0x37,0xf0,0x91,0xce,0x46,
-    0xe4,0xdf,0xc1,0x8e,0x1a,0x9b,0xe3,0xe4,0x1c,0x86,0xcd,0x1f,0xd8,0x1d,0x67,0x4c,
-    0xc7,0xc0,0xd4,0xfe,0x4f,0xe6,0x5e,0x39,0xfe,0x0b,0x8e,0xe7,0x1b,0x9b,0x13,0xe0,
-    0xca,0xf1,0x49,0xfc,0x4e,0xc0,0xf1,0x69,0xc3,0xf1,0xc9,0x68,0x2c,0x41,0x84,0xc9,
-    0x98,0x4e,0xc1,0x8f,0x8e,0xf1,0xb4,0x89,0x7b,0x8e,0xdc,0x52,0xd7,0x59,0xe4,0xc6,
-    0x2e,0x87,0xac,0xc5,0x7f,0x38,0xcf,0xcf,0xa2,0x3f,0x03,0x96,0xcb,0x5a,0x0d,0xc3,
-    0x78,0x8f,0x8a,0x4e,0x7a,0x4f,0x64,0xf5,0x4d,0x08,0xe3,0xe7,0x93,0xe0,0xa2,0x3f,
-    0x0f,0xa6,0x79,0x93,0xc2,0xc2,0xbc,0xd2,0xa7,0x49,0x61,0x61,0xdc,0x58,0x18,0xef,
-    0x6d,0xd1,0x49,0xcf,0xc6,0xa2,0xb8,0xb1,0xf8,0xf9,0x12,0xca,0x7e,0x10,0xef,0xed,
-    0x64,0x13,0x2f,0x35,0x8c,0xaf,0xaf,0xcd,0x70,0x5e,0x2c,0x8c,0x63,0x29,0x61,0x61,
-    0x4f,0x09,0x26,0x3c,0x1c,0x86,0x87,0xc3,0x86,0x87,0xb4,0xf0,0xc2,0x39,0x2b,0x1e,
-    0xc6,0xb1,0xf9,0xa6,0x0f,0x8b,0x87,0x17,0xf6,0xe1,0x21,0xe3,0x9f,0x41,0x7e,0xb1,
-    0x95,0x75,0x95,0x01,0x17,0xb2,0x27,0x94,0x08,0xe3,0xe7,0xbb,0xe0,0xd2,0xeb,0x8d,
-    0xdc,0xd3,0x50,0xf3,0x30,0x6f,0x72,0xa6,0x5c,0xeb,0x7c,0x53,0x38,0xa3,0xf4,0x3b,
-    0x8d,0x5c,0xe9,0x26,0x57,0x75,0x6c,0xb4,0x5f,0x6a,0xd1,0x2f,0x35,0x8d,0x4d,0x6d,
-    0x70,0xed,0xd3,0xab,0xf0,0xab,0x6d,0x6c,0xea,0x10,0x5f,0x6d,0x72,0xc0,0xea,0x1a,
-    0x1e,0xae,0xc6,0x37,0xc7,0xe4,0xbb,0x86,0x7c,0xf5,0x4c,0xac,0xfa,0xe0,0xea,0xd7,
-    0x00,0xdf,0xfa,0x51,0xcf,0x24,0x44,0xb2,0x1d,0x77,0xc9,0x22,0xc6,0x9d,0x61,0xbe,
-    0x4b,0x30,0xee,0x52,0x66,0xbf,0x6a,0xc4,0x7e,0xa7,0x39,0x1b,0xe3,0x33,0x86,0x98,
-    0xd7,0x81,0xd5,0x35,0x63,0xba,0x1e,0xbc,0x09,0x73,0xd3,0x08,0x4c,0x63,0xe4,0x12,
-    0x57,0x6a,0xcc,0x35,0x35,0x66,0xd2,0xfb,0xf2,0x57,0xda,0xd4,0x55,0x86,0xba,0xca,
-    0x99,0xba,0x9a,0x7a,0xfb,0x74,0x4b,0x4f,0xee,0xe2,0xc9,0x5d,0x3d,0xb9,0x9b,0x27,
-    0x77,0xf7,0xe4,0x01,0x9e,0x3c,0xd8,0x93,0x47,0x7a,0xf2,0x58,0x4f,0x9e,0xee,0xc9,
-    0x33,0x8c,0x2c,0x67,0xf4,0x6c,0x4f,0xbf,0xda,0x3b,0x57,0x36,0x78,0xbc,0x37,0x83,
-    0x07,0xed,0x87,0x9b,0xe8,0x87,0xe6,0xc6,0xa6,0x05,0xf8,0x28,0xe6,0xe1,0x66,0xfc,
-    0x5a,0x30,0x0f,0x4d,0xc1,0xd4,0xbe,0x95,0x17,0xb3,0x75,0x11,0x31,0xdb,0x80,0xeb,
-    0x7c,0xdf,0x82,0x5f,0x1b,0x62,0xb6,0x04,0x53,0xfb,0x5b,0x99,0x0b,0x8d,0x79,0x1b,
-    0x31,0xdb,0x1a,0x9b,0x76,0xe0,0xba,0xaf,0xde,0x81,0x5f,0x3b,0x63,0x73,0x27,0x71,
-    0xf4,0x0c,0xe9,0x00,0x26,0x77,0xbc,0x85,0x60,0x77,0xe1,0xdb,0x81,0xfd,0xb8,0x93,
-    0xd9,0x8f,0x45,0xd7,0xd1,0x3d,0x9d,0xe8,0x9d,0x8e,0xf4,0x5b,0x67,0xe4,0x4e,0x26,
-    0xd7,0xdd,0xf4,0x93,0x8c,0xa7,0x2b,0xb2,0xea,0xee,0xa1,0x0e,0xd1,0x75,0x43,0xd6,
-    0x7d,0xf1,0x5e,0xf6,0x92,0xae,0xf4,0x93,0xd8,0x74,0x01,0x57,0xff,0xfb,0xe9,0x45,
-    0x9d,0x93,0x07,0xc0,0xea,0x46,0x1c,0xc5,0xa2,0xfb,0xe4,0x43,0xdc,0x39,0xf3,0xd1,
-    0xab,0x6f,0x2f,0x74,0x12,0xb7,0x3b,0xb2,0xf2,0xfa,0x30,0xbc,0xf6,0x36,0xf6,0x8f,
-    0x80,0x2f,0x81,0x9f,0xbe,0x60,0x7d,0xe0,0xa7,0xbf,0xe1,0x47,0x74,0xfd,0xdc,0x33,
-    0x0d,0x3e,0xfa,0x99,0x38,0x8f,0x32,0xe6,0xc5,0xc4,0x19,0x08,0x26,0xdc,0x2f,0x72,
-    0x16,0x72,0x87,0x7c,0x0c,0xbc,0x1e,0xf7,0xdb,0x02,0x7c,0x1f,0x47,0x27,0x35,0x0f,
-    0x40,0xd6,0xb8,0x4f,0x78,0x71,0x9f,0x04,0xb3,0x71,0x0b,0xc0,0x87,0x70,0x2f,0xd6,
-    0xb8,0x4f,0xa3,0x93,0xb8,0x83,0x91,0x95,0x8b,0x67,0xe0,0x62,0xa8,0xc9,0x35,0x0c,
-    0x5c,0xb9,0x78,0x16,0x4c,0xb9,0x18,0x61,0xb8,0x10,0xdd,0x70,0xf7,0x8c,0x86,0x8b,
-    0xe1,0x26,0xce,0x28,0x6a,0xd6,0xbd,0xed,0x79,0xee,0xe3,0xa3,0xa8,0x65,0x24,0x98,
-    0x9c,0x51,0x23,0xf0,0x1f,0x6d,0xfc,0xc7,0x78,0x63,0x7e,0x01,0xac,0x3d,0x75,0x8c,
-    0x37,0x75,0x88,0x6e,0x9c,0x7b,0x26,0x10,0x67,0x1c,0x39,0xc6,0x9a,0xfb,0xd8,0x78,
-    0x74,0x13,0x4c,0x8e,0x17,0xd9,0xaf,0x54,0x9e,0x44,0xce,0xe1,0xd4,0x3c,0x99,0xdf,
-    0x0c,0x93,0xcc,0x38,0x5e,0xc2,0x6f,0xb2,0x39,0x3f,0xa6,0x80,0x4f,0x34,0x79,0xa7,
-    0x78,0x79,0xc7,0x9b,0x3c,0x53,0xd9,0xf7,0x94,0x87,0xa9,0x1e,0x0f,0x23,0x90,0xfb,
-    0x23,0x4f,0x33,0xbe,0x2f,0xb3,0x2e,0xc4,0x77,0x3a,0xb2,0x7c,0xcf,0x60,0x6d,0xe8,
-    0x1a,0x9b,0xc9,0xb9,0x35,0x9d,0x3d,0x54,0x73,0xcd,0x34,0x3d,0x36,0xcb,0xc4,0x7d,
-    0x05,0x2e,0x94,0xef,0x57,0xc1,0x66,0xc1,0xf7,0x5c,0xc3,0xb7,0xe8,0xe6,0xb8,0x67,
-    0x1e,0xf5,0xcd,0x21,0xe6,0x6c,0x7e,0x33,0x49,0xed,0x73,0xd1,0xcd,0x33,0x39,0x16,
-    0x90,0xe3,0x43,0x97,0x43,0x7a,0xf6,0x0d,0xee,0x8d,0x0b,0xe0,0xbc,0x46,0xb4,0x47,
-    0x15,0xe2,0x1a,0x73,0xa1,0x17,0x73,0x2e,0x31,0xc5,0xfe,0x4d,0xce,0x04,0xed,0xf7,
-    0x45,0x60,0xda,0xef,0x8b,0x3c,0x2e,0xfb,0x9b,0x7a,0x16,0x7b,0x7b,0xee,0x92,0x22,
-    0xf6,0xdc,0xa5,0xe0,0xba,0xe7,0xbe,0x85,0xdf,0x52,0x63,0xb3,0xcc,0xeb,0xd5,0xe5,
-    0x60,0x76,0xcf,0x5d,0x81,0xef,0x72,0xf8,0x5c,0x65,0xf8,0x14,0xdd,0x4a,0xf7,0xac,
-    0xa1,0xc6,0x95,0x66,0x3c,0xef,0xf0,0x3b,0x53,0xc6,0xb3,0x1a,0x59,0xc6,0xb3,0x0a,
-    0xdb,0x35,0xa6,0x8e,0x77,0x39,0x8f,0x55,0x5e,0xcb,0x79,0xbb,0x89,0x3e,0x7d,0x0f,
-    0x9b,0xb5,0xc6,0x66,0x1d,0x67,0xf4,0x16,0x6c,0xd6,0x63,0xb7,0xce,0xe4,0x5c,0xef,
-    0xe5,0x5c,0x65,0xfc,0xdf,0xe7,0x0c,0x2e,0xe0,0x3e,0xfc,0x01,0x98,0xf8,0x6e,0x40,
-    0xd6,0xbb,0xf2,0x46,0xce,0x67,0x39,0x4f,0x36,0x7a,0xf7,0x97,0x0a,0xf0,0x51,0x9e,
-    0xfb,0x4b,0x16,0xff,0x8b,0x93,0x7c,0x17,0x9b,0x18,0x9b,0xc0,0x25,0xc6,0x26,0xef,
-    0x9e,0x56,0x85,0x18,0x15,0xcd,0x1d,0xa8,0x92,0x89,0x57,0x99,0x78,0x97,0x98,0xfb,
-    0xc3,0x66,0x73,0x5f,0x90,0xf8,0x1f,0x61,0x57,0x40,0x7f,0x6d,0x01,0xd3,0xf9,0xf8,
-    0x18,0x4c,0xc6,0xb7,0x19,0x59,0xb9,0xd8,0x4a,0x3c,0xa9,0x6d,0xab,0xa9,0x2d,0xc1,
-    0xfc,0xcf,0xac,0xaa,0xa9,0x2d,0x9b,0x7a,0xaa,0x99,0xdf,0x71,0x9f,0x15,0xf1,0x3b,
-    0xee,0x73,0x70,0xed,0xd3,0x2f,0xe8,0xd3,0x21,0xc6,0xe6,0x4b,0x70,0x3d,0x2f,0xf7,
-    0x80,0xd9,0xfb,0xf1,0x57,0xc4,0xda,0x63,0xfc,0xbe,0xa6,0x0e,0x3d,0x53,0xf7,0xf2,
-    0xff,0x89,0x7c,0xec,0x65,0x9c,0x7b,0xb1,0xd3,0xdf,0x03,0xff,0x02,0xae,0xa2,0x63,
-    0x12,0x1c,0x16,0x00,0x00
+    0xb3,0xfc,0x26,0x31,0xa1,0x6a,0x4a,0x10,0x84,0x41,0x5a,0x90,0x1a,0x94,0x0c,0x83,
+    0xe8,0x2f,0x3b,0x48,0x08,0xe4,0x33,0x3d,0x88,0x45,0xef,0x96,0xf9,0xed,0xf2,0x6b,
+    0x0d,0x18,0x58,0x50,0xab,0x6e,0xbd,0xda,0xa2,0xcf,0x0c,0x12,0x23,0x3b,0xd1,0x95,
+    0x70,0x36,0xc9,0xee,0x9d,0xe4,0x9e,0xde,0xdd,0x7b,0xf6,0x11,0x7c,0x97,0x7b,0xb2,
+    0x1c,0x9e,0x14,0xc5,0x0a,0x82,0x26,0xd8,0xca,0xd3,0xca,0x59,0x5f,0x16,0x4f,0x13,
+    0x54,0xe5,0xad,0x58,0x08,0x96,0x64,0xb0,0x04,0xb0,0x54,0x83,0x25,0x82,0x65,0x18,
+    0x2c,0x09,0x2c,0xcb,0x60,0xc9,0x60,0xa5,0x0d,0x16,0x03,0xbb,0xc8,0x60,0x29,0x60,
+    0x15,0x0c,0x96,0x0a,0x56,0xd9,0x60,0xc5,0xc0,0xaa,0x19,0x2c,0x0d,0x2c,0xd7,0x60,
+    0xe9,0x60,0x35,0x0d,0x96,0x01,0x56,0xdb,0x60,0xc5,0xc1,0xea,0x1a,0x2c,0x13,0xac,
+    0x81,0xf0,0xee,0x46,0xaa,0x1c,0xb4,0x74,0x23,0xec,0x46,0xfd,0xca,0x4f,0x77,0x8f,
+    0x47,0xb1,0xef,0x0e,0x3f,0x62,0xdf,0xc3,0xbd,0x2f,0xfd,0x4f,0x17,0x97,0xab,0xc0,
+    0xb3,0xc8,0x5b,0xbd,0x78,0xdb,0x8a,0x88,0xb7,0xcd,0xc4,0xdb,0xee,0xc5,0xdb,0x4e,
+    0x3c,0x95,0x77,0x31,0xf6,0x0a,0xc8,0xd9,0x61,0x5c,0x2e,0xe7,0x9e,0x52,0x6e,0x14,
+    0x09,0x91,0x7d,0x62,0x14,0x4f,0xbe,0xcb,0x38,0x9b,0x18,0x1c,0x07,0xd1,0x3b,0x29,
+    0x9a,0x8b,0x14,0xea,0xaa,0xe2,0x6a,0x4a,0xe5,0x5b,0xf1,0x1c,0xe7,0x9d,0x8d,0x4f,
+    0x15,0x67,0x5f,0x92,0x1e,0x4b,0xc1,0x3f,0x87,0xef,0x6c,0xf4,0x65,0xf9,0xce,0x21,
+    0x5e,0x79,0x13,0x2f,0x07,0x9b,0xca,0xd4,0x23,0x58,0x25,0x67,0xad,0x7d,0xf2,0x7f,
+    0x1f,0xa9,0xe3,0x72,0xfa,0x45,0x62,0x35,0x42,0xbe,0x02,0x4c,0xc6,0x9d,0xcb,0x18,
+    0x64,0x2e,0x6a,0x20,0x57,0x37,0xfe,0x57,0x62,0x1b,0x43,0x2f,0xef,0x3c,0xe6,0x4a,
+    0xed,0xeb,0x50,0xb7,0xea,0x1b,0xd1,0xb7,0xaa,0x6f,0xe6,0xc9,0xf9,0xf8,0x97,0x76,
+    0x5e,0xb7,0x19,0xbf,0xb6,0xcc,0xb1,0xc8,0xc2,0x55,0x47,0xe6,0xa3,0xa2,0x43,0xb5,
+    0xe7,0x2a,0xd1,0x5b,0xdd,0xa8,0xef,0x5e,0x72,0x77,0x67,0x7c,0x22,0xf7,0x30,0xf5,
+    0x48,0xbe,0x02,0x33,0xaf,0x0f,0xa0,0x8b,0x19,0x7d,0x2f,0xd6,0x80,0xd6,0xd1,0x1b,
+    0x7b,0xd5,0x0f,0x64,0x7d,0xa9,0x3c,0xd8,0xd4,0x29,0xf2,0x93,0xee,0x39,0x9f,0x58,
+    0x28,0x0f,0x65,0xfd,0x68,0xbc,0xe7,0x8c,0xbf,0xc8,0x13,0x3c,0xbe,0x66,0x32,0x07,
+    0x52,0xdf,0x6b,0xcc,0x7f,0xae,0x89,0xff,0xba,0xc4,0x77,0x7f,0x2a,0xcf,0xf3,0xe6,
+    0x6b,0x35,0xeb,0x5a,0x78,0xda,0x6a,0x78,0x92,0x35,0xb3,0x95,0xb8,0x9f,0x93,0x73,
+    0x1b,0x3c,0x89,0xbc,0x1d,0xac,0xac,0x93,0x77,0xe0,0x97,0x88,0xfd,0x4e,0x72,0xec,
+    0xc0,0x7e,0x27,0xfb,0x69,0x88,0xfe,0x0b,0xbe,0x6d,0x5f,0x1c,0x35,0x75,0x89,0x9c,
+    0x15,0xc6,0xf7,0xdc,0x9a,0x4e,0x92,0x38,0xb2,0x0e,0x05,0x3b,0x8a,0x6d,0x7d,0xb7,
+    0x0e,0x12,0xe8,0x85,0x80,0xdc,0xa7,0x1c,0x92,0x4c,0x4e,0xe1,0x61,0x3f,0x7c,0xa8,
+    0x7c,0xc0,0x93,0x8f,0x19,0x59,0xd6,0xd1,0x59,0x4f,0x7f,0xce,0xd3,0x4b,0x81,0x56,
+    0x0e,0xc3,0x0b,0xed,0x93,0x3c,0x7d,0xcc,0xd3,0x17,0x47,0x6e,0xea,0xaa,0x14,0x0e,
+    0xbe,0x87,0x17,0xe9,0x99,0xc6,0x8c,0xfb,0x07,0x70,0xb1,0x91,0xf5,0xf3,0x23,0x6b,
+    0xae,0xc0,0xd8,0xfc,0x04,0xbe,0xd4,0xd9,0xc8,0x1a,0xf8,0x19,0x3f,0xc1,0x4f,0x3a,
+    0x26,0xf6,0xc1,0xc9,0x19,0x67,0x2f,0xba,0xbd,0xee,0xd9,0x07,0x3f,0x7b,0xa3,0x71,
+    0x85,0xd1,0xb7,0x60,0x37,0x38,0xfb,0xfd,0xd4,0x20,0xdf,0x07,0xf8,0x3e,0xed,0xf4,
+    0xbf,0xe0,0x23,0xef,0x13,0x2e,0xd6,0x21,0xf7,0x3e,0x4c,0x6c,0xd1,0x1f,0x41,0x7f,
+    0xc4,0xd4,0xf6,0x2b,0x3c,0x2f,0xa7,0xb6,0xdf,0xc0,0x8e,0x52,0x8f,0xc8,0x07,0xdd,
+    0x73,0x08,0xdf,0x83,0x86,0x8f,0xdf,0x8b,0xe0,0xe3,0x0f,0xf0,0x11,0xce,0x46,0xe4,
+    0x3f,0xc1,0x8e,0x1a,0x9b,0xe3,0xe4,0x7c,0x06,0x9b,0xbf,0xb0,0x3b,0xce,0x98,0x8e,
+    0x81,0xa9,0xfd,0xdf,0xcc,0xbd,0x72,0x7c,0x02,0x8e,0xe7,0x19,0x9b,0x93,0xe0,0xca,
+    0xf1,0x29,0xfc,0x4e,0xc2,0xf1,0x19,0xc3,0xf1,0xa9,0x88,0x8f,0x20,0xc2,0x64,0x4c,
+    0xa7,0xe1,0x47,0xc7,0x78,0xc6,0xc4,0xfd,0x87,0xdc,0x52,0xd7,0x39,0xe4,0x86,0x2e,
+    0x87,0xec,0x59,0xe7,0x39,0xe7,0xcf,0xa1,0x3f,0x0b,0xd6,0x98,0x3d,0x2d,0x21,0x8c,
+    0xf7,0xa8,0xe8,0xa4,0xf7,0x44,0x56,0xdf,0xc4,0x30,0x7e,0x46,0x09,0x2e,0x7a,0xe9,
+    0x55,0xc1,0x34,0x6f,0x72,0x58,0x98,0x57,0xfa,0x34,0x39,0x2c,0x8c,0x9b,0xc2,0xc5,
+    0x46,0x74,0x51,0xcf,0x46,0x71,0x63,0x91,0x5f,0x6a,0x28,0xfb,0x41,0xbc,0xb7,0x63,
+    0x26,0x5e,0xb1,0x30,0xbe,0xbe,0x3e,0x86,0xf3,0xb4,0x30,0x8e,0xa5,0x86,0x85,0x3d,
+    0x25,0x98,0xf0,0x70,0x18,0x1e,0x0e,0x1b,0x1e,0xd2,0xc3,0x0b,0xe7,0x2c,0x23,0x8c,
+    0x63,0xf3,0x4c,0x1f,0x66,0x84,0x17,0xf6,0xe1,0x21,0xe3,0x9f,0x49,0x7e,0xb1,0x95,
+    0x75,0x95,0x09,0x17,0xb2,0x27,0x94,0x08,0xe3,0x67,0xbc,0xe0,0xd2,0xeb,0x0d,0xdc,
+    0x53,0x9f,0x3c,0xe9,0xcc,0x9b,0x9c,0x29,0xd7,0x3a,0xdf,0x14,0xce,0x28,0xfd,0x4e,
+    0x23,0x57,0x86,0xc9,0x55,0x0d,0x1b,0xed,0x97,0x1a,0xf4,0x4b,0x75,0x63,0x53,0x13,
+    0x5c,0xfb,0xf4,0x2a,0xfc,0x6a,0x1a,0x9b,0x5a,0xc4,0x57,0x9b,0xda,0x60,0x79,0x86,
+    0x87,0xab,0xf1,0xad,0x6d,0xf2,0x5d,0x43,0xbe,0x3a,0x26,0x56,0x5d,0x70,0xf5,0xab,
+    0x87,0x6f,0xdd,0xa8,0xa7,0x12,0x22,0xd9,0x8e,0xbb,0x44,0x11,0xe3,0x2e,0x6e,0xbe,
+    0x33,0x19,0x77,0x96,0xd9,0xaf,0x1a,0xb0,0xff,0x69,0xce,0x86,0xf8,0x8c,0x26,0xe6,
+    0x75,0x60,0x79,0x66,0x4c,0xd7,0x83,0x37,0x62,0x6e,0x1a,0x80,0x69,0x8c,0xc6,0xc4,
+    0x95,0x1a,0x1b,0x9b,0x1a,0xb3,0xe9,0x7d,0xf9,0x2b,0x69,0xea,0x2a,0x45,0x5d,0x65,
+    0x4c,0x5d,0x4d,0xbc,0x7d,0xba,0x85,0x27,0x77,0xf2,0xe4,0xce,0x9e,0xdc,0xc5,0x93,
+    0xbb,0x7a,0x72,0x7f,0x4f,0x1e,0xe4,0xc9,0x23,0x3c,0x79,0x8c,0x27,0x4f,0xf3,0xe4,
+    0xe9,0x46,0x96,0x33,0x7a,0x96,0xa7,0x5f,0xe5,0x9d,0x33,0x1b,0x3c,0xde,0x9b,0xc2,
+    0x83,0xf6,0xc3,0x8d,0xf4,0x43,0x33,0x63,0xd3,0x1c,0x7c,0x24,0xf3,0x70,0x13,0x7e,
+    0xcd,0x99,0x87,0x26,0x60,0x6a,0xdf,0xd2,0x8b,0xd9,0xaa,0x88,0x98,0xad,0xc1,0x75,
+    0xbe,0x6f,0xc6,0xaf,0x35,0x31,0x5b,0x80,0xa9,0xfd,0x2d,0xcc,0x85,0xc6,0xbc,0x95,
+    0x98,0xf9,0xc6,0xa6,0x0d,0xb8,0xee,0xab,0xb7,0xe3,0xd7,0xc6,0xd8,0xdc,0x41,0x1c,
+    0x3d,0x43,0xda,0x81,0xc9,0x1d,0x6f,0x01,0xd8,0x9d,0xf8,0xb6,0x63,0x3f,0xee,0x60,
+    0xf6,0x63,0xd1,0xb5,0x77,0x4f,0x07,0x7a,0xa7,0x3d,0xfd,0xd6,0x11,0xb9,0x83,0xc9,
+    0x75,0x17,0xfd,0x24,0xe3,0xe9,0x8c,0xac,0xba,0xbb,0xa9,0x43,0x74,0x5d,0x90,0x75,
+    0x5f,0xbc,0x87,0xbd,0xa4,0x33,0xfd,0x24,0x36,0x9d,0xc0,0xd5,0xff,0x3e,0x7a,0x51,
+    0xe7,0xe4,0x7e,0xb0,0xbc,0x88,0xa3,0x58,0x74,0x9f,0x7c,0x90,0x3b,0x67,0x01,0x7a,
+    0xf5,0xed,0x89,0x4e,0xe2,0x76,0x45,0x56,0x5e,0x1f,0x82,0xd7,0x5e,0xc6,0xfe,0x61,
+    0xf0,0xc5,0xf0,0xd3,0x07,0xac,0x37,0xfc,0xf4,0x33,0xfc,0x88,0xae,0xaf,0x7b,0xa6,
+    0xc2,0x47,0x5f,0x13,0xe7,0x11,0xc6,0xbc,0x88,0x38,0x03,0xc0,0x84,0xfb,0x85,0xce,
+    0x42,0xee,0x8c,0x8f,0x82,0xd7,0xe1,0x7e,0x3b,0x04,0xdf,0xc7,0xd0,0x49,0xcd,0xfd,
+    0x91,0x35,0xee,0xe3,0x5e,0xdc,0x27,0xc0,0x6c,0xdc,0x21,0xe0,0x83,0xb9,0x17,0x6b,
+    0xdc,0xa7,0xd0,0x49,0xdc,0x41,0xc8,0xca,0xc5,0xd3,0x70,0x31,0xd4,0xe4,0x7a,0x06,
+    0x5c,0xb9,0x78,0x16,0x4c,0xb9,0x18,0x6e,0xb8,0x10,0xdd,0x30,0xf7,0x8c,0x82,0x8b,
+    0x61,0x26,0xce,0x48,0x6a,0xd6,0xbd,0xed,0x79,0xee,0xe3,0x23,0xa9,0x65,0x04,0x98,
+    0x9c,0x51,0xc3,0xf1,0x1f,0x65,0xfc,0x47,0x7b,0x63,0x7e,0x01,0xac,0x2d,0x75,0x8c,
+    0x33,0x75,0x88,0x6e,0xac,0x7b,0xc6,0x13,0x67,0x2c,0x39,0xc6,0x98,0xfb,0xd8,0x38,
+    0x74,0xe3,0x4d,0x8e,0x17,0xd9,0xaf,0x54,0x9e,0x48,0xce,0x61,0xd4,0x3c,0x89,0xdf,
+    0x0c,0x13,0xcd,0x38,0x5e,0xc2,0x6f,0x92,0x39,0x3f,0x26,0x83,0x4f,0x30,0x79,0x27,
+    0x7b,0x79,0xc7,0x99,0x3c,0x53,0xd8,0xf7,0x94,0x87,0x29,0x1e,0x0f,0xc3,0x91,0xfb,
+    0x21,0x4f,0x35,0xbe,0x2f,0xb3,0x2e,0xc4,0x77,0x1a,0xb2,0x7c,0x4f,0x67,0x6d,0xe8,
+    0x1a,0x9b,0xc1,0xb9,0x35,0x8d,0x3d,0x54,0x73,0xcd,0x30,0x3d,0x36,0xd3,0xc4,0x7d,
+    0x05,0x2e,0x94,0xef,0x57,0xc1,0x66,0xc2,0xf7,0x1c,0xc3,0xb7,0xe8,0x66,0xbb,0x67,
+    0x2e,0xf5,0xcd,0x26,0xe6,0x2c,0x7e,0x33,0x49,0xed,0x73,0xd0,0xcd,0x35,0x39,0xe6,
+    0x93,0xe3,0x23,0x97,0x43,0x7a,0xf6,0x0d,0xee,0x8d,0xf3,0xe1,0x3c,0x37,0xda,0xa3,
+    0x0a,0x71,0x8d,0xb9,0xc0,0x8b,0x39,0x87,0x98,0x62,0xff,0x26,0x67,0x82,0xf6,0xfb,
+    0x42,0x30,0xed,0xf7,0x85,0x1e,0x97,0xfd,0x4c,0x3d,0x8b,0xbc,0x3d,0x77,0x71,0x11,
+    0x7b,0xee,0x12,0x70,0xdd,0x73,0xdf,0xc2,0x6f,0x89,0xb1,0x59,0xea,0xf5,0xea,0x32,
+    0x30,0xbb,0xe7,0x2e,0xc7,0x77,0x19,0x7c,0xae,0x34,0x7c,0x8a,0x6e,0x85,0x7b,0xd6,
+    0x50,0xe3,0x0a,0x53,0xd3,0xdb,0xd4,0xb4,0xda,0xe4,0x7b,0x07,0x5c,0xc6,0xb8,0x0a,
+    0x59,0xc6,0xb8,0x12,0xff,0x35,0xc6,0xf6,0x5d,0xce,0x68,0x95,0xd7,0x72,0x06,0x7f,
+    0x48,0xef,0xbe,0x87,0xcd,0x5a,0x63,0xb3,0x8e,0x73,0xfb,0x13,0x6c,0xd6,0x63,0xb7,
+    0xce,0xe4,0x5c,0xef,0xe5,0x5c,0x69,0xfc,0xdf,0xe7,0x5c,0x1e,0xc2,0x1d,0xf9,0x03,
+    0x30,0xf1,0xdd,0x80,0xac,0xf7,0xe7,0x8d,0x9c,0xd9,0x72,0xc6,0x6c,0xf4,0xee,0x34,
+    0xe5,0xe0,0xa8,0x2c,0x77,0x9a,0x1c,0xfe,0x6f,0x27,0xf9,0x2e,0x36,0x31,0x36,0x81,
+    0x4b,0x8c,0x4d,0xde,0xdd,0xad,0x12,0x31,0xca,0x9b,0x7b,0x51,0x05,0x13,0xaf,0x22,
+    0xf1,0x2e,0x31,0x77,0x8a,0xcd,0xe6,0x0e,0x91,0x1d,0xf1,0x10,0xb7,0x1b,0x42,0xcf,
+    0x7d,0x0a,0xa6,0x3d,0xf7,0x19,0x98,0x8c,0x6f,0x33,0xb2,0x72,0xb1,0x85,0x78,0x52,
+    0xdb,0x16,0x53,0x5b,0x82,0xf9,0x5f,0x5a,0x65,0x53,0x5b,0x15,0xea,0xa9,0x6a,0x7e,
+    0xdb,0x7d,0x59,0xc4,0x6f,0xbb,0xaf,0xc0,0xb5,0x4f,0xbe,0xa6,0x4f,0x06,0x1b,0x9b,
+    0x6f,0xc0,0xf5,0x0c,0xdd,0x0d,0x66,0xef,0xcc,0xdf,0x12,0x6b,0xb7,0xf1,0xfb,0x8e,
+    0x3a,0xf4,0x9c,0xdd,0xc3,0xff,0x2c,0x0a,0xb0,0x97,0x71,0xee,0xc1,0x4e,0x7f,0x23,
+    0xfc,0x0b,0x37,0xe8,0x11,0x57,0x48,0x16,0x00,0x00
 };
 
 // Generated from:
@@ -162,6 +162,8 @@
 //     uint Sd;
 //     uint Ed;
 //
+//     uint srcEmulatedAlpha;
+//
 //     bool isSrcHDR;
 //     bool isSrcA2BGR10;
 // } params;
@@ -227,9 +229,7 @@
 //
 //     if(component >= params . Ns && component == 3)
 //     {
-//
-//         valueAsUint = floatBitsToUint(1.0);
-//
+//         valueAsUint = params . srcEmulatedAlpha;
 //     }
 //     else
 //     {
diff --git a/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000008.inc b/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000008.inc
index b198c2e..76b6199 100644
--- a/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000008.inc
+++ b/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000008.inc
@@ -10,129 +10,129 @@
 
 #pragma once
 constexpr uint8_t kConvertVertex_comp_00000008[] = {
-    0x1f,0x8b,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0xff,0x9d,0x98,0x79,0x94,0x96,0x73,
-    0x14,0xc7,0x9f,0xe7,0x7d,0xa7,0x99,0x31,0x6d,0x53,0xd3,0xcc,0xb4,0xcc,0xd4,0x4c,
-    0xd3,0x32,0x69,0xb4,0x19,0x83,0x4a,0x72,0x92,0x29,0xa2,0x48,0xa9,0x8e,0x50,0x62,
-    0x6c,0x31,0x4c,0xf6,0xa2,0xa8,0x49,0xa2,0x05,0xa1,0x44,0x64,0x69,0x47,0x44,0x64,
-    0xaf,0x49,0xe7,0x38,0x87,0xec,0x4b,0x3a,0xa7,0x44,0xb6,0xec,0x44,0xa9,0xe4,0x77,
-    0x9f,0xe7,0x73,0xeb,0xf6,0x33,0x7f,0x79,0xcf,0x79,0xce,0xfb,0xdc,0xef,0x5d,0x7f,
-    0xdf,0xdf,0xfd,0x2d,0xef,0x9b,0x4c,0x14,0xa5,0x05,0x41,0x18,0x64,0x04,0xe9,0x41,
-    0x71,0x18,0x44,0x9f,0x46,0x41,0x22,0x90,0xd7,0xba,0x41,0x6a,0xf4,0x5d,0x3e,0x60,
-    0xf0,0x80,0x4e,0x55,0xe3,0xc6,0x74,0x2a,0x3d,0xaa,0x8b,0xe8,0x1b,0x04,0xc9,0xc8,
-    0x4e,0x74,0x0d,0x9d,0x4d,0x1d,0xf7,0x9d,0xe2,0x9e,0xb1,0xa3,0x2e,0xbe,0x5c,0xf0,
-    0xed,0xee,0xc9,0x74,0x78,0x4a,0x14,0x2b,0x08,0x7a,0x63,0x2b,0x4f,0x3f,0x67,0xdd,
-    0x36,0x4e,0x13,0x14,0xf1,0xad,0x58,0x08,0x96,0x62,0xb0,0x04,0x58,0xba,0xc1,0x92,
-    0x60,0xf5,0x0c,0x96,0x02,0x96,0x69,0xb0,0x3a,0x60,0x4d,0x0c,0x96,0x0a,0xd6,0xd4,
-    0x60,0x69,0x60,0x79,0x06,0x4b,0x07,0x2b,0x30,0xd8,0x61,0x60,0x6d,0x0c,0x96,0x01,
-    0x56,0x6c,0xb0,0xba,0x60,0x25,0x06,0xab,0x07,0xd6,0xc5,0x60,0xf5,0xc1,0x4a,0x85,
-    0x63,0x37,0x2a,0x1d,0x6f,0xb9,0x1b,0xcd,0xf9,0xd4,0xaa,0x5c,0x8c,0xf1,0x38,0x13,
-    0xfb,0x31,0x70,0x21,0xf6,0x17,0xba,0xef,0xd6,0x07,0x74,0xb1,0x5c,0x08,0xa7,0x22,
-    0x6f,0xf1,0xe2,0x6d,0xad,0x25,0xde,0x56,0x13,0x6f,0x9b,0x17,0x6f,0x1b,0xf1,0x54,
-    0xde,0xce,0x38,0xf3,0x90,0xdb,0x87,0xb1,0xdc,0xcc,0x3d,0x59,0x6e,0x14,0x89,0xc8,
-    0x3e,0x19,0xc5,0x93,0xf7,0x6c,0x67,0x93,0x0a,0x9f,0x41,0xf4,0x9d,0x12,0xf1,0x9e,
-    0x46,0x5d,0x85,0xae,0xa6,0x74,0xde,0x15,0xcf,0x71,0xde,0x8d,0xf0,0x29,0x74,0xf6,
-    0x8d,0xe9,0xa7,0x34,0xfc,0x73,0x78,0x6f,0x84,0x3e,0x97,0xf7,0x1c,0xe2,0xb5,0x30,
-    0xf1,0x72,0xb0,0x29,0xa0,0x1e,0xc1,0x5a,0xba,0x6e,0xd1,0x9e,0xf8,0x3f,0x8f,0xd4,
-    0xd0,0x8e,0xbe,0x90,0x38,0x3d,0x90,0xdb,0x83,0xc9,0x98,0x8b,0xa9,0x5f,0xe6,0xa1,
-    0x23,0x72,0x07,0xe3,0x7f,0x38,0xb6,0xa9,0x46,0xdf,0x99,0xde,0x55,0xb9,0x94,0x9a,
-    0x3b,0xc2,0x61,0x4f,0xe6,0x51,0xe5,0x5e,0xf4,0xab,0xda,0xf7,0xf5,0xe4,0x81,0xd8,
-    0x37,0x71,0x51,0xce,0x30,0x7e,0x43,0x98,0x6f,0x91,0x85,0xb7,0x11,0xcc,0x4d,0xbe,
-    0x43,0xb5,0xff,0x5a,0xd2,0x67,0xe7,0x53,0xef,0x05,0xd4,0x32,0x86,0xf1,0x8a,0x7c,
-    0xa1,0xa9,0x4f,0xf2,0x55,0x98,0x39,0xbe,0x04,0x9d,0x1d,0xdf,0x58,0xd6,0x83,0xd6,
-    0x51,0x89,0xbd,0xea,0xaf,0x65,0x5d,0xa9,0x3c,0xc1,0xd4,0x29,0xf2,0x4d,0xee,0xd9,
-    0x9f,0x3c,0x28,0x4f,0x62,0x2d,0x69,0xbc,0xdb,0x8c,0xbf,0xc8,0x77,0x7b,0xfc,0x3d,
-    0xc6,0x9c,0x48,0x7d,0x4f,0xd0,0x0b,0xc5,0x26,0xfe,0x52,0x89,0xef,0x3e,0x2a,0x2f,
-    0x37,0xf3,0x27,0x3c,0xbd,0x1c,0x55,0x3b,0xf1,0x78,0x8d,0xb7,0xd1,0x9b,0xdf,0xf7,
-    0xd9,0x87,0x72,0x9d,0xfc,0x09,0x3d,0x99,0x80,0xd7,0x2d,0x86,0x57,0x59,0x6f,0x5b,
-    0xa8,0xe3,0x0b,0x6c,0xb6,0xc2,0xab,0xc8,0xdb,0xc0,0x24,0xce,0x97,0xf8,0x25,0xb1,
-    0xff,0x8a,0x9c,0x5f,0x62,0xff,0x15,0xfb,0x6e,0x88,0xfe,0x6b,0xde,0x2d,0xef,0xfb,
-    0x59,0xb3,0x5a,0x77,0xbb,0x30,0xde,0x9b,0x4b,0x9c,0x24,0x71,0x64,0x0d,0x0b,0xb6,
-    0x91,0x31,0x95,0xb9,0x2e,0x4c,0xd0,0x3b,0x01,0xb9,0x77,0x39,0xa4,0x0e,0x39,0x85,
-    0xb7,0xbf,0xe0,0x4f,0xe5,0x5d,0x9e,0x9c,0x0c,0x0f,0xca,0xb2,0x06,0x1b,0x87,0x87,
-    0xea,0xb3,0x3c,0x7d,0x8e,0x27,0xe7,0x7a,0xf6,0xcd,0x3d,0x7d,0x9e,0xa7,0x2f,0x42,
-    0x3e,0xc1,0x55,0x29,0x1c,0xfc,0x0c,0x2f,0xd2,0x63,0xc7,0x31,0xee,0x5f,0xc0,0xc5,
-    0x46,0xd6,0xdf,0xaf,0xac,0xd9,0x0a,0x63,0xf3,0x1b,0xf8,0x93,0xce,0x46,0xd6,0xcc,
-    0xef,0xf8,0xfd,0x16,0x8d,0x39,0x19,0xec,0x84,0x93,0xbf,0x9d,0xbd,0xe8,0xfe,0x70,
-    0xcf,0x4e,0xf8,0x91,0xf7,0x7d,0x8e,0x7d,0x79,0xdf,0x19,0xad,0xcf,0x64,0xc4,0x53,
-    0x25,0xef,0xbb,0x78,0xdf,0xed,0xf4,0xbb,0xf1,0x91,0xef,0x3f,0x5d,0xac,0x3d,0xee,
-    0x7b,0x2f,0xb1,0x45,0xbf,0x0f,0xfd,0x3e,0x53,0xdb,0x3f,0xf0,0xac,0xf5,0xcb,0x44,
-    0xb7,0x67,0x7e,0xd5,0x26,0xe4,0xc0,0x7d,0x9a,0xfa,0x13,0x61,0xec,0x27,0xb8,0xd4,
-    0x9c,0x88,0xbe,0x83,0x28,0x9f,0xc4,0xff,0xdb,0x70,0x96,0x12,0xfe,0x97,0xb3,0x3a,
-    0x61,0x8c,0x6b,0xce,0xd4,0x5a,0x72,0xa6,0x85,0x31,0x3e,0xd9,0xd9,0x88,0x9c,0x1e,
-    0xc6,0x7e,0x82,0xab,0xcd,0x61,0x61,0x5c,0xfb,0x44,0x6c,0x32,0xc2,0xd8,0x4e,0x70,
-    0xe1,0x46,0xfa,0x25,0xc3,0xd8,0xd7,0x0d,0xe3,0x1e,0xd2,0xbc,0xf5,0xc8,0xbb,0xdc,
-    0xe4,0xad,0x1f,0xc6,0xb8,0xce,0x55,0x83,0x30,0xf6,0x13,0x5c,0xe6,0x2a,0x33,0x3c,
-    0x38,0x57,0xa2,0x6b,0xe8,0x9e,0xcc,0x30,0x1e,0xb7,0xbc,0x0b,0xcf,0xca,0x43,0xa6,
-    0xc9,0xdd,0x84,0xdc,0x52,0x97,0xf4,0xa9,0xc8,0xc7,0xba,0x1c,0xb2,0x9e,0xb3,0xc3,
-    0xf8,0x5e,0x91,0x85,0x5e,0xfa,0x3a,0x1b,0x5f,0xd1,0x37,0x0d,0xe3,0x5e,0x17,0x9d,
-    0xf4,0x70,0x53,0xe3,0xdb,0x2c,0x8c,0xcf,0xc9,0x5c,0xf4,0xd2,0xf3,0xcd,0x4c,0xde,
-    0x16,0x26,0xaf,0xf4,0x7b,0x0b,0x13,0x37,0x3f,0x8c,0xd7,0x88,0xe8,0xa4,0xf7,0xf3,
-    0xa3,0xb8,0xa9,0xf1,0x9e,0x12,0xca,0xbe,0x12,0xaf,0x91,0x3c,0x13,0xaf,0x55,0x18,
-    0xaf,0xd3,0xf5,0x70,0x5e,0x10,0xc6,0x58,0xcb,0xf0,0x60,0x6f,0x16,0xc0,0xc3,0x5e,
-    0x78,0xd8,0x6b,0xf8,0x2d,0xf4,0xe6,0xac,0x75,0x18,0x63,0xcb,0x4d,0x3f,0xb7,0x0e,
-    0x0f,0xed,0xe7,0x3d,0xc6,0xbf,0x0d,0xf9,0xc5,0x56,0xd6,0x67,0x1b,0xb8,0x90,0xbd,
-    0xa5,0x6d,0x18,0xdf,0x33,0x04,0x97,0x35,0x73,0x8c,0x7b,0xca,0xc8,0x53,0x97,0x75,
-    0x20,0x67,0xd9,0xd1,0xce,0x37,0x8d,0xb3,0x52,0xdf,0x33,0xc8,0x55,0xcf,0xe6,0xc2,
-    0x46,0xfb,0xa5,0x23,0x6b,0xbb,0x83,0xb1,0x29,0x01,0xd7,0x3e,0x3d,0x02,0xbf,0x12,
-    0x63,0xd3,0x89,0xf8,0x1a,0xa7,0x0b,0x71,0x3a,0x1b,0x9b,0xae,0xe0,0x1a,0xa7,0x1b,
-    0x7e,0x5d,0x0d,0x57,0x47,0x12,0xbf,0x9b,0x89,0x75,0x14,0xb1,0x4a,0x4d,0xac,0x32,
-    0x70,0xf5,0x3b,0x1a,0xdf,0xb2,0x68,0xbd,0x27,0x22,0xd9,0x72,0xd3,0xb0,0x16,0x6e,
-    0xea,0x9b,0xf7,0x06,0xda,0xcf,0x66,0x6f,0xec,0xce,0xde,0xac,0x39,0x7b,0xe0,0x33,
-    0x8d,0x98,0xc7,0x81,0xf5,0x34,0x63,0x3a,0x1e,0xbc,0x17,0xf3,0xd7,0xfd,0x00,0x16,
-    0xc7,0xe8,0x4d,0x5c,0xa9,0xb1,0xb7,0xa9,0xb1,0x11,0xf7,0x6e,0xf9,0x34,0x36,0x75,
-    0x65,0x51,0x57,0xb6,0xa9,0xab,0x8f,0x77,0x66,0xf4,0xf7,0xe4,0xb3,0x3d,0x79,0xa4,
-    0x27,0x9f,0xeb,0xc9,0xa3,0x3d,0x79,0x9c,0x27,0xdf,0xe0,0xc9,0x53,0x3d,0x79,0x86,
-    0x27,0xcf,0xf3,0xe4,0xf9,0x46,0x96,0xfb,0xc3,0x22,0x4f,0xff,0x52,0x70,0xe8,0x19,
-    0x55,0xe3,0xf1,0x7e,0x22,0x3c,0x68,0x3f,0x9c,0x44,0x3f,0xf4,0x35,0x36,0xe5,0xe0,
-    0xd5,0xcc,0x43,0x3f,0xfc,0xca,0x99,0x87,0x3e,0x60,0x6a,0x7f,0xb2,0x17,0xf3,0x94,
-    0x5a,0x62,0x0e,0x00,0xd7,0xf9,0x3e,0x15,0xbf,0x01,0xc4,0xec,0x0f,0xa6,0xf6,0xa7,
-    0x31,0x17,0x1a,0x73,0x10,0x31,0x07,0x1a,0x9b,0xd3,0xc1,0x75,0xef,0x1d,0x8c,0xdf,
-    0xe9,0xc6,0xe6,0x4c,0xe2,0xe8,0x59,0x34,0x14,0x6c,0x48,0xc4,0x5d,0x8c,0x9d,0x85,
-    0xef,0x50,0xce,0xd7,0xe1,0xe6,0x7c,0x15,0xdd,0x30,0xf7,0x0c,0xa7,0x77,0x86,0xd1,
-    0x6f,0x23,0x90,0x87,0x9b,0x5c,0xe7,0xd0,0x4f,0x32,0x9e,0x91,0xc8,0xaa,0x3b,0x8f,
-    0x3a,0x44,0x77,0x2e,0xb2,0xee,0x9d,0xa3,0xd8,0x6f,0x46,0xd2,0x4f,0x62,0x73,0x36,
-    0xb8,0xfa,0x5f,0x44,0x2f,0xea,0x9c,0x5c,0x0c,0xd6,0x33,0xe2,0x28,0x35,0xba,0xeb,
-    0x5e,0xca,0x7d,0xb8,0x02,0xbd,0xfa,0x5e,0x86,0x4e,0xe2,0x8e,0x46,0x56,0x5e,0x2f,
-    0x87,0xd7,0xb1,0xc6,0xfe,0x0a,0xf0,0x65,0xf0,0x73,0x25,0x58,0x25,0xfc,0x54,0x19,
-    0x7e,0x44,0x77,0x95,0x7b,0xe6,0xc2,0xc7,0x55,0x26,0xce,0xd5,0x8c,0x79,0x29,0x71,
-    0xae,0x01,0x13,0xee,0x97,0x38,0x0b,0xb9,0x17,0x5e,0x07,0x5e,0xca,0xdd,0x7b,0x3c,
-    0xbe,0xd7,0xa3,0x93,0x9a,0xc7,0x21,0x6b,0xdc,0x1b,0xbd,0xb8,0xe3,0xc1,0x6c,0xdc,
-    0x9b,0xc1,0x27,0x70,0x67,0xd7,0xb8,0x13,0xd1,0x49,0xdc,0x1b,0x90,0x95,0x8b,0x5b,
-    0xe0,0x62,0x92,0xc9,0x75,0x2b,0xb8,0x72,0x31,0x19,0x4c,0xb9,0xa8,0x36,0x5c,0x88,
-    0x6e,0x8a,0x7b,0xa6,0xc3,0xc5,0x14,0x13,0x67,0x1a,0x35,0xeb,0xde,0x76,0x3b,0xbf,
-    0x15,0xa6,0x51,0xcb,0x54,0x30,0x39,0xc7,0xaa,0xf1,0x9f,0x6e,0xfc,0xef,0xf0,0xc6,
-    0x7c,0x27,0xd8,0x10,0xea,0x98,0x65,0xea,0x10,0xdd,0x4c,0xf7,0xcc,0x26,0xce,0x4c,
-    0x72,0xcc,0x30,0x77,0xbf,0x59,0xe8,0x66,0x9b,0x1c,0x77,0xb1,0x5f,0xa9,0x7c,0x0f,
-    0x39,0x6f,0xa1,0xe6,0x39,0xfc,0x9e,0xb9,0xc7,0x8c,0xe3,0x5e,0xfc,0xe6,0x98,0xf3,
-    0xe3,0x3e,0xf0,0xbb,0x4d,0xde,0xfb,0xbc,0xbc,0xb3,0x4c,0x9e,0xfb,0xd9,0xf7,0x94,
-    0x87,0xfb,0x3d,0x1e,0xaa,0x91,0xab,0x90,0xe7,0x1a,0xdf,0x07,0x58,0x17,0xe2,0x3b,
-    0x0f,0x59,0xe7,0xf3,0xc1,0x5a,0xce,0xcd,0x87,0xc0,0xc5,0x7e,0x3e,0xb2,0xae,0xc3,
-    0x05,0x9c,0x6d,0xf3,0xd8,0x67,0xb5,0x9e,0x05,0x26,0xe6,0xc3,0xb5,0xc4,0x7c,0x04,
-    0x5c,0x39,0x59,0x08,0xd6,0xcb,0xf4,0xef,0x42,0x63,0xff,0x28,0x3c,0xeb,0x5c,0x3e,
-    0x0e,0xf6,0x18,0x73,0xb9,0xc4,0xcc,0xa5,0xe8,0x16,0x47,0xfd,0x17,0x8f,0x7d,0x31,
-    0x31,0x17,0xf1,0x5b,0x51,0x78,0x59,0x82,0x6e,0x99,0xc9,0xb1,0x82,0x1c,0x35,0x2e,
-    0x47,0x71,0xb4,0x47,0xc6,0x77,0xa6,0x15,0xcc,0xa7,0x60,0x4f,0x19,0x5c,0x63,0x3e,
-    0xe5,0xc5,0x5c,0x42,0xcc,0xe2,0x68,0x0f,0x8d,0xcf,0x1b,0x5d,0x4b,0x2b,0xc1,0x74,
-    0x2d,0xad,0xf4,0xe6,0xa9,0xca,0xd4,0xf3,0x8c,0xb7,0x9f,0x3f,0x5b,0xcb,0x7e,0xbe,
-    0x0a,0x5c,0xf7,0xf3,0xe7,0xf0,0x5b,0x65,0x6c,0x9e,0xf7,0xd6,0xc1,0x6a,0x30,0xbb,
-    0x9f,0xbf,0x80,0xef,0x6a,0xf8,0x5c,0x63,0xf8,0x14,0xdd,0x8b,0xee,0x79,0x95,0x1a,
-    0x5f,0x34,0xe3,0x79,0x85,0xdf,0xd7,0x32,0x9e,0x97,0x90,0x65,0x3c,0x6b,0xb0,0x7d,
-    0xd5,0xd4,0xf1,0x1a,0x67,0xbd,0xca,0xaf,0x73,0x96,0xaf,0xa5,0x07,0xde,0xc0,0xe6,
-    0x75,0x63,0xb3,0x96,0xf3,0x7f,0x03,0x36,0xeb,0xb0,0x5b,0x6b,0x72,0xae,0xf3,0x72,
-    0xae,0x31,0xfe,0xeb,0x39,0xdf,0xc7,0x73,0x1f,0x7f,0x13,0x4c,0x7c,0x6b,0x90,0xf5,
-    0xae,0xbe,0x81,0xb3,0x5f,0xce,0xaa,0x0d,0xde,0xdd,0xa8,0x19,0x7c,0xe4,0x72,0x37,
-    0xca,0xe1,0x3f,0x49,0xc9,0xd7,0xdc,0xc4,0x78,0x0b,0x5c,0x62,0xbc,0xe5,0xdd,0x01,
-    0x5b,0x12,0xa3,0x85,0xb9,0x5f,0xe5,0x99,0x78,0xf9,0xc4,0x6b,0x65,0xee,0x26,0x6f,
-    0x7b,0x77,0x95,0x8f,0xbc,0xbb,0xc9,0x3b,0xc4,0x50,0x7e,0xde,0x05,0xdb,0x68,0xe6,
-    0xfb,0x3d,0xf0,0x4a,0xb3,0xd7,0x7f,0x00,0x5e,0xc1,0xff,0x1f,0x3a,0x9f,0x1f,0xa2,
-    0x13,0x7e,0xde,0x46,0xd6,0xb1,0x7d,0x4c,0x8d,0x83,0x5c,0x5c,0xf9,0x9f,0xe4,0x53,
-    0xb0,0x11,0xd1,0xff,0x43,0xf1,0x7e,0xf0,0x19,0xff,0x63,0x74,0x47,0xaf,0x75,0x6e,
-    0x62,0x2c,0x35,0xd4,0xf9,0x39,0xb6,0x9b,0xc8,0xf5,0x11,0x98,0xda,0x6f,0x66,0xac,
-    0xc2,0xe3,0x66,0xc3,0x63,0xc2,0xfc,0xcf,0x59,0x60,0x78,0x2c,0x84,0xbb,0x22,0xf3,
-    0xbb,0xf8,0x9b,0x5a,0xfe,0x4b,0xf8,0x16,0x5c,0xd7,0xd4,0x77,0xac,0xa9,0x09,0xc6,
-    0xe6,0x7b,0x70,0xbd,0x37,0xec,0x00,0xeb,0x69,0xf6,0xeb,0x1f,0x88,0xb5,0xc3,0xf8,
-    0xfd,0x48,0x1d,0x7a,0xb7,0xf8,0x89,0xff,0x84,0x2a,0xb0,0x97,0x71,0xfe,0x84,0x9d,
-    0xfe,0x76,0xfa,0x17,0x1c,0xf6,0xb4,0x8a,0xd0,0x17,0x00,0x00
+    0x1f,0x8b,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0xff,0x9d,0x98,0x79,0x94,0x8f,0x65,
+    0x14,0xc7,0xdf,0x67,0x76,0xfb,0x4c,0x18,0xdb,0x18,0xc6,0x58,0x46,0x64,0x6b,0x42,
+    0xb6,0x74,0x24,0x2d,0x0a,0x15,0xc5,0x21,0x91,0x4c,0x2a,0xa5,0x68,0x13,0x85,0x2c,
+    0x49,0x8b,0xa2,0x4d,0xbb,0x94,0x6c,0x69,0x51,0xb2,0x94,0x6c,0xe5,0x1c,0xe7,0x48,
+    0x9b,0x16,0x39,0x87,0xd0,0x5e,0x5a,0x95,0xbd,0xe7,0xbe,0xef,0xe7,0x36,0xd7,0xd3,
+    0xfc,0xd5,0xef,0x9c,0xf7,0xfc,0xde,0xfb,0xbd,0xeb,0xf3,0x7d,0xee,0xb3,0xfc,0x7e,
+    0xa9,0x29,0x85,0x99,0x51,0xe4,0xa2,0xf2,0x51,0x56,0xd4,0xd4,0x45,0xf1,0x27,0x27,
+    0x4a,0x89,0xe4,0xb5,0x42,0x94,0x11,0x7f,0xf7,0xe8,0x79,0x61,0xcf,0x16,0xa3,0xc7,
+    0x0c,0x6b,0x51,0x7c,0x4a,0x2b,0xd1,0x57,0x8e,0x52,0x63,0x3b,0xd1,0x55,0xf1,0x36,
+    0xe9,0xfe,0x3b,0xcd,0x3f,0x23,0x87,0x8c,0xb8,0x56,0xf0,0xaf,0xfd,0x93,0xed,0xf1,
+    0xb4,0x38,0x56,0x14,0x75,0xc5,0x56,0x9e,0xb3,0xbc,0x75,0xa3,0x24,0x4d,0x54,0xc8,
+    0xb7,0x62,0x0e,0x2c,0xcd,0x60,0x29,0x60,0x59,0x06,0x4b,0x05,0xab,0x68,0xb0,0x34,
+    0xb0,0x6c,0x83,0xa5,0x83,0x55,0x33,0x58,0x06,0x58,0x4d,0x83,0x65,0x82,0xe5,0x19,
+    0x2c,0x0b,0xac,0xbe,0xc1,0xca,0x81,0x35,0x34,0x58,0x79,0xb0,0x22,0x83,0x55,0x00,
+    0x6b,0x6e,0xb0,0x8a,0x60,0xad,0x0c,0x56,0x09,0xac,0xd8,0x60,0x95,0xc1,0xda,0x0b,
+    0xef,0x7e,0xa4,0xca,0x41,0x0f,0x3f,0xc2,0xcb,0xa9,0x5f,0xf9,0x19,0x16,0xf0,0x28,
+    0xf6,0xc3,0xe0,0x47,0xec,0x87,0xfb,0xef,0x06,0xff,0xea,0x12,0xb9,0x00,0x9e,0x45,
+    0xde,0x19,0xc4,0xdb,0x55,0x46,0xbc,0x5d,0x26,0xde,0xee,0x20,0xde,0x6e,0xe2,0xa9,
+    0xfc,0x35,0x63,0xcf,0x43,0x2e,0x72,0x89,0x5c,0xcb,0x3f,0x55,0xfd,0x28,0x52,0x62,
+    0xfb,0xd4,0x38,0x9e,0xbc,0x57,0xf7,0x36,0x19,0x70,0x1c,0xc5,0xdf,0x69,0xf1,0x5c,
+    0x64,0x52,0x57,0x81,0xaf,0x29,0x8b,0x77,0xc5,0x73,0xbd,0x77,0x0e,0x3e,0x05,0xde,
+    0xfe,0x04,0x7a,0x2c,0x13,0xff,0x5c,0xde,0x73,0xd0,0xd7,0xe0,0x3d,0x97,0x78,0x75,
+    0x4c,0xbc,0x5c,0x6c,0xea,0x53,0x8f,0x60,0xf9,0xde,0x5a,0xfb,0xe4,0xff,0x3e,0x52,
+    0x47,0x63,0xfa,0x45,0x62,0x75,0x44,0x6e,0x02,0x26,0xe3,0x2e,0x62,0x0c,0x32,0x17,
+    0xcd,0x90,0x9b,0x1a,0xff,0x13,0xb1,0xcd,0x30,0xfa,0x96,0xf4,0xb4,0xca,0xc5,0xd4,
+    0xdd,0x0c,0x1e,0x3b,0x31,0x97,0x2a,0x77,0xa1,0x8f,0xd5,0xbe,0x7b,0x20,0xf7,0xc2,
+    0xbe,0x9a,0x8f,0x72,0x81,0xf1,0xeb,0xcb,0x9c,0x8b,0x2c,0xdc,0x0d,0x60,0x7e,0xea,
+    0x7a,0x54,0x7b,0x30,0x9f,0x5e,0xbb,0x9c,0x7a,0xaf,0xa0,0x96,0x61,0x8c,0x57,0xe4,
+    0xe1,0xa6,0x3e,0xc9,0x57,0x62,0xe6,0xf9,0x2a,0x74,0x76,0x7c,0x23,0x59,0x13,0x5a,
+    0xc7,0x28,0xec,0x55,0x7f,0x33,0xeb,0x4d,0xe5,0xf1,0xa6,0x4e,0x91,0x6f,0xf7,0xcf,
+    0xb1,0xd4,0x52,0x79,0x22,0xeb,0x49,0xe3,0xdd,0x65,0xfc,0x45,0x9e,0x15,0xf0,0x37,
+    0x8f,0x39,0x91,0xfa,0x5e,0xa0,0x1f,0x8a,0x4c,0xfc,0x85,0x12,0xdf,0x7f,0x54,0x5e,
+    0x1c,0xcc,0xdf,0x6a,0xd6,0xb9,0xc6,0xdb,0x1a,0xe8,0x3f,0x62,0x7f,0xaa,0xe1,0xe5,
+    0xcf,0xe8,0xcb,0x14,0x78,0xdd,0x69,0x78,0x95,0x35,0xb7,0x93,0x3a,0xbe,0xc2,0x66,
+    0x17,0xbc,0x8a,0xbc,0x1b,0x4c,0xe2,0xec,0xc1,0x2f,0x15,0xfb,0xbd,0xe4,0xdc,0x83,
+    0xfd,0x5e,0xf6,0x63,0x87,0xfe,0x1b,0xde,0x2d,0xef,0x11,0xeb,0x54,0xeb,0x6e,0xe2,
+    0x92,0x3d,0xbb,0xb9,0x97,0x24,0x8e,0xac,0x63,0xc1,0xb6,0x32,0xa6,0xb6,0xbe,0x0b,
+    0x53,0xe8,0x9d,0x88,0xdc,0x7f,0x7b,0x24,0x9d,0x9c,0x99,0xb1,0x9c,0xf0,0xa7,0xf2,
+    0x81,0x40,0x4e,0x73,0xa5,0xb2,0xac,0xc3,0xaa,0xee,0x78,0x7d,0xb5,0x40,0x5f,0x23,
+    0x90,0x6b,0x06,0xf6,0x75,0x02,0x7d,0xdd,0x40,0xdf,0x10,0xf9,0x74,0x5f,0xa5,0x70,
+    0xf0,0x0b,0xbc,0x48,0x8f,0x75,0x66,0xdc,0xbf,0x82,0x8b,0x8d,0xac,0xbf,0xdf,0x58,
+    0xb3,0x25,0xc6,0xe6,0x77,0xf0,0x97,0xbc,0x8d,0xac,0x99,0x3f,0xf0,0x13,0xfc,0x2f,
+    0xcf,0xc4,0x7e,0x38,0x39,0xe8,0xed,0x45,0xf7,0xa7,0x7f,0xf6,0xc3,0x8f,0xbc,0x1f,
+    0xf1,0x64,0xcb,0xfb,0xfe,0x78,0x7d,0xa6,0xc6,0x3c,0x8d,0xe2,0xfd,0x00,0xef,0x07,
+    0xbc,0xfe,0x20,0x3e,0x07,0x63,0xff,0xb4,0xe8,0x70,0xec,0x9b,0x7c,0x44,0x7f,0x14,
+    0xfd,0x51,0x53,0xdb,0x31,0x78,0xd6,0xfa,0x9d,0x4b,0xea,0x97,0xf9,0x55,0x9b,0x14,
+    0x97,0xe0,0x2f,0x53,0x7f,0xaa,0x4b,0xfc,0x04,0x97,0x9a,0x45,0x3e,0xe4,0xe5,0xc3,
+    0xc4,0x3f,0x64,0x38,0x4b,0x77,0xff,0xe5,0x2c,0xc3,0x25,0xb8,0xe6,0xcc,0x2c,0x23,
+    0x67,0x96,0x4b,0xf0,0xc9,0xde,0x46,0xe4,0x72,0x2e,0xf1,0xcb,0x32,0x36,0xe5,0x5d,
+    0x52,0xfb,0x04,0x6c,0x2a,0xb8,0xc4,0x4e,0x70,0xe1,0x46,0xfa,0xa5,0x82,0xb1,0xaf,
+    0xe8,0x92,0x1e,0xd2,0xbc,0x95,0xc8,0xbb,0xd8,0xd4,0x56,0xd9,0x25,0xb8,0xce,0x55,
+    0x15,0x97,0xf8,0x09,0x2e,0x73,0x95,0xe3,0x4a,0xe7,0x4a,0x74,0xd9,0xfe,0x11,0x4c,
+    0xc6,0x9d,0xed,0x12,0x9e,0x95,0x87,0x1c,0x93,0xbb,0x3a,0xb9,0xa5,0x2e,0xe9,0x53,
+    0x91,0x4f,0xf5,0x39,0xe2,0x73,0xc6,0x25,0xf7,0x8d,0x6a,0xe8,0xa5,0xaf,0x73,0xf1,
+    0x15,0x7d,0x2d,0x97,0xf4,0xba,0xe8,0xa4,0x87,0x6b,0x19,0xdf,0xda,0x2e,0x39,0x2b,
+    0x6b,0xa2,0x97,0x9e,0xaf,0x6d,0xf2,0xe6,0x99,0xbc,0xd2,0xef,0x79,0x26,0x6e,0xbe,
+    0x4b,0xd6,0x88,0xe8,0xa4,0xf7,0xf3,0xe3,0xb8,0x19,0xb1,0x5f,0x3d,0x91,0x59,0x23,
+    0x75,0x4d,0xbc,0xfa,0x2e,0x59,0xa7,0x1b,0xe1,0xbc,0xc0,0x25,0x58,0x3d,0x57,0xda,
+    0x9b,0x05,0xf0,0x70,0x04,0x1e,0x8e,0x18,0x7e,0x1b,0x04,0x73,0x56,0xe8,0x12,0x6c,
+    0xb1,0xe9,0xe7,0x42,0x77,0x7c,0x3f,0x1f,0x36,0xfe,0x8d,0xc8,0x2f,0xb6,0xb2,0x3e,
+    0x1b,0xc1,0x85,0xec,0x2d,0x8d,0x5d,0x72,0xd7,0x10,0x5c,0xd6,0x4c,0x7b,0xff,0xb4,
+    0xd5,0xde,0x60,0x1d,0xc8,0x59,0xd6,0xce,0xfb,0x66,0x72,0x56,0xea,0x7b,0x79,0x72,
+    0x55,0x34,0xb9,0x1a,0x62,0xa3,0xfd,0xd2,0x8c,0xb5,0xdd,0xd4,0xd8,0x34,0x07,0xd7,
+    0x3e,0x3d,0x09,0xbf,0xe6,0xc6,0xa6,0x05,0xf1,0x35,0x4e,0x2b,0xe2,0xb4,0x34,0x36,
+    0xad,0xc1,0x35,0x4e,0x1b,0xfc,0x5a,0x1b,0xae,0x4e,0x26,0x7e,0x1b,0x13,0xeb,0x14,
+    0x62,0x15,0x9b,0x58,0x6d,0xc1,0xd5,0xaf,0x1d,0xbe,0x82,0x1f,0xf5,0x63,0x6c,0x17,
+    0xdf,0x15,0x4b,0xb9,0xa9,0x52,0x06,0x37,0x95,0xcc,0x7b,0x65,0xb8,0xc9,0x36,0x7b,
+    0x63,0x07,0xf6,0x66,0xcd,0xd9,0x11,0x9f,0xe9,0xc4,0xec,0x0c,0xd6,0xc9,0x8c,0xe9,
+    0x34,0xf0,0x2e,0xcc,0x5f,0x87,0x7f,0xb1,0x24,0x46,0x57,0xe2,0x4a,0x8d,0x5d,0x4d,
+    0x8d,0x39,0xdc,0xc7,0xe5,0x73,0x82,0xa9,0xab,0x2a,0x75,0x55,0x37,0x75,0x75,0x0b,
+    0xce,0x8c,0xb3,0x03,0x79,0x60,0x20,0x0f,0x0a,0xe4,0xc1,0x81,0x3c,0x34,0x90,0xc7,
+    0x04,0xf2,0xd8,0x40,0x9e,0x16,0xc8,0xf7,0x05,0xf2,0x9c,0x40,0x7e,0xc2,0xc8,0x72,
+    0x7f,0x98,0x1f,0xe8,0x57,0x45,0xc7,0x9f,0x51,0x1b,0x03,0xde,0xcf,0x80,0x07,0xed,
+    0x87,0x33,0xe9,0x87,0xee,0xc6,0xa6,0x07,0xf8,0x54,0xe6,0xe1,0x2c,0xfc,0x7a,0x30,
+    0x0f,0xdd,0xc0,0xd4,0xfe,0x9c,0x20,0xe6,0xb9,0x65,0xc4,0xec,0x09,0xae,0xf3,0x7d,
+    0x1e,0x7e,0x3d,0x89,0x79,0x36,0x98,0xda,0x9f,0xcf,0x5c,0x68,0xcc,0xde,0xc4,0xec,
+    0x65,0x6c,0xfa,0x80,0xeb,0xde,0x7b,0x21,0x7e,0x7d,0x8c,0xcd,0x45,0xc4,0xd1,0xb3,
+    0xa8,0x1f,0x58,0xdf,0x98,0xbb,0x04,0xbb,0x18,0xdf,0x7e,0x9c,0xaf,0xfd,0xcd,0xf9,
+    0x2a,0xba,0x4b,0xfc,0xd3,0x9f,0xde,0xb9,0x84,0x7e,0x1b,0x80,0xdc,0xdf,0xe4,0xba,
+    0x94,0x7e,0x92,0xf1,0x0c,0x42,0x56,0xdd,0x65,0xd4,0x21,0xba,0xc1,0xc8,0xba,0x77,
+    0x0e,0x61,0xbf,0x19,0x44,0x3f,0x89,0xcd,0x40,0x70,0xf5,0xbf,0x92,0x5e,0xd4,0x39,
+    0x19,0x01,0xd6,0x29,0xe6,0x28,0x23,0xbe,0xeb,0x5e,0xcd,0x7d,0xb8,0x04,0xbd,0xfa,
+    0x5e,0x83,0x4e,0xe2,0x0e,0x45,0x56,0x5e,0xaf,0x85,0xd7,0x91,0xc6,0xfe,0x3a,0xf0,
+    0x45,0xf0,0x73,0x3d,0xd8,0x28,0xf8,0x19,0x6d,0xf8,0x11,0xdd,0x0d,0xfe,0x79,0x0c,
+    0x3e,0x6e,0x30,0x71,0x6e,0x64,0xcc,0x0b,0x89,0x73,0x13,0x98,0x70,0xbf,0xc0,0x5b,
+    0xc8,0xbd,0xf0,0x16,0xf0,0x62,0xee,0xde,0xe3,0xf0,0xbd,0x15,0x9d,0xd4,0x3c,0x06,
+    0x59,0xe3,0xde,0x16,0xc4,0x1d,0x07,0x66,0xe3,0xde,0x01,0x3e,0x9e,0x3b,0xbb,0xc6,
+    0x9d,0x80,0x4e,0xe2,0x8e,0x45,0x56,0x2e,0x26,0xc1,0xc5,0x44,0x93,0xeb,0x4e,0x70,
+    0xe5,0x62,0x32,0x98,0x72,0x31,0xd5,0x70,0x21,0xba,0x29,0xfe,0x99,0x01,0x17,0x53,
+    0x4c,0x9c,0xe9,0xd4,0xac,0x7b,0xdb,0xdd,0xfc,0x56,0x98,0x4e,0x2d,0xd3,0xc0,0xe4,
+    0x1c,0x9b,0x8a,0xff,0x0c,0xe3,0x7f,0x4f,0x30,0xe6,0x7b,0xc1,0xfa,0x52,0xc7,0x4c,
+    0x53,0x87,0xe8,0xee,0xf7,0xcf,0x03,0xc4,0xb9,0x9f,0x1c,0xf7,0x99,0xbb,0xdf,0x4c,
+    0x74,0x0f,0x98,0x1c,0x0f,0xb2,0x5f,0xa9,0x3c,0x9b,0x9c,0x93,0xa8,0xf9,0x21,0x7e,
+    0xcf,0xcc,0x36,0xe3,0x78,0x18,0xbf,0x87,0xcc,0xf9,0xf1,0x08,0xf8,0x2c,0x93,0xf7,
+    0x91,0x20,0xef,0x4c,0x93,0xe7,0x51,0xf6,0x3d,0xe5,0xe1,0xd1,0x80,0x87,0xa9,0xc8,
+    0xa3,0x91,0x1f,0x33,0xbe,0x8f,0xb3,0x2e,0xc4,0x77,0x0e,0xb2,0xce,0xe7,0x93,0x65,
+    0x9c,0x9b,0x4f,0x81,0x8b,0xfd,0x13,0xc8,0xba,0x0e,0x9f,0xe6,0x6c,0x9b,0xc3,0x3e,
+    0xab,0xf5,0x3c,0x6d,0x62,0x3e,0x53,0x46,0xcc,0x67,0xc1,0x95,0x93,0xb9,0x60,0x5d,
+    0x4c,0xff,0xce,0x35,0xf6,0xcf,0xc1,0xb3,0xce,0xe5,0xf3,0x60,0xf3,0x98,0xcb,0x05,
+    0x66,0x2e,0x45,0xf7,0x62,0xdc,0x7f,0xc9,0xd8,0x5f,0x24,0xe6,0x7c,0x7e,0x2b,0x0a,
+    0x2f,0x0b,0xd0,0x2d,0x32,0x39,0x96,0x90,0x63,0x83,0xcf,0x51,0x14,0xef,0x91,0xc9,
+    0x9d,0x69,0x09,0xf3,0x29,0xd8,0x52,0x83,0x6b,0xcc,0xa5,0x41,0xcc,0x05,0xc4,0x2c,
+    0x8a,0xf7,0xd0,0xe4,0xbc,0xd1,0xb5,0xf4,0x0a,0x98,0xae,0xa5,0x57,0x82,0x79,0x1a,
+    0x6d,0xea,0x79,0x35,0xd8,0xcf,0x5f,0x2b,0x63,0x3f,0x5f,0x06,0xae,0xfb,0xf9,0xeb,
+    0xf8,0x2d,0x33,0x36,0x6f,0x04,0xeb,0x60,0x39,0x98,0xdd,0xcf,0xdf,0xc4,0x77,0x39,
+    0x7c,0xae,0x34,0x7c,0x8a,0x6e,0x85,0x7f,0xd6,0x50,0xe3,0x0a,0x53,0xd3,0x5b,0xd4,
+    0xb4,0xda,0xe4,0x7b,0x1b,0x5c,0xc6,0xb8,0x0a,0x59,0xc6,0xb8,0x12,0xff,0x35,0xc6,
+    0xf6,0x1d,0xce,0x7f,0x95,0xd7,0x72,0xbe,0xaf,0xa3,0x2f,0xd6,0x61,0xb3,0xd6,0xd8,
+    0xac,0xe7,0x4e,0xf0,0x1e,0x36,0x1b,0xb0,0x5b,0x6f,0x72,0x6e,0x08,0x72,0xae,0x34,
+    0xfe,0xef,0x72,0xe6,0x8f,0xe3,0x8e,0xfe,0x1e,0x98,0xf8,0x6e,0x44,0xd6,0xfb,0xfb,
+    0x26,0xee,0x03,0x72,0x7e,0x6d,0x0a,0xee,0x4b,0xb5,0xe0,0xa8,0x06,0xf7,0xa5,0x5c,
+    0xfe,0xbf,0x94,0x7c,0xb5,0x4d,0x8c,0xcd,0xe0,0x12,0x63,0x73,0x70,0x2f,0xcc,0x27,
+    0x46,0x1d,0x73,0xe7,0xca,0x33,0xf1,0xea,0x12,0xaf,0x9e,0xb9,0xaf,0x6c,0x09,0xee,
+    0x2f,0xdb,0x82,0xfb,0xca,0xfb,0xc4,0x50,0x7e,0x3e,0x00,0xdb,0x6a,0x7a,0xe0,0x43,
+    0xf0,0x51,0x66,0xff,0xff,0x18,0xbc,0x84,0xff,0x44,0xb4,0x67,0x3f,0x41,0x27,0xfc,
+    0x6c,0x41,0xd6,0xb1,0x7d,0x4a,0x8d,0xbd,0x7d,0x5c,0xf9,0xef,0xe4,0x73,0xb0,0x01,
+    0xf1,0x7f,0x2e,0xc9,0x1e,0xf1,0x05,0xff,0x6d,0x74,0x40,0xaf,0x75,0x6e,0x67,0x2c,
+    0x1b,0xa8,0xf3,0x4b,0x6c,0xb7,0x93,0x6b,0x1b,0x98,0xda,0xef,0x60,0xac,0xc2,0xe3,
+    0x0e,0xc3,0x63,0x8a,0xf9,0xff,0xb3,0xbe,0xe1,0xb1,0x00,0xee,0x0a,0xcd,0x6f,0xe5,
+    0x6f,0xcb,0xf8,0x7f,0xe1,0x3b,0x70,0xed,0xe9,0xef,0xe9,0xe9,0xf1,0xc6,0xe6,0x07,
+    0x70,0xbd,0x4b,0xfc,0x08,0xd6,0xc9,0xec,0xe1,0x3f,0x11,0xeb,0x47,0xe3,0xf7,0x33,
+    0x75,0xe8,0x7d,0x63,0x1f,0xff,0x13,0x95,0x60,0x2f,0xe3,0xdc,0x87,0x9d,0xfe,0x9e,
+    0xfa,0x07,0xfa,0x7b,0x1e,0x9d,0xfc,0x17,0x00,0x00
 };
 
 // Generated from:
@@ -171,6 +171,8 @@
 //     uint Sd;
 //     uint Ed;
 //
+//     uint srcEmulatedAlpha;
+//
 //     bool isSrcHDR;
 //     bool isSrcA2BGR10;
 // } params;
@@ -236,9 +238,7 @@
 //
 //     if(component >= params . Ns && component == 3)
 //     {
-//
-//         valueAsUint = floatBitsToUint(1.0);
-//
+//         valueAsUint = params . srcEmulatedAlpha;
 //     }
 //     else
 //     {
diff --git a/src/libANGLE/renderer/vulkan/shaders/src/ConvertVertex.comp b/src/libANGLE/renderer/vulkan/shaders/src/ConvertVertex.comp
index 8f514fb..459a50f 100644
--- a/src/libANGLE/renderer/vulkan/shaders/src/ConvertVertex.comp
+++ b/src/libANGLE/renderer/vulkan/shaders/src/ConvertVertex.comp
@@ -129,6 +129,11 @@
     uint Sd;       // Precalculated Nd*Bd
     uint Ed;       // Precalculated 4/Bd
 
+    // uint representation of src emulated alpha.  If destination has alpha and source doesn't,
+    // this value is used as src alpha, which is then converted to destination format the same way
+    // other data from source is.
+    uint srcEmulatedAlpha;
+
     bool isSrcHDR; // Whether source is either of A2BGR10 or RGB10A2
     bool isSrcA2BGR10;  // Whether source is A2BGR10
 } params;
@@ -245,24 +250,7 @@
 
     if (component >= Ns && component == 3)
     {
-        // See GLES3.0 section 2.9.1 Transferring Array Elements
-#if SintToSint || SintToFloat || UintToUint || UintToFloat
-        // For integers, alpha should take a value of 1.
-        valueAsUint = 1;
-#elif SnormToFloat
-        // The largest signed number is 0b011...1 which is valueMask >> 1
-        valueAsUint = valueMask >> 1;
-#elif UnormToFloat
-        // The largest unsigned number is 0b11...1 which is valueMask
-        valueAsUint = valueMask;
-#elif FixedToFloat
-        // 1.0 in fixed point is 0x10000
-        valueAsUint = 0x10000;
-#elif FloatToFloat || FloatToHalf
-        valueAsUint = floatBitsToUint(1.0);
-#else
-#error "Not all conversions are accounted for"
-#endif
+        valueAsUint = params.srcEmulatedAlpha;
     }
     else
     {
diff --git a/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp b/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp
index 7ef7ee1..aa3ab11 100644
--- a/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp
+++ b/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp
@@ -31,12 +31,9 @@
 
 namespace
 {
-
-constexpr int32_t kDynamicScissorSentinel = std::numeric_limits<int32_t>::min();
-
-bool IsScissorStateDynamic(const VkRect2D &scissor)
+bool IsScissorStateDynamic(const PackedScissor &scissor)
 {
-    return scissor.offset.x == kDynamicScissorSentinel;
+    return scissor.x == kDynamicScissorSentinel;
 }
 
 uint8_t PackGLBlendOp(GLenum blendOp)
@@ -152,9 +149,9 @@
 }
 
 void UnpackAttachmentDesc(VkAttachmentDescription *desc,
-                          const vk::Format &format,
+                          const Format &format,
                           uint8_t samples,
-                          const vk::PackedAttachmentOpsDesc &ops)
+                          const PackedAttachmentOpsDesc &ops)
 {
     // We would only need this flag for duplicated attachments. Apply it conservatively.
     desc->flags   = VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT;
@@ -173,7 +170,7 @@
 }
 
 void UnpackColorResolveAttachmentDesc(VkAttachmentDescription *desc,
-                                      const vk::Format &format,
+                                      const Format &format,
                                       bool usedAsInputAttachment,
                                       bool isInvalidated)
 {
@@ -206,7 +203,7 @@
 }
 
 void UnpackDepthStencilResolveAttachmentDesc(VkAttachmentDescription *desc,
-                                             const vk::Format &format,
+                                             const Format &format,
                                              bool usedAsDepthInputAttachment,
                                              bool usedAsStencilInputAttachment,
                                              bool isDepthInvalidated,
@@ -241,7 +238,7 @@
     desc->finalLayout   = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
 }
 
-void UnpackStencilState(const vk::PackedStencilOpState &packedState,
+void UnpackStencilState(const PackedStencilOpState &packedState,
                         uint8_t stencilReference,
                         VkStencilOpState *stateOut)
 {
@@ -254,7 +251,7 @@
     stateOut->reference   = stencilReference;
 }
 
-void UnpackBlendAttachmentState(const vk::PackedColorBlendAttachmentState &packedState,
+void UnpackBlendAttachmentState(const PackedColorBlendAttachmentState &packedState,
                                 VkPipelineColorBlendAttachmentState *stateOut)
 {
     stateOut->srcColorBlendFactor = static_cast<VkBlendFactor>(packedState.srcColorBlendFactor);
@@ -749,7 +746,7 @@
 
 void UpdateRenderPassColorPerfCounters(const VkRenderPassCreateInfo &createInfo,
                                        const VkSubpassDescription &subpass,
-                                       vk::RenderPassPerfCounters *countersOut)
+                                       RenderPassPerfCounters *countersOut)
 {
     // Color resolve counters.
     if (subpass.pResolveAttachments == nullptr)
@@ -773,7 +770,7 @@
 
 void UpdateRenderPassDepthStencilPerfCounters(const VkRenderPassCreateInfo &createInfo,
                                               size_t renderPassIndex,
-                                              vk::RenderPassPerfCounters *countersOut)
+                                              RenderPassPerfCounters *countersOut)
 {
     ASSERT(renderPassIndex != VK_ATTACHMENT_UNUSED);
 
@@ -798,7 +795,7 @@
 void UpdateRenderPassDepthStencilResolvePerfCounters(
     const VkRenderPassCreateInfo &createInfo,
     const VkSubpassDescriptionDepthStencilResolve &depthStencilResolve,
-    vk::RenderPassPerfCounters *countersOut)
+    RenderPassPerfCounters *countersOut)
 {
     if (depthStencilResolve.pDepthStencilResolveAttachment == nullptr)
     {
@@ -837,11 +834,11 @@
     const RenderPassDesc &desc,
     const VkRenderPassCreateInfo &createInfo,
     const VkSubpassDescriptionDepthStencilResolve &depthStencilResolve,
-    vk::RenderPassPerfCounters *countersOut)
+    RenderPassPerfCounters *countersOut)
 {
     // Accumulate depth/stencil attachment indices in all subpasses to avoid double-counting
     // counters.
-    vk::FramebufferAttachmentMask depthStencilAttachmentIndices;
+    FramebufferAttachmentMask depthStencilAttachmentIndices;
 
     for (uint32_t subpassIndex = 0; subpassIndex < createInfo.subpassCount; ++subpassIndex)
     {
@@ -883,7 +880,7 @@
 angle::Result InitializeRenderPassFromDesc(ContextVk *contextVk,
                                            const RenderPassDesc &desc,
                                            const AttachmentOpsArray &ops,
-                                           vk::RenderPassHelper *renderPassHelper)
+                                           RenderPassHelper *renderPassHelper)
 {
     RendererVk *renderer = contextVk->getRenderer();
 
@@ -933,7 +930,7 @@
 
         angle::FormatID formatID = desc[colorIndexGL];
         ASSERT(formatID != angle::FormatID::NONE);
-        const vk::Format &format = renderer->getFormat(formatID);
+        const Format &format = renderer->getFormat(formatID);
 
         VkAttachmentReference colorRef;
         colorRef.attachment = attachmentCount.get();
@@ -956,7 +953,7 @@
 
         angle::FormatID formatID = desc[depthStencilIndexGL];
         ASSERT(formatID != angle::FormatID::NONE);
-        const vk::Format &format = renderer->getFormat(formatID);
+        const Format &format = renderer->getFormat(formatID);
 
         depthStencilAttachmentRef.attachment = attachmentCount.get();
         depthStencilAttachmentRef.layout     = ConvertImageLayoutToVkImageLayout(
@@ -983,7 +980,7 @@
 
         ASSERT(desc.isColorAttachmentEnabled(colorIndexGL));
 
-        const vk::Format &format = renderer->getFormat(desc[colorIndexGL]);
+        const Format &format = renderer->getFormat(desc[colorIndexGL]);
 
         VkAttachmentReference colorRef;
         colorRef.attachment = attachmentCount.get();
@@ -1013,7 +1010,7 @@
 
         uint32_t depthStencilIndexGL = static_cast<uint32_t>(desc.depthStencilAttachmentIndex());
 
-        const vk::Format &format         = renderer->getFormat(desc[depthStencilIndexGL]);
+        const Format &format             = renderer->getFormat(desc[depthStencilIndexGL]);
         const angle::Format &angleFormat = format.intendedFormat();
 
         // Treat missing aspect as invalidated for the purpose of the resolve attachment.
@@ -1158,8 +1155,8 @@
 
 void GetRenderPassAndUpdateCounters(ContextVk *contextVk,
                                     bool updatePerfCounters,
-                                    vk::RenderPassHelper *renderPassHelper,
-                                    vk::RenderPass **renderPassOut)
+                                    RenderPassHelper *renderPassHelper,
+                                    RenderPass **renderPassOut)
 {
     *renderPassOut = &renderPassHelper->getRenderPass();
     if (updatePerfCounters)
@@ -1184,8 +1181,8 @@
 }
 
 void InitializeSpecializationInfo(
-    const vk::SpecializationConstants &specConsts,
-    vk::SpecializationConstantMap<VkSpecializationMapEntry> *specializationEntriesOut,
+    const SpecializationConstants &specConsts,
+    SpecializationConstantMap<VkSpecializationMapEntry> *specializationEntriesOut,
     VkSpecializationInfo *specializationInfoOut)
 {
     // Collect specialization constants.
@@ -1197,14 +1194,24 @@
         {
             case sh::vk::SpecializationConstantId::LineRasterEmulation:
                 (*specializationEntriesOut)[id].offset =
-                    offsetof(vk::SpecializationConstants, lineRasterEmulation);
+                    offsetof(SpecializationConstants, lineRasterEmulation);
                 (*specializationEntriesOut)[id].size = sizeof(specConsts.lineRasterEmulation);
                 break;
             case sh::vk::SpecializationConstantId::SurfaceRotation:
                 (*specializationEntriesOut)[id].offset =
-                    offsetof(vk::SpecializationConstants, surfaceRotation);
+                    offsetof(SpecializationConstants, surfaceRotation);
                 (*specializationEntriesOut)[id].size = sizeof(specConsts.surfaceRotation);
                 break;
+            case sh::vk::SpecializationConstantId::DrawableWidth:
+                (*specializationEntriesOut)[id].offset =
+                    offsetof(vk::SpecializationConstants, drawableWidth);
+                (*specializationEntriesOut)[id].size = sizeof(specConsts.drawableWidth);
+                break;
+            case sh::vk::SpecializationConstantId::DrawableHeight:
+                (*specializationEntriesOut)[id].offset =
+                    offsetof(vk::SpecializationConstants, drawableHeight);
+                (*specializationEntriesOut)[id].size = sizeof(specConsts.drawableHeight);
+                break;
             default:
                 UNREACHABLE();
                 break;
@@ -1493,7 +1500,7 @@
 // TODO(jmadill): We should prefer using Packed GLenums. http://anglebug.com/2169
 
 // Initialize PSO states, it is consistent with initial value of gl::State
-void GraphicsPipelineDesc::initDefaults()
+void GraphicsPipelineDesc::initDefaults(const ContextVk *contextVk)
 {
     // Set all vertex input attributes to default, the default format is Float
     angle::FormatID defaultFormat = GetCurrentValueFormatID(gl::VertexAttribType::Float);
@@ -1506,8 +1513,9 @@
         SetBitField(packedAttrib.offset, 0);
     }
 
-    mRasterizationAndMultisampleStateInfo.bits.subpass                    = 0;
-    mRasterizationAndMultisampleStateInfo.bits.depthClampEnable           = 0;
+    mRasterizationAndMultisampleStateInfo.bits.subpass = 0;
+    mRasterizationAndMultisampleStateInfo.bits.depthClampEnable =
+        contextVk->getFeatures().depthClamping.enabled ? VK_TRUE : VK_FALSE;
     mRasterizationAndMultisampleStateInfo.bits.rasterizationDiscardEnable = 0;
     SetBitField(mRasterizationAndMultisampleStateInfo.bits.polygonMode, VK_POLYGON_MODE_FILL);
     SetBitField(mRasterizationAndMultisampleStateInfo.bits.cullMode, VK_CULL_MODE_BACK_BIT);
@@ -1596,15 +1604,18 @@
     mViewport.minDepth = 0.0f;
     mViewport.maxDepth = 1.0f;
 
-    mScissor.offset.x      = 0;
-    mScissor.offset.y      = 0;
-    mScissor.extent.width  = 0;
-    mScissor.extent.height = 0;
+    mScissor.x      = 0;
+    mScissor.y      = 0;
+    mScissor.width  = 0;
+    mScissor.height = 0;
+
+    mDrawableSize.width  = 1;
+    mDrawableSize.height = 1;
 }
 
 angle::Result GraphicsPipelineDesc::initializePipeline(
     ContextVk *contextVk,
-    const vk::PipelineCache &pipelineCacheVk,
+    const PipelineCache &pipelineCacheVk,
     const RenderPass &compatibleRenderPass,
     const PipelineLayout &pipelineLayout,
     const gl::AttributesMask &activeAttribLocationsMask,
@@ -1612,7 +1623,7 @@
     const ShaderModule *vertexModule,
     const ShaderModule *fragmentModule,
     const ShaderModule *geometryModule,
-    const vk::SpecializationConstants specConsts,
+    const SpecializationConstants &specConsts,
     Pipeline *pipelineOut) const
 {
     angle::FixedVector<VkPipelineShaderStageCreateInfo, 3> shaderStages;
@@ -1627,7 +1638,7 @@
     VkSpecializationInfo specializationInfo        = {};
     VkGraphicsPipelineCreateInfo createInfo        = {};
 
-    vk::SpecializationConstantMap<VkSpecializationMapEntry> specializationEntries;
+    SpecializationConstantMap<VkSpecializationMapEntry> specializationEntries;
     InitializeSpecializationInfo(specConsts, &specializationEntries, &specializationInfo);
 
     // Vertex shader is always expected to be present.
@@ -1699,7 +1710,7 @@
 
         // Get the corresponding VkFormat for the attrib's format.
         angle::FormatID formatID         = static_cast<angle::FormatID>(packedAttrib.format);
-        const vk::Format &format         = contextVk->getRenderer()->getFormat(formatID);
+        const Format &format             = contextVk->getRenderer()->getFormat(formatID);
         const angle::Format &angleFormat = format.intendedFormat();
         VkFormat vkFormat =
             packedAttrib.compressed ? format.vkCompressedBufferFormat : format.vkBufferFormat;
@@ -1771,8 +1782,21 @@
     viewportState.flags         = 0;
     viewportState.viewportCount = 1;
     viewportState.pViewports    = &viewport;
-    viewportState.scissorCount  = 1;
-    viewportState.pScissors     = IsScissorStateDynamic(mScissor) ? nullptr : &mScissor;
+
+    viewportState.scissorCount = 1;
+    VkRect2D scissor;
+    if (IsScissorStateDynamic(mScissor))
+    {
+        viewportState.pScissors = nullptr;
+    }
+    else
+    {
+        viewportState.pScissors = &scissor;
+        scissor.offset.x        = mScissor.x;
+        scissor.offset.y        = mScissor.y;
+        scissor.extent.width    = mScissor.width;
+        scissor.extent.height   = mScissor.height;
+    }
 
     const PackedRasterizationAndMultisampleStateInfo &rasterAndMS =
         mRasterizationAndMultisampleStateInfo;
@@ -1814,6 +1838,21 @@
         *pNextPtr                                = &provokingVertexState;
         pNextPtr                                 = &provokingVertexState.pNext;
     }
+
+    // When depth clamping is used, depth clipping is automatically disabled.
+    // When the 'depthClamping' feature is enabled, we'll be using depth clamping
+    // to work around a driver issue, not as an alternative to depth clipping. Therefore we need to
+    // explicitly re-enable depth clipping.
+    VkPipelineRasterizationDepthClipStateCreateInfoEXT depthClipState = {};
+    depthClipState.sType =
+        VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT;
+    if (contextVk->getFeatures().depthClamping.enabled)
+    {
+        depthClipState.depthClipEnable = VK_TRUE;
+        *pNextPtr                      = &depthClipState;
+        pNextPtr                       = &depthClipState.pNext;
+    }
+
     VkPipelineRasterizationStateStreamCreateInfoEXT rasterStreamState = {};
     rasterStreamState.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT;
     if (contextVk->getFeatures().supportsTransformFeedbackExtension.enabled)
@@ -1952,7 +1991,7 @@
                                              bool compressed,
                                              GLuint relativeOffset)
 {
-    vk::PackedAttribDesc &packedAttrib = mVertexInputAttribs.attribs[attribIndex];
+    PackedAttribDesc &packedAttrib = mVertexInputAttribs.attribs[attribIndex];
 
     SetBitField(packedAttrib.stride, stride);
     SetBitField(packedAttrib.divisor, divisor);
@@ -2433,25 +2472,42 @@
 
 void GraphicsPipelineDesc::setDynamicScissor()
 {
-    mScissor.offset.x      = kDynamicScissorSentinel;
-    mScissor.offset.y      = 0;
-    mScissor.extent.width  = 0;
-    mScissor.extent.height = 0;
+    mScissor.x      = kDynamicScissorSentinel;
+    mScissor.y      = 0;
+    mScissor.width  = 0;
+    mScissor.height = 0;
 }
 
 void GraphicsPipelineDesc::setScissor(const VkRect2D &scissor)
 {
-    mScissor = scissor;
+    ASSERT(scissor.offset.x < kDynamicScissorSentinel &&
+           scissor.offset.y < kDynamicScissorSentinel &&
+           scissor.extent.width < kDynamicScissorSentinel &&
+           scissor.extent.height < kDynamicScissorSentinel);
+    SetBitField(mScissor.x, scissor.offset.x);
+    SetBitField(mScissor.y, scissor.offset.y);
+    SetBitField(mScissor.width, scissor.extent.width);
+    SetBitField(mScissor.height, scissor.extent.height);
 }
 
 void GraphicsPipelineDesc::updateScissor(GraphicsPipelineTransitionBits *transition,
                                          const VkRect2D &scissor)
 {
-    mScissor = scissor;
-    transition->set(ANGLE_GET_TRANSITION_BIT(mScissor, offset.x));
-    transition->set(ANGLE_GET_TRANSITION_BIT(mScissor, offset.y));
-    transition->set(ANGLE_GET_TRANSITION_BIT(mScissor, extent.width));
-    transition->set(ANGLE_GET_TRANSITION_BIT(mScissor, extent.height));
+    setScissor(scissor);
+    transition->set(ANGLE_GET_TRANSITION_BIT(mScissor, x));
+    transition->set(ANGLE_GET_TRANSITION_BIT(mScissor, y));
+    transition->set(ANGLE_GET_TRANSITION_BIT(mScissor, width));
+    transition->set(ANGLE_GET_TRANSITION_BIT(mScissor, height));
+}
+
+void GraphicsPipelineDesc::updateDrawableSize(GraphicsPipelineTransitionBits *transition,
+                                              uint32_t width,
+                                              uint32_t height)
+{
+    SetBitField(mDrawableSize.width, width);
+    SetBitField(mDrawableSize.height, height);
+    transition->set(ANGLE_GET_TRANSITION_BIT(mDrawableSize, width));
+    transition->set(ANGLE_GET_TRANSITION_BIT(mDrawableSize, height));
 }
 
 void GraphicsPipelineDesc::updateSubpass(GraphicsPipelineTransitionBits *transition,
@@ -2533,7 +2589,7 @@
                                            ImageLayout finalLayout)
 {
     setLayouts(index, initialLayout, finalLayout);
-    setOps(index, VK_ATTACHMENT_LOAD_OP_LOAD, vk::RenderPassStoreOp::Store);
+    setOps(index, VK_ATTACHMENT_LOAD_OP_LOAD, RenderPassStoreOp::Store);
     setStencilOps(index, VK_ATTACHMENT_LOAD_OP_LOAD, RenderPassStoreOp::Store);
 }
 
@@ -2613,7 +2669,7 @@
                                      VkDescriptorType type,
                                      uint32_t count,
                                      VkShaderStageFlags stages,
-                                     const vk::Sampler *immutableSampler)
+                                     const Sampler *immutableSampler)
 {
     ASSERT(static_cast<size_t>(type) < std::numeric_limits<uint16_t>::max());
     ASSERT(count < std::numeric_limits<uint16_t>::max());
@@ -2993,7 +3049,7 @@
     mReserved[2] = 0;
 }
 
-angle::Result SamplerDesc::init(ContextVk *contextVk, vk::Sampler *sampler) const
+angle::Result SamplerDesc::init(ContextVk *contextVk, Sampler *sampler) const
 {
     const gl::Extensions &extensions = contextVk->getExtensions();
 
@@ -3029,7 +3085,7 @@
         filteringInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_FILTERING_PRECISION_GOOGLE;
         filteringInfo.samplerFilteringPrecisionMode =
             VK_SAMPLER_FILTERING_PRECISION_MODE_HIGH_GOOGLE;
-        vk::AddToPNextChain(&createInfo, &filteringInfo);
+        AddToPNextChain(&createInfo, &filteringInfo);
     }
 
     VkSamplerYcbcrConversionInfo yuvConversionInfo = {};
@@ -3041,7 +3097,7 @@
         yuvConversionInfo.conversion =
             contextVk->getRenderer()->getYuvConversionCache().getYuvConversionFromExternalFormat(
                 mExternalFormat);
-        vk::AddToPNextChain(&createInfo, &yuvConversionInfo);
+        AddToPNextChain(&createInfo, &yuvConversionInfo);
 
         // Vulkan spec requires these settings:
         createInfo.addressModeU            = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
@@ -3273,7 +3329,7 @@
     const vk::ShaderModule *vertexModule,
     const vk::ShaderModule *fragmentModule,
     const vk::ShaderModule *geometryModule,
-    const vk::SpecializationConstants specConsts,
+    const vk::SpecializationConstants &specConsts,
     const vk::GraphicsPipelineDesc &desc,
     const vk::GraphicsPipelineDesc **descPtrOut,
     vk::PipelineHelper **pipelineOut)
diff --git a/src/libANGLE/renderer/vulkan/vk_cache_utils.h b/src/libANGLE/renderer/vulkan/vk_cache_utils.h
index 900cde8..becdb5b 100644
--- a/src/libANGLE/renderer/vulkan/vk_cache_utils.h
+++ b/src/libANGLE/renderer/vulkan/vk_cache_utils.h
@@ -527,6 +527,22 @@
     PrimitiveState primitive;
 };
 
+struct PackedScissor final
+{
+    uint16_t x;
+    uint16_t y;
+    uint16_t width;
+    uint16_t height;
+};
+
+struct PackedExtent final
+{
+    uint16_t width;
+    uint16_t height;
+};
+// This is invalid value for PackedScissor.x. It is used to indicate scissor is a dynamic state
+constexpr int32_t kDynamicScissorSentinel = std::numeric_limits<decltype(PackedScissor::x)>::max();
+
 constexpr size_t kPackedInputAssemblyAndColorBlendStateSize =
     sizeof(PackedInputAssemblyAndColorBlendStateInfo);
 static_assert(kPackedInputAssemblyAndColorBlendStateSize == 56, "Size check failed");
@@ -534,7 +550,7 @@
 constexpr size_t kGraphicsPipelineDescSumOfSizes =
     kVertexInputAttributesSize + kRenderPassDescSize + kPackedRasterizationAndMultisampleStateSize +
     kPackedDepthStencilStateSize + kPackedInputAssemblyAndColorBlendStateSize + sizeof(VkViewport) +
-    sizeof(VkRect2D);
+    sizeof(PackedScissor) + sizeof(PackedExtent);
 
 // Number of dirty bits in the dirty bit set.
 constexpr size_t kGraphicsPipelineDirtyBitBytes = 4;
@@ -564,7 +580,7 @@
     size_t hash() const;
     bool operator==(const GraphicsPipelineDesc &other) const;
 
-    void initDefaults();
+    void initDefaults(const ContextVk *contextVk);
 
     // For custom comparisons.
     template <typename T>
@@ -574,7 +590,7 @@
     }
 
     angle::Result initializePipeline(ContextVk *contextVk,
-                                     const vk::PipelineCache &pipelineCacheVk,
+                                     const PipelineCache &pipelineCacheVk,
                                      const RenderPass &compatibleRenderPass,
                                      const PipelineLayout &pipelineLayout,
                                      const gl::AttributesMask &activeAttribLocationsMask,
@@ -582,7 +598,7 @@
                                      const ShaderModule *vertexModule,
                                      const ShaderModule *fragmentModule,
                                      const ShaderModule *geometryModule,
-                                     const vk::SpecializationConstants specConsts,
+                                     const SpecializationConstants &specConsts,
                                      Pipeline *pipelineOut) const;
 
     // Vertex input state. For ES 3.1 this should be separated into binding and attribute.
@@ -716,6 +732,11 @@
             mDepthStencilStateInfo.depthCompareOpAndSurfaceRotation.surfaceRotation);
     }
 
+    void updateDrawableSize(GraphicsPipelineTransitionBits *transition,
+                            uint32_t width,
+                            uint32_t height);
+    const PackedExtent &getDrawableSize() const { return mDrawableSize; }
+
   private:
     void updateSubpass(GraphicsPipelineTransitionBits *transition, uint32_t subpass);
 
@@ -727,7 +748,8 @@
     VkViewport mViewport;
     // The special value of .offset.x == INT_MIN for scissor implies dynamic scissor that needs to
     // be set through vkCmdSetScissor.
-    VkRect2D mScissor;
+    PackedScissor mScissor;
+    PackedExtent mDrawableSize;
 };
 
 // Verify the packed pipeline description has no gaps in the packing.
@@ -762,7 +784,7 @@
                 VkDescriptorType type,
                 uint32_t count,
                 VkShaderStageFlags stages,
-                const vk::Sampler *immutableSampler);
+                const Sampler *immutableSampler);
 
     void unpackBindings(DescriptorSetLayoutBindingVector *bindings,
                         std::vector<VkSampler> *immutableSamplers) const;
@@ -860,7 +882,7 @@
                 bool stencilMode,
                 uint64_t externalFormat);
     void reset();
-    angle::Result init(ContextVk *contextVk, vk::Sampler *sampler) const;
+    angle::Result init(ContextVk *contextVk, Sampler *sampler) const;
 
     size_t hash() const;
     bool operator==(const SamplerDesc &other) const;
@@ -1328,8 +1350,8 @@
 
     // Use a two-layer caching scheme. The top level matches the "compatible" RenderPass elements.
     // The second layer caches the attachment load/store ops and initial/final layout.
-    using InnerCache = std::unordered_map<vk::AttachmentOpsArray, vk::RenderPassHelper>;
-    using OuterCache = std::unordered_map<vk::RenderPassDesc, InnerCache>;
+    using InnerCache = angle::HashMap<vk::AttachmentOpsArray, vk::RenderPassHelper>;
+    using OuterCache = angle::HashMap<vk::RenderPassDesc, InnerCache>;
 
     OuterCache mPayload;
 };
@@ -1355,7 +1377,7 @@
                                            const vk::ShaderModule *vertexModule,
                                            const vk::ShaderModule *fragmentModule,
                                            const vk::ShaderModule *geometryModule,
-                                           const vk::SpecializationConstants specConsts,
+                                           const vk::SpecializationConstants &specConsts,
                                            const vk::GraphicsPipelineDesc &desc,
                                            const vk::GraphicsPipelineDesc **descPtrOut,
                                            vk::PipelineHelper **pipelineOut)
@@ -1384,7 +1406,7 @@
                                  const vk::ShaderModule *vertexModule,
                                  const vk::ShaderModule *fragmentModule,
                                  const vk::ShaderModule *geometryModule,
-                                 const vk::SpecializationConstants specConsts,
+                                 const vk::SpecializationConstants &specConsts,
                                  const vk::GraphicsPipelineDesc &desc,
                                  const vk::GraphicsPipelineDesc **descPtrOut,
                                  vk::PipelineHelper **pipelineOut);
diff --git a/src/libANGLE/renderer/vulkan/vk_caps_utils.cpp b/src/libANGLE/renderer/vulkan/vk_caps_utils.cpp
index e7e709a..fd398ac 100644
--- a/src/libANGLE/renderer/vulkan/vk_caps_utils.cpp
+++ b/src/libANGLE/renderer/vulkan/vk_caps_utils.cpp
@@ -17,6 +17,7 @@
 #include "libANGLE/renderer/driver_utils.h"
 #include "libANGLE/renderer/vulkan/DisplayVk.h"
 #include "libANGLE/renderer/vulkan/RendererVk.h"
+#include "libANGLE/renderer/vulkan/vk_cache_utils.h"
 #include "vk_format_utils.h"
 
 namespace
@@ -36,7 +37,7 @@
 {
     // Only VK_FORMAT_R32_SFLOAT doesn't have mandatory support for the STORAGE_IMAGE_ATOMIC and
     // STORAGE_TEXEL_BUFFER_ATOMIC features.
-    const vk::Format &formatVk = rendererVk->getFormat(GL_R32F);
+    const Format &formatVk = rendererVk->getFormat(GL_R32F);
 
     const bool hasImageAtomicSupport = rendererVk->hasImageFormatFeatureBits(
         formatVk.vkImageFormat, VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT);
@@ -50,6 +51,9 @@
     return hasImageAtomicSupport && hasBufferAtomicSupport;
 }
 
+// Checks to see if each format can be reinterpreted to an equivalent format in a different
+// colorspace. If all supported formats can be reinterpreted, it returns true. Formats which are not
+// supported at all are ignored and not counted as failures.
 bool FormatReinterpretationSupported(const std::vector<GLenum> &optionalSizedFormats,
                                      const RendererVk *rendererVk,
                                      bool checkLinearColorspace)
@@ -59,23 +63,19 @@
         const gl::TextureCaps &baseCaps = rendererVk->getNativeTextureCaps().get(glFormat);
         if (baseCaps.texturable && baseCaps.filterable)
         {
-            const vk::Format &vkFormat = rendererVk->getFormat(glFormat);
+            const Format &vkFormat = rendererVk->getFormat(glFormat);
 
             VkFormat reinterpretedFormat = checkLinearColorspace
-                                               ? vk::ConvertToLinear(vkFormat.vkImageFormat)
-                                               : vk::ConvertToSRGB(vkFormat.vkImageFormat);
-            ASSERT(reinterpretedFormat != VK_FORMAT_UNDEFINED);
+                                               ? ConvertToLinear(vkFormat.vkImageFormat)
+                                               : ConvertToSRGB(vkFormat.vkImageFormat);
 
-            constexpr uint32_t kBitsSampleFilter =
-                VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT |
-                VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT;
-
-            if (!rendererVk->hasImageFormatFeatureBits(reinterpretedFormat, kBitsSampleFilter))
+            if (!rendererVk->haveSameFormatFeatureBits(vkFormat.vkImageFormat, reinterpretedFormat))
             {
                 return false;
             }
         }
     }
+
     return true;
 }
 
@@ -136,16 +136,15 @@
     std::vector<GLenum> optionalR8LinearFormats   = {GL_R8};
     std::vector<GLenum> optionalBPTCLinearFormats = {GL_COMPRESSED_RGBA_BPTC_UNORM_EXT};
 
-    if (!vk::FormatReinterpretationSupported(optionalLinearFormats, rendererVk,
-                                             kNonLinearColorspace))
+    if (!FormatReinterpretationSupported(optionalLinearFormats, rendererVk, kNonLinearColorspace))
     {
         return false;
     }
 
     if (supportedExtensions.textureCompressionS3TCsRGB == true)
     {
-        if (!vk::FormatReinterpretationSupported(optionalS3TCLinearFormats, rendererVk,
-                                                 kNonLinearColorspace))
+        if (!FormatReinterpretationSupported(optionalS3TCLinearFormats, rendererVk,
+                                             kNonLinearColorspace))
         {
             return false;
         }
@@ -153,8 +152,8 @@
 
     if (supportedExtensions.sRGBR8EXT == true)
     {
-        if (!vk::FormatReinterpretationSupported(optionalR8LinearFormats, rendererVk,
-                                                 kNonLinearColorspace))
+        if (!FormatReinterpretationSupported(optionalR8LinearFormats, rendererVk,
+                                             kNonLinearColorspace))
         {
             return false;
         }
@@ -164,8 +163,8 @@
 
     if (supportedExtensions.textureCompressionBPTC == true)
     {
-        if (!vk::FormatReinterpretationSupported(optionalBPTCLinearFormats, rendererVk,
-                                                 kNonLinearColorspace))
+        if (!FormatReinterpretationSupported(optionalBPTCLinearFormats, rendererVk,
+                                             kNonLinearColorspace))
         {
             return false;
         }
@@ -174,6 +173,15 @@
     return true;
 }
 
+bool HasTexelBufferSupport(const RendererVk *rendererVk, GLenum formatGL)
+{
+    const Format &formatVk = rendererVk->getFormat(formatGL);
+
+    return rendererVk->hasBufferFormatFeatureBits(
+        formatVk.vkBufferFormat,
+        VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT);
+}
+
 bool HasTextureBufferSupport(const RendererVk *rendererVk)
 {
     // The following formats don't have mandatory UNIFORM_TEXEL_BUFFER support in Vulkan.
@@ -219,27 +227,40 @@
     //     VK_FORMAT_R32G32B32A32_SFLOAT
     //
 
-    // TODO: RGB32 formats currently don't have STORAGE_TEXEL_BUFFER support on any known platform.
-    // Despite this limitation, we expose EXT_texture_buffer.  http://anglebug.com/3573
     const std::array<GLenum, 12> &optionalFormats = {
         GL_R8,   GL_R8I,  GL_R8UI,  GL_RG8,   GL_RG8I,  GL_RG8UI,
         GL_R16F, GL_R16I, GL_R16UI, GL_RG16F, GL_RG16I, GL_RG16UI,
-        // GL_RGB32F,
-        // GL_RGB32I,
-        // GL_RGB32UI,
     };
 
     for (GLenum formatGL : optionalFormats)
     {
-        const vk::Format &formatVk = rendererVk->getFormat(formatGL);
-
-        if (!rendererVk->hasBufferFormatFeatureBits(formatVk.vkBufferFormat,
-                                                    VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT |
-                                                        VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT))
+        if (!HasTexelBufferSupport(rendererVk, formatGL))
         {
             return false;
         }
     }
+
+    // TODO: RGB32 formats currently don't have STORAGE_TEXEL_BUFFER support on any known platform.
+    // Despite this limitation, we expose EXT_texture_buffer.  http://anglebug.com/3573
+    if (rendererVk->getFeatures().exposeNonConformantExtensionsAndVersions.enabled)
+    {
+        return true;
+    }
+
+    const std::array<GLenum, 3> &optionalFormats2 = {
+        GL_RGB32F,
+        GL_RGB32I,
+        GL_RGB32UI,
+    };
+
+    for (GLenum formatGL : optionalFormats2)
+    {
+        if (!HasTexelBufferSupport(rendererVk, formatGL))
+        {
+            return false;
+        }
+    }
+
     return true;
 }
 }  // namespace
@@ -256,6 +277,19 @@
         physicalDeviceValue, static_cast<LargerInt>(std::numeric_limits<int32_t>::max() / 2)));
 }
 
+template <typename LargerInt>
+uint16_t LimitToDynamicScissorSentinelMinusOne(const LargerInt physicalDeviceValue)
+{
+    static_assert(sizeof(LargerInt) >= sizeof(int32_t),
+                  "Incorrect usage of LimitToDynamicScissorSentinelMinusOne");
+
+    // Limit to kDynamicScissorSentinel-1. This is used to pack drawable offset/dimension to
+    // uint16_t for space conservation. The UINT16_MAX is reserved for special value like
+    // kDynamicScissorSentinel.
+    return static_cast<uint16_t>(
+        std::min<int32_t>(physicalDeviceValue, vk::kDynamicScissorSentinel - 1));
+}
+
 void RendererVk::ensureCapsInitialized() const
 {
     if (mCapsInitialized)
@@ -425,6 +459,12 @@
         vk::GetTextureSRGBOverrideSupport(this, mNativeExtensions);
     mNativeExtensions.textureSRGBDecode = vk::GetTextureSRGBDecodeSupport(this);
 
+    // Vulkan natively supports io interface block.  This extension is not fully implemented yet
+    // however.  http://anglebug.com/3580
+    mNativeExtensions.shaderIoBlocksOES =
+        getFeatures().exposeNonConformantExtensionsAndVersions.enabled;
+    mNativeExtensions.shaderIoBlocksEXT = mNativeExtensions.shaderIoBlocksOES;
+
     mNativeExtensions.gpuShader5EXT = vk::CanSupportGPUShader5EXT(mPhysicalDeviceFeatures);
 
     mNativeExtensions.textureFilteringCHROMIUM = getFeatures().supportsFilteringPrecision.enabled;
@@ -437,7 +477,7 @@
 
     // Enable EXT_external_buffer on Andoid. External buffers are implemented using Android hadware
     // buffer (struct AHardwareBuffer).
-    mNativeExtensions.externalBufferEXT = IsAndroid() && (GetAndroidSDKVersion() >= 26);
+    mNativeExtensions.externalBufferEXT = IsAndroid() && GetAndroidSDKVersion() >= 26;
 
     // From the Vulkan specs:
     // sampleRateShading specifies whether Sample Shading and multisample interpolation are
@@ -445,9 +485,17 @@
     // VkPipelineMultisampleStateCreateInfo structure must be set to VK_FALSE and the
     // minSampleShading member is ignored. This also specifies whether shader modules can declare
     // the SampleRateShading capability
-    bool supportSampleRateShading      = (mPhysicalDeviceFeatures.sampleRateShading == VK_TRUE);
+    bool supportSampleRateShading      = mPhysicalDeviceFeatures.sampleRateShading == VK_TRUE;
     mNativeExtensions.sampleShadingOES = supportSampleRateShading;
 
+    // From the SPIR-V spec at 3.21. BuiltIn, SampleId and SamplePosition needs
+    // SampleRateShading. https://www.khronos.org/registry/spir-v/specs/unified1/SPIRV.html
+    // To replace non-constant index to constant 0 index, this extension assumes that ANGLE only
+    // supports the number of samples less than or equal to 32.
+    constexpr unsigned int kNotSupportedSampleCounts = VK_SAMPLE_COUNT_64_BIT;
+    mNativeExtensions.sampleVariablesOES =
+        supportSampleRateShading && vk_gl::GetMaxSampleCount(kNotSupportedSampleCounts) == 0;
+
     mNativeCaps.minInterpolationOffset          = limitsVk.minInterpolationOffset;
     mNativeCaps.maxInterpolationOffset          = limitsVk.maxInterpolationOffset;
     mNativeCaps.subPixelInterpolationOffsetBits = limitsVk.subPixelInterpolationOffsetBits;
@@ -463,21 +511,11 @@
     // OES_shader_multisample_interpolation requires a maximum value of -0.5 for
     // MIN_FRAGMENT_INTERPOLATION_OFFSET_OES and minimum 0.5 for
     // MAX_FRAGMENT_INTERPOLATION_OFFSET_OES.  Vulkan has an identical limit for
-    // minInterpolationOffset, but it's limit for maxInterpolationOffset is 0.5-(1/ULP).
+    // minInterpolationOffset, but its limit for maxInterpolationOffset is 0.5-(1/ULP).
     // OES_shader_multisample_interpolation is therefore only supported if
     // maxInterpolationOffset is at least 0.5.
     mNativeExtensions.multisampleInterpolationOES =
-        supportSampleRateShading && (mNativeCaps.maxInterpolationOffset >= 0.5);
-    // OES_shader_multisample_interpolation requires OES_sample_variables, disable for now
-    mNativeExtensions.multisampleInterpolationOES = false;
-
-    // From the SPIR-V spec at 3.21. BuiltIn, SampleId and SamplePosition needs
-    // SampleRateShading. https://www.khronos.org/registry/spir-v/specs/unified1/SPIRV.html
-    // To replace non-constant index to constant 0 index, this extension assumes that ANGLE only
-    // supports the number of samples less than or equal to 32.
-    constexpr unsigned int kNotSupportedSampleCounts = VK_SAMPLE_COUNT_64_BIT;
-    mNativeExtensions.sampleVariablesOES =
-        supportSampleRateShading && (vk_gl::GetMaxSampleCount(kNotSupportedSampleCounts) == 0);
+        mNativeExtensions.sampleVariablesOES && mNativeCaps.maxInterpolationOffset >= 0.5;
 
     // https://vulkan.lunarg.com/doc/view/1.0.30.0/linux/vkspec.chunked/ch31s02.html
     mNativeCaps.maxElementIndex  = std::numeric_limits<GLuint>::max() - 1;
@@ -498,12 +536,16 @@
 
     mNativeCaps.maxDrawBuffers =
         std::min(limitsVk.maxColorAttachments, limitsVk.maxFragmentOutputAttachments);
-    mNativeCaps.maxFramebufferWidth  = LimitToInt(limitsVk.maxFramebufferWidth);
-    mNativeCaps.maxFramebufferHeight = LimitToInt(limitsVk.maxFramebufferHeight);
-    mNativeCaps.maxColorAttachments  = LimitToInt(limitsVk.maxColorAttachments);
-    mNativeCaps.maxViewportWidth     = LimitToInt(limitsVk.maxViewportDimensions[0]);
-    mNativeCaps.maxViewportHeight    = LimitToInt(limitsVk.maxViewportDimensions[1]);
-    mNativeCaps.maxSampleMaskWords   = LimitToInt(limitsVk.maxSampleMaskWords);
+    mNativeCaps.maxFramebufferWidth =
+        LimitToDynamicScissorSentinelMinusOne(limitsVk.maxFramebufferWidth);
+    mNativeCaps.maxFramebufferHeight =
+        LimitToDynamicScissorSentinelMinusOne(limitsVk.maxFramebufferHeight);
+    mNativeCaps.maxColorAttachments = LimitToInt(limitsVk.maxColorAttachments);
+    mNativeCaps.maxViewportWidth =
+        LimitToDynamicScissorSentinelMinusOne(limitsVk.maxViewportDimensions[0]);
+    mNativeCaps.maxViewportHeight =
+        LimitToDynamicScissorSentinelMinusOne(limitsVk.maxViewportDimensions[1]);
+    mNativeCaps.maxSampleMaskWords = LimitToInt(limitsVk.maxSampleMaskWords);
     mNativeCaps.maxColorTextureSamples =
         limitsVk.sampledImageColorSampleCounts & vk_gl::kSupportedSampleCounts;
     mNativeCaps.maxDepthTextureSamples =
@@ -868,8 +910,9 @@
     // Geometry shader is optional.
     if (mPhysicalDeviceFeatures.geometryShader)
     {
-        // TODO : Remove below comment when http://anglebug.com/3571 will be completed
-        // mNativeExtensions.geometryShader = true;
+        // TODO: geometry shader support is incomplete.  http://anglebug.com/3571
+        mNativeExtensions.geometryShader =
+            getFeatures().exposeNonConformantExtensionsAndVersions.enabled;
         mNativeCaps.maxFramebufferLayers = LimitToInt(limitsVk.maxFramebufferLayers);
         mNativeCaps.layerProvokingVertex = GL_LAST_VERTEX_CONVENTION_EXT;
 
diff --git a/src/libANGLE/renderer/vulkan/vk_format_utils.cpp b/src/libANGLE/renderer/vulkan/vk_format_utils.cpp
index 767f45e..98bea07 100644
--- a/src/libANGLE/renderer/vulkan/vk_format_utils.cpp
+++ b/src/libANGLE/renderer/vulkan/vk_format_utils.cpp
@@ -257,7 +257,7 @@
 {
     for (size_t formatIndex = 0; formatIndex < angle::kNumANGLEFormats; ++formatIndex)
     {
-        vk::Format &format               = mFormatData[formatIndex];
+        Format &format                   = mFormatData[formatIndex];
         const auto formatID              = static_cast<angle::FormatID>(formatIndex);
         const angle::Format &angleFormat = angle::Format::Get(formatID);
 
diff --git a/src/libANGLE/renderer/vulkan/vk_format_utils.h b/src/libANGLE/renderer/vulkan/vk_format_utils.h
index fcbf078..790b50e 100644
--- a/src/libANGLE/renderer/vulkan/vk_format_utils.h
+++ b/src/libANGLE/renderer/vulkan/vk_format_utils.h
@@ -100,9 +100,12 @@
     size_t getImageCopyBufferAlignment() const;
     size_t getValidImageCopyBufferAlignment() const;
 
-    // Returns true if the Image format has more channels than the ANGLE format.
+    // Returns true if the image format has more channels than the ANGLE format.
     bool hasEmulatedImageChannels() const;
 
+    // Returns true if the image has a different image format than intended.
+    bool hasEmulatedImageFormat() const { return actualImageFormatID != intendedFormatID; }
+
     // This is an auto-generated method in vk_format_table_autogen.cpp.
     void initialize(RendererVk *renderer, const angle::Format &angleFormat);
 
diff --git a/src/libANGLE/renderer/vulkan/vk_helpers.cpp b/src/libANGLE/renderer/vulkan/vk_helpers.cpp
index 968843f..a025ebe 100644
--- a/src/libANGLE/renderer/vulkan/vk_helpers.cpp
+++ b/src/libANGLE/renderer/vulkan/vk_helpers.cpp
@@ -65,11 +65,11 @@
     {PipelineStage::BottomOfPipe, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT},
     {PipelineStage::Host, VK_PIPELINE_STAGE_HOST_BIT}};
 
-constexpr gl::ShaderMap<vk::PipelineStage> kPipelineStageShaderMap = {
-    {gl::ShaderType::Vertex, vk::PipelineStage::VertexShader},
-    {gl::ShaderType::Fragment, vk::PipelineStage::FragmentShader},
-    {gl::ShaderType::Geometry, vk::PipelineStage::GeometryShader},
-    {gl::ShaderType::Compute, vk::PipelineStage::ComputeShader},
+constexpr gl::ShaderMap<PipelineStage> kPipelineStageShaderMap = {
+    {gl::ShaderType::Vertex, PipelineStage::VertexShader},
+    {gl::ShaderType::Fragment, PipelineStage::FragmentShader},
+    {gl::ShaderType::Geometry, PipelineStage::GeometryShader},
+    {gl::ShaderType::Compute, PipelineStage::ComputeShader},
 };
 
 constexpr size_t kDefaultPoolAllocatorPageSize = 16 * 1024;
@@ -634,20 +634,42 @@
 }
 
 bool CanCopyWithTransferForCopyImage(RendererVk *renderer,
-                                     const vk::Format &srcFormat,
+                                     const Format &srcFormat,
                                      VkImageTiling srcTilingMode,
-                                     const vk::Format &destFormat,
+                                     const Format &destFormat,
                                      VkImageTiling destTilingMode)
 {
-    // Transfers for copy image must have the source and destination formats be size compatible
-    const angle::Format &srcFormatActual  = srcFormat.actualImageFormat();
-    const angle::Format &destFormatActual = destFormat.actualImageFormat();
+    // Neither source nor destination formats can be emulated for copy image through transfer,
+    // unless they are emualted with the same format!
+    bool isFormatCompatible =
+        (!srcFormat.hasEmulatedImageFormat() && !destFormat.hasEmulatedImageFormat()) ||
+        srcFormat.actualImageFormatID == destFormat.actualImageFormatID;
 
-    bool isFormatCompatible = srcFormatActual.pixelBytes == destFormatActual.pixelBytes;
+    // If neither formats are emulated, GL validation ensures that pixelBytes is the same for both.
+    ASSERT(!isFormatCompatible ||
+           srcFormat.actualImageFormat().pixelBytes == destFormat.actualImageFormat().pixelBytes);
 
     return isFormatCompatible &&
            CanCopyWithTransfer(renderer, srcFormat, srcTilingMode, destFormat, destTilingMode);
 }
+
+void ReleaseBufferListToRenderer(RendererVk *renderer, BufferHelperPointerVector *buffers)
+{
+    for (std::unique_ptr<BufferHelper> &toFree : *buffers)
+    {
+        toFree->release(renderer);
+    }
+    buffers->clear();
+}
+
+void DestroyBufferList(RendererVk *renderer, BufferHelperPointerVector *buffers)
+{
+    for (std::unique_ptr<BufferHelper> &toDestroy : *buffers)
+    {
+        toDestroy->destroy(renderer);
+    }
+    buffers->clear();
+}
 }  // anonymous namespace
 
 // This is an arbitrary max. We can change this later if necessary.
@@ -670,9 +692,9 @@
 }
 
 bool CanCopyWithTransfer(RendererVk *renderer,
-                         const vk::Format &srcFormat,
+                         const Format &srcFormat,
                          VkImageTiling srcTilingMode,
-                         const vk::Format &destFormat,
+                         const Format &destFormat,
                          VkImageTiling destTilingMode)
 {
     // Checks that the formats in the copy transfer have the appropriate tiling and transfer bits
@@ -939,7 +961,7 @@
         // If never invalidated or no longer invalidated, return early.
         return false;
     }
-    if (access == vk::ResourceAccess::Write)
+    if (access == ResourceAccess::Write)
     {
         // Drawing to this attachment is being enabled.  Assume that drawing will immediately occur
         // after this attachment is enabled, and that means that the attachment will no longer be
@@ -1133,7 +1155,7 @@
     }
 }
 
-void CommandBufferHelper::onImageHelperRelease(const vk::ImageHelper *image)
+void CommandBufferHelper::onImageHelperRelease(const ImageHelper *image)
 {
     ASSERT(mIsRenderPassCommandBuffer);
 
@@ -1281,7 +1303,7 @@
 void CommandBufferHelper::invalidateRenderPassColorAttachment(PackedAttachmentIndex attachmentIndex)
 {
     ASSERT(mIsRenderPassCommandBuffer);
-    SetBitField(mAttachmentOps[attachmentIndex].storeOp, vk::RenderPassStoreOp::DontCare);
+    SetBitField(mAttachmentOps[attachmentIndex].storeOp, RenderPassStoreOp::DontCare);
     mAttachmentOps[attachmentIndex].isInvalidated = true;
 }
 
@@ -1331,7 +1353,6 @@
 
     if (mIsRenderPassCommandBuffer)
     {
-        mCommandBuffer.executeQueuedResetQueryPoolCommands(primary->getHandle());
         ASSERT(renderPass != nullptr);
 
         VkRenderPassBeginInfo beginInfo    = {};
@@ -1381,8 +1402,8 @@
     return angle::Result::Continue;
 }
 
-void CommandBufferHelper::updateRenderPassForResolve(vk::Framebuffer *newFramebuffer,
-                                                     const vk::RenderPassDesc &renderPassDesc)
+void CommandBufferHelper::updateRenderPassForResolve(Framebuffer *newFramebuffer,
+                                                     const RenderPassDesc &renderPassDesc)
 {
     ASSERT(newFramebuffer);
     mFramebuffer.setHandle(newFramebuffer->getHandle());
@@ -1594,7 +1615,6 @@
     : mUsage(0),
       mHostVisible(false),
       mInitialSize(0),
-      mBuffer(nullptr),
       mNextAllocationOffset(0),
       mLastFlushOrInvalidateOffset(0),
       mSize(0),
@@ -1606,16 +1626,14 @@
     : mUsage(other.mUsage),
       mHostVisible(other.mHostVisible),
       mInitialSize(other.mInitialSize),
-      mBuffer(other.mBuffer),
+      mBuffer(std::move(other.mBuffer)),
       mNextAllocationOffset(other.mNextAllocationOffset),
       mLastFlushOrInvalidateOffset(other.mLastFlushOrInvalidateOffset),
       mSize(other.mSize),
       mAlignment(other.mAlignment),
       mMemoryPropertyFlags(other.mMemoryPropertyFlags),
       mInFlightBuffers(std::move(other.mInFlightBuffers))
-{
-    other.mBuffer = nullptr;
-}
+{}
 
 void DynamicBuffer::init(RendererVk *renderer,
                          VkBufferUsageFlags usage,
@@ -1659,11 +1677,14 @@
 DynamicBuffer::~DynamicBuffer()
 {
     ASSERT(mBuffer == nullptr);
+    ASSERT(mInFlightBuffers.empty());
+    ASSERT(mBufferFreeList.empty());
 }
 
 angle::Result DynamicBuffer::allocateNewBuffer(ContextVk *contextVk)
 {
-    std::unique_ptr<BufferHelper> buffer = std::make_unique<BufferHelper>();
+    ASSERT(!mBuffer);
+    mBuffer = std::make_unique<BufferHelper>();
 
     VkBufferCreateInfo createInfo    = {};
     createInfo.sType                 = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
@@ -1674,12 +1695,7 @@
     createInfo.queueFamilyIndexCount = 0;
     createInfo.pQueueFamilyIndices   = nullptr;
 
-    ANGLE_TRY(buffer->init(contextVk, createInfo, mMemoryPropertyFlags));
-
-    ASSERT(!mBuffer);
-    mBuffer = buffer.release();
-
-    return angle::Result::Continue;
+    return mBuffer->init(contextVk, createInfo, mMemoryPropertyFlags);
 }
 
 bool DynamicBuffer::allocateFromCurrentBuffer(size_t sizeInBytes,
@@ -1730,8 +1746,8 @@
             ANGLE_TRY(flush(contextVk));
             mBuffer->unmap(contextVk->getRenderer());
 
-            mInFlightBuffers.push_back(mBuffer);
-            mBuffer = nullptr;
+            mInFlightBuffers.push_back(std::move(mBuffer));
+            ASSERT(!mBuffer);
         }
 
         if (sizeToAllocate > mSize)
@@ -1739,7 +1755,7 @@
             mSize = std::max(mInitialSize, sizeToAllocate);
 
             // Clear the free list since the free buffers are now too small.
-            for (BufferHelper *toFree : mBufferFreeList)
+            for (std::unique_ptr<BufferHelper> &toFree : mBufferFreeList)
             {
                 toFree->release(contextVk->getRenderer());
             }
@@ -1755,7 +1771,7 @@
         }
         else
         {
-            mBuffer = mBufferFreeList.front();
+            mBuffer = std::move(mBufferFreeList.front());
             mBufferFreeList.erase(mBufferFreeList.begin());
         }
 
@@ -1823,47 +1839,24 @@
     return angle::Result::Continue;
 }
 
-void DynamicBuffer::releaseBufferListToRenderer(RendererVk *renderer,
-                                                std::vector<BufferHelper *> *buffers)
-{
-    for (BufferHelper *toFree : *buffers)
-    {
-        toFree->release(renderer);
-        delete toFree;
-    }
-
-    buffers->clear();
-}
-
-void DynamicBuffer::destroyBufferList(RendererVk *renderer, std::vector<BufferHelper *> *buffers)
-{
-    for (BufferHelper *toFree : *buffers)
-    {
-        toFree->destroy(renderer);
-        delete toFree;
-    }
-
-    buffers->clear();
-}
-
 void DynamicBuffer::release(RendererVk *renderer)
 {
     reset();
 
-    releaseBufferListToRenderer(renderer, &mInFlightBuffers);
-    releaseBufferListToRenderer(renderer, &mBufferFreeList);
+    ReleaseBufferListToRenderer(renderer, &mInFlightBuffers);
+    ReleaseBufferListToRenderer(renderer, &mBufferFreeList);
 
     if (mBuffer)
     {
         mBuffer->release(renderer);
-        SafeDelete(mBuffer);
+        mBuffer.reset(nullptr);
     }
 }
 
 void DynamicBuffer::releaseInFlightBuffersToResourceUseList(ContextVk *contextVk)
 {
     ResourceUseList *resourceUseList = &contextVk->getResourceUseList();
-    for (BufferHelper *bufferHelper : mInFlightBuffers)
+    for (std::unique_ptr<BufferHelper> &bufferHelper : mInFlightBuffers)
     {
         bufferHelper->retain(resourceUseList);
 
@@ -1874,7 +1867,7 @@
         }
         else
         {
-            mBufferFreeList.push_back(bufferHelper);
+            mBufferFreeList.push_back(std::move(bufferHelper));
         }
     }
     mInFlightBuffers.clear();
@@ -1882,7 +1875,7 @@
 
 void DynamicBuffer::releaseInFlightBuffers(ContextVk *contextVk)
 {
-    for (BufferHelper *toRelease : mInFlightBuffers)
+    for (std::unique_ptr<BufferHelper> &toRelease : mInFlightBuffers)
     {
         // If the dynamic buffer was resized we cannot reuse the retained buffer.
         if (toRelease->getSize() < mSize)
@@ -1891,7 +1884,7 @@
         }
         else
         {
-            mBufferFreeList.push_back(toRelease);
+            mBufferFreeList.push_back(std::move(toRelease));
         }
     }
 
@@ -1902,15 +1895,14 @@
 {
     reset();
 
-    destroyBufferList(renderer, &mInFlightBuffers);
-    destroyBufferList(renderer, &mBufferFreeList);
+    DestroyBufferList(renderer, &mInFlightBuffers);
+    DestroyBufferList(renderer, &mBufferFreeList);
 
     if (mBuffer)
     {
         mBuffer->unmap(renderer);
         mBuffer->destroy(renderer);
-        delete mBuffer;
-        mBuffer = nullptr;
+        mBuffer.reset(nullptr);
     }
 }
 
@@ -2442,11 +2434,22 @@
     mUse.init();
 }
 
-void QueryHelper::resetQueryPool(ContextVk *contextVk,
-                                 CommandBuffer *outsideRenderPassCommandBuffer)
+void QueryHelper::beginQueryImpl(ContextVk *contextVk,
+                                 CommandBuffer *resetCommandBuffer,
+                                 CommandBuffer *commandBuffer)
 {
     const QueryPool &queryPool = getQueryPool();
-    outsideRenderPassCommandBuffer->resetQueryPool(queryPool.getHandle(), mQuery, 1);
+    resetCommandBuffer->resetQueryPool(queryPool.getHandle(), mQuery, 1);
+    commandBuffer->beginQuery(queryPool.getHandle(), mQuery, 0);
+}
+
+void QueryHelper::endQueryImpl(ContextVk *contextVk, CommandBuffer *commandBuffer)
+{
+    commandBuffer->endQuery(getQueryPool().getHandle(), mQuery);
+
+    // Query results are available after endQuery, retain this query so that we get its serial
+    // updated which is used to indicate that query results are (or will be) available.
+    retain(&contextVk->getResourceUseList());
 }
 
 angle::Result QueryHelper::beginQuery(ContextVk *contextVk)
@@ -2456,11 +2459,10 @@
         ANGLE_TRY(contextVk->flushCommandsAndEndRenderPass());
     }
 
-    vk::CommandBuffer *commandBuffer;
+    CommandBuffer *commandBuffer;
     ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer({}, &commandBuffer));
-    const QueryPool &queryPool = getQueryPool();
-    commandBuffer->resetQueryPool(queryPool.getHandle(), mQuery, 1);
-    commandBuffer->beginQuery(queryPool.getHandle(), mQuery, 0);
+
+    beginQueryImpl(contextVk, commandBuffer, commandBuffer);
 
     return angle::Result::Continue;
 }
@@ -2472,31 +2474,30 @@
         ANGLE_TRY(contextVk->flushCommandsAndEndRenderPass());
     }
 
-    vk::CommandBuffer *commandBuffer;
+    CommandBuffer *commandBuffer;
     ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer({}, &commandBuffer));
-    commandBuffer->endQuery(getQueryPool().getHandle(), mQuery);
 
-    // Query results are available after endQuery, retain this query so that we get its serial
-    // updated which is used to indicate that query results are (or will be) available.
-    retain(&contextVk->getResourceUseList());
+    endQueryImpl(contextVk, commandBuffer);
 
     return angle::Result::Continue;
 }
 
-void QueryHelper::beginOcclusionQuery(ContextVk *contextVk, CommandBuffer *renderPassCommandBuffer)
+angle::Result QueryHelper::beginRenderPassQuery(ContextVk *contextVk)
 {
-    const QueryPool &queryPool = getQueryPool();
-    renderPassCommandBuffer->queueResetQueryPool(queryPool.getHandle(), mQuery, 1);
-    renderPassCommandBuffer->beginQuery(queryPool.getHandle(), mQuery, 0);
+    CommandBuffer *outsideRenderPassCommandBuffer;
+    ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer({}, &outsideRenderPassCommandBuffer));
+
+    CommandBuffer *renderPassCommandBuffer =
+        &contextVk->getStartedRenderPassCommands().getCommandBuffer();
+
+    beginQueryImpl(contextVk, outsideRenderPassCommandBuffer, renderPassCommandBuffer);
+
+    return angle::Result::Continue;
 }
 
-void QueryHelper::endOcclusionQuery(ContextVk *contextVk, CommandBuffer *renderPassCommandBuffer)
+void QueryHelper::endRenderPassQuery(ContextVk *contextVk)
 {
-    renderPassCommandBuffer->endQuery(getQueryPool().getHandle(), mQuery);
-
-    // Query results are available after endQuery, retain this query so that we get its serial
-    // updated which is used to indicate that query results are (or will be) available.
-    retain(&contextVk->getResourceUseList());
+    endQueryImpl(contextVk, &contextVk->getStartedRenderPassCommands().getCommandBuffer());
 }
 
 angle::Result QueryHelper::flushAndWriteTimestamp(ContextVk *contextVk)
@@ -2506,7 +2507,7 @@
         ANGLE_TRY(contextVk->flushCommandsAndEndRenderPass());
     }
 
-    vk::CommandBuffer *commandBuffer;
+    CommandBuffer *commandBuffer;
     ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer({}, &commandBuffer));
     writeTimestamp(contextVk, commandBuffer);
     return angle::Result::Continue;
@@ -2532,8 +2533,13 @@
     retain(&contextVk->getResourceUseList());
 }
 
+bool QueryHelper::hasSubmittedCommands() const
+{
+    return mUse.getSerial().valid();
+}
+
 angle::Result QueryHelper::getUint64ResultNonBlocking(ContextVk *contextVk,
-                                                      uint64_t *resultOut,
+                                                      QueryResult *resultOut,
                                                       bool *availableOut)
 {
     ASSERT(valid());
@@ -2541,12 +2547,13 @@
 
     // Ensure that we only wait if we have inserted a query in command buffer. Otherwise you will
     // wait forever and trigger GPU timeout.
-    if (mUse.getSerial().valid())
+    if (hasSubmittedCommands())
     {
         VkDevice device                     = contextVk->getDevice();
         constexpr VkQueryResultFlags kFlags = VK_QUERY_RESULT_64_BIT;
-        result = getQueryPool().getResults(device, mQuery, 1, sizeof(uint64_t), resultOut,
-                                           sizeof(uint64_t), kFlags);
+        result =
+            getQueryPool().getResults(device, mQuery, 1, resultOut->getDataSize(),
+                                      resultOut->getPointerToResults(), sizeof(uint64_t), kFlags);
     }
     else
     {
@@ -2567,15 +2574,16 @@
     return angle::Result::Continue;
 }
 
-angle::Result QueryHelper::getUint64Result(ContextVk *contextVk, uint64_t *resultOut)
+angle::Result QueryHelper::getUint64Result(ContextVk *contextVk, QueryResult *resultOut)
 {
     ASSERT(valid());
-    if (mUse.getSerial().valid())
+    if (hasSubmittedCommands())
     {
         VkDevice device                     = contextVk->getDevice();
         constexpr VkQueryResultFlags kFlags = VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WAIT_BIT;
-        ANGLE_VK_TRY(contextVk, getQueryPool().getResults(device, mQuery, 1, sizeof(uint64_t),
-                                                          resultOut, sizeof(uint64_t), kFlags));
+        ANGLE_VK_TRY(contextVk, getQueryPool().getResults(
+                                    device, mQuery, 1, resultOut->getDataSize(),
+                                    resultOut->getPointerToResults(), sizeof(uint64_t), kFlags));
     }
     else
     {
@@ -3223,7 +3231,8 @@
 
     Serial serial;
     ANGLE_TRY(renderer->queueSubmitOneOff(context, std::move(commandBuffer),
-                                          egl::ContextPriority::Medium, nullptr, &serial));
+                                          egl::ContextPriority::Medium, nullptr,
+                                          vk::SubmitPolicy::AllowDeferred, &serial));
 
     stagingBuffer.collectGarbage(renderer, serial);
     mUse.updateSerialOneOff(serial);
@@ -3255,11 +3264,11 @@
                                            uint32_t regionCount,
                                            const VkBufferCopy *copyRegions)
 {
-    vk::CommandBufferAccess access;
+    CommandBufferAccess access;
     access.onBufferTransferRead(srcBuffer);
     access.onBufferTransferWrite(this);
 
-    vk::CommandBuffer *commandBuffer;
+    CommandBuffer *commandBuffer;
     ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer));
 
     commandBuffer->copyBuffer(srcBuffer->getBuffer(), mBuffer, regionCount, copyRegions);
@@ -3761,7 +3770,8 @@
 
     Serial serial;
     ANGLE_TRY(renderer->queueSubmitOneOff(context, std::move(commandBuffer),
-                                          egl::ContextPriority::Medium, nullptr, &serial));
+                                          egl::ContextPriority::Medium, nullptr,
+                                          vk::SubmitPolicy::AllowDeferred, &serial));
 
     if (isCompressedFormat)
     {
@@ -3918,22 +3928,29 @@
         yuvConversionInfo.pNext      = nullptr;
         yuvConversionInfo.conversion = mYuvConversionSampler.get().getHandle();
         AddToPNextChain(&viewInfo, &yuvConversionInfo);
+
+        // VUID-VkImageViewCreateInfo-image-02399
+        // If image has an external format, format must be VK_FORMAT_UNDEFINED
+        if (mExternalFormat)
+        {
+            viewInfo.format = VK_FORMAT_UNDEFINED;
+        }
     }
     ANGLE_VK_TRY(context, imageViewOut->init(context->getDevice(), viewInfo));
     return angle::Result::Continue;
 }
 
-angle::Result ImageHelper::initAliasedLayerImageView(Context *context,
-                                                     gl::TextureType textureType,
-                                                     VkImageAspectFlags aspectMask,
-                                                     const gl::SwizzleState &swizzleMap,
-                                                     ImageView *imageViewOut,
-                                                     LevelIndex baseMipLevelVk,
-                                                     uint32_t levelCount,
-                                                     uint32_t baseArrayLayer,
-                                                     uint32_t layerCount,
-                                                     VkImageUsageFlags imageUsageFlags,
-                                                     VkFormat imageViewFormat) const
+angle::Result ImageHelper::initReinterpretedLayerImageView(Context *context,
+                                                           gl::TextureType textureType,
+                                                           VkImageAspectFlags aspectMask,
+                                                           const gl::SwizzleState &swizzleMap,
+                                                           ImageView *imageViewOut,
+                                                           LevelIndex baseMipLevelVk,
+                                                           uint32_t levelCount,
+                                                           uint32_t baseArrayLayer,
+                                                           uint32_t layerCount,
+                                                           VkImageUsageFlags imageUsageFlags,
+                                                           VkFormat imageViewFormat) const
 {
     VkImageViewUsageCreateInfo imageViewUsageCreateInfo = {};
     imageViewUsageCreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO;
@@ -4266,11 +4283,11 @@
     mCurrentQueueFamilyIndex = newQueueFamilyIndex;
 }
 
-template void ImageHelper::barrierImpl<rx::vk::priv::SecondaryCommandBuffer>(
+template void ImageHelper::barrierImpl<priv::SecondaryCommandBuffer>(
     VkImageAspectFlags aspectMask,
     ImageLayout newLayout,
     uint32_t newQueueFamilyIndex,
-    rx::vk::priv::SecondaryCommandBuffer *commandBuffer);
+    priv::SecondaryCommandBuffer *commandBuffer);
 
 bool ImageHelper::updateLayoutAndBarrier(VkImageAspectFlags aspectMask,
                                          ImageLayout newLayout,
@@ -4445,12 +4462,12 @@
 
 // static
 angle::Result ImageHelper::CopyImageSubData(const gl::Context *context,
-                                            vk::ImageHelper *srcImage,
+                                            ImageHelper *srcImage,
                                             GLint srcLevel,
                                             GLint srcX,
                                             GLint srcY,
                                             GLint srcZ,
-                                            vk::ImageHelper *dstImage,
+                                            ImageHelper *dstImage,
                                             GLint dstLevel,
                                             GLint dstX,
                                             GLint dstY,
@@ -4459,20 +4476,21 @@
                                             GLsizei srcHeight,
                                             GLsizei srcDepth)
 {
-    ContextVk *contextVk = vk::GetImpl(context);
+    ContextVk *contextVk = GetImpl(context);
 
-    const vk::Format &sourceVkFormat = srcImage->getFormat();
-    VkImageTiling srcTilingMode      = srcImage->getTilingMode();
-    const vk::Format &destVkFormat   = dstImage->getFormat();
-    VkImageTiling destTilingMode     = dstImage->getTilingMode();
+    const Format &sourceVkFormat = srcImage->getFormat();
+    VkImageTiling srcTilingMode  = srcImage->getTilingMode();
+    const Format &destVkFormat   = dstImage->getFormat();
+    VkImageTiling destTilingMode = dstImage->getTilingMode();
+
+    const gl::LevelIndex srcLevelGL = gl::LevelIndex(srcLevel);
+    const gl::LevelIndex dstLevelGL = gl::LevelIndex(dstLevel);
 
     if (CanCopyWithTransferForCopyImage(contextVk->getRenderer(), sourceVkFormat, srcTilingMode,
                                         destVkFormat, destTilingMode))
     {
-        bool isSrc3D                    = (srcImage->getType() == VK_IMAGE_TYPE_3D);
-        bool isDst3D                    = (dstImage->getType() == VK_IMAGE_TYPE_3D);
-        const gl::LevelIndex srcLevelGL = gl::LevelIndex(srcLevel);
-        const gl::LevelIndex dstLevelGL = gl::LevelIndex(dstLevel);
+        bool isSrc3D = srcImage->getType() == VK_IMAGE_TYPE_3D;
+        bool isDst3D = dstImage->getType() == VK_IMAGE_TYPE_3D;
 
         srcImage->retain(&contextVk->getResourceUseList());
         dstImage->retain(&contextVk->getResourceUseList());
@@ -4499,13 +4517,13 @@
         region.extent.height = srcHeight;
         region.extent.depth  = (isSrc3D || isDst3D) ? srcDepth : 1;
 
-        vk::CommandBufferAccess access;
+        CommandBufferAccess access;
         access.onImageTransferRead(VK_IMAGE_ASPECT_COLOR_BIT, srcImage);
         access.onImageTransferWrite(dstLevelGL, 1, region.dstSubresource.baseArrayLayer,
                                     region.dstSubresource.layerCount, VK_IMAGE_ASPECT_COLOR_BIT,
                                     dstImage);
 
-        vk::CommandBuffer *commandBuffer;
+        CommandBuffer *commandBuffer;
         ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer));
 
         ASSERT(srcImage->valid() && dstImage->valid());
@@ -4515,12 +4533,30 @@
         commandBuffer->copyImage(srcImage->getImage(), srcImage->getCurrentLayout(),
                                  dstImage->getImage(), dstImage->getCurrentLayout(), 1, &region);
     }
+    else if (!sourceVkFormat.intendedFormat().isBlock && !destVkFormat.intendedFormat().isBlock)
+    {
+        // The source and destination image formats may be using a fallback in the case of RGB
+        // images.  A compute shader is used in such a case to perform the copy.
+        UtilsVk &utilsVk = contextVk->getUtils();
+
+        UtilsVk::CopyImageBitsParameters params;
+        params.srcOffset[0]   = srcX;
+        params.srcOffset[1]   = srcY;
+        params.srcOffset[2]   = srcZ;
+        params.srcLevel       = srcLevelGL;
+        params.dstOffset[0]   = dstX;
+        params.dstOffset[1]   = dstY;
+        params.dstOffset[2]   = dstZ;
+        params.dstLevel       = dstLevelGL;
+        params.copyExtents[0] = srcWidth;
+        params.copyExtents[1] = srcHeight;
+        params.copyExtents[2] = srcDepth;
+
+        ANGLE_TRY(utilsVk.copyImageBits(contextVk, dstImage, srcImage, params));
+    }
     else
     {
-        // TODO (anglebug.com/5278) - implement fallback path
-        // There is a possibility for the underlying source and destination VK image formats to be
-        // incompatible. An example scenario would be if the source image (RGB8UI) falls back
-        // to an emulated format(RGBA8UI) but the destination image is natively supported(RGB8I).
+        // No support for emulated compressed formats.
         UNIMPLEMENTED();
         ANGLE_VK_CHECK(contextVk, false, VK_ERROR_FEATURE_NOT_PRESENT);
     }
@@ -4530,11 +4566,11 @@
 
 angle::Result ImageHelper::generateMipmapsWithBlit(ContextVk *contextVk, LevelIndex maxLevel)
 {
-    vk::CommandBufferAccess access;
+    CommandBufferAccess access;
     access.onImageTransferWrite(mBaseLevel + 1, maxLevel.get(), 0, mLayerCount,
                                 VK_IMAGE_ASPECT_COLOR_BIT, this);
 
-    vk::CommandBuffer *commandBuffer;
+    CommandBuffer *commandBuffer;
     ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer));
 
     // We are able to use blitImage since the image format we are using supports it.
@@ -5372,7 +5408,7 @@
     const gl::ImageIndex baseLevelIndex =
         gl::ImageIndex::Make2DArrayRange(mBaseLevel.get(), 0, mLayerCount);
     stageSubresourceUpdateFromImage(prevImage.release(), baseLevelIndex, gl::kOffsetZero,
-                                    getLevelExtents(vk::LevelIndex(0)), mImageType);
+                                    getLevelExtents(LevelIndex(0)), mImageType);
 }
 
 angle::Result ImageHelper::flushSingleSubresourceStagedUpdates(ContextVk *contextVk,
@@ -5488,10 +5524,10 @@
     // Start in TransferDst.  Don't yet mark any subresource as having defined contents; that is
     // done with fine granularity as updates are applied.  This is achieved by specifying a layer
     // that is outside the tracking range.
-    vk::CommandBufferAccess access;
+    CommandBufferAccess access;
     access.onImageTransferWrite(mBaseLevel, 1, kMaxContentDefinedLayerCount, 0, aspectFlags, this);
 
-    vk::CommandBuffer *commandBuffer;
+    CommandBuffer *commandBuffer;
     ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer));
 
     for (gl::LevelIndex updateMipLevelGL = levelGLStart; updateMipLevelGL < levelGLEnd;
@@ -5542,7 +5578,7 @@
 
             // The updates were holding gl::LevelIndex values so that they would not need
             // modification when the base level of the texture changes.  Now that the update is
-            // about to take effect, we need to change miplevel to vk::LevelIndex.
+            // about to take effect, we need to change miplevel to LevelIndex.
             if (update.updateSource == UpdateSource::Clear)
             {
                 update.clear.levelIndex = updateMipLevelVk.get();
@@ -5598,7 +5634,7 @@
                 BufferHelper *currentBuffer = bufferUpdate.bufferHelper;
                 ASSERT(currentBuffer && currentBuffer->valid());
 
-                vk::CommandBufferAccess bufferAccess;
+                CommandBufferAccess bufferAccess;
                 bufferAccess.onBufferTransferRead(currentBuffer);
                 ANGLE_TRY(
                     contextVk->getOutsideRenderPassCommandBuffer(bufferAccess, &commandBuffer));
@@ -5610,7 +5646,7 @@
             }
             else
             {
-                vk::CommandBufferAccess imageAccess;
+                CommandBufferAccess imageAccess;
                 imageAccess.onImageTransferRead(aspectFlags, update.image.image);
                 ANGLE_TRY(
                     contextVk->getOutsideRenderPassCommandBuffer(imageAccess, &commandBuffer));
@@ -5894,11 +5930,11 @@
         regions[1].imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
     }
 
-    vk::CommandBufferAccess access;
+    CommandBufferAccess access;
     access.onBufferTransferWrite(*bufferOut);
     access.onImageTransferRead(aspectFlags, this);
 
-    vk::CommandBuffer *commandBuffer;
+    CommandBuffer *commandBuffer;
     ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer));
 
     commandBuffer->copyImageToBuffer(mImage, getCurrentLayout(), bufferHandle, 1, regions);
@@ -6044,7 +6080,7 @@
     VkImageAspectFlags layoutChangeAspectFlags = src->getAspectFlags();
 
     // Note that although we're reading from the image, we need to update the layout below.
-    vk::CommandBufferAccess access;
+    CommandBufferAccess access;
     access.onImageTransferRead(layoutChangeAspectFlags, this);
     if (isMultisampled)
     {
@@ -6052,7 +6088,7 @@
                                     &resolvedImage.get());
     }
 
-    vk::CommandBuffer *commandBuffer;
+    CommandBuffer *commandBuffer;
     ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer));
 
     const angle::Format *readFormat = &mFormat->actualImageFormat();
@@ -6097,7 +6133,7 @@
 
         resolve(&resolvedImage.get(), resolveRegion, commandBuffer);
 
-        vk::CommandBufferAccess readAccess;
+        CommandBufferAccess readAccess;
         readAccess.onImageTransferRead(layoutChangeAspectFlags, &resolvedImage.get());
         ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(readAccess, &commandBuffer));
 
@@ -6604,7 +6640,7 @@
 
     if (!mPerLevelLinearReadImageViews[mCurrentMaxLevel.get()].valid())
     {
-        ANGLE_TRY(image.initAliasedLayerImageView(
+        ANGLE_TRY(image.initReinterpretedLayerImageView(
             contextVk, viewType, aspectFlags, readSwizzle,
             &mPerLevelLinearReadImageViews[mCurrentMaxLevel.get()], baseLevel, levelCount,
             baseLayer, layerCount, imageUsageFlags, linearFormat));
@@ -6612,7 +6648,7 @@
     if (srgbOverrideFormat != VK_FORMAT_UNDEFINED &&
         !mPerLevelSRGBReadImageViews[mCurrentMaxLevel.get()].valid())
     {
-        ANGLE_TRY(image.initAliasedLayerImageView(
+        ANGLE_TRY(image.initReinterpretedLayerImageView(
             contextVk, viewType, aspectFlags, readSwizzle,
             &mPerLevelSRGBReadImageViews[mCurrentMaxLevel.get()], baseLevel, levelCount, baseLayer,
             layerCount, imageUsageFlags, srgbOverrideFormat));
@@ -6628,7 +6664,7 @@
         if (!mPerLevelLinearFetchImageViews[mCurrentMaxLevel.get()].valid())
         {
 
-            ANGLE_TRY(image.initAliasedLayerImageView(
+            ANGLE_TRY(image.initReinterpretedLayerImageView(
                 contextVk, fetchType, aspectFlags, readSwizzle,
                 &mPerLevelLinearFetchImageViews[mCurrentMaxLevel.get()], baseLevel, levelCount,
                 baseLayer, layerCount, imageUsageFlags, linearFormat));
@@ -6636,7 +6672,7 @@
         if (srgbOverrideFormat != VK_FORMAT_UNDEFINED &&
             !mPerLevelSRGBFetchImageViews[mCurrentMaxLevel.get()].valid())
         {
-            ANGLE_TRY(image.initAliasedLayerImageView(
+            ANGLE_TRY(image.initReinterpretedLayerImageView(
                 contextVk, fetchType, aspectFlags, readSwizzle,
                 &mPerLevelSRGBFetchImageViews[mCurrentMaxLevel.get()], baseLevel, levelCount,
                 baseLayer, layerCount, imageUsageFlags, srgbOverrideFormat));
@@ -6645,7 +6681,7 @@
 
     if (!mPerLevelLinearCopyImageViews[mCurrentMaxLevel.get()].valid())
     {
-        ANGLE_TRY(image.initAliasedLayerImageView(
+        ANGLE_TRY(image.initReinterpretedLayerImageView(
             contextVk, fetchType, aspectFlags, formatSwizzle,
             &mPerLevelLinearCopyImageViews[mCurrentMaxLevel.get()], baseLevel, levelCount,
             baseLayer, layerCount, imageUsageFlags, linearFormat));
@@ -6653,7 +6689,7 @@
     if (srgbOverrideFormat != VK_FORMAT_UNDEFINED &&
         !mPerLevelSRGBCopyImageViews[mCurrentMaxLevel.get()].valid())
     {
-        ANGLE_TRY(image.initAliasedLayerImageView(
+        ANGLE_TRY(image.initReinterpretedLayerImageView(
             contextVk, fetchType, aspectFlags, formatSwizzle,
             &mPerLevelSRGBCopyImageViews[mCurrentMaxLevel.get()], baseLevel, levelCount, baseLayer,
             layerCount, imageUsageFlags, srgbOverrideFormat));
@@ -6685,9 +6721,9 @@
     }
 
     // Create the view.  Note that storage images are not affected by swizzle parameters.
-    return image.initAliasedLayerImageView(contextVk, viewType, image.getAspectFlags(),
-                                           gl::SwizzleState(), imageView, levelVk, 1, layer,
-                                           image.getLayerCount(), imageUsageFlags, vkImageFormat);
+    return image.initReinterpretedLayerImageView(
+        contextVk, viewType, image.getAspectFlags(), gl::SwizzleState(), imageView, levelVk, 1,
+        layer, image.getLayerCount(), imageUsageFlags, vkImageFormat);
 }
 
 angle::Result ImageViewHelper::getLevelLayerStorageImageView(ContextVk *contextVk,
@@ -6716,9 +6752,9 @@
 
     // Create the view.  Note that storage images are not affected by swizzle parameters.
     gl::TextureType viewType = Get2DTextureType(1, image.getSamples());
-    return image.initAliasedLayerImageView(contextVk, viewType, image.getAspectFlags(),
-                                           gl::SwizzleState(), imageView, levelVk, 1, layer, 1,
-                                           imageUsageFlags, vkImageFormat);
+    return image.initReinterpretedLayerImageView(contextVk, viewType, image.getAspectFlags(),
+                                                 gl::SwizzleState(), imageView, levelVk, 1, layer,
+                                                 1, imageUsageFlags, vkImageFormat);
 }
 
 angle::Result ImageViewHelper::getLevelLayerDrawImageView(ContextVk *contextVk,
@@ -6939,6 +6975,12 @@
         case sh::vk::SpecializationConstantId::SurfaceRotation:
             mSpecializationConstants.surfaceRotation = value;
             break;
+        case sh::vk::SpecializationConstantId::DrawableWidth:
+            mSpecializationConstants.drawableWidth = value;
+            break;
+        case sh::vk::SpecializationConstantId::DrawableHeight:
+            mSpecializationConstants.drawableHeight = value;
+            break;
         default:
             UNREACHABLE();
             break;
diff --git a/src/libANGLE/renderer/vulkan/vk_helpers.h b/src/libANGLE/renderer/vulkan/vk_helpers.h
index d5d638f..6b23def 100644
--- a/src/libANGLE/renderer/vulkan/vk_helpers.h
+++ b/src/libANGLE/renderer/vulkan/vk_helpers.h
@@ -59,6 +59,8 @@
 // currently active VkBuffer we keep it until it is no longer in use. We then mark it available
 // for future allocations in a free list.
 class BufferHelper;
+using BufferHelperPointerVector = std::vector<std::unique_ptr<BufferHelper>>;
+
 class DynamicBuffer : angle::NonCopyable
 {
   public:
@@ -127,7 +129,7 @@
     // This frees resources immediately.
     void destroy(RendererVk *renderer);
 
-    BufferHelper *getCurrentBuffer() const { return mBuffer; }
+    BufferHelper *getCurrentBuffer() const { return mBuffer.get(); }
 
     // **Accumulate** an alignment requirement.  A dynamic buffer is used as the staging buffer for
     // image uploads, which can contain updates to unrelated mips, possibly with different formats.
@@ -147,21 +149,19 @@
   private:
     void reset();
     angle::Result allocateNewBuffer(ContextVk *contextVk);
-    void releaseBufferListToRenderer(RendererVk *renderer, std::vector<BufferHelper *> *buffers);
-    void destroyBufferList(RendererVk *renderer, std::vector<BufferHelper *> *buffers);
 
     VkBufferUsageFlags mUsage;
     bool mHostVisible;
     size_t mInitialSize;
-    BufferHelper *mBuffer;
+    std::unique_ptr<BufferHelper> mBuffer;
     uint32_t mNextAllocationOffset;
     uint32_t mLastFlushOrInvalidateOffset;
     size_t mSize;
     size_t mAlignment;
     VkMemoryPropertyFlags mMemoryPropertyFlags;
 
-    std::vector<BufferHelper *> mInFlightBuffers;
-    std::vector<BufferHelper *> mBufferFreeList;
+    BufferHelperPointerVector mInFlightBuffers;
+    BufferHelperPointerVector mBufferFreeList;
 };
 
 // Based off of the DynamicBuffer class, DynamicShadowBuffer provides
@@ -380,8 +380,9 @@
 // another is created.  The query pools live permanently, but are recycled as indices get freed.
 
 // These are arbitrary default sizes for query pools.
-constexpr uint32_t kDefaultOcclusionQueryPoolSize = 64;
-constexpr uint32_t kDefaultTimestampQueryPoolSize = 64;
+constexpr uint32_t kDefaultOcclusionQueryPoolSize         = 64;
+constexpr uint32_t kDefaultTimestampQueryPoolSize         = 64;
+constexpr uint32_t kDefaultTransformFeedbackQueryPoolSize = 128;
 
 class QueryHelper;
 
@@ -406,6 +407,35 @@
     VkQueryType mQueryType;
 };
 
+// Stores the result of a Vulkan query call. XFB queries in particular store two result values.
+class QueryResult final
+{
+  public:
+    QueryResult(uint32_t intsPerResult) : mIntsPerResult(intsPerResult), mResults{} {}
+
+    void operator+=(const QueryResult &rhs)
+    {
+        mResults[0] += rhs.mResults[0];
+        mResults[1] += rhs.mResults[1];
+    }
+
+    size_t getDataSize() const { return mIntsPerResult * sizeof(uint64_t); }
+    uint64_t getResult(size_t index) const
+    {
+        ASSERT(index < mIntsPerResult);
+        return mResults[index];
+    }
+    uint64_t *getPointerToResults() { return mResults.data(); }
+
+    static constexpr size_t kDefaultResultIndex                      = 0;
+    static constexpr size_t kTransformFeedbackPrimitivesWrittenIndex = 0;
+    static constexpr size_t kPrimitivesGeneratedIndex                = 1;
+
+  private:
+    uint32_t mIntsPerResult;
+    std::array<uint64_t, 2> mResults;
+};
+
 // Queries in vulkan are identified by the query pool and an index for a query within that pool.
 // Unlike other pools, such as descriptor pools where an allocation returns an independent object
 // from the pool, the query allocations are not done through a Vulkan function and are only an
@@ -429,14 +459,12 @@
 
     bool valid() const { return mDynamicQueryPool != nullptr; }
 
+    // Begin/end queries.  These functions break the render pass.
     angle::Result beginQuery(ContextVk *contextVk);
     angle::Result endQuery(ContextVk *contextVk);
-
-    // for occlusion query
-    // Must resetQueryPool outside of RenderPass before beginning occlusion query.
-    void resetQueryPool(ContextVk *contextVk, CommandBuffer *outsideRenderPassCommandBuffer);
-    void beginOcclusionQuery(ContextVk *contextVk, CommandBuffer *renderPassCommandBuffer);
-    void endOcclusionQuery(ContextVk *contextVk, CommandBuffer *renderPassCommandBuffer);
+    // Begin/end queries within a started render pass.
+    angle::Result beginRenderPassQuery(ContextVk *contextVk);
+    void endRenderPassQuery(ContextVk *contextVk);
 
     angle::Result flushAndWriteTimestamp(ContextVk *contextVk);
     // When syncing gpu/cpu time, main thread accesses primary directly
@@ -444,10 +472,13 @@
     // All other timestamp accesses should be made on outsideRenderPassCommandBuffer
     void writeTimestamp(ContextVk *contextVk, CommandBuffer *outsideRenderPassCommandBuffer);
 
+    // Whether this query helper has generated and submitted any commands.
+    bool hasSubmittedCommands() const;
+
     angle::Result getUint64ResultNonBlocking(ContextVk *contextVk,
-                                             uint64_t *resultOut,
+                                             QueryResult *resultOut,
                                              bool *availableOut);
-    angle::Result getUint64Result(ContextVk *contextVk, uint64_t *resultOut);
+    angle::Result getUint64Result(ContextVk *contextVk, QueryResult *resultOut);
 
   private:
     friend class DynamicQueryPool;
@@ -457,6 +488,13 @@
         return mDynamicQueryPool->getQueryPool(mQueryPoolIndex);
     }
 
+    // Reset needs to always be done outside a render pass, which may be different from the
+    // passed-in command buffer (which could be the render pass').
+    void beginQueryImpl(ContextVk *contextVk,
+                        CommandBuffer *resetCommandBuffer,
+                        CommandBuffer *commandBuffer);
+    void endQueryImpl(ContextVk *contextVk, CommandBuffer *commandBuffer);
+
     const DynamicQueryPool *mDynamicQueryPool;
     size_t mQueryPoolIndex;
     uint32_t mQuery;
@@ -1014,7 +1052,7 @@
         return mRenderPassStarted;
     }
 
-    void onImageHelperRelease(const vk::ImageHelper *image);
+    void onImageHelperRelease(const ImageHelper *image);
 
     void beginRenderPass(const Framebuffer &framebuffer,
                          const gl::Rectangle &renderArea,
@@ -1110,8 +1148,8 @@
     void onDepthAccess(ResourceAccess access);
     void onStencilAccess(ResourceAccess access);
 
-    void updateRenderPassForResolve(vk::Framebuffer *newFramebuffer,
-                                    const vk::RenderPassDesc &renderPassDesc);
+    void updateRenderPassForResolve(Framebuffer *newFramebuffer,
+                                    const RenderPassDesc &renderPassDesc);
 
     bool hasDepthStencilWriteOrClear() const
     {
@@ -1267,9 +1305,9 @@
                                VkFormatFeatureFlags featureBits);
 
 bool CanCopyWithTransfer(RendererVk *renderer,
-                         const vk::Format &srcFormat,
+                         const Format &srcFormat,
                          VkImageTiling srcTilingMode,
-                         const vk::Format &destFormat,
+                         const Format &destFormat,
                          VkImageTiling destTilingMode);
 
 class ImageHelper final : public Resource, public angle::Subject
@@ -1339,17 +1377,17 @@
                                                uint32_t levelCount,
                                                uint32_t baseArrayLayer,
                                                uint32_t layerCount) const;
-    angle::Result initAliasedLayerImageView(Context *context,
-                                            gl::TextureType textureType,
-                                            VkImageAspectFlags aspectMask,
-                                            const gl::SwizzleState &swizzleMap,
-                                            ImageView *imageViewOut,
-                                            LevelIndex baseMipLevelVk,
-                                            uint32_t levelCount,
-                                            uint32_t baseArrayLayer,
-                                            uint32_t layerCount,
-                                            VkImageUsageFlags imageUsageFlags,
-                                            VkFormat imageViewFormat) const;
+    angle::Result initReinterpretedLayerImageView(Context *context,
+                                                  gl::TextureType textureType,
+                                                  VkImageAspectFlags aspectMask,
+                                                  const gl::SwizzleState &swizzleMap,
+                                                  ImageView *imageViewOut,
+                                                  LevelIndex baseMipLevelVk,
+                                                  uint32_t levelCount,
+                                                  uint32_t baseArrayLayer,
+                                                  uint32_t layerCount,
+                                                  VkImageUsageFlags imageUsageFlags,
+                                                  VkFormat imageViewFormat) const;
     angle::Result initImageView(Context *context,
                                 gl::TextureType textureType,
                                 VkImageAspectFlags aspectMask,
@@ -1446,12 +1484,12 @@
                      CommandBuffer *commandBuffer);
 
     static angle::Result CopyImageSubData(const gl::Context *context,
-                                          vk::ImageHelper *srcImage,
+                                          ImageHelper *srcImage,
                                           GLint srcLevel,
                                           GLint srcX,
                                           GLint srcY,
                                           GLint srcZ,
-                                          vk::ImageHelper *dstImage,
+                                          ImageHelper *dstImage,
                                           GLint dstLevel,
                                           GLint dstX,
                                           GLint dstY,
diff --git a/src/libANGLE/renderer/vulkan/vk_utils.cpp b/src/libANGLE/renderer/vulkan/vk_utils.cpp
index d4f9a00..7b177e8 100644
--- a/src/libANGLE/renderer/vulkan/vk_utils.cpp
+++ b/src/libANGLE/renderer/vulkan/vk_utils.cpp
@@ -437,8 +437,8 @@
     VkMemoryPropertyFlags requiredFlags =
         VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
 
-    RendererVk *renderer           = context->getRenderer();
-    const vk::Allocator &allocator = renderer->getAllocator();
+    RendererVk *renderer       = context->getRenderer();
+    const Allocator &allocator = renderer->getAllocator();
 
     uint32_t memoryTypeIndex = 0;
     ANGLE_VK_TRY(context,
@@ -451,8 +451,8 @@
     // invalid values ensures our testing doesn't assume zero-initialized memory.
     if (renderer->getFeatures().allocateNonZeroMemory.enabled)
     {
-        ANGLE_TRY(vk::InitMappableAllocation(context, allocator, &mAllocation, size,
-                                             kNonZeroInitValue, requiredFlags));
+        ANGLE_TRY(InitMappableAllocation(context, allocator, &mAllocation, size, kNonZeroInitValue,
+                                         requiredFlags));
     }
 
     return angle::Result::Continue;
@@ -466,18 +466,18 @@
 
 void StagingBuffer::collectGarbage(RendererVk *renderer, Serial serial)
 {
-    vk::GarbageList garbageList;
-    garbageList.emplace_back(vk::GetGarbage(&mBuffer));
-    garbageList.emplace_back(vk::GetGarbage(&mAllocation));
+    GarbageList garbageList;
+    garbageList.emplace_back(GetGarbage(&mBuffer));
+    garbageList.emplace_back(GetGarbage(&mAllocation));
 
-    vk::SharedResourceUse sharedUse;
+    SharedResourceUse sharedUse;
     sharedUse.init();
     sharedUse.updateSerialOneOff(serial);
     renderer->collectGarbage(std::move(sharedUse), std::move(garbageList));
 }
 
 angle::Result InitMappableAllocation(Context *context,
-                                     const vk::Allocator &allocator,
+                                     const Allocator &allocator,
                                      Allocation *allocation,
                                      VkDeviceSize size,
                                      int value,
@@ -524,7 +524,7 @@
     return angle::Result::Continue;
 }
 
-angle::Result AllocateBufferMemory(vk::Context *context,
+angle::Result AllocateBufferMemory(Context *context,
                                    VkMemoryPropertyFlags requestedMemoryPropertyFlags,
                                    VkMemoryPropertyFlags *memoryPropertyFlagsOut,
                                    const void *extraAllocationInfo,
@@ -537,7 +537,7 @@
                                        deviceMemoryOut, sizeOut);
 }
 
-angle::Result AllocateImageMemory(vk::Context *context,
+angle::Result AllocateImageMemory(Context *context,
                                   VkMemoryPropertyFlags memoryPropertyFlags,
                                   VkMemoryPropertyFlags *memoryPropertyFlagsOut,
                                   const void *extraAllocationInfo,
@@ -549,7 +549,7 @@
                                        extraAllocationInfo, image, deviceMemoryOut, sizeOut);
 }
 
-angle::Result AllocateImageMemoryWithRequirements(vk::Context *context,
+angle::Result AllocateImageMemoryWithRequirements(Context *context,
                                                   VkMemoryPropertyFlags memoryPropertyFlags,
                                                   const VkMemoryRequirements &memoryRequirements,
                                                   const void *extraAllocationInfo,
@@ -562,7 +562,7 @@
                                               deviceMemoryOut);
 }
 
-angle::Result AllocateBufferMemoryWithRequirements(vk::Context *context,
+angle::Result AllocateBufferMemoryWithRequirements(Context *context,
                                                    VkMemoryPropertyFlags memoryPropertyFlags,
                                                    const VkMemoryRequirements &memoryRequirements,
                                                    const void *extraAllocationInfo,
@@ -1091,6 +1091,16 @@
             return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
         case gl::PrimitiveMode::LineLoop:
             return VK_PRIMITIVE_TOPOLOGY_LINE_STRIP;
+        case gl::PrimitiveMode::LinesAdjacency:
+            return VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY;
+        case gl::PrimitiveMode::LineStripAdjacency:
+            return VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY;
+        case gl::PrimitiveMode::TrianglesAdjacency:
+            return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY;
+        case gl::PrimitiveMode::TriangleStripAdjacency:
+            return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY;
+        case gl::PrimitiveMode::Patches:
+            return VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
         default:
             UNREACHABLE();
             return VK_PRIMITIVE_TOPOLOGY_POINT_LIST;
diff --git a/src/libANGLE/renderer/vulkan/vk_utils.h b/src/libANGLE/renderer/vulkan/vk_utils.h
index 988eb04..ed8531b 100644
--- a/src/libANGLE/renderer/vulkan/vk_utils.h
+++ b/src/libANGLE/renderer/vulkan/vk_utils.h
@@ -372,14 +372,14 @@
 };
 
 angle::Result InitMappableAllocation(Context *context,
-                                     const vk::Allocator &allocator,
+                                     const Allocator &allocator,
                                      Allocation *allocation,
                                      VkDeviceSize size,
                                      int value,
                                      VkMemoryPropertyFlags memoryPropertyFlags);
 
 angle::Result InitMappableDeviceMemory(Context *context,
-                                       vk::DeviceMemory *deviceMemory,
+                                       DeviceMemory *deviceMemory,
                                        VkDeviceSize size,
                                        int value,
                                        VkMemoryPropertyFlags memoryPropertyFlags);
@@ -407,7 +407,7 @@
                                                   Image *image,
                                                   DeviceMemory *deviceMemoryOut);
 
-angle::Result AllocateBufferMemoryWithRequirements(vk::Context *context,
+angle::Result AllocateBufferMemoryWithRequirements(Context *context,
                                                    VkMemoryPropertyFlags memoryPropertyFlags,
                                                    const VkMemoryRequirements &memoryRequirements,
                                                    const void *extraAllocationInfo,
@@ -607,6 +607,15 @@
         }
     }
 
+    void setUnreferenced(RefCounted<T> *refCounted)
+    {
+        ASSERT(!mRefCounted);
+        ASSERT(refCounted);
+
+        mRefCounted = refCounted;
+        mRefCounted->addRef();
+    }
+
     void assign(VkDevice device, T &&newObject)
     {
         set(device, new RefCounted<T>(std::move(newObject)));
@@ -614,6 +623,8 @@
 
     void copy(VkDevice device, const Shared<T> &other) { set(device, other.mRefCounted); }
 
+    void copyUnreferenced(const Shared<T> &other) { setUnreferenced(other.mRefCounted); }
+
     void reset(VkDevice device) { set(device, nullptr); }
 
     template <typename RecyclerT>
@@ -633,6 +644,23 @@
         }
     }
 
+    template <typename OnRelease>
+    void resetAndRelease(OnRelease *onRelease)
+    {
+        if (mRefCounted)
+        {
+            mRefCounted->releaseRef();
+            if (!mRefCounted->isReferenced())
+            {
+                ASSERT(mRefCounted->get().valid());
+                (*onRelease)(std::move(mRefCounted->get()));
+                SafeDelete(mRefCounted);
+            }
+
+            mRefCounted = nullptr;
+        }
+    }
+
     bool isReferenced() const
     {
         // If reference is zero, the object should have been deleted.  I.e. if the object is not
@@ -690,6 +718,8 @@
 {
     VkBool32 lineRasterEmulation;
     uint32_t surfaceRotation;
+    uint32_t drawableWidth;
+    uint32_t drawableHeight;
 };
 ANGLE_DISABLE_STRUCT_PADDING_WARNINGS
 
diff --git a/src/libANGLE/validationEGL.cpp b/src/libANGLE/validationEGL.cpp
index e781b80..4e87084 100644
--- a/src/libANGLE/validationEGL.cpp
+++ b/src/libANGLE/validationEGL.cpp
@@ -98,43 +98,50 @@
     return false;
 }
 
-Error ValidateStreamAttribute(const EGLAttrib attribute,
-                              const EGLAttrib value,
-                              const DisplayExtensions &extensions)
+bool ValidateStreamAttribute(const ValidationContext *val,
+                             const EGLAttrib attribute,
+                             const EGLAttrib value,
+                             const DisplayExtensions &extensions)
 {
     switch (attribute)
     {
         case EGL_STREAM_STATE_KHR:
         case EGL_PRODUCER_FRAME_KHR:
         case EGL_CONSUMER_FRAME_KHR:
-            return EglBadAccess() << "Attempt to initialize readonly parameter";
+            val->setError(EGL_BAD_ACCESS, "Attempt to initialize readonly parameter");
+            return false;
         case EGL_CONSUMER_LATENCY_USEC_KHR:
             // Technically not in spec but a latency < 0 makes no sense so we check it
             if (value < 0)
             {
-                return EglBadParameter() << "Latency must be positive";
+                val->setError(EGL_BAD_PARAMETER, "Latency must be positive");
+                return false;
             }
             break;
         case EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR:
             if (!extensions.streamConsumerGLTexture)
             {
-                return EglBadAttribute() << "Consumer GL extension not enabled";
+                val->setError(EGL_BAD_ATTRIBUTE, "Consumer GL extension not enabled");
+                return false;
             }
             // Again not in spec but it should be positive anyways
             if (value < 0)
             {
-                return EglBadParameter() << "Timeout must be positive";
+                val->setError(EGL_BAD_PARAMETER, "Timeout must be positive");
+                return false;
             }
             break;
         default:
-            return EglBadAttribute() << "Invalid stream attribute";
+            val->setError(EGL_BAD_ATTRIBUTE, "Invalid stream attribute");
+            return false;
     }
-    return NoError();
+    return true;
 }
 
-Error ValidateCreateImageMipLevelCommon(gl::Context *context,
-                                        const gl::Texture *texture,
-                                        EGLAttrib level)
+bool ValidateCreateImageMipLevelCommon(const ValidationContext *val,
+                                       const gl::Context *context,
+                                       const gl::Texture *texture,
+                                       EGLAttrib level)
 {
     // Note that the spec EGL_create_image spec does not explicitly specify an error
     // when the level is outside the base/max level range, but it does mention that the
@@ -145,20 +152,25 @@
         (!texture->isMipmapComplete() || static_cast<GLuint>(level) < effectiveBaseLevel ||
          static_cast<GLuint>(level) > texture->getTextureState().getMipmapMaxLevel()))
     {
-        return EglBadParameter() << "texture must be complete if level is non-zero.";
+        val->setError(EGL_BAD_PARAMETER, "texture must be complete if level is non-zero.");
+        return false;
     }
 
     if (level == 0 && !texture->isMipmapComplete() &&
         TextureHasNonZeroMipLevelsSpecified(context, texture))
     {
-        return EglBadParameter() << "if level is zero and the texture is incomplete, it must "
-                                    "have no mip levels specified except zero.";
+        val->setError(EGL_BAD_PARAMETER,
+                      "if level is zero and the texture is incomplete, it must "
+                      "have no mip levels specified except zero.");
+        return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateConfigAttribute(const Display *display, EGLAttrib attribute)
+bool ValidateConfigAttribute(const ValidationContext *val,
+                             const Display *display,
+                             EGLAttrib attribute)
 {
     switch (attribute)
     {
@@ -200,53 +212,64 @@
         case EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE:
             if (!display->getExtensions().surfaceOrientation)
             {
-                return EglBadAttribute() << "EGL_ANGLE_surface_orientation is not enabled.";
+                val->setError(EGL_BAD_ATTRIBUTE, "EGL_ANGLE_surface_orientation is not enabled.");
+                return false;
             }
             break;
 
         case EGL_COLOR_COMPONENT_TYPE_EXT:
             if (!display->getExtensions().pixelFormatFloat)
             {
-                return EglBadAttribute() << "EGL_EXT_pixel_format_float is not enabled.";
+                val->setError(EGL_BAD_ATTRIBUTE, "EGL_EXT_pixel_format_float is not enabled.");
+                return false;
             }
             break;
 
         case EGL_RECORDABLE_ANDROID:
             if (!display->getExtensions().recordable)
             {
-                return EglBadAttribute() << "EGL_ANDROID_recordable is not enabled.";
+                val->setError(EGL_BAD_ATTRIBUTE, "EGL_ANDROID_recordable is not enabled.");
+                return false;
             }
             break;
 
         case EGL_FRAMEBUFFER_TARGET_ANDROID:
             if (!display->getExtensions().framebufferTargetANDROID)
             {
-                return EglBadAttribute() << "EGL_ANDROID_framebuffer_target is not enabled.";
+                val->setError(EGL_BAD_ATTRIBUTE, "EGL_ANDROID_framebuffer_target is not enabled.");
+                return false;
             }
             break;
 
         case EGL_BIND_TO_TEXTURE_TARGET_ANGLE:
             if (!display->getExtensions().iosurfaceClientBuffer)
             {
-                return EglBadAttribute() << "EGL_ANGLE_iosurface_client_buffer is not enabled.";
+                val->setError(EGL_BAD_ATTRIBUTE,
+                              "EGL_ANGLE_iosurface_client_buffer is not enabled.");
+                return false;
             }
             break;
 
         case EGL_Y_INVERTED_NOK:
             if (!display->getExtensions().textureFromPixmapNOK)
             {
-                return EglBadAttribute() << "EGL_NOK_texture_from_pixmap is not enabled.";
+                val->setError(EGL_BAD_ATTRIBUTE, "EGL_NOK_texture_from_pixmap is not enabled.");
+                return false;
             }
             break;
 
         default:
-            return EglBadAttribute() << "Unknown attribute.";
+            val->setError(EGL_BAD_ATTRIBUTE, "Unknown attribute.");
+            return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateConfigAttributeValue(const Display *display, EGLAttrib attribute, EGLAttrib value)
+bool ValidateConfigAttributeValue(const ValidationContext *val,
+                                  const Display *display,
+                                  EGLAttrib attribute,
+                                  EGLAttrib value)
 {
     switch (attribute)
     {
@@ -260,7 +283,9 @@
                 case EGL_FALSE:
                     break;
                 default:
-                    return EglBadAttribute() << "EGL_bind_to_texture invalid attribute: " << value;
+                    val->setError(EGL_BAD_ATTRIBUTE, "EGL_bind_to_texture invalid attribute: 0x%X",
+                                  static_cast<uint32_t>(value));
+                    return false;
             }
             break;
 
@@ -273,8 +298,10 @@
                 case EGL_DONT_CARE:
                     break;
                 default:
-                    return EglBadAttribute()
-                           << "EGL_color_buffer_type invalid attribute: " << value;
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "EGL_color_buffer_type invalid attribute: 0x%X",
+                                  static_cast<uint32_t>(value));
+                    return false;
             }
             break;
 
@@ -286,8 +313,10 @@
                 case EGL_FALSE:
                     break;
                 default:
-                    return EglBadAttribute()
-                           << "EGL_native_renderable invalid attribute: " << value;
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "EGL_native_renderable invalid attribute: 0x%X",
+                                  static_cast<uint32_t>(value));
+                    return false;
             }
             break;
 
@@ -300,7 +329,9 @@
                 case EGL_DONT_CARE:
                     break;
                 default:
-                    return EglBadAttribute() << "EGL_transparent_type invalid attribute: " << value;
+                    val->setError(EGL_BAD_ATTRIBUTE, "EGL_transparent_type invalid attribute: 0x%X",
+                                  static_cast<uint32_t>(value));
+                    return false;
             }
             break;
 
@@ -312,8 +343,10 @@
                 case EGL_DONT_CARE:
                     break;
                 default:
-                    return EglBadAttribute()
-                           << "EGL_RECORDABLE_ANDROID invalid attribute: " << value;
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "EGL_RECORDABLE_ANDROID invalid attribute: 0x%X",
+                                  static_cast<uint32_t>(value));
+                    return false;
             }
             break;
 
@@ -325,8 +358,10 @@
                 case EGL_DONT_CARE:
                     break;
                 default:
-                    return EglBadAttribute()
-                           << "EGL_COLOR_COMPONENT_TYPE_EXT invalid attribute: " << value;
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "EGL_COLOR_COMPONENT_TYPE_EXT invalid attribute: 0x%X",
+                                  static_cast<uint32_t>(value));
+                    return false;
             }
             break;
 
@@ -334,21 +369,26 @@
             break;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateConfigAttributes(const Display *display, const AttributeMap &attributes)
+bool ValidateConfigAttributes(const ValidationContext *val,
+                              const Display *display,
+                              const AttributeMap &attributes)
 {
     for (const auto &attrib : attributes)
     {
-        ANGLE_TRY(ValidateConfigAttribute(display, attrib.first));
-        ANGLE_TRY(ValidateConfigAttributeValue(display, attrib.first, attrib.second));
+        ANGLE_VALIDATION_TRY(ValidateConfigAttribute(val, display, attrib.first));
+        ANGLE_VALIDATION_TRY(
+            ValidateConfigAttributeValue(val, display, attrib.first, attrib.second));
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateColorspaceAttribute(const DisplayExtensions &displayExtensions, EGLAttrib colorSpace)
+bool ValidateColorspaceAttribute(const ValidationContext *val,
+                                 const DisplayExtensions &displayExtensions,
+                                 EGLAttrib colorSpace)
 {
     switch (colorSpace)
     {
@@ -359,40 +399,50 @@
         case EGL_GL_COLORSPACE_DISPLAY_P3_LINEAR_EXT:
             if (!displayExtensions.glColorspaceDisplayP3Linear)
             {
-                return EglBadAttribute() << "EXT_gl_colorspace_display_p3_linear is not available.";
+                val->setError(EGL_BAD_ATTRIBUTE,
+                              "EXT_gl_colorspace_display_p3_linear is not available.");
+                return false;
             }
             break;
         case EGL_GL_COLORSPACE_DISPLAY_P3_EXT:
             if (!displayExtensions.glColorspaceDisplayP3)
             {
-                return EglBadAttribute() << "EXT_gl_colorspace_display_p3 is not available.";
+                val->setError(EGL_BAD_ATTRIBUTE, "EXT_gl_colorspace_display_p3 is not available.");
+                return false;
             }
             break;
         case EGL_GL_COLORSPACE_DISPLAY_P3_PASSTHROUGH_EXT:
             if (!displayExtensions.glColorspaceDisplayP3Passthrough)
             {
-                return EglBadAttribute()
-                       << "EGL_EXT_gl_colorspace_display_p3_passthrough is not available.";
+                val->setError(EGL_BAD_ATTRIBUTE,
+                              "EGL_EXT_gl_colorspace_display_p3_passthrough is not available.");
+                return false;
             }
             break;
         case EGL_GL_COLORSPACE_SCRGB_EXT:
             if (!displayExtensions.glColorspaceScrgb)
             {
-                return EglBadAttribute() << "EXT_gl_colorspace_scrgb is not available.";
+                val->setError(EGL_BAD_ATTRIBUTE, "EXT_gl_colorspace_scrgb is not available.");
+                return false;
             }
             break;
         case EGL_GL_COLORSPACE_SCRGB_LINEAR_EXT:
             if (!displayExtensions.glColorspaceScrgbLinear)
             {
-                return EglBadAttribute() << "EXT_gl_colorspace_scrgb_linear is not available.";
+                val->setError(EGL_BAD_ATTRIBUTE,
+                              "EXT_gl_colorspace_scrgb_linear is not available.");
+                return false;
             }
             break;
         default:
-            return EglBadAttribute();
+            val->setError(EGL_BAD_ATTRIBUTE);
+            return false;
     }
-    return NoError();
+    return true;
 }
-Error ValidatePlatformType(const ClientExtensions &clientExtensions, EGLAttrib platformType)
+bool ValidatePlatformType(const ValidationContext *val,
+                          const ClientExtensions &clientExtensions,
+                          EGLAttrib platformType)
 {
     switch (platformType)
     {
@@ -403,7 +453,8 @@
         case EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE:
             if (!clientExtensions.platformANGLED3D)
             {
-                return EglBadAttribute() << "Direct3D platform is unsupported.";
+                val->setError(EGL_BAD_ATTRIBUTE, "Direct3D platform is unsupported.");
+                return false;
             }
             break;
 
@@ -411,42 +462,49 @@
         case EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE:
             if (!clientExtensions.platformANGLEOpenGL)
             {
-                return EglBadAttribute() << "OpenGL platform is unsupported.";
+                val->setError(EGL_BAD_ATTRIBUTE, "OpenGL platform is unsupported.");
+                return false;
             }
             break;
 
         case EGL_PLATFORM_ANGLE_TYPE_NULL_ANGLE:
             if (!clientExtensions.platformANGLENULL)
             {
-                return EglBadAttribute() << "Display type EGL_PLATFORM_ANGLE_TYPE_NULL_ANGLE "
-                                            "requires EGL_ANGLE_platform_angle_null.";
+                val->setError(EGL_BAD_ATTRIBUTE,
+                              "Display type EGL_PLATFORM_ANGLE_TYPE_NULL_ANGLE "
+                              "requires EGL_ANGLE_platform_angle_null.");
+                return false;
             }
             break;
 
         case EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE:
             if (!clientExtensions.platformANGLEVulkan)
             {
-                return EglBadAttribute() << "Vulkan platform is unsupported.";
+                val->setError(EGL_BAD_ATTRIBUTE, "Vulkan platform is unsupported.");
+                return false;
             }
             break;
 
         case EGL_PLATFORM_ANGLE_TYPE_METAL_ANGLE:
             if (!clientExtensions.platformANGLEMetal)
             {
-                return EglBadAttribute() << "Metal platform is unsupported.";
+                val->setError(EGL_BAD_ATTRIBUTE, "Metal platform is unsupported.");
+                return false;
             }
             break;
 
         default:
-            return EglBadAttribute() << "Unknown platform type.";
+            val->setError(EGL_BAD_ATTRIBUTE, "Unknown platform type.");
+            return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateGetPlatformDisplayCommon(EGLenum platform,
-                                       void *native_display,
-                                       const AttributeMap &attribMap)
+bool ValidateGetPlatformDisplayCommon(const ValidationContext *val,
+                                      EGLenum platform,
+                                      const void *native_display,
+                                      const AttributeMap &attribMap)
 {
     const ClientExtensions &clientExtensions = Display::GetClientExtensions();
 
@@ -455,17 +513,20 @@
         case EGL_PLATFORM_ANGLE_ANGLE:
             if (!clientExtensions.platformANGLE)
             {
-                return EglBadParameter() << "Platform ANGLE extension is not active";
+                val->setError(EGL_BAD_PARAMETER, "Platform ANGLE extension is not active");
+                return false;
             }
             break;
         case EGL_PLATFORM_DEVICE_EXT:
             if (!clientExtensions.platformDevice)
             {
-                return EglBadParameter() << "Platform Device extension is not active";
+                val->setError(EGL_BAD_PARAMETER, "Platform Device extension is not active");
+                return false;
             }
             break;
         default:
-            return EglBadConfig() << "Bad platform type.";
+            val->setError(EGL_BAD_CONFIG, "Bad platform type.");
+            return false;
     }
 
     if (platform == EGL_PLATFORM_ANGLE_ANGLE)
@@ -489,7 +550,7 @@
             {
                 case EGL_PLATFORM_ANGLE_TYPE_ANGLE:
                 {
-                    ANGLE_TRY(ValidatePlatformType(clientExtensions, value));
+                    ANGLE_VALIDATION_TRY(ValidatePlatformType(val, clientExtensions, value));
                     platformType = value;
                     break;
                 }
@@ -515,7 +576,8 @@
                         case EGL_FALSE:
                             break;
                         default:
-                            return EglBadAttribute() << "Invalid automatic trim attribute";
+                            val->setError(EGL_BAD_ATTRIBUTE, "Invalid automatic trim attribute");
+                            return false;
                     }
                     enableAutoTrimSpecified = true;
                     break;
@@ -524,8 +586,9 @@
                     if (!clientExtensions.platformANGLED3D ||
                         !clientExtensions.platformANGLED3D11ON12)
                     {
-                        return EglBadAttribute()
-                               << "EGL_PLATFORM_ANGLE_D3D11ON12_ANGLE extension not active.";
+                        val->setError(EGL_BAD_ATTRIBUTE,
+                                      "EGL_PLATFORM_ANGLE_D3D11ON12_ANGLE extension not active.");
+                        return false;
                     }
 
                     switch (value)
@@ -534,7 +597,8 @@
                         case EGL_FALSE:
                             break;
                         default:
-                            return EglBadAttribute() << "Invalid D3D11on12 attribute";
+                            val->setError(EGL_BAD_ATTRIBUTE, "Invalid D3D11on12 attribute");
+                            return false;
                     }
                     enableD3D11on12 = true;
                     break;
@@ -542,8 +606,9 @@
                 case EGL_EXPERIMENTAL_PRESENT_PATH_ANGLE:
                     if (!clientExtensions.experimentalPresentPath)
                     {
-                        return EglBadAttribute()
-                               << "EGL_ANGLE_experimental_present_path extension not active";
+                        val->setError(EGL_BAD_ATTRIBUTE,
+                                      "EGL_ANGLE_experimental_present_path extension not active");
+                        return false;
                     }
 
                     switch (value)
@@ -552,8 +617,9 @@
                         case EGL_EXPERIMENTAL_PRESENT_PATH_COPY_ANGLE:
                             break;
                         default:
-                            return EglBadAttribute()
-                                   << "Invalid value for EGL_EXPERIMENTAL_PRESENT_PATH_ANGLE";
+                            val->setError(EGL_BAD_ATTRIBUTE,
+                                          "Invalid value for EGL_EXPERIMENTAL_PRESENT_PATH_ANGLE");
+                            return false;
                     }
                     presentPathSpecified = true;
                     break;
@@ -569,31 +635,38 @@
                         case EGL_PLATFORM_ANGLE_DEVICE_TYPE_D3D_REFERENCE_ANGLE:
                             if (!clientExtensions.platformANGLED3D)
                             {
-                                return EglBadAttribute()
-                                       << "EGL_ANGLE_platform_angle_d3d is not supported";
+                                val->setError(EGL_BAD_ATTRIBUTE,
+                                              "EGL_ANGLE_platform_angle_d3d is not supported");
+                                return false;
                             }
                             break;
 
                         case EGL_PLATFORM_ANGLE_DEVICE_TYPE_EGL_ANGLE:
                             if (!clientExtensions.platformANGLEDeviceTypeEGLANGLE)
                             {
-                                return EglBadAttribute() << "EGL_ANGLE_platform_angle_device_type_"
-                                                            "egl_angle is not supported";
+                                val->setError(EGL_BAD_ATTRIBUTE,
+                                              "EGL_ANGLE_platform_angle_device_type_"
+                                              "egl_angle is not supported");
+                                return false;
                             }
                             break;
 
                         case EGL_PLATFORM_ANGLE_DEVICE_TYPE_SWIFTSHADER_ANGLE:
                             if (!clientExtensions.platformANGLEDeviceTypeSwiftShader)
                             {
-                                return EglBadAttribute() << "EGL_ANGLE_platform_angle_device_type_"
-                                                            "swiftshader is not supported";
+                                val->setError(EGL_BAD_ATTRIBUTE,
+                                              "EGL_ANGLE_platform_angle_device_type_"
+                                              "swiftshader is not supported");
+                                return false;
                             }
                             break;
 
                         default:
-                            return EglBadAttribute() << "Invalid value for "
-                                                        "EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE "
-                                                        "attrib";
+                            val->setError(EGL_BAD_ATTRIBUTE,
+                                          "Invalid value for "
+                                          "EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE "
+                                          "attrib");
+                            return false;
                     }
                     deviceType = value;
                     break;
@@ -601,13 +674,17 @@
                 case EGL_PLATFORM_ANGLE_DEBUG_LAYERS_ENABLED_ANGLE:
                     if (!clientExtensions.platformANGLE)
                     {
-                        return EglBadAttribute() << "EGL_ANGLE_platform_angle extension not active";
+                        val->setError(EGL_BAD_ATTRIBUTE,
+                                      "EGL_ANGLE_platform_angle extension not active");
+                        return false;
                     }
                     if (value != EGL_TRUE && value != EGL_FALSE && value != EGL_DONT_CARE)
                     {
-                        return EglBadAttribute() << "EGL_PLATFORM_ANGLE_DEBUG_LAYERS_ENABLED_ANGLE "
-                                                    "must be EGL_TRUE, EGL_FALSE, or "
-                                                    "EGL_DONT_CARE.";
+                        val->setError(EGL_BAD_ATTRIBUTE,
+                                      "EGL_PLATFORM_ANGLE_DEBUG_LAYERS_ENABLED_ANGLE "
+                                      "must be EGL_TRUE, EGL_FALSE, or "
+                                      "EGL_DONT_CARE.");
+                        return false;
                     }
                     break;
 
@@ -621,8 +698,10 @@
                 case EGL_PLATFORM_ANGLE_CONTEXT_VIRTUALIZATION_ANGLE:
                     if (!clientExtensions.platformANGLEContextVirtualization)
                     {
-                        return EglBadAttribute() << "EGL_ANGLE_platform_angle_context_"
-                                                    "virtualization extension not active";
+                        val->setError(EGL_BAD_ATTRIBUTE,
+                                      "EGL_ANGLE_platform_angle_context_"
+                                      "virtualization extension not active");
+                        return false;
                     }
 
                     switch (value)
@@ -633,9 +712,11 @@
                             break;
 
                         default:
-                            return EglBadAttribute() << "Invalid value for "
-                                                        "EGL_PLATFORM_ANGLE_CONTEXT_VIRTUALIZATION_"
-                                                        "ANGLE attrib";
+                            val->setError(EGL_BAD_ATTRIBUTE,
+                                          "Invalid value for "
+                                          "EGL_PLATFORM_ANGLE_CONTEXT_VIRTUALIZATION_"
+                                          "ANGLE attrib");
+                            return false;
                     }
                     break;
 
@@ -652,10 +733,11 @@
                         case EGL_TRUE:
                             break;
                         default:
-                            return EglBadAttribute()
-                                   << "Invalid value for "
-                                      "EGL_PLATFORM_ANGLE_DEVICE_CONTEXT_VOLATILE_"
-                                      "EAGL_ANGLE attrib";
+                            val->setError(EGL_BAD_ATTRIBUTE,
+                                          "Invalid value for "
+                                          "EGL_PLATFORM_ANGLE_DEVICE_CONTEXT_VOLATILE_"
+                                          "EAGL_ANGLE attrib");
+                            return false;
                     }
                     break;
                 case EGL_PLATFORM_ANGLE_DEVICE_CONTEXT_VOLATILE_CGL_ANGLE:
@@ -667,10 +749,11 @@
                         case EGL_TRUE:
                             break;
                         default:
-                            return EglBadAttribute()
-                                   << "Invalid value for "
-                                      "EGL_PLATFORM_ANGLE_DEVICE_CONTEXT_VOLATILE_"
-                                      "CGL_ANGLE attrib";
+                            val->setError(EGL_BAD_ATTRIBUTE,
+                                          "Invalid value for "
+                                          "EGL_PLATFORM_ANGLE_DEVICE_CONTEXT_VOLATILE_"
+                                          "CGL_ANGLE attrib");
+                            return false;
                     }
                     break;
                 default:
@@ -680,64 +763,79 @@
 
         if (!majorVersion.valid() && minorVersion.valid())
         {
-            return EglBadAttribute()
-                   << "Must specify major version if you specify a minor version.";
+            val->setError(EGL_BAD_ATTRIBUTE,
+                          "Must specify major version if you specify a minor version.");
+            return false;
         }
 
         if (deviceType == EGL_PLATFORM_ANGLE_DEVICE_TYPE_D3D_WARP_ANGLE &&
             platformType != EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE)
         {
-            return EglBadAttribute() << "EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE requires a "
-                                        "device type of EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE.";
+            val->setError(EGL_BAD_ATTRIBUTE,
+                          "EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE requires a "
+                          "device type of EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE.");
+            return false;
         }
 
         if (enableAutoTrimSpecified && platformType != EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE)
         {
-            return EglBadAttribute() << "EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE "
-                                        "requires a device type of "
-                                        "EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE.";
+            val->setError(EGL_BAD_ATTRIBUTE,
+                          "EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE "
+                          "requires a device type of "
+                          "EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE.");
+            return false;
         }
 
         if (enableD3D11on12)
         {
             if (platformType != EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE)
             {
-                return EglBadAttribute() << "EGL_PLATFORM_ANGLE_D3D11ON12_ANGLE "
-                                            "requires a platform type of "
-                                            "EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE.";
+                val->setError(EGL_BAD_ATTRIBUTE,
+                              "EGL_PLATFORM_ANGLE_D3D11ON12_ANGLE "
+                              "requires a platform type of "
+                              "EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE.");
+                return false;
             }
 
             if (deviceType.valid() && deviceType != EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE &&
                 deviceType != EGL_PLATFORM_ANGLE_DEVICE_TYPE_D3D_WARP_ANGLE)
             {
-                return EglBadAttribute() << "EGL_PLATFORM_ANGLE_D3D11ON12_ANGLE requires a device "
-                                            "type of EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE "
-                                            "or EGL_PLATFORM_ANGLE_DEVICE_TYPE_D3D_WARP_ANGLE";
+                val->setError(EGL_BAD_ATTRIBUTE,
+                              "EGL_PLATFORM_ANGLE_D3D11ON12_ANGLE requires a device "
+                              "type of EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE "
+                              "or EGL_PLATFORM_ANGLE_DEVICE_TYPE_D3D_WARP_ANGLE");
+                return false;
             }
         }
 
         if (presentPathSpecified && platformType != EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE)
         {
-            return EglBadAttribute() << "EGL_EXPERIMENTAL_PRESENT_PATH_ANGLE requires a "
-                                        "device type of EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE.";
+            val->setError(EGL_BAD_ATTRIBUTE,
+                          "EGL_EXPERIMENTAL_PRESENT_PATH_ANGLE requires a "
+                          "device type of EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE.");
+            return false;
         }
 
         if (luidSpecified)
         {
             if (platformType != EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE)
             {
-                return EglBadAttribute() << "EGL_PLATFORM_ANGLE_D3D_LUID_HIGH_ANGLE and "
-                                            "EGL_PLATFORM_ANGLE_D3D_LUID_LOW_ANGLE "
-                                            "require a platform type of "
-                                            "EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE.";
+                val->setError(EGL_BAD_ATTRIBUTE,
+                              "EGL_PLATFORM_ANGLE_D3D_LUID_HIGH_ANGLE and "
+                              "EGL_PLATFORM_ANGLE_D3D_LUID_LOW_ANGLE "
+                              "require a platform type of "
+                              "EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE.");
+                return false;
             }
 
             if (attribMap.get(EGL_PLATFORM_ANGLE_D3D_LUID_HIGH_ANGLE, 0) == 0 &&
                 attribMap.get(EGL_PLATFORM_ANGLE_D3D_LUID_LOW_ANGLE, 0) == 0)
             {
-                return EglBadAttribute() << "If either EGL_PLATFORM_ANGLE_D3D_LUID_HIGH_ANGLE "
-                                            "and/or EGL_PLATFORM_ANGLE_D3D_LUID_LOW_ANGLE are "
-                                            "specified, at least one must non-zero.";
+                val->setError(EGL_BAD_ATTRIBUTE,
+                              "If either EGL_PLATFORM_ANGLE_D3D_LUID_HIGH_ANGLE "
+                              "and/or EGL_PLATFORM_ANGLE_D3D_LUID_LOW_ANGLE are "
+                              "specified, at least one must non-zero.");
+                return false;
             }
         }
 
@@ -750,19 +848,21 @@
                     if (platformType != EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE &&
                         platformType != EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE)
                     {
-                        return EglBadAttribute()
-                               << "This device type requires a "
-                                  "platform type of EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE or "
-                                  "EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE.";
+                        val->setError(EGL_BAD_ATTRIBUTE,
+                                      "This device type requires a "
+                                      "platform type of EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE or "
+                                      "EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE.");
+                        return false;
                     }
                     break;
 
                 case EGL_PLATFORM_ANGLE_DEVICE_TYPE_SWIFTSHADER_ANGLE:
                     if (platformType != EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE)
                     {
-                        return EglBadAttribute()
-                               << "This device type requires a "
-                                  "platform type of EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE.";
+                        val->setError(EGL_BAD_ATTRIBUTE,
+                                      "This device type requires a "
+                                      "platform type of EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE.");
+                        return false;
                     }
                     break;
 
@@ -776,25 +876,31 @@
             if ((majorVersion.valid() && majorVersion.value() != 1) ||
                 (minorVersion.valid() && minorVersion.value() != 0))
             {
-                return EglBadAttribute() << "EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE currently "
-                                            "only supports Vulkan 1.0.";
+                val->setError(EGL_BAD_ATTRIBUTE,
+                              "EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE currently "
+                              "only supports Vulkan 1.0.");
+                return false;
             }
         }
 
         if (eglHandle.valid() && platformType != EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE &&
             platformType != EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE)
         {
-            return EglBadAttribute() << "EGL_PLATFORM_ANGLE_EGL_HANDLE_ANGLE requires a "
-                                        "device type of EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE.";
+            val->setError(EGL_BAD_ATTRIBUTE,
+                          "EGL_PLATFORM_ANGLE_EGL_HANDLE_ANGLE requires a "
+                          "device type of EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE.");
+            return false;
         }
     }
     else if (platform == EGL_PLATFORM_DEVICE_EXT)
     {
-        Device *eglDevice = static_cast<Device *>(native_display);
+        const Device *eglDevice = static_cast<const Device *>(native_display);
         if (eglDevice == nullptr || !Device::IsValidDevice(eglDevice))
         {
-            return EglBadAttribute() << "native_display should be a valid EGL device if "
-                                        "platform equals EGL_PLATFORM_DEVICE_EXT";
+            val->setError(EGL_BAD_ATTRIBUTE,
+                          "native_display should be a valid EGL device if "
+                          "platform equals EGL_PLATFORM_DEVICE_EXT");
+            return false;
         }
     }
     else
@@ -806,71 +912,82 @@
     {
         if (!clientExtensions.featureControlANGLE)
         {
-            return EglBadAttribute() << "EGL_ANGLE_feature_control is not supported";
+            val->setError(EGL_BAD_ATTRIBUTE, "EGL_ANGLE_feature_control is not supported");
+            return false;
         }
         else if (attribMap.get(EGL_FEATURE_OVERRIDES_ENABLED_ANGLE, 0) == 0)
         {
-            return EglBadAttribute()
-                   << "EGL_FEATURE_OVERRIDES_ENABLED_ANGLE must be a valid pointer";
+            val->setError(EGL_BAD_ATTRIBUTE,
+                          "EGL_FEATURE_OVERRIDES_ENABLED_ANGLE must be a valid pointer");
+            return false;
         }
     }
     if (attribMap.contains(EGL_FEATURE_OVERRIDES_DISABLED_ANGLE))
     {
         if (!clientExtensions.featureControlANGLE)
         {
-            return EglBadAttribute() << "EGL_ANGLE_feature_control is not supported";
+            val->setError(EGL_BAD_ATTRIBUTE, "EGL_ANGLE_feature_control is not supported");
+            return false;
         }
         else if (attribMap.get(EGL_FEATURE_OVERRIDES_DISABLED_ANGLE, 0) == 0)
         {
-            return EglBadAttribute()
-                   << "EGL_FEATURE_OVERRIDES_DISABLED_ANGLE must be a valid pointer";
+            val->setError(EGL_BAD_ATTRIBUTE,
+                          "EGL_FEATURE_OVERRIDES_DISABLED_ANGLE must be a valid pointer");
+            return false;
         }
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateStream(const Display *display, const Stream *stream)
+bool ValidateStream(const ValidationContext *val, const Display *display, const Stream *stream)
 {
-    ANGLE_TRY(ValidateDisplay(display));
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
 
     const DisplayExtensions &displayExtensions = display->getExtensions();
     if (!displayExtensions.stream)
     {
-        return EglBadAccess() << "Stream extension not active";
+        val->setError(EGL_BAD_ACCESS, "Stream extension not active");
+        return false;
     }
 
     if (stream == EGL_NO_STREAM_KHR || !display->isValidStream(stream))
     {
-        return EglBadStream() << "Invalid stream";
+        val->setError(EGL_BAD_STREAM_KHR, "Invalid stream");
+        return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateLabeledObject(Thread *thread,
-                            const Display *display,
-                            ObjectType objectType,
-                            EGLObjectKHR object,
-                            LabeledObject **outLabeledObject)
+bool ValidateLabeledObject(const ValidationContext *val,
+                           const Display *display,
+                           ObjectType objectType,
+                           EGLObjectKHR object,
+                           LabeledObject **outLabeledObject)
 {
     switch (objectType)
     {
         case ObjectType::Context:
         {
             gl::Context *context = static_cast<gl::Context *>(object);
-            ANGLE_TRY(ValidateContext(display, context));
+            ANGLE_VALIDATION_TRY(ValidateContext(val, display, context));
             *outLabeledObject = context;
             break;
         }
 
         case ObjectType::Display:
         {
-            ANGLE_TRY(ValidateDisplay(display));
+            ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
             if (display != object)
             {
-                return EglBadParameter() << "when object type is EGL_OBJECT_DISPLAY_KHR, the "
-                                            "object must be the same as the display.";
+                if (val)
+                {
+                    val->setError(EGL_BAD_PARAMETER,
+                                  "when object type is EGL_OBJECT_DISPLAY_KHR, the "
+                                  "object must be the same as the display.");
+                }
+                return false;
             }
 
             *outLabeledObject = static_cast<Display *>(object);
@@ -880,7 +997,7 @@
         case ObjectType::Image:
         {
             Image *image = static_cast<Image *>(object);
-            ANGLE_TRY(ValidateImage(display, image));
+            ANGLE_VALIDATION_TRY(ValidateImage(val, display, image));
             *outLabeledObject = image;
             break;
         }
@@ -888,7 +1005,7 @@
         case ObjectType::Stream:
         {
             Stream *stream = static_cast<Stream *>(object);
-            ANGLE_TRY(ValidateStream(display, stream));
+            ANGLE_VALIDATION_TRY(ValidateStream(val, display, stream));
             *outLabeledObject = stream;
             break;
         }
@@ -896,7 +1013,7 @@
         case ObjectType::Surface:
         {
             Surface *surface = static_cast<Surface *>(object);
-            ANGLE_TRY(ValidateSurface(display, surface));
+            ANGLE_VALIDATION_TRY(ValidateSurface(val, display, surface));
             *outLabeledObject = surface;
             break;
         }
@@ -904,38 +1021,51 @@
         case ObjectType::Sync:
         {
             Sync *sync = static_cast<Sync *>(object);
-            ANGLE_TRY(ValidateSync(display, sync));
+            ANGLE_VALIDATION_TRY(ValidateSync(val, display, sync));
             *outLabeledObject = sync;
             break;
         }
 
         case ObjectType::Thread:
         {
-            *outLabeledObject = thread;
+            ASSERT(val);
+            *outLabeledObject = val->eglThread;
             break;
         }
 
         default:
-            return EglBadParameter() << "unknown object type.";
+            if (val)
+            {
+                val->setError(EGL_BAD_PARAMETER, "unknown object type.");
+            }
+            return false;
     }
 
-    return NoError();
+    return true;
 }
 
 // This is a common sub-check of Display status that's shared by multiple functions
-Error ValidateDisplayPointer(const Display *display)
+bool ValidateDisplayPointer(const ValidationContext *val, const Display *display)
 {
     if (display == EGL_NO_DISPLAY)
     {
-        return EglBadDisplay() << "display is EGL_NO_DISPLAY.";
+        if (val)
+        {
+            val->setError(EGL_BAD_DISPLAY, "display is EGL_NO_DISPLAY.");
+        }
+        return false;
     }
 
     if (!Display::isValidDisplay(display))
     {
-        return EglBadDisplay() << "display is not a valid display.";
+        if (val)
+        {
+            val->setError(EGL_BAD_DISPLAY, "display is not a valid display.");
+        }
+        return false;
     }
 
-    return NoError();
+    return true;
 }
 
 bool ValidCompositorTimingName(CompositorTiming name)
@@ -972,98 +1102,442 @@
     }
 }
 
+bool ValidateCompatibleSurface(const ValidationContext *val,
+                               const Display *display,
+                               const gl::Context *context,
+                               const Surface *surface)
+{
+    const Config *contextConfig = context->getConfig();
+    const Config *surfaceConfig = surface->getConfig();
+
+    // Surface compatible with client API - only OPENGL_ES supported
+    switch (context->getClientMajorVersion())
+    {
+        case 1:
+            if (!(surfaceConfig->renderableType & EGL_OPENGL_ES_BIT))
+            {
+                val->setError(EGL_BAD_MATCH, "Surface not compatible with OpenGL ES 1.x.");
+                return false;
+            }
+            break;
+        case 2:
+            if (!(surfaceConfig->renderableType & EGL_OPENGL_ES2_BIT))
+            {
+                val->setError(EGL_BAD_MATCH, "Surface not compatible with OpenGL ES 2.x.");
+                return false;
+            }
+            break;
+        case 3:
+            if (!(surfaceConfig->renderableType & (EGL_OPENGL_ES2_BIT | EGL_OPENGL_ES3_BIT)))
+            {
+                val->setError(EGL_BAD_MATCH, "Surface not compatible with OpenGL ES 3.x.");
+                return false;
+            }
+            break;
+        default:
+            val->setError(EGL_BAD_MATCH, "Surface not compatible with Context API.");
+            return false;
+    }
+
+    // EGL KHR no config context
+    if (context->getConfig() == EGL_NO_CONFIG_KHR)
+    {
+        const DisplayExtensions &displayExtensions = display->getExtensions();
+        if (displayExtensions.noConfigContext)
+        {
+            return true;
+        }
+        val->setError(EGL_BAD_MATCH, "Context with no config is not supported.");
+        return false;
+    }
+
+    if (!surface->flexibleSurfaceCompatibilityRequested())
+    {
+        // Config compatibility is defined in section 2.2 of the EGL 1.5 spec
+
+        bool colorBufferCompat = surfaceConfig->colorBufferType == contextConfig->colorBufferType;
+        if (!colorBufferCompat)
+        {
+            val->setError(EGL_BAD_MATCH, "Color buffer types are not compatible.");
+            return false;
+        }
+
+        bool colorCompat = surfaceConfig->redSize == contextConfig->redSize &&
+                           surfaceConfig->greenSize == contextConfig->greenSize &&
+                           surfaceConfig->blueSize == contextConfig->blueSize &&
+                           surfaceConfig->alphaSize == contextConfig->alphaSize &&
+                           surfaceConfig->luminanceSize == contextConfig->luminanceSize;
+        if (!colorCompat)
+        {
+            val->setError(EGL_BAD_MATCH, "Color buffer sizes are not compatible.");
+            return false;
+        }
+
+        bool componentTypeCompat =
+            surfaceConfig->colorComponentType == contextConfig->colorComponentType;
+        if (!componentTypeCompat)
+        {
+            val->setError(EGL_BAD_MATCH, "Color buffer component types are not compatible.");
+            return false;
+        }
+
+        bool dsCompat = surfaceConfig->depthSize == contextConfig->depthSize &&
+                        surfaceConfig->stencilSize == contextConfig->stencilSize;
+        if (!dsCompat)
+        {
+            val->setError(EGL_BAD_MATCH, "Depth-stencil buffer types are not compatible.");
+            return false;
+        }
+    }
+
+    bool surfaceTypeCompat = (surfaceConfig->surfaceType & contextConfig->surfaceType) != 0;
+    if (!surfaceTypeCompat)
+    {
+        val->setError(EGL_BAD_MATCH, "Surface type is not compatible.");
+        return false;
+    }
+
+    return true;
+}
+
+bool ValidateCreateSyncBase(const ValidationContext *val,
+                            const Display *display,
+                            EGLenum type,
+                            const AttributeMap &attribs,
+                            bool isExt)
+{
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
+
+    gl::Context *currentContext  = val->eglThread->getContext();
+    egl::Display *currentDisplay = currentContext ? currentContext->getDisplay() : nullptr;
+
+    switch (type)
+    {
+        case EGL_SYNC_FENCE_KHR:
+            if (!attribs.isEmpty())
+            {
+                val->setError(EGL_BAD_ATTRIBUTE, "Invalid attribute");
+                return false;
+            }
+
+            if (!display->getExtensions().fenceSync)
+            {
+                val->setError(EGL_BAD_MATCH, "EGL_KHR_fence_sync extension is not available");
+                return false;
+            }
+
+            if (display != currentDisplay)
+            {
+                val->setError(EGL_BAD_MATCH,
+                              "CreateSync can only be called on the current display");
+                return false;
+            }
+
+            ANGLE_VALIDATION_TRY(ValidateContext(val, currentDisplay, currentContext));
+
+            if (!currentContext->getExtensions().eglSyncOES)
+            {
+                val->setError(EGL_BAD_MATCH,
+                              "EGL_SYNC_FENCE_KHR cannot be used without "
+                              "GL_OES_EGL_sync support.");
+                return false;
+            }
+            break;
+
+        case EGL_SYNC_NATIVE_FENCE_ANDROID:
+            if (!display->getExtensions().fenceSync)
+            {
+                val->setError(EGL_BAD_MATCH, "EGL_KHR_fence_sync extension is not available");
+                return false;
+            }
+
+            if (!display->getExtensions().nativeFenceSyncANDROID)
+            {
+                val->setError(EGL_BAD_DISPLAY,
+                              "EGL_ANDROID_native_fence_sync extension is not available.");
+                return false;
+            }
+
+            if (display != currentDisplay)
+            {
+                val->setError(EGL_BAD_MATCH,
+                              "CreateSync can only be called on the current display");
+                return false;
+            }
+
+            ANGLE_VALIDATION_TRY(ValidateContext(val, currentDisplay, currentContext));
+
+            if (!currentContext->getExtensions().eglSyncOES)
+            {
+                val->setError(EGL_BAD_MATCH,
+                              "EGL_SYNC_FENCE_KHR cannot be used without "
+                              "GL_OES_EGL_sync support.");
+                return false;
+            }
+
+            for (const auto &attributeIter : attribs)
+            {
+                EGLAttrib attribute = attributeIter.first;
+
+                switch (attribute)
+                {
+                    case EGL_SYNC_NATIVE_FENCE_FD_ANDROID:
+                        break;
+
+                    default:
+                        val->setError(EGL_BAD_ATTRIBUTE, "Invalid attribute");
+                        return false;
+                }
+            }
+            break;
+
+        case EGL_SYNC_REUSABLE_KHR:
+            if (!attribs.isEmpty())
+            {
+                val->setError(EGL_BAD_ATTRIBUTE, "Invalid attribute");
+                return false;
+            }
+
+            if (!display->getExtensions().reusableSyncKHR)
+            {
+                val->setError(EGL_BAD_MATCH, "EGL_KHR_reusable_sync extension is not available.");
+                return false;
+            }
+            break;
+
+        default:
+            if (isExt)
+            {
+                val->setError(EGL_BAD_ATTRIBUTE, "Invalid type parameter");
+                return false;
+            }
+            else
+            {
+                val->setError(EGL_BAD_PARAMETER, "Invalid type parameter");
+                return false;
+            }
+    }
+
+    return true;
+}
+
+bool ValidateGetSyncAttribBase(const ValidationContext *val,
+                               const Display *display,
+                               const Sync *sync,
+                               EGLint attribute)
+{
+    ANGLE_VALIDATION_TRY(ValidateSync(val, display, sync));
+
+    switch (attribute)
+    {
+        case EGL_SYNC_CONDITION_KHR:
+            switch (sync->getType())
+            {
+                case EGL_SYNC_FENCE_KHR:
+                case EGL_SYNC_NATIVE_FENCE_ANDROID:
+                    break;
+
+                default:
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "EGL_SYNC_CONDITION_KHR is not valid for this sync type.");
+                    return false;
+            }
+            break;
+
+        // The following attributes are accepted by all types
+        case EGL_SYNC_TYPE_KHR:
+        case EGL_SYNC_STATUS_KHR:
+            break;
+
+        default:
+            val->setError(EGL_BAD_ATTRIBUTE, "Invalid attribute");
+            return false;
+    }
+
+    return true;
+}
+
+bool ValidateQueryDisplayAttribBase(const ValidationContext *val,
+                                    const Display *display,
+                                    const EGLint attribute)
+{
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
+
+    switch (attribute)
+    {
+        case EGL_DEVICE_EXT:
+            if (!Display::GetClientExtensions().deviceQueryEXT)
+            {
+                val->setError(EGL_BAD_DISPLAY, "EGL_EXT_device_query extension is not available.");
+                return false;
+            }
+            break;
+
+        case EGL_FEATURE_COUNT_ANGLE:
+            if (!Display::GetClientExtensions().featureControlANGLE)
+            {
+                val->setError(EGL_BAD_DISPLAY,
+                              "EGL_ANGLE_feature_control extension is not available.");
+                return false;
+            }
+            break;
+
+        default:
+            val->setError(EGL_BAD_ATTRIBUTE, "attribute is not valid.");
+            return false;
+    }
+
+    return true;
+}
 }  // anonymous namespace
 
-Error ValidateDisplay(const Display *display)
+void ValidationContext::setError(EGLint error) const
 {
-    ANGLE_TRY(ValidateDisplayPointer(display));
+    eglThread->setError(error, entryPoint, labeledObject, nullptr);
+}
+
+void ValidationContext::setError(EGLint error, const char *message...) const
+{
+    ASSERT(message);
+
+    constexpr uint32_t kBufferSize = 1000;
+    char buffer[kBufferSize];
+
+    va_list args;
+    va_start(args, message);
+    vsnprintf(buffer, kBufferSize, message, args);
+
+    eglThread->setError(error, entryPoint, labeledObject, buffer);
+}
+
+bool ValidateDisplay(const ValidationContext *val, const Display *display)
+{
+    ANGLE_VALIDATION_TRY(ValidateDisplayPointer(val, display));
 
     if (!display->isInitialized())
     {
-        return EglNotInitialized() << "display is not initialized.";
+        if (val)
+        {
+            val->setError(EGL_NOT_INITIALIZED, "display is not initialized.");
+        }
+        return false;
     }
 
     if (display->isDeviceLost())
     {
-        return EglContextLost() << "display had a context loss";
+        if (val)
+        {
+            val->setError(EGL_CONTEXT_LOST, "display had a context loss");
+        }
+        return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateSurface(const Display *display, const Surface *surface)
+bool ValidateSurface(const ValidationContext *val, const Display *display, const Surface *surface)
 {
-    ANGLE_TRY(ValidateDisplay(display));
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
 
     if (!display->isValidSurface(surface))
     {
-        return EglBadSurface();
+        if (val)
+        {
+            val->setError(EGL_BAD_SURFACE);
+        }
+        return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateConfig(const Display *display, const Config *config)
+bool ValidateConfig(const ValidationContext *val, const Display *display, const Config *config)
 {
-    ANGLE_TRY(ValidateDisplay(display));
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
 
     if (!display->isValidConfig(config))
     {
-        return EglBadConfig();
+        if (val)
+        {
+            val->setError(EGL_BAD_CONFIG);
+        }
+        return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateContext(const Display *display, const gl::Context *context)
+bool ValidateContext(const ValidationContext *val,
+                     const Display *display,
+                     const gl::Context *context)
 {
-    ANGLE_TRY(ValidateDisplay(display));
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
 
     if (!display->isValidContext(context))
     {
-        return EglBadContext();
+        if (val)
+        {
+            val->setError(EGL_BAD_CONTEXT);
+        }
+        return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateImage(const Display *display, const Image *image)
+bool ValidateImage(const ValidationContext *val, const Display *display, const Image *image)
 {
-    ANGLE_TRY(ValidateDisplay(display));
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
 
     if (!display->isValidImage(image))
     {
-        return EglBadParameter() << "image is not valid.";
+        if (val)
+        {
+            val->setError(EGL_BAD_PARAMETER, "image is not valid.");
+        }
+        return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateDevice(const Device *device)
+bool ValidateDevice(const ValidationContext *val, const Device *device)
 {
     if (device == EGL_NO_DEVICE_EXT)
     {
-        return EglBadAccess() << "device is EGL_NO_DEVICE.";
+        if (val)
+        {
+            val->setError(EGL_BAD_ACCESS, "device is EGL_NO_DEVICE.");
+        }
+        return false;
     }
 
     if (!Device::IsValidDevice(device))
     {
-        return EglBadAccess() << "device is not valid.";
+        if (val)
+        {
+            val->setError(EGL_BAD_ACCESS, "device is not valid.");
+        }
+        return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateSync(const Display *display, const Sync *sync)
+bool ValidateSync(const ValidationContext *val, const Display *display, const Sync *sync)
 {
-    ANGLE_TRY(ValidateDisplay(display));
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
 
     if (!display->isValidSync(sync))
     {
-        return EglBadParameter() << "sync object is not valid.";
+        if (val)
+        {
+            val->setError(EGL_BAD_PARAMETER, "sync object is not valid.");
+        }
+        return false;
     }
 
-    return NoError();
+    return true;
 }
 
 const Thread *GetThreadIfValid(const Thread *thread)
@@ -1074,72 +1548,37 @@
 
 const Display *GetDisplayIfValid(const Display *display)
 {
-    if (ValidateDisplay(display).isError())
-    {
-        return nullptr;
-    }
-
-    return display;
+    return ValidateDisplay(nullptr, display) ? display : nullptr;
 }
 
 const Surface *GetSurfaceIfValid(const Display *display, const Surface *surface)
 {
-    if (ValidateSurface(display, surface).isError())
-    {
-        return nullptr;
-    }
-
-    return surface;
+    return ValidateSurface(nullptr, display, surface) ? surface : nullptr;
 }
 
 const Image *GetImageIfValid(const Display *display, const Image *image)
 {
-    if (ValidateImage(display, image).isError())
-    {
-        return nullptr;
-    }
-
-    return image;
+    return ValidateImage(nullptr, display, image) ? image : nullptr;
 }
 
 const Stream *GetStreamIfValid(const Display *display, const Stream *stream)
 {
-    if (ValidateStream(display, stream).isError())
-    {
-        return nullptr;
-    }
-
-    return stream;
+    return ValidateStream(nullptr, display, stream) ? stream : nullptr;
 }
 
 const gl::Context *GetContextIfValid(const Display *display, const gl::Context *context)
 {
-    if (ValidateContext(display, context).isError())
-    {
-        return nullptr;
-    }
-
-    return context;
+    return ValidateContext(nullptr, display, context) ? context : nullptr;
 }
 
 const Device *GetDeviceIfValid(const Device *device)
 {
-    if (ValidateDevice(device).isError())
-    {
-        return nullptr;
-    }
-
-    return device;
+    return ValidateDevice(nullptr, device) ? device : nullptr;
 }
 
 const Sync *GetSyncIfValid(const Display *display, const Sync *sync)
 {
-    if (ValidateSync(display, sync).isError())
-    {
-        return nullptr;
-    }
-
-    return sync;
+    return ValidateSync(nullptr, display, sync) ? sync : nullptr;
 }
 
 LabeledObject *GetLabeledObjectIfValid(Thread *thread,
@@ -1147,41 +1586,51 @@
                                        ObjectType objectType,
                                        EGLObjectKHR object)
 {
-    LabeledObject *labeledObject = nullptr;
-    if (ValidateLabeledObject(thread, display, objectType, object, &labeledObject).isError())
+    if (objectType == ObjectType::Thread)
     {
-        return nullptr;
+        return thread;
     }
 
-    return labeledObject;
+    LabeledObject *labeledObject = nullptr;
+    if (ValidateLabeledObject(nullptr, display, objectType, object, &labeledObject))
+    {
+        return labeledObject;
+    }
+
+    return nullptr;
 }
 
-Error ValidateInitialize(const Display *display)
+bool ValidateInitialize(const ValidationContext *val,
+                        const Display *display,
+                        const EGLint *major,
+                        const EGLint *minor)
 {
-    return ValidateDisplayPointer(display);
+    return ValidateDisplayPointer(val, display);
 }
 
-Error ValidateTerminate(const Display *display)
+bool ValidateTerminate(const ValidationContext *val, const Display *display)
 {
-    return ValidateDisplayPointer(display);
+    return ValidateDisplayPointer(val, display);
 }
 
-Error ValidateCreateContext(Display *display,
-                            Config *configuration,
-                            gl::Context *shareContext,
-                            const AttributeMap &attributes)
+bool ValidateCreateContext(const ValidationContext *val,
+                           const Display *display,
+                           const Config *configuration,
+                           const gl::Context *shareContext,
+                           const AttributeMap &attributes)
 {
     if (configuration)
     {
-        ANGLE_TRY(ValidateConfig(display, configuration));
+        ANGLE_VALIDATION_TRY(ValidateConfig(val, display, configuration));
     }
     else
     {
-        ANGLE_TRY(ValidateDisplay(display));
+        ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
         const DisplayExtensions &displayExtensions = display->getExtensions();
         if (!displayExtensions.noConfigContext)
         {
-            return EglBadConfig();
+            val->setError(EGL_BAD_CONFIG);
+            return false;
         }
     }
 
@@ -1215,28 +1664,33 @@
 
             case EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR:
                 // Only valid for OpenGL (non-ES) contexts
-                return EglBadAttribute();
+                val->setError(EGL_BAD_ATTRIBUTE);
+                return false;
 
             case EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT:
                 if (!display->getExtensions().createContextRobustness)
                 {
-                    return EglBadAttribute();
+                    val->setError(EGL_BAD_ATTRIBUTE);
+                    return false;
                 }
                 if (value != EGL_TRUE && value != EGL_FALSE)
                 {
-                    return EglBadAttribute();
+                    val->setError(EGL_BAD_ATTRIBUTE);
+                    return false;
                 }
                 break;
 
             case EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR:
-                return EglBadAttribute()
-                       << "EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR is not"
-                       << " valid for GLES with EGL 1.4 and KHR_create_context. Use"
-                       << " EXT_create_context_robustness.";
+                val->setError(EGL_BAD_ATTRIBUTE,
+                              "EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR is not"
+                              " valid for GLES with EGL 1.4 and KHR_create_context. Use"
+                              " EXT_create_context_robustness.");
+                return false;
             case EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT:
                 if (!display->getExtensions().createContextRobustness)
                 {
-                    return EglBadAttribute();
+                    val->setError(EGL_BAD_ATTRIBUTE);
+                    return false;
                 }
                 if (value == EGL_LOSE_CONTEXT_ON_RESET_EXT)
                 {
@@ -1244,182 +1698,222 @@
                 }
                 else if (value != EGL_NO_RESET_NOTIFICATION_EXT)
                 {
-                    return EglBadAttribute();
+                    val->setError(EGL_BAD_ATTRIBUTE);
+                    return false;
                 }
                 break;
 
             case EGL_CONTEXT_OPENGL_NO_ERROR_KHR:
                 if (!display->getExtensions().createContextNoError)
                 {
-                    return EglBadAttribute() << "Invalid Context attribute.";
+                    val->setError(EGL_BAD_ATTRIBUTE, "Invalid Context attribute.");
+                    return false;
                 }
                 if (value != EGL_TRUE && value != EGL_FALSE)
                 {
-                    return EglBadAttribute() << "Attribute must be EGL_TRUE or EGL_FALSE.";
+                    val->setError(EGL_BAD_ATTRIBUTE, "Attribute must be EGL_TRUE or EGL_FALSE.");
+                    return false;
                 }
                 break;
 
             case EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE:
                 if (!display->getExtensions().createContextWebGLCompatibility)
                 {
-                    return EglBadAttribute() << "Attribute "
-                                                "EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE requires "
-                                                "EGL_ANGLE_create_context_webgl_compatibility.";
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "Attribute "
+                                  "EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE requires "
+                                  "EGL_ANGLE_create_context_webgl_compatibility.");
+                    return false;
                 }
                 if (value != EGL_TRUE && value != EGL_FALSE)
                 {
-                    return EglBadAttribute() << "EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE must be "
-                                                "EGL_TRUE or EGL_FALSE.";
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE must be "
+                                  "EGL_TRUE or EGL_FALSE.");
+                    return false;
                 }
                 break;
 
             case EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM:
                 if (!display->getExtensions().createContextBindGeneratesResource)
                 {
-                    return EglBadAttribute()
-                           << "Attribute EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM requires "
-                              "EGL_CHROMIUM_create_context_bind_generates_resource.";
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "Attribute EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM requires "
+                                  "EGL_CHROMIUM_create_context_bind_generates_resource.");
+                    return false;
                 }
                 if (value != EGL_TRUE && value != EGL_FALSE)
                 {
-                    return EglBadAttribute() << "EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM "
-                                                "must be EGL_TRUE or EGL_FALSE.";
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM "
+                                  "must be EGL_TRUE or EGL_FALSE.");
+                    return false;
                 }
                 break;
 
             case EGL_DISPLAY_TEXTURE_SHARE_GROUP_ANGLE:
                 if (!display->getExtensions().displayTextureShareGroup)
                 {
-                    return EglBadAttribute() << "Attribute "
-                                                "EGL_DISPLAY_TEXTURE_SHARE_GROUP_ANGLE requires "
-                                                "EGL_ANGLE_display_texture_share_group.";
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "Attribute "
+                                  "EGL_DISPLAY_TEXTURE_SHARE_GROUP_ANGLE requires "
+                                  "EGL_ANGLE_display_texture_share_group.");
+                    return false;
                 }
                 if (value != EGL_TRUE && value != EGL_FALSE)
                 {
-                    return EglBadAttribute() << "EGL_DISPLAY_TEXTURE_SHARE_GROUP_ANGLE must be "
-                                                "EGL_TRUE or EGL_FALSE.";
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "EGL_DISPLAY_TEXTURE_SHARE_GROUP_ANGLE must be "
+                                  "EGL_TRUE or EGL_FALSE.");
+                    return false;
                 }
                 if (shareContext &&
                     (shareContext->usingDisplayTextureShareGroup() != (value == EGL_TRUE)))
                 {
-                    return EglBadAttribute() << "All contexts within a share group must be "
-                                                "created with the same value of "
-                                                "EGL_DISPLAY_TEXTURE_SHARE_GROUP_ANGLE.";
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "All contexts within a share group must be "
+                                  "created with the same value of "
+                                  "EGL_DISPLAY_TEXTURE_SHARE_GROUP_ANGLE.");
+                    return false;
                 }
                 break;
 
             case EGL_DISPLAY_SEMAPHORE_SHARE_GROUP_ANGLE:
                 if (!display->getExtensions().displayTextureShareGroup)
                 {
-                    return EglBadAttribute() << "Attribute "
-                                                "EGL_DISPLAY_SEMAPHORE_SHARE_GROUP_ANGLE requires "
-                                                "EGL_ANGLE_display_semaphore_share_group.";
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "Attribute "
+                                  "EGL_DISPLAY_SEMAPHORE_SHARE_GROUP_ANGLE requires "
+                                  "EGL_ANGLE_display_semaphore_share_group.");
+                    return false;
                 }
                 if (value != EGL_TRUE && value != EGL_FALSE)
                 {
-                    return EglBadAttribute() << "EGL_DISPLAY_SEMAPHORE_SHARE_GROUP_ANGLE must be "
-                                                "EGL_TRUE or EGL_FALSE.";
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "EGL_DISPLAY_SEMAPHORE_SHARE_GROUP_ANGLE must be "
+                                  "EGL_TRUE or EGL_FALSE.");
+                    return false;
                 }
                 if (shareContext &&
                     (shareContext->usingDisplaySemaphoreShareGroup() != (value == EGL_TRUE)))
                 {
-                    return EglBadAttribute() << "All contexts within a share group must be "
-                                                "created with the same value of "
-                                                "EGL_DISPLAY_SEMAPHORE_SHARE_GROUP_ANGLE.";
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "All contexts within a share group must be "
+                                  "created with the same value of "
+                                  "EGL_DISPLAY_SEMAPHORE_SHARE_GROUP_ANGLE.");
+                    return false;
                 }
                 break;
 
             case EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE:
                 if (!display->getExtensions().createContextClientArrays)
                 {
-                    return EglBadAttribute()
-                           << "Attribute EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE requires "
-                              "EGL_ANGLE_create_context_client_arrays.";
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "Attribute EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE requires "
+                                  "EGL_ANGLE_create_context_client_arrays.");
+                    return false;
                 }
                 if (value != EGL_TRUE && value != EGL_FALSE)
                 {
-                    return EglBadAttribute() << "EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE must "
-                                                "be EGL_TRUE or EGL_FALSE.";
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE must "
+                                  "be EGL_TRUE or EGL_FALSE.");
+                    return false;
                 }
                 break;
 
             case EGL_CONTEXT_PROGRAM_BINARY_CACHE_ENABLED_ANGLE:
                 if (!display->getExtensions().programCacheControl)
                 {
-                    return EglBadAttribute()
-                           << "Attribute EGL_CONTEXT_PROGRAM_BINARY_CACHE_ENABLED_ANGLE "
-                              "requires EGL_ANGLE_program_cache_control.";
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "Attribute EGL_CONTEXT_PROGRAM_BINARY_CACHE_ENABLED_ANGLE "
+                                  "requires EGL_ANGLE_program_cache_control.");
+                    return false;
                 }
                 if (value != EGL_TRUE && value != EGL_FALSE)
                 {
-                    return EglBadAttribute()
-                           << "EGL_CONTEXT_PROGRAM_BINARY_CACHE_ENABLED_ANGLE must "
-                              "be EGL_TRUE or EGL_FALSE.";
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "EGL_CONTEXT_PROGRAM_BINARY_CACHE_ENABLED_ANGLE must "
+                                  "be EGL_TRUE or EGL_FALSE.");
+                    return false;
                 }
                 break;
 
             case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
                 if (!display->getExtensions().robustResourceInitialization)
                 {
-                    return EglBadAttribute()
-                           << "Attribute EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE "
-                              "requires EGL_ANGLE_robust_resource_initialization.";
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "Attribute EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE "
+                                  "requires EGL_ANGLE_robust_resource_initialization.");
+                    return false;
                 }
                 if (value != EGL_TRUE && value != EGL_FALSE)
                 {
-                    return EglBadAttribute() << "EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE must be "
-                                                "either EGL_TRUE or EGL_FALSE.";
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE must be "
+                                  "either EGL_TRUE or EGL_FALSE.");
+                    return false;
                 }
                 break;
 
             case EGL_EXTENSIONS_ENABLED_ANGLE:
                 if (!display->getExtensions().createContextExtensionsEnabled)
                 {
-                    return EglBadAttribute()
-                           << "Attribute EGL_EXTENSIONS_ENABLED_ANGLE "
-                              "requires EGL_ANGLE_create_context_extensions_enabled.";
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "Attribute EGL_EXTENSIONS_ENABLED_ANGLE "
+                                  "requires EGL_ANGLE_create_context_extensions_enabled.");
+                    return false;
                 }
                 if (value != EGL_TRUE && value != EGL_FALSE)
                 {
-                    return EglBadAttribute() << "EGL_EXTENSIONS_ENABLED_ANGLE must be "
-                                                "either EGL_TRUE or EGL_FALSE.";
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "EGL_EXTENSIONS_ENABLED_ANGLE must be "
+                                  "either EGL_TRUE or EGL_FALSE.");
+                    return false;
                 }
                 break;
 
             case EGL_POWER_PREFERENCE_ANGLE:
                 if (!display->getExtensions().powerPreference)
                 {
-                    return EglBadAttribute() << "Attribute EGL_POWER_PREFERENCE_ANGLE "
-                                                "requires EGL_ANGLE_power_preference.";
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "Attribute EGL_POWER_PREFERENCE_ANGLE "
+                                  "requires EGL_ANGLE_power_preference.");
+                    return false;
                 }
                 if (value != EGL_LOW_POWER_ANGLE && value != EGL_HIGH_POWER_ANGLE)
                 {
-                    return EglBadAttribute()
-                           << "EGL_POWER_PREFERENCE_ANGLE must be "
-                              "either EGL_LOW_POWER_ANGLE or EGL_HIGH_POWER_ANGLE.";
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "EGL_POWER_PREFERENCE_ANGLE must be "
+                                  "either EGL_LOW_POWER_ANGLE or EGL_HIGH_POWER_ANGLE.");
+                    return false;
                 }
                 break;
 
             case EGL_CONTEXT_OPENGL_BACKWARDS_COMPATIBLE_ANGLE:
                 if (!display->getExtensions().createContextBackwardsCompatible)
                 {
-                    return EglBadAttribute()
-                           << "Attribute EGL_CONTEXT_OPENGL_BACKWARDS_COMPATIBLE_ANGLE "
-                              "requires EGL_ANGLE_create_context_backwards_compatible.";
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "Attribute EGL_CONTEXT_OPENGL_BACKWARDS_COMPATIBLE_ANGLE "
+                                  "requires EGL_ANGLE_create_context_backwards_compatible.");
+                    return false;
                 }
                 if (value != EGL_TRUE && value != EGL_FALSE)
                 {
-                    return EglBadAttribute()
-                           << "EGL_CONTEXT_OPENGL_BACKWARDS_COMPATIBLE_ANGLE must be "
-                              "either EGL_TRUE or EGL_FALSE.";
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "EGL_CONTEXT_OPENGL_BACKWARDS_COMPATIBLE_ANGLE must be "
+                                  "either EGL_TRUE or EGL_FALSE.");
+                    return false;
                 }
                 break;
 
             case EGL_CONTEXT_PRIORITY_LEVEL_IMG:
                 if (!display->getExtensions().contextPriority)
                 {
-                    return EglBadAttribute() << "Attribute EGL_CONTEXT_PRIORITY_LEVEL_IMG requires "
-                                                "extension EGL_IMG_context_priority.";
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "Attribute EGL_CONTEXT_PRIORITY_LEVEL_IMG requires "
+                                  "extension EGL_IMG_context_priority.");
+                    return false;
                 }
                 switch (value)
                 {
@@ -1428,29 +1922,35 @@
                     case EGL_CONTEXT_PRIORITY_HIGH_IMG:
                         break;
                     default:
-                        return EglBadAttribute() << "Attribute EGL_CONTEXT_PRIORITY_LEVEL_IMG "
-                                                    "must be one of: EGL_CONTEXT_PRIORITY_LOW_IMG, "
-                                                    "EGL_CONTEXT_PRIORITY_MEDIUM_IMG, or "
-                                                    "EGL_CONTEXT_PRIORITY_HIGH_IMG.";
+                        val->setError(EGL_BAD_ATTRIBUTE,
+                                      "Attribute EGL_CONTEXT_PRIORITY_LEVEL_IMG "
+                                      "must be one of: EGL_CONTEXT_PRIORITY_LOW_IMG, "
+                                      "EGL_CONTEXT_PRIORITY_MEDIUM_IMG, or "
+                                      "EGL_CONTEXT_PRIORITY_HIGH_IMG.");
+                        return false;
                 }
                 break;
 
             case EGL_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV:
                 if (!display->getExtensions().robustnessVideoMemoryPurgeNV)
                 {
-                    return EglBadAttribute()
-                           << "Attribute EGL_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV requires "
-                              "extension EGL_NV_robustness_video_memory_purge.";
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "Attribute EGL_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV requires "
+                                  "extension EGL_NV_robustness_video_memory_purge.");
+                    return false;
                 }
                 if (value != EGL_TRUE && value != EGL_FALSE)
                 {
-                    return EglBadAttribute() << "EGL_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV must "
-                                                "be either EGL_TRUE or EGL_FALSE.";
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "EGL_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV must "
+                                  "be either EGL_TRUE or EGL_FALSE.");
+                    return false;
                 }
                 break;
 
             default:
-                return EglBadAttribute() << "Unknown attribute.";
+                val->setError(EGL_BAD_ATTRIBUTE, "Unknown attribute.");
+                return false;
         }
     }
 
@@ -1459,49 +1959,58 @@
         case 1:
             if (clientMinorVersion != 0 && clientMinorVersion != 1)
             {
-                return EglBadAttribute();
+                val->setError(EGL_BAD_ATTRIBUTE);
+                return false;
             }
             if (configuration == EGL_NO_CONFIG_KHR)
             {
-                return EglBadMatch();
+                val->setError(EGL_BAD_MATCH);
+                return false;
             }
             if ((configuration != EGL_NO_CONFIG_KHR) &&
                 !(configuration->renderableType & EGL_OPENGL_ES_BIT))
             {
-                return EglBadMatch();
+                val->setError(EGL_BAD_MATCH);
+                return false;
             }
             break;
 
         case 2:
             if (clientMinorVersion != 0)
             {
-                return EglBadAttribute();
+                val->setError(EGL_BAD_ATTRIBUTE);
+                return false;
             }
             if ((configuration != EGL_NO_CONFIG_KHR) &&
                 !(configuration->renderableType & EGL_OPENGL_ES2_BIT))
             {
-                return EglBadMatch();
+                val->setError(EGL_BAD_MATCH);
+                return false;
             }
             break;
         case 3:
             if (clientMinorVersion < 0 || clientMinorVersion > 2)
             {
-                return EglBadAttribute();
+                val->setError(EGL_BAD_ATTRIBUTE);
+                return false;
             }
             if ((configuration != EGL_NO_CONFIG_KHR) &&
                 !(configuration->renderableType & EGL_OPENGL_ES3_BIT))
             {
-                return EglBadMatch();
+                val->setError(EGL_BAD_MATCH);
+                return false;
             }
             if (display->getMaxSupportedESVersion() <
                 gl::Version(static_cast<GLuint>(clientMajorVersion),
                             static_cast<GLuint>(clientMinorVersion)))
             {
-                return EglBadAttribute() << "Requested GLES version is not supported.";
+                val->setError(EGL_BAD_ATTRIBUTE, "Requested GLES version is not supported.");
+                return false;
             }
             break;
         default:
-            return EglBadAttribute();
+            val->setError(EGL_BAD_ATTRIBUTE);
+            return false;
             break;
     }
 
@@ -1510,7 +2019,8 @@
         (EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR | EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR);
     if ((contextFlags & ~validContextFlags) != 0)
     {
-        return EglBadAttribute();
+        val->setError(EGL_BAD_ATTRIBUTE);
+        return false;
     }
 
     if (shareContext)
@@ -1518,28 +2028,32 @@
         // Shared context is invalid or is owned by another display
         if (!display->isValidContext(shareContext))
         {
-            return EglBadMatch();
+            val->setError(EGL_BAD_MATCH);
+            return false;
         }
 
         if (shareContext->isResetNotificationEnabled() != resetNotification)
         {
-            return EglBadMatch();
+            val->setError(EGL_BAD_MATCH);
+            return false;
         }
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateCreateWindowSurface(Display *display,
-                                  Config *config,
-                                  EGLNativeWindowType window,
-                                  const AttributeMap &attributes)
+bool ValidateCreateWindowSurface(const ValidationContext *val,
+                                 const Display *display,
+                                 const Config *config,
+                                 EGLNativeWindowType window,
+                                 const AttributeMap &attributes)
 {
-    ANGLE_TRY(ValidateConfig(display, config));
+    ANGLE_VALIDATION_TRY(ValidateConfig(val, display, config));
 
     if (!display->isValidNativeWindow(window))
     {
-        return EglBadNativeWindow();
+        val->setError(EGL_BAD_NATIVE_WINDOW);
+        return false;
     }
 
     const DisplayExtensions &displayExtensions = display->getExtensions();
@@ -1558,23 +2072,27 @@
                     case EGL_BACK_BUFFER:
                         break;
                     case EGL_SINGLE_BUFFER:
-                        return EglBadMatch();  // Rendering directly to front buffer not supported
+                        val->setError(EGL_BAD_MATCH);
+                        return false;  // Rendering directly to front buffer not supported
                     default:
-                        return EglBadAttribute();
+                        val->setError(EGL_BAD_ATTRIBUTE);
+                        return false;
                 }
                 break;
 
             case EGL_POST_SUB_BUFFER_SUPPORTED_NV:
                 if (!displayExtensions.postSubBuffer)
                 {
-                    return EglBadAttribute();
+                    val->setError(EGL_BAD_ATTRIBUTE);
+                    return false;
                 }
                 break;
 
             case EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE:
                 if (!displayExtensions.flexibleSurfaceCompatibility)
                 {
-                    return EglBadAttribute();
+                    val->setError(EGL_BAD_ATTRIBUTE);
+                    return false;
                 }
                 break;
 
@@ -1582,83 +2100,101 @@
             case EGL_HEIGHT:
                 if (!displayExtensions.windowFixedSize)
                 {
-                    return EglBadAttribute();
+                    val->setError(EGL_BAD_ATTRIBUTE);
+                    return false;
                 }
                 if (value < 0)
                 {
-                    return EglBadParameter();
+                    val->setError(EGL_BAD_PARAMETER);
+                    return false;
                 }
                 break;
 
             case EGL_FIXED_SIZE_ANGLE:
                 if (!displayExtensions.windowFixedSize)
                 {
-                    return EglBadAttribute();
+                    val->setError(EGL_BAD_ATTRIBUTE);
+                    return false;
                 }
                 break;
 
             case EGL_SURFACE_ORIENTATION_ANGLE:
                 if (!displayExtensions.surfaceOrientation)
                 {
-                    return EglBadAttribute() << "EGL_ANGLE_surface_orientation is not enabled.";
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "EGL_ANGLE_surface_orientation is not enabled.");
+                    return false;
                 }
                 break;
 
             case EGL_VG_COLORSPACE:
-                return EglBadMatch();
+                val->setError(EGL_BAD_MATCH);
+                return false;
 
             case EGL_GL_COLORSPACE:
-                ANGLE_TRY(ValidateColorspaceAttribute(displayExtensions, value));
+                ANGLE_VALIDATION_TRY(ValidateColorspaceAttribute(val, displayExtensions, value));
                 break;
 
             case EGL_VG_ALPHA_FORMAT:
-                return EglBadMatch();
+                val->setError(EGL_BAD_MATCH);
+                return false;
 
             case EGL_DIRECT_COMPOSITION_ANGLE:
                 if (!displayExtensions.directComposition)
                 {
-                    return EglBadAttribute();
+                    val->setError(EGL_BAD_ATTRIBUTE);
+                    return false;
                 }
                 break;
 
             case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
                 if (!display->getExtensions().robustResourceInitialization)
                 {
-                    return EglBadAttribute()
-                           << "Attribute EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE "
-                              "requires EGL_ANGLE_robust_resource_initialization.";
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "Attribute EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE "
+                                  "requires EGL_ANGLE_robust_resource_initialization.");
+                    return false;
                 }
                 if (value != EGL_TRUE && value != EGL_FALSE)
                 {
-                    return EglBadAttribute() << "EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE must be "
-                                                "either EGL_TRUE or EGL_FALSE.";
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE must be "
+                                  "either EGL_TRUE or EGL_FALSE.");
+                    return false;
                 }
                 break;
 
             case EGL_GGP_STREAM_DESCRIPTOR_ANGLE:
                 if (!display->getExtensions().ggpStreamDescriptor)
                 {
-                    return EglBadAttribute() << "EGL_GGP_STREAM_DESCRIPTOR_ANGLE requires "
-                                                "EGL_ANGLE_ggp_stream_descriptor.";
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "EGL_GGP_STREAM_DESCRIPTOR_ANGLE requires "
+                                  "EGL_ANGLE_ggp_stream_descriptor.");
+                    return false;
                 }
                 break;
 
             default:
-                return EglBadAttribute();
+                val->setError(EGL_BAD_ATTRIBUTE);
+                return false;
         }
     }
 
     if (Display::hasExistingWindowSurface(window))
     {
-        return EglBadAlloc();
+        val->setError(EGL_BAD_ALLOC);
+        return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateCreatePbufferSurface(Display *display, Config *config, const AttributeMap &attributes)
+bool ValidateCreatePbufferSurface(const ValidationContext *val,
+                                  const Display *display,
+                                  const Config *config,
+                                  const AttributeMap &attributes)
 {
-    ANGLE_TRY(ValidateConfig(display, config));
+    ANGLE_VALIDATION_TRY(ValidateConfig(val, display, config));
 
     const DisplayExtensions &displayExtensions = display->getExtensions();
 
@@ -1674,7 +2210,8 @@
             case EGL_HEIGHT:
                 if (value < 0)
                 {
-                    return EglBadParameter();
+                    val->setError(EGL_BAD_PARAMETER);
+                    return false;
                 }
                 break;
 
@@ -1689,7 +2226,8 @@
                     case EGL_TEXTURE_RGBA:
                         break;
                     default:
-                        return EglBadAttribute();
+                        val->setError(EGL_BAD_ATTRIBUTE);
+                        return false;
                 }
                 break;
 
@@ -1700,7 +2238,8 @@
                     case EGL_TEXTURE_2D:
                         break;
                     default:
-                        return EglBadAttribute();
+                        val->setError(EGL_BAD_ATTRIBUTE);
+                        return false;
                 }
                 break;
 
@@ -1711,7 +2250,7 @@
                 break;
 
             case EGL_GL_COLORSPACE:
-                ANGLE_TRY(ValidateColorspaceAttribute(displayExtensions, value));
+                ANGLE_VALIDATION_TRY(ValidateColorspaceAttribute(val, displayExtensions, value));
                 break;
 
             case EGL_VG_ALPHA_FORMAT:
@@ -1720,34 +2259,41 @@
             case EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE:
                 if (!displayExtensions.flexibleSurfaceCompatibility)
                 {
-                    return EglBadAttribute()
-                           << "EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE cannot be used "
-                              "without EGL_ANGLE_flexible_surface_compatibility support.";
+                    val->setError(
+                        EGL_BAD_ATTRIBUTE,
+                        "EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE cannot be used "
+                        "without EGL_ANGLE_flexible_surface_compatibility support.");
+                    return false;
                 }
                 break;
 
             case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
                 if (!display->getExtensions().robustResourceInitialization)
                 {
-                    return EglBadAttribute()
-                           << "Attribute EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE "
-                              "requires EGL_ANGLE_robust_resource_initialization.";
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "Attribute EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE "
+                                  "requires EGL_ANGLE_robust_resource_initialization.");
+                    return false;
                 }
                 if (value != EGL_TRUE && value != EGL_FALSE)
                 {
-                    return EglBadAttribute() << "EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE must be "
-                                                "either EGL_TRUE or EGL_FALSE.";
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE must be "
+                                  "either EGL_TRUE or EGL_FALSE.");
+                    return false;
                 }
                 break;
 
             default:
-                return EglBadAttribute();
+                val->setError(EGL_BAD_ATTRIBUTE);
+                return false;
         }
     }
 
     if (!(config->surfaceType & EGL_PBUFFER_BIT))
     {
-        return EglBadMatch();
+        val->setError(EGL_BAD_MATCH);
+        return false;
     }
 
     const Caps &caps = display->getCaps();
@@ -1758,13 +2304,15 @@
     if ((textureFormat != EGL_NO_TEXTURE && textureTarget == EGL_NO_TEXTURE) ||
         (textureFormat == EGL_NO_TEXTURE && textureTarget != EGL_NO_TEXTURE))
     {
-        return EglBadMatch();
+        val->setError(EGL_BAD_MATCH);
+        return false;
     }
 
     if ((textureFormat == EGL_TEXTURE_RGB && config->bindToTextureRGB != EGL_TRUE) ||
         (textureFormat == EGL_TEXTURE_RGBA && config->bindToTextureRGBA != EGL_TRUE))
     {
-        return EglBadAttribute();
+        val->setError(EGL_BAD_ATTRIBUTE);
+        return false;
     }
 
     EGLint width  = static_cast<EGLint>(attributes.get(EGL_WIDTH, 0));
@@ -1772,19 +2320,21 @@
     if (textureFormat != EGL_NO_TEXTURE && !caps.textureNPOT &&
         (!gl::isPow2(width) || !gl::isPow2(height)))
     {
-        return EglBadMatch();
+        val->setError(EGL_BAD_MATCH);
+        return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateCreatePbufferFromClientBuffer(Display *display,
-                                            EGLenum buftype,
-                                            EGLClientBuffer buffer,
-                                            Config *config,
-                                            const AttributeMap &attributes)
+bool ValidateCreatePbufferFromClientBuffer(const ValidationContext *val,
+                                           const Display *display,
+                                           EGLenum buftype,
+                                           EGLClientBuffer buffer,
+                                           const Config *config,
+                                           const AttributeMap &attributes)
 {
-    ANGLE_TRY(ValidateConfig(display, config));
+    ANGLE_VALIDATION_TRY(ValidateConfig(val, display, config));
 
     const DisplayExtensions &displayExtensions = display->getExtensions();
 
@@ -1793,39 +2343,47 @@
         case EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE:
             if (!displayExtensions.d3dShareHandleClientBuffer)
             {
-                return EglBadParameter();
+                val->setError(EGL_BAD_PARAMETER);
+                return false;
             }
             if (buffer == nullptr)
             {
-                return EglBadParameter();
+                val->setError(EGL_BAD_PARAMETER);
+                return false;
             }
             break;
 
         case EGL_D3D_TEXTURE_ANGLE:
             if (!displayExtensions.d3dTextureClientBuffer)
             {
-                return EglBadParameter();
+                val->setError(EGL_BAD_PARAMETER);
+                return false;
             }
             if (buffer == nullptr)
             {
-                return EglBadParameter();
+                val->setError(EGL_BAD_PARAMETER);
+                return false;
             }
             break;
 
         case EGL_IOSURFACE_ANGLE:
             if (!displayExtensions.iosurfaceClientBuffer)
             {
-                return EglBadParameter() << "<buftype> EGL_IOSURFACE_ANGLE requires the "
-                                            "EGL_ANGLE_iosurface_client_buffer extension.";
+                val->setError(EGL_BAD_PARAMETER,
+                              "<buftype> EGL_IOSURFACE_ANGLE requires the "
+                              "EGL_ANGLE_iosurface_client_buffer extension.");
+                return false;
             }
             if (buffer == nullptr)
             {
-                return EglBadParameter() << "<buffer> must be non null";
+                val->setError(EGL_BAD_PARAMETER, "<buffer> must be non null");
+                return false;
             }
             break;
 
         default:
-            return EglBadParameter();
+            val->setError(EGL_BAD_PARAMETER);
+            return false;
     }
 
     for (AttributeMap::const_iterator attributeIter = attributes.begin();
@@ -1841,12 +2399,14 @@
                 if (buftype != EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE &&
                     buftype != EGL_D3D_TEXTURE_ANGLE && buftype != EGL_IOSURFACE_ANGLE)
                 {
-                    return EglBadParameter()
-                           << "Width and Height are not supported for thie <buftype>";
+                    val->setError(EGL_BAD_PARAMETER,
+                                  "Width and Height are not supported for thie <buftype>");
+                    return false;
                 }
                 if (value < 0)
                 {
-                    return EglBadParameter() << "Width and Height must be positive";
+                    val->setError(EGL_BAD_PARAMETER, "Width and Height must be positive");
+                    return false;
                 }
                 break;
 
@@ -1858,7 +2418,8 @@
                     case EGL_TEXTURE_RGBA:
                         break;
                     default:
-                        return EglBadAttribute() << "Invalid value for EGL_TEXTURE_FORMAT";
+                        val->setError(EGL_BAD_ATTRIBUTE, "Invalid value for EGL_TEXTURE_FORMAT");
+                        return false;
                 }
                 break;
 
@@ -1871,13 +2432,15 @@
                     case EGL_TEXTURE_RECTANGLE_ANGLE:
                         if (buftype != EGL_IOSURFACE_ANGLE)
                         {
-                            return EglBadParameter()
-                                   << "<buftype> doesn't support rectangle texture targets";
+                            val->setError(EGL_BAD_PARAMETER,
+                                          "<buftype> doesn't support rectangle texture targets");
+                            return false;
                         }
                         break;
 
                     default:
-                        return EglBadAttribute() << "Invalid value for EGL_TEXTURE_TARGET";
+                        val->setError(EGL_BAD_ATTRIBUTE, "Invalid value for EGL_TEXTURE_TARGET");
+                        return false;
                 }
                 break;
 
@@ -1887,45 +2450,54 @@
             case EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE:
                 if (!displayExtensions.flexibleSurfaceCompatibility)
                 {
-                    return EglBadAttribute()
-                           << "EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE cannot be used "
-                              "without EGL_ANGLE_flexible_surface_compatibility support.";
+                    val->setError(
+                        EGL_BAD_ATTRIBUTE,
+                        "EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE cannot be used "
+                        "without EGL_ANGLE_flexible_surface_compatibility support.");
+                    return false;
                 }
                 break;
 
             case EGL_IOSURFACE_PLANE_ANGLE:
                 if (buftype != EGL_IOSURFACE_ANGLE)
                 {
-                    return EglBadAttribute() << "<buftype> doesn't support iosurface plane";
+                    val->setError(EGL_BAD_ATTRIBUTE, "<buftype> doesn't support iosurface plane");
+                    return false;
                 }
                 break;
 
             case EGL_TEXTURE_TYPE_ANGLE:
                 if (buftype != EGL_IOSURFACE_ANGLE)
                 {
-                    return EglBadAttribute() << "<buftype> doesn't support texture type";
+                    val->setError(EGL_BAD_ATTRIBUTE, "<buftype> doesn't support texture type");
+                    return false;
                 }
                 break;
 
             case EGL_TEXTURE_INTERNAL_FORMAT_ANGLE:
                 if (buftype != EGL_IOSURFACE_ANGLE && buftype != EGL_D3D_TEXTURE_ANGLE)
                 {
-                    return EglBadAttribute() << "<buftype> doesn't support texture internal format";
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "<buftype> doesn't support texture internal format");
+                    return false;
                 }
                 break;
 
             case EGL_GL_COLORSPACE:
                 if (buftype != EGL_D3D_TEXTURE_ANGLE)
                 {
-                    return EglBadAttribute() << "<buftype> doesn't support setting GL colorspace";
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "<buftype> doesn't support setting GL colorspace");
+                    return false;
                 }
                 break;
 
             case EGL_IOSURFACE_USAGE_HINT_ANGLE:
                 if (value & ~(EGL_IOSURFACE_READ_HINT_ANGLE | EGL_IOSURFACE_WRITE_HINT_ANGLE))
                 {
-                    return EglBadAttribute()
-                           << "IOSurface usage hint must only contain READ or WRITE";
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "IOSurface usage hint must only contain READ or WRITE");
+                    return false;
                 }
                 break;
 
@@ -1933,28 +2505,34 @@
             case EGL_TEXTURE_OFFSET_Y_ANGLE:
                 if (buftype != EGL_D3D_TEXTURE_ANGLE)
                 {
-                    return EglBadAttribute() << "<buftype> doesn't support setting texture offset";
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "<buftype> doesn't support setting texture offset");
+                    return false;
                 }
                 if (value < 0)
                 {
-                    return EglBadAttribute() << "Texture offset cannot be negative";
+                    val->setError(EGL_BAD_ATTRIBUTE, "Texture offset cannot be negative");
+                    return false;
                 }
                 break;
 
             default:
-                return EglBadAttribute();
+                val->setError(EGL_BAD_ATTRIBUTE);
+                return false;
         }
     }
 
     EGLAttrib colorspace = attributes.get(EGL_GL_COLORSPACE, EGL_GL_COLORSPACE_LINEAR);
     if (colorspace != EGL_GL_COLORSPACE_LINEAR && colorspace != EGL_GL_COLORSPACE_SRGB)
     {
-        return EglBadAttribute() << "invalid GL colorspace";
+        val->setError(EGL_BAD_ATTRIBUTE, "invalid GL colorspace");
+        return false;
     }
 
     if (!(config->surfaceType & EGL_PBUFFER_BIT))
     {
-        return EglBadMatch();
+        val->setError(EGL_BAD_MATCH);
+        return false;
     }
 
     EGLAttrib textureFormat = attributes.get(EGL_TEXTURE_FORMAT, EGL_NO_TEXTURE);
@@ -1962,7 +2540,8 @@
     if ((textureFormat != EGL_NO_TEXTURE && textureTarget == EGL_NO_TEXTURE) ||
         (textureFormat == EGL_NO_TEXTURE && textureTarget != EGL_NO_TEXTURE))
     {
-        return EglBadMatch();
+        val->setError(EGL_BAD_MATCH);
+        return false;
     }
     if ((textureFormat == EGL_TEXTURE_RGB && config->bindToTextureRGB != EGL_TRUE) ||
         (textureFormat == EGL_TEXTURE_RGBA && config->bindToTextureRGBA != EGL_TRUE))
@@ -1976,7 +2555,8 @@
         // OSX?
         if (buftype != EGL_IOSURFACE_ANGLE)
         {
-            return EglBadAttribute();
+            val->setError(EGL_BAD_ATTRIBUTE);
+            return false;
         }
     }
 
@@ -1987,14 +2567,16 @@
 
         if (width == 0 || height == 0)
         {
-            return EglBadAttribute();
+            val->setError(EGL_BAD_ATTRIBUTE);
+            return false;
         }
 
         const Caps &caps = display->getCaps();
         if (textureFormat != EGL_NO_TEXTURE && !caps.textureNPOT &&
             (!gl::isPow2(width) || !gl::isPow2(height)))
         {
-            return EglBadMatch();
+            val->setError(EGL_BAD_MATCH);
+            return false;
         }
     }
 
@@ -2002,12 +2584,14 @@
     {
         if (static_cast<EGLenum>(textureTarget) != config->bindToTextureTarget)
         {
-            return EglBadAttribute()
-                   << "EGL_IOSURFACE requires the texture target to match the config";
+            val->setError(EGL_BAD_ATTRIBUTE,
+                          "EGL_IOSURFACE requires the texture target to match the config");
+            return false;
         }
         if (textureFormat != EGL_TEXTURE_RGBA)
         {
-            return EglBadAttribute() << "EGL_IOSURFACE requires the EGL_TEXTURE_RGBA format";
+            val->setError(EGL_BAD_ATTRIBUTE, "EGL_IOSURFACE requires the EGL_TEXTURE_RGBA format");
+            return false;
         }
 
         if (!attributes.contains(EGL_WIDTH) || !attributes.contains(EGL_HEIGHT) ||
@@ -2016,21 +2600,25 @@
             !attributes.contains(EGL_TEXTURE_INTERNAL_FORMAT_ANGLE) ||
             !attributes.contains(EGL_IOSURFACE_PLANE_ANGLE))
         {
-            return EglBadParameter() << "Missing required attribute for EGL_IOSURFACE";
+            val->setError(EGL_BAD_PARAMETER, "Missing required attribute for EGL_IOSURFACE");
+            return false;
         }
     }
 
-    ANGLE_TRY(display->validateClientBuffer(config, buftype, buffer, attributes));
+    ANGLE_EGL_TRY_RETURN(val->eglThread,
+                         display->validateClientBuffer(config, buftype, buffer, attributes),
+                         val->entryPoint, val->labeledObject, false);
 
-    return NoError();
+    return true;
 }
 
-Error ValidateCreatePixmapSurface(Display *display,
-                                  Config *config,
-                                  EGLNativePixmapType pixmap,
-                                  const AttributeMap &attributes)
+bool ValidateCreatePixmapSurface(const ValidationContext *val,
+                                 const Display *display,
+                                 const Config *config,
+                                 EGLNativePixmapType pixmap,
+                                 const AttributeMap &attributes)
 {
-    ANGLE_TRY(ValidateConfig(display, config));
+    ANGLE_VALIDATION_TRY(ValidateConfig(val, display, config));
 
     const DisplayExtensions &displayExtensions = display->getExtensions();
 
@@ -2043,7 +2631,7 @@
         switch (attribute)
         {
             case EGL_GL_COLORSPACE:
-                ANGLE_TRY(ValidateColorspaceAttribute(displayExtensions, value));
+                ANGLE_VALIDATION_TRY(ValidateColorspaceAttribute(val, displayExtensions, value));
                 break;
 
             case EGL_VG_COLORSPACE:
@@ -2054,7 +2642,8 @@
             case EGL_TEXTURE_FORMAT:
                 if (!displayExtensions.textureFromPixmapNOK)
                 {
-                    return EglBadAttribute() << "EGL_NOK_texture_from_pixmap is not enabled.";
+                    val->setError(EGL_BAD_ATTRIBUTE, "EGL_NOK_texture_from_pixmap is not enabled.");
+                    return false;
                 }
                 switch (value)
                 {
@@ -2063,14 +2652,16 @@
                     case EGL_TEXTURE_RGBA:
                         break;
                     default:
-                        return EglBadAttribute();
+                        val->setError(EGL_BAD_ATTRIBUTE);
+                        return false;
                 }
                 break;
 
             case EGL_TEXTURE_TARGET:
                 if (!displayExtensions.textureFromPixmapNOK)
                 {
-                    return EglBadAttribute() << "EGL_NOK_texture_from_pixmap is not enabled.";
+                    val->setError(EGL_BAD_ATTRIBUTE, "EGL_NOK_texture_from_pixmap is not enabled.");
+                    return false;
                 }
                 switch (value)
                 {
@@ -2078,37 +2669,47 @@
                     case EGL_TEXTURE_2D:
                         break;
                     default:
-                        return EglBadAttribute();
+                        val->setError(EGL_BAD_ATTRIBUTE);
+                        return false;
                 }
                 break;
 
             case EGL_MIPMAP_TEXTURE:
                 if (!displayExtensions.textureFromPixmapNOK)
                 {
-                    return EglBadAttribute() << "EGL_NOK_texture_from_pixmap is not enabled.";
+                    val->setError(EGL_BAD_ATTRIBUTE, "EGL_NOK_texture_from_pixmap is not enabled.");
+                    return false;
                 }
                 break;
 
             default:
-                return EglBadAttribute() << "Unknown attribute";
+                val->setError(EGL_BAD_ATTRIBUTE, "Unknown attribute");
+                return false;
         }
     }
 
     if (!(config->surfaceType & EGL_PIXMAP_BIT))
     {
-        return EglBadMatch() << "Congfig does not suport pixmaps.";
+        val->setError(EGL_BAD_MATCH, "Congfig does not suport pixmaps.");
+        return false;
     }
 
-    ANGLE_TRY(display->valdiatePixmap(config, pixmap, attributes));
+    ANGLE_EGL_TRY_RETURN(val->eglThread, display->valdiatePixmap(config, pixmap, attributes),
+                         val->entryPoint, val->labeledObject, false);
 
-    return NoError();
+    return true;
 }
 
-Error ValidateMakeCurrent(Display *display, Surface *draw, Surface *read, gl::Context *context)
+bool ValidateMakeCurrent(const ValidationContext *val,
+                         const Display *display,
+                         const Surface *draw,
+                         const Surface *read,
+                         const gl::Context *context)
 {
     if (context == EGL_NO_CONTEXT && (draw != EGL_NO_SURFACE || read != EGL_NO_SURFACE))
     {
-        return EglBadMatch() << "If ctx is EGL_NO_CONTEXT, surfaces must be EGL_NO_SURFACE";
+        val->setError(EGL_BAD_MATCH, "If ctx is EGL_NO_CONTEXT, surfaces must be EGL_NO_SURFACE");
+        return false;
     }
 
     // If ctx is EGL_NO_CONTEXT and either draw or read are not EGL_NO_SURFACE, an EGL_BAD_MATCH
@@ -2119,14 +2720,17 @@
         {
             if ((draw == EGL_NO_SURFACE) != (read == EGL_NO_SURFACE))
             {
-                return EglBadMatch() << "If ctx is not EGL_NOT_CONTEXT, draw or read must "
-                                        "both be EGL_NO_SURFACE, or both not";
+                val->setError(EGL_BAD_MATCH,
+                              "If ctx is not EGL_NOT_CONTEXT, draw or read must "
+                              "both be EGL_NO_SURFACE, or both not");
+                return false;
             }
         }
         else
         {
-            return EglBadMatch()
-                   << "If ctx is not EGL_NO_CONTEXT, surfaces must not be EGL_NO_SURFACE";
+            val->setError(EGL_BAD_MATCH,
+                          "If ctx is not EGL_NO_CONTEXT, surfaces must not be EGL_NO_SURFACE");
+            return false;
         }
     }
 
@@ -2134,152 +2738,70 @@
     // EGL_BAD_MATCH error is generated.
     if ((read == EGL_NO_SURFACE) != (draw == EGL_NO_SURFACE))
     {
-        return EglBadMatch()
-               << "read and draw must both be valid surfaces, or both be EGL_NO_SURFACE";
+        val->setError(EGL_BAD_MATCH,
+                      "read and draw must both be valid surfaces, or both be EGL_NO_SURFACE");
+        return false;
     }
 
     if (display == EGL_NO_DISPLAY || !Display::isValidDisplay(display))
     {
-        return EglBadDisplay() << "'dpy' not a valid EGLDisplay handle";
+        val->setError(EGL_BAD_DISPLAY, "'dpy' not a valid EGLDisplay handle");
+        return false;
     }
 
     // EGL 1.5 spec: dpy can be uninitialized if all other parameters are null
     if (!display->isInitialized() &&
         (context != EGL_NO_CONTEXT || draw != EGL_NO_SURFACE || read != EGL_NO_SURFACE))
     {
-        return EglNotInitialized() << "'dpy' not initialized";
+        val->setError(EGL_NOT_INITIALIZED, "'dpy' not initialized");
+        return false;
     }
 
     if (context != EGL_NO_CONTEXT)
     {
-        ANGLE_TRY(ValidateContext(display, context));
+        ANGLE_VALIDATION_TRY(ValidateContext(val, display, context));
     }
 
     if (display->isInitialized() && display->isDeviceLost())
     {
-        return EglContextLost();
+        val->setError(EGL_CONTEXT_LOST);
+        return false;
     }
 
     if (draw != EGL_NO_SURFACE)
     {
-        ANGLE_TRY(ValidateSurface(display, draw));
+        ANGLE_VALIDATION_TRY(ValidateSurface(val, display, draw));
     }
 
     if (read != EGL_NO_SURFACE)
     {
-        ANGLE_TRY(ValidateSurface(display, read));
-        ANGLE_TRY(ValidateCompatibleSurface(display, context, read));
+        ANGLE_VALIDATION_TRY(ValidateSurface(val, display, read));
+        ANGLE_VALIDATION_TRY(ValidateCompatibleSurface(val, display, context, read));
     }
 
     if (draw != read)
     {
         if (draw)
         {
-            ANGLE_TRY(ValidateCompatibleSurface(display, context, draw));
+            ANGLE_VALIDATION_TRY(ValidateCompatibleSurface(val, display, context, draw));
         }
         if (read)
         {
-            ANGLE_TRY(ValidateCompatibleSurface(display, context, read));
+            ANGLE_VALIDATION_TRY(ValidateCompatibleSurface(val, display, context, read));
         }
     }
-    return NoError();
+    return true;
 }
 
-Error ValidateCompatibleSurface(const Display *display,
-                                gl::Context *context,
-                                const Surface *surface)
-{
-    const Config *contextConfig = context->getConfig();
-    const Config *surfaceConfig = surface->getConfig();
-
-    // Surface compatible with client API - only OPENGL_ES supported
-    switch (context->getClientMajorVersion())
-    {
-        case 1:
-            if (!(surfaceConfig->renderableType & EGL_OPENGL_ES_BIT))
-            {
-                return EglBadMatch() << "Surface not compatible with OpenGL ES 1.x.";
-            }
-            break;
-        case 2:
-            if (!(surfaceConfig->renderableType & EGL_OPENGL_ES2_BIT))
-            {
-                return EglBadMatch() << "Surface not compatible with OpenGL ES 2.x.";
-            }
-            break;
-        case 3:
-            if (!(surfaceConfig->renderableType & (EGL_OPENGL_ES2_BIT | EGL_OPENGL_ES3_BIT)))
-            {
-                return EglBadMatch() << "Surface not compatible with OpenGL ES 3.x.";
-            }
-            break;
-        default:
-            return EglBadMatch() << "Surface not compatible with Context API.";
-    }
-
-    // EGL KHR no config context
-    if (context->getConfig() == EGL_NO_CONFIG_KHR)
-    {
-        const DisplayExtensions &displayExtensions = display->getExtensions();
-        if (displayExtensions.noConfigContext)
-        {
-            return NoError();
-        }
-        return EglBadMatch() << "Context with no config is not supported.";
-    }
-
-    if (!surface->flexibleSurfaceCompatibilityRequested())
-    {
-        // Config compatibility is defined in section 2.2 of the EGL 1.5 spec
-
-        bool colorBufferCompat = surfaceConfig->colorBufferType == contextConfig->colorBufferType;
-        if (!colorBufferCompat)
-        {
-            return EglBadMatch() << "Color buffer types are not compatible.";
-        }
-
-        bool colorCompat = surfaceConfig->redSize == contextConfig->redSize &&
-                           surfaceConfig->greenSize == contextConfig->greenSize &&
-                           surfaceConfig->blueSize == contextConfig->blueSize &&
-                           surfaceConfig->alphaSize == contextConfig->alphaSize &&
-                           surfaceConfig->luminanceSize == contextConfig->luminanceSize;
-        if (!colorCompat)
-        {
-            return EglBadMatch() << "Color buffer sizes are not compatible.";
-        }
-
-        bool componentTypeCompat =
-            surfaceConfig->colorComponentType == contextConfig->colorComponentType;
-        if (!componentTypeCompat)
-        {
-            return EglBadMatch() << "Color buffer component types are not compatible.";
-        }
-
-        bool dsCompat = surfaceConfig->depthSize == contextConfig->depthSize &&
-                        surfaceConfig->stencilSize == contextConfig->stencilSize;
-        if (!dsCompat)
-        {
-            return EglBadMatch() << "Depth-stencil buffer types are not compatible.";
-        }
-    }
-
-    bool surfaceTypeCompat = (surfaceConfig->surfaceType & contextConfig->surfaceType) != 0;
-    if (!surfaceTypeCompat)
-    {
-        return EglBadMatch() << "Surface type is not compatible.";
-    }
-
-    return NoError();
-}
-
-Error ValidateCreateImage(const Display *display,
-                          gl::Context *context,
-                          EGLenum target,
-                          EGLClientBuffer buffer,
-                          const AttributeMap &attributes)
+bool ValidateCreateImage(const ValidationContext *val,
+                         const Display *display,
+                         const gl::Context *context,
+                         EGLenum target,
+                         EGLClientBuffer buffer,
+                         const AttributeMap &attributes)
 {
 
-    ANGLE_TRY(ValidateDisplay(display));
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
 
     const DisplayExtensions &displayExtensions = display->getExtensions();
 
@@ -2303,8 +2825,9 @@
                         break;
 
                     default:
-                        return EglBadParameter()
-                               << "EGL_IMAGE_PRESERVED must be EGL_TRUE or EGL_FALSE.";
+                        val->setError(EGL_BAD_PARAMETER,
+                                      "EGL_IMAGE_PRESERVED must be EGL_TRUE or EGL_FALSE.");
+                        return false;
                 }
                 break;
 
@@ -2312,36 +2835,44 @@
                 if (!displayExtensions.glTexture2DImage &&
                     !displayExtensions.glTextureCubemapImage && !displayExtensions.glTexture3DImage)
                 {
-                    return EglBadParameter() << "EGL_GL_TEXTURE_LEVEL cannot be used "
-                                                "without KHR_gl_texture_*_image support.";
+                    val->setError(EGL_BAD_PARAMETER,
+                                  "EGL_GL_TEXTURE_LEVEL cannot be used "
+                                  "without KHR_gl_texture_*_image support.");
+                    return false;
                 }
 
                 if (value < 0)
                 {
-                    return EglBadParameter() << "EGL_GL_TEXTURE_LEVEL cannot be negative.";
+                    val->setError(EGL_BAD_PARAMETER, "EGL_GL_TEXTURE_LEVEL cannot be negative.");
+                    return false;
                 }
                 break;
 
             case EGL_GL_TEXTURE_ZOFFSET:
                 if (!displayExtensions.glTexture3DImage)
                 {
-                    return EglBadParameter() << "EGL_GL_TEXTURE_ZOFFSET cannot be used "
-                                                "without KHR_gl_texture_3D_image support.";
+                    val->setError(EGL_BAD_PARAMETER,
+                                  "EGL_GL_TEXTURE_ZOFFSET cannot be used "
+                                  "without KHR_gl_texture_3D_image support.");
+                    return false;
                 }
                 break;
 
             case EGL_GL_COLORSPACE:
                 if (!displayExtensions.glColorspace)
                 {
-                    return EglBadParameter() << "EGL_GL_COLORSPACE cannot be used "
-                                                "without EGL_KHR_gl_colorspace support.";
+                    val->setError(EGL_BAD_PARAMETER,
+                                  "EGL_GL_COLORSPACE cannot be used "
+                                  "without EGL_KHR_gl_colorspace support.");
+                    return false;
                 }
                 switch (value)
                 {
                     case EGL_GL_COLORSPACE_DEFAULT_EXT:
                         break;
                     default:
-                        ANGLE_TRY(ValidateColorspaceAttribute(displayExtensions, value));
+                        ANGLE_VALIDATION_TRY(
+                            ValidateColorspaceAttribute(val, displayExtensions, value));
                         break;
                 }
                 break;
@@ -2349,9 +2880,11 @@
             case EGL_TEXTURE_INTERNAL_FORMAT_ANGLE:
                 if (!displayExtensions.imageD3D11Texture)
                 {
-                    return EglBadParameter()
-                           << "EGL_TEXTURE_INTERNAL_FORMAT_ANGLE and EGL_TEXTURE_TYPE_ANGLE cannot "
-                              "be used without EGL_ANGLE_image_d3d11_texture support.";
+                    val->setError(
+                        EGL_BAD_PARAMETER,
+                        "EGL_TEXTURE_INTERNAL_FORMAT_ANGLE and EGL_TEXTURE_TYPE_ANGLE cannot "
+                        "be used without EGL_ANGLE_image_d3d11_texture support.");
+                    return false;
                 }
                 break;
 
@@ -2359,8 +2892,10 @@
             case EGL_HEIGHT:
                 if (target != EGL_LINUX_DMA_BUF_EXT)
                 {
-                    return EglBadParameter()
-                           << "Parameter cannot be used if target is not EGL_LINUX_DMA_BUF_EXT";
+                    val->setError(
+                        EGL_BAD_PARAMETER,
+                        "Parameter cannot be used if target is not EGL_LINUX_DMA_BUF_EXT");
+                    return false;
                 }
                 break;
 
@@ -2376,16 +2911,20 @@
             case EGL_DMA_BUF_PLANE2_PITCH_EXT:
                 if (!displayExtensions.imageDmaBufImportEXT)
                 {
-                    return EglBadParameter() << "Parameter cannot be used without "
-                                                "EGL_EXT_image_dma_buf_import support.";
+                    val->setError(EGL_BAD_PARAMETER,
+                                  "Parameter cannot be used without "
+                                  "EGL_EXT_image_dma_buf_import support.");
+                    return false;
                 }
                 break;
 
             case EGL_YUV_COLOR_SPACE_HINT_EXT:
                 if (!displayExtensions.imageDmaBufImportEXT)
                 {
-                    return EglBadParameter() << "Parameter cannot be used without "
-                                                "EGL_EXT_image_dma_buf_import support.";
+                    val->setError(EGL_BAD_PARAMETER,
+                                  "Parameter cannot be used without "
+                                  "EGL_EXT_image_dma_buf_import support.");
+                    return false;
                 }
 
                 switch (value)
@@ -2396,16 +2935,19 @@
                         break;
 
                     default:
-                        return EglBadParameter()
-                               << "Invalid value for EGL_YUV_COLOR_SPACE_HINT_EXT.";
+                        val->setError(EGL_BAD_PARAMETER,
+                                      "Invalid value for EGL_YUV_COLOR_SPACE_HINT_EXT.");
+                        return false;
                 }
                 break;
 
             case EGL_SAMPLE_RANGE_HINT_EXT:
                 if (!displayExtensions.imageDmaBufImportEXT)
                 {
-                    return EglBadParameter() << "Parameter cannot be used without "
-                                                "EGL_EXT_image_dma_buf_import support.";
+                    val->setError(EGL_BAD_PARAMETER,
+                                  "Parameter cannot be used without "
+                                  "EGL_EXT_image_dma_buf_import support.");
+                    return false;
                 }
 
                 switch (value)
@@ -2415,7 +2957,9 @@
                         break;
 
                     default:
-                        return EglBadParameter() << "Invalid value for EGL_SAMPLE_RANGE_HINT_EXT.";
+                        val->setError(EGL_BAD_PARAMETER,
+                                      "Invalid value for EGL_SAMPLE_RANGE_HINT_EXT.");
+                        return false;
                 }
                 break;
 
@@ -2423,8 +2967,10 @@
             case EGL_YUV_CHROMA_VERTICAL_SITING_HINT_EXT:
                 if (!displayExtensions.imageDmaBufImportEXT)
                 {
-                    return EglBadParameter() << "Parameter cannot be used without "
-                                                "EGL_EXT_image_dma_buf_import support.";
+                    val->setError(EGL_BAD_PARAMETER,
+                                  "Parameter cannot be used without "
+                                  "EGL_EXT_image_dma_buf_import support.");
+                    return false;
                 }
 
                 switch (value)
@@ -2434,9 +2980,11 @@
                         break;
 
                     default:
-                        return EglBadParameter()
-                               << "Invalid value for EGL_YUV_CHROMA_HORIZONTAL_SITING_HINT_EXT or "
-                                  "EGL_YUV_CHROMA_VERTICAL_SITING_HINT_EXT.";
+                        val->setError(
+                            EGL_BAD_PARAMETER,
+                            "Invalid value for EGL_YUV_CHROMA_HORIZONTAL_SITING_HINT_EXT or "
+                            "EGL_YUV_CHROMA_VERTICAL_SITING_HINT_EXT.");
+                        return false;
                 }
                 break;
 
@@ -2453,14 +3001,16 @@
             case EGL_DMA_BUF_PLANE3_MODIFIER_HI_EXT:
                 if (!displayExtensions.imageDmaBufImportModifiersEXT)
                 {
-                    return EglBadParameter() << "Parameter cannot be used without "
-                                                "EGL_EXT_image_dma_buf_import_modifiers support.";
+                    val->setError(EGL_BAD_PARAMETER,
+                                  "Parameter cannot be used without "
+                                  "EGL_EXT_image_dma_buf_import_modifiers support.");
+                    return false;
                 }
                 break;
 
             default:
-                return EglBadParameter()
-                       << "invalid attribute: 0x" << std::hex << std::uppercase << attribute;
+                val->setError(EGL_BAD_PARAMETER, "invalid attribute: 0x%X", attribute);
+                return false;
         }
     }
 
@@ -2470,36 +3020,42 @@
         {
             if (!displayExtensions.glTexture2DImage)
             {
-                return EglBadParameter() << "KHR_gl_texture_2D_image not supported.";
+                val->setError(EGL_BAD_PARAMETER, "KHR_gl_texture_2D_image not supported.");
+                return false;
             }
 
             if (buffer == 0)
             {
-                return EglBadParameter() << "buffer cannot reference a 2D texture with the name 0.";
+                val->setError(EGL_BAD_PARAMETER,
+                              "buffer cannot reference a 2D texture with the name 0.");
+                return false;
             }
 
-            ANGLE_TRY(ValidateContext(display, context));
+            ANGLE_VALIDATION_TRY(ValidateContext(val, display, context));
             const gl::Texture *texture =
                 context->getTexture({egl_gl::EGLClientBufferToGLObjectHandle(buffer)});
             if (texture == nullptr || texture->getType() != gl::TextureType::_2D)
             {
-                return EglBadParameter() << "target is not a 2D texture.";
+                val->setError(EGL_BAD_PARAMETER, "target is not a 2D texture.");
+                return false;
             }
 
             if (texture->getBoundSurface() != nullptr)
             {
-                return EglBadAccess() << "texture has a surface bound to it.";
+                val->setError(EGL_BAD_ACCESS, "texture has a surface bound to it.");
+                return false;
             }
 
             EGLAttrib level = attributes.get(EGL_GL_TEXTURE_LEVEL, 0);
             if (texture->getWidth(gl::TextureTarget::_2D, static_cast<size_t>(level)) == 0 ||
                 texture->getHeight(gl::TextureTarget::_2D, static_cast<size_t>(level)) == 0)
             {
-                return EglBadParameter()
-                       << "target 2D texture does not have a valid size at specified level.";
+                val->setError(EGL_BAD_PARAMETER,
+                              "target 2D texture does not have a valid size at specified level.");
+                return false;
             }
 
-            ANGLE_TRY(ValidateCreateImageMipLevelCommon(context, texture, level));
+            ANGLE_VALIDATION_TRY(ValidateCreateImageMipLevelCommon(val, context, texture, level));
         }
         break;
 
@@ -2512,26 +3068,30 @@
         {
             if (!displayExtensions.glTextureCubemapImage)
             {
-                return EglBadParameter() << "KHR_gl_texture_cubemap_image not supported.";
+                val->setError(EGL_BAD_PARAMETER, "KHR_gl_texture_cubemap_image not supported.");
+                return false;
             }
 
             if (buffer == 0)
             {
-                return EglBadParameter()
-                       << "buffer cannot reference a cubemap texture with the name 0.";
+                val->setError(EGL_BAD_PARAMETER,
+                              "buffer cannot reference a cubemap texture with the name 0.");
+                return false;
             }
 
-            ANGLE_TRY(ValidateContext(display, context));
+            ANGLE_VALIDATION_TRY(ValidateContext(val, display, context));
             const gl::Texture *texture =
                 context->getTexture({egl_gl::EGLClientBufferToGLObjectHandle(buffer)});
             if (texture == nullptr || texture->getType() != gl::TextureType::CubeMap)
             {
-                return EglBadParameter() << "target is not a cubemap texture.";
+                val->setError(EGL_BAD_PARAMETER, "target is not a cubemap texture.");
+                return false;
             }
 
             if (texture->getBoundSurface() != nullptr)
             {
-                return EglBadAccess() << "texture has a surface bound to it.";
+                val->setError(EGL_BAD_ACCESS, "texture has a surface bound to it.");
+                return false;
             }
 
             EGLAttrib level               = attributes.get(EGL_GL_TEXTURE_LEVEL, 0);
@@ -2539,18 +3099,22 @@
             if (texture->getWidth(cubeMapFace, static_cast<size_t>(level)) == 0 ||
                 texture->getHeight(cubeMapFace, static_cast<size_t>(level)) == 0)
             {
-                return EglBadParameter() << "target cubemap texture does not have a valid "
-                                            "size at specified level and face.";
+                val->setError(EGL_BAD_PARAMETER,
+                              "target cubemap texture does not have a valid "
+                              "size at specified level and face.");
+                return false;
             }
 
-            ANGLE_TRY(ValidateCreateImageMipLevelCommon(context, texture, level));
+            ANGLE_VALIDATION_TRY(ValidateCreateImageMipLevelCommon(val, context, texture, level));
 
             if (level == 0 && !texture->isMipmapComplete() &&
                 CubeTextureHasUnspecifiedLevel0Face(texture))
             {
-                return EglBadParameter() << "if level is zero and the texture is incomplete, "
-                                            "it must have all of its faces specified at level "
-                                            "zero.";
+                val->setError(EGL_BAD_PARAMETER,
+                              "if level is zero and the texture is incomplete, "
+                              "it must have all of its faces specified at level "
+                              "zero.");
+                return false;
             }
         }
         break;
@@ -2559,25 +3123,30 @@
         {
             if (!displayExtensions.glTexture3DImage)
             {
-                return EglBadParameter() << "KHR_gl_texture_3D_image not supported.";
+                val->setError(EGL_BAD_PARAMETER, "KHR_gl_texture_3D_image not supported.");
+                return false;
             }
 
             if (buffer == 0)
             {
-                return EglBadParameter() << "buffer cannot reference a 3D texture with the name 0.";
+                val->setError(EGL_BAD_PARAMETER,
+                              "buffer cannot reference a 3D texture with the name 0.");
+                return false;
             }
 
-            ANGLE_TRY(ValidateContext(display, context));
+            ANGLE_VALIDATION_TRY(ValidateContext(val, display, context));
             const gl::Texture *texture =
                 context->getTexture({egl_gl::EGLClientBufferToGLObjectHandle(buffer)});
             if (texture == nullptr || texture->getType() != gl::TextureType::_3D)
             {
-                return EglBadParameter() << "target is not a 3D texture.";
+                val->setError(EGL_BAD_PARAMETER, "target is not a 3D texture.");
+                return false;
             }
 
             if (texture->getBoundSurface() != nullptr)
             {
-                return EglBadAccess() << "texture has a surface bound to it.";
+                val->setError(EGL_BAD_ACCESS, "texture has a surface bound to it.");
+                return false;
             }
 
             EGLAttrib level   = attributes.get(EGL_GL_TEXTURE_LEVEL, 0);
@@ -2586,19 +3155,22 @@
                 texture->getHeight(gl::TextureTarget::_3D, static_cast<size_t>(level)) == 0 ||
                 texture->getDepth(gl::TextureTarget::_3D, static_cast<size_t>(level)) == 0)
             {
-                return EglBadParameter()
-                       << "target 3D texture does not have a valid size at specified level.";
+                val->setError(EGL_BAD_PARAMETER,
+                              "target 3D texture does not have a valid size at specified level.");
+                return false;
             }
 
             if (static_cast<size_t>(zOffset) >=
                 texture->getDepth(gl::TextureTarget::_3D, static_cast<size_t>(level)))
             {
-                return EglBadParameter() << "target 3D texture does not have enough layers "
-                                            "for the specified Z offset at the specified "
-                                            "level.";
+                val->setError(EGL_BAD_PARAMETER,
+                              "target 3D texture does not have enough layers "
+                              "for the specified Z offset at the specified "
+                              "level.");
+                return false;
             }
 
-            ANGLE_TRY(ValidateCreateImageMipLevelCommon(context, texture, level));
+            ANGLE_VALIDATION_TRY(ValidateCreateImageMipLevelCommon(val, context, texture, level));
         }
         break;
 
@@ -2606,32 +3178,38 @@
         {
             if (!displayExtensions.glRenderbufferImage)
             {
-                return EglBadParameter() << "KHR_gl_renderbuffer_image not supported.";
+                val->setError(EGL_BAD_PARAMETER, "KHR_gl_renderbuffer_image not supported.");
+                return false;
             }
 
             if (attributes.contains(EGL_GL_TEXTURE_LEVEL))
             {
-                return EglBadParameter() << "EGL_GL_TEXTURE_LEVEL cannot be used in "
-                                            "conjunction with a renderbuffer target.";
+                val->setError(EGL_BAD_PARAMETER,
+                              "EGL_GL_TEXTURE_LEVEL cannot be used in "
+                              "conjunction with a renderbuffer target.");
+                return false;
             }
 
             if (buffer == 0)
             {
-                return EglBadParameter()
-                       << "buffer cannot reference a renderbuffer with the name 0.";
+                val->setError(EGL_BAD_PARAMETER,
+                              "buffer cannot reference a renderbuffer with the name 0.");
+                return false;
             }
 
-            ANGLE_TRY(ValidateContext(display, context));
+            ANGLE_VALIDATION_TRY(ValidateContext(val, display, context));
             const gl::Renderbuffer *renderbuffer =
                 context->getRenderbuffer({egl_gl::EGLClientBufferToGLObjectHandle(buffer)});
             if (renderbuffer == nullptr)
             {
-                return EglBadParameter() << "target is not a renderbuffer.";
+                val->setError(EGL_BAD_PARAMETER, "target is not a renderbuffer.");
+                return false;
             }
 
             if (renderbuffer->getSamples() > 0)
             {
-                return EglBadParameter() << "target renderbuffer cannot be multisampled.";
+                val->setError(EGL_BAD_PARAMETER, "target renderbuffer cannot be multisampled.");
+                return false;
             }
         }
         break;
@@ -2640,46 +3218,59 @@
         {
             if (!displayExtensions.imageNativeBuffer)
             {
-                return EglBadParameter() << "EGL_ANDROID_image_native_buffer not supported.";
+                val->setError(EGL_BAD_PARAMETER, "EGL_ANDROID_image_native_buffer not supported.");
+                return false;
             }
 
             if (context != nullptr)
             {
-                return EglBadContext() << "ctx must be EGL_NO_CONTEXT.";
+                val->setError(EGL_BAD_CONTEXT, "ctx must be EGL_NO_CONTEXT.");
+                return false;
             }
 
-            ANGLE_TRY(display->validateImageClientBuffer(context, target, buffer, attributes));
+            ANGLE_EGL_TRY_RETURN(
+                val->eglThread,
+                display->validateImageClientBuffer(context, target, buffer, attributes),
+                val->entryPoint, val->labeledObject, false);
         }
         break;
 
         case EGL_D3D11_TEXTURE_ANGLE:
             if (!displayExtensions.imageD3D11Texture)
             {
-                return EglBadParameter() << "EGL_ANGLE_image_d3d11_texture not supported.";
+                val->setError(EGL_BAD_PARAMETER, "EGL_ANGLE_image_d3d11_texture not supported.");
+                return false;
             }
 
             if (context != nullptr)
             {
-                return EglBadContext() << "ctx must be EGL_NO_CONTEXT.";
+                val->setError(EGL_BAD_CONTEXT, "ctx must be EGL_NO_CONTEXT.");
+                return false;
             }
 
-            ANGLE_TRY(display->validateImageClientBuffer(context, target, buffer, attributes));
+            ANGLE_EGL_TRY_RETURN(
+                val->eglThread,
+                display->validateImageClientBuffer(context, target, buffer, attributes),
+                val->entryPoint, val->labeledObject, false);
             break;
 
         case EGL_LINUX_DMA_BUF_EXT:
             if (!displayExtensions.imageDmaBufImportEXT)
             {
-                return EglBadParameter() << "EGL_EXT_image_dma_buf_import not supported.";
+                val->setError(EGL_BAD_PARAMETER, "EGL_EXT_image_dma_buf_import not supported.");
+                return false;
             }
 
             if (context != nullptr)
             {
-                return EglBadContext() << "ctx must be EGL_NO_CONTEXT.";
+                val->setError(EGL_BAD_CONTEXT, "ctx must be EGL_NO_CONTEXT.");
+                return false;
             }
 
             if (buffer != nullptr)
             {
-                return EglBadParameter() << "buffer must be NULL.";
+                val->setError(EGL_BAD_PARAMETER, "buffer must be NULL.");
+                return false;
             }
 
             {
@@ -2693,9 +3284,11 @@
                 {
                     if (!attributes.contains(requiredParameter))
                     {
-                        return EglBadParameter()
-                               << "Missing required parameter " << gl::FmtHex(requiredParameter)
-                               << " for image target EGL_LINUX_DMA_BUF_EXT.";
+                        val->setError(EGL_BAD_PARAMETER,
+                                      "Missing required parameter 0x%X for image target "
+                                      "EGL_LINUX_DMA_BUF_EXT.",
+                                      requiredParameter);
+                        return false;
                     }
                 }
 
@@ -2720,80 +3313,92 @@
                     (containPlane2ModifierLo ^ containPlane2ModifierHi) ||
                     (containPlane3ModifierLo ^ containPlane3ModifierHi))
                 {
-                    return EglBadParameter()
-                           << "the list of attributes contains EGL_DMA_BUF_PLANE*_MODIFIER_LO_EXT "
-                              "but not EGL_DMA_BUF_PLANE*_MODIFIER_HI_EXT or vice versa.";
+                    val->setError(
+                        EGL_BAD_PARAMETER,
+                        "the list of attributes contains EGL_DMA_BUF_PLANE*_MODIFIER_LO_EXT "
+                        "but not EGL_DMA_BUF_PLANE*_MODIFIER_HI_EXT or vice versa.");
+                    return false;
                 }
             }
             break;
 
         default:
-            return EglBadParameter()
-                   << "invalid target: 0x" << std::hex << std::uppercase << target;
+            val->setError(EGL_BAD_PARAMETER, "invalid target: 0x%X", target);
+            return false;
     }
 
     if (attributes.contains(EGL_GL_TEXTURE_ZOFFSET) && target != EGL_GL_TEXTURE_3D)
     {
-        return EglBadParameter() << "EGL_GL_TEXTURE_ZOFFSET must be used with a 3D texture target.";
+        val->setError(EGL_BAD_PARAMETER,
+                      "EGL_GL_TEXTURE_ZOFFSET must be used with a 3D texture target.");
+        return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateDestroyImage(const Display *display, const Image *image)
+bool ValidateDestroyImage(const ValidationContext *val, const Display *display, const Image *image)
 {
-    ANGLE_TRY(ValidateImage(display, image));
+    ANGLE_VALIDATION_TRY(ValidateImage(val, display, image));
 
-    return NoError();
+    return true;
 }
 
-Error ValidateCreateImageKHR(const Display *display,
-                             gl::Context *context,
-                             EGLenum target,
-                             EGLClientBuffer buffer,
-                             const AttributeMap &attributes)
+bool ValidateCreateImageKHR(const ValidationContext *val,
+                            const Display *display,
+                            const gl::Context *context,
+                            EGLenum target,
+                            EGLClientBuffer buffer,
+                            const AttributeMap &attributes)
 {
-    ANGLE_TRY(ValidateDisplay(display));
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
 
     if (!display->getExtensions().imageBase && !display->getExtensions().image)
     {
         // It is out of spec what happens when calling an extension function when the extension is
         // not available.
         // EGL_BAD_DISPLAY seems like a reasonable error.
-        return EglBadDisplay() << "EGL_KHR_image not supported.";
+        val->setError(EGL_BAD_DISPLAY, "EGL_KHR_image not supported.");
+        return false;
     }
 
-    return ValidateCreateImage(display, context, target, buffer, attributes);
+    return ValidateCreateImage(val, display, context, target, buffer, attributes);
 }
 
-Error ValidateDestroyImageKHR(const Display *display, const Image *image)
+bool ValidateDestroyImageKHR(const ValidationContext *val,
+                             const Display *display,
+                             const Image *image)
 {
-    ANGLE_TRY(ValidateImage(display, image));
+    ANGLE_VALIDATION_TRY(ValidateImage(val, display, image));
 
     if (!display->getExtensions().imageBase && !display->getExtensions().image)
     {
         // It is out of spec what happens when calling an extension function when the extension is
         // not available.
         // EGL_BAD_DISPLAY seems like a reasonable error.
-        return EglBadDisplay();
+        val->setError(EGL_BAD_DISPLAY);
+        return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateCreateDeviceANGLE(EGLint device_type,
-                                void *native_device,
-                                const EGLAttrib *attrib_list)
+bool ValidateCreateDeviceANGLE(const ValidationContext *val,
+                               EGLint device_type,
+                               const void *native_device,
+                               const EGLAttrib *attrib_list)
 {
     const ClientExtensions &clientExtensions = Display::GetClientExtensions();
     if (!clientExtensions.deviceCreation)
     {
-        return EglBadAccess() << "Device creation extension not active";
+        val->setError(EGL_BAD_ACCESS, "Device creation extension not active");
+        return false;
     }
 
     if (attrib_list != nullptr && attrib_list[0] != EGL_NONE)
     {
-        return EglBadAttribute() << "Invalid attrib_list parameter";
+        val->setError(EGL_BAD_ATTRIBUTE, "Invalid attrib_list parameter");
+        return false;
     }
 
     switch (device_type)
@@ -2801,270 +3406,178 @@
         case EGL_D3D11_DEVICE_ANGLE:
             if (!clientExtensions.deviceCreationD3D11)
             {
-                return EglBadAttribute() << "D3D11 device creation extension not active";
+                val->setError(EGL_BAD_ATTRIBUTE, "D3D11 device creation extension not active");
+                return false;
             }
             break;
         default:
-            return EglBadAttribute() << "Invalid device_type parameter";
+            val->setError(EGL_BAD_ATTRIBUTE, "Invalid device_type parameter");
+            return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateReleaseDeviceANGLE(Device *device)
+bool ValidateReleaseDeviceANGLE(const ValidationContext *val, const Device *device)
 {
     const ClientExtensions &clientExtensions = Display::GetClientExtensions();
     if (!clientExtensions.deviceCreation)
     {
-        return EglBadAccess() << "Device creation extension not active";
+        val->setError(EGL_BAD_ACCESS, "Device creation extension not active");
+        return false;
     }
 
     if (device == EGL_NO_DEVICE_EXT || !Device::IsValidDevice(device))
     {
-        return EglBadDevice() << "Invalid device parameter";
+        val->setError(EGL_BAD_DEVICE_EXT, "Invalid device parameter");
+        return false;
     }
 
     Display *owningDisplay = device->getOwningDisplay();
     if (owningDisplay != nullptr)
     {
-        return EglBadDevice() << "Device must have been created using eglCreateDevice";
+        val->setError(EGL_BAD_DEVICE_EXT, "Device must have been created using eglCreateDevice");
+        return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateCreateSyncBase(const Display *display,
-                             EGLenum type,
-                             const AttributeMap &attribs,
-                             const Display *currentDisplay,
-                             const gl::Context *currentContext,
-                             bool isExt)
+bool ValidateCreateSync(const ValidationContext *val,
+                        const Display *display,
+                        EGLenum type,
+                        const AttributeMap &attribs)
 {
-    ANGLE_TRY(ValidateDisplay(display));
-
-    switch (type)
-    {
-        case EGL_SYNC_FENCE_KHR:
-            if (!attribs.isEmpty())
-            {
-                return EglBadAttribute() << "Invalid attribute";
-            }
-
-            if (!display->getExtensions().fenceSync)
-            {
-                return EglBadMatch() << "EGL_KHR_fence_sync extension is not available";
-            }
-
-            if (display != currentDisplay)
-            {
-                return EglBadMatch() << "CreateSync can only be called on the current display";
-            }
-
-            ANGLE_TRY(ValidateContext(currentDisplay, currentContext));
-
-            if (!currentContext->getExtensions().eglSyncOES)
-            {
-                return EglBadMatch() << "EGL_SYNC_FENCE_KHR cannot be used without "
-                                        "GL_OES_EGL_sync support.";
-            }
-            break;
-
-        case EGL_SYNC_NATIVE_FENCE_ANDROID:
-            if (!display->getExtensions().fenceSync)
-            {
-                return EglBadMatch() << "EGL_KHR_fence_sync extension is not available";
-            }
-
-            if (!display->getExtensions().nativeFenceSyncANDROID)
-            {
-                return EglBadDisplay()
-                       << "EGL_ANDROID_native_fence_sync extension is not available.";
-            }
-
-            if (display != currentDisplay)
-            {
-                return EglBadMatch() << "CreateSync can only be called on the current display";
-            }
-
-            ANGLE_TRY(ValidateContext(currentDisplay, currentContext));
-
-            if (!currentContext->getExtensions().eglSyncOES)
-            {
-                return EglBadMatch() << "EGL_SYNC_FENCE_KHR cannot be used without "
-                                        "GL_OES_EGL_sync support.";
-            }
-
-            for (const auto &attributeIter : attribs)
-            {
-                EGLAttrib attribute = attributeIter.first;
-
-                switch (attribute)
-                {
-                    case EGL_SYNC_NATIVE_FENCE_FD_ANDROID:
-                        break;
-
-                    default:
-                        return EglBadAttribute() << "Invalid attribute";
-                }
-            }
-            break;
-
-        case EGL_SYNC_REUSABLE_KHR:
-            if (!attribs.isEmpty())
-            {
-                return EglBadAttribute() << "Invalid attribute";
-            }
-
-            if (!display->getExtensions().reusableSyncKHR)
-            {
-                return EglBadMatch() << "EGL_KHR_reusable_sync extension is not available.";
-            }
-            break;
-
-        default:
-            if (isExt)
-            {
-                return EglBadAttribute() << "Invalid type parameter";
-            }
-            else
-            {
-                return EglBadParameter() << "Invalid type parameter";
-            }
-    }
-
-    return NoError();
+    return ValidateCreateSyncBase(val, display, type, attribs, false);
 }
 
-Error ValidateGetSyncAttribBase(const Display *display, const Sync *sync, EGLint attribute)
+bool ValidateCreateSyncKHR(const ValidationContext *val,
+                           const Display *display,
+                           EGLenum type,
+                           const AttributeMap &attribs)
 {
-    ANGLE_TRY(ValidateSync(display, sync));
-
-    switch (attribute)
-    {
-        case EGL_SYNC_CONDITION_KHR:
-            switch (sync->getType())
-            {
-                case EGL_SYNC_FENCE_KHR:
-                case EGL_SYNC_NATIVE_FENCE_ANDROID:
-                    break;
-
-                default:
-                    return EglBadAttribute()
-                           << "EGL_SYNC_CONDITION_KHR is not valid for this sync type.";
-            }
-            break;
-
-        // The following attributes are accepted by all types
-        case EGL_SYNC_TYPE_KHR:
-        case EGL_SYNC_STATUS_KHR:
-            break;
-
-        default:
-            return EglBadAttribute() << "Invalid attribute";
-    }
-
-    return NoError();
+    return ValidateCreateSyncBase(val, display, type, attribs, true);
 }
 
-Error ValidateCreateSyncKHR(const Display *display,
-                            EGLenum type,
-                            const AttributeMap &attribs,
-                            const Display *currentDisplay,
-                            const gl::Context *currentContext)
+bool ValidateDestroySync(const ValidationContext *val, const Display *display, const Sync *sync)
 {
-    return ValidateCreateSyncBase(display, type, attribs, currentDisplay, currentContext, true);
+    ANGLE_VALIDATION_TRY(ValidateSync(val, display, sync));
+    return true;
 }
 
-Error ValidateCreateSync(const Display *display,
-                         EGLenum type,
-                         const AttributeMap &attribs,
-                         const Display *currentDisplay,
-                         const gl::Context *currentContext)
+bool ValidateDestroySyncKHR(const ValidationContext *val,
+                            const Display *dpyPacked,
+                            const Sync *syncPacked)
 {
-    return ValidateCreateSyncBase(display, type, attribs, currentDisplay, currentContext, false);
+    return ValidateDestroySync(val, dpyPacked, syncPacked);
 }
 
-Error ValidateDestroySync(const Display *display, const Sync *sync)
+bool ValidateClientWaitSync(const ValidationContext *val,
+                            const Display *display,
+                            const Sync *sync,
+                            EGLint flags,
+                            EGLTime timeout)
 {
-    ANGLE_TRY(ValidateSync(display, sync));
-    return NoError();
+    ANGLE_VALIDATION_TRY(ValidateSync(val, display, sync));
+    return true;
 }
 
-Error ValidateClientWaitSync(const Display *display,
-                             const Sync *sync,
-                             EGLint flags,
-                             EGLTime timeout)
+bool ValidateClientWaitSyncKHR(const ValidationContext *val,
+                               const Display *dpyPacked,
+                               const Sync *syncPacked,
+                               EGLint flags,
+                               EGLTimeKHR timeout)
 {
-    ANGLE_TRY(ValidateSync(display, sync));
-    return NoError();
+    return ValidateClientWaitSync(val, dpyPacked, syncPacked, flags, timeout);
 }
 
-Error ValidateWaitSync(const Display *display,
-                       const gl::Context *context,
-                       const Sync *sync,
-                       EGLint flags)
+bool ValidateWaitSync(const ValidationContext *val,
+                      const Display *display,
+                      const Sync *sync,
+                      EGLint flags)
 {
-    ANGLE_TRY(ValidateDisplay(display));
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
 
     const DisplayExtensions &extensions = display->getExtensions();
     if (!extensions.waitSync)
     {
-        return EglBadAccess() << "EGL_KHR_wait_sync extension is not available";
+        val->setError(EGL_BAD_ACCESS, "EGL_KHR_wait_sync extension is not available");
+        return false;
     }
 
-    ANGLE_TRY(ValidateSync(display, sync));
+    ANGLE_VALIDATION_TRY(ValidateSync(val, display, sync));
 
+    gl::Context *context = val->eglThread->getContext();
     if (context == nullptr)
     {
-        return EglBadMatch() << "No context is current.";
+        val->setError(EGL_BAD_MATCH, "No context is current.");
+        return false;
     }
 
     if (!context->getExtensions().eglSyncOES)
     {
-        return EglBadMatch() << "Server-side waits cannot be performed without "
-                                "GL_OES_EGL_sync support.";
+        val->setError(EGL_BAD_MATCH,
+                      "Server-side waits cannot be performed without "
+                      "GL_OES_EGL_sync support.");
+        return false;
     }
 
     if (flags != 0)
     {
-        return EglBadParameter() << "flags must be zero";
+        val->setError(EGL_BAD_PARAMETER, "flags must be zero");
+        return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateGetSyncAttribKHR(const Display *display,
-                               const Sync *sync,
-                               EGLint attribute,
-                               EGLint *value)
+bool ValidateWaitSyncKHR(const ValidationContext *val,
+                         const Display *dpyPacked,
+                         const Sync *syncPacked,
+                         EGLint flags)
+{
+    return ValidateWaitSync(val, dpyPacked, syncPacked, flags);
+}
+
+bool ValidateGetSyncAttrib(const ValidationContext *val,
+                           const Display *display,
+                           const Sync *sync,
+                           EGLint attribute,
+                           const EGLAttrib *value)
 {
     if (value == nullptr)
     {
-        return EglBadParameter() << "Invalid value parameter";
+        val->setError(EGL_BAD_PARAMETER, "Invalid value parameter");
+        return false;
     }
-    return ValidateGetSyncAttribBase(display, sync, attribute);
+    return ValidateGetSyncAttribBase(val, display, sync, attribute);
 }
 
-Error ValidateGetSyncAttrib(const Display *display,
-                            const Sync *sync,
-                            EGLint attribute,
-                            EGLAttrib *value)
+bool ValidateGetSyncAttribKHR(const ValidationContext *val,
+                              const Display *display,
+                              const Sync *sync,
+                              EGLint attribute,
+                              const EGLint *value)
 {
     if (value == nullptr)
     {
-        return EglBadParameter() << "Invalid value parameter";
+        val->setError(EGL_BAD_PARAMETER, "Invalid value parameter");
+        return false;
     }
-    return ValidateGetSyncAttribBase(display, sync, attribute);
+    return ValidateGetSyncAttribBase(val, display, sync, attribute);
 }
 
-Error ValidateCreateStreamKHR(const Display *display, const AttributeMap &attributes)
+bool ValidateCreateStreamKHR(const ValidationContext *val,
+                             const Display *display,
+                             const AttributeMap &attributes)
 {
-    ANGLE_TRY(ValidateDisplay(display));
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
 
     const DisplayExtensions &displayExtensions = display->getExtensions();
     if (!displayExtensions.stream)
     {
-        return EglBadAlloc() << "Stream extension not active";
+        val->setError(EGL_BAD_ALLOC, "Stream extension not active");
+        return false;
     }
 
     for (const auto &attributeIter : attributes)
@@ -3072,39 +3585,44 @@
         EGLAttrib attribute = attributeIter.first;
         EGLAttrib value     = attributeIter.second;
 
-        ANGLE_TRY(ValidateStreamAttribute(attribute, value, displayExtensions));
+        ANGLE_VALIDATION_TRY(ValidateStreamAttribute(val, attribute, value, displayExtensions));
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateDestroyStreamKHR(const Display *display, const Stream *stream)
+bool ValidateDestroyStreamKHR(const ValidationContext *val,
+                              const Display *display,
+                              const Stream *stream)
 {
-    ANGLE_TRY(ValidateStream(display, stream));
-    return NoError();
+    ANGLE_VALIDATION_TRY(ValidateStream(val, display, stream));
+    return true;
 }
 
-Error ValidateStreamAttribKHR(const Display *display,
-                              const Stream *stream,
-                              EGLint attribute,
-                              EGLint value)
+bool ValidateStreamAttribKHR(const ValidationContext *val,
+                             const Display *display,
+                             const Stream *stream,
+                             EGLenum attribute,
+                             EGLint value)
 {
-    ANGLE_TRY(ValidateStream(display, stream));
+    ANGLE_VALIDATION_TRY(ValidateStream(val, display, stream));
 
     if (stream->getState() == EGL_STREAM_STATE_DISCONNECTED_KHR)
     {
-        return EglBadState() << "Bad stream state";
+        val->setError(EGL_BAD_STATE_KHR, "Bad stream state");
+        return false;
     }
 
-    return ValidateStreamAttribute(attribute, value, display->getExtensions());
+    return ValidateStreamAttribute(val, attribute, value, display->getExtensions());
 }
 
-Error ValidateQueryStreamKHR(const Display *display,
-                             const Stream *stream,
-                             EGLenum attribute,
-                             EGLint *value)
+bool ValidateQueryStreamKHR(const ValidationContext *val,
+                            const Display *display,
+                            const Stream *stream,
+                            EGLenum attribute,
+                            const EGLint *value)
 {
-    ANGLE_TRY(ValidateStream(display, stream));
+    ANGLE_VALIDATION_TRY(ValidateStream(val, display, stream));
 
     switch (attribute)
     {
@@ -3114,22 +3632,25 @@
         case EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR:
             if (!display->getExtensions().streamConsumerGLTexture)
             {
-                return EglBadAttribute() << "Consumer GLTexture extension not active";
+                val->setError(EGL_BAD_ATTRIBUTE, "Consumer GLTexture extension not active");
+                return false;
             }
             break;
         default:
-            return EglBadAttribute() << "Invalid attribute";
+            val->setError(EGL_BAD_ATTRIBUTE, "Invalid attribute");
+            return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateQueryStreamu64KHR(const Display *display,
-                                const Stream *stream,
-                                EGLenum attribute,
-                                EGLuint64KHR *value)
+bool ValidateQueryStreamu64KHR(const ValidationContext *val,
+                               const Display *display,
+                               const Stream *stream,
+                               EGLenum attribute,
+                               const EGLuint64KHR *value)
 {
-    ANGLE_TRY(ValidateStream(display, stream));
+    ANGLE_VALIDATION_TRY(ValidateStream(val, display, stream));
 
     switch (attribute)
     {
@@ -3137,82 +3658,95 @@
         case EGL_PRODUCER_FRAME_KHR:
             break;
         default:
-            return EglBadAttribute() << "Invalid attribute";
+            val->setError(EGL_BAD_ATTRIBUTE, "Invalid attribute");
+            return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateStreamConsumerGLTextureExternalKHR(const Display *display,
-                                                 gl::Context *context,
-                                                 const Stream *stream)
+bool ValidateStreamConsumerGLTextureExternalKHR(const ValidationContext *val,
+                                                const Display *display,
+                                                const Stream *stream)
 {
-    ANGLE_TRY(ValidateContext(display, context));
+    gl::Context *context = val->eglThread->getContext();
+    ANGLE_VALIDATION_TRY(ValidateContext(val, display, context));
 
     const DisplayExtensions &displayExtensions = display->getExtensions();
     if (!displayExtensions.streamConsumerGLTexture)
     {
-        return EglBadAccess() << "Stream consumer extension not active";
+        val->setError(EGL_BAD_ACCESS, "Stream consumer extension not active");
+        return false;
     }
 
     if (!context->getExtensions().eglStreamConsumerExternalNV)
     {
-        return EglBadAccess() << "EGL stream consumer external GL extension not enabled";
+        val->setError(EGL_BAD_ACCESS, "EGL stream consumer external GL extension not enabled");
+        return false;
     }
 
     if (stream == EGL_NO_STREAM_KHR || !display->isValidStream(stream))
     {
-        return EglBadStream() << "Invalid stream";
+        val->setError(EGL_BAD_STREAM_KHR, "Invalid stream");
+        return false;
     }
 
     if (stream->getState() != EGL_STREAM_STATE_CREATED_KHR)
     {
-        return EglBadState() << "Invalid stream state";
+        val->setError(EGL_BAD_STATE_KHR, "Invalid stream state");
+        return false;
     }
 
     // Lookup the texture and ensure it is correct
     gl::Texture *texture = context->getState().getTargetTexture(gl::TextureType::External);
     if (texture == nullptr || texture->id().value == 0)
     {
-        return EglBadAccess() << "No external texture bound";
+        val->setError(EGL_BAD_ACCESS, "No external texture bound");
+        return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateStreamConsumerAcquireKHR(const Display *display,
-                                       gl::Context *context,
-                                       const Stream *stream)
+bool ValidateStreamConsumerAcquireKHR(const ValidationContext *val,
+                                      const Display *display,
+                                      const Stream *stream)
 {
-    ANGLE_TRY(ValidateDisplay(display));
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
 
     const DisplayExtensions &displayExtensions = display->getExtensions();
     if (!displayExtensions.streamConsumerGLTexture)
     {
-        return EglBadAccess() << "Stream consumer extension not active";
+        val->setError(EGL_BAD_ACCESS, "Stream consumer extension not active");
+        return false;
     }
 
     if (stream == EGL_NO_STREAM_KHR || !display->isValidStream(stream))
     {
-        return EglBadStream() << "Invalid stream";
+        val->setError(EGL_BAD_STREAM_KHR, "Invalid stream");
+        return false;
     }
 
+    gl::Context *context = val->eglThread->getContext();
     if (!context)
     {
-        return EglBadAccess() << "No GL context current to calling thread.";
+        val->setError(EGL_BAD_ACCESS, "No GL context current to calling thread.");
+        return false;
     }
 
-    ANGLE_TRY(ValidateContext(display, context));
+    ANGLE_VALIDATION_TRY(ValidateContext(val, display, context));
 
     if (!stream->isConsumerBoundToContext(context))
     {
-        return EglBadAccess() << "Current GL context not associated with stream consumer";
+        val->setError(EGL_BAD_ACCESS, "Current GL context not associated with stream consumer");
+        return false;
     }
 
     if (stream->getConsumerType() != Stream::ConsumerType::GLTextureRGB &&
         stream->getConsumerType() != Stream::ConsumerType::GLTextureYUV)
     {
-        return EglBadAccess() << "Invalid stream consumer type";
+        val->setError(EGL_BAD_ACCESS, "Invalid stream consumer type");
+        return false;
     }
 
     // Note: technically EGL_STREAM_STATE_EMPTY_KHR is a valid state when the timeout is non-zero.
@@ -3221,87 +3755,100 @@
     if (stream->getState() != EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR &&
         stream->getState() != EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR)
     {
-        return EglBadState() << "Invalid stream state";
+        val->setError(EGL_BAD_STATE_KHR, "Invalid stream state");
+        return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateStreamConsumerReleaseKHR(const Display *display,
-                                       gl::Context *context,
-                                       const Stream *stream)
+bool ValidateStreamConsumerReleaseKHR(const ValidationContext *val,
+                                      const Display *display,
+                                      const Stream *stream)
 {
-    ANGLE_TRY(ValidateDisplay(display));
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
 
     const DisplayExtensions &displayExtensions = display->getExtensions();
     if (!displayExtensions.streamConsumerGLTexture)
     {
-        return EglBadAccess() << "Stream consumer extension not active";
+        val->setError(EGL_BAD_ACCESS, "Stream consumer extension not active");
+        return false;
     }
 
     if (stream == EGL_NO_STREAM_KHR || !display->isValidStream(stream))
     {
-        return EglBadStream() << "Invalid stream";
+        val->setError(EGL_BAD_STREAM_KHR, "Invalid stream");
+        return false;
     }
 
+    gl::Context *context = val->eglThread->getContext();
     if (!context)
     {
-        return EglBadAccess() << "No GL context current to calling thread.";
+        val->setError(EGL_BAD_ACCESS, "No GL context current to calling thread.");
+        return false;
     }
 
-    ANGLE_TRY(ValidateContext(display, context));
+    ANGLE_VALIDATION_TRY(ValidateContext(val, display, context));
 
     if (!stream->isConsumerBoundToContext(context))
     {
-        return EglBadAccess() << "Current GL context not associated with stream consumer";
+        val->setError(EGL_BAD_ACCESS, "Current GL context not associated with stream consumer");
+        return false;
     }
 
     if (stream->getConsumerType() != Stream::ConsumerType::GLTextureRGB &&
         stream->getConsumerType() != Stream::ConsumerType::GLTextureYUV)
     {
-        return EglBadAccess() << "Invalid stream consumer type";
+        val->setError(EGL_BAD_ACCESS, "Invalid stream consumer type");
+        return false;
     }
 
     if (stream->getState() != EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR &&
         stream->getState() != EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR)
     {
-        return EglBadState() << "Invalid stream state";
+        val->setError(EGL_BAD_STATE_KHR, "Invalid stream state");
+        return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateStreamConsumerGLTextureExternalAttribsNV(const Display *display,
-                                                       gl::Context *context,
-                                                       const Stream *stream,
-                                                       const AttributeMap &attribs)
+bool ValidateStreamConsumerGLTextureExternalAttribsNV(const ValidationContext *val,
+                                                      const Display *display,
+                                                      const Stream *stream,
+                                                      const AttributeMap &attribs)
 {
-    ANGLE_TRY(ValidateDisplay(display));
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
 
     const DisplayExtensions &displayExtensions = display->getExtensions();
     if (!displayExtensions.streamConsumerGLTexture)
     {
-        return EglBadAccess() << "Stream consumer extension not active";
+        val->setError(EGL_BAD_ACCESS, "Stream consumer extension not active");
+        return false;
     }
 
-    ANGLE_TRY(ValidateContext(display, context));
+    gl::Context *context = val->eglThread->getContext();
+    ANGLE_VALIDATION_TRY(ValidateContext(val, display, context));
 
     // Although technically not a requirement in spec, the context needs to be checked for support
     // for external textures or future logic will cause assertations. This extension is also
     // effectively useless without external textures.
     if (!context->getExtensions().eglStreamConsumerExternalNV)
     {
-        return EglBadAccess() << "EGL stream consumer external GL extension not enabled";
+        val->setError(EGL_BAD_ACCESS, "EGL stream consumer external GL extension not enabled");
+        return false;
     }
 
     if (stream == EGL_NO_STREAM_KHR || !display->isValidStream(stream))
     {
-        return EglBadStream() << "Invalid stream";
+        val->setError(EGL_BAD_STREAM_KHR, "Invalid stream");
+        return false;
     }
 
     if (stream->getState() != EGL_STREAM_STATE_CREATED_KHR)
     {
-        return EglBadState() << "Invalid stream state";
+        val->setError(EGL_BAD_STATE_KHR, "Invalid stream state");
+        return false;
     }
 
     const gl::Caps &glCaps = context->getCaps();
@@ -3323,7 +3870,8 @@
             case EGL_COLOR_BUFFER_TYPE:
                 if (value != EGL_RGB_BUFFER && value != EGL_YUV_BUFFER_EXT)
                 {
-                    return EglBadParameter() << "Invalid color buffer type";
+                    val->setError(EGL_BAD_PARAMETER, "Invalid color buffer type");
+                    return false;
                 }
                 colorBufferType = value;
                 break;
@@ -3333,7 +3881,8 @@
                 // inputs
                 if (value < 0)
                 {
-                    return EglBadMatch() << "Invalid plane count";
+                    val->setError(EGL_BAD_MATCH, "Invalid plane count");
+                    return false;
                 }
                 planeCount = value;
                 break;
@@ -3345,13 +3894,15 @@
                          value >= static_cast<EGLAttrib>(glCaps.maxCombinedTextureImageUnits)) &&
                         value != EGL_NONE)
                     {
-                        return EglBadAccess() << "Invalid texture unit";
+                        val->setError(EGL_BAD_ACCESS, "Invalid texture unit");
+                        return false;
                     }
                     plane[attribute - EGL_YUV_PLANE0_TEXTURE_UNIT_NV] = value;
                 }
                 else
                 {
-                    return EglBadAttribute() << "Invalid attribute";
+                    val->setError(EGL_BAD_ATTRIBUTE, "Invalid attribute");
+                    return false;
                 }
         }
     }
@@ -3360,13 +3911,15 @@
     {
         if (planeCount > 0)
         {
-            return EglBadMatch() << "Plane count must be 0 for RGB buffer";
+            val->setError(EGL_BAD_MATCH, "Plane count must be 0 for RGB buffer");
+            return false;
         }
         for (int i = 0; i < 3; i++)
         {
             if (plane[i] != -1)
             {
-                return EglBadMatch() << "Planes cannot be specified";
+                val->setError(EGL_BAD_MATCH, "Planes cannot be specified");
+                return false;
             }
         }
 
@@ -3374,7 +3927,8 @@
         gl::Texture *texture = context->getState().getTargetTexture(gl::TextureType::External);
         if (texture == nullptr || texture->id().value == 0)
         {
-            return EglBadAccess() << "No external texture bound";
+            val->setError(EGL_BAD_ACCESS, "No external texture bound");
+            return false;
         }
     }
     else
@@ -3385,13 +3939,15 @@
         }
         if (planeCount < 1 || planeCount > 3)
         {
-            return EglBadMatch() << "Invalid YUV plane count";
+            val->setError(EGL_BAD_MATCH, "Invalid YUV plane count");
+            return false;
         }
         for (EGLAttrib i = planeCount; i < 3; i++)
         {
             if (plane[i] != -1)
             {
-                return EglBadMatch() << "Invalid plane specified";
+                val->setError(EGL_BAD_MATCH, "Invalid plane specified");
+                return false;
             }
         }
 
@@ -3401,7 +3957,8 @@
         {
             if (plane[i] == -1)
             {
-                return EglBadMatch() << "Not all planes specified";
+                val->setError(EGL_BAD_MATCH, "Not all planes specified");
+                return false;
             }
             if (plane[i] != EGL_NONE)
             {
@@ -3409,43 +3966,50 @@
                     static_cast<unsigned int>(plane[i]), gl::TextureType::External);
                 if (texture == nullptr || texture->id().value == 0)
                 {
-                    return EglBadAccess()
-                           << "No external texture bound at one or more specified texture units";
+                    val->setError(
+                        EGL_BAD_ACCESS,
+                        "No external texture bound at one or more specified texture units");
+                    return false;
                 }
                 if (textureSet.find(texture) != textureSet.end())
                 {
-                    return EglBadAccess() << "Multiple planes bound to same texture object";
+                    val->setError(EGL_BAD_ACCESS, "Multiple planes bound to same texture object");
+                    return false;
                 }
                 textureSet.insert(texture);
             }
         }
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateCreateStreamProducerD3DTextureANGLE(const Display *display,
-                                                  const Stream *stream,
-                                                  const AttributeMap &attribs)
+bool ValidateCreateStreamProducerD3DTextureANGLE(const ValidationContext *val,
+                                                 const Display *display,
+                                                 const Stream *stream,
+                                                 const AttributeMap &attribs)
 {
-    ANGLE_TRY(ValidateDisplay(display));
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
 
     const DisplayExtensions &displayExtensions = display->getExtensions();
     if (!displayExtensions.streamProducerD3DTexture)
     {
-        return EglBadAccess() << "Stream producer extension not active";
+        val->setError(EGL_BAD_ACCESS, "Stream producer extension not active");
+        return false;
     }
 
-    ANGLE_TRY(ValidateStream(display, stream));
+    ANGLE_VALIDATION_TRY(ValidateStream(val, display, stream));
 
     if (!attribs.isEmpty())
     {
-        return EglBadAttribute() << "Invalid attribute";
+        val->setError(EGL_BAD_ATTRIBUTE, "Invalid attribute");
+        return false;
     }
 
     if (stream->getState() != EGL_STREAM_STATE_CONNECTING_KHR)
     {
-        return EglBadState() << "Stream not in connecting state";
+        val->setError(EGL_BAD_STATE_KHR, "Stream not in connecting state");
+        return false;
     }
 
     switch (stream->getConsumerType())
@@ -3453,38 +4017,43 @@
         case Stream::ConsumerType::GLTextureYUV:
             if (stream->getPlaneCount() != 2)
             {
-                return EglBadMatch() << "Incompatible stream consumer type";
+                val->setError(EGL_BAD_MATCH, "Incompatible stream consumer type");
+                return false;
             }
             break;
 
         case Stream::ConsumerType::GLTextureRGB:
             if (stream->getPlaneCount() != 1)
             {
-                return EglBadMatch() << "Incompatible stream consumer type";
+                val->setError(EGL_BAD_MATCH, "Incompatible stream consumer type");
+                return false;
             }
             break;
 
         default:
-            return EglBadMatch() << "Incompatible stream consumer type";
+            val->setError(EGL_BAD_MATCH, "Incompatible stream consumer type");
+            return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateStreamPostD3DTextureANGLE(const Display *display,
-                                        const Stream *stream,
-                                        void *texture,
-                                        const AttributeMap &attribs)
+bool ValidateStreamPostD3DTextureANGLE(const ValidationContext *val,
+                                       const Display *display,
+                                       const Stream *stream,
+                                       const void *texture,
+                                       const AttributeMap &attribs)
 {
-    ANGLE_TRY(ValidateDisplay(display));
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
 
     const DisplayExtensions &displayExtensions = display->getExtensions();
     if (!displayExtensions.streamProducerD3DTexture)
     {
-        return EglBadAccess() << "Stream producer extension not active";
+        val->setError(EGL_BAD_ACCESS, "Stream producer extension not active");
+        return false;
     }
 
-    ANGLE_TRY(ValidateStream(display, stream));
+    ANGLE_VALIDATION_TRY(ValidateStream(val, display, stream));
 
     for (auto &attributeIter : attribs)
     {
@@ -3496,17 +4065,20 @@
             case EGL_D3D_TEXTURE_SUBRESOURCE_ID_ANGLE:
                 if (value < 0)
                 {
-                    return EglBadParameter() << "Invalid subresource index";
+                    val->setError(EGL_BAD_PARAMETER, "Invalid subresource index");
+                    return false;
                 }
                 break;
             case EGL_NATIVE_BUFFER_PLANE_OFFSET_IMG:
                 if (value < 0)
                 {
-                    return EglBadParameter() << "Invalid plane offset";
+                    val->setError(EGL_BAD_PARAMETER, "Invalid plane offset");
+                    return false;
                 }
                 break;
             default:
-                return EglBadAttribute() << "Invalid attribute";
+                val->setError(EGL_BAD_ATTRIBUTE, "Invalid attribute");
+                return false;
         }
     }
 
@@ -3514,424 +4086,479 @@
         stream->getState() != EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR &&
         stream->getState() != EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR)
     {
-        return EglBadState() << "Stream not fully configured";
+        val->setError(EGL_BAD_STATE_KHR, "Stream not fully configured");
+        return false;
     }
 
     if (stream->getProducerType() != Stream::ProducerType::D3D11Texture)
     {
-        return EglBadMatch() << "Incompatible stream producer";
+        val->setError(EGL_BAD_MATCH, "Incompatible stream producer");
+        return false;
     }
 
     if (texture == nullptr)
     {
-        return EglBadParameter() << "Texture is null";
+        val->setError(EGL_BAD_PARAMETER, "Texture is null");
+        return false;
     }
 
-    return stream->validateD3D11Texture(texture, attribs);
+    ANGLE_EGL_TRY_RETURN(val->eglThread, stream->validateD3D11Texture(texture, attribs),
+                         val->entryPoint, val->labeledObject, false);
+
+    return true;
 }
 
-Error ValidateSyncControlCHROMIUM(const Display *display, const Surface *eglSurface)
+bool ValidateSyncControlCHROMIUM(const ValidationContext *val,
+                                 const Display *display,
+                                 const Surface *eglSurface)
 {
-    ANGLE_TRY(ValidateDisplay(display));
-    ANGLE_TRY(ValidateSurface(display, eglSurface));
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
+    ANGLE_VALIDATION_TRY(ValidateSurface(val, display, eglSurface));
 
     const DisplayExtensions &displayExtensions = display->getExtensions();
     if (!displayExtensions.syncControlCHROMIUM)
     {
-        return EglBadAccess() << "syncControlCHROMIUM extension not active";
+        val->setError(EGL_BAD_ACCESS, "syncControlCHROMIUM extension not active");
+        return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateSyncControlRateANGLE(const Display *display, const Surface *eglSurface)
+bool ValidateSyncControlRateANGLE(const ValidationContext *val,
+                                  const Display *display,
+                                  const Surface *eglSurface)
 {
-    ANGLE_TRY(ValidateDisplay(display));
-    ANGLE_TRY(ValidateSurface(display, eglSurface));
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
+    ANGLE_VALIDATION_TRY(ValidateSurface(val, display, eglSurface));
 
     const DisplayExtensions &displayExtensions = display->getExtensions();
     if (!displayExtensions.syncControlRateANGLE)
     {
-        return EglBadAccess() << "syncControlRateANGLE extension not active";
+        val->setError(EGL_BAD_ACCESS, "syncControlRateANGLE extension not active");
+        return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateGetMscRateANGLE(const Display *display,
-                              const Surface *eglSurface,
-                              const EGLint *numerator,
-                              const EGLint *denominator)
+bool ValidateGetMscRateANGLE(const ValidationContext *val,
+                             const Display *display,
+                             const Surface *eglSurface,
+                             const EGLint *numerator,
+                             const EGLint *denominator)
 {
-    ANGLE_TRY(ValidateSyncControlRateANGLE(display, eglSurface));
+    ANGLE_VALIDATION_TRY(ValidateSyncControlRateANGLE(val, display, eglSurface));
 
     if (numerator == nullptr)
     {
-        return EglBadParameter() << "numerator is null";
+        val->setError(EGL_BAD_PARAMETER, "numerator is null");
+        return false;
     }
     if (denominator == nullptr)
     {
-        return EglBadParameter() << "denominator is null";
+        val->setError(EGL_BAD_PARAMETER, "denominator is null");
+        return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateGetSyncValuesCHROMIUM(const Display *display,
-                                    const Surface *eglSurface,
-                                    const EGLuint64KHR *ust,
-                                    const EGLuint64KHR *msc,
-                                    const EGLuint64KHR *sbc)
+bool ValidateGetSyncValuesCHROMIUM(const ValidationContext *val,
+                                   const Display *display,
+                                   const Surface *eglSurface,
+                                   const EGLuint64KHR *ust,
+                                   const EGLuint64KHR *msc,
+                                   const EGLuint64KHR *sbc)
 {
-    ANGLE_TRY(ValidateSyncControlCHROMIUM(display, eglSurface));
+    ANGLE_VALIDATION_TRY(ValidateSyncControlCHROMIUM(val, display, eglSurface));
 
     if (ust == nullptr)
     {
-        return EglBadParameter() << "ust is null";
+        val->setError(EGL_BAD_PARAMETER, "ust is null");
+        return false;
     }
     if (msc == nullptr)
     {
-        return EglBadParameter() << "msc is null";
+        val->setError(EGL_BAD_PARAMETER, "msc is null");
+        return false;
     }
     if (sbc == nullptr)
     {
-        return EglBadParameter() << "sbc is null";
+        val->setError(EGL_BAD_PARAMETER, "sbc is null");
+        return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateDestroySurface(const Display *display,
-                             const Surface *surface,
-                             const EGLSurface eglSurface)
+bool ValidateDestroySurface(const ValidationContext *val,
+                            const Display *display,
+                            const Surface *surface)
 {
-    ANGLE_TRY(ValidateSurface(display, surface));
-
-    if (eglSurface == EGL_NO_SURFACE)
-    {
-        return EglBadSurface();
-    }
-
-    return NoError();
+    ANGLE_VALIDATION_TRY(ValidateSurface(val, display, surface));
+    return true;
 }
 
-Error ValidateDestroyContext(const Display *display,
-                             const gl::Context *glCtx,
-                             const EGLContext eglCtx)
+bool ValidateDestroyContext(const ValidationContext *val,
+                            const Display *display,
+                            const gl::Context *glCtx)
 {
-    ANGLE_TRY(ValidateContext(display, glCtx));
-
-    if (eglCtx == EGL_NO_CONTEXT)
-    {
-        return EglBadContext();
-    }
-
-    return NoError();
+    ANGLE_VALIDATION_TRY(ValidateContext(val, display, glCtx));
+    return true;
 }
 
-Error ValidateSwapBuffers(Thread *thread, const Display *display, const Surface *eglSurface)
+bool ValidateSwapBuffers(const ValidationContext *val,
+                         const Display *display,
+                         const Surface *eglSurface)
 {
-    ANGLE_TRY(ValidateSurface(display, eglSurface));
+    ANGLE_VALIDATION_TRY(ValidateSurface(val, display, eglSurface));
 
     if (display->isDeviceLost())
     {
-        return EglContextLost();
+        val->setError(EGL_CONTEXT_LOST);
+        return false;
     }
 
-    if (eglSurface == EGL_NO_SURFACE || !thread->getContext() ||
-        thread->getCurrentDrawSurface() != eglSurface)
+    if (eglSurface == EGL_NO_SURFACE || !val->eglThread->getContext() ||
+        val->eglThread->getCurrentDrawSurface() != eglSurface)
     {
-        return EglBadSurface();
+        val->setError(EGL_BAD_SURFACE);
+        return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateSwapBuffersWithDamageKHR(const Display *display,
-                                       const Surface *surface,
-                                       EGLint *rects,
-                                       EGLint n_rects)
+bool ValidateSwapBuffersWithDamageKHR(const ValidationContext *val,
+                                      const Display *display,
+                                      const Surface *surface,
+                                      const EGLint *rects,
+                                      EGLint n_rects)
 {
-    ANGLE_TRY(ValidateSurface(display, surface));
+    ANGLE_VALIDATION_TRY(ValidateSurface(val, display, surface));
 
     if (!display->getExtensions().swapBuffersWithDamage)
     {
         // It is out of spec what happens when calling an extension function when the extension is
         // not available. EGL_BAD_DISPLAY seems like a reasonable error.
-        return EglBadDisplay() << "EGL_KHR_swap_buffers_with_damage is not available.";
+        val->setError(EGL_BAD_DISPLAY, "EGL_KHR_swap_buffers_with_damage is not available.");
+        return false;
     }
 
     if (surface == EGL_NO_SURFACE)
     {
-        return EglBadSurface() << "Swap surface cannot be EGL_NO_SURFACE.";
+        val->setError(EGL_BAD_SURFACE, "Swap surface cannot be EGL_NO_SURFACE.");
+        return false;
     }
 
     if (n_rects < 0)
     {
-        return EglBadParameter() << "n_rects cannot be negative.";
+        val->setError(EGL_BAD_PARAMETER, "n_rects cannot be negative.");
+        return false;
     }
 
     if (n_rects > 0 && rects == nullptr)
     {
-        return EglBadParameter() << "n_rects cannot be greater than zero when rects is NULL.";
+        val->setError(EGL_BAD_PARAMETER, "n_rects cannot be greater than zero when rects is NULL.");
+        return false;
     }
 
     // TODO(jmadill): Validate Surface is bound to the thread.
 
-    return NoError();
+    return true;
 }
 
-Error ValidateWaitNative(const Display *display, const EGLint engine)
+bool ValidateWaitNative(const ValidationContext *val, const EGLint engine)
 {
-    ANGLE_TRY(ValidateDisplay(display));
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, val->eglThread->getDisplay()));
 
     if (engine != EGL_CORE_NATIVE_ENGINE)
     {
-        return EglBadParameter() << "the 'engine' parameter has an unrecognized value";
+        val->setError(EGL_BAD_PARAMETER, "the 'engine' parameter has an unrecognized value");
+        return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateCopyBuffers(Display *display, const Surface *surface)
+bool ValidateCopyBuffers(const ValidationContext *val,
+                         const Display *display,
+                         const Surface *surface,
+                         EGLNativePixmapType target)
 {
-    ANGLE_TRY(ValidateSurface(display, surface));
+    ANGLE_VALIDATION_TRY(ValidateSurface(val, display, surface));
 
-    if (display->testDeviceLost())
+    if (display->isDeviceLost())
     {
-        return EglContextLost();
+        val->setError(EGL_CONTEXT_LOST);
+        return false;
     }
 
-    return NoError();
+    return true;
 }
 
-// Validate state for eglBindTexImage. If context is non-null then textureObject will be set to
-// surface's texture that will have an image bound to it
-Error ValidateBindTexImage(const Display *display,
-                           const Surface *surface,
-                           const EGLSurface eglSurface,
-                           const EGLint buffer,
-                           const gl::Context *context,
-                           gl::Texture **textureObject)
+bool ValidateBindTexImage(const ValidationContext *val,
+                          const Display *display,
+                          const Surface *surface,
+                          const EGLint buffer)
 {
-    ANGLE_TRY(ValidateSurface(display, surface));
+    ANGLE_VALIDATION_TRY(ValidateSurface(val, display, surface));
 
     if (buffer != EGL_BACK_BUFFER)
     {
-        return EglBadParameter();
+        val->setError(EGL_BAD_PARAMETER);
+        return false;
     }
 
-    if (eglSurface == EGL_NO_SURFACE || surface->getType() == EGL_WINDOW_BIT)
+    if (surface->getType() == EGL_WINDOW_BIT)
     {
-        return EglBadSurface();
+        val->setError(EGL_BAD_SURFACE);
+        return false;
     }
 
     if (surface->getBoundTexture())
     {
-        return EglBadAccess();
+        val->setError(EGL_BAD_ACCESS);
+        return false;
     }
 
     if (surface->getTextureFormat() == TextureFormat::NoTexture)
     {
-        return EglBadMatch();
+        val->setError(EGL_BAD_MATCH);
+        return false;
     }
 
+    gl::Context *context = val->eglThread->getContext();
     if (context)
     {
         gl::TextureType type = egl_gl::EGLTextureTargetToTextureType(surface->getTextureTarget());
-        *textureObject       = context->getTextureByType(type);
-        ASSERT(*textureObject != nullptr);
+        gl::Texture *textureObject = context->getTextureByType(type);
+        ASSERT(textureObject != nullptr);
 
-        if ((*textureObject)->getImmutableFormat())
+        if (textureObject->getImmutableFormat())
         {
-            return EglBadMatch();
+            val->setError(EGL_BAD_MATCH);
+            return false;
         }
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateReleaseTexImage(const Display *display,
-                              const Surface *surface,
-                              const EGLSurface eglSurface,
-                              const EGLint buffer)
+bool ValidateReleaseTexImage(const ValidationContext *val,
+                             const Display *display,
+                             const Surface *surface,
+                             const EGLint buffer)
 {
-    ANGLE_TRY(ValidateSurface(display, surface));
+    ANGLE_VALIDATION_TRY(ValidateSurface(val, display, surface));
 
     if (buffer != EGL_BACK_BUFFER)
     {
-        return EglBadParameter();
+        val->setError(EGL_BAD_PARAMETER);
+        return false;
     }
 
-    if (eglSurface == EGL_NO_SURFACE || surface->getType() == EGL_WINDOW_BIT)
+    if (surface->getType() == EGL_WINDOW_BIT)
     {
-        return EglBadSurface();
+        val->setError(EGL_BAD_SURFACE);
+        return false;
     }
 
     if (surface->getTextureFormat() == TextureFormat::NoTexture)
     {
-        return EglBadMatch();
+        val->setError(EGL_BAD_MATCH);
+        return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateSwapInterval(const Display *display,
-                           const Surface *draw_surface,
-                           const gl::Context *context)
+bool ValidateSwapInterval(const ValidationContext *val, const Display *display, EGLint interval)
 {
-    ANGLE_TRY(ValidateContext(display, context));
+    const gl::Context *context = val->eglThread->getContext();
+    ANGLE_VALIDATION_TRY(ValidateContext(val, display, context));
 
-    if (draw_surface == nullptr)
+    Surface *drawSurface = val->eglThread->getCurrentDrawSurface();
+    if (drawSurface == nullptr)
     {
-        return EglBadSurface();
+        val->setError(EGL_BAD_SURFACE);
+        return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateBindAPI(const EGLenum api)
+bool ValidateBindAPI(const ValidationContext *val, const EGLenum api)
 {
     switch (api)
     {
         case EGL_OPENGL_API:
         case EGL_OPENVG_API:
-            return EglBadParameter();  // Not supported by this implementation
+            val->setError(EGL_BAD_PARAMETER);
+            return false;  // Not supported by this implementation
         case EGL_OPENGL_ES_API:
             break;
         default:
-            return EglBadParameter();
+            val->setError(EGL_BAD_PARAMETER);
+            return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidatePresentationTimeANDROID(const Display *display,
-                                      const Surface *surface,
-                                      EGLnsecsANDROID time)
+bool ValidatePresentationTimeANDROID(const ValidationContext *val,
+                                     const Display *display,
+                                     const Surface *surface,
+                                     EGLnsecsANDROID time)
 {
-    ANGLE_TRY(ValidateDisplay(display));
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
 
     if (!display->getExtensions().presentationTime)
     {
         // It is out of spec what happens when calling an extension function when the extension is
         // not available. EGL_BAD_DISPLAY seems like a reasonable error.
-        return EglBadDisplay() << "EGL_ANDROID_presentation_time is not available.";
+        val->setError(EGL_BAD_DISPLAY, "EGL_ANDROID_presentation_time is not available.");
+        return false;
     }
 
-    ANGLE_TRY(ValidateSurface(display, surface));
+    ANGLE_VALIDATION_TRY(ValidateSurface(val, display, surface));
 
-    return NoError();
+    return true;
 }
 
-Error ValidateSetBlobCacheANDROID(const Display *display,
-                                  EGLSetBlobFuncANDROID set,
-                                  EGLGetBlobFuncANDROID get)
+bool ValidateSetBlobCacheFuncsANDROID(const ValidationContext *val,
+                                      const Display *display,
+                                      EGLSetBlobFuncANDROID set,
+                                      EGLGetBlobFuncANDROID get)
 {
-    ANGLE_TRY(ValidateDisplay(display));
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
 
     if (display->areBlobCacheFuncsSet())
     {
-        return EglBadParameter()
-               << "Blob cache functions can only be set once in the lifetime of a Display";
+        val->setError(EGL_BAD_PARAMETER,
+                      "Blob cache functions can only be set once in the lifetime of a Display");
+        return false;
     }
 
     if (set == nullptr || get == nullptr)
     {
-        return EglBadParameter() << "Blob cache callbacks cannot be null.";
+        val->setError(EGL_BAD_PARAMETER, "Blob cache callbacks cannot be null.");
+        return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateGetConfigAttrib(const Display *display, const Config *config, EGLint attribute)
+bool ValidateGetConfigAttrib(const ValidationContext *val,
+                             const Display *display,
+                             const Config *config,
+                             EGLint attribute,
+                             const EGLint *value)
 {
-    ANGLE_TRY(ValidateConfig(display, config));
-    ANGLE_TRY(ValidateConfigAttribute(display, static_cast<EGLAttrib>(attribute)));
-    return NoError();
+    ANGLE_VALIDATION_TRY(ValidateConfig(val, display, config));
+    ANGLE_TRY(ValidateConfigAttribute(val, display, static_cast<EGLAttrib>(attribute)));
+    return true;
 }
 
-Error ValidateChooseConfig(const Display *display,
-                           const AttributeMap &attribs,
-                           EGLint configSize,
-                           EGLint *numConfig)
+bool ValidateChooseConfig(const ValidationContext *val,
+                          const Display *display,
+                          const AttributeMap &attribs,
+                          const EGLConfig *configs,
+                          EGLint configSize,
+                          const EGLint *numConfig)
 {
-    ANGLE_TRY(ValidateDisplay(display));
-    ANGLE_TRY(ValidateConfigAttributes(display, attribs));
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
+    ANGLE_VALIDATION_TRY(ValidateConfigAttributes(val, display, attribs));
 
     if (numConfig == nullptr)
     {
-        return EglBadParameter() << "num_config cannot be null.";
+        val->setError(EGL_BAD_PARAMETER, "num_config cannot be null.");
+        return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateGetConfigs(const Display *display, EGLint configSize, EGLint *numConfig)
+bool ValidateGetConfigs(const ValidationContext *val,
+                        const Display *display,
+                        const EGLConfig *configs,
+                        EGLint configSize,
+                        const EGLint *numConfig)
 {
-    ANGLE_TRY(ValidateDisplay(display));
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
 
     if (numConfig == nullptr)
     {
-        return EglBadParameter() << "num_config cannot be null.";
+        val->setError(EGL_BAD_PARAMETER, "num_config cannot be null.");
+        return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateGetPlatformDisplay(EGLenum platform,
-                                 void *native_display,
-                                 const EGLAttrib *attrib_list)
+bool ValidateGetPlatformDisplay(const ValidationContext *val,
+                                EGLenum platform,
+                                const void *native_display,
+                                const AttributeMap &attribMap)
 {
-    const auto &attribMap = AttributeMap::CreateFromAttribArray(attrib_list);
-    return ValidateGetPlatformDisplayCommon(platform, native_display, attribMap);
+    return ValidateGetPlatformDisplayCommon(val, platform, native_display, attribMap);
 }
 
-Error ValidateGetPlatformDisplayEXT(EGLenum platform,
-                                    void *native_display,
-                                    const EGLint *attrib_list)
+bool ValidateGetPlatformDisplayEXT(const ValidationContext *val,
+                                   EGLenum platform,
+                                   const void *native_display,
+                                   const AttributeMap &attribMap)
 {
-    const auto &attribMap = AttributeMap::CreateFromIntArray(attrib_list);
-    return ValidateGetPlatformDisplayCommon(platform, native_display, attribMap);
+    return ValidateGetPlatformDisplayCommon(val, platform, native_display, attribMap);
 }
 
-Error ValidateCreatePlatformWindowSurfaceEXT(const Display *display,
-                                             const Config *configuration,
-                                             void *nativeWindow,
-                                             const AttributeMap &attributes)
+bool ValidateCreatePlatformWindowSurfaceEXT(const ValidationContext *val,
+                                            const Display *display,
+                                            const Config *configuration,
+                                            const void *nativeWindow,
+                                            const AttributeMap &attributes)
 {
     if (!Display::GetClientExtensions().platformBase)
     {
-        return EglBadAccess() << "EGL_EXT_platform_base not supported";
+        val->setError(EGL_BAD_ACCESS, "EGL_EXT_platform_base not supported");
+        return false;
     }
 
-    ANGLE_TRY(ValidateConfig(display, configuration));
+    ANGLE_VALIDATION_TRY(ValidateConfig(val, display, configuration));
 
-    return EglBadDisplay() << "ValidateCreatePlatformWindowSurfaceEXT unimplemented.";
+    val->setError(EGL_BAD_DISPLAY, "ValidateCreatePlatformWindowSurfaceEXT unimplemented.");
+    return false;
 }
 
-Error ValidateCreatePlatformPixmapSurfaceEXT(const Display *display,
-                                             const Config *configuration,
-                                             void *nativePixmap,
-                                             const AttributeMap &attributes)
+bool ValidateCreatePlatformPixmapSurfaceEXT(const ValidationContext *val,
+                                            const Display *display,
+                                            const Config *configuration,
+                                            const void *nativePixmap,
+                                            const AttributeMap &attributes)
 {
     if (!Display::GetClientExtensions().platformBase)
     {
-        return EglBadAccess() << "EGL_EXT_platform_base not supported";
+        val->setError(EGL_BAD_ACCESS, "EGL_EXT_platform_base not supported");
+        return false;
     }
 
-    ANGLE_TRY(ValidateConfig(display, configuration));
+    ANGLE_VALIDATION_TRY(ValidateConfig(val, display, configuration));
 
-    return EglBadDisplay() << "ValidateCreatePlatformPixmapSurfaceEXT unimplemented.";
+    val->setError(EGL_BAD_DISPLAY, "ValidateCreatePlatformPixmapSurfaceEXT unimplemented.");
+    return false;
 }
 
-Error ValidateProgramCacheGetAttribANGLE(const Display *display, EGLenum attrib)
+bool ValidateProgramCacheGetAttribANGLE(const ValidationContext *val,
+                                        const Display *display,
+                                        EGLenum attrib)
 {
-    ANGLE_TRY(ValidateDisplay(display));
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
 
     if (!display->getExtensions().programCacheControl)
     {
-        return EglBadAccess() << "Extension not supported";
+        val->setError(EGL_BAD_ACCESS, "Extension not supported");
+        return false;
     }
 
     switch (attrib)
@@ -3941,93 +4568,110 @@
             break;
 
         default:
-            return EglBadParameter() << "Invalid program cache attribute.";
+            val->setError(EGL_BAD_PARAMETER, "Invalid program cache attribute.");
+            return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateProgramCacheQueryANGLE(const Display *display,
-                                     EGLint index,
-                                     void *key,
-                                     EGLint *keysize,
-                                     void *binary,
-                                     EGLint *binarysize)
+bool ValidateProgramCacheQueryANGLE(const ValidationContext *val,
+                                    const Display *display,
+                                    EGLint index,
+                                    const void *key,
+                                    const EGLint *keysize,
+                                    const void *binary,
+                                    const EGLint *binarysize)
 {
-    ANGLE_TRY(ValidateDisplay(display));
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
 
     if (!display->getExtensions().programCacheControl)
     {
-        return EglBadAccess() << "Extension not supported";
+        val->setError(EGL_BAD_ACCESS, "Extension not supported");
+        return false;
     }
 
     if (index < 0 || index >= display->programCacheGetAttrib(EGL_PROGRAM_CACHE_SIZE_ANGLE))
     {
-        return EglBadParameter() << "Program index out of range.";
+        val->setError(EGL_BAD_PARAMETER, "Program index out of range.");
+        return false;
     }
 
     if (keysize == nullptr || binarysize == nullptr)
     {
-        return EglBadParameter() << "keysize and binarysize must always be valid pointers.";
+        val->setError(EGL_BAD_PARAMETER, "keysize and binarysize must always be valid pointers.");
+        return false;
     }
 
     if (binary && *keysize != static_cast<EGLint>(egl::BlobCache::kKeyLength))
     {
-        return EglBadParameter() << "Invalid program key size.";
+        val->setError(EGL_BAD_PARAMETER, "Invalid program key size.");
+        return false;
     }
 
     if ((key == nullptr) != (binary == nullptr))
     {
-        return EglBadParameter() << "key and binary must both be null or both non-null.";
+        val->setError(EGL_BAD_PARAMETER, "key and binary must both be null or both non-null.");
+        return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateProgramCachePopulateANGLE(const Display *display,
-                                        const void *key,
-                                        EGLint keysize,
-                                        const void *binary,
-                                        EGLint binarysize)
+bool ValidateProgramCachePopulateANGLE(const ValidationContext *val,
+                                       const Display *display,
+                                       const void *key,
+                                       EGLint keysize,
+                                       const void *binary,
+                                       EGLint binarysize)
 {
-    ANGLE_TRY(ValidateDisplay(display));
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
 
     if (!display->getExtensions().programCacheControl)
     {
-        return EglBadAccess() << "Extension not supported";
+        val->setError(EGL_BAD_ACCESS, "Extension not supported");
+        return false;
     }
 
     if (keysize != static_cast<EGLint>(egl::BlobCache::kKeyLength))
     {
-        return EglBadParameter() << "Invalid program key size.";
+        val->setError(EGL_BAD_PARAMETER, "Invalid program key size.");
+        return false;
     }
 
     if (key == nullptr || binary == nullptr)
     {
-        return EglBadParameter() << "null pointer in arguments.";
+        val->setError(EGL_BAD_PARAMETER, "null pointer in arguments.");
+        return false;
     }
 
     // Upper bound for binarysize is arbitrary.
     if (binarysize <= 0 || binarysize > egl::kProgramCacheSizeAbsoluteMax)
     {
-        return EglBadParameter() << "binarysize out of valid range.";
+        val->setError(EGL_BAD_PARAMETER, "binarysize out of valid range.");
+        return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateProgramCacheResizeANGLE(const Display *display, EGLint limit, EGLenum mode)
+bool ValidateProgramCacheResizeANGLE(const ValidationContext *val,
+                                     const Display *display,
+                                     EGLint limit,
+                                     EGLint mode)
 {
-    ANGLE_TRY(ValidateDisplay(display));
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
 
     if (!display->getExtensions().programCacheControl)
     {
-        return EglBadAccess() << "Extension not supported";
+        val->setError(EGL_BAD_ACCESS, "Extension not supported");
+        return false;
     }
 
     if (limit < 0)
     {
-        return EglBadParameter() << "limit must be non-negative.";
+        val->setError(EGL_BAD_PARAMETER, "limit must be non-negative.");
+        return false;
     }
 
     switch (mode)
@@ -4037,23 +4681,26 @@
             break;
 
         default:
-            return EglBadParameter() << "Invalid cache resize mode.";
+            val->setError(EGL_BAD_PARAMETER, "Invalid cache resize mode.");
+            return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateSurfaceAttrib(const Display *display,
-                            const Surface *surface,
-                            EGLint attribute,
-                            EGLint value)
+bool ValidateSurfaceAttrib(const ValidationContext *val,
+                           const Display *display,
+                           const Surface *surface,
+                           EGLint attribute,
+                           EGLint value)
 {
-    ANGLE_TRY(ValidateDisplay(display));
-    ANGLE_TRY(ValidateSurface(display, surface));
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
+    ANGLE_VALIDATION_TRY(ValidateSurface(val, display, surface));
 
     if (surface == EGL_NO_SURFACE)
     {
-        return EglBadSurface() << "Surface cannot be EGL_NO_SURFACE.";
+        val->setError(EGL_BAD_SURFACE, "Surface cannot be EGL_NO_SURFACE.");
+        return false;
     }
 
     switch (attribute)
@@ -4070,13 +4717,15 @@
                 case EGL_MULTISAMPLE_RESOLVE_BOX:
                     if ((surface->getConfig()->surfaceType & EGL_MULTISAMPLE_RESOLVE_BOX_BIT) == 0)
                     {
-                        return EglBadMatch()
-                               << "Surface does not support EGL_MULTISAMPLE_RESOLVE_BOX.";
+                        val->setError(EGL_BAD_MATCH,
+                                      "Surface does not support EGL_MULTISAMPLE_RESOLVE_BOX.");
+                        return false;
                     }
                     break;
 
                 default:
-                    return EglBadAttribute() << "Invalid multisample resolve type.";
+                    val->setError(EGL_BAD_ATTRIBUTE, "Invalid multisample resolve type.");
+                    return false;
             }
             break;
 
@@ -4086,8 +4735,9 @@
                 case EGL_BUFFER_PRESERVED:
                     if ((surface->getConfig()->surfaceType & EGL_SWAP_BEHAVIOR_PRESERVED_BIT) == 0)
                     {
-                        return EglBadMatch()
-                               << "Surface does not support EGL_SWAP_BEHAVIOR_PRESERVED.";
+                        val->setError(EGL_BAD_MATCH,
+                                      "Surface does not support EGL_SWAP_BEHAVIOR_PRESERVED.");
+                        return false;
                     }
                     break;
 
@@ -4095,7 +4745,8 @@
                     break;
 
                 default:
-                    return EglBadAttribute() << "Invalid swap behaviour.";
+                    val->setError(EGL_BAD_ATTRIBUTE, "Invalid swap behaviour.");
+                    return false;
             }
             break;
 
@@ -4103,21 +4754,27 @@
         case EGL_HEIGHT:
             if (!display->getExtensions().windowFixedSize)
             {
-                return EglBadAttribute() << "EGL_WIDTH or EGL_HEIGHT cannot be set without "
-                                            "EGL_ANGLE_window_fixed_size support.";
+                val->setError(EGL_BAD_ATTRIBUTE,
+                              "EGL_WIDTH or EGL_HEIGHT cannot be set without "
+                              "EGL_ANGLE_window_fixed_size support.");
+                return false;
             }
             if (!surface->isFixedSize())
             {
-                return EglBadMatch() << "EGL_WIDTH or EGL_HEIGHT cannot be set without "
-                                        "EGL_FIXED_SIZE_ANGLE being enabled on the surface.";
+                val->setError(EGL_BAD_MATCH,
+                              "EGL_WIDTH or EGL_HEIGHT cannot be set without "
+                              "EGL_FIXED_SIZE_ANGLE being enabled on the surface.");
+                return false;
             }
             break;
 
         case EGL_TIMESTAMPS_ANDROID:
             if (!display->getExtensions().getFrameTimestamps)
             {
-                return EglBadAttribute() << "EGL_TIMESTAMPS_ANDROID cannot be used without "
-                                            "EGL_ANDROID_get_frame_timestamps support.";
+                val->setError(EGL_BAD_ATTRIBUTE,
+                              "EGL_TIMESTAMPS_ANDROID cannot be used without "
+                              "EGL_ANDROID_get_frame_timestamps support.");
+                return false;
             }
             switch (value)
             {
@@ -4126,28 +4783,32 @@
                     break;
 
                 default:
-                    return EglBadAttribute() << "Invalid value.";
+                    val->setError(EGL_BAD_ATTRIBUTE, "Invalid value.");
+                    return false;
             }
             break;
 
         default:
-            return EglBadAttribute() << "Invalid surface attribute.";
+            val->setError(EGL_BAD_ATTRIBUTE, "Invalid surface attribute.");
+            return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateQuerySurface(const Display *display,
-                           const Surface *surface,
-                           EGLint attribute,
-                           EGLint *value)
+bool ValidateQuerySurface(const ValidationContext *val,
+                          const Display *display,
+                          const Surface *surface,
+                          EGLint attribute,
+                          const EGLint *value)
 {
-    ANGLE_TRY(ValidateDisplay(display));
-    ANGLE_TRY(ValidateSurface(display, surface));
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
+    ANGLE_VALIDATION_TRY(ValidateSurface(val, display, surface));
 
     if (surface == EGL_NO_SURFACE)
     {
-        return EglBadSurface() << "Surface cannot be EGL_NO_SURFACE.";
+        val->setError(EGL_BAD_SURFACE, "Surface cannot be EGL_NO_SURFACE.");
+        return false;
     }
 
     switch (attribute)
@@ -4174,76 +4835,91 @@
         case EGL_POST_SUB_BUFFER_SUPPORTED_NV:
             if (!display->getExtensions().postSubBuffer)
             {
-                return EglBadAttribute() << "EGL_POST_SUB_BUFFER_SUPPORTED_NV cannot be used "
-                                            "without EGL_ANGLE_surface_orientation support.";
+                val->setError(EGL_BAD_ATTRIBUTE,
+                              "EGL_POST_SUB_BUFFER_SUPPORTED_NV cannot be used "
+                              "without EGL_ANGLE_surface_orientation support.");
+                return false;
             }
             break;
 
         case EGL_FIXED_SIZE_ANGLE:
             if (!display->getExtensions().windowFixedSize)
             {
-                return EglBadAttribute() << "EGL_FIXED_SIZE_ANGLE cannot be used without "
-                                            "EGL_ANGLE_window_fixed_size support.";
+                val->setError(EGL_BAD_ATTRIBUTE,
+                              "EGL_FIXED_SIZE_ANGLE cannot be used without "
+                              "EGL_ANGLE_window_fixed_size support.");
+                return false;
             }
             break;
 
         case EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE:
             if (!display->getExtensions().flexibleSurfaceCompatibility)
             {
-                return EglBadAttribute()
-                       << "EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE cannot be "
-                          "used without EGL_ANGLE_flexible_surface_compatibility support.";
+                val->setError(EGL_BAD_ATTRIBUTE,
+                              "EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE cannot be "
+                              "used without EGL_ANGLE_flexible_surface_compatibility support.");
+                return false;
             }
             break;
 
         case EGL_SURFACE_ORIENTATION_ANGLE:
             if (!display->getExtensions().surfaceOrientation)
             {
-                return EglBadAttribute() << "EGL_SURFACE_ORIENTATION_ANGLE cannot be "
-                                            "queried without "
-                                            "EGL_ANGLE_surface_orientation support.";
+                val->setError(EGL_BAD_ATTRIBUTE,
+                              "EGL_SURFACE_ORIENTATION_ANGLE cannot be "
+                              "queried without "
+                              "EGL_ANGLE_surface_orientation support.");
+                return false;
             }
             break;
 
         case EGL_DIRECT_COMPOSITION_ANGLE:
             if (!display->getExtensions().directComposition)
             {
-                return EglBadAttribute() << "EGL_DIRECT_COMPOSITION_ANGLE cannot be "
-                                            "used without "
-                                            "EGL_ANGLE_direct_composition support.";
+                val->setError(EGL_BAD_ATTRIBUTE,
+                              "EGL_DIRECT_COMPOSITION_ANGLE cannot be "
+                              "used without "
+                              "EGL_ANGLE_direct_composition support.");
+                return false;
             }
             break;
 
         case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
             if (!display->getExtensions().robustResourceInitialization)
             {
-                return EglBadAttribute() << "EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE cannot be "
-                                            "used without EGL_ANGLE_robust_resource_initialization "
-                                            "support.";
+                val->setError(EGL_BAD_ATTRIBUTE,
+                              "EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE cannot be "
+                              "used without EGL_ANGLE_robust_resource_initialization "
+                              "support.");
+                return false;
             }
             break;
 
         case EGL_TIMESTAMPS_ANDROID:
             if (!display->getExtensions().getFrameTimestamps)
             {
-                return EglBadAttribute() << "EGL_TIMESTAMPS_ANDROID cannot be used without "
-                                            "EGL_ANDROID_get_frame_timestamps support.";
+                val->setError(EGL_BAD_ATTRIBUTE,
+                              "EGL_TIMESTAMPS_ANDROID cannot be used without "
+                              "EGL_ANDROID_get_frame_timestamps support.");
+                return false;
             }
             break;
 
         default:
-            return EglBadAttribute() << "Invalid surface attribute.";
+            val->setError(EGL_BAD_ATTRIBUTE, "Invalid surface attribute.");
+            return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateQueryContext(const Display *display,
-                           const gl::Context *context,
-                           EGLint attribute,
-                           EGLint *value)
+bool ValidateQueryContext(const ValidationContext *val,
+                          const Display *display,
+                          const gl::Context *context,
+                          EGLint attribute,
+                          const EGLint *value)
 {
-    ANGLE_TRY(ValidateContext(display, context));
+    ANGLE_VALIDATION_TRY(ValidateContext(val, display, context));
 
     switch (attribute)
     {
@@ -4256,25 +4932,31 @@
         case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
             if (!display->getExtensions().robustResourceInitialization)
             {
-                return EglBadAttribute() << "EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE cannot be "
-                                            "used without EGL_ANGLE_robust_resource_initialization "
-                                            "support.";
+                val->setError(EGL_BAD_ATTRIBUTE,
+                              "EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE cannot be "
+                              "used without EGL_ANGLE_robust_resource_initialization "
+                              "support.");
+                return false;
             }
             break;
 
         default:
-            return EglBadAttribute() << "Invalid context attribute.";
+            val->setError(EGL_BAD_ATTRIBUTE, "Invalid context attribute.");
+            return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateDebugMessageControlKHR(EGLDEBUGPROCKHR callback, const AttributeMap &attribs)
+bool ValidateDebugMessageControlKHR(const ValidationContext *val,
+                                    EGLDEBUGPROCKHR callback,
+                                    const AttributeMap &attribs)
 {
     const ClientExtensions &clientExtensions = Display::GetClientExtensions();
     if (!clientExtensions.debug)
     {
-        return EglBadAccess() << "EGL_KHR_debug extension is not available.";
+        val->setError(EGL_BAD_ACCESS, "EGL_KHR_debug extension is not available.");
+        return false;
     }
 
     for (const auto &attrib : attribs)
@@ -4287,21 +4969,24 @@
             case EGL_DEBUG_MSG_INFO_KHR:
                 if (attrib.second != EGL_TRUE && attrib.second != EGL_FALSE)
                 {
-                    return EglBadAttribute() << "message controls must be EGL_TRUE or EGL_FALSE.";
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "message controls must be EGL_TRUE or EGL_FALSE.");
+                    return false;
                 }
                 break;
         }
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateQueryDebugKHR(EGLint attribute, EGLAttrib *value)
+bool ValidateQueryDebugKHR(const ValidationContext *val, EGLint attribute, const EGLAttrib *value)
 {
     const ClientExtensions &clientExtensions = Display::GetClientExtensions();
     if (!clientExtensions.debug)
     {
-        return EglBadAccess() << "EGL_KHR_debug extension is not available.";
+        val->setError(EGL_BAD_ACCESS, "EGL_KHR_debug extension is not available.");
+        return false;
     }
 
     switch (attribute)
@@ -4314,79 +4999,91 @@
             break;
 
         default:
-            return EglBadAttribute() << "unknown attribute.";
+            val->setError(EGL_BAD_ATTRIBUTE, "unknown attribute.");
+            return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateLabelObjectKHR(Thread *thread,
-                             const Display *display,
-                             ObjectType objectType,
-                             EGLObjectKHR object,
-                             EGLLabelKHR label)
+bool ValidateLabelObjectKHR(const ValidationContext *val,
+                            const Display *display,
+                            ObjectType objectType,
+                            EGLObjectKHR object,
+                            EGLLabelKHR label)
 {
     const ClientExtensions &clientExtensions = Display::GetClientExtensions();
     if (!clientExtensions.debug)
     {
-        return EglBadAccess() << "EGL_KHR_debug extension is not available.";
+        val->setError(EGL_BAD_ACCESS, "EGL_KHR_debug extension is not available.");
+        return false;
     }
 
     LabeledObject *labeledObject = nullptr;
-    ANGLE_TRY(ValidateLabeledObject(thread, display, objectType, object, &labeledObject));
+    ANGLE_VALIDATION_TRY(ValidateLabeledObject(val, display, objectType, object, &labeledObject));
 
-    return NoError();
+    return true;
 }
 
-Error ValidateGetCompositorTimingSupportedANDROID(const Display *display,
-                                                  const Surface *surface,
-                                                  CompositorTiming name)
+bool ValidateGetCompositorTimingSupportedANDROID(const ValidationContext *val,
+                                                 const Display *display,
+                                                 const Surface *surface,
+                                                 CompositorTiming name)
 {
-    ANGLE_TRY(ValidateDisplay(display));
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
 
     if (!display->getExtensions().getFrameTimestamps)
     {
-        return EglBadDisplay() << "EGL_ANDROID_get_frame_timestamps extension is not available.";
+        val->setError(EGL_BAD_DISPLAY,
+                      "EGL_ANDROID_get_frame_timestamps extension is not available.");
+        return false;
     }
 
-    ANGLE_TRY(ValidateSurface(display, surface));
+    ANGLE_VALIDATION_TRY(ValidateSurface(val, display, surface));
 
     if (!ValidCompositorTimingName(name))
     {
-        return EglBadParameter() << "invalid timing name.";
+        val->setError(EGL_BAD_PARAMETER, "invalid timing name.");
+        return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateGetCompositorTimingANDROID(const Display *display,
-                                         const Surface *surface,
-                                         EGLint numTimestamps,
-                                         const EGLint *names,
-                                         EGLnsecsANDROID *values)
+bool ValidateGetCompositorTimingANDROID(const ValidationContext *val,
+                                        const Display *display,
+                                        const Surface *surface,
+                                        EGLint numTimestamps,
+                                        const EGLint *names,
+                                        const EGLnsecsANDROID *values)
 {
-    ANGLE_TRY(ValidateDisplay(display));
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
 
     if (!display->getExtensions().getFrameTimestamps)
     {
-        return EglBadDisplay() << "EGL_ANDROID_get_frame_timestamps extension is not available.";
+        val->setError(EGL_BAD_DISPLAY,
+                      "EGL_ANDROID_get_frame_timestamps extension is not available.");
+        return false;
     }
 
-    ANGLE_TRY(ValidateSurface(display, surface));
+    ANGLE_VALIDATION_TRY(ValidateSurface(val, display, surface));
 
     if (names == nullptr && numTimestamps > 0)
     {
-        return EglBadParameter() << "names is NULL.";
+        val->setError(EGL_BAD_PARAMETER, "names is NULL.");
+        return false;
     }
 
     if (values == nullptr && numTimestamps > 0)
     {
-        return EglBadParameter() << "values is NULL.";
+        val->setError(EGL_BAD_PARAMETER, "values is NULL.");
+        return false;
     }
 
     if (numTimestamps < 0)
     {
-        return EglBadParameter() << "numTimestamps must be at least 0.";
+        val->setError(EGL_BAD_PARAMETER, "numTimestamps must be at least 0.");
+        return false;
     }
 
     for (EGLint i = 0; i < numTimestamps; i++)
@@ -4395,94 +5092,111 @@
 
         if (!ValidCompositorTimingName(name))
         {
-            return EglBadParameter() << "invalid compositor timing.";
+            val->setError(EGL_BAD_PARAMETER, "invalid compositor timing.");
+            return false;
         }
 
         if (!surface->getSupportedCompositorTimings().test(name))
         {
-            return EglBadParameter() << "compositor timing not supported by surface.";
+            val->setError(EGL_BAD_PARAMETER, "compositor timing not supported by surface.");
+            return false;
         }
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateGetNextFrameIdANDROID(const Display *display,
-                                    const Surface *surface,
-                                    EGLuint64KHR *frameId)
+bool ValidateGetNextFrameIdANDROID(const ValidationContext *val,
+                                   const Display *display,
+                                   const Surface *surface,
+                                   const EGLuint64KHR *frameId)
 {
-    ANGLE_TRY(ValidateDisplay(display));
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
 
     if (!display->getExtensions().getFrameTimestamps)
     {
-        return EglBadDisplay() << "EGL_ANDROID_get_frame_timestamps extension is not available.";
+        val->setError(EGL_BAD_DISPLAY,
+                      "EGL_ANDROID_get_frame_timestamps extension is not available.");
+        return false;
     }
 
-    ANGLE_TRY(ValidateSurface(display, surface));
+    ANGLE_VALIDATION_TRY(ValidateSurface(val, display, surface));
 
     if (frameId == nullptr)
     {
-        return EglBadParameter() << "frameId is NULL.";
+        val->setError(EGL_BAD_PARAMETER, "frameId is NULL.");
+        return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateGetFrameTimestampSupportedANDROID(const Display *display,
-                                                const Surface *surface,
-                                                Timestamp timestamp)
+bool ValidateGetFrameTimestampSupportedANDROID(const ValidationContext *val,
+                                               const Display *display,
+                                               const Surface *surface,
+                                               Timestamp timestamp)
 {
-    ANGLE_TRY(ValidateDisplay(display));
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
 
     if (!display->getExtensions().getFrameTimestamps)
     {
-        return EglBadDisplay() << "EGL_ANDROID_get_frame_timestamps extension is not available.";
+        val->setError(EGL_BAD_DISPLAY,
+                      "EGL_ANDROID_get_frame_timestamps extension is not available.");
+        return false;
     }
 
-    ANGLE_TRY(ValidateSurface(display, surface));
+    ANGLE_VALIDATION_TRY(ValidateSurface(val, display, surface));
 
     if (!ValidTimestampType(timestamp))
     {
-        return EglBadParameter() << "invalid timestamp type.";
+        val->setError(EGL_BAD_PARAMETER, "invalid timestamp type.");
+        return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateGetFrameTimestampsANDROID(const Display *display,
-                                        const Surface *surface,
-                                        EGLuint64KHR frameId,
-                                        EGLint numTimestamps,
-                                        const EGLint *timestamps,
-                                        EGLnsecsANDROID *values)
+bool ValidateGetFrameTimestampsANDROID(const ValidationContext *val,
+                                       const Display *display,
+                                       const Surface *surface,
+                                       EGLuint64KHR frameId,
+                                       EGLint numTimestamps,
+                                       const EGLint *timestamps,
+                                       const EGLnsecsANDROID *values)
 {
-    ANGLE_TRY(ValidateDisplay(display));
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
 
     if (!display->getExtensions().getFrameTimestamps)
     {
-        return EglBadDisplay() << "EGL_ANDROID_get_frame_timestamps extension is not available.";
+        val->setError(EGL_BAD_DISPLAY,
+                      "EGL_ANDROID_get_frame_timestamps extension is not available.");
+        return false;
     }
 
-    ANGLE_TRY(ValidateSurface(display, surface));
+    ANGLE_VALIDATION_TRY(ValidateSurface(val, display, surface));
 
     if (!surface->isTimestampsEnabled())
     {
-        return EglBadSurface() << "timestamp collection is not enabled for this surface.";
+        val->setError(EGL_BAD_SURFACE, "timestamp collection is not enabled for this surface.");
+        return false;
     }
 
     if (timestamps == nullptr && numTimestamps > 0)
     {
-        return EglBadParameter() << "timestamps is NULL.";
+        val->setError(EGL_BAD_PARAMETER, "timestamps is NULL.");
+        return false;
     }
 
     if (values == nullptr && numTimestamps > 0)
     {
-        return EglBadParameter() << "values is NULL.";
+        val->setError(EGL_BAD_PARAMETER, "values is NULL.");
+        return false;
     }
 
     if (numTimestamps < 0)
     {
-        return EglBadParameter() << "numTimestamps must be at least 0.";
+        val->setError(EGL_BAD_PARAMETER, "numTimestamps must be at least 0.");
+        return false;
     }
 
     for (EGLint i = 0; i < numTimestamps; i++)
@@ -4491,30 +5205,37 @@
 
         if (!ValidTimestampType(timestamp))
         {
-            return EglBadParameter() << "invalid timestamp type.";
+            val->setError(EGL_BAD_PARAMETER, "invalid timestamp type.");
+            return false;
         }
 
         if (!surface->getSupportedTimestamps().test(timestamp))
         {
-            return EglBadParameter() << "timestamp not supported by surface.";
+            val->setError(EGL_BAD_PARAMETER, "timestamp not supported by surface.");
+            return false;
         }
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateQueryStringiANGLE(const Display *display, EGLint name, EGLint index)
+bool ValidateQueryStringiANGLE(const ValidationContext *val,
+                               const Display *display,
+                               EGLint name,
+                               EGLint index)
 {
-    ANGLE_TRY(ValidateDisplay(display));
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
 
     if (!Display::GetClientExtensions().featureControlANGLE)
     {
-        return EglBadDisplay() << "EGL_ANGLE_feature_control extension is not available.";
+        val->setError(EGL_BAD_DISPLAY, "EGL_ANGLE_feature_control extension is not available.");
+        return false;
     }
 
     if (index < 0)
     {
-        return EglBadParameter() << "index is negative.";
+        val->setError(EGL_BAD_PARAMETER, "index is negative.");
+        return false;
     }
 
     switch (name)
@@ -4527,72 +5248,60 @@
         case EGL_FEATURE_CONDITION_ANGLE:
             break;
         default:
-            return EglBadParameter() << "name is not valid.";
+            val->setError(EGL_BAD_PARAMETER, "name is not valid.");
+            return false;
     }
 
     if (static_cast<size_t>(index) >= display->getFeatures().size())
     {
-        return EglBadParameter() << "index is too big.";
+        val->setError(EGL_BAD_PARAMETER, "index is too big.");
+        return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateQueryDisplayAttribBase(const Display *display, const EGLint attribute)
+bool ValidateQueryDisplayAttribEXT(const ValidationContext *val,
+                                   const Display *display,
+                                   const EGLint attribute,
+                                   const EGLAttrib *value)
 {
-    ANGLE_TRY(ValidateDisplay(display));
-
-    switch (attribute)
-    {
-        case EGL_DEVICE_EXT:
-            if (!display->getExtensions().deviceQuery)
-            {
-                return EglBadDisplay() << "EGL_EXT_device_query extension is not available.";
-            }
-            break;
-
-        case EGL_FEATURE_COUNT_ANGLE:
-            if (!Display::GetClientExtensions().featureControlANGLE)
-            {
-                return EglBadDisplay() << "EGL_ANGLE_feature_control extension is not available.";
-            }
-            break;
-
-        default:
-            return EglBadAttribute() << "attribute is not valid.";
-    }
-
-    return NoError();
+    ANGLE_VALIDATION_TRY(ValidateQueryDisplayAttribBase(val, display, attribute));
+    return true;
 }
 
-Error ValidateQueryDisplayAttribEXT(const Display *display, const EGLint attribute)
+bool ValidateQueryDisplayAttribANGLE(const ValidationContext *val,
+                                     const Display *display,
+                                     const EGLint attribute,
+                                     const EGLAttrib *value)
 {
-    ANGLE_TRY(ValidateQueryDisplayAttribBase(display, attribute));
-
-    return NoError();
+    ANGLE_VALIDATION_TRY(ValidateQueryDisplayAttribBase(val, display, attribute));
+    return true;
 }
 
-Error ValidateQueryDisplayAttribANGLE(const Display *display, const EGLint attribute)
-{
-    ANGLE_TRY(ValidateQueryDisplayAttribBase(display, attribute));
-
-    return NoError();
-}
-
-Error ValidateGetNativeClientBufferANDROID(const AHardwareBuffer *buffer)
+bool ValidateGetNativeClientBufferANDROID(const ValidationContext *val,
+                                          const AHardwareBuffer *buffer)
 {
     // No extension check is done because no display is passed to eglGetNativeClientBufferANDROID
     // despite it being a display extension.  No display is needed for the implementation though.
     if (buffer == nullptr)
     {
-        return EglBadParameter() << "NULL buffer.";
+        val->setError(EGL_BAD_PARAMETER, "NULL buffer.");
+        return false;
     }
 
-    return NoError();
+    return true;
 }
 
-Error ValidateCreateNativeClientBufferANDROID(const egl::AttributeMap &attribMap)
+bool ValidateCreateNativeClientBufferANDROID(const ValidationContext *val,
+                                             const egl::AttributeMap &attribMap)
 {
+    if (attribMap.isEmpty() || attribMap.begin()->second == EGL_NONE)
+    {
+        val->setError(EGL_BAD_PARAMETER, "invalid attribute list.");
+        return false;
+    }
+
     int width     = attribMap.getAsInt(EGL_WIDTH, 0);
     int height    = attribMap.getAsInt(EGL_HEIGHT, 0);
     int redSize   = attribMap.getAsInt(EGL_RED_SIZE, 0);
@@ -4617,7 +5326,8 @@
             case EGL_ALPHA_SIZE:
                 if (redSize < 0 || greenSize < 0 || blueSize < 0 || alphaSize < 0)
                 {
-                    return EglBadParameter() << "incorrect channel size requested";
+                    val->setError(EGL_BAD_PARAMETER, "incorrect channel size requested");
+                    return false;
                 }
                 break;
             case EGL_NATIVE_BUFFER_USAGE_ANDROID:
@@ -4626,13 +5336,15 @@
                                EGL_NATIVE_BUFFER_USAGE_RENDERBUFFER_BIT_ANDROID |
                                EGL_NATIVE_BUFFER_USAGE_TEXTURE_BIT_ANDROID)) != 0)
                 {
-                    return EglBadParameter() << "invalid usage flag";
+                    val->setError(EGL_BAD_PARAMETER, "invalid usage flag");
+                    return false;
                 }
                 break;
             case EGL_NONE:
                 break;
             default:
-                return EglBadAttribute() << "invalid attribute";
+                val->setError(EGL_BAD_ATTRIBUTE, "invalid attribute");
+                return false;
         }
     }
 
@@ -4640,68 +5352,325 @@
     // for the case where EGL_WIDTH and EGL_HEIGHT were not part of the attribute list.
     if (width <= 0 || height <= 0)
     {
-        return EglBadParameter() << "incorrect buffer dimensions requested";
+        val->setError(EGL_BAD_PARAMETER, "incorrect buffer dimensions requested");
+        return false;
     }
 
     if (gl::GetAndroidHardwareBufferFormatFromChannelSizes(attribMap) == 0)
     {
-        return EglBadParameter() << "unsupported format";
+        val->setError(EGL_BAD_PARAMETER, "unsupported format");
+        return false;
     }
-    return NoError();
+    return true;
 }
 
-Error ValidateDupNativeFenceFDANDROID(const Display *display, const Sync *sync)
+bool ValidateDupNativeFenceFDANDROID(const ValidationContext *val,
+                                     const Display *display,
+                                     const Sync *sync)
 {
-    ANGLE_TRY(ValidateDisplay(display));
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
 
     if (!display->getExtensions().nativeFenceSyncANDROID)
     {
-        return EglBadDisplay() << "EGL_ANDROID_native_fence_sync extension is not available.";
+        val->setError(EGL_BAD_DISPLAY, "EGL_ANDROID_native_fence_sync extension is not available.");
+        return false;
     }
 
-    ANGLE_TRY(ValidateSync(display, sync));
+    ANGLE_VALIDATION_TRY(ValidateSync(val, display, sync));
 
-    return NoError();
+    return true;
 }
 
-Error ValidateSwapBuffersWithFrameTokenANGLE(const Display *display,
-                                             const Surface *surface,
-                                             EGLFrameTokenANGLE frametoken)
+bool ValidateSwapBuffersWithFrameTokenANGLE(const ValidationContext *val,
+                                            const Display *display,
+                                            const Surface *surface,
+                                            EGLFrameTokenANGLE frametoken)
 {
-    ANGLE_TRY(ValidateDisplay(display));
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
 
     if (!display->getExtensions().swapWithFrameToken)
     {
-        return EglBadDisplay() << "EGL_ANGLE_swap_buffers_with_frame_token is not available.";
+        val->setError(EGL_BAD_DISPLAY, "EGL_ANGLE_swap_buffers_with_frame_token is not available.");
+        return false;
     }
 
-    ANGLE_TRY(ValidateSurface(display, surface));
+    ANGLE_VALIDATION_TRY(ValidateSurface(val, display, surface));
 
-    return NoError();
+    return true;
 }
 
-Error ValidateSignalSyncKHR(const Display *display, const Sync *sync, EGLint mode)
+bool ValidateSignalSyncKHR(const ValidationContext *val,
+                           const Display *display,
+                           const Sync *sync,
+                           EGLenum mode)
 {
-    ANGLE_TRY(ValidateDisplay(display));
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
 
-    ANGLE_TRY(ValidateSync(display, sync));
+    ANGLE_VALIDATION_TRY(ValidateSync(val, display, sync));
 
     if (sync->getType() == EGL_SYNC_REUSABLE_KHR)
     {
         if (!display->getExtensions().reusableSyncKHR)
         {
-            return EglBadMatch() << "EGL_KHR_reusable_sync extension is not available.";
+            val->setError(EGL_BAD_MATCH, "EGL_KHR_reusable_sync extension is not available.");
+            return false;
         }
 
         if ((mode != EGL_SIGNALED_KHR) && (mode != EGL_UNSIGNALED_KHR))
         {
-            return EglBadParameter() << "eglSignalSyncKHR invalid mode.";
+            val->setError(EGL_BAD_PARAMETER, "eglSignalSyncKHR invalid mode.");
+            return false;
         }
 
-        return NoError();
+        return true;
     }
 
-    return EglBadMatch();
+    val->setError(EGL_BAD_MATCH);
+    return false;
+}
+
+bool ValidateQuerySurfacePointerANGLE(const ValidationContext *val,
+                                      const Display *display,
+                                      const Surface *eglSurface,
+                                      EGLint attribute,
+                                      void *const *value)
+{
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
+
+    if (!display->getExtensions().querySurfacePointer)
+    {
+        val->setError(EGL_BAD_ACCESS);
+        return false;
+    }
+
+    ANGLE_VALIDATION_TRY(ValidateSurface(val, display, eglSurface));
+
+    // validate the attribute parameter
+    switch (attribute)
+    {
+        case EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE:
+            if (!display->getExtensions().surfaceD3DTexture2DShareHandle)
+            {
+                val->setError(EGL_BAD_ATTRIBUTE);
+                return false;
+            }
+            break;
+        case EGL_DXGI_KEYED_MUTEX_ANGLE:
+            if (!display->getExtensions().keyedMutex)
+            {
+                val->setError(EGL_BAD_ATTRIBUTE);
+                return false;
+            }
+            break;
+        default:
+            val->setError(EGL_BAD_ATTRIBUTE);
+            return false;
+    }
+
+    return true;
+}
+
+bool ValidatePostSubBufferNV(const ValidationContext *val,
+                             const Display *display,
+                             const Surface *eglSurface,
+                             EGLint x,
+                             EGLint y,
+                             EGLint width,
+                             EGLint height)
+{
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
+
+    if (!display->getExtensions().postSubBuffer)
+    {
+        val->setError(EGL_BAD_ACCESS);
+        return false;
+    }
+
+    if (x < 0 || y < 0 || width < 0 || height < 0)
+    {
+        val->setError(EGL_BAD_PARAMETER);
+        return false;
+    }
+
+    ANGLE_VALIDATION_TRY(ValidateSurface(val, display, eglSurface));
+
+    if (display->isDeviceLost())
+    {
+        val->setError(EGL_CONTEXT_LOST);
+        return false;
+    }
+
+    return true;
+}
+
+bool ValidateQueryDeviceAttribEXT(const ValidationContext *val,
+                                  const Device *device,
+                                  EGLint attribute,
+                                  const EGLAttrib *value)
+{
+    ANGLE_VALIDATION_TRY(ValidateDevice(val, device));
+
+    if (!Display::GetClientExtensions().deviceQueryEXT)
+    {
+        val->setError(EGL_BAD_ACCESS, "EGL_EXT_device_query not supported.");
+        return false;
+    }
+
+    // validate the attribute parameter
+    switch (attribute)
+    {
+        case EGL_D3D11_DEVICE_ANGLE:
+        case EGL_D3D9_DEVICE_ANGLE:
+            if (!device->getExtensions().deviceD3D || device->getType() != attribute)
+            {
+                val->setError(EGL_BAD_ATTRIBUTE);
+                return false;
+            }
+            break;
+        case EGL_EAGL_CONTEXT_ANGLE:
+            if (!device->getExtensions().deviceEAGL)
+            {
+                val->setError(EGL_BAD_ATTRIBUTE);
+                return false;
+            }
+            break;
+        case EGL_CGL_CONTEXT_ANGLE:
+        case EGL_CGL_PIXEL_FORMAT_ANGLE:
+            if (!device->getExtensions().deviceCGL)
+            {
+                val->setError(EGL_BAD_ATTRIBUTE);
+                return false;
+            }
+            break;
+        default:
+            val->setError(EGL_BAD_ATTRIBUTE);
+            return false;
+    }
+    return true;
+}
+
+bool ValidateQueryDeviceStringEXT(const ValidationContext *val, const Device *device, EGLint name)
+{
+    ANGLE_VALIDATION_TRY(ValidateDevice(val, device));
+    return true;
+}
+
+bool ValidateReleaseHighPowerGPUANGLE(const ValidationContext *val,
+                                      const Display *display,
+                                      const gl::Context *context)
+{
+    ANGLE_VALIDATION_TRY(ValidateContext(val, display, context));
+    return true;
+}
+
+bool ValidateReacquireHighPowerGPUANGLE(const ValidationContext *val,
+                                        const Display *display,
+                                        const gl::Context *context)
+{
+    ANGLE_VALIDATION_TRY(ValidateContext(val, display, context));
+    return true;
+}
+
+bool ValidateHandleGPUSwitchANGLE(const ValidationContext *val, const Display *display)
+{
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, display));
+    return true;
+}
+
+bool ValidateGetCurrentDisplay(const ValidationContext *val)
+{
+    return true;
+}
+
+bool ValidateGetCurrentSurface(const ValidationContext *val, EGLint readdraw)
+{
+    return true;
+}
+
+bool ValidateGetDisplay(const ValidationContext *val, EGLNativeDisplayType display_id)
+{
+    return true;
+}
+
+bool ValidateGetError(const ValidationContext *val)
+{
+    return true;
+}
+
+bool ValidateGetProcAddress(const ValidationContext *val, const char *procname)
+{
+    return true;
+}
+
+bool ValidateQueryString(const ValidationContext *val, const Display *dpyPacked, EGLint name)
+{
+    if (name != EGL_EXTENSIONS || dpyPacked != nullptr)
+    {
+        ANGLE_VALIDATION_TRY(ValidateDisplay(val, dpyPacked));
+    }
+
+    switch (name)
+    {
+        case EGL_CLIENT_APIS:
+        case EGL_EXTENSIONS:
+        case EGL_VENDOR:
+        case EGL_VERSION:
+            break;
+        default:
+            val->setError(EGL_BAD_PARAMETER);
+            return false;
+    }
+    return true;
+}
+
+bool ValidateWaitGL(const ValidationContext *val)
+{
+    ANGLE_VALIDATION_TRY(ValidateDisplay(val, val->eglThread->getDisplay()));
+    return true;
+}
+
+bool ValidateQueryAPI(const ValidationContext *val)
+{
+    return true;
+}
+
+bool ValidateReleaseThread(const ValidationContext *val)
+{
+    return true;
+}
+
+bool ValidateWaitClient(const ValidationContext *val)
+{
+    return true;
+}
+
+bool ValidateGetCurrentContext(const ValidationContext *val)
+{
+    return true;
+}
+
+bool ValidateCreatePlatformPixmapSurface(const ValidationContext *val,
+                                         const Display *dpyPacked,
+                                         const Config *configPacked,
+                                         const void *native_pixmap,
+                                         const AttributeMap &attrib_listPacked)
+{
+    EGLNativePixmapType nativePixmap =
+        reinterpret_cast<EGLNativePixmapType>(const_cast<void *>(native_pixmap));
+    return ValidateCreatePixmapSurface(val, dpyPacked, configPacked, nativePixmap,
+                                       attrib_listPacked);
+}
+
+bool ValidateCreatePlatformWindowSurface(const ValidationContext *val,
+                                         const Display *dpyPacked,
+                                         const Config *configPacked,
+                                         const void *native_window,
+                                         const AttributeMap &attrib_listPacked)
+{
+    EGLNativeWindowType nativeWindow =
+        reinterpret_cast<EGLNativeWindowType>(const_cast<void *>(native_window));
+    return ValidateCreateWindowSurface(val, dpyPacked, configPacked, nativeWindow,
+                                       attrib_listPacked);
 }
 
 }  // namespace egl
diff --git a/src/libANGLE/validationEGL.h b/src/libANGLE/validationEGL.h
index df2dfb1..f30b56a 100644
--- a/src/libANGLE/validationEGL.h
+++ b/src/libANGLE/validationEGL.h
@@ -11,7 +11,7 @@
 
 #include "common/PackedEnums.h"
 #include "libANGLE/Error.h"
-#include "libANGLE/Texture.h"
+#include "libANGLE/Thread.h"
 
 #include <EGL/egl.h>
 #include <EGL/eglext.h>
@@ -36,14 +36,31 @@
 class Thread;
 class LabeledObject;
 
+struct ValidationContext
+{
+    ValidationContext(Thread *threadIn, const char *entryPointIn, const LabeledObject *objectIn)
+        : eglThread(threadIn), entryPoint(entryPointIn), labeledObject(objectIn)
+    {}
+
+    // We should remove the message-less overload once we have messages for all EGL errors.
+    void setError(EGLint error) const;
+    void setError(EGLint error, const char *message...) const;
+
+    Thread *eglThread;
+    const char *entryPoint;
+    const LabeledObject *labeledObject;
+};
+
 // Object validation
-Error ValidateDisplay(const Display *display);
-Error ValidateSurface(const Display *display, const Surface *surface);
-Error ValidateConfig(const Display *display, const Config *config);
-Error ValidateContext(const Display *display, const gl::Context *context);
-Error ValidateImage(const Display *display, const Image *image);
-Error ValidateDevice(const Device *device);
-Error ValidateSync(const Display *display, const Sync *sync);
+bool ValidateDisplay(const ValidationContext *val, const Display *display);
+bool ValidateSurface(const ValidationContext *val, const Display *display, const Surface *surface);
+bool ValidateConfig(const ValidationContext *val, const Display *display, const Config *config);
+bool ValidateContext(const ValidationContext *val,
+                     const Display *display,
+                     const gl::Context *context);
+bool ValidateImage(const ValidationContext *val, const Display *display, const Image *image);
+bool ValidateDevice(const ValidationContext *val, const Device *device);
+bool ValidateSync(const ValidationContext *val, const Display *display, const Sync *sync);
 
 // Return the requested object only if it is valid (otherwise nullptr)
 const Thread *GetThreadIfValid(const Thread *thread);
@@ -59,316 +76,109 @@
                                        ObjectType objectType,
                                        EGLObjectKHR object);
 
-// Entry point validation
-Error ValidateInitialize(const Display *display);
+// A template struct for determining the default value to return for each entry point.
+template <angle::EntryPoint EP, typename ReturnType>
+struct DefaultReturnValue
+{
+    static constexpr ReturnType kValue = static_cast<ReturnType>(0);
+};
 
-Error ValidateTerminate(const Display *display);
+template <angle::EntryPoint EP, typename ReturnType>
+ReturnType GetDefaultReturnValue(Thread *thread);
 
-Error ValidateCreateContext(Display *display,
-                            Config *configuration,
-                            gl::Context *shareContext,
-                            const AttributeMap &attributes);
+template <>
+ANGLE_INLINE EGLint
+GetDefaultReturnValue<angle::EntryPoint::EGLLabelObjectKHR, EGLint>(Thread *thread)
+{
+    return thread->getError();
+}
 
-Error ValidateCreateWindowSurface(Display *display,
-                                  Config *config,
-                                  EGLNativeWindowType window,
-                                  const AttributeMap &attributes);
+template <angle::EntryPoint EP, typename ReturnType>
+ANGLE_INLINE ReturnType GetDefaultReturnValue(Thread *thread)
+{
+    return DefaultReturnValue<EP, ReturnType>::kValue;
+}
 
-Error ValidateCreatePbufferSurface(Display *display,
-                                   Config *config,
-                                   const AttributeMap &attributes);
-Error ValidateCreatePbufferFromClientBuffer(Display *display,
-                                            EGLenum buftype,
-                                            EGLClientBuffer buffer,
-                                            Config *config,
-                                            const AttributeMap &attributes);
+// First case: handling packed enums.
+template <typename PackedT, typename FromT>
+typename std::enable_if<std::is_enum<PackedT>::value, PackedT>::type PackParam(FromT from)
+{
+    return FromEGLenum<PackedT>(from);
+}
 
-Error ValidateCreatePixmapSurface(Display *display,
-                                  Config *config,
-                                  EGLNativePixmapType pixmap,
-                                  const AttributeMap &attributes);
+// Second case: handling other types.
+template <typename PackedT, typename FromT>
+typename std::enable_if<!std::is_enum<PackedT>::value,
+                        typename std::remove_reference<PackedT>::type>::type
+PackParam(FromT from);
 
-Error ValidateMakeCurrent(Display *display, Surface *draw, Surface *read, gl::Context *context);
+template <>
+inline const AttributeMap PackParam<const AttributeMap &, const EGLint *>(const EGLint *attribs)
+{
+    return AttributeMap::CreateFromIntArray(attribs);
+}
 
-Error ValidateCreateImage(const Display *display,
-                          gl::Context *context,
-                          EGLenum target,
-                          EGLClientBuffer buffer,
-                          const AttributeMap &attributes);
-Error ValidateDestroyImage(const Display *display, const Image *image);
-Error ValidateCreateImageKHR(const Display *display,
-                             gl::Context *context,
-                             EGLenum target,
-                             EGLClientBuffer buffer,
-                             const AttributeMap &attributes);
-Error ValidateDestroyImageKHR(const Display *display, const Image *image);
+// In a 32-bit environment the EGLAttrib and EGLint types are the same. We need to mask out one of
+// the two specializations to avoid having an override ambiguity.
+#if defined(ANGLE_IS_64_BIT_CPU)
+template <>
+inline const AttributeMap PackParam<const AttributeMap &, const EGLAttrib *>(
+    const EGLAttrib *attribs)
+{
+    return AttributeMap::CreateFromAttribArray(attribs);
+}
+#endif  // defined(ANGLE_IS_64_BIT_CPU)
 
-Error ValidateCreateDeviceANGLE(EGLint device_type,
-                                void *native_device,
-                                const EGLAttrib *attrib_list);
-Error ValidateReleaseDeviceANGLE(Device *device);
-
-Error ValidateCreateSyncBase(const Display *display,
-                             EGLenum type,
-                             const AttributeMap &attribs,
-                             const Display *currentDisplay,
-                             const gl::Context *currentContext,
-                             bool isExt);
-Error ValidateGetSyncAttribBase(const Display *display, const Sync *sync, EGLint attribute);
-
-Error ValidateCreateSyncKHR(const Display *display,
-                            EGLenum type,
-                            const AttributeMap &attribs,
-                            const Display *currentDisplay,
-                            const gl::Context *currentContext);
-Error ValidateCreateSync(const Display *display,
-                         EGLenum type,
-                         const AttributeMap &attribs,
-                         const Display *currentDisplay,
-                         const gl::Context *currentContext);
-Error ValidateDestroySync(const Display *display, const Sync *sync);
-Error ValidateClientWaitSync(const Display *display,
-                             const Sync *sync,
-                             EGLint flags,
-                             EGLTime timeout);
-Error ValidateWaitSync(const Display *display,
-                       const gl::Context *context,
-                       const Sync *sync,
-                       EGLint flags);
-Error ValidateGetSyncAttribKHR(const Display *display,
-                               const Sync *sync,
-                               EGLint attribute,
-                               EGLint *value);
-Error ValidateGetSyncAttrib(const Display *display,
-                            const Sync *sync,
-                            EGLint attribute,
-                            EGLAttrib *value);
-
-Error ValidateCreateStreamKHR(const Display *display, const AttributeMap &attributes);
-Error ValidateDestroyStreamKHR(const Display *display, const Stream *stream);
-Error ValidateStreamAttribKHR(const Display *display,
-                              const Stream *stream,
-                              EGLint attribute,
-                              EGLint value);
-Error ValidateQueryStreamKHR(const Display *display,
-                             const Stream *stream,
-                             EGLenum attribute,
-                             EGLint *value);
-Error ValidateQueryStreamu64KHR(const Display *display,
-                                const Stream *stream,
-                                EGLenum attribute,
-                                EGLuint64KHR *value);
-Error ValidateStreamConsumerGLTextureExternalKHR(const Display *display,
-                                                 gl::Context *context,
-                                                 const Stream *stream);
-Error ValidateStreamConsumerAcquireKHR(const Display *display,
-                                       gl::Context *context,
-                                       const Stream *stream);
-Error ValidateStreamConsumerReleaseKHR(const Display *display,
-                                       gl::Context *context,
-                                       const Stream *stream);
-Error ValidateStreamConsumerGLTextureExternalAttribsNV(const Display *display,
-                                                       gl::Context *context,
-                                                       const Stream *stream,
-                                                       const AttributeMap &attribs);
-Error ValidateCreateStreamProducerD3DTextureANGLE(const Display *display,
-                                                  const Stream *stream,
-                                                  const AttributeMap &attribs);
-Error ValidateStreamPostD3DTextureANGLE(const Display *display,
-                                        const Stream *stream,
-                                        void *texture,
-                                        const AttributeMap &attribs);
-
-Error ValidateGetMscRateANGLE(const Display *display,
-                              const Surface *surface,
-                              const EGLint *numerator,
-                              const EGLint *denominator);
-Error ValidateGetSyncValuesCHROMIUM(const Display *display,
-                                    const Surface *surface,
-                                    const EGLuint64KHR *ust,
-                                    const EGLuint64KHR *msc,
-                                    const EGLuint64KHR *sbc);
-
-Error ValidateDestroySurface(const Display *display,
-                             const Surface *surface,
-                             const EGLSurface eglSurface);
-
-Error ValidateDestroyContext(const Display *display,
-                             const gl::Context *glCtx,
-                             const EGLContext eglCtx);
-
-Error ValidateSwapBuffers(Thread *thread, const Display *display, const Surface *surface);
-
-Error ValidateWaitNative(const Display *display, const EGLint engine);
-
-Error ValidateCopyBuffers(Display *display, const Surface *surface);
-
-Error ValidateSwapBuffersWithDamageKHR(const Display *display,
-                                       const Surface *surface,
-                                       EGLint *rects,
-                                       EGLint n_rects);
-
-Error ValidateBindTexImage(const Display *display,
-                           const Surface *surface,
-                           const EGLSurface eglSurface,
-                           const EGLint buffer,
-                           const gl::Context *context,
-                           gl::Texture **textureObject);
-
-Error ValidateReleaseTexImage(const Display *display,
-                              const Surface *surface,
-                              const EGLSurface eglSurface,
-                              const EGLint buffer);
-
-Error ValidateSwapInterval(const Display *display,
-                           const Surface *draw_surface,
-                           const gl::Context *context);
-
-Error ValidateBindAPI(const EGLenum api);
-
-Error ValidatePresentationTimeANDROID(const Display *display,
-                                      const Surface *surface,
-                                      EGLnsecsANDROID time);
-
-Error ValidateSetBlobCacheANDROID(const Display *display,
-                                  EGLSetBlobFuncANDROID set,
-                                  EGLGetBlobFuncANDROID get);
-
-Error ValidateGetConfigAttrib(const Display *display, const Config *config, EGLint attribute);
-Error ValidateChooseConfig(const Display *display,
-                           const AttributeMap &attribs,
-                           EGLint configSize,
-                           EGLint *numConfig);
-Error ValidateGetConfigs(const Display *display, EGLint configSize, EGLint *numConfig);
-
-// Other validation
-Error ValidateCompatibleSurface(const Display *display,
-                                gl::Context *context,
-                                const Surface *surface);
-
-Error ValidateGetPlatformDisplay(EGLenum platform,
-                                 void *native_display,
-                                 const EGLAttrib *attrib_list);
-Error ValidateGetPlatformDisplayEXT(EGLenum platform,
-                                    void *native_display,
-                                    const EGLint *attrib_list);
-Error ValidateCreatePlatformWindowSurfaceEXT(const Display *display,
-                                             const Config *configuration,
-                                             void *nativeWindow,
-                                             const AttributeMap &attributes);
-Error ValidateCreatePlatformPixmapSurfaceEXT(const Display *display,
-                                             const Config *configuration,
-                                             void *nativePixmap,
-                                             const AttributeMap &attributes);
-
-Error ValidateProgramCacheGetAttribANGLE(const Display *display, EGLenum attrib);
-
-Error ValidateProgramCacheQueryANGLE(const Display *display,
-                                     EGLint index,
-                                     void *key,
-                                     EGLint *keysize,
-                                     void *binary,
-                                     EGLint *binarysize);
-
-Error ValidateProgramCachePopulateANGLE(const Display *display,
-                                        const void *key,
-                                        EGLint keysize,
-                                        const void *binary,
-                                        EGLint binarysize);
-
-Error ValidateProgramCacheResizeANGLE(const Display *display, EGLint limit, EGLenum mode);
-
-Error ValidateSurfaceAttrib(const Display *display,
-                            const Surface *surface,
-                            EGLint attribute,
-                            EGLint value);
-Error ValidateQuerySurface(const Display *display,
-                           const Surface *surface,
-                           EGLint attribute,
-                           EGLint *value);
-Error ValidateQueryContext(const Display *display,
-                           const gl::Context *context,
-                           EGLint attribute,
-                           EGLint *value);
-
-// EGL_KHR_debug
-Error ValidateDebugMessageControlKHR(EGLDEBUGPROCKHR callback, const AttributeMap &attribs);
-
-Error ValidateQueryDebugKHR(EGLint attribute, EGLAttrib *value);
-
-Error ValidateLabelObjectKHR(Thread *thread,
-                             const Display *display,
-                             ObjectType objectType,
-                             EGLObjectKHR object,
-                             EGLLabelKHR label);
-
-// ANDROID_get_frame_timestamps
-Error ValidateGetCompositorTimingSupportedANDROID(const Display *display,
-                                                  const Surface *surface,
-                                                  CompositorTiming name);
-
-Error ValidateGetCompositorTimingANDROID(const Display *display,
-                                         const Surface *surface,
-                                         EGLint numTimestamps,
-                                         const EGLint *names,
-                                         EGLnsecsANDROID *values);
-
-Error ValidateGetNextFrameIdANDROID(const Display *display,
-                                    const Surface *surface,
-                                    EGLuint64KHR *frameId);
-
-Error ValidateGetFrameTimestampSupportedANDROID(const Display *display,
-                                                const Surface *surface,
-                                                Timestamp timestamp);
-
-Error ValidateGetFrameTimestampsANDROID(const Display *display,
-                                        const Surface *surface,
-                                        EGLuint64KHR frameId,
-                                        EGLint numTimestamps,
-                                        const EGLint *timestamps,
-                                        EGLnsecsANDROID *values);
-
-Error ValidateQueryStringiANGLE(const Display *display, EGLint name, EGLint index);
-
-Error ValidateQueryDisplayAttribEXT(const Display *display, const EGLint attribute);
-Error ValidateQueryDisplayAttribANGLE(const Display *display, const EGLint attribute);
-
-// EGL_ANDROID_get_native_client_buffer
-Error ValidateGetNativeClientBufferANDROID(const struct AHardwareBuffer *buffer);
-
-// EGL_ANDROID_create_native_client_buffer
-Error ValidateCreateNativeClientBufferANDROID(const egl::AttributeMap &attribMap);
-
-// EGL_ANDROID_native_fence_sync
-Error ValidateDupNativeFenceFDANDROID(const Display *display, const Sync *sync);
-
-// EGL_ANGLE_swap_with_frame_token
-Error ValidateSwapBuffersWithFrameTokenANGLE(const Display *display,
-                                             const Surface *surface,
-                                             EGLFrameTokenANGLE frametoken);
-
-// EGL_KHR_reusable_sync
-Error ValidateSignalSyncKHR(const Display *display, const Sync *sync, EGLint mode);
-
+template <typename PackedT, typename FromT>
+inline typename std::enable_if<!std::is_enum<PackedT>::value,
+                               typename std::remove_reference<PackedT>::type>::type
+PackParam(FromT from)
+{
+    return static_cast<PackedT>(from);
+}
 }  // namespace egl
 
-#define ANGLE_EGL_TRY(THREAD, EXPR, FUNCNAME, LABELOBJECT)                               \
-    do                                                                                   \
-    {                                                                                    \
-        auto ANGLE_LOCAL_VAR = (EXPR);                                                   \
-        if (ANGLE_LOCAL_VAR.isError())                                                   \
-            return THREAD->setError(ANGLE_LOCAL_VAR, GetDebug(), FUNCNAME, LABELOBJECT); \
+#define ANGLE_EGL_VALIDATE(THREAD, EP, OBJ, RETURN_TYPE, ...)                              \
+    do                                                                                     \
+    {                                                                                      \
+        const char *epname = "egl" #EP;                                                    \
+        ValidationContext vctx(THREAD, epname, OBJ);                                       \
+        auto ANGLE_LOCAL_VAR = (Validate##EP(&vctx, ##__VA_ARGS__));                       \
+        if (!ANGLE_LOCAL_VAR)                                                              \
+        {                                                                                  \
+            return GetDefaultReturnValue<angle::EntryPoint::EGL##EP, RETURN_TYPE>(THREAD); \
+        }                                                                                  \
     } while (0)
 
-#define ANGLE_EGL_TRY_RETURN(THREAD, EXPR, FUNCNAME, LABELOBJECT, RETVAL)         \
-    do                                                                            \
-    {                                                                             \
-        auto ANGLE_LOCAL_VAR = (EXPR);                                            \
-        if (ANGLE_LOCAL_VAR.isError())                                            \
-        {                                                                         \
-            THREAD->setError(ANGLE_LOCAL_VAR, GetDebug(), FUNCNAME, LABELOBJECT); \
-            return RETVAL;                                                        \
-        }                                                                         \
+#define ANGLE_EGL_VALIDATE_VOID(THREAD, EP, OBJ, ...)                \
+    do                                                               \
+    {                                                                \
+        const char *epname = "egl" #EP;                              \
+        ValidationContext vctx(THREAD, epname, OBJ);                 \
+        auto ANGLE_LOCAL_VAR = (Validate##EP(&vctx, ##__VA_ARGS__)); \
+        if (!ANGLE_LOCAL_VAR)                                        \
+        {                                                            \
+            return;                                                  \
+        }                                                            \
+    } while (0)
+
+#define ANGLE_EGL_TRY(THREAD, EXPR, FUNCNAME, LABELOBJECT)                   \
+    do                                                                       \
+    {                                                                        \
+        auto ANGLE_LOCAL_VAR = (EXPR);                                       \
+        if (ANGLE_LOCAL_VAR.isError())                                       \
+            return THREAD->setError(ANGLE_LOCAL_VAR, FUNCNAME, LABELOBJECT); \
+    } while (0)
+
+#define ANGLE_EGL_TRY_RETURN(THREAD, EXPR, FUNCNAME, LABELOBJECT, RETVAL) \
+    do                                                                    \
+    {                                                                     \
+        auto ANGLE_LOCAL_VAR = (EXPR);                                    \
+        if (ANGLE_LOCAL_VAR.isError())                                    \
+        {                                                                 \
+            THREAD->setError(ANGLE_LOCAL_VAR, FUNCNAME, LABELOBJECT);     \
+            return RETVAL;                                                \
+        }                                                                 \
     } while (0)
 
 #endif  // LIBANGLE_VALIDATIONEGL_H_
diff --git a/src/libANGLE/validationEGL_autogen.h b/src/libANGLE/validationEGL_autogen.h
new file mode 100644
index 0000000..869bd86
--- /dev/null
+++ b/src/libANGLE/validationEGL_autogen.h
@@ -0,0 +1,454 @@
+// GENERATED FILE - DO NOT EDIT.
+// Generated by generate_entry_points.py using data from egl.xml and egl_angle_ext.xml.
+//
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// validationEGL_autogen.h:
+//   Validation functions for the EGL entry points.
+
+#ifndef LIBANGLE_VALIDATION_EGL_AUTOGEN_H_
+#define LIBANGLE_VALIDATION_EGL_AUTOGEN_H_
+
+#include "libANGLE/validationEGL.h"
+
+namespace egl
+{
+
+// EGL 1.0
+bool ValidateChooseConfig(const ValidationContext *val,
+                          const egl::Display *dpyPacked,
+                          const AttributeMap &attrib_listPacked,
+                          const EGLConfig *configs,
+                          EGLint config_size,
+                          const EGLint *num_config);
+bool ValidateCopyBuffers(const ValidationContext *val,
+                         const egl::Display *dpyPacked,
+                         const Surface *surfacePacked,
+                         EGLNativePixmapType target);
+bool ValidateCreateContext(const ValidationContext *val,
+                           const egl::Display *dpyPacked,
+                           const Config *configPacked,
+                           const gl::Context *share_contextPacked,
+                           const AttributeMap &attrib_listPacked);
+bool ValidateCreatePbufferSurface(const ValidationContext *val,
+                                  const egl::Display *dpyPacked,
+                                  const Config *configPacked,
+                                  const AttributeMap &attrib_listPacked);
+bool ValidateCreatePixmapSurface(const ValidationContext *val,
+                                 const egl::Display *dpyPacked,
+                                 const Config *configPacked,
+                                 EGLNativePixmapType pixmap,
+                                 const AttributeMap &attrib_listPacked);
+bool ValidateCreateWindowSurface(const ValidationContext *val,
+                                 const egl::Display *dpyPacked,
+                                 const Config *configPacked,
+                                 EGLNativeWindowType win,
+                                 const AttributeMap &attrib_listPacked);
+bool ValidateDestroyContext(const ValidationContext *val,
+                            const egl::Display *dpyPacked,
+                            const gl::Context *ctxPacked);
+bool ValidateDestroySurface(const ValidationContext *val,
+                            const egl::Display *dpyPacked,
+                            const Surface *surfacePacked);
+bool ValidateGetConfigAttrib(const ValidationContext *val,
+                             const egl::Display *dpyPacked,
+                             const Config *configPacked,
+                             EGLint attribute,
+                             const EGLint *value);
+bool ValidateGetConfigs(const ValidationContext *val,
+                        const egl::Display *dpyPacked,
+                        const EGLConfig *configs,
+                        EGLint config_size,
+                        const EGLint *num_config);
+bool ValidateGetCurrentDisplay(const ValidationContext *val);
+bool ValidateGetCurrentSurface(const ValidationContext *val, EGLint readdraw);
+bool ValidateGetDisplay(const ValidationContext *val, EGLNativeDisplayType display_id);
+bool ValidateGetError(const ValidationContext *val);
+bool ValidateGetProcAddress(const ValidationContext *val, const char *procname);
+bool ValidateInitialize(const ValidationContext *val,
+                        const egl::Display *dpyPacked,
+                        const EGLint *major,
+                        const EGLint *minor);
+bool ValidateMakeCurrent(const ValidationContext *val,
+                         const egl::Display *dpyPacked,
+                         const Surface *drawPacked,
+                         const Surface *readPacked,
+                         const gl::Context *ctxPacked);
+bool ValidateQueryContext(const ValidationContext *val,
+                          const egl::Display *dpyPacked,
+                          const gl::Context *ctxPacked,
+                          EGLint attribute,
+                          const EGLint *value);
+bool ValidateQueryString(const ValidationContext *val, const egl::Display *dpyPacked, EGLint name);
+bool ValidateQuerySurface(const ValidationContext *val,
+                          const egl::Display *dpyPacked,
+                          const Surface *surfacePacked,
+                          EGLint attribute,
+                          const EGLint *value);
+bool ValidateSwapBuffers(const ValidationContext *val,
+                         const egl::Display *dpyPacked,
+                         const Surface *surfacePacked);
+bool ValidateTerminate(const ValidationContext *val, const egl::Display *dpyPacked);
+bool ValidateWaitGL(const ValidationContext *val);
+bool ValidateWaitNative(const ValidationContext *val, EGLint engine);
+
+// EGL 1.1
+bool ValidateBindTexImage(const ValidationContext *val,
+                          const egl::Display *dpyPacked,
+                          const Surface *surfacePacked,
+                          EGLint buffer);
+bool ValidateReleaseTexImage(const ValidationContext *val,
+                             const egl::Display *dpyPacked,
+                             const Surface *surfacePacked,
+                             EGLint buffer);
+bool ValidateSurfaceAttrib(const ValidationContext *val,
+                           const egl::Display *dpyPacked,
+                           const Surface *surfacePacked,
+                           EGLint attribute,
+                           EGLint value);
+bool ValidateSwapInterval(const ValidationContext *val,
+                          const egl::Display *dpyPacked,
+                          EGLint interval);
+
+// EGL 1.2
+bool ValidateBindAPI(const ValidationContext *val, EGLenum api);
+bool ValidateCreatePbufferFromClientBuffer(const ValidationContext *val,
+                                           const egl::Display *dpyPacked,
+                                           EGLenum buftype,
+                                           EGLClientBuffer buffer,
+                                           const Config *configPacked,
+                                           const AttributeMap &attrib_listPacked);
+bool ValidateQueryAPI(const ValidationContext *val);
+bool ValidateReleaseThread(const ValidationContext *val);
+bool ValidateWaitClient(const ValidationContext *val);
+
+// EGL 1.4
+bool ValidateGetCurrentContext(const ValidationContext *val);
+
+// EGL 1.5
+bool ValidateClientWaitSync(const ValidationContext *val,
+                            const egl::Display *dpyPacked,
+                            const Sync *syncPacked,
+                            EGLint flags,
+                            EGLTime timeout);
+bool ValidateCreateImage(const ValidationContext *val,
+                         const egl::Display *dpyPacked,
+                         const gl::Context *ctxPacked,
+                         EGLenum target,
+                         EGLClientBuffer buffer,
+                         const AttributeMap &attrib_listPacked);
+bool ValidateCreatePlatformPixmapSurface(const ValidationContext *val,
+                                         const egl::Display *dpyPacked,
+                                         const Config *configPacked,
+                                         const void *native_pixmap,
+                                         const AttributeMap &attrib_listPacked);
+bool ValidateCreatePlatformWindowSurface(const ValidationContext *val,
+                                         const egl::Display *dpyPacked,
+                                         const Config *configPacked,
+                                         const void *native_window,
+                                         const AttributeMap &attrib_listPacked);
+bool ValidateCreateSync(const ValidationContext *val,
+                        const egl::Display *dpyPacked,
+                        EGLenum type,
+                        const AttributeMap &attrib_listPacked);
+bool ValidateDestroyImage(const ValidationContext *val,
+                          const egl::Display *dpyPacked,
+                          const Image *imagePacked);
+bool ValidateDestroySync(const ValidationContext *val,
+                         const egl::Display *dpyPacked,
+                         const Sync *syncPacked);
+bool ValidateGetPlatformDisplay(const ValidationContext *val,
+                                EGLenum platform,
+                                const void *native_display,
+                                const AttributeMap &attrib_listPacked);
+bool ValidateGetSyncAttrib(const ValidationContext *val,
+                           const egl::Display *dpyPacked,
+                           const Sync *syncPacked,
+                           EGLint attribute,
+                           const EGLAttrib *value);
+bool ValidateWaitSync(const ValidationContext *val,
+                      const egl::Display *dpyPacked,
+                      const Sync *syncPacked,
+                      EGLint flags);
+
+// EGL_ANDROID_blob_cache
+bool ValidateSetBlobCacheFuncsANDROID(const ValidationContext *val,
+                                      const egl::Display *dpyPacked,
+                                      EGLSetBlobFuncANDROID set,
+                                      EGLGetBlobFuncANDROID get);
+
+// EGL_ANDROID_create_native_client_buffer
+bool ValidateCreateNativeClientBufferANDROID(const ValidationContext *val,
+                                             const AttributeMap &attrib_listPacked);
+
+// EGL_ANDROID_get_frame_timestamps
+bool ValidateGetCompositorTimingSupportedANDROID(const ValidationContext *val,
+                                                 const egl::Display *dpyPacked,
+                                                 const Surface *surfacePacked,
+                                                 CompositorTiming namePacked);
+bool ValidateGetCompositorTimingANDROID(const ValidationContext *val,
+                                        const egl::Display *dpyPacked,
+                                        const Surface *surfacePacked,
+                                        EGLint numTimestamps,
+                                        const EGLint *names,
+                                        const EGLnsecsANDROID *values);
+bool ValidateGetNextFrameIdANDROID(const ValidationContext *val,
+                                   const egl::Display *dpyPacked,
+                                   const Surface *surfacePacked,
+                                   const EGLuint64KHR *frameId);
+bool ValidateGetFrameTimestampSupportedANDROID(const ValidationContext *val,
+                                               const egl::Display *dpyPacked,
+                                               const Surface *surfacePacked,
+                                               Timestamp timestampPacked);
+bool ValidateGetFrameTimestampsANDROID(const ValidationContext *val,
+                                       const egl::Display *dpyPacked,
+                                       const Surface *surfacePacked,
+                                       EGLuint64KHR frameId,
+                                       EGLint numTimestamps,
+                                       const EGLint *timestamps,
+                                       const EGLnsecsANDROID *values);
+
+// EGL_ANDROID_get_native_client_buffer
+bool ValidateGetNativeClientBufferANDROID(const ValidationContext *val,
+                                          const struct AHardwareBuffer *buffer);
+
+// EGL_ANDROID_native_fence_sync
+bool ValidateDupNativeFenceFDANDROID(const ValidationContext *val,
+                                     const egl::Display *dpyPacked,
+                                     const Sync *syncPacked);
+
+// EGL_ANDROID_presentation_time
+bool ValidatePresentationTimeANDROID(const ValidationContext *val,
+                                     const egl::Display *dpyPacked,
+                                     const Surface *surfacePacked,
+                                     EGLnsecsANDROID time);
+
+// EGL_ANGLE_device_creation
+bool ValidateCreateDeviceANGLE(const ValidationContext *val,
+                               EGLint device_type,
+                               const void *native_device,
+                               const EGLAttrib *attrib_list);
+bool ValidateReleaseDeviceANGLE(const ValidationContext *val, const Device *devicePacked);
+
+// EGL_ANGLE_feature_control
+bool ValidateQueryStringiANGLE(const ValidationContext *val,
+                               const egl::Display *dpyPacked,
+                               EGLint name,
+                               EGLint index);
+bool ValidateQueryDisplayAttribANGLE(const ValidationContext *val,
+                                     const egl::Display *dpyPacked,
+                                     EGLint attribute,
+                                     const EGLAttrib *value);
+
+// EGL_ANGLE_power_preference
+bool ValidateReleaseHighPowerGPUANGLE(const ValidationContext *val,
+                                      const egl::Display *dpyPacked,
+                                      const gl::Context *ctxPacked);
+bool ValidateReacquireHighPowerGPUANGLE(const ValidationContext *val,
+                                        const egl::Display *dpyPacked,
+                                        const gl::Context *ctxPacked);
+bool ValidateHandleGPUSwitchANGLE(const ValidationContext *val, const egl::Display *dpyPacked);
+
+// EGL_ANGLE_program_cache_control
+bool ValidateProgramCacheGetAttribANGLE(const ValidationContext *val,
+                                        const egl::Display *dpyPacked,
+                                        EGLenum attrib);
+bool ValidateProgramCacheQueryANGLE(const ValidationContext *val,
+                                    const egl::Display *dpyPacked,
+                                    EGLint index,
+                                    const void *key,
+                                    const EGLint *keysize,
+                                    const void *binary,
+                                    const EGLint *binarysize);
+bool ValidateProgramCachePopulateANGLE(const ValidationContext *val,
+                                       const egl::Display *dpyPacked,
+                                       const void *key,
+                                       EGLint keysize,
+                                       const void *binary,
+                                       EGLint binarysize);
+bool ValidateProgramCacheResizeANGLE(const ValidationContext *val,
+                                     const egl::Display *dpyPacked,
+                                     EGLint limit,
+                                     EGLint mode);
+
+// EGL_ANGLE_query_surface_pointer
+bool ValidateQuerySurfacePointerANGLE(const ValidationContext *val,
+                                      const egl::Display *dpyPacked,
+                                      const Surface *surfacePacked,
+                                      EGLint attribute,
+                                      void *const *value);
+
+// EGL_ANGLE_stream_producer_d3d_texture
+bool ValidateCreateStreamProducerD3DTextureANGLE(const ValidationContext *val,
+                                                 const egl::Display *dpyPacked,
+                                                 const Stream *streamPacked,
+                                                 const AttributeMap &attrib_listPacked);
+bool ValidateStreamPostD3DTextureANGLE(const ValidationContext *val,
+                                       const egl::Display *dpyPacked,
+                                       const Stream *streamPacked,
+                                       const void *texture,
+                                       const AttributeMap &attrib_listPacked);
+
+// EGL_ANGLE_swap_with_frame_token
+bool ValidateSwapBuffersWithFrameTokenANGLE(const ValidationContext *val,
+                                            const egl::Display *dpyPacked,
+                                            const Surface *surfacePacked,
+                                            EGLFrameTokenANGLE frametoken);
+
+// EGL_ANGLE_sync_control_rate
+bool ValidateGetMscRateANGLE(const ValidationContext *val,
+                             const egl::Display *dpyPacked,
+                             const Surface *surfacePacked,
+                             const EGLint *numerator,
+                             const EGLint *denominator);
+
+// EGL_CHROMIUM_sync_control
+bool ValidateGetSyncValuesCHROMIUM(const ValidationContext *val,
+                                   const egl::Display *dpyPacked,
+                                   const Surface *surfacePacked,
+                                   const EGLuint64KHR *ust,
+                                   const EGLuint64KHR *msc,
+                                   const EGLuint64KHR *sbc);
+
+// EGL_EXT_device_query
+bool ValidateQueryDeviceAttribEXT(const ValidationContext *val,
+                                  const Device *devicePacked,
+                                  EGLint attribute,
+                                  const EGLAttrib *value);
+bool ValidateQueryDeviceStringEXT(const ValidationContext *val,
+                                  const Device *devicePacked,
+                                  EGLint name);
+bool ValidateQueryDisplayAttribEXT(const ValidationContext *val,
+                                   const egl::Display *dpyPacked,
+                                   EGLint attribute,
+                                   const EGLAttrib *value);
+
+// EGL_EXT_platform_base
+bool ValidateCreatePlatformPixmapSurfaceEXT(const ValidationContext *val,
+                                            const egl::Display *dpyPacked,
+                                            const Config *configPacked,
+                                            const void *native_pixmap,
+                                            const AttributeMap &attrib_listPacked);
+bool ValidateCreatePlatformWindowSurfaceEXT(const ValidationContext *val,
+                                            const egl::Display *dpyPacked,
+                                            const Config *configPacked,
+                                            const void *native_window,
+                                            const AttributeMap &attrib_listPacked);
+bool ValidateGetPlatformDisplayEXT(const ValidationContext *val,
+                                   EGLenum platform,
+                                   const void *native_display,
+                                   const AttributeMap &attrib_listPacked);
+
+// EGL_KHR_debug
+bool ValidateDebugMessageControlKHR(const ValidationContext *val,
+                                    EGLDEBUGPROCKHR callback,
+                                    const AttributeMap &attrib_listPacked);
+bool ValidateLabelObjectKHR(const ValidationContext *val,
+                            const egl::Display *displayPacked,
+                            ObjectType objectTypePacked,
+                            EGLObjectKHR object,
+                            EGLLabelKHR label);
+bool ValidateQueryDebugKHR(const ValidationContext *val, EGLint attribute, const EGLAttrib *value);
+
+// EGL_KHR_fence_sync
+bool ValidateClientWaitSyncKHR(const ValidationContext *val,
+                               const egl::Display *dpyPacked,
+                               const Sync *syncPacked,
+                               EGLint flags,
+                               EGLTimeKHR timeout);
+bool ValidateCreateSyncKHR(const ValidationContext *val,
+                           const egl::Display *dpyPacked,
+                           EGLenum type,
+                           const AttributeMap &attrib_listPacked);
+bool ValidateDestroySyncKHR(const ValidationContext *val,
+                            const egl::Display *dpyPacked,
+                            const Sync *syncPacked);
+bool ValidateGetSyncAttribKHR(const ValidationContext *val,
+                              const egl::Display *dpyPacked,
+                              const Sync *syncPacked,
+                              EGLint attribute,
+                              const EGLint *value);
+
+// EGL_KHR_image
+bool ValidateCreateImageKHR(const ValidationContext *val,
+                            const egl::Display *dpyPacked,
+                            const gl::Context *ctxPacked,
+                            EGLenum target,
+                            EGLClientBuffer buffer,
+                            const AttributeMap &attrib_listPacked);
+bool ValidateDestroyImageKHR(const ValidationContext *val,
+                             const egl::Display *dpyPacked,
+                             const Image *imagePacked);
+
+// EGL_KHR_reusable_sync
+bool ValidateSignalSyncKHR(const ValidationContext *val,
+                           const egl::Display *dpyPacked,
+                           const Sync *syncPacked,
+                           EGLenum mode);
+
+// EGL_KHR_stream
+bool ValidateCreateStreamKHR(const ValidationContext *val,
+                             const egl::Display *dpyPacked,
+                             const AttributeMap &attrib_listPacked);
+bool ValidateDestroyStreamKHR(const ValidationContext *val,
+                              const egl::Display *dpyPacked,
+                              const Stream *streamPacked);
+bool ValidateQueryStreamKHR(const ValidationContext *val,
+                            const egl::Display *dpyPacked,
+                            const Stream *streamPacked,
+                            EGLenum attribute,
+                            const EGLint *value);
+bool ValidateQueryStreamu64KHR(const ValidationContext *val,
+                               const egl::Display *dpyPacked,
+                               const Stream *streamPacked,
+                               EGLenum attribute,
+                               const EGLuint64KHR *value);
+bool ValidateStreamAttribKHR(const ValidationContext *val,
+                             const egl::Display *dpyPacked,
+                             const Stream *streamPacked,
+                             EGLenum attribute,
+                             EGLint value);
+
+// EGL_KHR_stream_consumer_gltexture
+bool ValidateStreamConsumerAcquireKHR(const ValidationContext *val,
+                                      const egl::Display *dpyPacked,
+                                      const Stream *streamPacked);
+bool ValidateStreamConsumerGLTextureExternalKHR(const ValidationContext *val,
+                                                const egl::Display *dpyPacked,
+                                                const Stream *streamPacked);
+bool ValidateStreamConsumerReleaseKHR(const ValidationContext *val,
+                                      const egl::Display *dpyPacked,
+                                      const Stream *streamPacked);
+
+// EGL_KHR_swap_buffers_with_damage
+bool ValidateSwapBuffersWithDamageKHR(const ValidationContext *val,
+                                      const egl::Display *dpyPacked,
+                                      const Surface *surfacePacked,
+                                      const EGLint *rects,
+                                      EGLint n_rects);
+
+// EGL_KHR_wait_sync
+bool ValidateWaitSyncKHR(const ValidationContext *val,
+                         const egl::Display *dpyPacked,
+                         const Sync *syncPacked,
+                         EGLint flags);
+
+// EGL_NV_post_sub_buffer
+bool ValidatePostSubBufferNV(const ValidationContext *val,
+                             const egl::Display *dpyPacked,
+                             const Surface *surfacePacked,
+                             EGLint x,
+                             EGLint y,
+                             EGLint width,
+                             EGLint height);
+
+// EGL_NV_stream_consumer_gltexture_yuv
+bool ValidateStreamConsumerGLTextureExternalAttribsNV(const ValidationContext *val,
+                                                      const egl::Display *dpyPacked,
+                                                      const Stream *streamPacked,
+                                                      const AttributeMap &attrib_listPacked);
+}  // namespace egl
+
+#endif  // LIBANGLE_VALIDATION_EGL_AUTOGEN_H_
diff --git a/src/libANGLE/validationES.cpp b/src/libANGLE/validationES.cpp
index d620541..71a7bf9 100644
--- a/src/libANGLE/validationES.cpp
+++ b/src/libANGLE/validationES.cpp
@@ -1365,48 +1365,6 @@
     return true;
 }
 
-bool ValidateFramebufferRenderbufferParameters(const Context *context,
-                                               GLenum target,
-                                               GLenum attachment,
-                                               GLenum renderbuffertarget,
-                                               RenderbufferID renderbuffer)
-{
-    if (!ValidFramebufferTarget(context, target))
-    {
-        context->validationError(GL_INVALID_ENUM, kInvalidFramebufferTarget);
-        return false;
-    }
-
-    Framebuffer *framebuffer = context->getState().getTargetFramebuffer(target);
-
-    ASSERT(framebuffer);
-    if (framebuffer->isDefault())
-    {
-        context->validationError(GL_INVALID_OPERATION, kDefaultFramebufferTarget);
-        return false;
-    }
-
-    if (!ValidateAttachmentTarget(context, attachment))
-    {
-        return false;
-    }
-
-    // [OpenGL ES 2.0.25] Section 4.4.3 page 112
-    // [OpenGL ES 3.0.2] Section 4.4.2 page 201
-    // 'renderbuffer' must be either zero or the name of an existing renderbuffer object of
-    // type 'renderbuffertarget', otherwise an INVALID_OPERATION error is generated.
-    if (renderbuffer.value != 0)
-    {
-        if (!context->getRenderbuffer(renderbuffer))
-        {
-            context->validationError(GL_INVALID_OPERATION, kInvalidRenderbufferTarget);
-            return false;
-        }
-    }
-
-    return true;
-}
-
 bool ValidateBlitFramebufferParameters(const Context *context,
                                        GLint srcX0,
                                        GLint srcY0,
@@ -1660,6 +1618,231 @@
     return true;
 }
 
+bool ValidateBindFramebufferBase(const Context *context, GLenum target, FramebufferID framebuffer)
+{
+    if (!ValidFramebufferTarget(context, target))
+    {
+        context->validationError(GL_INVALID_ENUM, kInvalidFramebufferTarget);
+        return false;
+    }
+
+    if (!context->getState().isBindGeneratesResourceEnabled() &&
+        !context->isFramebufferGenerated(framebuffer))
+    {
+        context->validationError(GL_INVALID_OPERATION, kObjectNotGenerated);
+        return false;
+    }
+
+    return true;
+}
+
+bool ValidateBindRenderbufferBase(const Context *context,
+                                  GLenum target,
+                                  RenderbufferID renderbuffer)
+{
+    if (target != GL_RENDERBUFFER)
+    {
+        context->validationError(GL_INVALID_ENUM, kInvalidRenderbufferTarget);
+        return false;
+    }
+
+    if (!context->getState().isBindGeneratesResourceEnabled() &&
+        !context->isRenderbufferGenerated(renderbuffer))
+    {
+        context->validationError(GL_INVALID_OPERATION, kObjectNotGenerated);
+        return false;
+    }
+
+    return true;
+}
+
+bool ValidateFramebufferRenderbufferBase(const Context *context,
+                                         GLenum target,
+                                         GLenum attachment,
+                                         GLenum renderbuffertarget,
+                                         RenderbufferID renderbuffer)
+{
+    if (!ValidFramebufferTarget(context, target))
+    {
+        context->validationError(GL_INVALID_ENUM, kInvalidFramebufferTarget);
+        return false;
+    }
+
+    if (renderbuffertarget != GL_RENDERBUFFER)
+    {
+        context->validationError(GL_INVALID_ENUM, kInvalidRenderbufferTarget);
+        return false;
+    }
+
+    Framebuffer *framebuffer = context->getState().getTargetFramebuffer(target);
+
+    ASSERT(framebuffer);
+    if (framebuffer->isDefault())
+    {
+        context->validationError(GL_INVALID_OPERATION, kDefaultFramebufferTarget);
+        return false;
+    }
+
+    if (!ValidateAttachmentTarget(context, attachment))
+    {
+        return false;
+    }
+
+    // [OpenGL ES 2.0.25] Section 4.4.3 page 112
+    // [OpenGL ES 3.0.2] Section 4.4.2 page 201
+    // 'renderbuffer' must be either zero or the name of an existing renderbuffer object of
+    // type 'renderbuffertarget', otherwise an INVALID_OPERATION error is generated.
+    if (renderbuffer.value != 0)
+    {
+        if (!context->getRenderbuffer(renderbuffer))
+        {
+            context->validationError(GL_INVALID_OPERATION, kInvalidRenderbufferTarget);
+            return false;
+        }
+    }
+
+    return true;
+}
+
+bool ValidateFramebufferTextureBase(const Context *context,
+                                    GLenum target,
+                                    GLenum attachment,
+                                    TextureID texture,
+                                    GLint level)
+{
+    if (!ValidFramebufferTarget(context, target))
+    {
+        context->validationError(GL_INVALID_ENUM, kInvalidFramebufferTarget);
+        return false;
+    }
+
+    if (!ValidateAttachmentTarget(context, attachment))
+    {
+        return false;
+    }
+
+    if (texture.value != 0)
+    {
+        Texture *tex = context->getTexture(texture);
+
+        if (tex == nullptr)
+        {
+            context->validationError(GL_INVALID_OPERATION, kMissingTexture);
+            return false;
+        }
+
+        if (level < 0)
+        {
+            context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
+            return false;
+        }
+    }
+
+    const Framebuffer *framebuffer = context->getState().getTargetFramebuffer(target);
+    ASSERT(framebuffer);
+
+    if (framebuffer->isDefault())
+    {
+        context->validationError(GL_INVALID_OPERATION, kDefaultFramebufferTarget);
+        return false;
+    }
+
+    return true;
+}
+
+bool ValidateGenerateMipmapBase(const Context *context, TextureType target)
+{
+    if (!ValidTextureTarget(context, target))
+    {
+        context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
+        return false;
+    }
+
+    Texture *texture = context->getTextureByType(target);
+
+    if (texture == nullptr)
+    {
+        context->validationError(GL_INVALID_OPERATION, kTextureNotBound);
+        return false;
+    }
+
+    const GLuint effectiveBaseLevel = texture->getTextureState().getEffectiveBaseLevel();
+
+    // This error isn't spelled out in the spec in a very explicit way, but we interpret the spec so
+    // that out-of-range base level has a non-color-renderable / non-texture-filterable format.
+    if (effectiveBaseLevel >= IMPLEMENTATION_MAX_TEXTURE_LEVELS)
+    {
+        context->validationError(GL_INVALID_OPERATION, kBaseLevelOutOfRange);
+        return false;
+    }
+
+    TextureTarget baseTarget = (target == TextureType::CubeMap)
+                                   ? TextureTarget::CubeMapPositiveX
+                                   : NonCubeTextureTypeToTarget(target);
+    const auto &format = *(texture->getFormat(baseTarget, effectiveBaseLevel).info);
+    if (format.sizedInternalFormat == GL_NONE || format.compressed || format.depthBits > 0 ||
+        format.stencilBits > 0)
+    {
+        context->validationError(GL_INVALID_OPERATION, kGenerateMipmapNotAllowed);
+        return false;
+    }
+
+    // GenerateMipmap accepts formats that are unsized or both color renderable and filterable.
+    bool formatUnsized = !format.sized;
+    bool formatColorRenderableAndFilterable =
+        format.filterSupport(context->getClientVersion(), context->getExtensions()) &&
+        format.textureAttachmentSupport(context->getClientVersion(), context->getExtensions());
+    if (!formatUnsized && !formatColorRenderableAndFilterable)
+    {
+        context->validationError(GL_INVALID_OPERATION, kGenerateMipmapNotAllowed);
+        return false;
+    }
+
+    // GL_EXT_sRGB adds an unsized SRGB (no alpha) format which has explicitly disabled mipmap
+    // generation
+    if (format.colorEncoding == GL_SRGB && format.format == GL_RGB)
+    {
+        context->validationError(GL_INVALID_OPERATION, kGenerateMipmapNotAllowed);
+        return false;
+    }
+
+    // According to the OpenGL extension spec EXT_sRGB.txt, EXT_SRGB is based on ES 2.0 and
+    // generateMipmap is not allowed if texture format is SRGB_EXT or SRGB_ALPHA_EXT.
+    if (context->getClientVersion() < Version(3, 0) && format.colorEncoding == GL_SRGB)
+    {
+        context->validationError(GL_INVALID_OPERATION, kGenerateMipmapNotAllowed);
+        return false;
+    }
+
+    // Non-power of 2 ES2 check
+    if (context->getClientVersion() < Version(3, 0) && !context->getExtensions().textureNPOTOES &&
+        (!isPow2(static_cast<int>(texture->getWidth(baseTarget, 0))) ||
+         !isPow2(static_cast<int>(texture->getHeight(baseTarget, 0)))))
+    {
+        ASSERT(target == TextureType::_2D || target == TextureType::Rectangle ||
+               target == TextureType::CubeMap);
+        context->validationError(GL_INVALID_OPERATION, kTextureNotPow2);
+        return false;
+    }
+
+    // Cube completeness check
+    if (target == TextureType::CubeMap && !texture->getTextureState().isCubeComplete())
+    {
+        context->validationError(GL_INVALID_OPERATION, kCubemapIncomplete);
+        return false;
+    }
+
+    if (context->getExtensions().webglCompatibility &&
+        (texture->getWidth(baseTarget, effectiveBaseLevel) == 0 ||
+         texture->getHeight(baseTarget, effectiveBaseLevel) == 0))
+    {
+        context->validationError(GL_INVALID_OPERATION, kGenerateMipmapZeroSize);
+        return false;
+    }
+
+    return true;
+}
+
 bool ValidateReadPixelsRobustANGLE(const Context *context,
                                    GLint x,
                                    GLint y,
@@ -2633,7 +2816,7 @@
     {
         case GL_RENDERBUFFER:
         {
-            RenderbufferID renderbuffer = FromGL<RenderbufferID>(name);
+            RenderbufferID renderbuffer = PackParam<RenderbufferID>(name);
             if (!context->isRenderbuffer(renderbuffer))
             {
                 context->validationError(GL_INVALID_VALUE, kInvalidRenderbufferName);
@@ -2647,7 +2830,7 @@
         case GL_TEXTURE_CUBE_MAP:
         case GL_TEXTURE_CUBE_MAP_ARRAY_EXT:
         {
-            TextureID texture = FromGL<TextureID>(name);
+            TextureID texture = PackParam<TextureID>(name);
             if (!context->isTexture(texture))
             {
                 context->validationError(GL_INVALID_VALUE, kInvalidTextureName);
@@ -2655,7 +2838,7 @@
             }
 
             Texture *textureObject = context->getTexture(texture);
-            if (textureObject && textureObject->getType() != FromGL<TextureType>(target))
+            if (textureObject && textureObject->getType() != PackParam<TextureType>(target))
             {
                 context->validationError(GL_INVALID_VALUE, err::kTextureTypeMismatch);
                 return false;
@@ -2701,7 +2884,7 @@
 
         // INVALID_VALUE is generated if the dimensions of the either subregion exceeds the
         // boundaries of the corresponding image object
-        Renderbuffer *buffer = context->getRenderbuffer(FromGL<RenderbufferID>(name));
+        Renderbuffer *buffer = context->getRenderbuffer(PackParam<RenderbufferID>(name));
         if ((buffer->getWidth() - offsetX < width) || (buffer->getHeight() - offsetY < height))
         {
             context->validationError(GL_INVALID_VALUE, kSourceTextureTooSmall);
@@ -2711,13 +2894,13 @@
     else
     {
         // INVALID_VALUE is generated if the specified level is not a valid level for the image
-        if (!ValidMipLevel(context, FromGL<TextureType>(target), level))
+        if (!ValidMipLevel(context, PackParam<TextureType>(target), level))
         {
             context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
             return false;
         }
 
-        Texture *texture = context->getTexture(FromGL<TextureID>(name));
+        Texture *texture = context->getTexture(PackParam<TextureID>(name));
 
         // INVALID_OPERATION is generated if either object is a texture and the texture is not
         // complete
@@ -2737,9 +2920,9 @@
         }
 
         const GLsizei textureWidth = static_cast<GLsizei>(
-            texture->getWidth(FromGL<TextureTarget>(textureTargetToUse), level));
+            texture->getWidth(PackParam<TextureTarget>(textureTargetToUse), level));
         const GLsizei textureHeight = static_cast<GLsizei>(
-            texture->getHeight(FromGL<TextureTarget>(textureTargetToUse), level));
+            texture->getHeight(PackParam<TextureTarget>(textureTargetToUse), level));
 
         // INVALID_VALUE is generated if the dimensions of the either subregion exceeds the
         // boundaries of the corresponding image object
@@ -2749,7 +2932,7 @@
             return false;
         }
 
-        *samples = texture->getSamples(FromGL<TextureTarget>(textureTargetToUse), level);
+        *samples = texture->getSamples(PackParam<TextureTarget>(textureTargetToUse), level);
         *samples = (*samples == 0) ? 1 : *samples;
     }
 
@@ -2787,7 +2970,7 @@
     {
         case GL_RENDERBUFFER:
         {
-            Renderbuffer *buffer = context->getRenderbuffer(FromGL<RenderbufferID>(name));
+            Renderbuffer *buffer = context->getRenderbuffer(PackParam<RenderbufferID>(name));
             return *buffer->getFormat().info;
             break;
         }
@@ -2797,7 +2980,7 @@
         case GL_TEXTURE_CUBE_MAP:
         case GL_TEXTURE_CUBE_MAP_ARRAY_EXT:
         {
-            Texture *texture          = context->getTexture(FromGL<TextureID>(name));
+            Texture *texture          = context->getTexture(PackParam<TextureID>(name));
             GLenum textureTargetToUse = target;
 
             if (target == GL_TEXTURE_CUBE_MAP)
@@ -2806,7 +2989,7 @@
                 // textureWidth/textureHeight
                 textureTargetToUse = GL_TEXTURE_CUBE_MAP_POSITIVE_X;
             }
-            return *texture->getFormat(FromGL<TextureTarget>(textureTargetToUse), level).info;
+            return *texture->getFormat(PackParam<TextureTarget>(textureTargetToUse), level).info;
         }
         default:
             context->validationError(GL_INVALID_ENUM, kInvalidTarget);
@@ -3878,52 +4061,6 @@
     return true;
 }
 
-bool ValidateFramebufferTextureBase(const Context *context,
-                                    GLenum target,
-                                    GLenum attachment,
-                                    TextureID texture,
-                                    GLint level)
-{
-    if (!ValidFramebufferTarget(context, target))
-    {
-        context->validationError(GL_INVALID_ENUM, kInvalidFramebufferTarget);
-        return false;
-    }
-
-    if (!ValidateAttachmentTarget(context, attachment))
-    {
-        return false;
-    }
-
-    if (texture.value != 0)
-    {
-        Texture *tex = context->getTexture(texture);
-
-        if (tex == nullptr)
-        {
-            context->validationError(GL_INVALID_OPERATION, kMissingTexture);
-            return false;
-        }
-
-        if (level < 0)
-        {
-            context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
-            return false;
-        }
-    }
-
-    const Framebuffer *framebuffer = context->getState().getTargetFramebuffer(target);
-    ASSERT(framebuffer);
-
-    if (framebuffer->isDefault())
-    {
-        context->validationError(GL_INVALID_OPERATION, kDefaultFramebufferTarget);
-        return false;
-    }
-
-    return true;
-}
-
 bool ValidateGetUniformBase(const Context *context,
                             ShaderProgramID program,
                             UniformLocation location)
diff --git a/src/libANGLE/validationES.h b/src/libANGLE/validationES.h
index f4feedc..e65a5a9 100644
--- a/src/libANGLE/validationES.h
+++ b/src/libANGLE/validationES.h
@@ -101,17 +101,6 @@
 Shader *GetValidShader(const Context *context, ShaderProgramID id);
 
 bool ValidateAttachmentTarget(const Context *context, GLenum attachment);
-bool ValidateRenderbufferStorageParametersBase(const Context *context,
-                                               GLenum target,
-                                               GLsizei samples,
-                                               GLenum internalformat,
-                                               GLsizei width,
-                                               GLsizei height);
-bool ValidateFramebufferRenderbufferParameters(const Context *context,
-                                               GLenum target,
-                                               GLenum attachment,
-                                               GLenum renderbuffertarget,
-                                               RenderbufferID renderbuffer);
 
 bool ValidateBlitFramebufferParameters(const Context *context,
                                        GLint srcX0,
@@ -125,6 +114,29 @@
                                        GLbitfield mask,
                                        GLenum filter);
 
+bool ValidateBindFramebufferBase(const Context *context, GLenum target, FramebufferID framebuffer);
+bool ValidateBindRenderbufferBase(const Context *context,
+                                  GLenum target,
+                                  RenderbufferID renderbuffer);
+bool ValidateFramebufferRenderbufferBase(const Context *context,
+                                         GLenum target,
+                                         GLenum attachment,
+                                         GLenum renderbuffertarget,
+                                         RenderbufferID renderbuffer);
+bool ValidateFramebufferTextureBase(const Context *context,
+                                    GLenum target,
+                                    GLenum attachment,
+                                    TextureID texture,
+                                    GLint level);
+bool ValidateGenerateMipmapBase(const Context *context, TextureType target);
+
+bool ValidateRenderbufferStorageParametersBase(const Context *context,
+                                               GLenum target,
+                                               GLsizei samples,
+                                               GLenum internalformat,
+                                               GLsizei width,
+                                               GLsizei height);
+
 bool ValidatePixelPack(const Context *context,
                        GLenum format,
                        GLenum type,
@@ -408,12 +420,6 @@
 
 bool ValidateDrawInstancedANGLE(const Context *context);
 
-bool ValidateFramebufferTextureBase(const Context *context,
-                                    GLenum target,
-                                    GLenum attachment,
-                                    TextureID texture,
-                                    GLint level);
-
 bool ValidateGetUniformBase(const Context *context,
                             ShaderProgramID program,
                             UniformLocation location);
@@ -749,12 +755,6 @@
                                   const GLfloat *val);
 bool ValidateSampleMaskiBase(const Context *context, GLuint maskNumber, GLbitfield mask);
 
-// Utility macro for handling implementation methods inside Validation.
-#define ANGLE_HANDLE_VALIDATION_ERR(X) \
-    (void)(X);                         \
-    return false
-#define ANGLE_VALIDATION_TRY(EXPR) ANGLE_TRY_TEMPLATE(EXPR, ANGLE_HANDLE_VALIDATION_ERR)
-
 // We should check with Khronos if returning INVALID_FRAMEBUFFER_OPERATION is OK when querying
 // implementation format info for incomplete framebuffers. It seems like these queries are
 // incongruent with the other errors.
diff --git a/src/libANGLE/validationES1.cpp b/src/libANGLE/validationES1.cpp
index be2d8a5..5b61d0a 100644
--- a/src/libANGLE/validationES1.cpp
+++ b/src/libANGLE/validationES1.cpp
@@ -1551,49 +1551,90 @@
                                 GLsizei n,
                                 const FramebufferID *framebuffers)
 {
-    UNIMPLEMENTED();
-    return true;
+    if (!context->getExtensions().framebufferObjectOES)
+    {
+        context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+        return false;
+    }
+
+    return ValidateGenOrDelete(context, n);
 }
 
 bool ValidateDeleteFramebuffersOES(const Context *context,
                                    GLsizei n,
                                    const FramebufferID *framebuffers)
 {
-    UNIMPLEMENTED();
-    return true;
+    if (!context->getExtensions().framebufferObjectOES)
+    {
+        context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+        return false;
+    }
+
+    return ValidateGenOrDelete(context, n);
 }
 
 bool ValidateGenRenderbuffersOES(const Context *context,
                                  GLsizei n,
                                  const RenderbufferID *renderbuffers)
 {
-    UNIMPLEMENTED();
-    return true;
+    if (!context->getExtensions().framebufferObjectOES)
+    {
+        context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+        return false;
+    }
+
+    return ValidateGenOrDelete(context, n);
 }
 
 bool ValidateDeleteRenderbuffersOES(const Context *context,
                                     GLsizei n,
                                     const RenderbufferID *renderbuffers)
 {
-    UNIMPLEMENTED();
-    return true;
+    if (!context->getExtensions().framebufferObjectOES)
+    {
+        context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+        return false;
+    }
+
+    return ValidateGenOrDelete(context, n);
 }
 
 bool ValidateBindFramebufferOES(const Context *context, GLenum target, FramebufferID framebuffer)
 {
-    UNIMPLEMENTED();
-    return true;
+    if (!context->getExtensions().framebufferObjectOES)
+    {
+        context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+        return false;
+    }
+
+    return ValidateBindFramebufferBase(context, target, framebuffer);
 }
 
 bool ValidateBindRenderbufferOES(const Context *context, GLenum target, RenderbufferID renderbuffer)
 {
-    UNIMPLEMENTED();
-    return true;
+    if (!context->getExtensions().framebufferObjectOES)
+    {
+        context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+        return false;
+    }
+
+    return ValidateBindRenderbufferBase(context, target, renderbuffer);
 }
 
 bool ValidateCheckFramebufferStatusOES(const Context *context, GLenum target)
 {
-    UNIMPLEMENTED();
+    if (!context->getExtensions().framebufferObjectOES)
+    {
+        context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+        return false;
+    }
+
+    if (!ValidFramebufferTarget(context, target))
+    {
+        context->validationError(GL_INVALID_ENUM, kInvalidFramebufferTarget);
+        return false;
+    }
+
     return true;
 }
 
@@ -1603,8 +1644,13 @@
                                         GLenum rbtarget,
                                         RenderbufferID renderbuffer)
 {
-    UNIMPLEMENTED();
-    return true;
+    if (!context->getExtensions().framebufferObjectOES)
+    {
+        context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+        return false;
+    }
+
+    return ValidateFramebufferRenderbufferBase(context, target, attachment, rbtarget, renderbuffer);
 }
 
 bool ValidateFramebufferTexture2DOES(const Context *context,
@@ -1614,14 +1660,91 @@
                                      TextureID texture,
                                      GLint level)
 {
-    UNIMPLEMENTED();
+    if (!context->getExtensions().framebufferObjectOES)
+    {
+        context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+        return false;
+    }
+
+    if (level != 0)
+    {
+        context->validationError(GL_INVALID_VALUE, kInvalidFramebufferTextureLevel);
+        return false;
+    }
+
+    if (!ValidateFramebufferTextureBase(context, target, attachment, texture, level))
+    {
+        return false;
+    }
+
+    if (texture.value != 0)
+    {
+        Texture *tex = context->getTexture(texture);
+        ASSERT(tex);
+
+        const Caps &caps = context->getCaps();
+
+        switch (textarget)
+        {
+            case TextureTarget::_2D:
+            {
+                if (level > log2(caps.max2DTextureSize))
+                {
+                    context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
+                    return false;
+                }
+                if (tex->getType() != TextureType::_2D)
+                {
+                    context->validationError(GL_INVALID_OPERATION, kInvalidTextureTarget);
+                    return false;
+                }
+            }
+            break;
+
+            case TextureTarget::CubeMapNegativeX:
+            case TextureTarget::CubeMapNegativeY:
+            case TextureTarget::CubeMapNegativeZ:
+            case TextureTarget::CubeMapPositiveX:
+            case TextureTarget::CubeMapPositiveY:
+            case TextureTarget::CubeMapPositiveZ:
+            {
+                if (!context->getExtensions().textureCubeMapOES)
+                {
+                    context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
+                    return false;
+                }
+
+                if (level > log2(caps.maxCubeMapTextureSize))
+                {
+                    context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
+                    return false;
+                }
+                if (tex->getType() != TextureType::CubeMap)
+                {
+                    context->validationError(GL_INVALID_OPERATION, kTextureTargetMismatch);
+                    return false;
+                }
+            }
+            break;
+
+            default:
+                context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
+                return false;
+        }
+    }
+
     return true;
 }
 
 bool ValidateGenerateMipmapOES(const Context *context, TextureType target)
 {
-    UNIMPLEMENTED();
-    return true;
+    if (!context->getExtensions().framebufferObjectOES)
+    {
+        context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+        return false;
+    }
+
+    return ValidateGenerateMipmapBase(context, target);
 }
 
 bool ValidateGetFramebufferAttachmentParameterivOES(const Context *context,
@@ -1630,8 +1753,14 @@
                                                     GLenum pname,
                                                     const GLint *params)
 {
-    UNIMPLEMENTED();
-    return true;
+    if (!context->getExtensions().framebufferObjectOES)
+    {
+        context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+        return false;
+    }
+
+    return ValidateGetFramebufferAttachmentParameterivBase(context, target, attachment, pname,
+                                                           nullptr);
 }
 
 bool ValidateGetRenderbufferParameterivOES(const Context *context,
@@ -1639,19 +1768,34 @@
                                            GLenum pname,
                                            const GLint *params)
 {
-    UNIMPLEMENTED();
-    return true;
+    if (!context->getExtensions().framebufferObjectOES)
+    {
+        context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+        return false;
+    }
+
+    return ValidateGetRenderbufferParameterivBase(context, target, pname, nullptr);
 }
 
 bool ValidateIsFramebufferOES(const Context *context, FramebufferID framebuffer)
 {
-    UNIMPLEMENTED();
+    if (!context->getExtensions().framebufferObjectOES)
+    {
+        context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+        return false;
+    }
+
     return true;
 }
 
 bool ValidateIsRenderbufferOES(const Context *context, RenderbufferID renderbuffer)
 {
-    UNIMPLEMENTED();
+    if (!context->getExtensions().framebufferObjectOES)
+    {
+        context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+        return false;
+    }
+
     return true;
 }
 
@@ -1661,8 +1805,14 @@
                                     GLsizei width,
                                     GLsizei height)
 {
-    UNIMPLEMENTED();
-    return true;
+    if (!context->getExtensions().framebufferObjectOES)
+    {
+        context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+        return false;
+    }
+
+    return ValidateRenderbufferStorageParametersBase(context, target, 0, internalformat, width,
+                                                     height);
 }
 
 // GL_OES_texture_cube_map
diff --git a/src/libANGLE/validationES2.cpp b/src/libANGLE/validationES2.cpp
index f48e7de..7262c1d 100644
--- a/src/libANGLE/validationES2.cpp
+++ b/src/libANGLE/validationES2.cpp
@@ -3994,38 +3994,12 @@
 
 bool ValidateBindFramebuffer(const Context *context, GLenum target, FramebufferID framebuffer)
 {
-    if (!ValidFramebufferTarget(context, target))
-    {
-        context->validationError(GL_INVALID_ENUM, kInvalidFramebufferTarget);
-        return false;
-    }
-
-    if (!context->getState().isBindGeneratesResourceEnabled() &&
-        !context->isFramebufferGenerated(framebuffer))
-    {
-        context->validationError(GL_INVALID_OPERATION, kObjectNotGenerated);
-        return false;
-    }
-
-    return true;
+    return ValidateBindFramebufferBase(context, target, framebuffer);
 }
 
 bool ValidateBindRenderbuffer(const Context *context, GLenum target, RenderbufferID renderbuffer)
 {
-    if (target != GL_RENDERBUFFER)
-    {
-        context->validationError(GL_INVALID_ENUM, kInvalidRenderbufferTarget);
-        return false;
-    }
-
-    if (!context->getState().isBindGeneratesResourceEnabled() &&
-        !context->isRenderbufferGenerated(renderbuffer))
-    {
-        context->validationError(GL_INVALID_OPERATION, kObjectNotGenerated);
-        return false;
-    }
-
-    return true;
+    return ValidateBindRenderbufferBase(context, target, renderbuffer);
 }
 
 static bool ValidBlendEquationMode(const Context *context, GLenum mode)
@@ -5397,20 +5371,8 @@
                                      GLenum renderbuffertarget,
                                      RenderbufferID renderbuffer)
 {
-    if (!ValidFramebufferTarget(context, target))
-    {
-        context->validationError(GL_INVALID_ENUM, kInvalidFramebufferTarget);
-        return false;
-    }
-
-    if (renderbuffertarget != GL_RENDERBUFFER && renderbuffer.value != 0)
-    {
-        context->validationError(GL_INVALID_ENUM, kInvalidRenderbufferTarget);
-        return false;
-    }
-
-    return ValidateFramebufferRenderbufferParameters(context, target, attachment,
-                                                     renderbuffertarget, renderbuffer);
+    return ValidateFramebufferRenderbufferBase(context, target, attachment, renderbuffertarget,
+                                               renderbuffer);
 }
 
 bool ValidateFramebufferTexture2D(const Context *context,
@@ -5638,95 +5600,7 @@
 
 bool ValidateGenerateMipmap(const Context *context, TextureType target)
 {
-    if (!ValidTextureTarget(context, target))
-    {
-        context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
-        return false;
-    }
-
-    Texture *texture = context->getTextureByType(target);
-
-    if (texture == nullptr)
-    {
-        context->validationError(GL_INVALID_OPERATION, kTextureNotBound);
-        return false;
-    }
-
-    const GLuint effectiveBaseLevel = texture->getTextureState().getEffectiveBaseLevel();
-
-    // This error isn't spelled out in the spec in a very explicit way, but we interpret the spec so
-    // that out-of-range base level has a non-color-renderable / non-texture-filterable format.
-    if (effectiveBaseLevel >= IMPLEMENTATION_MAX_TEXTURE_LEVELS)
-    {
-        context->validationError(GL_INVALID_OPERATION, kBaseLevelOutOfRange);
-        return false;
-    }
-
-    TextureTarget baseTarget = (target == TextureType::CubeMap)
-                                   ? TextureTarget::CubeMapPositiveX
-                                   : NonCubeTextureTypeToTarget(target);
-    const auto &format = *(texture->getFormat(baseTarget, effectiveBaseLevel).info);
-    if (format.sizedInternalFormat == GL_NONE || format.compressed || format.depthBits > 0 ||
-        format.stencilBits > 0)
-    {
-        context->validationError(GL_INVALID_OPERATION, kGenerateMipmapNotAllowed);
-        return false;
-    }
-
-    // GenerateMipmap accepts formats that are unsized or both color renderable and filterable.
-    bool formatUnsized = !format.sized;
-    bool formatColorRenderableAndFilterable =
-        format.filterSupport(context->getClientVersion(), context->getExtensions()) &&
-        format.textureAttachmentSupport(context->getClientVersion(), context->getExtensions());
-    if (!formatUnsized && !formatColorRenderableAndFilterable)
-    {
-        context->validationError(GL_INVALID_OPERATION, kGenerateMipmapNotAllowed);
-        return false;
-    }
-
-    // GL_EXT_sRGB adds an unsized SRGB (no alpha) format which has explicitly disabled mipmap
-    // generation
-    if (format.colorEncoding == GL_SRGB && format.format == GL_RGB)
-    {
-        context->validationError(GL_INVALID_OPERATION, kGenerateMipmapNotAllowed);
-        return false;
-    }
-
-    // According to the OpenGL extension spec EXT_sRGB.txt, EXT_SRGB is based on ES 2.0 and
-    // generateMipmap is not allowed if texture format is SRGB_EXT or SRGB_ALPHA_EXT.
-    if (context->getClientVersion() < Version(3, 0) && format.colorEncoding == GL_SRGB)
-    {
-        context->validationError(GL_INVALID_OPERATION, kGenerateMipmapNotAllowed);
-        return false;
-    }
-
-    // Non-power of 2 ES2 check
-    if (context->getClientVersion() < Version(3, 0) && !context->getExtensions().textureNPOTOES &&
-        (!isPow2(static_cast<int>(texture->getWidth(baseTarget, 0))) ||
-         !isPow2(static_cast<int>(texture->getHeight(baseTarget, 0)))))
-    {
-        ASSERT(target == TextureType::_2D || target == TextureType::Rectangle ||
-               target == TextureType::CubeMap);
-        context->validationError(GL_INVALID_OPERATION, kTextureNotPow2);
-        return false;
-    }
-
-    // Cube completeness check
-    if (target == TextureType::CubeMap && !texture->getTextureState().isCubeComplete())
-    {
-        context->validationError(GL_INVALID_OPERATION, kCubemapIncomplete);
-        return false;
-    }
-
-    if (context->getExtensions().webglCompatibility &&
-        (texture->getWidth(baseTarget, effectiveBaseLevel) == 0 ||
-         texture->getHeight(baseTarget, effectiveBaseLevel) == 0))
-    {
-        context->validationError(GL_INVALID_OPERATION, kGenerateMipmapZeroSize);
-        return false;
-    }
-
-    return true;
+    return ValidateGenerateMipmapBase(context, target);
 }
 
 bool ValidateGetBufferParameteriv(const Context *context,
diff --git a/src/libANGLE/validationESEXT.cpp b/src/libANGLE/validationESEXT.cpp
index 7e23147..0a2141f 100644
--- a/src/libANGLE/validationESEXT.cpp
+++ b/src/libANGLE/validationESEXT.cpp
@@ -77,6 +77,141 @@
     }
 }
 
+bool ValidateObjectIdentifierAndName(const Context *context, GLenum identifier, GLuint name)
+{
+    bool isGLES11 = context->getClientVersion() == Version(1, 1);
+    bool isGLES3  = context->getClientMajorVersion() >= 3;
+    bool isGLES31 = context->getClientVersion() >= Version(3, 1);
+    switch (identifier)
+    {
+        case GL_BUFFER_OBJECT_EXT:
+            if (context->getBuffer({name}) == nullptr)
+            {
+                context->validationError(GL_INVALID_OPERATION, kInvalidBufferName);
+                return false;
+            }
+            return true;
+
+        case GL_SHADER_OBJECT_EXT:
+            if (isGLES11)
+            {
+                context->validationError(GL_INVALID_ENUM, kInvalidType);
+                return false;
+            }
+            if (context->getShader({name}) == nullptr)
+            {
+                context->validationError(GL_INVALID_OPERATION, kInvalidShaderName);
+                return false;
+            }
+            return true;
+
+        case GL_PROGRAM_OBJECT_EXT:
+            if (isGLES11)
+            {
+                context->validationError(GL_INVALID_ENUM, kInvalidType);
+                return false;
+            }
+            if (context->getProgramNoResolveLink({name}) == nullptr)
+            {
+                context->validationError(GL_INVALID_OPERATION, kInvalidProgramName);
+                return false;
+            }
+            return true;
+
+        case GL_VERTEX_ARRAY_OBJECT_EXT:
+            if (!isGLES3 && !context->getExtensions().vertexArrayObjectOES)
+            {
+                context->validationError(GL_INVALID_ENUM, kInvalidType);
+                return false;
+            }
+            if (context->getVertexArray({name}) == nullptr)
+            {
+                context->validationError(GL_INVALID_OPERATION, kInvalidVertexArrayName);
+                return false;
+            }
+            return true;
+
+        case GL_QUERY_OBJECT_EXT:
+            if (!isGLES3 && !context->getExtensions().occlusionQueryBoolean)
+            {
+                context->validationError(GL_INVALID_ENUM, kInvalidType);
+                return false;
+            }
+            if (context->getQuery({name}) == nullptr)
+            {
+                context->validationError(GL_INVALID_OPERATION, kInvalidQueryName);
+                return false;
+            }
+            return true;
+
+        case GL_TRANSFORM_FEEDBACK:
+            if (!isGLES3)
+            {
+                context->validationError(GL_INVALID_ENUM, kInvalidType);
+                return false;
+            }
+            if (context->getTransformFeedback({name}) == nullptr)
+            {
+                context->validationError(GL_INVALID_OPERATION, kInvalidTransformFeedbackName);
+                return false;
+            }
+            return true;
+
+        case GL_SAMPLER:
+            if (!isGLES3)
+            {
+                context->validationError(GL_INVALID_ENUM, kInvalidType);
+                return false;
+            }
+            if (context->getSampler({name}) == nullptr)
+            {
+                context->validationError(GL_INVALID_OPERATION, kInvalidSamplerName);
+                return false;
+            }
+            return true;
+
+        case GL_TEXTURE:
+            if (context->getTexture({name}) == nullptr)
+            {
+                context->validationError(GL_INVALID_OPERATION, kInvalidTextureName);
+                return false;
+            }
+            return true;
+
+        case GL_RENDERBUFFER:
+            if (!context->isRenderbuffer({name}))
+            {
+                context->validationError(GL_INVALID_OPERATION, kInvalidRenderbufferName);
+                return false;
+            }
+            return true;
+
+        case GL_FRAMEBUFFER:
+            if (context->getFramebuffer({name}) == nullptr)
+            {
+                context->validationError(GL_INVALID_OPERATION, kInvalidFramebufferName);
+                return false;
+            }
+            return true;
+
+        case GL_PROGRAM_PIPELINE_OBJECT_EXT:
+            if (!isGLES31 && !context->getExtensions().separateShaderObjects)
+            {
+                context->validationError(GL_INVALID_ENUM, kInvalidType);
+                return false;
+            }
+            if (context->getProgramPipeline({name}) == nullptr)
+            {
+                context->validationError(GL_INVALID_OPERATION, kInvalidProgramPipelineName);
+                return false;
+            }
+            return true;
+
+        default:
+            context->validationError(GL_INVALID_ENUM, kInvalidIndentifier);
+            return false;
+    }
+}
 }  // namespace
 
 bool ValidateGetTexImageANGLE(const Context *context,
@@ -1860,4 +1995,48 @@
 
     return ValidateValidateProgramPipelineBase(context, pipelinePacked);
 }
+
+// GL_EXT_debug_label
+bool ValidateGetObjectLabelEXT(const Context *context,
+                               GLenum type,
+                               GLuint object,
+                               GLsizei bufSize,
+                               const GLsizei *length,
+                               const GLchar *label)
+{
+    if (!context->getExtensions().debugLabel)
+    {
+        context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+        return false;
+    }
+
+    if (bufSize < 0)
+    {
+        context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
+        return false;
+    }
+
+    return ValidateObjectIdentifierAndName(context, type, object);
+}
+
+bool ValidateLabelObjectEXT(const Context *context,
+                            GLenum type,
+                            GLuint object,
+                            GLsizei length,
+                            const GLchar *label)
+{
+    if (!context->getExtensions().debugLabel)
+    {
+        context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+        return false;
+    }
+
+    if (length < 0)
+    {
+        context->validationError(GL_INVALID_VALUE, kNegativeLength);
+        return false;
+    }
+
+    return ValidateObjectIdentifierAndName(context, type, object);
+}
 }  // namespace gl
diff --git a/src/libANGLE/validationESEXT_autogen.h b/src/libANGLE/validationESEXT_autogen.h
index 243ec8b..2deb929 100644
--- a/src/libANGLE/validationESEXT_autogen.h
+++ b/src/libANGLE/validationESEXT_autogen.h
@@ -796,6 +796,19 @@
                                  GLsizei srcHeight,
                                  GLsizei srcDepth);
 
+// GL_EXT_debug_label
+bool ValidateGetObjectLabelEXT(const Context *context,
+                               GLenum type,
+                               GLuint object,
+                               GLsizei bufSize,
+                               const GLsizei *length,
+                               const GLchar *label);
+bool ValidateLabelObjectEXT(const Context *context,
+                            GLenum type,
+                            GLuint object,
+                            GLsizei length,
+                            const GLchar *label);
+
 // GL_EXT_debug_marker
 bool ValidateInsertEventMarkerEXT(const Context *context, GLsizei length, const GLchar *marker);
 bool ValidatePopGroupMarkerEXT(const Context *context);
@@ -1303,6 +1316,8 @@
                                  ShaderProgramID programPacked);
 bool ValidateValidateProgramPipelineEXT(const Context *context, ProgramPipelineID pipelinePacked);
 
+// GL_EXT_shader_io_blocks
+
 // GL_EXT_tessellation_shader
 bool ValidatePatchParameteriEXT(const Context *context, GLenum pname, GLint value);
 
@@ -1630,6 +1645,8 @@
 // GL_OES_sample_shading
 bool ValidateMinSampleShadingOES(const Context *context, GLfloat value);
 
+// GL_OES_shader_io_blocks
+
 // GL_OES_texture_3D
 bool ValidateCompressedTexImage3DOES(const Context *context,
                                      TextureTarget targetPacked,
diff --git a/src/libANGLE/validationGL1.cpp b/src/libANGLE/validationGL1.cpp
index c6ded5f..8a77398 100644
--- a/src/libANGLE/validationGL1.cpp
+++ b/src/libANGLE/validationGL1.cpp
@@ -1276,4 +1276,568 @@
     return true;
 }
 
+bool ValidateAreTexturesResident(const Context *context,
+                                 GLsizei n,
+                                 const GLuint *textures,
+                                 const GLboolean *residences)
+{
+    return true;
+}
+
+bool ValidateArrayElement(const Context *context, GLint i)
+{
+    return true;
+}
+
+bool ValidateCopyTexImage1D(const Context *context,
+                            GLenum target,
+                            GLint level,
+                            GLenum internalformat,
+                            GLint x,
+                            GLint y,
+                            GLsizei width,
+                            GLint border)
+{
+    return true;
+}
+
+bool ValidateCopyTexSubImage1D(const Context *context,
+                               GLenum target,
+                               GLint level,
+                               GLint xoffset,
+                               GLint x,
+                               GLint y,
+                               GLsizei width)
+{
+    return true;
+}
+
+bool ValidateEdgeFlagPointer(const Context *context, GLsizei stride, const void *pointer)
+{
+    return true;
+}
+
+bool ValidateIndexPointer(const Context *context, GLenum type, GLsizei stride, const void *pointer)
+{
+    return true;
+}
+
+bool ValidateIndexub(const Context *context, GLubyte c)
+{
+    return true;
+}
+
+bool ValidateIndexubv(const Context *context, const GLubyte *c)
+{
+    return true;
+}
+
+bool ValidateInterleavedArrays(const Context *context,
+                               GLenum format,
+                               GLsizei stride,
+                               const void *pointer)
+{
+    return true;
+}
+
+bool ValidatePopClientAttrib(const Context *context)
+{
+    return true;
+}
+
+bool ValidatePrioritizeTextures(const Context *context,
+                                GLsizei n,
+                                const GLuint *textures,
+                                const GLfloat *priorities)
+{
+    return true;
+}
+
+bool ValidatePushClientAttrib(const Context *context, GLbitfield mask)
+{
+    return true;
+}
+
+bool ValidateTexSubImage1D(const Context *context,
+                           GLenum target,
+                           GLint level,
+                           GLint xoffset,
+                           GLsizei width,
+                           GLenum format,
+                           GLenum type,
+                           const void *pixels)
+{
+    return true;
+}
+
+bool ValidateCompressedTexImage1D(const Context *context,
+                                  GLenum target,
+                                  GLint level,
+                                  GLenum internalformat,
+                                  GLsizei width,
+                                  GLint border,
+                                  GLsizei imageSize,
+                                  const void *data)
+{
+    return true;
+}
+
+bool ValidateCompressedTexSubImage1D(const Context *context,
+                                     GLenum target,
+                                     GLint level,
+                                     GLint xoffset,
+                                     GLsizei width,
+                                     GLenum format,
+                                     GLsizei imageSize,
+                                     const void *data)
+{
+    return true;
+}
+
+bool ValidateGetCompressedTexImage(const Context *context,
+                                   GLenum target,
+                                   GLint level,
+                                   const void *img)
+{
+    return true;
+}
+
+bool ValidateLoadTransposeMatrixd(const Context *context, const GLdouble *m)
+{
+    return true;
+}
+
+bool ValidateLoadTransposeMatrixf(const Context *context, const GLfloat *m)
+{
+    return true;
+}
+
+bool ValidateMultTransposeMatrixd(const Context *context, const GLdouble *m)
+{
+    return true;
+}
+
+bool ValidateMultTransposeMatrixf(const Context *context, const GLfloat *m)
+{
+    return true;
+}
+
+bool ValidateMultiTexCoord1d(const Context *context, GLenum target, GLdouble s)
+{
+    return true;
+}
+
+bool ValidateMultiTexCoord1dv(const Context *context, GLenum target, const GLdouble *v)
+{
+    return true;
+}
+
+bool ValidateMultiTexCoord1f(const Context *context, GLenum target, GLfloat s)
+{
+    return true;
+}
+
+bool ValidateMultiTexCoord1fv(const Context *context, GLenum target, const GLfloat *v)
+{
+    return true;
+}
+
+bool ValidateMultiTexCoord1i(const Context *context, GLenum target, GLint s)
+{
+    return true;
+}
+
+bool ValidateMultiTexCoord1iv(const Context *context, GLenum target, const GLint *v)
+{
+    return true;
+}
+
+bool ValidateMultiTexCoord1s(const Context *context, GLenum target, GLshort s)
+{
+    return true;
+}
+
+bool ValidateMultiTexCoord1sv(const Context *context, GLenum target, const GLshort *v)
+{
+    return true;
+}
+
+bool ValidateMultiTexCoord2d(const Context *context, GLenum target, GLdouble s, GLdouble t)
+{
+    return true;
+}
+
+bool ValidateMultiTexCoord2dv(const Context *context, GLenum target, const GLdouble *v)
+{
+    return true;
+}
+
+bool ValidateMultiTexCoord2f(const Context *context, GLenum target, GLfloat s, GLfloat t)
+{
+    return true;
+}
+
+bool ValidateMultiTexCoord2fv(const Context *context, GLenum target, const GLfloat *v)
+{
+    return true;
+}
+
+bool ValidateMultiTexCoord2i(const Context *context, GLenum target, GLint s, GLint t)
+{
+    return true;
+}
+
+bool ValidateMultiTexCoord2iv(const Context *context, GLenum target, const GLint *v)
+{
+    return true;
+}
+
+bool ValidateMultiTexCoord2s(const Context *context, GLenum target, GLshort s, GLshort t)
+{
+    return true;
+}
+
+bool ValidateMultiTexCoord2sv(const Context *context, GLenum target, const GLshort *v)
+{
+    return true;
+}
+
+bool ValidateMultiTexCoord3d(const Context *context,
+                             GLenum target,
+                             GLdouble s,
+                             GLdouble t,
+                             GLdouble r)
+{
+    return true;
+}
+
+bool ValidateMultiTexCoord3dv(const Context *context, GLenum target, const GLdouble *v)
+{
+    return true;
+}
+
+bool ValidateMultiTexCoord3f(const Context *context, GLenum target, GLfloat s, GLfloat t, GLfloat r)
+{
+    return true;
+}
+
+bool ValidateMultiTexCoord3fv(const Context *context, GLenum target, const GLfloat *v)
+{
+    return true;
+}
+
+bool ValidateMultiTexCoord3i(const Context *context, GLenum target, GLint s, GLint t, GLint r)
+{
+    return true;
+}
+
+bool ValidateMultiTexCoord3iv(const Context *context, GLenum target, const GLint *v)
+{
+    return true;
+}
+
+bool ValidateMultiTexCoord3s(const Context *context, GLenum target, GLshort s, GLshort t, GLshort r)
+{
+    return true;
+}
+
+bool ValidateMultiTexCoord3sv(const Context *context, GLenum target, const GLshort *v)
+{
+    return true;
+}
+
+bool ValidateMultiTexCoord4d(const Context *context,
+                             GLenum target,
+                             GLdouble s,
+                             GLdouble t,
+                             GLdouble r,
+                             GLdouble q)
+{
+    return true;
+}
+
+bool ValidateMultiTexCoord4dv(const Context *context, GLenum target, const GLdouble *v)
+{
+    return true;
+}
+
+bool ValidateMultiTexCoord4fv(const Context *context, GLenum target, const GLfloat *v)
+{
+    return true;
+}
+
+bool ValidateMultiTexCoord4i(const Context *context,
+                             GLenum target,
+                             GLint s,
+                             GLint t,
+                             GLint r,
+                             GLint q)
+{
+    return true;
+}
+
+bool ValidateMultiTexCoord4iv(const Context *context, GLenum target, const GLint *v)
+{
+    return true;
+}
+
+bool ValidateMultiTexCoord4s(const Context *context,
+                             GLenum target,
+                             GLshort s,
+                             GLshort t,
+                             GLshort r,
+                             GLshort q)
+{
+    return true;
+}
+
+bool ValidateMultiTexCoord4sv(const Context *context, GLenum target, const GLshort *v)
+{
+    return true;
+}
+
+bool ValidateFogCoordPointer(const Context *context,
+                             GLenum type,
+                             GLsizei stride,
+                             const void *pointer)
+{
+    return true;
+}
+
+bool ValidateFogCoordd(const Context *context, GLdouble coord)
+{
+    return true;
+}
+
+bool ValidateFogCoorddv(const Context *context, const GLdouble *coord)
+{
+    return true;
+}
+
+bool ValidateFogCoordf(const Context *context, GLfloat coord)
+{
+    return true;
+}
+
+bool ValidateFogCoordfv(const Context *context, const GLfloat *coord)
+{
+    return true;
+}
+
+bool ValidateMultiDrawArrays(const Context *context,
+                             PrimitiveMode modePacked,
+                             const GLint *first,
+                             const GLsizei *count,
+                             GLsizei drawcount)
+{
+    return true;
+}
+
+bool ValidateMultiDrawElements(const Context *context,
+                               PrimitiveMode modePacked,
+                               const GLsizei *count,
+                               DrawElementsType typePacked,
+                               const void *const *indices,
+                               GLsizei drawcount)
+{
+    return true;
+}
+
+bool ValidatePointParameteri(const Context *context, GLenum pname, GLint param)
+{
+    return true;
+}
+
+bool ValidatePointParameteriv(const Context *context, GLenum pname, const GLint *params)
+{
+    return true;
+}
+
+bool ValidateSecondaryColor3b(const Context *context, GLbyte red, GLbyte green, GLbyte blue)
+{
+    return true;
+}
+
+bool ValidateSecondaryColor3bv(const Context *context, const GLbyte *v)
+{
+    return true;
+}
+
+bool ValidateSecondaryColor3d(const Context *context, GLdouble red, GLdouble green, GLdouble blue)
+{
+    return true;
+}
+
+bool ValidateSecondaryColor3dv(const Context *context, const GLdouble *v)
+{
+    return true;
+}
+
+bool ValidateSecondaryColor3f(const Context *context, GLfloat red, GLfloat green, GLfloat blue)
+{
+    return true;
+}
+
+bool ValidateSecondaryColor3fv(const Context *context, const GLfloat *v)
+{
+    return true;
+}
+
+bool ValidateSecondaryColor3i(const Context *context, GLint red, GLint green, GLint blue)
+{
+    return true;
+}
+
+bool ValidateSecondaryColor3iv(const Context *context, const GLint *v)
+{
+    return true;
+}
+
+bool ValidateSecondaryColor3s(const Context *context, GLshort red, GLshort green, GLshort blue)
+{
+    return true;
+}
+
+bool ValidateSecondaryColor3sv(const Context *context, const GLshort *v)
+{
+    return true;
+}
+
+bool ValidateSecondaryColor3ub(const Context *context, GLubyte red, GLubyte green, GLubyte blue)
+{
+    return true;
+}
+
+bool ValidateSecondaryColor3ubv(const Context *context, const GLubyte *v)
+{
+    return true;
+}
+
+bool ValidateSecondaryColor3ui(const Context *context, GLuint red, GLuint green, GLuint blue)
+{
+    return true;
+}
+
+bool ValidateSecondaryColor3uiv(const Context *context, const GLuint *v)
+{
+    return true;
+}
+
+bool ValidateSecondaryColor3us(const Context *context, GLushort red, GLushort green, GLushort blue)
+{
+    return true;
+}
+
+bool ValidateSecondaryColor3usv(const Context *context, const GLushort *v)
+{
+    return true;
+}
+
+bool ValidateSecondaryColorPointer(const Context *context,
+                                   GLint size,
+                                   GLenum type,
+                                   GLsizei stride,
+                                   const void *pointer)
+{
+    return true;
+}
+
+bool ValidateWindowPos2d(const Context *context, GLdouble x, GLdouble y)
+{
+    return true;
+}
+
+bool ValidateWindowPos2dv(const Context *context, const GLdouble *v)
+{
+    return true;
+}
+
+bool ValidateWindowPos2f(const Context *context, GLfloat x, GLfloat y)
+{
+    return true;
+}
+
+bool ValidateWindowPos2fv(const Context *context, const GLfloat *v)
+{
+    return true;
+}
+
+bool ValidateWindowPos2i(const Context *context, GLint x, GLint y)
+{
+    return true;
+}
+
+bool ValidateWindowPos2iv(const Context *context, const GLint *v)
+{
+    return true;
+}
+
+bool ValidateWindowPos2s(const Context *context, GLshort x, GLshort y)
+{
+    return true;
+}
+
+bool ValidateWindowPos2sv(const Context *context, const GLshort *v)
+{
+    return true;
+}
+
+bool ValidateWindowPos3d(const Context *context, GLdouble x, GLdouble y, GLdouble z)
+{
+    return true;
+}
+
+bool ValidateWindowPos3dv(const Context *context, const GLdouble *v)
+{
+    return true;
+}
+
+bool ValidateWindowPos3f(const Context *context, GLfloat x, GLfloat y, GLfloat z)
+{
+    return true;
+}
+
+bool ValidateWindowPos3fv(const Context *context, const GLfloat *v)
+{
+    return true;
+}
+
+bool ValidateWindowPos3i(const Context *context, GLint x, GLint y, GLint z)
+{
+    return true;
+}
+
+bool ValidateWindowPos3iv(const Context *context, const GLint *v)
+{
+    return true;
+}
+
+bool ValidateWindowPos3s(const Context *context, GLshort x, GLshort y, GLshort z)
+{
+    return true;
+}
+
+bool ValidateWindowPos3sv(const Context *context, const GLshort *v)
+{
+    return true;
+}
+
+bool ValidateGetBufferSubData(const Context *context,
+                              GLenum target,
+                              GLintptr offset,
+                              GLsizeiptr size,
+                              const void *data)
+{
+    return true;
+}
+
+bool ValidateGetQueryObjectiv(const Context *context, QueryID id, GLenum pname, const GLint *params)
+{
+    return true;
+}
+
+bool ValidateMapBuffer(const Context *context, BufferBinding targetPacked, GLenum access)
+{
+    return true;
+}
 }  // namespace gl
diff --git a/src/libANGLE/validationGL11.cpp b/src/libANGLE/validationGL11.cpp
deleted file mode 100644
index 67e239f..0000000
--- a/src/libANGLE/validationGL11.cpp
+++ /dev/null
@@ -1,108 +0,0 @@
-//
-// Copyright 2019 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// validationGL11.cpp: Validation functions for OpenGL 1.1 entry point parameters
-
-#include "libANGLE/validationGL11_autogen.h"
-
-namespace gl
-{
-
-bool ValidateAreTexturesResident(const Context *context,
-                                 GLsizei n,
-                                 const GLuint *textures,
-                                 const GLboolean *residences)
-{
-    return true;
-}
-
-bool ValidateArrayElement(const Context *context, GLint i)
-{
-    return true;
-}
-
-bool ValidateCopyTexImage1D(const Context *context,
-                            GLenum target,
-                            GLint level,
-                            GLenum internalformat,
-                            GLint x,
-                            GLint y,
-                            GLsizei width,
-                            GLint border)
-{
-    return true;
-}
-
-bool ValidateCopyTexSubImage1D(const Context *context,
-                               GLenum target,
-                               GLint level,
-                               GLint xoffset,
-                               GLint x,
-                               GLint y,
-                               GLsizei width)
-{
-    return true;
-}
-
-bool ValidateEdgeFlagPointer(const Context *context, GLsizei stride, const void *pointer)
-{
-    return true;
-}
-
-bool ValidateIndexPointer(const Context *context, GLenum type, GLsizei stride, const void *pointer)
-{
-    return true;
-}
-
-bool ValidateIndexub(const Context *context, GLubyte c)
-{
-    return true;
-}
-
-bool ValidateIndexubv(const Context *context, const GLubyte *c)
-{
-    return true;
-}
-
-bool ValidateInterleavedArrays(const Context *context,
-                               GLenum format,
-                               GLsizei stride,
-                               const void *pointer)
-{
-    return true;
-}
-
-bool ValidatePopClientAttrib(const Context *context)
-{
-    return true;
-}
-
-bool ValidatePrioritizeTextures(const Context *context,
-                                GLsizei n,
-                                const GLuint *textures,
-                                const GLfloat *priorities)
-{
-    return true;
-}
-
-bool ValidatePushClientAttrib(const Context *context, GLbitfield mask)
-{
-    return true;
-}
-
-bool ValidateTexSubImage1D(const Context *context,
-                           GLenum target,
-                           GLint level,
-                           GLint xoffset,
-                           GLsizei width,
-                           GLenum format,
-                           GLenum type,
-                           const void *pixels)
-{
-    return true;
-}
-
-}  // namespace gl
diff --git a/src/libANGLE/validationGL11_autogen.h b/src/libANGLE/validationGL11_autogen.h
index abd2598..ce20c79 100644
--- a/src/libANGLE/validationGL11_autogen.h
+++ b/src/libANGLE/validationGL11_autogen.h
@@ -1,5 +1,5 @@
 // GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml and wgl.xml.
+// Generated by generate_entry_points.py using data from gl.xml.
 //
 // Copyright 2020 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
diff --git a/src/libANGLE/validationGL12.cpp b/src/libANGLE/validationGL12.cpp
deleted file mode 100644
index 7c94ddb..0000000
--- a/src/libANGLE/validationGL12.cpp
+++ /dev/null
@@ -1,12 +0,0 @@
-//
-// Copyright 2019 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// validationGL12.cpp: Validation functions for OpenGL 1.2 entry point parameters
-
-#include "libANGLE/validationGL12_autogen.h"
-
-namespace gl
-{}  // namespace gl
diff --git a/src/libANGLE/validationGL12_autogen.h b/src/libANGLE/validationGL12_autogen.h
index ee4239d..c4e445f 100644
--- a/src/libANGLE/validationGL12_autogen.h
+++ b/src/libANGLE/validationGL12_autogen.h
@@ -1,5 +1,5 @@
 // GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml and wgl.xml.
+// Generated by generate_entry_points.py using data from gl.xml.
 //
 // Copyright 2020 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
diff --git a/src/libANGLE/validationGL13.cpp b/src/libANGLE/validationGL13.cpp
deleted file mode 100644
index bb61003..0000000
--- a/src/libANGLE/validationGL13.cpp
+++ /dev/null
@@ -1,240 +0,0 @@
-//
-// Copyright 2019 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// validationGL13.cpp: Validation functions for OpenGL 1.3 entry point parameters
-
-#include "libANGLE/validationGL13_autogen.h"
-
-namespace gl
-{
-
-bool ValidateCompressedTexImage1D(const Context *context,
-                                  GLenum target,
-                                  GLint level,
-                                  GLenum internalformat,
-                                  GLsizei width,
-                                  GLint border,
-                                  GLsizei imageSize,
-                                  const void *data)
-{
-    return true;
-}
-
-bool ValidateCompressedTexSubImage1D(const Context *context,
-                                     GLenum target,
-                                     GLint level,
-                                     GLint xoffset,
-                                     GLsizei width,
-                                     GLenum format,
-                                     GLsizei imageSize,
-                                     const void *data)
-{
-    return true;
-}
-
-bool ValidateGetCompressedTexImage(const Context *context,
-                                   GLenum target,
-                                   GLint level,
-                                   const void *img)
-{
-    return true;
-}
-
-bool ValidateLoadTransposeMatrixd(const Context *context, const GLdouble *m)
-{
-    return true;
-}
-
-bool ValidateLoadTransposeMatrixf(const Context *context, const GLfloat *m)
-{
-    return true;
-}
-
-bool ValidateMultTransposeMatrixd(const Context *context, const GLdouble *m)
-{
-    return true;
-}
-
-bool ValidateMultTransposeMatrixf(const Context *context, const GLfloat *m)
-{
-    return true;
-}
-
-bool ValidateMultiTexCoord1d(const Context *context, GLenum target, GLdouble s)
-{
-    return true;
-}
-
-bool ValidateMultiTexCoord1dv(const Context *context, GLenum target, const GLdouble *v)
-{
-    return true;
-}
-
-bool ValidateMultiTexCoord1f(const Context *context, GLenum target, GLfloat s)
-{
-    return true;
-}
-
-bool ValidateMultiTexCoord1fv(const Context *context, GLenum target, const GLfloat *v)
-{
-    return true;
-}
-
-bool ValidateMultiTexCoord1i(const Context *context, GLenum target, GLint s)
-{
-    return true;
-}
-
-bool ValidateMultiTexCoord1iv(const Context *context, GLenum target, const GLint *v)
-{
-    return true;
-}
-
-bool ValidateMultiTexCoord1s(const Context *context, GLenum target, GLshort s)
-{
-    return true;
-}
-
-bool ValidateMultiTexCoord1sv(const Context *context, GLenum target, const GLshort *v)
-{
-    return true;
-}
-
-bool ValidateMultiTexCoord2d(const Context *context, GLenum target, GLdouble s, GLdouble t)
-{
-    return true;
-}
-
-bool ValidateMultiTexCoord2dv(const Context *context, GLenum target, const GLdouble *v)
-{
-    return true;
-}
-
-bool ValidateMultiTexCoord2f(const Context *context, GLenum target, GLfloat s, GLfloat t)
-{
-    return true;
-}
-
-bool ValidateMultiTexCoord2fv(const Context *context, GLenum target, const GLfloat *v)
-{
-    return true;
-}
-
-bool ValidateMultiTexCoord2i(const Context *context, GLenum target, GLint s, GLint t)
-{
-    return true;
-}
-
-bool ValidateMultiTexCoord2iv(const Context *context, GLenum target, const GLint *v)
-{
-    return true;
-}
-
-bool ValidateMultiTexCoord2s(const Context *context, GLenum target, GLshort s, GLshort t)
-{
-    return true;
-}
-
-bool ValidateMultiTexCoord2sv(const Context *context, GLenum target, const GLshort *v)
-{
-    return true;
-}
-
-bool ValidateMultiTexCoord3d(const Context *context,
-                             GLenum target,
-                             GLdouble s,
-                             GLdouble t,
-                             GLdouble r)
-{
-    return true;
-}
-
-bool ValidateMultiTexCoord3dv(const Context *context, GLenum target, const GLdouble *v)
-{
-    return true;
-}
-
-bool ValidateMultiTexCoord3f(const Context *context, GLenum target, GLfloat s, GLfloat t, GLfloat r)
-{
-    return true;
-}
-
-bool ValidateMultiTexCoord3fv(const Context *context, GLenum target, const GLfloat *v)
-{
-    return true;
-}
-
-bool ValidateMultiTexCoord3i(const Context *context, GLenum target, GLint s, GLint t, GLint r)
-{
-    return true;
-}
-
-bool ValidateMultiTexCoord3iv(const Context *context, GLenum target, const GLint *v)
-{
-    return true;
-}
-
-bool ValidateMultiTexCoord3s(const Context *context, GLenum target, GLshort s, GLshort t, GLshort r)
-{
-    return true;
-}
-
-bool ValidateMultiTexCoord3sv(const Context *context, GLenum target, const GLshort *v)
-{
-    return true;
-}
-
-bool ValidateMultiTexCoord4d(const Context *context,
-                             GLenum target,
-                             GLdouble s,
-                             GLdouble t,
-                             GLdouble r,
-                             GLdouble q)
-{
-    return true;
-}
-
-bool ValidateMultiTexCoord4dv(const Context *context, GLenum target, const GLdouble *v)
-{
-    return true;
-}
-
-bool ValidateMultiTexCoord4fv(const Context *context, GLenum target, const GLfloat *v)
-{
-    return true;
-}
-
-bool ValidateMultiTexCoord4i(const Context *context,
-                             GLenum target,
-                             GLint s,
-                             GLint t,
-                             GLint r,
-                             GLint q)
-{
-    return true;
-}
-
-bool ValidateMultiTexCoord4iv(const Context *context, GLenum target, const GLint *v)
-{
-    return true;
-}
-
-bool ValidateMultiTexCoord4s(const Context *context,
-                             GLenum target,
-                             GLshort s,
-                             GLshort t,
-                             GLshort r,
-                             GLshort q)
-{
-    return true;
-}
-
-bool ValidateMultiTexCoord4sv(const Context *context, GLenum target, const GLshort *v)
-{
-    return true;
-}
-
-}  // namespace gl
diff --git a/src/libANGLE/validationGL13_autogen.h b/src/libANGLE/validationGL13_autogen.h
index 8db1c8a..46491dc 100644
--- a/src/libANGLE/validationGL13_autogen.h
+++ b/src/libANGLE/validationGL13_autogen.h
@@ -1,5 +1,5 @@
 // GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml and wgl.xml.
+// Generated by generate_entry_points.py using data from gl.xml.
 //
 // Copyright 2020 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
diff --git a/src/libANGLE/validationGL14.cpp b/src/libANGLE/validationGL14.cpp
deleted file mode 100644
index 68fa933..0000000
--- a/src/libANGLE/validationGL14.cpp
+++ /dev/null
@@ -1,240 +0,0 @@
-//
-// Copyright 2019 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// validationGL14.cpp: Validation functions for OpenGL 1.4 entry point parameters
-
-#include "libANGLE/validationGL14_autogen.h"
-
-namespace gl
-{
-
-bool ValidateFogCoordPointer(const Context *context,
-                             GLenum type,
-                             GLsizei stride,
-                             const void *pointer)
-{
-    return true;
-}
-
-bool ValidateFogCoordd(const Context *context, GLdouble coord)
-{
-    return true;
-}
-
-bool ValidateFogCoorddv(const Context *context, const GLdouble *coord)
-{
-    return true;
-}
-
-bool ValidateFogCoordf(const Context *context, GLfloat coord)
-{
-    return true;
-}
-
-bool ValidateFogCoordfv(const Context *context, const GLfloat *coord)
-{
-    return true;
-}
-
-bool ValidateMultiDrawArrays(const Context *context,
-                             PrimitiveMode modePacked,
-                             const GLint *first,
-                             const GLsizei *count,
-                             GLsizei drawcount)
-{
-    return true;
-}
-
-bool ValidateMultiDrawElements(const Context *context,
-                               PrimitiveMode modePacked,
-                               const GLsizei *count,
-                               DrawElementsType typePacked,
-                               const void *const *indices,
-                               GLsizei drawcount)
-{
-    return true;
-}
-
-bool ValidatePointParameteri(const Context *context, GLenum pname, GLint param)
-{
-    return true;
-}
-
-bool ValidatePointParameteriv(const Context *context, GLenum pname, const GLint *params)
-{
-    return true;
-}
-
-bool ValidateSecondaryColor3b(const Context *context, GLbyte red, GLbyte green, GLbyte blue)
-{
-    return true;
-}
-
-bool ValidateSecondaryColor3bv(const Context *context, const GLbyte *v)
-{
-    return true;
-}
-
-bool ValidateSecondaryColor3d(const Context *context, GLdouble red, GLdouble green, GLdouble blue)
-{
-    return true;
-}
-
-bool ValidateSecondaryColor3dv(const Context *context, const GLdouble *v)
-{
-    return true;
-}
-
-bool ValidateSecondaryColor3f(const Context *context, GLfloat red, GLfloat green, GLfloat blue)
-{
-    return true;
-}
-
-bool ValidateSecondaryColor3fv(const Context *context, const GLfloat *v)
-{
-    return true;
-}
-
-bool ValidateSecondaryColor3i(const Context *context, GLint red, GLint green, GLint blue)
-{
-    return true;
-}
-
-bool ValidateSecondaryColor3iv(const Context *context, const GLint *v)
-{
-    return true;
-}
-
-bool ValidateSecondaryColor3s(const Context *context, GLshort red, GLshort green, GLshort blue)
-{
-    return true;
-}
-
-bool ValidateSecondaryColor3sv(const Context *context, const GLshort *v)
-{
-    return true;
-}
-
-bool ValidateSecondaryColor3ub(const Context *context, GLubyte red, GLubyte green, GLubyte blue)
-{
-    return true;
-}
-
-bool ValidateSecondaryColor3ubv(const Context *context, const GLubyte *v)
-{
-    return true;
-}
-
-bool ValidateSecondaryColor3ui(const Context *context, GLuint red, GLuint green, GLuint blue)
-{
-    return true;
-}
-
-bool ValidateSecondaryColor3uiv(const Context *context, const GLuint *v)
-{
-    return true;
-}
-
-bool ValidateSecondaryColor3us(const Context *context, GLushort red, GLushort green, GLushort blue)
-{
-    return true;
-}
-
-bool ValidateSecondaryColor3usv(const Context *context, const GLushort *v)
-{
-    return true;
-}
-
-bool ValidateSecondaryColorPointer(const Context *context,
-                                   GLint size,
-                                   GLenum type,
-                                   GLsizei stride,
-                                   const void *pointer)
-{
-    return true;
-}
-
-bool ValidateWindowPos2d(const Context *context, GLdouble x, GLdouble y)
-{
-    return true;
-}
-
-bool ValidateWindowPos2dv(const Context *context, const GLdouble *v)
-{
-    return true;
-}
-
-bool ValidateWindowPos2f(const Context *context, GLfloat x, GLfloat y)
-{
-    return true;
-}
-
-bool ValidateWindowPos2fv(const Context *context, const GLfloat *v)
-{
-    return true;
-}
-
-bool ValidateWindowPos2i(const Context *context, GLint x, GLint y)
-{
-    return true;
-}
-
-bool ValidateWindowPos2iv(const Context *context, const GLint *v)
-{
-    return true;
-}
-
-bool ValidateWindowPos2s(const Context *context, GLshort x, GLshort y)
-{
-    return true;
-}
-
-bool ValidateWindowPos2sv(const Context *context, const GLshort *v)
-{
-    return true;
-}
-
-bool ValidateWindowPos3d(const Context *context, GLdouble x, GLdouble y, GLdouble z)
-{
-    return true;
-}
-
-bool ValidateWindowPos3dv(const Context *context, const GLdouble *v)
-{
-    return true;
-}
-
-bool ValidateWindowPos3f(const Context *context, GLfloat x, GLfloat y, GLfloat z)
-{
-    return true;
-}
-
-bool ValidateWindowPos3fv(const Context *context, const GLfloat *v)
-{
-    return true;
-}
-
-bool ValidateWindowPos3i(const Context *context, GLint x, GLint y, GLint z)
-{
-    return true;
-}
-
-bool ValidateWindowPos3iv(const Context *context, const GLint *v)
-{
-    return true;
-}
-
-bool ValidateWindowPos3s(const Context *context, GLshort x, GLshort y, GLshort z)
-{
-    return true;
-}
-
-bool ValidateWindowPos3sv(const Context *context, const GLshort *v)
-{
-    return true;
-}
-
-}  // namespace gl
diff --git a/src/libANGLE/validationGL14_autogen.h b/src/libANGLE/validationGL14_autogen.h
index 6837ce9..b1d7bcb 100644
--- a/src/libANGLE/validationGL14_autogen.h
+++ b/src/libANGLE/validationGL14_autogen.h
@@ -1,5 +1,5 @@
 // GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml and wgl.xml.
+// Generated by generate_entry_points.py using data from gl.xml.
 //
 // Copyright 2020 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
diff --git a/src/libANGLE/validationGL15.cpp b/src/libANGLE/validationGL15.cpp
deleted file mode 100644
index 6703b64..0000000
--- a/src/libANGLE/validationGL15.cpp
+++ /dev/null
@@ -1,33 +0,0 @@
-//
-// Copyright 2019 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// validationGL15.cpp: Validation functions for OpenGL 1.5 entry point parameters
-
-#include "libANGLE/validationGL15_autogen.h"
-
-namespace gl
-{
-
-bool ValidateGetBufferSubData(const Context *context,
-                              GLenum target,
-                              GLintptr offset,
-                              GLsizeiptr size,
-                              const void *data)
-{
-    return true;
-}
-
-bool ValidateGetQueryObjectiv(const Context *context, QueryID id, GLenum pname, const GLint *params)
-{
-    return true;
-}
-
-bool ValidateMapBuffer(const Context *context, BufferBinding targetPacked, GLenum access)
-{
-    return true;
-}
-
-}  // namespace gl
diff --git a/src/libANGLE/validationGL15_autogen.h b/src/libANGLE/validationGL15_autogen.h
index 634f4ec..17278c3 100644
--- a/src/libANGLE/validationGL15_autogen.h
+++ b/src/libANGLE/validationGL15_autogen.h
@@ -1,5 +1,5 @@
 // GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml and wgl.xml.
+// Generated by generate_entry_points.py using data from gl.xml.
 //
 // Copyright 2020 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
diff --git a/src/libANGLE/validationGL1_autogen.h b/src/libANGLE/validationGL1_autogen.h
index 37af44e..5cd573e 100644
--- a/src/libANGLE/validationGL1_autogen.h
+++ b/src/libANGLE/validationGL1_autogen.h
@@ -1,12 +1,12 @@
 // GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml and wgl.xml.
+// Generated by generate_entry_points.py using data from gl.xml.
 //
 // Copyright 2020 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
 // validationGL1_autogen.h:
-//   Validation functions for the OpenGL 1.0 entry points.
+//   Validation functions for the OpenGL Desktop GL 1.x entry points.
 
 #ifndef LIBANGLE_VALIDATION_GL1_AUTOGEN_H_
 #define LIBANGLE_VALIDATION_GL1_AUTOGEN_H_
@@ -17,6 +17,7 @@
 {
 class Context;
 
+// GL 1.0
 bool ValidateAccum(const Context *context, GLenum op, GLfloat value);
 bool ValidateBegin(const Context *context, GLenum mode);
 bool ValidateBitmap(const Context *context,
@@ -364,6 +365,208 @@
 bool ValidateVertex4iv(const Context *context, const GLint *v);
 bool ValidateVertex4s(const Context *context, GLshort x, GLshort y, GLshort z, GLshort w);
 bool ValidateVertex4sv(const Context *context, const GLshort *v);
+
+// GL 1.1
+bool ValidateAreTexturesResident(const Context *context,
+                                 GLsizei n,
+                                 const GLuint *textures,
+                                 const GLboolean *residences);
+bool ValidateArrayElement(const Context *context, GLint i);
+bool ValidateCopyTexImage1D(const Context *context,
+                            GLenum target,
+                            GLint level,
+                            GLenum internalformat,
+                            GLint x,
+                            GLint y,
+                            GLsizei width,
+                            GLint border);
+bool ValidateCopyTexSubImage1D(const Context *context,
+                               GLenum target,
+                               GLint level,
+                               GLint xoffset,
+                               GLint x,
+                               GLint y,
+                               GLsizei width);
+bool ValidateEdgeFlagPointer(const Context *context, GLsizei stride, const void *pointer);
+bool ValidateIndexPointer(const Context *context, GLenum type, GLsizei stride, const void *pointer);
+bool ValidateIndexub(const Context *context, GLubyte c);
+bool ValidateIndexubv(const Context *context, const GLubyte *c);
+bool ValidateInterleavedArrays(const Context *context,
+                               GLenum format,
+                               GLsizei stride,
+                               const void *pointer);
+bool ValidatePopClientAttrib(const Context *context);
+bool ValidatePrioritizeTextures(const Context *context,
+                                GLsizei n,
+                                const GLuint *textures,
+                                const GLfloat *priorities);
+bool ValidatePushClientAttrib(const Context *context, GLbitfield mask);
+bool ValidateTexSubImage1D(const Context *context,
+                           GLenum target,
+                           GLint level,
+                           GLint xoffset,
+                           GLsizei width,
+                           GLenum format,
+                           GLenum type,
+                           const void *pixels);
+
+// GL 1.2
+
+// GL 1.3
+bool ValidateCompressedTexImage1D(const Context *context,
+                                  GLenum target,
+                                  GLint level,
+                                  GLenum internalformat,
+                                  GLsizei width,
+                                  GLint border,
+                                  GLsizei imageSize,
+                                  const void *data);
+bool ValidateCompressedTexSubImage1D(const Context *context,
+                                     GLenum target,
+                                     GLint level,
+                                     GLint xoffset,
+                                     GLsizei width,
+                                     GLenum format,
+                                     GLsizei imageSize,
+                                     const void *data);
+bool ValidateGetCompressedTexImage(const Context *context,
+                                   GLenum target,
+                                   GLint level,
+                                   const void *img);
+bool ValidateLoadTransposeMatrixd(const Context *context, const GLdouble *m);
+bool ValidateLoadTransposeMatrixf(const Context *context, const GLfloat *m);
+bool ValidateMultTransposeMatrixd(const Context *context, const GLdouble *m);
+bool ValidateMultTransposeMatrixf(const Context *context, const GLfloat *m);
+bool ValidateMultiTexCoord1d(const Context *context, GLenum target, GLdouble s);
+bool ValidateMultiTexCoord1dv(const Context *context, GLenum target, const GLdouble *v);
+bool ValidateMultiTexCoord1f(const Context *context, GLenum target, GLfloat s);
+bool ValidateMultiTexCoord1fv(const Context *context, GLenum target, const GLfloat *v);
+bool ValidateMultiTexCoord1i(const Context *context, GLenum target, GLint s);
+bool ValidateMultiTexCoord1iv(const Context *context, GLenum target, const GLint *v);
+bool ValidateMultiTexCoord1s(const Context *context, GLenum target, GLshort s);
+bool ValidateMultiTexCoord1sv(const Context *context, GLenum target, const GLshort *v);
+bool ValidateMultiTexCoord2d(const Context *context, GLenum target, GLdouble s, GLdouble t);
+bool ValidateMultiTexCoord2dv(const Context *context, GLenum target, const GLdouble *v);
+bool ValidateMultiTexCoord2f(const Context *context, GLenum target, GLfloat s, GLfloat t);
+bool ValidateMultiTexCoord2fv(const Context *context, GLenum target, const GLfloat *v);
+bool ValidateMultiTexCoord2i(const Context *context, GLenum target, GLint s, GLint t);
+bool ValidateMultiTexCoord2iv(const Context *context, GLenum target, const GLint *v);
+bool ValidateMultiTexCoord2s(const Context *context, GLenum target, GLshort s, GLshort t);
+bool ValidateMultiTexCoord2sv(const Context *context, GLenum target, const GLshort *v);
+bool ValidateMultiTexCoord3d(const Context *context,
+                             GLenum target,
+                             GLdouble s,
+                             GLdouble t,
+                             GLdouble r);
+bool ValidateMultiTexCoord3dv(const Context *context, GLenum target, const GLdouble *v);
+bool ValidateMultiTexCoord3f(const Context *context,
+                             GLenum target,
+                             GLfloat s,
+                             GLfloat t,
+                             GLfloat r);
+bool ValidateMultiTexCoord3fv(const Context *context, GLenum target, const GLfloat *v);
+bool ValidateMultiTexCoord3i(const Context *context, GLenum target, GLint s, GLint t, GLint r);
+bool ValidateMultiTexCoord3iv(const Context *context, GLenum target, const GLint *v);
+bool ValidateMultiTexCoord3s(const Context *context,
+                             GLenum target,
+                             GLshort s,
+                             GLshort t,
+                             GLshort r);
+bool ValidateMultiTexCoord3sv(const Context *context, GLenum target, const GLshort *v);
+bool ValidateMultiTexCoord4d(const Context *context,
+                             GLenum target,
+                             GLdouble s,
+                             GLdouble t,
+                             GLdouble r,
+                             GLdouble q);
+bool ValidateMultiTexCoord4dv(const Context *context, GLenum target, const GLdouble *v);
+bool ValidateMultiTexCoord4fv(const Context *context, GLenum target, const GLfloat *v);
+bool ValidateMultiTexCoord4i(const Context *context,
+                             GLenum target,
+                             GLint s,
+                             GLint t,
+                             GLint r,
+                             GLint q);
+bool ValidateMultiTexCoord4iv(const Context *context, GLenum target, const GLint *v);
+bool ValidateMultiTexCoord4s(const Context *context,
+                             GLenum target,
+                             GLshort s,
+                             GLshort t,
+                             GLshort r,
+                             GLshort q);
+bool ValidateMultiTexCoord4sv(const Context *context, GLenum target, const GLshort *v);
+
+// GL 1.4
+bool ValidateFogCoordPointer(const Context *context,
+                             GLenum type,
+                             GLsizei stride,
+                             const void *pointer);
+bool ValidateFogCoordd(const Context *context, GLdouble coord);
+bool ValidateFogCoorddv(const Context *context, const GLdouble *coord);
+bool ValidateFogCoordf(const Context *context, GLfloat coord);
+bool ValidateFogCoordfv(const Context *context, const GLfloat *coord);
+bool ValidateMultiDrawArrays(const Context *context,
+                             PrimitiveMode modePacked,
+                             const GLint *first,
+                             const GLsizei *count,
+                             GLsizei drawcount);
+bool ValidateMultiDrawElements(const Context *context,
+                               PrimitiveMode modePacked,
+                               const GLsizei *count,
+                               DrawElementsType typePacked,
+                               const void *const *indices,
+                               GLsizei drawcount);
+bool ValidatePointParameteri(const Context *context, GLenum pname, GLint param);
+bool ValidatePointParameteriv(const Context *context, GLenum pname, const GLint *params);
+bool ValidateSecondaryColor3b(const Context *context, GLbyte red, GLbyte green, GLbyte blue);
+bool ValidateSecondaryColor3bv(const Context *context, const GLbyte *v);
+bool ValidateSecondaryColor3d(const Context *context, GLdouble red, GLdouble green, GLdouble blue);
+bool ValidateSecondaryColor3dv(const Context *context, const GLdouble *v);
+bool ValidateSecondaryColor3f(const Context *context, GLfloat red, GLfloat green, GLfloat blue);
+bool ValidateSecondaryColor3fv(const Context *context, const GLfloat *v);
+bool ValidateSecondaryColor3i(const Context *context, GLint red, GLint green, GLint blue);
+bool ValidateSecondaryColor3iv(const Context *context, const GLint *v);
+bool ValidateSecondaryColor3s(const Context *context, GLshort red, GLshort green, GLshort blue);
+bool ValidateSecondaryColor3sv(const Context *context, const GLshort *v);
+bool ValidateSecondaryColor3ub(const Context *context, GLubyte red, GLubyte green, GLubyte blue);
+bool ValidateSecondaryColor3ubv(const Context *context, const GLubyte *v);
+bool ValidateSecondaryColor3ui(const Context *context, GLuint red, GLuint green, GLuint blue);
+bool ValidateSecondaryColor3uiv(const Context *context, const GLuint *v);
+bool ValidateSecondaryColor3us(const Context *context, GLushort red, GLushort green, GLushort blue);
+bool ValidateSecondaryColor3usv(const Context *context, const GLushort *v);
+bool ValidateSecondaryColorPointer(const Context *context,
+                                   GLint size,
+                                   GLenum type,
+                                   GLsizei stride,
+                                   const void *pointer);
+bool ValidateWindowPos2d(const Context *context, GLdouble x, GLdouble y);
+bool ValidateWindowPos2dv(const Context *context, const GLdouble *v);
+bool ValidateWindowPos2f(const Context *context, GLfloat x, GLfloat y);
+bool ValidateWindowPos2fv(const Context *context, const GLfloat *v);
+bool ValidateWindowPos2i(const Context *context, GLint x, GLint y);
+bool ValidateWindowPos2iv(const Context *context, const GLint *v);
+bool ValidateWindowPos2s(const Context *context, GLshort x, GLshort y);
+bool ValidateWindowPos2sv(const Context *context, const GLshort *v);
+bool ValidateWindowPos3d(const Context *context, GLdouble x, GLdouble y, GLdouble z);
+bool ValidateWindowPos3dv(const Context *context, const GLdouble *v);
+bool ValidateWindowPos3f(const Context *context, GLfloat x, GLfloat y, GLfloat z);
+bool ValidateWindowPos3fv(const Context *context, const GLfloat *v);
+bool ValidateWindowPos3i(const Context *context, GLint x, GLint y, GLint z);
+bool ValidateWindowPos3iv(const Context *context, const GLint *v);
+bool ValidateWindowPos3s(const Context *context, GLshort x, GLshort y, GLshort z);
+bool ValidateWindowPos3sv(const Context *context, const GLshort *v);
+
+// GL 1.5
+bool ValidateGetBufferSubData(const Context *context,
+                              GLenum target,
+                              GLintptr offset,
+                              GLsizeiptr size,
+                              const void *data);
+bool ValidateGetQueryObjectiv(const Context *context,
+                              QueryID idPacked,
+                              GLenum pname,
+                              const GLint *params);
+bool ValidateMapBuffer(const Context *context, BufferBinding targetPacked, GLenum access);
 }  // namespace gl
 
 #endif  // LIBANGLE_VALIDATION_GL1_AUTOGEN_H_
diff --git a/src/libANGLE/validationGL21.cpp b/src/libANGLE/validationGL21.cpp
deleted file mode 100644
index 9e5532c..0000000
--- a/src/libANGLE/validationGL21.cpp
+++ /dev/null
@@ -1,12 +0,0 @@
-//
-// Copyright 2019 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// validationGL21.cpp: Validation functions for OpenGL 2.1 entry point parameters
-
-#include "libANGLE/validationGL21_autogen.h"
-
-namespace gl
-{}  // namespace gl
diff --git a/src/libANGLE/validationGL21_autogen.h b/src/libANGLE/validationGL21_autogen.h
index dc02d51..d46d2af 100644
--- a/src/libANGLE/validationGL21_autogen.h
+++ b/src/libANGLE/validationGL21_autogen.h
@@ -1,5 +1,5 @@
 // GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml and wgl.xml.
+// Generated by generate_entry_points.py using data from gl.xml.
 //
 // Copyright 2020 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
diff --git a/src/libANGLE/validationGL2_autogen.h b/src/libANGLE/validationGL2_autogen.h
index fc793f9..24788ea 100644
--- a/src/libANGLE/validationGL2_autogen.h
+++ b/src/libANGLE/validationGL2_autogen.h
@@ -1,12 +1,12 @@
 // GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml and wgl.xml.
+// Generated by generate_entry_points.py using data from gl.xml.
 //
 // Copyright 2020 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
 // validationGL2_autogen.h:
-//   Validation functions for the OpenGL 2.0 entry points.
+//   Validation functions for the OpenGL Desktop GL 2.x entry points.
 
 #ifndef LIBANGLE_VALIDATION_GL2_AUTOGEN_H_
 #define LIBANGLE_VALIDATION_GL2_AUTOGEN_H_
@@ -17,6 +17,7 @@
 {
 class Context;
 
+// GL 2.0
 bool ValidateGetVertexAttribdv(const Context *context,
                                GLuint index,
                                GLenum pname,
@@ -68,6 +69,8 @@
 bool ValidateVertexAttrib4ubv(const Context *context, GLuint index, const GLubyte *v);
 bool ValidateVertexAttrib4uiv(const Context *context, GLuint index, const GLuint *v);
 bool ValidateVertexAttrib4usv(const Context *context, GLuint index, const GLushort *v);
+
+// GL 2.1
 }  // namespace gl
 
 #endif  // LIBANGLE_VALIDATION_GL2_AUTOGEN_H_
diff --git a/src/libANGLE/validationGL3.cpp b/src/libANGLE/validationGL3.cpp
index 295d433..d8009a5 100644
--- a/src/libANGLE/validationGL3.cpp
+++ b/src/libANGLE/validationGL3.cpp
@@ -134,4 +134,327 @@
     return true;
 }
 
+bool ValidateGetActiveUniformName(const Context *context,
+                                  ShaderProgramID program,
+                                  GLuint uniformIndex,
+                                  GLsizei bufSize,
+                                  const GLsizei *length,
+                                  const GLchar *uniformName)
+{
+    return true;
+}
+
+bool ValidatePrimitiveRestartIndex(const Context *context, GLuint index)
+{
+    return true;
+}
+
+bool ValidateMultiDrawElementsBaseVertex(const Context *context,
+                                         PrimitiveMode mode,
+                                         const GLsizei *count,
+                                         DrawElementsType type,
+                                         const void *const *indices,
+                                         GLsizei drawcount,
+                                         const GLint *basevertex)
+{
+    return true;
+}
+
+bool ValidateProvokingVertex(const Context *context, ProvokingVertexConvention modePacked)
+{
+    return true;
+}
+
+bool ValidateTexImage2DMultisample(const Context *context,
+                                   GLenum target,
+                                   GLsizei samples,
+                                   GLenum internalformat,
+                                   GLsizei width,
+                                   GLsizei height,
+                                   GLboolean fixedsamplelocations)
+{
+    return true;
+}
+
+bool ValidateTexImage3DMultisample(const Context *context,
+                                   GLenum target,
+                                   GLsizei samples,
+                                   GLenum internalformat,
+                                   GLsizei width,
+                                   GLsizei height,
+                                   GLsizei depth,
+                                   GLboolean fixedsamplelocations)
+{
+    return true;
+}
+
+bool ValidateBindFragDataLocationIndexed(const Context *context,
+                                         ShaderProgramID program,
+                                         GLuint colorNumber,
+                                         GLuint index,
+                                         const GLchar *name)
+{
+    return true;
+}
+
+bool ValidateColorP3ui(const Context *context, GLenum type, GLuint color)
+{
+    return true;
+}
+
+bool ValidateColorP3uiv(const Context *context, GLenum type, const GLuint *color)
+{
+    return true;
+}
+
+bool ValidateColorP4ui(const Context *context, GLenum type, GLuint color)
+{
+    return true;
+}
+
+bool ValidateColorP4uiv(const Context *context, GLenum type, const GLuint *color)
+{
+    return true;
+}
+
+bool ValidateGetFragDataIndex(const Context *context, ShaderProgramID program, const GLchar *name)
+{
+    return true;
+}
+
+bool ValidateGetQueryObjecti64v(const Context *context,
+                                QueryID id,
+                                GLenum pname,
+                                const GLint64 *params)
+{
+    return true;
+}
+
+bool ValidateGetQueryObjectui64v(const Context *context,
+                                 QueryID id,
+                                 GLenum pname,
+                                 const GLuint64 *params)
+{
+    return true;
+}
+
+bool ValidateMultiTexCoordP1ui(const Context *context, GLenum texture, GLenum type, GLuint coords)
+{
+    return true;
+}
+
+bool ValidateMultiTexCoordP1uiv(const Context *context,
+                                GLenum texture,
+                                GLenum type,
+                                const GLuint *coords)
+{
+    return true;
+}
+
+bool ValidateMultiTexCoordP2ui(const Context *context, GLenum texture, GLenum type, GLuint coords)
+{
+    return true;
+}
+
+bool ValidateMultiTexCoordP2uiv(const Context *context,
+                                GLenum texture,
+                                GLenum type,
+                                const GLuint *coords)
+{
+    return true;
+}
+
+bool ValidateMultiTexCoordP3ui(const Context *context, GLenum texture, GLenum type, GLuint coords)
+{
+    return true;
+}
+
+bool ValidateMultiTexCoordP3uiv(const Context *context,
+                                GLenum texture,
+                                GLenum type,
+                                const GLuint *coords)
+{
+    return true;
+}
+
+bool ValidateMultiTexCoordP4ui(const Context *context, GLenum texture, GLenum type, GLuint coords)
+{
+    return true;
+}
+
+bool ValidateMultiTexCoordP4uiv(const Context *context,
+                                GLenum texture,
+                                GLenum type,
+                                const GLuint *coords)
+{
+    return true;
+}
+
+bool ValidateNormalP3ui(const Context *context, GLenum type, GLuint coords)
+{
+    return true;
+}
+
+bool ValidateNormalP3uiv(const Context *context, GLenum type, const GLuint *coords)
+{
+    return true;
+}
+
+bool ValidateQueryCounter(const Context *context, QueryID id, QueryType targetPacked)
+{
+    return true;
+}
+
+bool ValidateSecondaryColorP3ui(const Context *context, GLenum type, GLuint color)
+{
+    return true;
+}
+
+bool ValidateSecondaryColorP3uiv(const Context *context, GLenum type, const GLuint *color)
+{
+    return true;
+}
+
+bool ValidateTexCoordP1ui(const Context *context, GLenum type, GLuint coords)
+{
+    return true;
+}
+
+bool ValidateTexCoordP1uiv(const Context *context, GLenum type, const GLuint *coords)
+{
+    return true;
+}
+
+bool ValidateTexCoordP2ui(const Context *context, GLenum type, GLuint coords)
+{
+    return true;
+}
+
+bool ValidateTexCoordP2uiv(const Context *context, GLenum type, const GLuint *coords)
+{
+    return true;
+}
+
+bool ValidateTexCoordP3ui(const Context *context, GLenum type, GLuint coords)
+{
+    return true;
+}
+
+bool ValidateTexCoordP3uiv(const Context *context, GLenum type, const GLuint *coords)
+{
+    return true;
+}
+
+bool ValidateTexCoordP4ui(const Context *context, GLenum type, GLuint coords)
+{
+    return true;
+}
+
+bool ValidateTexCoordP4uiv(const Context *context, GLenum type, const GLuint *coords)
+{
+    return true;
+}
+
+bool ValidateVertexAttribP1ui(const Context *context,
+                              GLuint index,
+                              GLenum type,
+                              GLboolean normalized,
+                              GLuint value)
+{
+    return true;
+}
+
+bool ValidateVertexAttribP1uiv(const Context *context,
+                               GLuint index,
+                               GLenum type,
+                               GLboolean normalized,
+                               const GLuint *value)
+{
+    return true;
+}
+
+bool ValidateVertexAttribP2ui(const Context *context,
+                              GLuint index,
+                              GLenum type,
+                              GLboolean normalized,
+                              GLuint value)
+{
+    return true;
+}
+
+bool ValidateVertexAttribP2uiv(const Context *context,
+                               GLuint index,
+                               GLenum type,
+                               GLboolean normalized,
+                               const GLuint *value)
+{
+    return true;
+}
+
+bool ValidateVertexAttribP3ui(const Context *context,
+                              GLuint index,
+                              GLenum type,
+                              GLboolean normalized,
+                              GLuint value)
+{
+    return true;
+}
+
+bool ValidateVertexAttribP3uiv(const Context *context,
+                               GLuint index,
+                               GLenum type,
+                               GLboolean normalized,
+                               const GLuint *value)
+{
+    return true;
+}
+
+bool ValidateVertexAttribP4ui(const Context *context,
+                              GLuint index,
+                              GLenum type,
+                              GLboolean normalized,
+                              GLuint value)
+{
+    return true;
+}
+
+bool ValidateVertexAttribP4uiv(const Context *context,
+                               GLuint index,
+                               GLenum type,
+                               GLboolean normalized,
+                               const GLuint *value)
+{
+    return true;
+}
+
+bool ValidateVertexP2ui(const Context *context, GLenum type, GLuint value)
+{
+    return true;
+}
+
+bool ValidateVertexP2uiv(const Context *context, GLenum type, const GLuint *value)
+{
+    return true;
+}
+
+bool ValidateVertexP3ui(const Context *context, GLenum type, GLuint value)
+{
+    return true;
+}
+
+bool ValidateVertexP3uiv(const Context *context, GLenum type, const GLuint *value)
+{
+    return true;
+}
+
+bool ValidateVertexP4ui(const Context *context, GLenum type, GLuint value)
+{
+    return true;
+}
+
+bool ValidateVertexP4uiv(const Context *context, GLenum type, const GLuint *value)
+{
+    return true;
+}
+
 }  // namespace gl
diff --git a/src/libANGLE/validationGL31.cpp b/src/libANGLE/validationGL31.cpp
deleted file mode 100644
index fc95a99..0000000
--- a/src/libANGLE/validationGL31.cpp
+++ /dev/null
@@ -1,29 +0,0 @@
-//
-// Copyright 2019 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// validationGL31.cpp: Validation functions for OpenGL 3.1 entry point parameters
-
-#include "libANGLE/validationGL31_autogen.h"
-
-namespace gl
-{
-
-bool ValidateGetActiveUniformName(const Context *context,
-                                  ShaderProgramID program,
-                                  GLuint uniformIndex,
-                                  GLsizei bufSize,
-                                  const GLsizei *length,
-                                  const GLchar *uniformName)
-{
-    return true;
-}
-
-bool ValidatePrimitiveRestartIndex(const Context *context, GLuint index)
-{
-    return true;
-}
-
-}  // namespace gl
diff --git a/src/libANGLE/validationGL31_autogen.h b/src/libANGLE/validationGL31_autogen.h
index a3250b1..74f4006 100644
--- a/src/libANGLE/validationGL31_autogen.h
+++ b/src/libANGLE/validationGL31_autogen.h
@@ -1,5 +1,5 @@
 // GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml and wgl.xml.
+// Generated by generate_entry_points.py using data from gl.xml.
 //
 // Copyright 2020 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
diff --git a/src/libANGLE/validationGL32.cpp b/src/libANGLE/validationGL32.cpp
deleted file mode 100644
index 458e20a..0000000
--- a/src/libANGLE/validationGL32.cpp
+++ /dev/null
@@ -1,53 +0,0 @@
-//
-// Copyright 2019 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// validationGL32.cpp: Validation functions for OpenGL 3.2 entry point parameters
-
-#include "libANGLE/validationGL32_autogen.h"
-
-namespace gl
-{
-
-bool ValidateMultiDrawElementsBaseVertex(const Context *context,
-                                         PrimitiveMode mode,
-                                         const GLsizei *count,
-                                         DrawElementsType type,
-                                         const void *const *indices,
-                                         GLsizei drawcount,
-                                         const GLint *basevertex)
-{
-    return true;
-}
-
-bool ValidateProvokingVertex(const Context *context, ProvokingVertexConvention modePacked)
-{
-    return true;
-}
-
-bool ValidateTexImage2DMultisample(const Context *context,
-                                   GLenum target,
-                                   GLsizei samples,
-                                   GLenum internalformat,
-                                   GLsizei width,
-                                   GLsizei height,
-                                   GLboolean fixedsamplelocations)
-{
-    return true;
-}
-
-bool ValidateTexImage3DMultisample(const Context *context,
-                                   GLenum target,
-                                   GLsizei samples,
-                                   GLenum internalformat,
-                                   GLsizei width,
-                                   GLsizei height,
-                                   GLsizei depth,
-                                   GLboolean fixedsamplelocations)
-{
-    return true;
-}
-
-}  // namespace gl
diff --git a/src/libANGLE/validationGL32_autogen.h b/src/libANGLE/validationGL32_autogen.h
index 761b1ee..4519f61 100644
--- a/src/libANGLE/validationGL32_autogen.h
+++ b/src/libANGLE/validationGL32_autogen.h
@@ -1,5 +1,5 @@
 // GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml and wgl.xml.
+// Generated by generate_entry_points.py using data from gl.xml.
 //
 // Copyright 2020 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
diff --git a/src/libANGLE/validationGL33.cpp b/src/libANGLE/validationGL33.cpp
deleted file mode 100644
index 48f56e0..0000000
--- a/src/libANGLE/validationGL33.cpp
+++ /dev/null
@@ -1,283 +0,0 @@
-//
-// Copyright 2019 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// validationGL33.cpp: Validation functions for OpenGL 3.3 entry point parameters
-
-#include "libANGLE/validationGL33_autogen.h"
-
-namespace gl
-{
-
-bool ValidateBindFragDataLocationIndexed(const Context *context,
-                                         ShaderProgramID program,
-                                         GLuint colorNumber,
-                                         GLuint index,
-                                         const GLchar *name)
-{
-    return true;
-}
-
-bool ValidateColorP3ui(const Context *context, GLenum type, GLuint color)
-{
-    return true;
-}
-
-bool ValidateColorP3uiv(const Context *context, GLenum type, const GLuint *color)
-{
-    return true;
-}
-
-bool ValidateColorP4ui(const Context *context, GLenum type, GLuint color)
-{
-    return true;
-}
-
-bool ValidateColorP4uiv(const Context *context, GLenum type, const GLuint *color)
-{
-    return true;
-}
-
-bool ValidateGetFragDataIndex(const Context *context, ShaderProgramID program, const GLchar *name)
-{
-    return true;
-}
-
-bool ValidateGetQueryObjecti64v(const Context *context,
-                                QueryID id,
-                                GLenum pname,
-                                const GLint64 *params)
-{
-    return true;
-}
-
-bool ValidateGetQueryObjectui64v(const Context *context,
-                                 QueryID id,
-                                 GLenum pname,
-                                 const GLuint64 *params)
-{
-    return true;
-}
-
-bool ValidateMultiTexCoordP1ui(const Context *context, GLenum texture, GLenum type, GLuint coords)
-{
-    return true;
-}
-
-bool ValidateMultiTexCoordP1uiv(const Context *context,
-                                GLenum texture,
-                                GLenum type,
-                                const GLuint *coords)
-{
-    return true;
-}
-
-bool ValidateMultiTexCoordP2ui(const Context *context, GLenum texture, GLenum type, GLuint coords)
-{
-    return true;
-}
-
-bool ValidateMultiTexCoordP2uiv(const Context *context,
-                                GLenum texture,
-                                GLenum type,
-                                const GLuint *coords)
-{
-    return true;
-}
-
-bool ValidateMultiTexCoordP3ui(const Context *context, GLenum texture, GLenum type, GLuint coords)
-{
-    return true;
-}
-
-bool ValidateMultiTexCoordP3uiv(const Context *context,
-                                GLenum texture,
-                                GLenum type,
-                                const GLuint *coords)
-{
-    return true;
-}
-
-bool ValidateMultiTexCoordP4ui(const Context *context, GLenum texture, GLenum type, GLuint coords)
-{
-    return true;
-}
-
-bool ValidateMultiTexCoordP4uiv(const Context *context,
-                                GLenum texture,
-                                GLenum type,
-                                const GLuint *coords)
-{
-    return true;
-}
-
-bool ValidateNormalP3ui(const Context *context, GLenum type, GLuint coords)
-{
-    return true;
-}
-
-bool ValidateNormalP3uiv(const Context *context, GLenum type, const GLuint *coords)
-{
-    return true;
-}
-
-bool ValidateQueryCounter(const Context *context, QueryID id, QueryType targetPacked)
-{
-    return true;
-}
-
-bool ValidateSecondaryColorP3ui(const Context *context, GLenum type, GLuint color)
-{
-    return true;
-}
-
-bool ValidateSecondaryColorP3uiv(const Context *context, GLenum type, const GLuint *color)
-{
-    return true;
-}
-
-bool ValidateTexCoordP1ui(const Context *context, GLenum type, GLuint coords)
-{
-    return true;
-}
-
-bool ValidateTexCoordP1uiv(const Context *context, GLenum type, const GLuint *coords)
-{
-    return true;
-}
-
-bool ValidateTexCoordP2ui(const Context *context, GLenum type, GLuint coords)
-{
-    return true;
-}
-
-bool ValidateTexCoordP2uiv(const Context *context, GLenum type, const GLuint *coords)
-{
-    return true;
-}
-
-bool ValidateTexCoordP3ui(const Context *context, GLenum type, GLuint coords)
-{
-    return true;
-}
-
-bool ValidateTexCoordP3uiv(const Context *context, GLenum type, const GLuint *coords)
-{
-    return true;
-}
-
-bool ValidateTexCoordP4ui(const Context *context, GLenum type, GLuint coords)
-{
-    return true;
-}
-
-bool ValidateTexCoordP4uiv(const Context *context, GLenum type, const GLuint *coords)
-{
-    return true;
-}
-
-bool ValidateVertexAttribP1ui(const Context *context,
-                              GLuint index,
-                              GLenum type,
-                              GLboolean normalized,
-                              GLuint value)
-{
-    return true;
-}
-
-bool ValidateVertexAttribP1uiv(const Context *context,
-                               GLuint index,
-                               GLenum type,
-                               GLboolean normalized,
-                               const GLuint *value)
-{
-    return true;
-}
-
-bool ValidateVertexAttribP2ui(const Context *context,
-                              GLuint index,
-                              GLenum type,
-                              GLboolean normalized,
-                              GLuint value)
-{
-    return true;
-}
-
-bool ValidateVertexAttribP2uiv(const Context *context,
-                               GLuint index,
-                               GLenum type,
-                               GLboolean normalized,
-                               const GLuint *value)
-{
-    return true;
-}
-
-bool ValidateVertexAttribP3ui(const Context *context,
-                              GLuint index,
-                              GLenum type,
-                              GLboolean normalized,
-                              GLuint value)
-{
-    return true;
-}
-
-bool ValidateVertexAttribP3uiv(const Context *context,
-                               GLuint index,
-                               GLenum type,
-                               GLboolean normalized,
-                               const GLuint *value)
-{
-    return true;
-}
-
-bool ValidateVertexAttribP4ui(const Context *context,
-                              GLuint index,
-                              GLenum type,
-                              GLboolean normalized,
-                              GLuint value)
-{
-    return true;
-}
-
-bool ValidateVertexAttribP4uiv(const Context *context,
-                               GLuint index,
-                               GLenum type,
-                               GLboolean normalized,
-                               const GLuint *value)
-{
-    return true;
-}
-
-bool ValidateVertexP2ui(const Context *context, GLenum type, GLuint value)
-{
-    return true;
-}
-
-bool ValidateVertexP2uiv(const Context *context, GLenum type, const GLuint *value)
-{
-    return true;
-}
-
-bool ValidateVertexP3ui(const Context *context, GLenum type, GLuint value)
-{
-    return true;
-}
-
-bool ValidateVertexP3uiv(const Context *context, GLenum type, const GLuint *value)
-{
-    return true;
-}
-
-bool ValidateVertexP4ui(const Context *context, GLenum type, GLuint value)
-{
-    return true;
-}
-
-bool ValidateVertexP4uiv(const Context *context, GLenum type, const GLuint *value)
-{
-    return true;
-}
-
-}  // namespace gl
diff --git a/src/libANGLE/validationGL33_autogen.h b/src/libANGLE/validationGL33_autogen.h
index 457e4f3..c2a839f 100644
--- a/src/libANGLE/validationGL33_autogen.h
+++ b/src/libANGLE/validationGL33_autogen.h
@@ -1,5 +1,5 @@
 // GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml and wgl.xml.
+// Generated by generate_entry_points.py using data from gl.xml.
 //
 // Copyright 2020 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
diff --git a/src/libANGLE/validationGL3_autogen.h b/src/libANGLE/validationGL3_autogen.h
index 8e7cee3..de383b6 100644
--- a/src/libANGLE/validationGL3_autogen.h
+++ b/src/libANGLE/validationGL3_autogen.h
@@ -1,12 +1,12 @@
 // GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml and wgl.xml.
+// Generated by generate_entry_points.py using data from gl.xml.
 //
 // Copyright 2020 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
 // validationGL3_autogen.h:
-//   Validation functions for the OpenGL 3.0 entry points.
+//   Validation functions for the OpenGL Desktop GL 3.x entry points.
 
 #ifndef LIBANGLE_VALIDATION_GL3_AUTOGEN_H_
 #define LIBANGLE_VALIDATION_GL3_AUTOGEN_H_
@@ -17,6 +17,7 @@
 {
 class Context;
 
+// GL 3.0
 bool ValidateBeginConditionalRender(const Context *context, GLuint id, GLenum mode);
 bool ValidateBindFragDataLocation(const Context *context,
                                   ShaderProgramID programPacked,
@@ -53,6 +54,141 @@
 bool ValidateVertexAttribI4sv(const Context *context, GLuint index, const GLshort *v);
 bool ValidateVertexAttribI4ubv(const Context *context, GLuint index, const GLubyte *v);
 bool ValidateVertexAttribI4usv(const Context *context, GLuint index, const GLushort *v);
+
+// GL 3.1
+bool ValidateGetActiveUniformName(const Context *context,
+                                  ShaderProgramID programPacked,
+                                  GLuint uniformIndex,
+                                  GLsizei bufSize,
+                                  const GLsizei *length,
+                                  const GLchar *uniformName);
+bool ValidatePrimitiveRestartIndex(const Context *context, GLuint index);
+
+// GL 3.2
+bool ValidateMultiDrawElementsBaseVertex(const Context *context,
+                                         PrimitiveMode modePacked,
+                                         const GLsizei *count,
+                                         DrawElementsType typePacked,
+                                         const void *const *indices,
+                                         GLsizei drawcount,
+                                         const GLint *basevertex);
+bool ValidateProvokingVertex(const Context *context, ProvokingVertexConvention modePacked);
+bool ValidateTexImage2DMultisample(const Context *context,
+                                   GLenum target,
+                                   GLsizei samples,
+                                   GLenum internalformat,
+                                   GLsizei width,
+                                   GLsizei height,
+                                   GLboolean fixedsamplelocations);
+bool ValidateTexImage3DMultisample(const Context *context,
+                                   GLenum target,
+                                   GLsizei samples,
+                                   GLenum internalformat,
+                                   GLsizei width,
+                                   GLsizei height,
+                                   GLsizei depth,
+                                   GLboolean fixedsamplelocations);
+
+// GL 3.3
+bool ValidateBindFragDataLocationIndexed(const Context *context,
+                                         ShaderProgramID programPacked,
+                                         GLuint colorNumber,
+                                         GLuint index,
+                                         const GLchar *name);
+bool ValidateColorP3ui(const Context *context, GLenum type, GLuint color);
+bool ValidateColorP3uiv(const Context *context, GLenum type, const GLuint *color);
+bool ValidateColorP4ui(const Context *context, GLenum type, GLuint color);
+bool ValidateColorP4uiv(const Context *context, GLenum type, const GLuint *color);
+bool ValidateGetFragDataIndex(const Context *context,
+                              ShaderProgramID programPacked,
+                              const GLchar *name);
+bool ValidateGetQueryObjecti64v(const Context *context,
+                                QueryID idPacked,
+                                GLenum pname,
+                                const GLint64 *params);
+bool ValidateGetQueryObjectui64v(const Context *context,
+                                 QueryID idPacked,
+                                 GLenum pname,
+                                 const GLuint64 *params);
+bool ValidateMultiTexCoordP1ui(const Context *context, GLenum texture, GLenum type, GLuint coords);
+bool ValidateMultiTexCoordP1uiv(const Context *context,
+                                GLenum texture,
+                                GLenum type,
+                                const GLuint *coords);
+bool ValidateMultiTexCoordP2ui(const Context *context, GLenum texture, GLenum type, GLuint coords);
+bool ValidateMultiTexCoordP2uiv(const Context *context,
+                                GLenum texture,
+                                GLenum type,
+                                const GLuint *coords);
+bool ValidateMultiTexCoordP3ui(const Context *context, GLenum texture, GLenum type, GLuint coords);
+bool ValidateMultiTexCoordP3uiv(const Context *context,
+                                GLenum texture,
+                                GLenum type,
+                                const GLuint *coords);
+bool ValidateMultiTexCoordP4ui(const Context *context, GLenum texture, GLenum type, GLuint coords);
+bool ValidateMultiTexCoordP4uiv(const Context *context,
+                                GLenum texture,
+                                GLenum type,
+                                const GLuint *coords);
+bool ValidateNormalP3ui(const Context *context, GLenum type, GLuint coords);
+bool ValidateNormalP3uiv(const Context *context, GLenum type, const GLuint *coords);
+bool ValidateQueryCounter(const Context *context, QueryID idPacked, QueryType targetPacked);
+bool ValidateSecondaryColorP3ui(const Context *context, GLenum type, GLuint color);
+bool ValidateSecondaryColorP3uiv(const Context *context, GLenum type, const GLuint *color);
+bool ValidateTexCoordP1ui(const Context *context, GLenum type, GLuint coords);
+bool ValidateTexCoordP1uiv(const Context *context, GLenum type, const GLuint *coords);
+bool ValidateTexCoordP2ui(const Context *context, GLenum type, GLuint coords);
+bool ValidateTexCoordP2uiv(const Context *context, GLenum type, const GLuint *coords);
+bool ValidateTexCoordP3ui(const Context *context, GLenum type, GLuint coords);
+bool ValidateTexCoordP3uiv(const Context *context, GLenum type, const GLuint *coords);
+bool ValidateTexCoordP4ui(const Context *context, GLenum type, GLuint coords);
+bool ValidateTexCoordP4uiv(const Context *context, GLenum type, const GLuint *coords);
+bool ValidateVertexAttribP1ui(const Context *context,
+                              GLuint index,
+                              GLenum type,
+                              GLboolean normalized,
+                              GLuint value);
+bool ValidateVertexAttribP1uiv(const Context *context,
+                               GLuint index,
+                               GLenum type,
+                               GLboolean normalized,
+                               const GLuint *value);
+bool ValidateVertexAttribP2ui(const Context *context,
+                              GLuint index,
+                              GLenum type,
+                              GLboolean normalized,
+                              GLuint value);
+bool ValidateVertexAttribP2uiv(const Context *context,
+                               GLuint index,
+                               GLenum type,
+                               GLboolean normalized,
+                               const GLuint *value);
+bool ValidateVertexAttribP3ui(const Context *context,
+                              GLuint index,
+                              GLenum type,
+                              GLboolean normalized,
+                              GLuint value);
+bool ValidateVertexAttribP3uiv(const Context *context,
+                               GLuint index,
+                               GLenum type,
+                               GLboolean normalized,
+                               const GLuint *value);
+bool ValidateVertexAttribP4ui(const Context *context,
+                              GLuint index,
+                              GLenum type,
+                              GLboolean normalized,
+                              GLuint value);
+bool ValidateVertexAttribP4uiv(const Context *context,
+                               GLuint index,
+                               GLenum type,
+                               GLboolean normalized,
+                               const GLuint *value);
+bool ValidateVertexP2ui(const Context *context, GLenum type, GLuint value);
+bool ValidateVertexP2uiv(const Context *context, GLenum type, const GLuint *value);
+bool ValidateVertexP3ui(const Context *context, GLenum type, GLuint value);
+bool ValidateVertexP3uiv(const Context *context, GLenum type, const GLuint *value);
+bool ValidateVertexP4ui(const Context *context, GLenum type, GLuint value);
+bool ValidateVertexP4uiv(const Context *context, GLenum type, const GLuint *value);
 }  // namespace gl
 
 #endif  // LIBANGLE_VALIDATION_GL3_AUTOGEN_H_
diff --git a/src/libANGLE/validationGL4.cpp b/src/libANGLE/validationGL4.cpp
index bcfb606..f46df2b 100644
--- a/src/libANGLE/validationGL4.cpp
+++ b/src/libANGLE/validationGL4.cpp
@@ -271,4 +271,1655 @@
     return true;
 }
 
+bool ValidateDepthRangeArrayv(const Context *context,
+                              GLuint first,
+                              GLsizei count,
+                              const GLdouble *v)
+{
+    return true;
+}
+
+bool ValidateDepthRangeIndexed(const Context *context, GLuint index, GLdouble n, GLdouble f)
+{
+    return true;
+}
+
+bool ValidateGetDoublei_v(const Context *context, GLenum target, GLuint index, const GLdouble *data)
+{
+    return true;
+}
+
+bool ValidateGetFloati_v(const Context *context, GLenum target, GLuint index, const GLfloat *data)
+{
+    return true;
+}
+
+bool ValidateGetVertexAttribLdv(const Context *context,
+                                GLuint index,
+                                GLenum pname,
+                                const GLdouble *params)
+{
+    return true;
+}
+
+bool ValidateProgramUniform1d(const Context *context,
+                              ShaderProgramID program,
+                              UniformLocation location,
+                              GLdouble v0)
+{
+    return true;
+}
+
+bool ValidateProgramUniform1dv(const Context *context,
+                               ShaderProgramID program,
+                               UniformLocation location,
+                               GLsizei count,
+                               const GLdouble *value)
+{
+    return true;
+}
+
+bool ValidateProgramUniform2d(const Context *context,
+                              ShaderProgramID program,
+                              UniformLocation location,
+                              GLdouble v0,
+                              GLdouble v1)
+{
+    return true;
+}
+
+bool ValidateProgramUniform2dv(const Context *context,
+                               ShaderProgramID program,
+                               UniformLocation location,
+                               GLsizei count,
+                               const GLdouble *value)
+{
+    return true;
+}
+
+bool ValidateProgramUniform3d(const Context *context,
+                              ShaderProgramID program,
+                              UniformLocation location,
+                              GLdouble v0,
+                              GLdouble v1,
+                              GLdouble v2)
+{
+    return true;
+}
+
+bool ValidateProgramUniform3dv(const Context *context,
+                               ShaderProgramID program,
+                               UniformLocation location,
+                               GLsizei count,
+                               const GLdouble *value)
+{
+    return true;
+}
+
+bool ValidateProgramUniform4d(const Context *context,
+                              ShaderProgramID program,
+                              UniformLocation location,
+                              GLdouble v0,
+                              GLdouble v1,
+                              GLdouble v2,
+                              GLdouble v3)
+{
+    return true;
+}
+
+bool ValidateProgramUniform4dv(const Context *context,
+                               ShaderProgramID program,
+                               UniformLocation location,
+                               GLsizei count,
+                               const GLdouble *value)
+{
+    return true;
+}
+
+bool ValidateProgramUniformMatrix2dv(const Context *context,
+                                     ShaderProgramID program,
+                                     UniformLocation location,
+                                     GLsizei count,
+                                     GLboolean transpose,
+                                     const GLdouble *value)
+{
+    return true;
+}
+
+bool ValidateProgramUniformMatrix2x3dv(const Context *context,
+                                       ShaderProgramID program,
+                                       UniformLocation location,
+                                       GLsizei count,
+                                       GLboolean transpose,
+                                       const GLdouble *value)
+{
+    return true;
+}
+
+bool ValidateProgramUniformMatrix2x4dv(const Context *context,
+                                       ShaderProgramID program,
+                                       UniformLocation location,
+                                       GLsizei count,
+                                       GLboolean transpose,
+                                       const GLdouble *value)
+{
+    return true;
+}
+
+bool ValidateProgramUniformMatrix3dv(const Context *context,
+                                     ShaderProgramID program,
+                                     UniformLocation location,
+                                     GLsizei count,
+                                     GLboolean transpose,
+                                     const GLdouble *value)
+{
+    return true;
+}
+
+bool ValidateProgramUniformMatrix3x2dv(const Context *context,
+                                       ShaderProgramID program,
+                                       UniformLocation location,
+                                       GLsizei count,
+                                       GLboolean transpose,
+                                       const GLdouble *value)
+{
+    return true;
+}
+
+bool ValidateProgramUniformMatrix3x4dv(const Context *context,
+                                       ShaderProgramID program,
+                                       UniformLocation location,
+                                       GLsizei count,
+                                       GLboolean transpose,
+                                       const GLdouble *value)
+{
+    return true;
+}
+
+bool ValidateProgramUniformMatrix4dv(const Context *context,
+                                     ShaderProgramID program,
+                                     UniformLocation location,
+                                     GLsizei count,
+                                     GLboolean transpose,
+                                     const GLdouble *value)
+{
+    return true;
+}
+
+bool ValidateProgramUniformMatrix4x2dv(const Context *context,
+                                       ShaderProgramID program,
+                                       UniformLocation location,
+                                       GLsizei count,
+                                       GLboolean transpose,
+                                       const GLdouble *value)
+{
+    return true;
+}
+
+bool ValidateProgramUniformMatrix4x3dv(const Context *context,
+                                       ShaderProgramID program,
+                                       UniformLocation location,
+                                       GLsizei count,
+                                       GLboolean transpose,
+                                       const GLdouble *value)
+{
+    return true;
+}
+
+bool ValidateScissorArrayv(const Context *context, GLuint first, GLsizei count, const GLint *v)
+{
+    return true;
+}
+
+bool ValidateScissorIndexed(const Context *context,
+                            GLuint index,
+                            GLint left,
+                            GLint bottom,
+                            GLsizei width,
+                            GLsizei height)
+{
+    return true;
+}
+
+bool ValidateScissorIndexedv(const Context *context, GLuint index, const GLint *v)
+{
+    return true;
+}
+
+bool ValidateVertexAttribL1d(const Context *context, GLuint index, GLdouble x)
+{
+    return true;
+}
+
+bool ValidateVertexAttribL1dv(const Context *context, GLuint index, const GLdouble *v)
+{
+    return true;
+}
+
+bool ValidateVertexAttribL2d(const Context *context, GLuint index, GLdouble x, GLdouble y)
+{
+    return true;
+}
+
+bool ValidateVertexAttribL2dv(const Context *context, GLuint index, const GLdouble *v)
+{
+    return true;
+}
+
+bool ValidateVertexAttribL3d(const Context *context,
+                             GLuint index,
+                             GLdouble x,
+                             GLdouble y,
+                             GLdouble z)
+{
+    return true;
+}
+
+bool ValidateVertexAttribL3dv(const Context *context, GLuint index, const GLdouble *v)
+{
+    return true;
+}
+
+bool ValidateVertexAttribL4d(const Context *context,
+                             GLuint index,
+                             GLdouble x,
+                             GLdouble y,
+                             GLdouble z,
+                             GLdouble w)
+{
+    return true;
+}
+
+bool ValidateVertexAttribL4dv(const Context *context, GLuint index, const GLdouble *v)
+{
+    return true;
+}
+
+bool ValidateVertexAttribLPointer(const Context *context,
+                                  GLuint index,
+                                  GLint size,
+                                  GLenum type,
+                                  GLsizei stride,
+                                  const void *pointer)
+{
+    return true;
+}
+
+bool ValidateViewportArrayv(const Context *context, GLuint first, GLsizei count, const GLfloat *v)
+{
+    return true;
+}
+
+bool ValidateViewportIndexedf(const Context *context,
+                              GLuint index,
+                              GLfloat x,
+                              GLfloat y,
+                              GLfloat w,
+                              GLfloat h)
+{
+    return true;
+}
+
+bool ValidateViewportIndexedfv(const Context *context, GLuint index, const GLfloat *v)
+{
+    return true;
+}
+
+bool ValidateDrawArraysInstancedBaseInstance(const Context *context,
+                                             PrimitiveMode mode,
+                                             GLint first,
+                                             GLsizei count,
+                                             GLsizei instancecount,
+                                             GLuint baseinstance)
+{
+    return true;
+}
+
+bool ValidateDrawElementsInstancedBaseInstance(const Context *context,
+                                               GLenum mode,
+                                               GLsizei count,
+                                               GLenum type,
+                                               const void *indices,
+                                               GLsizei instancecount,
+                                               GLuint baseinstance)
+{
+    return true;
+}
+
+bool ValidateDrawElementsInstancedBaseVertexBaseInstance(const Context *context,
+                                                         PrimitiveMode mode,
+                                                         GLsizei count,
+                                                         DrawElementsType type,
+                                                         const void *indices,
+                                                         GLsizei instancecount,
+                                                         GLint basevertex,
+                                                         GLuint baseinstance)
+{
+    return true;
+}
+
+bool ValidateDrawTransformFeedbackInstanced(const Context *context,
+                                            GLenum mode,
+                                            TransformFeedbackID id,
+                                            GLsizei instancecount)
+{
+    return true;
+}
+
+bool ValidateDrawTransformFeedbackStreamInstanced(const Context *context,
+                                                  GLenum mode,
+                                                  TransformFeedbackID id,
+                                                  GLuint stream,
+                                                  GLsizei instancecount)
+{
+    return true;
+}
+
+bool ValidateGetActiveAtomicCounterBufferiv(const Context *context,
+                                            ShaderProgramID program,
+                                            GLuint bufferIndex,
+                                            GLenum pname,
+                                            const GLint *params)
+{
+    return true;
+}
+
+bool ValidateTexStorage1D(const Context *context,
+                          GLenum target,
+                          GLsizei levels,
+                          GLenum internalformat,
+                          GLsizei width)
+{
+    return true;
+}
+
+bool ValidateClearBufferData(const Context *context,
+                             GLenum target,
+                             GLenum internalformat,
+                             GLenum format,
+                             GLenum type,
+                             const void *data)
+{
+    return true;
+}
+
+bool ValidateClearBufferSubData(const Context *context,
+                                GLenum target,
+                                GLenum internalformat,
+                                GLintptr offset,
+                                GLsizeiptr size,
+                                GLenum format,
+                                GLenum type,
+                                const void *data)
+{
+    return true;
+}
+
+bool ValidateGetInternalformati64v(const Context *context,
+                                   GLenum target,
+                                   GLenum internalformat,
+                                   GLenum pname,
+                                   GLsizei bufSize,
+                                   const GLint64 *params)
+{
+    return true;
+}
+
+bool ValidateGetProgramResourceLocationIndex(const Context *context,
+                                             ShaderProgramID program,
+                                             GLenum programInterface,
+                                             const GLchar *name)
+{
+    return true;
+}
+
+bool ValidateInvalidateBufferData(const Context *context, BufferID buffer)
+{
+    return true;
+}
+
+bool ValidateInvalidateBufferSubData(const Context *context,
+                                     BufferID buffer,
+                                     GLintptr offset,
+                                     GLsizeiptr length)
+{
+    return true;
+}
+
+bool ValidateInvalidateTexImage(const Context *context, TextureID texture, GLint level)
+{
+    return true;
+}
+
+bool ValidateInvalidateTexSubImage(const Context *context,
+                                   TextureID texture,
+                                   GLint level,
+                                   GLint xoffset,
+                                   GLint yoffset,
+                                   GLint zoffset,
+                                   GLsizei width,
+                                   GLsizei height,
+                                   GLsizei depth)
+{
+    return true;
+}
+
+bool ValidateMultiDrawArraysIndirect(const Context *context,
+                                     GLenum mode,
+                                     const void *indirect,
+                                     GLsizei drawcount,
+                                     GLsizei stride)
+{
+    return true;
+}
+
+bool ValidateMultiDrawElementsIndirect(const Context *context,
+                                       GLenum mode,
+                                       GLenum type,
+                                       const void *indirect,
+                                       GLsizei drawcount,
+                                       GLsizei stride)
+{
+    return true;
+}
+
+bool ValidateShaderStorageBlockBinding(const Context *context,
+                                       ShaderProgramID program,
+                                       GLuint storageBlockIndex,
+                                       GLuint storageBlockBinding)
+{
+    return true;
+}
+
+bool ValidateTextureView(const Context *context,
+                         TextureID texture,
+                         GLenum target,
+                         GLuint origtexture,
+                         GLenum internalformat,
+                         GLuint minlevel,
+                         GLuint numlevels,
+                         GLuint minlayer,
+                         GLuint numlayers)
+{
+    return true;
+}
+
+bool ValidateVertexAttribLFormat(const Context *context,
+                                 GLuint attribindex,
+                                 GLint size,
+                                 GLenum type,
+                                 GLuint relativeoffset)
+{
+    return true;
+}
+
+bool ValidateBindBuffersBase(const Context *context,
+                             GLenum target,
+                             GLuint first,
+                             GLsizei count,
+                             const BufferID *buffers)
+{
+    return true;
+}
+
+bool ValidateBindBuffersRange(const Context *context,
+                              GLenum target,
+                              GLuint first,
+                              GLsizei count,
+                              const BufferID *buffers,
+                              const GLintptr *offsets,
+                              const GLsizeiptr *sizes)
+{
+    return true;
+}
+
+bool ValidateBindImageTextures(const Context *context,
+                               GLuint first,
+                               GLsizei count,
+                               const GLuint *textures)
+{
+    return true;
+}
+
+bool ValidateBindSamplers(const Context *context,
+                          GLuint first,
+                          GLsizei count,
+                          const GLuint *samplers)
+{
+    return true;
+}
+
+bool ValidateBindTextures(const Context *context,
+                          GLuint first,
+                          GLsizei count,
+                          const GLuint *textures)
+{
+    return true;
+}
+
+bool ValidateBindVertexBuffers(const Context *context,
+                               GLuint first,
+                               GLsizei count,
+                               const BufferID *buffers,
+                               const GLintptr *offsets,
+                               const GLsizei *strides)
+{
+    return true;
+}
+
+bool ValidateBufferStorage(const Context *context,
+                           BufferBinding targetPacked,
+                           GLsizeiptr size,
+                           const void *data,
+                           GLbitfield flags)
+{
+    return true;
+}
+
+bool ValidateClearTexImage(const Context *context,
+                           TextureID texture,
+                           GLint level,
+                           GLenum format,
+                           GLenum type,
+                           const void *data)
+{
+    return true;
+}
+
+bool ValidateClearTexSubImage(const Context *context,
+                              TextureID texture,
+                              GLint level,
+                              GLint xoffset,
+                              GLint yoffset,
+                              GLint zoffset,
+                              GLsizei width,
+                              GLsizei height,
+                              GLsizei depth,
+                              GLenum format,
+                              GLenum type,
+                              const void *data)
+{
+    return true;
+}
+
+bool ValidateBindTextureUnit(const Context *context, GLuint unit, TextureID texture)
+{
+    return true;
+}
+
+bool ValidateBlitNamedFramebuffer(const Context *context,
+                                  GLuint readFramebuffer,
+                                  GLuint drawFramebuffer,
+                                  GLint srcX0,
+                                  GLint srcY0,
+                                  GLint srcX1,
+                                  GLint srcY1,
+                                  GLint dstX0,
+                                  GLint dstY0,
+                                  GLint dstX1,
+                                  GLint dstY1,
+                                  GLbitfield mask,
+                                  GLenum filter)
+{
+    return true;
+}
+
+bool ValidateCheckNamedFramebufferStatus(const Context *context,
+                                         FramebufferID framebuffer,
+                                         GLenum target)
+{
+    return true;
+}
+
+bool ValidateClearNamedBufferData(const Context *context,
+                                  BufferID buffer,
+                                  GLenum internalformat,
+                                  GLenum format,
+                                  GLenum type,
+                                  const void *data)
+{
+    return true;
+}
+
+bool ValidateClearNamedBufferSubData(const Context *context,
+                                     BufferID buffer,
+                                     GLenum internalformat,
+                                     GLintptr offset,
+                                     GLsizeiptr size,
+                                     GLenum format,
+                                     GLenum type,
+                                     const void *data)
+{
+    return true;
+}
+
+bool ValidateClearNamedFramebufferfi(const Context *context,
+                                     FramebufferID framebuffer,
+                                     GLenum buffer,
+                                     GLint drawbuffer,
+                                     GLfloat depth,
+                                     GLint stencil)
+{
+    return true;
+}
+
+bool ValidateClearNamedFramebufferfv(const Context *context,
+                                     FramebufferID framebuffer,
+                                     GLenum buffer,
+                                     GLint drawbuffer,
+                                     const GLfloat *value)
+{
+    return true;
+}
+
+bool ValidateClearNamedFramebufferiv(const Context *context,
+                                     FramebufferID framebuffer,
+                                     GLenum buffer,
+                                     GLint drawbuffer,
+                                     const GLint *value)
+{
+    return true;
+}
+
+bool ValidateClearNamedFramebufferuiv(const Context *context,
+                                      FramebufferID framebuffer,
+                                      GLenum buffer,
+                                      GLint drawbuffer,
+                                      const GLuint *value)
+{
+    return true;
+}
+
+bool ValidateClipControl(const Context *context, GLenum origin, GLenum depth)
+{
+    return true;
+}
+
+bool ValidateCompressedTextureSubImage1D(const Context *context,
+                                         TextureID texture,
+                                         GLint level,
+                                         GLint xoffset,
+                                         GLsizei width,
+                                         GLenum format,
+                                         GLsizei imageSize,
+                                         const void *data)
+{
+    return true;
+}
+
+bool ValidateCompressedTextureSubImage2D(const Context *context,
+                                         TextureID texture,
+                                         GLint level,
+                                         GLint xoffset,
+                                         GLint yoffset,
+                                         GLsizei width,
+                                         GLsizei height,
+                                         GLenum format,
+                                         GLsizei imageSize,
+                                         const void *data)
+{
+    return true;
+}
+
+bool ValidateCompressedTextureSubImage3D(const Context *context,
+                                         TextureID texture,
+                                         GLint level,
+                                         GLint xoffset,
+                                         GLint yoffset,
+                                         GLint zoffset,
+                                         GLsizei width,
+                                         GLsizei height,
+                                         GLsizei depth,
+                                         GLenum format,
+                                         GLsizei imageSize,
+                                         const void *data)
+{
+    return true;
+}
+
+bool ValidateCopyNamedBufferSubData(const Context *context,
+                                    GLuint readBuffer,
+                                    GLuint writeBuffer,
+                                    GLintptr readOffset,
+                                    GLintptr writeOffset,
+                                    GLsizeiptr size)
+{
+    return true;
+}
+
+bool ValidateCopyTextureSubImage1D(const Context *context,
+                                   TextureID texture,
+                                   GLint level,
+                                   GLint xoffset,
+                                   GLint x,
+                                   GLint y,
+                                   GLsizei width)
+{
+    return true;
+}
+
+bool ValidateCopyTextureSubImage2D(const Context *context,
+                                   TextureID texture,
+                                   GLint level,
+                                   GLint xoffset,
+                                   GLint yoffset,
+                                   GLint x,
+                                   GLint y,
+                                   GLsizei width,
+                                   GLsizei height)
+{
+    return true;
+}
+
+bool ValidateCopyTextureSubImage3D(const Context *context,
+                                   TextureID texture,
+                                   GLint level,
+                                   GLint xoffset,
+                                   GLint yoffset,
+                                   GLint zoffset,
+                                   GLint x,
+                                   GLint y,
+                                   GLsizei width,
+                                   GLsizei height)
+{
+    return true;
+}
+
+bool ValidateCreateBuffers(const Context *context, GLsizei n, const BufferID *buffers)
+{
+    return true;
+}
+
+bool ValidateCreateFramebuffers(const Context *context, GLsizei n, const GLuint *framebuffers)
+{
+    return true;
+}
+
+bool ValidateCreateProgramPipelines(const Context *context, GLsizei n, const GLuint *pipelines)
+{
+    return true;
+}
+
+bool ValidateCreateQueries(const Context *context, GLenum target, GLsizei n, const GLuint *ids)
+{
+    return true;
+}
+
+bool ValidateCreateRenderbuffers(const Context *context,
+                                 GLsizei n,
+                                 const RenderbufferID *renderbuffers)
+{
+    return true;
+}
+
+bool ValidateCreateSamplers(const Context *context, GLsizei n, const GLuint *samplers)
+{
+    return true;
+}
+
+bool ValidateCreateTextures(const Context *context,
+                            GLenum target,
+                            GLsizei n,
+                            const GLuint *textures)
+{
+    return true;
+}
+
+bool ValidateCreateTransformFeedbacks(const Context *context, GLsizei n, const GLuint *ids)
+{
+    return true;
+}
+
+bool ValidateCreateVertexArrays(const Context *context, GLsizei n, const VertexArrayID *arrays)
+{
+    return true;
+}
+
+bool ValidateDisableVertexArrayAttrib(const Context *context, VertexArrayID vaobj, GLuint index)
+{
+    return true;
+}
+
+bool ValidateEnableVertexArrayAttrib(const Context *context, VertexArrayID vaobj, GLuint index)
+{
+    return true;
+}
+
+bool ValidateFlushMappedNamedBufferRange(const Context *context,
+                                         BufferID buffer,
+                                         GLintptr offset,
+                                         GLsizeiptr length)
+{
+    return true;
+}
+
+bool ValidateGenerateTextureMipmap(const Context *context, TextureID texture)
+{
+    return true;
+}
+
+bool ValidateGetCompressedTextureImage(const Context *context,
+                                       TextureID texture,
+                                       GLint level,
+                                       GLsizei bufSize,
+                                       const void *pixels)
+{
+    return true;
+}
+
+bool ValidateGetCompressedTextureSubImage(const Context *context,
+                                          TextureID texture,
+                                          GLint level,
+                                          GLint xoffset,
+                                          GLint yoffset,
+                                          GLint zoffset,
+                                          GLsizei width,
+                                          GLsizei height,
+                                          GLsizei depth,
+                                          GLsizei bufSize,
+                                          const void *pixels)
+{
+    return true;
+}
+
+bool ValidateGetNamedBufferParameteri64v(const Context *context,
+                                         BufferID buffer,
+                                         GLenum pname,
+                                         const GLint64 *params)
+{
+    return true;
+}
+
+bool ValidateGetNamedBufferParameteriv(const Context *context,
+                                       BufferID buffer,
+                                       GLenum pname,
+                                       const GLint *params)
+{
+    return true;
+}
+
+bool ValidateGetNamedBufferPointerv(const Context *context,
+                                    BufferID buffer,
+                                    GLenum pname,
+                                    void *const *params)
+{
+    return true;
+}
+
+bool ValidateGetNamedBufferSubData(const Context *context,
+                                   BufferID buffer,
+                                   GLintptr offset,
+                                   GLsizeiptr size,
+                                   const void *data)
+{
+    return true;
+}
+
+bool ValidateGetNamedFramebufferAttachmentParameteriv(const Context *context,
+                                                      FramebufferID framebuffer,
+                                                      GLenum attachment,
+                                                      GLenum pname,
+                                                      const GLint *params)
+{
+    return true;
+}
+
+bool ValidateGetNamedFramebufferParameteriv(const Context *context,
+                                            FramebufferID framebuffer,
+                                            GLenum pname,
+                                            const GLint *param)
+{
+    return true;
+}
+
+bool ValidateGetNamedRenderbufferParameteriv(const Context *context,
+                                             RenderbufferID renderbuffer,
+                                             GLenum pname,
+                                             const GLint *params)
+{
+    return true;
+}
+
+bool ValidateGetQueryBufferObjecti64v(const Context *context,
+                                      GLuint id,
+                                      BufferID buffer,
+                                      GLenum pname,
+                                      GLintptr offset)
+{
+    return true;
+}
+
+bool ValidateGetQueryBufferObjectiv(const Context *context,
+                                    GLuint id,
+                                    BufferID buffer,
+                                    GLenum pname,
+                                    GLintptr offset)
+{
+    return true;
+}
+
+bool ValidateGetQueryBufferObjectui64v(const Context *context,
+                                       GLuint id,
+                                       BufferID buffer,
+                                       GLenum pname,
+                                       GLintptr offset)
+{
+    return true;
+}
+
+bool ValidateGetQueryBufferObjectuiv(const Context *context,
+                                     GLuint id,
+                                     BufferID buffer,
+                                     GLenum pname,
+                                     GLintptr offset)
+{
+    return true;
+}
+
+bool ValidateGetTextureImage(const Context *context,
+                             TextureID texture,
+                             GLint level,
+                             GLenum format,
+                             GLenum type,
+                             GLsizei bufSize,
+                             const void *pixels)
+{
+    return true;
+}
+
+bool ValidateGetTextureLevelParameterfv(const Context *context,
+                                        TextureID texture,
+                                        GLint level,
+                                        GLenum pname,
+                                        const GLfloat *params)
+{
+    return true;
+}
+
+bool ValidateGetTextureLevelParameteriv(const Context *context,
+                                        TextureID texture,
+                                        GLint level,
+                                        GLenum pname,
+                                        const GLint *params)
+{
+    return true;
+}
+
+bool ValidateGetTextureParameterIiv(const Context *context,
+                                    TextureID texture,
+                                    GLenum pname,
+                                    const GLint *params)
+{
+    return true;
+}
+
+bool ValidateGetTextureParameterIuiv(const Context *context,
+                                     TextureID texture,
+                                     GLenum pname,
+                                     const GLuint *params)
+{
+    return true;
+}
+
+bool ValidateGetTextureParameterfv(const Context *context,
+                                   TextureID texture,
+                                   GLenum pname,
+                                   const GLfloat *params)
+{
+    return true;
+}
+
+bool ValidateGetTextureParameteriv(const Context *context,
+                                   TextureID texture,
+                                   GLenum pname,
+                                   const GLint *params)
+{
+    return true;
+}
+
+bool ValidateGetTextureSubImage(const Context *context,
+                                TextureID texture,
+                                GLint level,
+                                GLint xoffset,
+                                GLint yoffset,
+                                GLint zoffset,
+                                GLsizei width,
+                                GLsizei height,
+                                GLsizei depth,
+                                GLenum format,
+                                GLenum type,
+                                GLsizei bufSize,
+                                const void *pixels)
+{
+    return true;
+}
+
+bool ValidateGetTransformFeedbacki64_v(const Context *context,
+                                       GLuint xfb,
+                                       GLenum pname,
+                                       GLuint index,
+                                       const GLint64 *param)
+{
+    return true;
+}
+
+bool ValidateGetTransformFeedbacki_v(const Context *context,
+                                     GLuint xfb,
+                                     GLenum pname,
+                                     GLuint index,
+                                     const GLint *param)
+{
+    return true;
+}
+
+bool ValidateGetTransformFeedbackiv(const Context *context,
+                                    GLuint xfb,
+                                    GLenum pname,
+                                    const GLint *param)
+{
+    return true;
+}
+
+bool ValidateGetVertexArrayIndexed64iv(const Context *context,
+                                       VertexArrayID vaobj,
+                                       GLuint index,
+                                       GLenum pname,
+                                       const GLint64 *param)
+{
+    return true;
+}
+
+bool ValidateGetVertexArrayIndexediv(const Context *context,
+                                     VertexArrayID vaobj,
+                                     GLuint index,
+                                     GLenum pname,
+                                     const GLint *param)
+{
+    return true;
+}
+
+bool ValidateGetVertexArrayiv(const Context *context,
+                              VertexArrayID vaobj,
+                              GLenum pname,
+                              const GLint *param)
+{
+    return true;
+}
+
+bool ValidateGetnColorTable(const Context *context,
+                            GLenum target,
+                            GLenum format,
+                            GLenum type,
+                            GLsizei bufSize,
+                            const void *table)
+{
+    return true;
+}
+
+bool ValidateGetnCompressedTexImage(const Context *context,
+                                    GLenum target,
+                                    GLint lod,
+                                    GLsizei bufSize,
+                                    const void *pixels)
+{
+    return true;
+}
+
+bool ValidateGetnConvolutionFilter(const Context *context,
+                                   GLenum target,
+                                   GLenum format,
+                                   GLenum type,
+                                   GLsizei bufSize,
+                                   const void *image)
+{
+    return true;
+}
+
+bool ValidateGetnHistogram(const Context *context,
+                           GLenum target,
+                           GLboolean reset,
+                           GLenum format,
+                           GLenum type,
+                           GLsizei bufSize,
+                           const void *values)
+{
+    return true;
+}
+
+bool ValidateGetnMapdv(const Context *context,
+                       GLenum target,
+                       GLenum query,
+                       GLsizei bufSize,
+                       const GLdouble *v)
+{
+    return true;
+}
+
+bool ValidateGetnMapfv(const Context *context,
+                       GLenum target,
+                       GLenum query,
+                       GLsizei bufSize,
+                       const GLfloat *v)
+{
+    return true;
+}
+
+bool ValidateGetnMapiv(const Context *context,
+                       GLenum target,
+                       GLenum query,
+                       GLsizei bufSize,
+                       const GLint *v)
+{
+    return true;
+}
+
+bool ValidateGetnMinmax(const Context *context,
+                        GLenum target,
+                        GLboolean reset,
+                        GLenum format,
+                        GLenum type,
+                        GLsizei bufSize,
+                        const void *values)
+{
+    return true;
+}
+
+bool ValidateGetnPixelMapfv(const Context *context,
+                            GLenum map,
+                            GLsizei bufSize,
+                            const GLfloat *values)
+{
+    return true;
+}
+
+bool ValidateGetnPixelMapuiv(const Context *context,
+                             GLenum map,
+                             GLsizei bufSize,
+                             const GLuint *values)
+{
+    return true;
+}
+
+bool ValidateGetnPixelMapusv(const Context *context,
+                             GLenum map,
+                             GLsizei bufSize,
+                             const GLushort *values)
+{
+    return true;
+}
+
+bool ValidateGetnPolygonStipple(const Context *context, GLsizei bufSize, const GLubyte *pattern)
+{
+    return true;
+}
+
+bool ValidateGetnSeparableFilter(const Context *context,
+                                 GLenum target,
+                                 GLenum format,
+                                 GLenum type,
+                                 GLsizei rowBufSize,
+                                 const void *row,
+                                 GLsizei columnBufSize,
+                                 const void *column,
+                                 const void *span)
+{
+    return true;
+}
+
+bool ValidateGetnTexImage(const Context *context,
+                          GLenum target,
+                          GLint level,
+                          GLenum format,
+                          GLenum type,
+                          GLsizei bufSize,
+                          const void *pixels)
+{
+    return true;
+}
+
+bool ValidateGetnUniformdv(const Context *context,
+                           ShaderProgramID program,
+                           UniformLocation location,
+                           GLsizei bufSize,
+                           const GLdouble *params)
+{
+    return true;
+}
+
+bool ValidateInvalidateNamedFramebufferData(const Context *context,
+                                            FramebufferID framebuffer,
+                                            GLsizei numAttachments,
+                                            const GLenum *attachments)
+{
+    return true;
+}
+
+bool ValidateInvalidateNamedFramebufferSubData(const Context *context,
+                                               FramebufferID framebuffer,
+                                               GLsizei numAttachments,
+                                               const GLenum *attachments,
+                                               GLint x,
+                                               GLint y,
+                                               GLsizei width,
+                                               GLsizei height)
+{
+    return true;
+}
+
+bool ValidateMapNamedBuffer(const Context *context, BufferID buffer, GLenum access)
+{
+    return true;
+}
+
+bool ValidateMapNamedBufferRange(const Context *context,
+                                 BufferID buffer,
+                                 GLintptr offset,
+                                 GLsizeiptr length,
+                                 GLbitfield access)
+{
+    return true;
+}
+
+bool ValidateNamedBufferData(const Context *context,
+                             BufferID buffer,
+                             GLsizeiptr size,
+                             const void *data,
+                             GLenum usage)
+{
+    return true;
+}
+
+bool ValidateNamedBufferStorage(const Context *context,
+                                BufferID buffer,
+                                GLsizeiptr size,
+                                const void *data,
+                                GLbitfield flags)
+{
+    return true;
+}
+
+bool ValidateNamedBufferSubData(const Context *context,
+                                BufferID buffer,
+                                GLintptr offset,
+                                GLsizeiptr size,
+                                const void *data)
+{
+    return true;
+}
+
+bool ValidateNamedFramebufferDrawBuffer(const Context *context,
+                                        FramebufferID framebuffer,
+                                        GLenum buf)
+{
+    return true;
+}
+
+bool ValidateNamedFramebufferDrawBuffers(const Context *context,
+                                         FramebufferID framebuffer,
+                                         GLsizei n,
+                                         const GLenum *bufs)
+{
+    return true;
+}
+
+bool ValidateNamedFramebufferParameteri(const Context *context,
+                                        FramebufferID framebuffer,
+                                        GLenum pname,
+                                        GLint param)
+{
+    return true;
+}
+
+bool ValidateNamedFramebufferReadBuffer(const Context *context,
+                                        FramebufferID framebuffer,
+                                        GLenum src)
+{
+    return true;
+}
+
+bool ValidateNamedFramebufferRenderbuffer(const Context *context,
+                                          FramebufferID framebuffer,
+                                          GLenum attachment,
+                                          GLenum renderbuffertarget,
+                                          RenderbufferID renderbuffer)
+{
+    return true;
+}
+
+bool ValidateNamedFramebufferTexture(const Context *context,
+                                     FramebufferID framebuffer,
+                                     GLenum attachment,
+                                     TextureID texture,
+                                     GLint level)
+{
+    return true;
+}
+
+bool ValidateNamedFramebufferTextureLayer(const Context *context,
+                                          FramebufferID framebuffer,
+                                          GLenum attachment,
+                                          TextureID texture,
+                                          GLint level,
+                                          GLint layer)
+{
+    return true;
+}
+
+bool ValidateNamedRenderbufferStorage(const Context *context,
+                                      RenderbufferID renderbuffer,
+                                      GLenum internalformat,
+                                      GLsizei width,
+                                      GLsizei height)
+{
+    return true;
+}
+
+bool ValidateNamedRenderbufferStorageMultisample(const Context *context,
+                                                 RenderbufferID renderbuffer,
+                                                 GLsizei samples,
+                                                 GLenum internalformat,
+                                                 GLsizei width,
+                                                 GLsizei height)
+{
+    return true;
+}
+
+bool ValidateTextureBarrier(const Context *context)
+{
+    return true;
+}
+
+bool ValidateTextureBuffer(const Context *context,
+                           TextureID texture,
+                           GLenum internalformat,
+                           BufferID buffer)
+{
+    return true;
+}
+
+bool ValidateTextureBufferRange(const Context *context,
+                                TextureID texture,
+                                GLenum internalformat,
+                                BufferID buffer,
+                                GLintptr offset,
+                                GLsizeiptr size)
+{
+    return true;
+}
+
+bool ValidateTextureParameterIiv(const Context *context,
+                                 TextureID texture,
+                                 GLenum pname,
+                                 const GLint *params)
+{
+    return true;
+}
+
+bool ValidateTextureParameterIuiv(const Context *context,
+                                  TextureID texture,
+                                  GLenum pname,
+                                  const GLuint *params)
+{
+    return true;
+}
+
+bool ValidateTextureParameterf(const Context *context,
+                               TextureID texture,
+                               GLenum pname,
+                               GLfloat param)
+{
+    return true;
+}
+
+bool ValidateTextureParameterfv(const Context *context,
+                                TextureID texture,
+                                GLenum pname,
+                                const GLfloat *param)
+{
+    return true;
+}
+
+bool ValidateTextureParameteri(const Context *context, TextureID texture, GLenum pname, GLint param)
+{
+    return true;
+}
+
+bool ValidateTextureParameteriv(const Context *context,
+                                TextureID texture,
+                                GLenum pname,
+                                const GLint *param)
+{
+    return true;
+}
+
+bool ValidateTextureStorage1D(const Context *context,
+                              TextureID texture,
+                              GLsizei levels,
+                              GLenum internalformat,
+                              GLsizei width)
+{
+    return true;
+}
+
+bool ValidateTextureStorage2D(const Context *context,
+                              TextureID texture,
+                              GLsizei levels,
+                              GLenum internalformat,
+                              GLsizei width,
+                              GLsizei height)
+{
+    return true;
+}
+
+bool ValidateTextureStorage2DMultisample(const Context *context,
+                                         TextureID texture,
+                                         GLsizei samples,
+                                         GLenum internalformat,
+                                         GLsizei width,
+                                         GLsizei height,
+                                         GLboolean fixedsamplelocations)
+{
+    return true;
+}
+
+bool ValidateTextureStorage3D(const Context *context,
+                              TextureID texture,
+                              GLsizei levels,
+                              GLenum internalformat,
+                              GLsizei width,
+                              GLsizei height,
+                              GLsizei depth)
+{
+    return true;
+}
+
+bool ValidateTextureStorage3DMultisample(const Context *context,
+                                         TextureID texture,
+                                         GLsizei samples,
+                                         GLenum internalformat,
+                                         GLsizei width,
+                                         GLsizei height,
+                                         GLsizei depth,
+                                         GLboolean fixedsamplelocations)
+{
+    return true;
+}
+
+bool ValidateTextureSubImage1D(const Context *context,
+                               TextureID texture,
+                               GLint level,
+                               GLint xoffset,
+                               GLsizei width,
+                               GLenum format,
+                               GLenum type,
+                               const void *pixels)
+{
+    return true;
+}
+
+bool ValidateTextureSubImage2D(const Context *context,
+                               TextureID texture,
+                               GLint level,
+                               GLint xoffset,
+                               GLint yoffset,
+                               GLsizei width,
+                               GLsizei height,
+                               GLenum format,
+                               GLenum type,
+                               const void *pixels)
+{
+    return true;
+}
+
+bool ValidateTextureSubImage3D(const Context *context,
+                               TextureID texture,
+                               GLint level,
+                               GLint xoffset,
+                               GLint yoffset,
+                               GLint zoffset,
+                               GLsizei width,
+                               GLsizei height,
+                               GLsizei depth,
+                               GLenum format,
+                               GLenum type,
+                               const void *pixels)
+{
+    return true;
+}
+
+bool ValidateTransformFeedbackBufferBase(const Context *context,
+                                         GLuint xfb,
+                                         GLuint index,
+                                         BufferID buffer)
+{
+    return true;
+}
+
+bool ValidateTransformFeedbackBufferRange(const Context *context,
+                                          GLuint xfb,
+                                          GLuint index,
+                                          BufferID buffer,
+                                          GLintptr offset,
+                                          GLsizeiptr size)
+{
+    return true;
+}
+
+bool ValidateUnmapNamedBuffer(const Context *context, BufferID buffer)
+{
+    return true;
+}
+
+bool ValidateVertexArrayAttribBinding(const Context *context,
+                                      VertexArrayID vaobj,
+                                      GLuint attribindex,
+                                      GLuint bindingindex)
+{
+    return true;
+}
+
+bool ValidateVertexArrayAttribFormat(const Context *context,
+                                     VertexArrayID vaobj,
+                                     GLuint attribindex,
+                                     GLint size,
+                                     GLenum type,
+                                     GLboolean normalized,
+                                     GLuint relativeoffset)
+{
+    return true;
+}
+
+bool ValidateVertexArrayAttribIFormat(const Context *context,
+                                      VertexArrayID vaobj,
+                                      GLuint attribindex,
+                                      GLint size,
+                                      GLenum type,
+                                      GLuint relativeoffset)
+{
+    return true;
+}
+
+bool ValidateVertexArrayAttribLFormat(const Context *context,
+                                      VertexArrayID vaobj,
+                                      GLuint attribindex,
+                                      GLint size,
+                                      GLenum type,
+                                      GLuint relativeoffset)
+{
+    return true;
+}
+
+bool ValidateVertexArrayBindingDivisor(const Context *context,
+                                       VertexArrayID vaobj,
+                                       GLuint bindingindex,
+                                       GLuint divisor)
+{
+    return true;
+}
+
+bool ValidateVertexArrayElementBuffer(const Context *context, VertexArrayID vaobj, BufferID buffer)
+{
+    return true;
+}
+
+bool ValidateVertexArrayVertexBuffer(const Context *context,
+                                     VertexArrayID vaobj,
+                                     GLuint bindingindex,
+                                     BufferID buffer,
+                                     GLintptr offset,
+                                     GLsizei stride)
+{
+    return true;
+}
+
+bool ValidateVertexArrayVertexBuffers(const Context *context,
+                                      VertexArrayID vaobj,
+                                      GLuint first,
+                                      GLsizei count,
+                                      const BufferID *buffers,
+                                      const GLintptr *offsets,
+                                      const GLsizei *strides)
+{
+    return true;
+}
+
+bool ValidateMultiDrawArraysIndirectCount(const Context *context,
+                                          GLenum mode,
+                                          const void *indirect,
+                                          GLintptr drawcount,
+                                          GLsizei maxdrawcount,
+                                          GLsizei stride)
+{
+    return true;
+}
+
+bool ValidateMultiDrawElementsIndirectCount(const Context *context,
+                                            GLenum mode,
+                                            GLenum type,
+                                            const void *indirect,
+                                            GLintptr drawcount,
+                                            GLsizei maxdrawcount,
+                                            GLsizei stride)
+{
+    return true;
+}
+
+bool ValidatePolygonOffsetClamp(const Context *context,
+                                GLfloat factor,
+                                GLfloat units,
+                                GLfloat clamp)
+{
+    return true;
+}
+
+bool ValidateSpecializeShader(const Context *context,
+                              GLuint shader,
+                              const GLchar *pEntryPoint,
+                              GLuint numSpecializationConstants,
+                              const GLuint *pConstantIndex,
+                              const GLuint *pConstantValue)
+{
+    return true;
+}
+
 }  // namespace gl
diff --git a/src/libANGLE/validationGL41.cpp b/src/libANGLE/validationGL41.cpp
deleted file mode 100644
index 9c55d21..0000000
--- a/src/libANGLE/validationGL41.cpp
+++ /dev/null
@@ -1,308 +0,0 @@
-//
-// Copyright 2019 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// validationGL41.cpp: Validation functions for OpenGL 4.1 entry point parameters
-
-#include "libANGLE/validationGL41_autogen.h"
-
-namespace gl
-{
-
-bool ValidateDepthRangeArrayv(const Context *context,
-                              GLuint first,
-                              GLsizei count,
-                              const GLdouble *v)
-{
-    return true;
-}
-
-bool ValidateDepthRangeIndexed(const Context *context, GLuint index, GLdouble n, GLdouble f)
-{
-    return true;
-}
-
-bool ValidateGetDoublei_v(const Context *context, GLenum target, GLuint index, const GLdouble *data)
-{
-    return true;
-}
-
-bool ValidateGetFloati_v(const Context *context, GLenum target, GLuint index, const GLfloat *data)
-{
-    return true;
-}
-
-bool ValidateGetVertexAttribLdv(const Context *context,
-                                GLuint index,
-                                GLenum pname,
-                                const GLdouble *params)
-{
-    return true;
-}
-
-bool ValidateProgramUniform1d(const Context *context,
-                              ShaderProgramID program,
-                              UniformLocation location,
-                              GLdouble v0)
-{
-    return true;
-}
-
-bool ValidateProgramUniform1dv(const Context *context,
-                               ShaderProgramID program,
-                               UniformLocation location,
-                               GLsizei count,
-                               const GLdouble *value)
-{
-    return true;
-}
-
-bool ValidateProgramUniform2d(const Context *context,
-                              ShaderProgramID program,
-                              UniformLocation location,
-                              GLdouble v0,
-                              GLdouble v1)
-{
-    return true;
-}
-
-bool ValidateProgramUniform2dv(const Context *context,
-                               ShaderProgramID program,
-                               UniformLocation location,
-                               GLsizei count,
-                               const GLdouble *value)
-{
-    return true;
-}
-
-bool ValidateProgramUniform3d(const Context *context,
-                              ShaderProgramID program,
-                              UniformLocation location,
-                              GLdouble v0,
-                              GLdouble v1,
-                              GLdouble v2)
-{
-    return true;
-}
-
-bool ValidateProgramUniform3dv(const Context *context,
-                               ShaderProgramID program,
-                               UniformLocation location,
-                               GLsizei count,
-                               const GLdouble *value)
-{
-    return true;
-}
-
-bool ValidateProgramUniform4d(const Context *context,
-                              ShaderProgramID program,
-                              UniformLocation location,
-                              GLdouble v0,
-                              GLdouble v1,
-                              GLdouble v2,
-                              GLdouble v3)
-{
-    return true;
-}
-
-bool ValidateProgramUniform4dv(const Context *context,
-                               ShaderProgramID program,
-                               UniformLocation location,
-                               GLsizei count,
-                               const GLdouble *value)
-{
-    return true;
-}
-
-bool ValidateProgramUniformMatrix2dv(const Context *context,
-                                     ShaderProgramID program,
-                                     UniformLocation location,
-                                     GLsizei count,
-                                     GLboolean transpose,
-                                     const GLdouble *value)
-{
-    return true;
-}
-
-bool ValidateProgramUniformMatrix2x3dv(const Context *context,
-                                       ShaderProgramID program,
-                                       UniformLocation location,
-                                       GLsizei count,
-                                       GLboolean transpose,
-                                       const GLdouble *value)
-{
-    return true;
-}
-
-bool ValidateProgramUniformMatrix2x4dv(const Context *context,
-                                       ShaderProgramID program,
-                                       UniformLocation location,
-                                       GLsizei count,
-                                       GLboolean transpose,
-                                       const GLdouble *value)
-{
-    return true;
-}
-
-bool ValidateProgramUniformMatrix3dv(const Context *context,
-                                     ShaderProgramID program,
-                                     UniformLocation location,
-                                     GLsizei count,
-                                     GLboolean transpose,
-                                     const GLdouble *value)
-{
-    return true;
-}
-
-bool ValidateProgramUniformMatrix3x2dv(const Context *context,
-                                       ShaderProgramID program,
-                                       UniformLocation location,
-                                       GLsizei count,
-                                       GLboolean transpose,
-                                       const GLdouble *value)
-{
-    return true;
-}
-
-bool ValidateProgramUniformMatrix3x4dv(const Context *context,
-                                       ShaderProgramID program,
-                                       UniformLocation location,
-                                       GLsizei count,
-                                       GLboolean transpose,
-                                       const GLdouble *value)
-{
-    return true;
-}
-
-bool ValidateProgramUniformMatrix4dv(const Context *context,
-                                     ShaderProgramID program,
-                                     UniformLocation location,
-                                     GLsizei count,
-                                     GLboolean transpose,
-                                     const GLdouble *value)
-{
-    return true;
-}
-
-bool ValidateProgramUniformMatrix4x2dv(const Context *context,
-                                       ShaderProgramID program,
-                                       UniformLocation location,
-                                       GLsizei count,
-                                       GLboolean transpose,
-                                       const GLdouble *value)
-{
-    return true;
-}
-
-bool ValidateProgramUniformMatrix4x3dv(const Context *context,
-                                       ShaderProgramID program,
-                                       UniformLocation location,
-                                       GLsizei count,
-                                       GLboolean transpose,
-                                       const GLdouble *value)
-{
-    return true;
-}
-
-bool ValidateScissorArrayv(const Context *context, GLuint first, GLsizei count, const GLint *v)
-{
-    return true;
-}
-
-bool ValidateScissorIndexed(const Context *context,
-                            GLuint index,
-                            GLint left,
-                            GLint bottom,
-                            GLsizei width,
-                            GLsizei height)
-{
-    return true;
-}
-
-bool ValidateScissorIndexedv(const Context *context, GLuint index, const GLint *v)
-{
-    return true;
-}
-
-bool ValidateVertexAttribL1d(const Context *context, GLuint index, GLdouble x)
-{
-    return true;
-}
-
-bool ValidateVertexAttribL1dv(const Context *context, GLuint index, const GLdouble *v)
-{
-    return true;
-}
-
-bool ValidateVertexAttribL2d(const Context *context, GLuint index, GLdouble x, GLdouble y)
-{
-    return true;
-}
-
-bool ValidateVertexAttribL2dv(const Context *context, GLuint index, const GLdouble *v)
-{
-    return true;
-}
-
-bool ValidateVertexAttribL3d(const Context *context,
-                             GLuint index,
-                             GLdouble x,
-                             GLdouble y,
-                             GLdouble z)
-{
-    return true;
-}
-
-bool ValidateVertexAttribL3dv(const Context *context, GLuint index, const GLdouble *v)
-{
-    return true;
-}
-
-bool ValidateVertexAttribL4d(const Context *context,
-                             GLuint index,
-                             GLdouble x,
-                             GLdouble y,
-                             GLdouble z,
-                             GLdouble w)
-{
-    return true;
-}
-
-bool ValidateVertexAttribL4dv(const Context *context, GLuint index, const GLdouble *v)
-{
-    return true;
-}
-
-bool ValidateVertexAttribLPointer(const Context *context,
-                                  GLuint index,
-                                  GLint size,
-                                  GLenum type,
-                                  GLsizei stride,
-                                  const void *pointer)
-{
-    return true;
-}
-
-bool ValidateViewportArrayv(const Context *context, GLuint first, GLsizei count, const GLfloat *v)
-{
-    return true;
-}
-
-bool ValidateViewportIndexedf(const Context *context,
-                              GLuint index,
-                              GLfloat x,
-                              GLfloat y,
-                              GLfloat w,
-                              GLfloat h)
-{
-    return true;
-}
-
-bool ValidateViewportIndexedfv(const Context *context, GLuint index, const GLfloat *v)
-{
-    return true;
-}
-
-}  // namespace gl
diff --git a/src/libANGLE/validationGL41_autogen.h b/src/libANGLE/validationGL41_autogen.h
index c5ccf9d..dc0a287 100644
--- a/src/libANGLE/validationGL41_autogen.h
+++ b/src/libANGLE/validationGL41_autogen.h
@@ -1,5 +1,5 @@
 // GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml and wgl.xml.
+// Generated by generate_entry_points.py using data from gl.xml.
 //
 // Copyright 2020 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
diff --git a/src/libANGLE/validationGL42.cpp b/src/libANGLE/validationGL42.cpp
deleted file mode 100644
index ee09d5d..0000000
--- a/src/libANGLE/validationGL42.cpp
+++ /dev/null
@@ -1,82 +0,0 @@
-//
-// Copyright 2019 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// validationGL42.cpp: Validation functions for OpenGL 4.2 entry point parameters
-
-#include "libANGLE/validationGL42_autogen.h"
-
-namespace gl
-{
-
-bool ValidateDrawArraysInstancedBaseInstance(const Context *context,
-                                             PrimitiveMode mode,
-                                             GLint first,
-                                             GLsizei count,
-                                             GLsizei instancecount,
-                                             GLuint baseinstance)
-{
-    return true;
-}
-
-bool ValidateDrawElementsInstancedBaseInstance(const Context *context,
-                                               GLenum mode,
-                                               GLsizei count,
-                                               GLenum type,
-                                               const void *indices,
-                                               GLsizei instancecount,
-                                               GLuint baseinstance)
-{
-    return true;
-}
-
-bool ValidateDrawElementsInstancedBaseVertexBaseInstance(const Context *context,
-                                                         PrimitiveMode mode,
-                                                         GLsizei count,
-                                                         DrawElementsType type,
-                                                         const void *indices,
-                                                         GLsizei instancecount,
-                                                         GLint basevertex,
-                                                         GLuint baseinstance)
-{
-    return true;
-}
-
-bool ValidateDrawTransformFeedbackInstanced(const Context *context,
-                                            GLenum mode,
-                                            TransformFeedbackID id,
-                                            GLsizei instancecount)
-{
-    return true;
-}
-
-bool ValidateDrawTransformFeedbackStreamInstanced(const Context *context,
-                                                  GLenum mode,
-                                                  TransformFeedbackID id,
-                                                  GLuint stream,
-                                                  GLsizei instancecount)
-{
-    return true;
-}
-
-bool ValidateGetActiveAtomicCounterBufferiv(const Context *context,
-                                            ShaderProgramID program,
-                                            GLuint bufferIndex,
-                                            GLenum pname,
-                                            const GLint *params)
-{
-    return true;
-}
-
-bool ValidateTexStorage1D(const Context *context,
-                          GLenum target,
-                          GLsizei levels,
-                          GLenum internalformat,
-                          GLsizei width)
-{
-    return true;
-}
-
-}  // namespace gl
diff --git a/src/libANGLE/validationGL42_autogen.h b/src/libANGLE/validationGL42_autogen.h
index c4a0b60..10ed0cc 100644
--- a/src/libANGLE/validationGL42_autogen.h
+++ b/src/libANGLE/validationGL42_autogen.h
@@ -1,5 +1,5 @@
 // GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml and wgl.xml.
+// Generated by generate_entry_points.py using data from gl.xml.
 //
 // Copyright 2020 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
diff --git a/src/libANGLE/validationGL43.cpp b/src/libANGLE/validationGL43.cpp
deleted file mode 100644
index 4967c25..0000000
--- a/src/libANGLE/validationGL43.cpp
+++ /dev/null
@@ -1,134 +0,0 @@
-//
-// Copyright 2019 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// validationGL43.cpp: Validation functions for OpenGL 4.3 entry point parameters
-
-#include "libANGLE/validationGL43_autogen.h"
-
-namespace gl
-{
-
-bool ValidateClearBufferData(const Context *context,
-                             GLenum target,
-                             GLenum internalformat,
-                             GLenum format,
-                             GLenum type,
-                             const void *data)
-{
-    return true;
-}
-
-bool ValidateClearBufferSubData(const Context *context,
-                                GLenum target,
-                                GLenum internalformat,
-                                GLintptr offset,
-                                GLsizeiptr size,
-                                GLenum format,
-                                GLenum type,
-                                const void *data)
-{
-    return true;
-}
-
-bool ValidateGetInternalformati64v(const Context *context,
-                                   GLenum target,
-                                   GLenum internalformat,
-                                   GLenum pname,
-                                   GLsizei bufSize,
-                                   const GLint64 *params)
-{
-    return true;
-}
-
-bool ValidateGetProgramResourceLocationIndex(const Context *context,
-                                             ShaderProgramID program,
-                                             GLenum programInterface,
-                                             const GLchar *name)
-{
-    return true;
-}
-
-bool ValidateInvalidateBufferData(const Context *context, BufferID buffer)
-{
-    return true;
-}
-
-bool ValidateInvalidateBufferSubData(const Context *context,
-                                     BufferID buffer,
-                                     GLintptr offset,
-                                     GLsizeiptr length)
-{
-    return true;
-}
-
-bool ValidateInvalidateTexImage(const Context *context, TextureID texture, GLint level)
-{
-    return true;
-}
-
-bool ValidateInvalidateTexSubImage(const Context *context,
-                                   TextureID texture,
-                                   GLint level,
-                                   GLint xoffset,
-                                   GLint yoffset,
-                                   GLint zoffset,
-                                   GLsizei width,
-                                   GLsizei height,
-                                   GLsizei depth)
-{
-    return true;
-}
-
-bool ValidateMultiDrawArraysIndirect(const Context *context,
-                                     GLenum mode,
-                                     const void *indirect,
-                                     GLsizei drawcount,
-                                     GLsizei stride)
-{
-    return true;
-}
-
-bool ValidateMultiDrawElementsIndirect(const Context *context,
-                                       GLenum mode,
-                                       GLenum type,
-                                       const void *indirect,
-                                       GLsizei drawcount,
-                                       GLsizei stride)
-{
-    return true;
-}
-
-bool ValidateShaderStorageBlockBinding(const Context *context,
-                                       ShaderProgramID program,
-                                       GLuint storageBlockIndex,
-                                       GLuint storageBlockBinding)
-{
-    return true;
-}
-
-bool ValidateTextureView(const Context *context,
-                         TextureID texture,
-                         GLenum target,
-                         GLuint origtexture,
-                         GLenum internalformat,
-                         GLuint minlevel,
-                         GLuint numlevels,
-                         GLuint minlayer,
-                         GLuint numlayers)
-{
-    return true;
-}
-
-bool ValidateVertexAttribLFormat(const Context *context,
-                                 GLuint attribindex,
-                                 GLint size,
-                                 GLenum type,
-                                 GLuint relativeoffset)
-{
-    return true;
-}
-
-}  // namespace gl
diff --git a/src/libANGLE/validationGL43_autogen.h b/src/libANGLE/validationGL43_autogen.h
index 9915fbb..84bd59e 100644
--- a/src/libANGLE/validationGL43_autogen.h
+++ b/src/libANGLE/validationGL43_autogen.h
@@ -1,5 +1,5 @@
 // GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml and wgl.xml.
+// Generated by generate_entry_points.py using data from gl.xml.
 //
 // Copyright 2020 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
diff --git a/src/libANGLE/validationGL44.cpp b/src/libANGLE/validationGL44.cpp
deleted file mode 100644
index d95c1e0..0000000
--- a/src/libANGLE/validationGL44.cpp
+++ /dev/null
@@ -1,103 +0,0 @@
-//
-// Copyright 2019 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// validationGL44.cpp: Validation functions for OpenGL 4.4 entry point parameters
-
-#include "libANGLE/validationGL44_autogen.h"
-
-namespace gl
-{
-
-bool ValidateBindBuffersBase(const Context *context,
-                             GLenum target,
-                             GLuint first,
-                             GLsizei count,
-                             const BufferID *buffers)
-{
-    return true;
-}
-
-bool ValidateBindBuffersRange(const Context *context,
-                              GLenum target,
-                              GLuint first,
-                              GLsizei count,
-                              const BufferID *buffers,
-                              const GLintptr *offsets,
-                              const GLsizeiptr *sizes)
-{
-    return true;
-}
-
-bool ValidateBindImageTextures(const Context *context,
-                               GLuint first,
-                               GLsizei count,
-                               const GLuint *textures)
-{
-    return true;
-}
-
-bool ValidateBindSamplers(const Context *context,
-                          GLuint first,
-                          GLsizei count,
-                          const GLuint *samplers)
-{
-    return true;
-}
-
-bool ValidateBindTextures(const Context *context,
-                          GLuint first,
-                          GLsizei count,
-                          const GLuint *textures)
-{
-    return true;
-}
-
-bool ValidateBindVertexBuffers(const Context *context,
-                               GLuint first,
-                               GLsizei count,
-                               const BufferID *buffers,
-                               const GLintptr *offsets,
-                               const GLsizei *strides)
-{
-    return true;
-}
-
-bool ValidateBufferStorage(const Context *context,
-                           BufferBinding targetPacked,
-                           GLsizeiptr size,
-                           const void *data,
-                           GLbitfield flags)
-{
-    return true;
-}
-
-bool ValidateClearTexImage(const Context *context,
-                           TextureID texture,
-                           GLint level,
-                           GLenum format,
-                           GLenum type,
-                           const void *data)
-{
-    return true;
-}
-
-bool ValidateClearTexSubImage(const Context *context,
-                              TextureID texture,
-                              GLint level,
-                              GLint xoffset,
-                              GLint yoffset,
-                              GLint zoffset,
-                              GLsizei width,
-                              GLsizei height,
-                              GLsizei depth,
-                              GLenum format,
-                              GLenum type,
-                              const void *data)
-{
-    return true;
-}
-
-}  // namespace gl
diff --git a/src/libANGLE/validationGL44_autogen.h b/src/libANGLE/validationGL44_autogen.h
index afe788b..13f53c7 100644
--- a/src/libANGLE/validationGL44_autogen.h
+++ b/src/libANGLE/validationGL44_autogen.h
@@ -1,5 +1,5 @@
 // GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml and wgl.xml.
+// Generated by generate_entry_points.py using data from gl.xml.
 //
 // Copyright 2020 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
diff --git a/src/libANGLE/validationGL45.cpp b/src/libANGLE/validationGL45.cpp
deleted file mode 100644
index d5b43d0..0000000
--- a/src/libANGLE/validationGL45.cpp
+++ /dev/null
@@ -1,1055 +0,0 @@
-//
-// Copyright 2019 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// validationGL45.cpp: Validation functions for OpenGL 4.5 entry point parameters
-
-#include "libANGLE/validationGL45_autogen.h"
-
-namespace gl
-{
-
-bool ValidateBindTextureUnit(const Context *context, GLuint unit, TextureID texture)
-{
-    return true;
-}
-
-bool ValidateBlitNamedFramebuffer(const Context *context,
-                                  GLuint readFramebuffer,
-                                  GLuint drawFramebuffer,
-                                  GLint srcX0,
-                                  GLint srcY0,
-                                  GLint srcX1,
-                                  GLint srcY1,
-                                  GLint dstX0,
-                                  GLint dstY0,
-                                  GLint dstX1,
-                                  GLint dstY1,
-                                  GLbitfield mask,
-                                  GLenum filter)
-{
-    return true;
-}
-
-bool ValidateCheckNamedFramebufferStatus(const Context *context,
-                                         FramebufferID framebuffer,
-                                         GLenum target)
-{
-    return true;
-}
-
-bool ValidateClearNamedBufferData(const Context *context,
-                                  BufferID buffer,
-                                  GLenum internalformat,
-                                  GLenum format,
-                                  GLenum type,
-                                  const void *data)
-{
-    return true;
-}
-
-bool ValidateClearNamedBufferSubData(const Context *context,
-                                     BufferID buffer,
-                                     GLenum internalformat,
-                                     GLintptr offset,
-                                     GLsizeiptr size,
-                                     GLenum format,
-                                     GLenum type,
-                                     const void *data)
-{
-    return true;
-}
-
-bool ValidateClearNamedFramebufferfi(const Context *context,
-                                     FramebufferID framebuffer,
-                                     GLenum buffer,
-                                     GLint drawbuffer,
-                                     GLfloat depth,
-                                     GLint stencil)
-{
-    return true;
-}
-
-bool ValidateClearNamedFramebufferfv(const Context *context,
-                                     FramebufferID framebuffer,
-                                     GLenum buffer,
-                                     GLint drawbuffer,
-                                     const GLfloat *value)
-{
-    return true;
-}
-
-bool ValidateClearNamedFramebufferiv(const Context *context,
-                                     FramebufferID framebuffer,
-                                     GLenum buffer,
-                                     GLint drawbuffer,
-                                     const GLint *value)
-{
-    return true;
-}
-
-bool ValidateClearNamedFramebufferuiv(const Context *context,
-                                      FramebufferID framebuffer,
-                                      GLenum buffer,
-                                      GLint drawbuffer,
-                                      const GLuint *value)
-{
-    return true;
-}
-
-bool ValidateClipControl(const Context *context, GLenum origin, GLenum depth)
-{
-    return true;
-}
-
-bool ValidateCompressedTextureSubImage1D(const Context *context,
-                                         TextureID texture,
-                                         GLint level,
-                                         GLint xoffset,
-                                         GLsizei width,
-                                         GLenum format,
-                                         GLsizei imageSize,
-                                         const void *data)
-{
-    return true;
-}
-
-bool ValidateCompressedTextureSubImage2D(const Context *context,
-                                         TextureID texture,
-                                         GLint level,
-                                         GLint xoffset,
-                                         GLint yoffset,
-                                         GLsizei width,
-                                         GLsizei height,
-                                         GLenum format,
-                                         GLsizei imageSize,
-                                         const void *data)
-{
-    return true;
-}
-
-bool ValidateCompressedTextureSubImage3D(const Context *context,
-                                         TextureID texture,
-                                         GLint level,
-                                         GLint xoffset,
-                                         GLint yoffset,
-                                         GLint zoffset,
-                                         GLsizei width,
-                                         GLsizei height,
-                                         GLsizei depth,
-                                         GLenum format,
-                                         GLsizei imageSize,
-                                         const void *data)
-{
-    return true;
-}
-
-bool ValidateCopyNamedBufferSubData(const Context *context,
-                                    GLuint readBuffer,
-                                    GLuint writeBuffer,
-                                    GLintptr readOffset,
-                                    GLintptr writeOffset,
-                                    GLsizeiptr size)
-{
-    return true;
-}
-
-bool ValidateCopyTextureSubImage1D(const Context *context,
-                                   TextureID texture,
-                                   GLint level,
-                                   GLint xoffset,
-                                   GLint x,
-                                   GLint y,
-                                   GLsizei width)
-{
-    return true;
-}
-
-bool ValidateCopyTextureSubImage2D(const Context *context,
-                                   TextureID texture,
-                                   GLint level,
-                                   GLint xoffset,
-                                   GLint yoffset,
-                                   GLint x,
-                                   GLint y,
-                                   GLsizei width,
-                                   GLsizei height)
-{
-    return true;
-}
-
-bool ValidateCopyTextureSubImage3D(const Context *context,
-                                   TextureID texture,
-                                   GLint level,
-                                   GLint xoffset,
-                                   GLint yoffset,
-                                   GLint zoffset,
-                                   GLint x,
-                                   GLint y,
-                                   GLsizei width,
-                                   GLsizei height)
-{
-    return true;
-}
-
-bool ValidateCreateBuffers(const Context *context, GLsizei n, const BufferID *buffers)
-{
-    return true;
-}
-
-bool ValidateCreateFramebuffers(const Context *context, GLsizei n, const GLuint *framebuffers)
-{
-    return true;
-}
-
-bool ValidateCreateProgramPipelines(const Context *context, GLsizei n, const GLuint *pipelines)
-{
-    return true;
-}
-
-bool ValidateCreateQueries(const Context *context, GLenum target, GLsizei n, const GLuint *ids)
-{
-    return true;
-}
-
-bool ValidateCreateRenderbuffers(const Context *context,
-                                 GLsizei n,
-                                 const RenderbufferID *renderbuffers)
-{
-    return true;
-}
-
-bool ValidateCreateSamplers(const Context *context, GLsizei n, const GLuint *samplers)
-{
-    return true;
-}
-
-bool ValidateCreateTextures(const Context *context,
-                            GLenum target,
-                            GLsizei n,
-                            const GLuint *textures)
-{
-    return true;
-}
-
-bool ValidateCreateTransformFeedbacks(const Context *context, GLsizei n, const GLuint *ids)
-{
-    return true;
-}
-
-bool ValidateCreateVertexArrays(const Context *context, GLsizei n, const VertexArrayID *arrays)
-{
-    return true;
-}
-
-bool ValidateDisableVertexArrayAttrib(const Context *context, VertexArrayID vaobj, GLuint index)
-{
-    return true;
-}
-
-bool ValidateEnableVertexArrayAttrib(const Context *context, VertexArrayID vaobj, GLuint index)
-{
-    return true;
-}
-
-bool ValidateFlushMappedNamedBufferRange(const Context *context,
-                                         BufferID buffer,
-                                         GLintptr offset,
-                                         GLsizeiptr length)
-{
-    return true;
-}
-
-bool ValidateGenerateTextureMipmap(const Context *context, TextureID texture)
-{
-    return true;
-}
-
-bool ValidateGetCompressedTextureImage(const Context *context,
-                                       TextureID texture,
-                                       GLint level,
-                                       GLsizei bufSize,
-                                       const void *pixels)
-{
-    return true;
-}
-
-bool ValidateGetCompressedTextureSubImage(const Context *context,
-                                          TextureID texture,
-                                          GLint level,
-                                          GLint xoffset,
-                                          GLint yoffset,
-                                          GLint zoffset,
-                                          GLsizei width,
-                                          GLsizei height,
-                                          GLsizei depth,
-                                          GLsizei bufSize,
-                                          const void *pixels)
-{
-    return true;
-}
-
-bool ValidateGetNamedBufferParameteri64v(const Context *context,
-                                         BufferID buffer,
-                                         GLenum pname,
-                                         const GLint64 *params)
-{
-    return true;
-}
-
-bool ValidateGetNamedBufferParameteriv(const Context *context,
-                                       BufferID buffer,
-                                       GLenum pname,
-                                       const GLint *params)
-{
-    return true;
-}
-
-bool ValidateGetNamedBufferPointerv(const Context *context,
-                                    BufferID buffer,
-                                    GLenum pname,
-                                    void *const *params)
-{
-    return true;
-}
-
-bool ValidateGetNamedBufferSubData(const Context *context,
-                                   BufferID buffer,
-                                   GLintptr offset,
-                                   GLsizeiptr size,
-                                   const void *data)
-{
-    return true;
-}
-
-bool ValidateGetNamedFramebufferAttachmentParameteriv(const Context *context,
-                                                      FramebufferID framebuffer,
-                                                      GLenum attachment,
-                                                      GLenum pname,
-                                                      const GLint *params)
-{
-    return true;
-}
-
-bool ValidateGetNamedFramebufferParameteriv(const Context *context,
-                                            FramebufferID framebuffer,
-                                            GLenum pname,
-                                            const GLint *param)
-{
-    return true;
-}
-
-bool ValidateGetNamedRenderbufferParameteriv(const Context *context,
-                                             RenderbufferID renderbuffer,
-                                             GLenum pname,
-                                             const GLint *params)
-{
-    return true;
-}
-
-bool ValidateGetQueryBufferObjecti64v(const Context *context,
-                                      GLuint id,
-                                      BufferID buffer,
-                                      GLenum pname,
-                                      GLintptr offset)
-{
-    return true;
-}
-
-bool ValidateGetQueryBufferObjectiv(const Context *context,
-                                    GLuint id,
-                                    BufferID buffer,
-                                    GLenum pname,
-                                    GLintptr offset)
-{
-    return true;
-}
-
-bool ValidateGetQueryBufferObjectui64v(const Context *context,
-                                       GLuint id,
-                                       BufferID buffer,
-                                       GLenum pname,
-                                       GLintptr offset)
-{
-    return true;
-}
-
-bool ValidateGetQueryBufferObjectuiv(const Context *context,
-                                     GLuint id,
-                                     BufferID buffer,
-                                     GLenum pname,
-                                     GLintptr offset)
-{
-    return true;
-}
-
-bool ValidateGetTextureImage(const Context *context,
-                             TextureID texture,
-                             GLint level,
-                             GLenum format,
-                             GLenum type,
-                             GLsizei bufSize,
-                             const void *pixels)
-{
-    return true;
-}
-
-bool ValidateGetTextureLevelParameterfv(const Context *context,
-                                        TextureID texture,
-                                        GLint level,
-                                        GLenum pname,
-                                        const GLfloat *params)
-{
-    return true;
-}
-
-bool ValidateGetTextureLevelParameteriv(const Context *context,
-                                        TextureID texture,
-                                        GLint level,
-                                        GLenum pname,
-                                        const GLint *params)
-{
-    return true;
-}
-
-bool ValidateGetTextureParameterIiv(const Context *context,
-                                    TextureID texture,
-                                    GLenum pname,
-                                    const GLint *params)
-{
-    return true;
-}
-
-bool ValidateGetTextureParameterIuiv(const Context *context,
-                                     TextureID texture,
-                                     GLenum pname,
-                                     const GLuint *params)
-{
-    return true;
-}
-
-bool ValidateGetTextureParameterfv(const Context *context,
-                                   TextureID texture,
-                                   GLenum pname,
-                                   const GLfloat *params)
-{
-    return true;
-}
-
-bool ValidateGetTextureParameteriv(const Context *context,
-                                   TextureID texture,
-                                   GLenum pname,
-                                   const GLint *params)
-{
-    return true;
-}
-
-bool ValidateGetTextureSubImage(const Context *context,
-                                TextureID texture,
-                                GLint level,
-                                GLint xoffset,
-                                GLint yoffset,
-                                GLint zoffset,
-                                GLsizei width,
-                                GLsizei height,
-                                GLsizei depth,
-                                GLenum format,
-                                GLenum type,
-                                GLsizei bufSize,
-                                const void *pixels)
-{
-    return true;
-}
-
-bool ValidateGetTransformFeedbacki64_v(const Context *context,
-                                       GLuint xfb,
-                                       GLenum pname,
-                                       GLuint index,
-                                       const GLint64 *param)
-{
-    return true;
-}
-
-bool ValidateGetTransformFeedbacki_v(const Context *context,
-                                     GLuint xfb,
-                                     GLenum pname,
-                                     GLuint index,
-                                     const GLint *param)
-{
-    return true;
-}
-
-bool ValidateGetTransformFeedbackiv(const Context *context,
-                                    GLuint xfb,
-                                    GLenum pname,
-                                    const GLint *param)
-{
-    return true;
-}
-
-bool ValidateGetVertexArrayIndexed64iv(const Context *context,
-                                       VertexArrayID vaobj,
-                                       GLuint index,
-                                       GLenum pname,
-                                       const GLint64 *param)
-{
-    return true;
-}
-
-bool ValidateGetVertexArrayIndexediv(const Context *context,
-                                     VertexArrayID vaobj,
-                                     GLuint index,
-                                     GLenum pname,
-                                     const GLint *param)
-{
-    return true;
-}
-
-bool ValidateGetVertexArrayiv(const Context *context,
-                              VertexArrayID vaobj,
-                              GLenum pname,
-                              const GLint *param)
-{
-    return true;
-}
-
-bool ValidateGetnColorTable(const Context *context,
-                            GLenum target,
-                            GLenum format,
-                            GLenum type,
-                            GLsizei bufSize,
-                            const void *table)
-{
-    return true;
-}
-
-bool ValidateGetnCompressedTexImage(const Context *context,
-                                    GLenum target,
-                                    GLint lod,
-                                    GLsizei bufSize,
-                                    const void *pixels)
-{
-    return true;
-}
-
-bool ValidateGetnConvolutionFilter(const Context *context,
-                                   GLenum target,
-                                   GLenum format,
-                                   GLenum type,
-                                   GLsizei bufSize,
-                                   const void *image)
-{
-    return true;
-}
-
-bool ValidateGetnHistogram(const Context *context,
-                           GLenum target,
-                           GLboolean reset,
-                           GLenum format,
-                           GLenum type,
-                           GLsizei bufSize,
-                           const void *values)
-{
-    return true;
-}
-
-bool ValidateGetnMapdv(const Context *context,
-                       GLenum target,
-                       GLenum query,
-                       GLsizei bufSize,
-                       const GLdouble *v)
-{
-    return true;
-}
-
-bool ValidateGetnMapfv(const Context *context,
-                       GLenum target,
-                       GLenum query,
-                       GLsizei bufSize,
-                       const GLfloat *v)
-{
-    return true;
-}
-
-bool ValidateGetnMapiv(const Context *context,
-                       GLenum target,
-                       GLenum query,
-                       GLsizei bufSize,
-                       const GLint *v)
-{
-    return true;
-}
-
-bool ValidateGetnMinmax(const Context *context,
-                        GLenum target,
-                        GLboolean reset,
-                        GLenum format,
-                        GLenum type,
-                        GLsizei bufSize,
-                        const void *values)
-{
-    return true;
-}
-
-bool ValidateGetnPixelMapfv(const Context *context,
-                            GLenum map,
-                            GLsizei bufSize,
-                            const GLfloat *values)
-{
-    return true;
-}
-
-bool ValidateGetnPixelMapuiv(const Context *context,
-                             GLenum map,
-                             GLsizei bufSize,
-                             const GLuint *values)
-{
-    return true;
-}
-
-bool ValidateGetnPixelMapusv(const Context *context,
-                             GLenum map,
-                             GLsizei bufSize,
-                             const GLushort *values)
-{
-    return true;
-}
-
-bool ValidateGetnPolygonStipple(const Context *context, GLsizei bufSize, const GLubyte *pattern)
-{
-    return true;
-}
-
-bool ValidateGetnSeparableFilter(const Context *context,
-                                 GLenum target,
-                                 GLenum format,
-                                 GLenum type,
-                                 GLsizei rowBufSize,
-                                 const void *row,
-                                 GLsizei columnBufSize,
-                                 const void *column,
-                                 const void *span)
-{
-    return true;
-}
-
-bool ValidateGetnTexImage(const Context *context,
-                          GLenum target,
-                          GLint level,
-                          GLenum format,
-                          GLenum type,
-                          GLsizei bufSize,
-                          const void *pixels)
-{
-    return true;
-}
-
-bool ValidateGetnUniformdv(const Context *context,
-                           ShaderProgramID program,
-                           UniformLocation location,
-                           GLsizei bufSize,
-                           const GLdouble *params)
-{
-    return true;
-}
-
-bool ValidateInvalidateNamedFramebufferData(const Context *context,
-                                            FramebufferID framebuffer,
-                                            GLsizei numAttachments,
-                                            const GLenum *attachments)
-{
-    return true;
-}
-
-bool ValidateInvalidateNamedFramebufferSubData(const Context *context,
-                                               FramebufferID framebuffer,
-                                               GLsizei numAttachments,
-                                               const GLenum *attachments,
-                                               GLint x,
-                                               GLint y,
-                                               GLsizei width,
-                                               GLsizei height)
-{
-    return true;
-}
-
-bool ValidateMapNamedBuffer(const Context *context, BufferID buffer, GLenum access)
-{
-    return true;
-}
-
-bool ValidateMapNamedBufferRange(const Context *context,
-                                 BufferID buffer,
-                                 GLintptr offset,
-                                 GLsizeiptr length,
-                                 GLbitfield access)
-{
-    return true;
-}
-
-bool ValidateNamedBufferData(const Context *context,
-                             BufferID buffer,
-                             GLsizeiptr size,
-                             const void *data,
-                             GLenum usage)
-{
-    return true;
-}
-
-bool ValidateNamedBufferStorage(const Context *context,
-                                BufferID buffer,
-                                GLsizeiptr size,
-                                const void *data,
-                                GLbitfield flags)
-{
-    return true;
-}
-
-bool ValidateNamedBufferSubData(const Context *context,
-                                BufferID buffer,
-                                GLintptr offset,
-                                GLsizeiptr size,
-                                const void *data)
-{
-    return true;
-}
-
-bool ValidateNamedFramebufferDrawBuffer(const Context *context,
-                                        FramebufferID framebuffer,
-                                        GLenum buf)
-{
-    return true;
-}
-
-bool ValidateNamedFramebufferDrawBuffers(const Context *context,
-                                         FramebufferID framebuffer,
-                                         GLsizei n,
-                                         const GLenum *bufs)
-{
-    return true;
-}
-
-bool ValidateNamedFramebufferParameteri(const Context *context,
-                                        FramebufferID framebuffer,
-                                        GLenum pname,
-                                        GLint param)
-{
-    return true;
-}
-
-bool ValidateNamedFramebufferReadBuffer(const Context *context,
-                                        FramebufferID framebuffer,
-                                        GLenum src)
-{
-    return true;
-}
-
-bool ValidateNamedFramebufferRenderbuffer(const Context *context,
-                                          FramebufferID framebuffer,
-                                          GLenum attachment,
-                                          GLenum renderbuffertarget,
-                                          RenderbufferID renderbuffer)
-{
-    return true;
-}
-
-bool ValidateNamedFramebufferTexture(const Context *context,
-                                     FramebufferID framebuffer,
-                                     GLenum attachment,
-                                     TextureID texture,
-                                     GLint level)
-{
-    return true;
-}
-
-bool ValidateNamedFramebufferTextureLayer(const Context *context,
-                                          FramebufferID framebuffer,
-                                          GLenum attachment,
-                                          TextureID texture,
-                                          GLint level,
-                                          GLint layer)
-{
-    return true;
-}
-
-bool ValidateNamedRenderbufferStorage(const Context *context,
-                                      RenderbufferID renderbuffer,
-                                      GLenum internalformat,
-                                      GLsizei width,
-                                      GLsizei height)
-{
-    return true;
-}
-
-bool ValidateNamedRenderbufferStorageMultisample(const Context *context,
-                                                 RenderbufferID renderbuffer,
-                                                 GLsizei samples,
-                                                 GLenum internalformat,
-                                                 GLsizei width,
-                                                 GLsizei height)
-{
-    return true;
-}
-
-bool ValidateTextureBarrier(const Context *context)
-{
-    return true;
-}
-
-bool ValidateTextureBuffer(const Context *context,
-                           TextureID texture,
-                           GLenum internalformat,
-                           BufferID buffer)
-{
-    return true;
-}
-
-bool ValidateTextureBufferRange(const Context *context,
-                                TextureID texture,
-                                GLenum internalformat,
-                                BufferID buffer,
-                                GLintptr offset,
-                                GLsizeiptr size)
-{
-    return true;
-}
-
-bool ValidateTextureParameterIiv(const Context *context,
-                                 TextureID texture,
-                                 GLenum pname,
-                                 const GLint *params)
-{
-    return true;
-}
-
-bool ValidateTextureParameterIuiv(const Context *context,
-                                  TextureID texture,
-                                  GLenum pname,
-                                  const GLuint *params)
-{
-    return true;
-}
-
-bool ValidateTextureParameterf(const Context *context,
-                               TextureID texture,
-                               GLenum pname,
-                               GLfloat param)
-{
-    return true;
-}
-
-bool ValidateTextureParameterfv(const Context *context,
-                                TextureID texture,
-                                GLenum pname,
-                                const GLfloat *param)
-{
-    return true;
-}
-
-bool ValidateTextureParameteri(const Context *context, TextureID texture, GLenum pname, GLint param)
-{
-    return true;
-}
-
-bool ValidateTextureParameteriv(const Context *context,
-                                TextureID texture,
-                                GLenum pname,
-                                const GLint *param)
-{
-    return true;
-}
-
-bool ValidateTextureStorage1D(const Context *context,
-                              TextureID texture,
-                              GLsizei levels,
-                              GLenum internalformat,
-                              GLsizei width)
-{
-    return true;
-}
-
-bool ValidateTextureStorage2D(const Context *context,
-                              TextureID texture,
-                              GLsizei levels,
-                              GLenum internalformat,
-                              GLsizei width,
-                              GLsizei height)
-{
-    return true;
-}
-
-bool ValidateTextureStorage2DMultisample(const Context *context,
-                                         TextureID texture,
-                                         GLsizei samples,
-                                         GLenum internalformat,
-                                         GLsizei width,
-                                         GLsizei height,
-                                         GLboolean fixedsamplelocations)
-{
-    return true;
-}
-
-bool ValidateTextureStorage3D(const Context *context,
-                              TextureID texture,
-                              GLsizei levels,
-                              GLenum internalformat,
-                              GLsizei width,
-                              GLsizei height,
-                              GLsizei depth)
-{
-    return true;
-}
-
-bool ValidateTextureStorage3DMultisample(const Context *context,
-                                         TextureID texture,
-                                         GLsizei samples,
-                                         GLenum internalformat,
-                                         GLsizei width,
-                                         GLsizei height,
-                                         GLsizei depth,
-                                         GLboolean fixedsamplelocations)
-{
-    return true;
-}
-
-bool ValidateTextureSubImage1D(const Context *context,
-                               TextureID texture,
-                               GLint level,
-                               GLint xoffset,
-                               GLsizei width,
-                               GLenum format,
-                               GLenum type,
-                               const void *pixels)
-{
-    return true;
-}
-
-bool ValidateTextureSubImage2D(const Context *context,
-                               TextureID texture,
-                               GLint level,
-                               GLint xoffset,
-                               GLint yoffset,
-                               GLsizei width,
-                               GLsizei height,
-                               GLenum format,
-                               GLenum type,
-                               const void *pixels)
-{
-    return true;
-}
-
-bool ValidateTextureSubImage3D(const Context *context,
-                               TextureID texture,
-                               GLint level,
-                               GLint xoffset,
-                               GLint yoffset,
-                               GLint zoffset,
-                               GLsizei width,
-                               GLsizei height,
-                               GLsizei depth,
-                               GLenum format,
-                               GLenum type,
-                               const void *pixels)
-{
-    return true;
-}
-
-bool ValidateTransformFeedbackBufferBase(const Context *context,
-                                         GLuint xfb,
-                                         GLuint index,
-                                         BufferID buffer)
-{
-    return true;
-}
-
-bool ValidateTransformFeedbackBufferRange(const Context *context,
-                                          GLuint xfb,
-                                          GLuint index,
-                                          BufferID buffer,
-                                          GLintptr offset,
-                                          GLsizeiptr size)
-{
-    return true;
-}
-
-bool ValidateUnmapNamedBuffer(const Context *context, BufferID buffer)
-{
-    return true;
-}
-
-bool ValidateVertexArrayAttribBinding(const Context *context,
-                                      VertexArrayID vaobj,
-                                      GLuint attribindex,
-                                      GLuint bindingindex)
-{
-    return true;
-}
-
-bool ValidateVertexArrayAttribFormat(const Context *context,
-                                     VertexArrayID vaobj,
-                                     GLuint attribindex,
-                                     GLint size,
-                                     GLenum type,
-                                     GLboolean normalized,
-                                     GLuint relativeoffset)
-{
-    return true;
-}
-
-bool ValidateVertexArrayAttribIFormat(const Context *context,
-                                      VertexArrayID vaobj,
-                                      GLuint attribindex,
-                                      GLint size,
-                                      GLenum type,
-                                      GLuint relativeoffset)
-{
-    return true;
-}
-
-bool ValidateVertexArrayAttribLFormat(const Context *context,
-                                      VertexArrayID vaobj,
-                                      GLuint attribindex,
-                                      GLint size,
-                                      GLenum type,
-                                      GLuint relativeoffset)
-{
-    return true;
-}
-
-bool ValidateVertexArrayBindingDivisor(const Context *context,
-                                       VertexArrayID vaobj,
-                                       GLuint bindingindex,
-                                       GLuint divisor)
-{
-    return true;
-}
-
-bool ValidateVertexArrayElementBuffer(const Context *context, VertexArrayID vaobj, BufferID buffer)
-{
-    return true;
-}
-
-bool ValidateVertexArrayVertexBuffer(const Context *context,
-                                     VertexArrayID vaobj,
-                                     GLuint bindingindex,
-                                     BufferID buffer,
-                                     GLintptr offset,
-                                     GLsizei stride)
-{
-    return true;
-}
-
-bool ValidateVertexArrayVertexBuffers(const Context *context,
-                                      VertexArrayID vaobj,
-                                      GLuint first,
-                                      GLsizei count,
-                                      const BufferID *buffers,
-                                      const GLintptr *offsets,
-                                      const GLsizei *strides)
-{
-    return true;
-}
-
-}  // namespace gl
diff --git a/src/libANGLE/validationGL45_autogen.h b/src/libANGLE/validationGL45_autogen.h
index cb88064..7719f84 100644
--- a/src/libANGLE/validationGL45_autogen.h
+++ b/src/libANGLE/validationGL45_autogen.h
@@ -1,5 +1,5 @@
 // GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml and wgl.xml.
+// Generated by generate_entry_points.py using data from gl.xml.
 //
 // Copyright 2020 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
diff --git a/src/libANGLE/validationGL46.cpp b/src/libANGLE/validationGL46.cpp
deleted file mode 100644
index 44dfe76..0000000
--- a/src/libANGLE/validationGL46.cpp
+++ /dev/null
@@ -1,53 +0,0 @@
-//
-// Copyright 2019 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// validationGL46.cpp: Validation functions for OpenGL 4.6 entry point parameters
-
-#include "libANGLE/validationGL46_autogen.h"
-
-namespace gl
-{
-
-bool ValidateMultiDrawArraysIndirectCount(const Context *context,
-                                          GLenum mode,
-                                          const void *indirect,
-                                          GLintptr drawcount,
-                                          GLsizei maxdrawcount,
-                                          GLsizei stride)
-{
-    return true;
-}
-
-bool ValidateMultiDrawElementsIndirectCount(const Context *context,
-                                            GLenum mode,
-                                            GLenum type,
-                                            const void *indirect,
-                                            GLintptr drawcount,
-                                            GLsizei maxdrawcount,
-                                            GLsizei stride)
-{
-    return true;
-}
-
-bool ValidatePolygonOffsetClamp(const Context *context,
-                                GLfloat factor,
-                                GLfloat units,
-                                GLfloat clamp)
-{
-    return true;
-}
-
-bool ValidateSpecializeShader(const Context *context,
-                              GLuint shader,
-                              const GLchar *pEntryPoint,
-                              GLuint numSpecializationConstants,
-                              const GLuint *pConstantIndex,
-                              const GLuint *pConstantValue)
-{
-    return true;
-}
-
-}  // namespace gl
diff --git a/src/libANGLE/validationGL46_autogen.h b/src/libANGLE/validationGL46_autogen.h
index d479b14..bf1e2a2 100644
--- a/src/libANGLE/validationGL46_autogen.h
+++ b/src/libANGLE/validationGL46_autogen.h
@@ -1,5 +1,5 @@
 // GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml and wgl.xml.
+// Generated by generate_entry_points.py using data from gl.xml.
 //
 // Copyright 2020 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
diff --git a/src/libANGLE/validationGL4_autogen.h b/src/libANGLE/validationGL4_autogen.h
index 8043f7d..54ad232 100644
--- a/src/libANGLE/validationGL4_autogen.h
+++ b/src/libANGLE/validationGL4_autogen.h
@@ -1,12 +1,12 @@
 // GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml and wgl.xml.
+// Generated by generate_entry_points.py using data from gl.xml.
 //
 // Copyright 2020 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
 // validationGL4_autogen.h:
-//   Validation functions for the OpenGL 4.0 entry points.
+//   Validation functions for the OpenGL Desktop GL 4.x entry points.
 
 #ifndef LIBANGLE_VALIDATION_GL4_AUTOGEN_H_
 #define LIBANGLE_VALIDATION_GL4_AUTOGEN_H_
@@ -17,6 +17,7 @@
 {
 class Context;
 
+// GL 4.0
 bool ValidateBeginQueryIndexed(const Context *context,
                                GLenum target,
                                GLuint index,
@@ -157,6 +158,939 @@
                                    GLenum shadertype,
                                    GLsizei count,
                                    const GLuint *indices);
+
+// GL 4.1
+bool ValidateDepthRangeArrayv(const Context *context,
+                              GLuint first,
+                              GLsizei count,
+                              const GLdouble *v);
+bool ValidateDepthRangeIndexed(const Context *context, GLuint index, GLdouble n, GLdouble f);
+bool ValidateGetDoublei_v(const Context *context,
+                          GLenum target,
+                          GLuint index,
+                          const GLdouble *data);
+bool ValidateGetFloati_v(const Context *context, GLenum target, GLuint index, const GLfloat *data);
+bool ValidateGetVertexAttribLdv(const Context *context,
+                                GLuint index,
+                                GLenum pname,
+                                const GLdouble *params);
+bool ValidateProgramUniform1d(const Context *context,
+                              ShaderProgramID programPacked,
+                              UniformLocation locationPacked,
+                              GLdouble v0);
+bool ValidateProgramUniform1dv(const Context *context,
+                               ShaderProgramID programPacked,
+                               UniformLocation locationPacked,
+                               GLsizei count,
+                               const GLdouble *value);
+bool ValidateProgramUniform2d(const Context *context,
+                              ShaderProgramID programPacked,
+                              UniformLocation locationPacked,
+                              GLdouble v0,
+                              GLdouble v1);
+bool ValidateProgramUniform2dv(const Context *context,
+                               ShaderProgramID programPacked,
+                               UniformLocation locationPacked,
+                               GLsizei count,
+                               const GLdouble *value);
+bool ValidateProgramUniform3d(const Context *context,
+                              ShaderProgramID programPacked,
+                              UniformLocation locationPacked,
+                              GLdouble v0,
+                              GLdouble v1,
+                              GLdouble v2);
+bool ValidateProgramUniform3dv(const Context *context,
+                               ShaderProgramID programPacked,
+                               UniformLocation locationPacked,
+                               GLsizei count,
+                               const GLdouble *value);
+bool ValidateProgramUniform4d(const Context *context,
+                              ShaderProgramID programPacked,
+                              UniformLocation locationPacked,
+                              GLdouble v0,
+                              GLdouble v1,
+                              GLdouble v2,
+                              GLdouble v3);
+bool ValidateProgramUniform4dv(const Context *context,
+                               ShaderProgramID programPacked,
+                               UniformLocation locationPacked,
+                               GLsizei count,
+                               const GLdouble *value);
+bool ValidateProgramUniformMatrix2dv(const Context *context,
+                                     ShaderProgramID programPacked,
+                                     UniformLocation locationPacked,
+                                     GLsizei count,
+                                     GLboolean transpose,
+                                     const GLdouble *value);
+bool ValidateProgramUniformMatrix2x3dv(const Context *context,
+                                       ShaderProgramID programPacked,
+                                       UniformLocation locationPacked,
+                                       GLsizei count,
+                                       GLboolean transpose,
+                                       const GLdouble *value);
+bool ValidateProgramUniformMatrix2x4dv(const Context *context,
+                                       ShaderProgramID programPacked,
+                                       UniformLocation locationPacked,
+                                       GLsizei count,
+                                       GLboolean transpose,
+                                       const GLdouble *value);
+bool ValidateProgramUniformMatrix3dv(const Context *context,
+                                     ShaderProgramID programPacked,
+                                     UniformLocation locationPacked,
+                                     GLsizei count,
+                                     GLboolean transpose,
+                                     const GLdouble *value);
+bool ValidateProgramUniformMatrix3x2dv(const Context *context,
+                                       ShaderProgramID programPacked,
+                                       UniformLocation locationPacked,
+                                       GLsizei count,
+                                       GLboolean transpose,
+                                       const GLdouble *value);
+bool ValidateProgramUniformMatrix3x4dv(const Context *context,
+                                       ShaderProgramID programPacked,
+                                       UniformLocation locationPacked,
+                                       GLsizei count,
+                                       GLboolean transpose,
+                                       const GLdouble *value);
+bool ValidateProgramUniformMatrix4dv(const Context *context,
+                                     ShaderProgramID programPacked,
+                                     UniformLocation locationPacked,
+                                     GLsizei count,
+                                     GLboolean transpose,
+                                     const GLdouble *value);
+bool ValidateProgramUniformMatrix4x2dv(const Context *context,
+                                       ShaderProgramID programPacked,
+                                       UniformLocation locationPacked,
+                                       GLsizei count,
+                                       GLboolean transpose,
+                                       const GLdouble *value);
+bool ValidateProgramUniformMatrix4x3dv(const Context *context,
+                                       ShaderProgramID programPacked,
+                                       UniformLocation locationPacked,
+                                       GLsizei count,
+                                       GLboolean transpose,
+                                       const GLdouble *value);
+bool ValidateScissorArrayv(const Context *context, GLuint first, GLsizei count, const GLint *v);
+bool ValidateScissorIndexed(const Context *context,
+                            GLuint index,
+                            GLint left,
+                            GLint bottom,
+                            GLsizei width,
+                            GLsizei height);
+bool ValidateScissorIndexedv(const Context *context, GLuint index, const GLint *v);
+bool ValidateVertexAttribL1d(const Context *context, GLuint index, GLdouble x);
+bool ValidateVertexAttribL1dv(const Context *context, GLuint index, const GLdouble *v);
+bool ValidateVertexAttribL2d(const Context *context, GLuint index, GLdouble x, GLdouble y);
+bool ValidateVertexAttribL2dv(const Context *context, GLuint index, const GLdouble *v);
+bool ValidateVertexAttribL3d(const Context *context,
+                             GLuint index,
+                             GLdouble x,
+                             GLdouble y,
+                             GLdouble z);
+bool ValidateVertexAttribL3dv(const Context *context, GLuint index, const GLdouble *v);
+bool ValidateVertexAttribL4d(const Context *context,
+                             GLuint index,
+                             GLdouble x,
+                             GLdouble y,
+                             GLdouble z,
+                             GLdouble w);
+bool ValidateVertexAttribL4dv(const Context *context, GLuint index, const GLdouble *v);
+bool ValidateVertexAttribLPointer(const Context *context,
+                                  GLuint index,
+                                  GLint size,
+                                  GLenum type,
+                                  GLsizei stride,
+                                  const void *pointer);
+bool ValidateViewportArrayv(const Context *context, GLuint first, GLsizei count, const GLfloat *v);
+bool ValidateViewportIndexedf(const Context *context,
+                              GLuint index,
+                              GLfloat x,
+                              GLfloat y,
+                              GLfloat w,
+                              GLfloat h);
+bool ValidateViewportIndexedfv(const Context *context, GLuint index, const GLfloat *v);
+
+// GL 4.2
+bool ValidateDrawArraysInstancedBaseInstance(const Context *context,
+                                             PrimitiveMode modePacked,
+                                             GLint first,
+                                             GLsizei count,
+                                             GLsizei instancecount,
+                                             GLuint baseinstance);
+bool ValidateDrawElementsInstancedBaseInstance(const Context *context,
+                                               GLenum mode,
+                                               GLsizei count,
+                                               GLenum type,
+                                               const void *indices,
+                                               GLsizei instancecount,
+                                               GLuint baseinstance);
+bool ValidateDrawElementsInstancedBaseVertexBaseInstance(const Context *context,
+                                                         PrimitiveMode modePacked,
+                                                         GLsizei count,
+                                                         DrawElementsType typePacked,
+                                                         const void *indices,
+                                                         GLsizei instancecount,
+                                                         GLint basevertex,
+                                                         GLuint baseinstance);
+bool ValidateDrawTransformFeedbackInstanced(const Context *context,
+                                            GLenum mode,
+                                            TransformFeedbackID idPacked,
+                                            GLsizei instancecount);
+bool ValidateDrawTransformFeedbackStreamInstanced(const Context *context,
+                                                  GLenum mode,
+                                                  TransformFeedbackID idPacked,
+                                                  GLuint stream,
+                                                  GLsizei instancecount);
+bool ValidateGetActiveAtomicCounterBufferiv(const Context *context,
+                                            ShaderProgramID programPacked,
+                                            GLuint bufferIndex,
+                                            GLenum pname,
+                                            const GLint *params);
+bool ValidateTexStorage1D(const Context *context,
+                          GLenum target,
+                          GLsizei levels,
+                          GLenum internalformat,
+                          GLsizei width);
+
+// GL 4.3
+bool ValidateClearBufferData(const Context *context,
+                             GLenum target,
+                             GLenum internalformat,
+                             GLenum format,
+                             GLenum type,
+                             const void *data);
+bool ValidateClearBufferSubData(const Context *context,
+                                GLenum target,
+                                GLenum internalformat,
+                                GLintptr offset,
+                                GLsizeiptr size,
+                                GLenum format,
+                                GLenum type,
+                                const void *data);
+bool ValidateGetInternalformati64v(const Context *context,
+                                   GLenum target,
+                                   GLenum internalformat,
+                                   GLenum pname,
+                                   GLsizei bufSize,
+                                   const GLint64 *params);
+bool ValidateGetProgramResourceLocationIndex(const Context *context,
+                                             ShaderProgramID programPacked,
+                                             GLenum programInterface,
+                                             const GLchar *name);
+bool ValidateInvalidateBufferData(const Context *context, BufferID bufferPacked);
+bool ValidateInvalidateBufferSubData(const Context *context,
+                                     BufferID bufferPacked,
+                                     GLintptr offset,
+                                     GLsizeiptr length);
+bool ValidateInvalidateTexImage(const Context *context, TextureID texturePacked, GLint level);
+bool ValidateInvalidateTexSubImage(const Context *context,
+                                   TextureID texturePacked,
+                                   GLint level,
+                                   GLint xoffset,
+                                   GLint yoffset,
+                                   GLint zoffset,
+                                   GLsizei width,
+                                   GLsizei height,
+                                   GLsizei depth);
+bool ValidateMultiDrawArraysIndirect(const Context *context,
+                                     GLenum mode,
+                                     const void *indirect,
+                                     GLsizei drawcount,
+                                     GLsizei stride);
+bool ValidateMultiDrawElementsIndirect(const Context *context,
+                                       GLenum mode,
+                                       GLenum type,
+                                       const void *indirect,
+                                       GLsizei drawcount,
+                                       GLsizei stride);
+bool ValidateShaderStorageBlockBinding(const Context *context,
+                                       ShaderProgramID programPacked,
+                                       GLuint storageBlockIndex,
+                                       GLuint storageBlockBinding);
+bool ValidateTextureView(const Context *context,
+                         TextureID texturePacked,
+                         GLenum target,
+                         GLuint origtexture,
+                         GLenum internalformat,
+                         GLuint minlevel,
+                         GLuint numlevels,
+                         GLuint minlayer,
+                         GLuint numlayers);
+bool ValidateVertexAttribLFormat(const Context *context,
+                                 GLuint attribindex,
+                                 GLint size,
+                                 GLenum type,
+                                 GLuint relativeoffset);
+
+// GL 4.4
+bool ValidateBindBuffersBase(const Context *context,
+                             GLenum target,
+                             GLuint first,
+                             GLsizei count,
+                             const BufferID *buffersPacked);
+bool ValidateBindBuffersRange(const Context *context,
+                              GLenum target,
+                              GLuint first,
+                              GLsizei count,
+                              const BufferID *buffersPacked,
+                              const GLintptr *offsets,
+                              const GLsizeiptr *sizes);
+bool ValidateBindImageTextures(const Context *context,
+                               GLuint first,
+                               GLsizei count,
+                               const GLuint *textures);
+bool ValidateBindSamplers(const Context *context,
+                          GLuint first,
+                          GLsizei count,
+                          const GLuint *samplers);
+bool ValidateBindTextures(const Context *context,
+                          GLuint first,
+                          GLsizei count,
+                          const GLuint *textures);
+bool ValidateBindVertexBuffers(const Context *context,
+                               GLuint first,
+                               GLsizei count,
+                               const BufferID *buffersPacked,
+                               const GLintptr *offsets,
+                               const GLsizei *strides);
+bool ValidateBufferStorage(const Context *context,
+                           BufferBinding targetPacked,
+                           GLsizeiptr size,
+                           const void *data,
+                           GLbitfield flags);
+bool ValidateClearTexImage(const Context *context,
+                           TextureID texturePacked,
+                           GLint level,
+                           GLenum format,
+                           GLenum type,
+                           const void *data);
+bool ValidateClearTexSubImage(const Context *context,
+                              TextureID texturePacked,
+                              GLint level,
+                              GLint xoffset,
+                              GLint yoffset,
+                              GLint zoffset,
+                              GLsizei width,
+                              GLsizei height,
+                              GLsizei depth,
+                              GLenum format,
+                              GLenum type,
+                              const void *data);
+
+// GL 4.5
+bool ValidateBindTextureUnit(const Context *context, GLuint unit, TextureID texturePacked);
+bool ValidateBlitNamedFramebuffer(const Context *context,
+                                  GLuint readFramebuffer,
+                                  GLuint drawFramebuffer,
+                                  GLint srcX0,
+                                  GLint srcY0,
+                                  GLint srcX1,
+                                  GLint srcY1,
+                                  GLint dstX0,
+                                  GLint dstY0,
+                                  GLint dstX1,
+                                  GLint dstY1,
+                                  GLbitfield mask,
+                                  GLenum filter);
+bool ValidateCheckNamedFramebufferStatus(const Context *context,
+                                         FramebufferID framebufferPacked,
+                                         GLenum target);
+bool ValidateClearNamedBufferData(const Context *context,
+                                  BufferID bufferPacked,
+                                  GLenum internalformat,
+                                  GLenum format,
+                                  GLenum type,
+                                  const void *data);
+bool ValidateClearNamedBufferSubData(const Context *context,
+                                     BufferID bufferPacked,
+                                     GLenum internalformat,
+                                     GLintptr offset,
+                                     GLsizeiptr size,
+                                     GLenum format,
+                                     GLenum type,
+                                     const void *data);
+bool ValidateClearNamedFramebufferfi(const Context *context,
+                                     FramebufferID framebufferPacked,
+                                     GLenum buffer,
+                                     GLint drawbuffer,
+                                     GLfloat depth,
+                                     GLint stencil);
+bool ValidateClearNamedFramebufferfv(const Context *context,
+                                     FramebufferID framebufferPacked,
+                                     GLenum buffer,
+                                     GLint drawbuffer,
+                                     const GLfloat *value);
+bool ValidateClearNamedFramebufferiv(const Context *context,
+                                     FramebufferID framebufferPacked,
+                                     GLenum buffer,
+                                     GLint drawbuffer,
+                                     const GLint *value);
+bool ValidateClearNamedFramebufferuiv(const Context *context,
+                                      FramebufferID framebufferPacked,
+                                      GLenum buffer,
+                                      GLint drawbuffer,
+                                      const GLuint *value);
+bool ValidateClipControl(const Context *context, GLenum origin, GLenum depth);
+bool ValidateCompressedTextureSubImage1D(const Context *context,
+                                         TextureID texturePacked,
+                                         GLint level,
+                                         GLint xoffset,
+                                         GLsizei width,
+                                         GLenum format,
+                                         GLsizei imageSize,
+                                         const void *data);
+bool ValidateCompressedTextureSubImage2D(const Context *context,
+                                         TextureID texturePacked,
+                                         GLint level,
+                                         GLint xoffset,
+                                         GLint yoffset,
+                                         GLsizei width,
+                                         GLsizei height,
+                                         GLenum format,
+                                         GLsizei imageSize,
+                                         const void *data);
+bool ValidateCompressedTextureSubImage3D(const Context *context,
+                                         TextureID texturePacked,
+                                         GLint level,
+                                         GLint xoffset,
+                                         GLint yoffset,
+                                         GLint zoffset,
+                                         GLsizei width,
+                                         GLsizei height,
+                                         GLsizei depth,
+                                         GLenum format,
+                                         GLsizei imageSize,
+                                         const void *data);
+bool ValidateCopyNamedBufferSubData(const Context *context,
+                                    GLuint readBuffer,
+                                    GLuint writeBuffer,
+                                    GLintptr readOffset,
+                                    GLintptr writeOffset,
+                                    GLsizeiptr size);
+bool ValidateCopyTextureSubImage1D(const Context *context,
+                                   TextureID texturePacked,
+                                   GLint level,
+                                   GLint xoffset,
+                                   GLint x,
+                                   GLint y,
+                                   GLsizei width);
+bool ValidateCopyTextureSubImage2D(const Context *context,
+                                   TextureID texturePacked,
+                                   GLint level,
+                                   GLint xoffset,
+                                   GLint yoffset,
+                                   GLint x,
+                                   GLint y,
+                                   GLsizei width,
+                                   GLsizei height);
+bool ValidateCopyTextureSubImage3D(const Context *context,
+                                   TextureID texturePacked,
+                                   GLint level,
+                                   GLint xoffset,
+                                   GLint yoffset,
+                                   GLint zoffset,
+                                   GLint x,
+                                   GLint y,
+                                   GLsizei width,
+                                   GLsizei height);
+bool ValidateCreateBuffers(const Context *context, GLsizei n, const BufferID *buffersPacked);
+bool ValidateCreateFramebuffers(const Context *context, GLsizei n, const GLuint *framebuffers);
+bool ValidateCreateProgramPipelines(const Context *context, GLsizei n, const GLuint *pipelines);
+bool ValidateCreateQueries(const Context *context, GLenum target, GLsizei n, const GLuint *ids);
+bool ValidateCreateRenderbuffers(const Context *context,
+                                 GLsizei n,
+                                 const RenderbufferID *renderbuffersPacked);
+bool ValidateCreateSamplers(const Context *context, GLsizei n, const GLuint *samplers);
+bool ValidateCreateTextures(const Context *context,
+                            GLenum target,
+                            GLsizei n,
+                            const GLuint *textures);
+bool ValidateCreateTransformFeedbacks(const Context *context, GLsizei n, const GLuint *ids);
+bool ValidateCreateVertexArrays(const Context *context,
+                                GLsizei n,
+                                const VertexArrayID *arraysPacked);
+bool ValidateDisableVertexArrayAttrib(const Context *context,
+                                      VertexArrayID vaobjPacked,
+                                      GLuint index);
+bool ValidateEnableVertexArrayAttrib(const Context *context,
+                                     VertexArrayID vaobjPacked,
+                                     GLuint index);
+bool ValidateFlushMappedNamedBufferRange(const Context *context,
+                                         BufferID bufferPacked,
+                                         GLintptr offset,
+                                         GLsizeiptr length);
+bool ValidateGenerateTextureMipmap(const Context *context, TextureID texturePacked);
+bool ValidateGetCompressedTextureImage(const Context *context,
+                                       TextureID texturePacked,
+                                       GLint level,
+                                       GLsizei bufSize,
+                                       const void *pixels);
+bool ValidateGetCompressedTextureSubImage(const Context *context,
+                                          TextureID texturePacked,
+                                          GLint level,
+                                          GLint xoffset,
+                                          GLint yoffset,
+                                          GLint zoffset,
+                                          GLsizei width,
+                                          GLsizei height,
+                                          GLsizei depth,
+                                          GLsizei bufSize,
+                                          const void *pixels);
+bool ValidateGetNamedBufferParameteri64v(const Context *context,
+                                         BufferID bufferPacked,
+                                         GLenum pname,
+                                         const GLint64 *params);
+bool ValidateGetNamedBufferParameteriv(const Context *context,
+                                       BufferID bufferPacked,
+                                       GLenum pname,
+                                       const GLint *params);
+bool ValidateGetNamedBufferPointerv(const Context *context,
+                                    BufferID bufferPacked,
+                                    GLenum pname,
+                                    void *const *params);
+bool ValidateGetNamedBufferSubData(const Context *context,
+                                   BufferID bufferPacked,
+                                   GLintptr offset,
+                                   GLsizeiptr size,
+                                   const void *data);
+bool ValidateGetNamedFramebufferAttachmentParameteriv(const Context *context,
+                                                      FramebufferID framebufferPacked,
+                                                      GLenum attachment,
+                                                      GLenum pname,
+                                                      const GLint *params);
+bool ValidateGetNamedFramebufferParameteriv(const Context *context,
+                                            FramebufferID framebufferPacked,
+                                            GLenum pname,
+                                            const GLint *param);
+bool ValidateGetNamedRenderbufferParameteriv(const Context *context,
+                                             RenderbufferID renderbufferPacked,
+                                             GLenum pname,
+                                             const GLint *params);
+bool ValidateGetQueryBufferObjecti64v(const Context *context,
+                                      GLuint id,
+                                      BufferID bufferPacked,
+                                      GLenum pname,
+                                      GLintptr offset);
+bool ValidateGetQueryBufferObjectiv(const Context *context,
+                                    GLuint id,
+                                    BufferID bufferPacked,
+                                    GLenum pname,
+                                    GLintptr offset);
+bool ValidateGetQueryBufferObjectui64v(const Context *context,
+                                       GLuint id,
+                                       BufferID bufferPacked,
+                                       GLenum pname,
+                                       GLintptr offset);
+bool ValidateGetQueryBufferObjectuiv(const Context *context,
+                                     GLuint id,
+                                     BufferID bufferPacked,
+                                     GLenum pname,
+                                     GLintptr offset);
+bool ValidateGetTextureImage(const Context *context,
+                             TextureID texturePacked,
+                             GLint level,
+                             GLenum format,
+                             GLenum type,
+                             GLsizei bufSize,
+                             const void *pixels);
+bool ValidateGetTextureLevelParameterfv(const Context *context,
+                                        TextureID texturePacked,
+                                        GLint level,
+                                        GLenum pname,
+                                        const GLfloat *params);
+bool ValidateGetTextureLevelParameteriv(const Context *context,
+                                        TextureID texturePacked,
+                                        GLint level,
+                                        GLenum pname,
+                                        const GLint *params);
+bool ValidateGetTextureParameterIiv(const Context *context,
+                                    TextureID texturePacked,
+                                    GLenum pname,
+                                    const GLint *params);
+bool ValidateGetTextureParameterIuiv(const Context *context,
+                                     TextureID texturePacked,
+                                     GLenum pname,
+                                     const GLuint *params);
+bool ValidateGetTextureParameterfv(const Context *context,
+                                   TextureID texturePacked,
+                                   GLenum pname,
+                                   const GLfloat *params);
+bool ValidateGetTextureParameteriv(const Context *context,
+                                   TextureID texturePacked,
+                                   GLenum pname,
+                                   const GLint *params);
+bool ValidateGetTextureSubImage(const Context *context,
+                                TextureID texturePacked,
+                                GLint level,
+                                GLint xoffset,
+                                GLint yoffset,
+                                GLint zoffset,
+                                GLsizei width,
+                                GLsizei height,
+                                GLsizei depth,
+                                GLenum format,
+                                GLenum type,
+                                GLsizei bufSize,
+                                const void *pixels);
+bool ValidateGetTransformFeedbacki64_v(const Context *context,
+                                       GLuint xfb,
+                                       GLenum pname,
+                                       GLuint index,
+                                       const GLint64 *param);
+bool ValidateGetTransformFeedbacki_v(const Context *context,
+                                     GLuint xfb,
+                                     GLenum pname,
+                                     GLuint index,
+                                     const GLint *param);
+bool ValidateGetTransformFeedbackiv(const Context *context,
+                                    GLuint xfb,
+                                    GLenum pname,
+                                    const GLint *param);
+bool ValidateGetVertexArrayIndexed64iv(const Context *context,
+                                       VertexArrayID vaobjPacked,
+                                       GLuint index,
+                                       GLenum pname,
+                                       const GLint64 *param);
+bool ValidateGetVertexArrayIndexediv(const Context *context,
+                                     VertexArrayID vaobjPacked,
+                                     GLuint index,
+                                     GLenum pname,
+                                     const GLint *param);
+bool ValidateGetVertexArrayiv(const Context *context,
+                              VertexArrayID vaobjPacked,
+                              GLenum pname,
+                              const GLint *param);
+bool ValidateGetnColorTable(const Context *context,
+                            GLenum target,
+                            GLenum format,
+                            GLenum type,
+                            GLsizei bufSize,
+                            const void *table);
+bool ValidateGetnCompressedTexImage(const Context *context,
+                                    GLenum target,
+                                    GLint lod,
+                                    GLsizei bufSize,
+                                    const void *pixels);
+bool ValidateGetnConvolutionFilter(const Context *context,
+                                   GLenum target,
+                                   GLenum format,
+                                   GLenum type,
+                                   GLsizei bufSize,
+                                   const void *image);
+bool ValidateGetnHistogram(const Context *context,
+                           GLenum target,
+                           GLboolean reset,
+                           GLenum format,
+                           GLenum type,
+                           GLsizei bufSize,
+                           const void *values);
+bool ValidateGetnMapdv(const Context *context,
+                       GLenum target,
+                       GLenum query,
+                       GLsizei bufSize,
+                       const GLdouble *v);
+bool ValidateGetnMapfv(const Context *context,
+                       GLenum target,
+                       GLenum query,
+                       GLsizei bufSize,
+                       const GLfloat *v);
+bool ValidateGetnMapiv(const Context *context,
+                       GLenum target,
+                       GLenum query,
+                       GLsizei bufSize,
+                       const GLint *v);
+bool ValidateGetnMinmax(const Context *context,
+                        GLenum target,
+                        GLboolean reset,
+                        GLenum format,
+                        GLenum type,
+                        GLsizei bufSize,
+                        const void *values);
+bool ValidateGetnPixelMapfv(const Context *context,
+                            GLenum map,
+                            GLsizei bufSize,
+                            const GLfloat *values);
+bool ValidateGetnPixelMapuiv(const Context *context,
+                             GLenum map,
+                             GLsizei bufSize,
+                             const GLuint *values);
+bool ValidateGetnPixelMapusv(const Context *context,
+                             GLenum map,
+                             GLsizei bufSize,
+                             const GLushort *values);
+bool ValidateGetnPolygonStipple(const Context *context, GLsizei bufSize, const GLubyte *pattern);
+bool ValidateGetnSeparableFilter(const Context *context,
+                                 GLenum target,
+                                 GLenum format,
+                                 GLenum type,
+                                 GLsizei rowBufSize,
+                                 const void *row,
+                                 GLsizei columnBufSize,
+                                 const void *column,
+                                 const void *span);
+bool ValidateGetnTexImage(const Context *context,
+                          GLenum target,
+                          GLint level,
+                          GLenum format,
+                          GLenum type,
+                          GLsizei bufSize,
+                          const void *pixels);
+bool ValidateGetnUniformdv(const Context *context,
+                           ShaderProgramID programPacked,
+                           UniformLocation locationPacked,
+                           GLsizei bufSize,
+                           const GLdouble *params);
+bool ValidateInvalidateNamedFramebufferData(const Context *context,
+                                            FramebufferID framebufferPacked,
+                                            GLsizei numAttachments,
+                                            const GLenum *attachments);
+bool ValidateInvalidateNamedFramebufferSubData(const Context *context,
+                                               FramebufferID framebufferPacked,
+                                               GLsizei numAttachments,
+                                               const GLenum *attachments,
+                                               GLint x,
+                                               GLint y,
+                                               GLsizei width,
+                                               GLsizei height);
+bool ValidateMapNamedBuffer(const Context *context, BufferID bufferPacked, GLenum access);
+bool ValidateMapNamedBufferRange(const Context *context,
+                                 BufferID bufferPacked,
+                                 GLintptr offset,
+                                 GLsizeiptr length,
+                                 GLbitfield access);
+bool ValidateNamedBufferData(const Context *context,
+                             BufferID bufferPacked,
+                             GLsizeiptr size,
+                             const void *data,
+                             GLenum usage);
+bool ValidateNamedBufferStorage(const Context *context,
+                                BufferID bufferPacked,
+                                GLsizeiptr size,
+                                const void *data,
+                                GLbitfield flags);
+bool ValidateNamedBufferSubData(const Context *context,
+                                BufferID bufferPacked,
+                                GLintptr offset,
+                                GLsizeiptr size,
+                                const void *data);
+bool ValidateNamedFramebufferDrawBuffer(const Context *context,
+                                        FramebufferID framebufferPacked,
+                                        GLenum buf);
+bool ValidateNamedFramebufferDrawBuffers(const Context *context,
+                                         FramebufferID framebufferPacked,
+                                         GLsizei n,
+                                         const GLenum *bufs);
+bool ValidateNamedFramebufferParameteri(const Context *context,
+                                        FramebufferID framebufferPacked,
+                                        GLenum pname,
+                                        GLint param);
+bool ValidateNamedFramebufferReadBuffer(const Context *context,
+                                        FramebufferID framebufferPacked,
+                                        GLenum src);
+bool ValidateNamedFramebufferRenderbuffer(const Context *context,
+                                          FramebufferID framebufferPacked,
+                                          GLenum attachment,
+                                          GLenum renderbuffertarget,
+                                          RenderbufferID renderbufferPacked);
+bool ValidateNamedFramebufferTexture(const Context *context,
+                                     FramebufferID framebufferPacked,
+                                     GLenum attachment,
+                                     TextureID texturePacked,
+                                     GLint level);
+bool ValidateNamedFramebufferTextureLayer(const Context *context,
+                                          FramebufferID framebufferPacked,
+                                          GLenum attachment,
+                                          TextureID texturePacked,
+                                          GLint level,
+                                          GLint layer);
+bool ValidateNamedRenderbufferStorage(const Context *context,
+                                      RenderbufferID renderbufferPacked,
+                                      GLenum internalformat,
+                                      GLsizei width,
+                                      GLsizei height);
+bool ValidateNamedRenderbufferStorageMultisample(const Context *context,
+                                                 RenderbufferID renderbufferPacked,
+                                                 GLsizei samples,
+                                                 GLenum internalformat,
+                                                 GLsizei width,
+                                                 GLsizei height);
+bool ValidateTextureBarrier(const Context *context);
+bool ValidateTextureBuffer(const Context *context,
+                           TextureID texturePacked,
+                           GLenum internalformat,
+                           BufferID bufferPacked);
+bool ValidateTextureBufferRange(const Context *context,
+                                TextureID texturePacked,
+                                GLenum internalformat,
+                                BufferID bufferPacked,
+                                GLintptr offset,
+                                GLsizeiptr size);
+bool ValidateTextureParameterIiv(const Context *context,
+                                 TextureID texturePacked,
+                                 GLenum pname,
+                                 const GLint *params);
+bool ValidateTextureParameterIuiv(const Context *context,
+                                  TextureID texturePacked,
+                                  GLenum pname,
+                                  const GLuint *params);
+bool ValidateTextureParameterf(const Context *context,
+                               TextureID texturePacked,
+                               GLenum pname,
+                               GLfloat param);
+bool ValidateTextureParameterfv(const Context *context,
+                                TextureID texturePacked,
+                                GLenum pname,
+                                const GLfloat *param);
+bool ValidateTextureParameteri(const Context *context,
+                               TextureID texturePacked,
+                               GLenum pname,
+                               GLint param);
+bool ValidateTextureParameteriv(const Context *context,
+                                TextureID texturePacked,
+                                GLenum pname,
+                                const GLint *param);
+bool ValidateTextureStorage1D(const Context *context,
+                              TextureID texturePacked,
+                              GLsizei levels,
+                              GLenum internalformat,
+                              GLsizei width);
+bool ValidateTextureStorage2D(const Context *context,
+                              TextureID texturePacked,
+                              GLsizei levels,
+                              GLenum internalformat,
+                              GLsizei width,
+                              GLsizei height);
+bool ValidateTextureStorage2DMultisample(const Context *context,
+                                         TextureID texturePacked,
+                                         GLsizei samples,
+                                         GLenum internalformat,
+                                         GLsizei width,
+                                         GLsizei height,
+                                         GLboolean fixedsamplelocations);
+bool ValidateTextureStorage3D(const Context *context,
+                              TextureID texturePacked,
+                              GLsizei levels,
+                              GLenum internalformat,
+                              GLsizei width,
+                              GLsizei height,
+                              GLsizei depth);
+bool ValidateTextureStorage3DMultisample(const Context *context,
+                                         TextureID texturePacked,
+                                         GLsizei samples,
+                                         GLenum internalformat,
+                                         GLsizei width,
+                                         GLsizei height,
+                                         GLsizei depth,
+                                         GLboolean fixedsamplelocations);
+bool ValidateTextureSubImage1D(const Context *context,
+                               TextureID texturePacked,
+                               GLint level,
+                               GLint xoffset,
+                               GLsizei width,
+                               GLenum format,
+                               GLenum type,
+                               const void *pixels);
+bool ValidateTextureSubImage2D(const Context *context,
+                               TextureID texturePacked,
+                               GLint level,
+                               GLint xoffset,
+                               GLint yoffset,
+                               GLsizei width,
+                               GLsizei height,
+                               GLenum format,
+                               GLenum type,
+                               const void *pixels);
+bool ValidateTextureSubImage3D(const Context *context,
+                               TextureID texturePacked,
+                               GLint level,
+                               GLint xoffset,
+                               GLint yoffset,
+                               GLint zoffset,
+                               GLsizei width,
+                               GLsizei height,
+                               GLsizei depth,
+                               GLenum format,
+                               GLenum type,
+                               const void *pixels);
+bool ValidateTransformFeedbackBufferBase(const Context *context,
+                                         GLuint xfb,
+                                         GLuint index,
+                                         BufferID bufferPacked);
+bool ValidateTransformFeedbackBufferRange(const Context *context,
+                                          GLuint xfb,
+                                          GLuint index,
+                                          BufferID bufferPacked,
+                                          GLintptr offset,
+                                          GLsizeiptr size);
+bool ValidateUnmapNamedBuffer(const Context *context, BufferID bufferPacked);
+bool ValidateVertexArrayAttribBinding(const Context *context,
+                                      VertexArrayID vaobjPacked,
+                                      GLuint attribindex,
+                                      GLuint bindingindex);
+bool ValidateVertexArrayAttribFormat(const Context *context,
+                                     VertexArrayID vaobjPacked,
+                                     GLuint attribindex,
+                                     GLint size,
+                                     GLenum type,
+                                     GLboolean normalized,
+                                     GLuint relativeoffset);
+bool ValidateVertexArrayAttribIFormat(const Context *context,
+                                      VertexArrayID vaobjPacked,
+                                      GLuint attribindex,
+                                      GLint size,
+                                      GLenum type,
+                                      GLuint relativeoffset);
+bool ValidateVertexArrayAttribLFormat(const Context *context,
+                                      VertexArrayID vaobjPacked,
+                                      GLuint attribindex,
+                                      GLint size,
+                                      GLenum type,
+                                      GLuint relativeoffset);
+bool ValidateVertexArrayBindingDivisor(const Context *context,
+                                       VertexArrayID vaobjPacked,
+                                       GLuint bindingindex,
+                                       GLuint divisor);
+bool ValidateVertexArrayElementBuffer(const Context *context,
+                                      VertexArrayID vaobjPacked,
+                                      BufferID bufferPacked);
+bool ValidateVertexArrayVertexBuffer(const Context *context,
+                                     VertexArrayID vaobjPacked,
+                                     GLuint bindingindex,
+                                     BufferID bufferPacked,
+                                     GLintptr offset,
+                                     GLsizei stride);
+bool ValidateVertexArrayVertexBuffers(const Context *context,
+                                      VertexArrayID vaobjPacked,
+                                      GLuint first,
+                                      GLsizei count,
+                                      const BufferID *buffersPacked,
+                                      const GLintptr *offsets,
+                                      const GLsizei *strides);
+
+// GL 4.6
+bool ValidateMultiDrawArraysIndirectCount(const Context *context,
+                                          GLenum mode,
+                                          const void *indirect,
+                                          GLintptr drawcount,
+                                          GLsizei maxdrawcount,
+                                          GLsizei stride);
+bool ValidateMultiDrawElementsIndirectCount(const Context *context,
+                                            GLenum mode,
+                                            GLenum type,
+                                            const void *indirect,
+                                            GLintptr drawcount,
+                                            GLsizei maxdrawcount,
+                                            GLsizei stride);
+bool ValidatePolygonOffsetClamp(const Context *context,
+                                GLfloat factor,
+                                GLfloat units,
+                                GLfloat clamp);
+bool ValidateSpecializeShader(const Context *context,
+                              GLuint shader,
+                              const GLchar *pEntryPoint,
+                              GLuint numSpecializationConstants,
+                              const GLuint *pConstantIndex,
+                              const GLuint *pConstantValue);
 }  // namespace gl
 
 #endif  // LIBANGLE_VALIDATION_GL4_AUTOGEN_H_
diff --git a/src/libEGL/libEGL.def b/src/libEGL/libEGL.def
deleted file mode 100644
index ca4ba68..0000000
--- a/src/libEGL/libEGL.def
+++ /dev/null
@@ -1,95 +0,0 @@
-LIBRARY libEGL
-EXPORTS
-    eglBindAPI                                  @14
-    eglBindTexImage                             @20
-    eglChooseConfig                             @7
-    eglCopyBuffers                              @33
-    eglCreateContext                            @23
-    eglCreatePbufferFromClientBuffer            @18
-    eglCreatePbufferSurface                     @10
-    eglCreatePixmapSurface                      @11
-    eglCreateWindowSurface                      @9
-    eglDestroyContext                           @24
-    eglDestroySurface                           @12
-    eglGetConfigAttrib                          @8
-    eglGetConfigs                               @6
-    eglGetCurrentContext                        @26
-    eglGetCurrentDisplay                        @28
-    eglGetCurrentSurface                        @27
-    eglGetDisplay                               @2
-    eglGetError                                 @1
-    eglGetProcAddress                           @34
-    eglInitialize                               @3
-    eglMakeCurrent                              @25
-    eglQueryAPI                                 @15
-    eglQueryContext                             @29
-    eglQueryString                              @5
-    eglQuerySurface                             @13
-    eglReleaseTexImage                          @21
-    eglReleaseThread                            @17
-    eglSurfaceAttrib                            @19
-    eglSwapBuffers                              @32
-    eglSwapInterval                             @22
-    eglTerminate                                @4
-    eglWaitClient                               @16
-    eglWaitGL                                   @30
-    eglWaitNative                               @31
-
-    ; Extensions
-    eglGetPlatformDisplayEXT                    @35
-    eglQuerySurfacePointerANGLE                 @36
-    eglPostSubBufferNV                          @37
-    eglQueryDisplayAttribEXT                    @48
-    eglQueryDeviceAttribEXT                     @49
-    eglQueryDeviceStringEXT                     @50
-    eglCreateImageKHR                           @51
-    eglDestroyImageKHR                          @52
-    eglCreateDeviceANGLE                        @53
-    eglReleaseDeviceANGLE                       @54
-    eglCreateStreamKHR                          @55
-    eglDestroyStreamKHR                         @56
-    eglStreamAttribKHR                          @57
-    eglQueryStreamKHR                           @58
-    eglQueryStreamu64KHR                        @59
-    eglStreamConsumerGLTextureExternalKHR       @60
-    eglStreamConsumerAcquireKHR                 @61
-    eglStreamConsumerReleaseKHR                 @62
-    eglStreamConsumerGLTextureExternalAttribsNV @63
-    eglCreateStreamProducerD3DTextureANGLE      @64
-    eglStreamPostD3DTextureANGLE                @65
-    eglGetSyncValuesCHROMIUM                    @66
-    eglSwapBuffersWithDamageKHR                 @67
-    eglProgramCacheGetAttribANGLE               @68
-    eglProgramCachePopulateANGLE                @69
-    eglProgramCacheQueryANGLE                   @70
-    eglProgramCacheResizeANGLE                  @71
-    eglCreatePlatformWindowSurfaceEXT           @72
-    eglCreatePlatformPixmapSurfaceEXT           @73
-    eglPresentationTimeANDROID                  @74
-    eglDebugMessageControlKHR                   @75
-    eglQueryDebugKHR                            @76
-    eglLabelObjectKHR                           @77
-    eglSetBlobCacheFuncsANDROID                 @78
-    eglQueryDisplayAttribANGLE                  @79
-    eglQueryStringiANGLE                        @80
-    eglGetNativeClientBufferANDROID             @81
-    eglDupNativeFenceFDANDROID                  @82
-    eglGetMscRateANGLE                          @83
-    eglCreateSyncKHR                            @84
-    eglDestroySyncKHR                           @85
-    eglClientWaitSyncKHR                        @86
-    eglGetSyncAttribKHR                         @87
-    eglWaitSyncKHR                              @88
-    eglSignalSyncKHR                            @89
-
-    ; 1.5 entry points
-    eglCreateSync                               @38
-    eglDestroySync                              @39
-    eglClientWaitSync                           @40
-    eglGetSyncAttrib                            @41
-    eglCreateImage                              @42
-    eglDestroyImage                             @43
-    eglGetPlatformDisplay                       @44
-    eglCreatePlatformWindowSurface              @45
-    eglCreatePlatformPixmapSurface              @46
-    eglWaitSync                                 @47
diff --git a/src/libEGL/libEGL.cpp b/src/libEGL/libEGL_autogen.cpp
similarity index 88%
rename from src/libEGL/libEGL.cpp
rename to src/libEGL/libEGL_autogen.cpp
index c9ce935..85b3ab9 100644
--- a/src/libEGL/libEGL.cpp
+++ b/src/libEGL/libEGL_autogen.cpp
@@ -1,10 +1,11 @@
+// GENERATED FILE - DO NOT EDIT.
+// Generated by generate_entry_points.py using data from egl.xml and egl_angle_ext.xml.
 //
-// Copyright 2002 The ANGLE Project Authors. All rights reserved.
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-
-// libEGL.cpp: Implements the exported EGL functions.
+// libEGL_autogen.cpp: Implements the exported EGL functions.
 
 #include "anglebase/no_destructor.h"
 #include "common/system_utils.h"
@@ -14,8 +15,8 @@
 #if defined(ANGLE_USE_EGL_LOADER)
 #    include "libEGL/egl_loader_autogen.h"
 #else
-#    include "libGLESv2/entry_points_egl.h"
-#    include "libGLESv2/entry_points_egl_ext.h"
+#    include "libGLESv2/entry_points_egl_autogen.h"
+#    include "libGLESv2/entry_points_egl_ext_autogen.h"
 #endif  // defined(ANGLE_USE_EGL_LOADER)
 
 namespace
@@ -25,8 +26,8 @@
 
 std::unique_ptr<angle::Library> &EntryPointsLib()
 {
-    static angle::base::NoDestructor<std::unique_ptr<angle::Library>> entryPointsLib;
-    return *entryPointsLib;
+    static angle::base::NoDestructor<std::unique_ptr<angle::Library>> sEntryPointsLib;
+    return *sEntryPointsLib;
 }
 
 angle::GenericProc KHRONOS_APIENTRY GlobalLoad(const char *symbol)
@@ -37,7 +38,9 @@
 void EnsureEGLLoaded()
 {
     if (gLoaded)
+    {
         return;
+    }
 
     EntryPointsLib().reset(
         angle::OpenSharedLibrary(ANGLE_GLESV2_LIBRARY_NAME, angle::SearchType::ApplicationDir));
@@ -58,6 +61,7 @@
 
 extern "C" {
 
+// EGL 1.0
 EGLBoolean EGLAPIENTRY eglChooseConfig(EGLDisplay dpy,
                                        const EGLint *attrib_list,
                                        EGLConfig *configs,
@@ -141,7 +145,7 @@
     return EGL_GetConfigs(dpy, configs, config_size, num_config);
 }
 
-EGLDisplay EGLAPIENTRY eglGetCurrentDisplay(void)
+EGLDisplay EGLAPIENTRY eglGetCurrentDisplay()
 {
     EnsureEGLLoaded();
     return EGL_GetCurrentDisplay();
@@ -159,12 +163,18 @@
     return EGL_GetDisplay(display_id);
 }
 
-EGLint EGLAPIENTRY eglGetError(void)
+EGLint EGLAPIENTRY eglGetError()
 {
     EnsureEGLLoaded();
     return EGL_GetError();
 }
 
+__eglMustCastToProperFunctionPointerType EGLAPIENTRY eglGetProcAddress(const char *procname)
+{
+    EnsureEGLLoaded();
+    return EGL_GetProcAddress(procname);
+}
+
 EGLBoolean EGLAPIENTRY eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
 {
     EnsureEGLLoaded();
@@ -216,7 +226,7 @@
     return EGL_Terminate(dpy);
 }
 
-EGLBoolean EGLAPIENTRY eglWaitGL(void)
+EGLBoolean EGLAPIENTRY eglWaitGL()
 {
     EnsureEGLLoaded();
     return EGL_WaitGL();
@@ -228,6 +238,7 @@
     return EGL_WaitNative(engine);
 }
 
+// EGL 1.1
 EGLBoolean EGLAPIENTRY eglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
 {
     EnsureEGLLoaded();
@@ -255,18 +266,13 @@
     return EGL_SwapInterval(dpy, interval);
 }
 
+// EGL 1.2
 EGLBoolean EGLAPIENTRY eglBindAPI(EGLenum api)
 {
     EnsureEGLLoaded();
     return EGL_BindAPI(api);
 }
 
-EGLenum EGLAPIENTRY eglQueryAPI(void)
-{
-    EnsureEGLLoaded();
-    return EGL_QueryAPI();
-}
-
 EGLSurface EGLAPIENTRY eglCreatePbufferFromClientBuffer(EGLDisplay dpy,
                                                         EGLenum buftype,
                                                         EGLClientBuffer buffer,
@@ -277,51 +283,38 @@
     return EGL_CreatePbufferFromClientBuffer(dpy, buftype, buffer, config, attrib_list);
 }
 
-EGLBoolean EGLAPIENTRY eglReleaseThread(void)
+EGLenum EGLAPIENTRY eglQueryAPI()
+{
+    EnsureEGLLoaded();
+    return EGL_QueryAPI();
+}
+
+EGLBoolean EGLAPIENTRY eglReleaseThread()
 {
     EnsureEGLLoaded();
     return EGL_ReleaseThread();
 }
 
-EGLBoolean EGLAPIENTRY eglWaitClient(void)
+EGLBoolean EGLAPIENTRY eglWaitClient()
 {
     EnsureEGLLoaded();
     return EGL_WaitClient();
 }
 
-EGLContext EGLAPIENTRY eglGetCurrentContext(void)
+// EGL 1.4
+EGLContext EGLAPIENTRY eglGetCurrentContext()
 {
     EnsureEGLLoaded();
     return EGL_GetCurrentContext();
 }
 
-EGLSync EGLAPIENTRY eglCreateSync(EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list)
-{
-    EnsureEGLLoaded();
-    return EGL_CreateSync(dpy, type, attrib_list);
-}
-
-EGLBoolean EGLAPIENTRY eglDestroySync(EGLDisplay dpy, EGLSync sync)
-{
-    EnsureEGLLoaded();
-    return EGL_DestroySync(dpy, sync);
-}
-
+// EGL 1.5
 EGLint EGLAPIENTRY eglClientWaitSync(EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout)
 {
     EnsureEGLLoaded();
     return EGL_ClientWaitSync(dpy, sync, flags, timeout);
 }
 
-EGLBoolean EGLAPIENTRY eglGetSyncAttrib(EGLDisplay dpy,
-                                        EGLSync sync,
-                                        EGLint attribute,
-                                        EGLAttrib *value)
-{
-    EnsureEGLLoaded();
-    return EGL_GetSyncAttrib(dpy, sync, attribute, value);
-}
-
 EGLImage EGLAPIENTRY eglCreateImage(EGLDisplay dpy,
                                     EGLContext ctx,
                                     EGLenum target,
@@ -332,18 +325,13 @@
     return EGL_CreateImage(dpy, ctx, target, buffer, attrib_list);
 }
 
-EGLBoolean EGLAPIENTRY eglDestroyImage(EGLDisplay dpy, EGLImage image)
+EGLSurface EGLAPIENTRY eglCreatePlatformPixmapSurface(EGLDisplay dpy,
+                                                      EGLConfig config,
+                                                      void *native_pixmap,
+                                                      const EGLAttrib *attrib_list)
 {
     EnsureEGLLoaded();
-    return EGL_DestroyImage(dpy, image);
-}
-
-EGLDisplay EGLAPIENTRY eglGetPlatformDisplay(EGLenum platform,
-                                             void *native_display,
-                                             const EGLAttrib *attrib_list)
-{
-    EnsureEGLLoaded();
-    return EGL_GetPlatformDisplay(platform, native_display, attrib_list);
+    return EGL_CreatePlatformPixmapSurface(dpy, config, native_pixmap, attrib_list);
 }
 
 EGLSurface EGLAPIENTRY eglCreatePlatformWindowSurface(EGLDisplay dpy,
@@ -355,13 +343,39 @@
     return EGL_CreatePlatformWindowSurface(dpy, config, native_window, attrib_list);
 }
 
-EGLSurface EGLAPIENTRY eglCreatePlatformPixmapSurface(EGLDisplay dpy,
-                                                      EGLConfig config,
-                                                      void *native_pixmap,
-                                                      const EGLAttrib *attrib_list)
+EGLSync EGLAPIENTRY eglCreateSync(EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list)
 {
     EnsureEGLLoaded();
-    return EGL_CreatePlatformPixmapSurface(dpy, config, native_pixmap, attrib_list);
+    return EGL_CreateSync(dpy, type, attrib_list);
+}
+
+EGLBoolean EGLAPIENTRY eglDestroyImage(EGLDisplay dpy, EGLImage image)
+{
+    EnsureEGLLoaded();
+    return EGL_DestroyImage(dpy, image);
+}
+
+EGLBoolean EGLAPIENTRY eglDestroySync(EGLDisplay dpy, EGLSync sync)
+{
+    EnsureEGLLoaded();
+    return EGL_DestroySync(dpy, sync);
+}
+
+EGLDisplay EGLAPIENTRY eglGetPlatformDisplay(EGLenum platform,
+                                             void *native_display,
+                                             const EGLAttrib *attrib_list)
+{
+    EnsureEGLLoaded();
+    return EGL_GetPlatformDisplay(platform, native_display, attrib_list);
+}
+
+EGLBoolean EGLAPIENTRY eglGetSyncAttrib(EGLDisplay dpy,
+                                        EGLSync sync,
+                                        EGLint attribute,
+                                        EGLAttrib *value)
+{
+    EnsureEGLLoaded();
+    return EGL_GetSyncAttrib(dpy, sync, attribute, value);
 }
 
 EGLBoolean EGLAPIENTRY eglWaitSync(EGLDisplay dpy, EGLSync sync, EGLint flags)
@@ -370,286 +384,7 @@
     return EGL_WaitSync(dpy, sync, flags);
 }
 
-EGLBoolean EGLAPIENTRY eglQuerySurfacePointerANGLE(EGLDisplay dpy,
-                                                   EGLSurface surface,
-                                                   EGLint attribute,
-                                                   void **value)
-{
-    EnsureEGLLoaded();
-    return EGL_QuerySurfacePointerANGLE(dpy, surface, attribute, value);
-}
-
-EGLBoolean EGLAPIENTRY eglPostSubBufferNV(EGLDisplay dpy,
-                                          EGLSurface surface,
-                                          EGLint x,
-                                          EGLint y,
-                                          EGLint width,
-                                          EGLint height)
-{
-    EnsureEGLLoaded();
-    return EGL_PostSubBufferNV(dpy, surface, x, y, width, height);
-}
-
-EGLDisplay EGLAPIENTRY eglGetPlatformDisplayEXT(EGLenum platform,
-                                                void *native_display,
-                                                const EGLint *attrib_list)
-{
-    EnsureEGLLoaded();
-    return EGL_GetPlatformDisplayEXT(platform, native_display, attrib_list);
-}
-
-EGLSurface EGLAPIENTRY eglCreatePlatformWindowSurfaceEXT(EGLDisplay dpy,
-                                                         EGLConfig config,
-                                                         void *native_window,
-                                                         const EGLint *attrib_list)
-{
-    EnsureEGLLoaded();
-    return EGL_CreatePlatformWindowSurfaceEXT(dpy, config, native_window, attrib_list);
-}
-
-EGLSurface EGLAPIENTRY eglCreatePlatformPixmapSurfaceEXT(EGLDisplay dpy,
-                                                         EGLConfig config,
-                                                         void *native_pixmap,
-                                                         const EGLint *attrib_list)
-{
-    EnsureEGLLoaded();
-    return EGL_CreatePlatformPixmapSurfaceEXT(dpy, config, native_pixmap, attrib_list);
-}
-
-EGLBoolean EGLAPIENTRY eglQueryDisplayAttribEXT(EGLDisplay dpy, EGLint attribute, EGLAttrib *value)
-{
-    EnsureEGLLoaded();
-    return EGL_QueryDisplayAttribEXT(dpy, attribute, value);
-}
-
-EGLBoolean EGLAPIENTRY eglQueryDisplayAttribANGLE(EGLDisplay dpy,
-                                                  EGLint attribute,
-                                                  EGLAttrib *value)
-{
-    EnsureEGLLoaded();
-    return EGL_QueryDisplayAttribANGLE(dpy, attribute, value);
-}
-
-EGLBoolean EGLAPIENTRY eglQueryDeviceAttribEXT(EGLDeviceEXT device,
-                                               EGLint attribute,
-                                               EGLAttrib *value)
-{
-    EnsureEGLLoaded();
-    return EGL_QueryDeviceAttribEXT(device, attribute, value);
-}
-
-const char *EGLAPIENTRY eglQueryDeviceStringEXT(EGLDeviceEXT device, EGLint name)
-{
-    EnsureEGLLoaded();
-    return EGL_QueryDeviceStringEXT(device, name);
-}
-
-EGLImageKHR EGLAPIENTRY eglCreateImageKHR(EGLDisplay dpy,
-                                          EGLContext ctx,
-                                          EGLenum target,
-                                          EGLClientBuffer buffer,
-                                          const EGLint *attrib_list)
-{
-    EnsureEGLLoaded();
-    return EGL_CreateImageKHR(dpy, ctx, target, buffer, attrib_list);
-}
-
-EGLBoolean EGLAPIENTRY eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR image)
-{
-    EnsureEGLLoaded();
-    return EGL_DestroyImageKHR(dpy, image);
-}
-
-EGLDeviceEXT EGLAPIENTRY eglCreateDeviceANGLE(EGLint device_type,
-                                              void *native_device,
-                                              const EGLAttrib *attrib_list)
-{
-    EnsureEGLLoaded();
-    return EGL_CreateDeviceANGLE(device_type, native_device, attrib_list);
-}
-
-EGLBoolean EGLAPIENTRY eglReleaseDeviceANGLE(EGLDeviceEXT device)
-{
-    EnsureEGLLoaded();
-    return EGL_ReleaseDeviceANGLE(device);
-}
-
-__eglMustCastToProperFunctionPointerType EGLAPIENTRY eglGetProcAddress(const char *procname)
-{
-    EnsureEGLLoaded();
-    return EGL_GetProcAddress(procname);
-}
-
-EGLStreamKHR EGLAPIENTRY eglCreateStreamKHR(EGLDisplay dpy, const EGLint *attrib_list)
-{
-    EnsureEGLLoaded();
-    return EGL_CreateStreamKHR(dpy, attrib_list);
-}
-
-EGLBoolean EGLAPIENTRY eglDestroyStreamKHR(EGLDisplay dpy, EGLStreamKHR stream)
-{
-    EnsureEGLLoaded();
-    return EGL_DestroyStreamKHR(dpy, stream);
-}
-
-EGLBoolean EGLAPIENTRY eglStreamAttribKHR(EGLDisplay dpy,
-                                          EGLStreamKHR stream,
-                                          EGLenum attribute,
-                                          EGLint value)
-{
-    EnsureEGLLoaded();
-    return EGL_StreamAttribKHR(dpy, stream, attribute, value);
-}
-
-EGLBoolean EGLAPIENTRY eglQueryStreamKHR(EGLDisplay dpy,
-                                         EGLStreamKHR stream,
-                                         EGLenum attribute,
-                                         EGLint *value)
-{
-    EnsureEGLLoaded();
-    return EGL_QueryStreamKHR(dpy, stream, attribute, value);
-}
-
-EGLBoolean EGLAPIENTRY eglQueryStreamu64KHR(EGLDisplay dpy,
-                                            EGLStreamKHR stream,
-                                            EGLenum attribute,
-                                            EGLuint64KHR *value)
-{
-    EnsureEGLLoaded();
-    return EGL_QueryStreamu64KHR(dpy, stream, attribute, value);
-}
-
-EGLBoolean EGLAPIENTRY eglStreamConsumerGLTextureExternalKHR(EGLDisplay dpy, EGLStreamKHR stream)
-{
-    EnsureEGLLoaded();
-    return EGL_StreamConsumerGLTextureExternalKHR(dpy, stream);
-}
-
-EGLBoolean EGLAPIENTRY eglStreamConsumerAcquireKHR(EGLDisplay dpy, EGLStreamKHR stream)
-{
-    EnsureEGLLoaded();
-    return EGL_StreamConsumerAcquireKHR(dpy, stream);
-}
-
-EGLBoolean EGLAPIENTRY eglStreamConsumerReleaseKHR(EGLDisplay dpy, EGLStreamKHR stream)
-{
-    EnsureEGLLoaded();
-    return EGL_StreamConsumerReleaseKHR(dpy, stream);
-}
-
-EGLBoolean EGLAPIENTRY eglStreamConsumerGLTextureExternalAttribsNV(EGLDisplay dpy,
-                                                                   EGLStreamKHR stream,
-                                                                   const EGLAttrib *attrib_list)
-{
-    EnsureEGLLoaded();
-    return EGL_StreamConsumerGLTextureExternalAttribsNV(dpy, stream, attrib_list);
-}
-
-EGLBoolean EGLAPIENTRY eglCreateStreamProducerD3DTextureANGLE(EGLDisplay dpy,
-                                                              EGLStreamKHR stream,
-                                                              const EGLAttrib *attrib_list)
-{
-    EnsureEGLLoaded();
-    return EGL_CreateStreamProducerD3DTextureANGLE(dpy, stream, attrib_list);
-}
-
-EGLBoolean EGLAPIENTRY eglStreamPostD3DTextureANGLE(EGLDisplay dpy,
-                                                    EGLStreamKHR stream,
-                                                    void *texture,
-                                                    const EGLAttrib *attrib_list)
-{
-    EnsureEGLLoaded();
-    return EGL_StreamPostD3DTextureANGLE(dpy, stream, texture, attrib_list);
-}
-
-EGLBoolean EGLAPIENTRY eglGetSyncValuesCHROMIUM(EGLDisplay dpy,
-                                                EGLSurface surface,
-                                                EGLuint64KHR *ust,
-                                                EGLuint64KHR *msc,
-                                                EGLuint64KHR *sbc)
-{
-    EnsureEGLLoaded();
-    return EGL_GetSyncValuesCHROMIUM(dpy, surface, ust, msc, sbc);
-}
-
-EGLBoolean EGLAPIENTRY eglGetMscRateANGLE(EGLDisplay dpy,
-                                          EGLSurface surface,
-                                          EGLint *numerator,
-                                          EGLint *denominator)
-{
-    EnsureEGLLoaded();
-    return EGL_GetMscRateANGLE(dpy, surface, numerator, denominator);
-}
-
-EGLBoolean EGLAPIENTRY eglSwapBuffersWithDamageKHR(EGLDisplay dpy,
-                                                   EGLSurface surface,
-                                                   EGLint *rects,
-                                                   EGLint n_rects)
-{
-    EnsureEGLLoaded();
-    return EGL_SwapBuffersWithDamageKHR(dpy, surface, rects, n_rects);
-}
-
-EGLBoolean EGLAPIENTRY eglPresentationTimeANDROID(EGLDisplay dpy,
-                                                  EGLSurface surface,
-                                                  EGLnsecsANDROID time)
-{
-    EnsureEGLLoaded();
-    return EGL_PresentationTimeANDROID(dpy, surface, time);
-}
-
-EGLint EGLAPIENTRY eglProgramCacheGetAttribANGLE(EGLDisplay dpy, EGLenum attrib)
-{
-    EnsureEGLLoaded();
-    return EGL_ProgramCacheGetAttribANGLE(dpy, attrib);
-}
-
-void EGLAPIENTRY eglProgramCacheQueryANGLE(EGLDisplay dpy,
-                                           EGLint index,
-                                           void *key,
-                                           EGLint *keysize,
-                                           void *binary,
-                                           EGLint *binarysize)
-{
-    EGL_ProgramCacheQueryANGLE(dpy, index, key, keysize, binary, binarysize);
-}
-
-void EGLAPIENTRY eglProgramCachePopulateANGLE(EGLDisplay dpy,
-                                              const void *key,
-                                              EGLint keysize,
-                                              const void *binary,
-                                              EGLint binarysize)
-{
-    EGL_ProgramCachePopulateANGLE(dpy, key, keysize, binary, binarysize);
-}
-
-EGLint EGLAPIENTRY eglProgramCacheResizeANGLE(EGLDisplay dpy, EGLint limit, EGLenum mode)
-{
-    EnsureEGLLoaded();
-    return EGL_ProgramCacheResizeANGLE(dpy, limit, mode);
-}
-
-EGLint EGLAPIENTRY eglDebugMessageControlKHR(EGLDEBUGPROCKHR callback, const EGLAttrib *attrib_list)
-{
-    EnsureEGLLoaded();
-    return EGL_DebugMessageControlKHR(callback, attrib_list);
-}
-
-EGLBoolean EGLAPIENTRY eglQueryDebugKHR(EGLint attribute, EGLAttrib *value)
-{
-    EnsureEGLLoaded();
-    return EGL_QueryDebugKHR(attribute, value);
-}
-
-EGLint EGLAPIENTRY eglLabelObjectKHR(EGLDisplay dpy,
-                                     EGLenum objectType,
-                                     EGLObjectKHR object,
-                                     EGLLabelKHR label)
-{
-    EnsureEGLLoaded();
-    return EGL_LabelObjectKHR(dpy, objectType, object, label);
-}
-
+// EGL_ANDROID_blob_cache
 void EGLAPIENTRY eglSetBlobCacheFuncsANDROID(EGLDisplay dpy,
                                              EGLSetBlobFuncANDROID set,
                                              EGLGetBlobFuncANDROID get)
@@ -658,6 +393,14 @@
     return EGL_SetBlobCacheFuncsANDROID(dpy, set, get);
 }
 
+// EGL_ANDROID_create_native_client_buffer
+EGLClientBuffer EGLAPIENTRY eglCreateNativeClientBufferANDROID(const EGLint *attrib_list)
+{
+    EnsureEGLLoaded();
+    return EGL_CreateNativeClientBufferANDROID(attrib_list);
+}
+
+// EGL_ANDROID_get_frame_timestamps
 EGLBoolean EGLAPIENTRY eglGetCompositorTimingSupportedANDROID(EGLDisplay dpy,
                                                               EGLSurface surface,
                                                               EGLint name)
@@ -703,30 +446,141 @@
     return EGL_GetFrameTimestampsANDROID(dpy, surface, frameId, numTimestamps, timestamps, values);
 }
 
-const char *EGLAPIENTRY eglQueryStringiANGLE(EGLDisplay dpy, EGLint name, EGLint index)
-{
-    EnsureEGLLoaded();
-    return EGL_QueryStringiANGLE(dpy, name, index);
-}
-
+// EGL_ANDROID_get_native_client_buffer
 EGLClientBuffer EGLAPIENTRY eglGetNativeClientBufferANDROID(const struct AHardwareBuffer *buffer)
 {
     EnsureEGLLoaded();
     return EGL_GetNativeClientBufferANDROID(buffer);
 }
 
-EGLClientBuffer EGLAPIENTRY eglCreateNativeClientBufferANDROID(const EGLint *attrib_list)
-{
-    EnsureEGLLoaded();
-    return EGL_CreateNativeClientBufferANDROID(attrib_list);
-}
-
+// EGL_ANDROID_native_fence_sync
 EGLint EGLAPIENTRY eglDupNativeFenceFDANDROID(EGLDisplay dpy, EGLSyncKHR sync)
 {
     EnsureEGLLoaded();
     return EGL_DupNativeFenceFDANDROID(dpy, sync);
 }
 
+// EGL_ANDROID_presentation_time
+EGLBoolean EGLAPIENTRY eglPresentationTimeANDROID(EGLDisplay dpy,
+                                                  EGLSurface surface,
+                                                  EGLnsecsANDROID time)
+{
+    EnsureEGLLoaded();
+    return EGL_PresentationTimeANDROID(dpy, surface, time);
+}
+
+// EGL_ANGLE_device_creation
+EGLDeviceEXT EGLAPIENTRY eglCreateDeviceANGLE(EGLint device_type,
+                                              void *native_device,
+                                              const EGLAttrib *attrib_list)
+{
+    EnsureEGLLoaded();
+    return EGL_CreateDeviceANGLE(device_type, native_device, attrib_list);
+}
+
+EGLBoolean EGLAPIENTRY eglReleaseDeviceANGLE(EGLDeviceEXT device)
+{
+    EnsureEGLLoaded();
+    return EGL_ReleaseDeviceANGLE(device);
+}
+
+// EGL_ANGLE_feature_control
+const char *EGLAPIENTRY eglQueryStringiANGLE(EGLDisplay dpy, EGLint name, EGLint index)
+{
+    EnsureEGLLoaded();
+    return EGL_QueryStringiANGLE(dpy, name, index);
+}
+
+EGLBoolean EGLAPIENTRY eglQueryDisplayAttribANGLE(EGLDisplay dpy,
+                                                  EGLint attribute,
+                                                  EGLAttrib *value)
+{
+    EnsureEGLLoaded();
+    return EGL_QueryDisplayAttribANGLE(dpy, attribute, value);
+}
+
+// EGL_ANGLE_power_preference
+void EGLAPIENTRY eglReleaseHighPowerGPUANGLE(EGLDisplay dpy, EGLContext ctx)
+{
+    EnsureEGLLoaded();
+    return EGL_ReleaseHighPowerGPUANGLE(dpy, ctx);
+}
+
+void EGLAPIENTRY eglReacquireHighPowerGPUANGLE(EGLDisplay dpy, EGLContext ctx)
+{
+    EnsureEGLLoaded();
+    return EGL_ReacquireHighPowerGPUANGLE(dpy, ctx);
+}
+
+void EGLAPIENTRY eglHandleGPUSwitchANGLE(EGLDisplay dpy)
+{
+    EnsureEGLLoaded();
+    return EGL_HandleGPUSwitchANGLE(dpy);
+}
+
+// EGL_ANGLE_program_cache_control
+EGLint EGLAPIENTRY eglProgramCacheGetAttribANGLE(EGLDisplay dpy, EGLenum attrib)
+{
+    EnsureEGLLoaded();
+    return EGL_ProgramCacheGetAttribANGLE(dpy, attrib);
+}
+
+void EGLAPIENTRY eglProgramCacheQueryANGLE(EGLDisplay dpy,
+                                           EGLint index,
+                                           void *key,
+                                           EGLint *keysize,
+                                           void *binary,
+                                           EGLint *binarysize)
+{
+    EnsureEGLLoaded();
+    return EGL_ProgramCacheQueryANGLE(dpy, index, key, keysize, binary, binarysize);
+}
+
+void EGLAPIENTRY eglProgramCachePopulateANGLE(EGLDisplay dpy,
+                                              const void *key,
+                                              EGLint keysize,
+                                              const void *binary,
+                                              EGLint binarysize)
+{
+    EnsureEGLLoaded();
+    return EGL_ProgramCachePopulateANGLE(dpy, key, keysize, binary, binarysize);
+}
+
+EGLint EGLAPIENTRY eglProgramCacheResizeANGLE(EGLDisplay dpy, EGLint limit, EGLint mode)
+{
+    EnsureEGLLoaded();
+    return EGL_ProgramCacheResizeANGLE(dpy, limit, mode);
+}
+
+// EGL_ANGLE_query_surface_pointer
+EGLBoolean EGLAPIENTRY eglQuerySurfacePointerANGLE(EGLDisplay dpy,
+                                                   EGLSurface surface,
+                                                   EGLint attribute,
+                                                   void **value)
+{
+    EnsureEGLLoaded();
+    return EGL_QuerySurfacePointerANGLE(dpy, surface, attribute, value);
+}
+
+// EGL_ANGLE_stream_producer_d3d_texture
+EGLBoolean EGLAPIENTRY eglCreateStreamProducerD3DTextureANGLE(EGLDisplay dpy,
+                                                              EGLStreamKHR stream,
+                                                              const EGLAttrib *attrib_list)
+{
+    EnsureEGLLoaded();
+    return EGL_CreateStreamProducerD3DTextureANGLE(dpy, stream, attrib_list);
+}
+
+EGLBoolean EGLAPIENTRY eglStreamPostD3DTextureANGLE(EGLDisplay dpy,
+                                                    EGLStreamKHR stream,
+                                                    void *texture,
+                                                    const EGLAttrib *attrib_list)
+{
+    EnsureEGLLoaded();
+    return EGL_StreamPostD3DTextureANGLE(dpy, stream, texture, attrib_list);
+}
+
+// EGL_ANGLE_swap_with_frame_token
 EGLBoolean EGLAPIENTRY eglSwapBuffersWithFrameTokenANGLE(EGLDisplay dpy,
                                                          EGLSurface surface,
                                                          EGLFrameTokenANGLE frametoken)
@@ -735,26 +589,121 @@
     return EGL_SwapBuffersWithFrameTokenANGLE(dpy, surface, frametoken);
 }
 
-EGLSync EGLAPIENTRY eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list)
+// EGL_ANGLE_sync_control_rate
+EGLBoolean EGLAPIENTRY eglGetMscRateANGLE(EGLDisplay dpy,
+                                          EGLSurface surface,
+                                          EGLint *numerator,
+                                          EGLint *denominator)
 {
     EnsureEGLLoaded();
-    return EGL_CreateSyncKHR(dpy, type, attrib_list);
+    return EGL_GetMscRateANGLE(dpy, surface, numerator, denominator);
 }
 
-EGLBoolean EGLAPIENTRY eglDestroySyncKHR(EGLDisplay dpy, EGLSync sync)
+// EGL_CHROMIUM_sync_control
+EGLBoolean EGLAPIENTRY eglGetSyncValuesCHROMIUM(EGLDisplay dpy,
+                                                EGLSurface surface,
+                                                EGLuint64KHR *ust,
+                                                EGLuint64KHR *msc,
+                                                EGLuint64KHR *sbc)
 {
     EnsureEGLLoaded();
-    return EGL_DestroySyncKHR(dpy, sync);
+    return EGL_GetSyncValuesCHROMIUM(dpy, surface, ust, msc, sbc);
 }
 
-EGLint EGLAPIENTRY eglClientWaitSyncKHR(EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout)
+// EGL_EXT_device_query
+EGLBoolean EGLAPIENTRY eglQueryDeviceAttribEXT(EGLDeviceEXT device,
+                                               EGLint attribute,
+                                               EGLAttrib *value)
+{
+    EnsureEGLLoaded();
+    return EGL_QueryDeviceAttribEXT(device, attribute, value);
+}
+
+const char *EGLAPIENTRY eglQueryDeviceStringEXT(EGLDeviceEXT device, EGLint name)
+{
+    EnsureEGLLoaded();
+    return EGL_QueryDeviceStringEXT(device, name);
+}
+
+EGLBoolean EGLAPIENTRY eglQueryDisplayAttribEXT(EGLDisplay dpy, EGLint attribute, EGLAttrib *value)
+{
+    EnsureEGLLoaded();
+    return EGL_QueryDisplayAttribEXT(dpy, attribute, value);
+}
+
+// EGL_EXT_platform_base
+EGLSurface EGLAPIENTRY eglCreatePlatformPixmapSurfaceEXT(EGLDisplay dpy,
+                                                         EGLConfig config,
+                                                         void *native_pixmap,
+                                                         const EGLint *attrib_list)
+{
+    EnsureEGLLoaded();
+    return EGL_CreatePlatformPixmapSurfaceEXT(dpy, config, native_pixmap, attrib_list);
+}
+
+EGLSurface EGLAPIENTRY eglCreatePlatformWindowSurfaceEXT(EGLDisplay dpy,
+                                                         EGLConfig config,
+                                                         void *native_window,
+                                                         const EGLint *attrib_list)
+{
+    EnsureEGLLoaded();
+    return EGL_CreatePlatformWindowSurfaceEXT(dpy, config, native_window, attrib_list);
+}
+
+EGLDisplay EGLAPIENTRY eglGetPlatformDisplayEXT(EGLenum platform,
+                                                void *native_display,
+                                                const EGLint *attrib_list)
+{
+    EnsureEGLLoaded();
+    return EGL_GetPlatformDisplayEXT(platform, native_display, attrib_list);
+}
+
+// EGL_KHR_debug
+EGLint EGLAPIENTRY eglDebugMessageControlKHR(EGLDEBUGPROCKHR callback, const EGLAttrib *attrib_list)
+{
+    EnsureEGLLoaded();
+    return EGL_DebugMessageControlKHR(callback, attrib_list);
+}
+
+EGLint EGLAPIENTRY eglLabelObjectKHR(EGLDisplay display,
+                                     EGLenum objectType,
+                                     EGLObjectKHR object,
+                                     EGLLabelKHR label)
+{
+    EnsureEGLLoaded();
+    return EGL_LabelObjectKHR(display, objectType, object, label);
+}
+
+EGLBoolean EGLAPIENTRY eglQueryDebugKHR(EGLint attribute, EGLAttrib *value)
+{
+    EnsureEGLLoaded();
+    return EGL_QueryDebugKHR(attribute, value);
+}
+
+// EGL_KHR_fence_sync
+EGLint EGLAPIENTRY eglClientWaitSyncKHR(EGLDisplay dpy,
+                                        EGLSyncKHR sync,
+                                        EGLint flags,
+                                        EGLTimeKHR timeout)
 {
     EnsureEGLLoaded();
     return EGL_ClientWaitSyncKHR(dpy, sync, flags, timeout);
 }
 
+EGLSyncKHR EGLAPIENTRY eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list)
+{
+    EnsureEGLLoaded();
+    return EGL_CreateSyncKHR(dpy, type, attrib_list);
+}
+
+EGLBoolean EGLAPIENTRY eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync)
+{
+    EnsureEGLLoaded();
+    return EGL_DestroySyncKHR(dpy, sync);
+}
+
 EGLBoolean EGLAPIENTRY eglGetSyncAttribKHR(EGLDisplay dpy,
-                                           EGLSync sync,
+                                           EGLSyncKHR sync,
                                            EGLint attribute,
                                            EGLint *value)
 {
@@ -762,16 +711,125 @@
     return EGL_GetSyncAttribKHR(dpy, sync, attribute, value);
 }
 
-EGLint EGLAPIENTRY eglWaitSyncKHR(EGLDisplay dpy, EGLSync sync, EGLint flags)
+// EGL_KHR_image
+EGLImageKHR EGLAPIENTRY eglCreateImageKHR(EGLDisplay dpy,
+                                          EGLContext ctx,
+                                          EGLenum target,
+                                          EGLClientBuffer buffer,
+                                          const EGLint *attrib_list)
+{
+    EnsureEGLLoaded();
+    return EGL_CreateImageKHR(dpy, ctx, target, buffer, attrib_list);
+}
+
+EGLBoolean EGLAPIENTRY eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR image)
+{
+    EnsureEGLLoaded();
+    return EGL_DestroyImageKHR(dpy, image);
+}
+
+// EGL_KHR_reusable_sync
+EGLBoolean EGLAPIENTRY eglSignalSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode)
+{
+    EnsureEGLLoaded();
+    return EGL_SignalSyncKHR(dpy, sync, mode);
+}
+
+// EGL_KHR_stream
+EGLStreamKHR EGLAPIENTRY eglCreateStreamKHR(EGLDisplay dpy, const EGLint *attrib_list)
+{
+    EnsureEGLLoaded();
+    return EGL_CreateStreamKHR(dpy, attrib_list);
+}
+
+EGLBoolean EGLAPIENTRY eglDestroyStreamKHR(EGLDisplay dpy, EGLStreamKHR stream)
+{
+    EnsureEGLLoaded();
+    return EGL_DestroyStreamKHR(dpy, stream);
+}
+
+EGLBoolean EGLAPIENTRY eglQueryStreamKHR(EGLDisplay dpy,
+                                         EGLStreamKHR stream,
+                                         EGLenum attribute,
+                                         EGLint *value)
+{
+    EnsureEGLLoaded();
+    return EGL_QueryStreamKHR(dpy, stream, attribute, value);
+}
+
+EGLBoolean EGLAPIENTRY eglQueryStreamu64KHR(EGLDisplay dpy,
+                                            EGLStreamKHR stream,
+                                            EGLenum attribute,
+                                            EGLuint64KHR *value)
+{
+    EnsureEGLLoaded();
+    return EGL_QueryStreamu64KHR(dpy, stream, attribute, value);
+}
+
+EGLBoolean EGLAPIENTRY eglStreamAttribKHR(EGLDisplay dpy,
+                                          EGLStreamKHR stream,
+                                          EGLenum attribute,
+                                          EGLint value)
+{
+    EnsureEGLLoaded();
+    return EGL_StreamAttribKHR(dpy, stream, attribute, value);
+}
+
+// EGL_KHR_stream_consumer_gltexture
+EGLBoolean EGLAPIENTRY eglStreamConsumerAcquireKHR(EGLDisplay dpy, EGLStreamKHR stream)
+{
+    EnsureEGLLoaded();
+    return EGL_StreamConsumerAcquireKHR(dpy, stream);
+}
+
+EGLBoolean EGLAPIENTRY eglStreamConsumerGLTextureExternalKHR(EGLDisplay dpy, EGLStreamKHR stream)
+{
+    EnsureEGLLoaded();
+    return EGL_StreamConsumerGLTextureExternalKHR(dpy, stream);
+}
+
+EGLBoolean EGLAPIENTRY eglStreamConsumerReleaseKHR(EGLDisplay dpy, EGLStreamKHR stream)
+{
+    EnsureEGLLoaded();
+    return EGL_StreamConsumerReleaseKHR(dpy, stream);
+}
+
+// EGL_KHR_swap_buffers_with_damage
+EGLBoolean EGLAPIENTRY eglSwapBuffersWithDamageKHR(EGLDisplay dpy,
+                                                   EGLSurface surface,
+                                                   const EGLint *rects,
+                                                   EGLint n_rects)
+{
+    EnsureEGLLoaded();
+    return EGL_SwapBuffersWithDamageKHR(dpy, surface, rects, n_rects);
+}
+
+// EGL_KHR_wait_sync
+EGLint EGLAPIENTRY eglWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags)
 {
     EnsureEGLLoaded();
     return EGL_WaitSyncKHR(dpy, sync, flags);
 }
 
-EGLBoolean EGLAPIENTRY eglSignalSyncKHR(EGLDisplay dpy, EGLSync sync, EGLenum mode)
+// EGL_NV_post_sub_buffer
+EGLBoolean EGLAPIENTRY eglPostSubBufferNV(EGLDisplay dpy,
+                                          EGLSurface surface,
+                                          EGLint x,
+                                          EGLint y,
+                                          EGLint width,
+                                          EGLint height)
 {
     EnsureEGLLoaded();
-    return EGL_SignalSyncKHR(dpy, sync, mode);
+    return EGL_PostSubBufferNV(dpy, surface, x, y, width, height);
+}
+
+// EGL_NV_stream_consumer_gltexture_yuv
+EGLBoolean EGLAPIENTRY eglStreamConsumerGLTextureExternalAttribsNV(EGLDisplay dpy,
+                                                                   EGLStreamKHR stream,
+                                                                   const EGLAttrib *attrib_list)
+{
+    EnsureEGLLoaded();
+    return EGL_StreamConsumerGLTextureExternalAttribsNV(dpy, stream, attrib_list);
 }
 
 }  // extern "C"
diff --git a/src/libEGL/libEGL_autogen.def b/src/libEGL/libEGL_autogen.def
new file mode 100644
index 0000000..a6e664e
--- /dev/null
+++ b/src/libEGL/libEGL_autogen.def
@@ -0,0 +1,171 @@
+; GENERATED FILE - DO NOT EDIT.
+; Generated by generate_entry_points.py using data from egl.xml and egl_angle_ext.xml.
+;
+; Copyright 2020 The ANGLE Project Authors. All rights reserved.
+; Use of this source code is governed by a BSD-style license that can be
+; found in the LICENSE file.
+LIBRARY libEGL
+EXPORTS
+
+    ; EGL 1.0
+    eglChooseConfig
+    eglCopyBuffers
+    eglCreateContext
+    eglCreatePbufferSurface
+    eglCreatePixmapSurface
+    eglCreateWindowSurface
+    eglDestroyContext
+    eglDestroySurface
+    eglGetConfigAttrib
+    eglGetConfigs
+    eglGetCurrentDisplay
+    eglGetCurrentSurface
+    eglGetDisplay
+    eglGetError
+    eglGetProcAddress
+    eglInitialize
+    eglMakeCurrent
+    eglQueryContext
+    eglQueryString
+    eglQuerySurface
+    eglSwapBuffers
+    eglTerminate
+    eglWaitGL
+    eglWaitNative
+
+    ; EGL 1.1
+    eglBindTexImage
+    eglReleaseTexImage
+    eglSurfaceAttrib
+    eglSwapInterval
+
+    ; EGL 1.2
+    eglBindAPI
+    eglCreatePbufferFromClientBuffer
+    eglQueryAPI
+    eglReleaseThread
+    eglWaitClient
+
+    ; EGL 1.4
+    eglGetCurrentContext
+
+    ; EGL 1.5
+    eglClientWaitSync
+    eglCreateImage
+    eglCreatePlatformPixmapSurface
+    eglCreatePlatformWindowSurface
+    eglCreateSync
+    eglDestroyImage
+    eglDestroySync
+    eglGetPlatformDisplay
+    eglGetSyncAttrib
+    eglWaitSync
+
+    ; EGL_ANDROID_blob_cache
+    eglSetBlobCacheFuncsANDROID
+
+    ; EGL_ANDROID_create_native_client_buffer
+    eglCreateNativeClientBufferANDROID
+
+    ; EGL_ANDROID_get_frame_timestamps
+    eglGetCompositorTimingANDROID
+    eglGetCompositorTimingSupportedANDROID
+    eglGetFrameTimestampSupportedANDROID
+    eglGetFrameTimestampsANDROID
+    eglGetNextFrameIdANDROID
+
+    ; EGL_ANDROID_get_native_client_buffer
+    eglGetNativeClientBufferANDROID
+
+    ; EGL_ANDROID_native_fence_sync
+    eglDupNativeFenceFDANDROID
+
+    ; EGL_ANDROID_presentation_time
+    eglPresentationTimeANDROID
+
+    ; EGL_ANGLE_device_creation
+    eglCreateDeviceANGLE
+    eglReleaseDeviceANGLE
+
+    ; EGL_ANGLE_feature_control
+    eglQueryDisplayAttribANGLE
+    eglQueryStringiANGLE
+
+    ; EGL_ANGLE_power_preference
+    eglHandleGPUSwitchANGLE
+    eglReacquireHighPowerGPUANGLE
+    eglReleaseHighPowerGPUANGLE
+
+    ; EGL_ANGLE_program_cache_control
+    eglProgramCacheGetAttribANGLE
+    eglProgramCachePopulateANGLE
+    eglProgramCacheQueryANGLE
+    eglProgramCacheResizeANGLE
+
+    ; EGL_ANGLE_query_surface_pointer
+    eglQuerySurfacePointerANGLE
+
+    ; EGL_ANGLE_stream_producer_d3d_texture
+    eglCreateStreamProducerD3DTextureANGLE
+    eglStreamPostD3DTextureANGLE
+
+    ; EGL_ANGLE_swap_with_frame_token
+    eglSwapBuffersWithFrameTokenANGLE
+
+    ; EGL_ANGLE_sync_control_rate
+    eglGetMscRateANGLE
+
+    ; EGL_CHROMIUM_sync_control
+    eglGetSyncValuesCHROMIUM
+
+    ; EGL_EXT_device_query
+    eglQueryDeviceAttribEXT
+    eglQueryDeviceStringEXT
+    eglQueryDisplayAttribEXT
+
+    ; EGL_EXT_platform_base
+    eglCreatePlatformPixmapSurfaceEXT
+    eglCreatePlatformWindowSurfaceEXT
+    eglGetPlatformDisplayEXT
+
+    ; EGL_KHR_debug
+    eglDebugMessageControlKHR
+    eglLabelObjectKHR
+    eglQueryDebugKHR
+
+    ; EGL_KHR_fence_sync
+    eglClientWaitSyncKHR
+    eglCreateSyncKHR
+    eglDestroySyncKHR
+    eglGetSyncAttribKHR
+
+    ; EGL_KHR_image
+    eglCreateImageKHR
+    eglDestroyImageKHR
+
+    ; EGL_KHR_reusable_sync
+    eglSignalSyncKHR
+
+    ; EGL_KHR_stream
+    eglCreateStreamKHR
+    eglDestroyStreamKHR
+    eglQueryStreamKHR
+    eglQueryStreamu64KHR
+    eglStreamAttribKHR
+
+    ; EGL_KHR_stream_consumer_gltexture
+    eglStreamConsumerAcquireKHR
+    eglStreamConsumerGLTextureExternalKHR
+    eglStreamConsumerReleaseKHR
+
+    ; EGL_KHR_swap_buffers_with_damage
+    eglSwapBuffersWithDamageKHR
+
+    ; EGL_KHR_wait_sync
+    eglWaitSyncKHR
+
+    ; EGL_NV_post_sub_buffer
+    eglPostSubBufferNV
+
+    ; EGL_NV_stream_consumer_gltexture_yuv
+    eglStreamConsumerGLTextureExternalAttribsNV
diff --git a/src/libGL/entry_points_gl_1_0_autogen.cpp b/src/libGL/entry_points_gl_1_0_autogen.cpp
deleted file mode 100644
index 1a0ec06..0000000
--- a/src/libGL/entry_points_gl_1_0_autogen.cpp
+++ /dev/null
@@ -1,7157 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// entry_points_gl_1_0_autogen.cpp:
-//   Defines the GL 1.0 entry points.
-
-#include "libGL/entry_points_gl_1_0_autogen.h"
-
-#include "libANGLE/Context.h"
-#include "libANGLE/Context.inl.h"
-#include "libANGLE/entry_points_utils.h"
-#include "libANGLE/gl_enum_utils.h"
-#include "libANGLE/validationEGL.h"
-#include "libANGLE/validationES.h"
-#include "libANGLE/validationES1.h"
-#include "libANGLE/validationES2.h"
-#include "libANGLE/validationES3.h"
-#include "libANGLE/validationES31.h"
-#include "libANGLE/validationES32.h"
-#include "libANGLE/validationESEXT.h"
-#include "libANGLE/validationGL1_autogen.h"
-#include "libGLESv2/global_state.h"
-
-namespace gl
-{
-void GL_APIENTRY Accum(GLenum op, GLfloat value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Accum, "glAccum", "context = %d, op = %s, value = %f",
-          CID(context), GLenumToString(GLenumGroup::AccumOp, op), value);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateAccum(context, op, value));
-        if (isCallValid)
-        {
-            context->accum(op, value);
-        }
-        ANGLE_CAPTURE(Accum, isCallValid, context, op, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY AlphaFunc(GLenum func, GLfloat ref)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::AlphaFunc, "glAlphaFunc", "context = %d, func = %s, ref = %f",
-          CID(context), GLenumToString(GLenumGroup::AlphaFunction, func), ref);
-
-    if (context)
-    {
-        AlphaTestFunc funcPacked                              = FromGL<AlphaTestFunc>(func);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateAlphaFunc(context, funcPacked, ref));
-        if (isCallValid)
-        {
-            context->alphaFunc(funcPacked, ref);
-        }
-        ANGLE_CAPTURE(AlphaFunc, isCallValid, context, funcPacked, ref);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Begin(GLenum mode)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Begin, "glBegin", "context = %d, mode = %s", CID(context),
-          GLenumToString(GLenumGroup::PrimitiveType, mode));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateBegin(context, mode));
-        if (isCallValid)
-        {
-            context->begin(mode);
-        }
-        ANGLE_CAPTURE(Begin, isCallValid, context, mode);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Bitmap(GLsizei width,
-                        GLsizei height,
-                        GLfloat xorig,
-                        GLfloat yorig,
-                        GLfloat xmove,
-                        GLfloat ymove,
-                        const GLubyte *bitmap)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Bitmap, "glBitmap",
-          "context = %d, width = %d, height = %d, xorig = %f, yorig = %f, xmove = %f, ymove = %f, "
-          "bitmap = 0x%016" PRIxPTR "",
-          CID(context), width, height, xorig, yorig, xmove, ymove, (uintptr_t)bitmap);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateBitmap(context, width, height, xorig, yorig, xmove, ymove, bitmap));
-        if (isCallValid)
-        {
-            context->bitmap(width, height, xorig, yorig, xmove, ymove, bitmap);
-        }
-        ANGLE_CAPTURE(Bitmap, isCallValid, context, width, height, xorig, yorig, xmove, ymove,
-                      bitmap);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY BlendFunc(GLenum sfactor, GLenum dfactor)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BlendFunc, "glBlendFunc",
-          "context = %d, sfactor = %s, dfactor = %s", CID(context),
-          GLenumToString(GLenumGroup::BlendingFactor, sfactor),
-          GLenumToString(GLenumGroup::BlendingFactor, dfactor));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateBlendFunc(context, sfactor, dfactor));
-        if (isCallValid)
-        {
-            context->blendFunc(sfactor, dfactor);
-        }
-        ANGLE_CAPTURE(BlendFunc, isCallValid, context, sfactor, dfactor);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY CallList(GLuint list)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CallList, "glCallList", "context = %d, list = %u", CID(context),
-          list);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateCallList(context, list));
-        if (isCallValid)
-        {
-            context->callList(list);
-        }
-        ANGLE_CAPTURE(CallList, isCallValid, context, list);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY CallLists(GLsizei n, GLenum type, const void *lists)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CallLists, "glCallLists",
-          "context = %d, n = %d, type = %s, lists = 0x%016" PRIxPTR "", CID(context), n,
-          GLenumToString(GLenumGroup::ListNameType, type), (uintptr_t)lists);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateCallLists(context, n, type, lists));
-        if (isCallValid)
-        {
-            context->callLists(n, type, lists);
-        }
-        ANGLE_CAPTURE(CallLists, isCallValid, context, n, type, lists);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Clear(GLbitfield mask)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Clear, "glClear", "context = %d, mask = %s", CID(context),
-          GLbitfieldToString(GLenumGroup::ClearBufferMask, mask).c_str());
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateClear(context, mask));
-        if (isCallValid)
-        {
-            context->clear(mask);
-        }
-        ANGLE_CAPTURE(Clear, isCallValid, context, mask);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ClearAccum, "glClearAccum",
-          "context = %d, red = %f, green = %f, blue = %f, alpha = %f", CID(context), red, green,
-          blue, alpha);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateClearAccum(context, red, green, blue, alpha));
-        if (isCallValid)
-        {
-            context->clearAccum(red, green, blue, alpha);
-        }
-        ANGLE_CAPTURE(ClearAccum, isCallValid, context, red, green, blue, alpha);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ClearColor, "glClearColor",
-          "context = %d, red = %f, green = %f, blue = %f, alpha = %f", CID(context), red, green,
-          blue, alpha);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateClearColor(context, red, green, blue, alpha));
-        if (isCallValid)
-        {
-            context->clearColor(red, green, blue, alpha);
-        }
-        ANGLE_CAPTURE(ClearColor, isCallValid, context, red, green, blue, alpha);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ClearDepth(GLdouble depth)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ClearDepth, "glClearDepth", "context = %d, depth = %f",
-          CID(context), depth);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateClearDepth(context, depth));
-        if (isCallValid)
-        {
-            context->clearDepth(depth);
-        }
-        ANGLE_CAPTURE(ClearDepth, isCallValid, context, depth);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ClearIndex(GLfloat c)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ClearIndex, "glClearIndex", "context = %d, c = %f", CID(context),
-          c);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateClearIndex(context, c));
-        if (isCallValid)
-        {
-            context->clearIndex(c);
-        }
-        ANGLE_CAPTURE(ClearIndex, isCallValid, context, c);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ClearStencil(GLint s)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ClearStencil, "glClearStencil", "context = %d, s = %d",
-          CID(context), s);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateClearStencil(context, s));
-        if (isCallValid)
-        {
-            context->clearStencil(s);
-        }
-        ANGLE_CAPTURE(ClearStencil, isCallValid, context, s);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ClipPlane(GLenum plane, const GLdouble *equation)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ClipPlane, "glClipPlane",
-          "context = %d, plane = %s, equation = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::ClipPlaneName, plane), (uintptr_t)equation);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateClipPlane(context, plane, equation));
-        if (isCallValid)
-        {
-            context->clipPlane(plane, equation);
-        }
-        ANGLE_CAPTURE(ClipPlane, isCallValid, context, plane, equation);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Color3b(GLbyte red, GLbyte green, GLbyte blue)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Color3b, "glColor3b",
-          "context = %d, red = %d, green = %d, blue = %d", CID(context), red, green, blue);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateColor3b(context, red, green, blue));
-        if (isCallValid)
-        {
-            context->color3b(red, green, blue);
-        }
-        ANGLE_CAPTURE(Color3b, isCallValid, context, red, green, blue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Color3bv(const GLbyte *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Color3bv, "glColor3bv", "context = %d, v = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateColor3bv(context, v));
-        if (isCallValid)
-        {
-            context->color3bv(v);
-        }
-        ANGLE_CAPTURE(Color3bv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Color3d(GLdouble red, GLdouble green, GLdouble blue)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Color3d, "glColor3d",
-          "context = %d, red = %f, green = %f, blue = %f", CID(context), red, green, blue);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateColor3d(context, red, green, blue));
-        if (isCallValid)
-        {
-            context->color3d(red, green, blue);
-        }
-        ANGLE_CAPTURE(Color3d, isCallValid, context, red, green, blue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Color3dv(const GLdouble *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Color3dv, "glColor3dv", "context = %d, v = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateColor3dv(context, v));
-        if (isCallValid)
-        {
-            context->color3dv(v);
-        }
-        ANGLE_CAPTURE(Color3dv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Color3f(GLfloat red, GLfloat green, GLfloat blue)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Color3f, "glColor3f",
-          "context = %d, red = %f, green = %f, blue = %f", CID(context), red, green, blue);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateColor3f(context, red, green, blue));
-        if (isCallValid)
-        {
-            context->color3f(red, green, blue);
-        }
-        ANGLE_CAPTURE(Color3f, isCallValid, context, red, green, blue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Color3fv(const GLfloat *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Color3fv, "glColor3fv", "context = %d, v = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateColor3fv(context, v));
-        if (isCallValid)
-        {
-            context->color3fv(v);
-        }
-        ANGLE_CAPTURE(Color3fv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Color3i(GLint red, GLint green, GLint blue)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Color3i, "glColor3i",
-          "context = %d, red = %d, green = %d, blue = %d", CID(context), red, green, blue);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateColor3i(context, red, green, blue));
-        if (isCallValid)
-        {
-            context->color3i(red, green, blue);
-        }
-        ANGLE_CAPTURE(Color3i, isCallValid, context, red, green, blue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Color3iv(const GLint *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Color3iv, "glColor3iv", "context = %d, v = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateColor3iv(context, v));
-        if (isCallValid)
-        {
-            context->color3iv(v);
-        }
-        ANGLE_CAPTURE(Color3iv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Color3s(GLshort red, GLshort green, GLshort blue)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Color3s, "glColor3s",
-          "context = %d, red = %d, green = %d, blue = %d", CID(context), red, green, blue);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateColor3s(context, red, green, blue));
-        if (isCallValid)
-        {
-            context->color3s(red, green, blue);
-        }
-        ANGLE_CAPTURE(Color3s, isCallValid, context, red, green, blue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Color3sv(const GLshort *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Color3sv, "glColor3sv", "context = %d, v = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateColor3sv(context, v));
-        if (isCallValid)
-        {
-            context->color3sv(v);
-        }
-        ANGLE_CAPTURE(Color3sv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Color3ub(GLubyte red, GLubyte green, GLubyte blue)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Color3ub, "glColor3ub",
-          "context = %d, red = %d, green = %d, blue = %d", CID(context), red, green, blue);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateColor3ub(context, red, green, blue));
-        if (isCallValid)
-        {
-            context->color3ub(red, green, blue);
-        }
-        ANGLE_CAPTURE(Color3ub, isCallValid, context, red, green, blue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Color3ubv(const GLubyte *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Color3ubv, "glColor3ubv", "context = %d, v = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateColor3ubv(context, v));
-        if (isCallValid)
-        {
-            context->color3ubv(v);
-        }
-        ANGLE_CAPTURE(Color3ubv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Color3ui(GLuint red, GLuint green, GLuint blue)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Color3ui, "glColor3ui",
-          "context = %d, red = %u, green = %u, blue = %u", CID(context), red, green, blue);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateColor3ui(context, red, green, blue));
-        if (isCallValid)
-        {
-            context->color3ui(red, green, blue);
-        }
-        ANGLE_CAPTURE(Color3ui, isCallValid, context, red, green, blue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Color3uiv(const GLuint *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Color3uiv, "glColor3uiv", "context = %d, v = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateColor3uiv(context, v));
-        if (isCallValid)
-        {
-            context->color3uiv(v);
-        }
-        ANGLE_CAPTURE(Color3uiv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Color3us(GLushort red, GLushort green, GLushort blue)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Color3us, "glColor3us",
-          "context = %d, red = %u, green = %u, blue = %u", CID(context), red, green, blue);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateColor3us(context, red, green, blue));
-        if (isCallValid)
-        {
-            context->color3us(red, green, blue);
-        }
-        ANGLE_CAPTURE(Color3us, isCallValid, context, red, green, blue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Color3usv(const GLushort *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Color3usv, "glColor3usv", "context = %d, v = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateColor3usv(context, v));
-        if (isCallValid)
-        {
-            context->color3usv(v);
-        }
-        ANGLE_CAPTURE(Color3usv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Color4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Color4b, "glColor4b",
-          "context = %d, red = %d, green = %d, blue = %d, alpha = %d", CID(context), red, green,
-          blue, alpha);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateColor4b(context, red, green, blue, alpha));
-        if (isCallValid)
-        {
-            context->color4b(red, green, blue, alpha);
-        }
-        ANGLE_CAPTURE(Color4b, isCallValid, context, red, green, blue, alpha);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Color4bv(const GLbyte *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Color4bv, "glColor4bv", "context = %d, v = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateColor4bv(context, v));
-        if (isCallValid)
-        {
-            context->color4bv(v);
-        }
-        ANGLE_CAPTURE(Color4bv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Color4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Color4d, "glColor4d",
-          "context = %d, red = %f, green = %f, blue = %f, alpha = %f", CID(context), red, green,
-          blue, alpha);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateColor4d(context, red, green, blue, alpha));
-        if (isCallValid)
-        {
-            context->color4d(red, green, blue, alpha);
-        }
-        ANGLE_CAPTURE(Color4d, isCallValid, context, red, green, blue, alpha);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Color4dv(const GLdouble *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Color4dv, "glColor4dv", "context = %d, v = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateColor4dv(context, v));
-        if (isCallValid)
-        {
-            context->color4dv(v);
-        }
-        ANGLE_CAPTURE(Color4dv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Color4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Color4f, "glColor4f",
-          "context = %d, red = %f, green = %f, blue = %f, alpha = %f", CID(context), red, green,
-          blue, alpha);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateColor4f(context, red, green, blue, alpha));
-        if (isCallValid)
-        {
-            context->color4f(red, green, blue, alpha);
-        }
-        ANGLE_CAPTURE(Color4f, isCallValid, context, red, green, blue, alpha);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Color4fv(const GLfloat *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Color4fv, "glColor4fv", "context = %d, v = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateColor4fv(context, v));
-        if (isCallValid)
-        {
-            context->color4fv(v);
-        }
-        ANGLE_CAPTURE(Color4fv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Color4i(GLint red, GLint green, GLint blue, GLint alpha)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Color4i, "glColor4i",
-          "context = %d, red = %d, green = %d, blue = %d, alpha = %d", CID(context), red, green,
-          blue, alpha);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateColor4i(context, red, green, blue, alpha));
-        if (isCallValid)
-        {
-            context->color4i(red, green, blue, alpha);
-        }
-        ANGLE_CAPTURE(Color4i, isCallValid, context, red, green, blue, alpha);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Color4iv(const GLint *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Color4iv, "glColor4iv", "context = %d, v = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateColor4iv(context, v));
-        if (isCallValid)
-        {
-            context->color4iv(v);
-        }
-        ANGLE_CAPTURE(Color4iv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Color4s(GLshort red, GLshort green, GLshort blue, GLshort alpha)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Color4s, "glColor4s",
-          "context = %d, red = %d, green = %d, blue = %d, alpha = %d", CID(context), red, green,
-          blue, alpha);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateColor4s(context, red, green, blue, alpha));
-        if (isCallValid)
-        {
-            context->color4s(red, green, blue, alpha);
-        }
-        ANGLE_CAPTURE(Color4s, isCallValid, context, red, green, blue, alpha);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Color4sv(const GLshort *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Color4sv, "glColor4sv", "context = %d, v = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateColor4sv(context, v));
-        if (isCallValid)
-        {
-            context->color4sv(v);
-        }
-        ANGLE_CAPTURE(Color4sv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Color4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Color4ub, "glColor4ub",
-          "context = %d, red = %d, green = %d, blue = %d, alpha = %d", CID(context), red, green,
-          blue, alpha);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateColor4ub(context, red, green, blue, alpha));
-        if (isCallValid)
-        {
-            context->color4ub(red, green, blue, alpha);
-        }
-        ANGLE_CAPTURE(Color4ub, isCallValid, context, red, green, blue, alpha);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Color4ubv(const GLubyte *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Color4ubv, "glColor4ubv", "context = %d, v = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateColor4ubv(context, v));
-        if (isCallValid)
-        {
-            context->color4ubv(v);
-        }
-        ANGLE_CAPTURE(Color4ubv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Color4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Color4ui, "glColor4ui",
-          "context = %d, red = %u, green = %u, blue = %u, alpha = %u", CID(context), red, green,
-          blue, alpha);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateColor4ui(context, red, green, blue, alpha));
-        if (isCallValid)
-        {
-            context->color4ui(red, green, blue, alpha);
-        }
-        ANGLE_CAPTURE(Color4ui, isCallValid, context, red, green, blue, alpha);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Color4uiv(const GLuint *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Color4uiv, "glColor4uiv", "context = %d, v = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateColor4uiv(context, v));
-        if (isCallValid)
-        {
-            context->color4uiv(v);
-        }
-        ANGLE_CAPTURE(Color4uiv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Color4us(GLushort red, GLushort green, GLushort blue, GLushort alpha)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Color4us, "glColor4us",
-          "context = %d, red = %u, green = %u, blue = %u, alpha = %u", CID(context), red, green,
-          blue, alpha);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateColor4us(context, red, green, blue, alpha));
-        if (isCallValid)
-        {
-            context->color4us(red, green, blue, alpha);
-        }
-        ANGLE_CAPTURE(Color4us, isCallValid, context, red, green, blue, alpha);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Color4usv(const GLushort *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Color4usv, "glColor4usv", "context = %d, v = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateColor4usv(context, v));
-        if (isCallValid)
-        {
-            context->color4usv(v);
-        }
-        ANGLE_CAPTURE(Color4usv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ColorMask, "glColorMask",
-          "context = %d, red = %s, green = %s, blue = %s, alpha = %s", CID(context),
-          GLbooleanToString(red), GLbooleanToString(green), GLbooleanToString(blue),
-          GLbooleanToString(alpha));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateColorMask(context, red, green, blue, alpha));
-        if (isCallValid)
-        {
-            context->colorMask(red, green, blue, alpha);
-        }
-        ANGLE_CAPTURE(ColorMask, isCallValid, context, red, green, blue, alpha);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ColorMaterial(GLenum face, GLenum mode)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ColorMaterial, "glColorMaterial",
-          "context = %d, face = %s, mode = %s", CID(context),
-          GLenumToString(GLenumGroup::MaterialFace, face),
-          GLenumToString(GLenumGroup::ColorMaterialParameter, mode));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateColorMaterial(context, face, mode));
-        if (isCallValid)
-        {
-            context->colorMaterial(face, mode);
-        }
-        ANGLE_CAPTURE(ColorMaterial, isCallValid, context, face, mode);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY CopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CopyPixels, "glCopyPixels",
-          "context = %d, x = %d, y = %d, width = %d, height = %d, type = %s", CID(context), x, y,
-          width, height, GLenumToString(GLenumGroup::PixelCopyType, type));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateCopyPixels(context, x, y, width, height, type));
-        if (isCallValid)
-        {
-            context->copyPixels(x, y, width, height, type);
-        }
-        ANGLE_CAPTURE(CopyPixels, isCallValid, context, x, y, width, height, type);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY CullFace(GLenum mode)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CullFace, "glCullFace", "context = %d, mode = %s", CID(context),
-          GLenumToString(GLenumGroup::CullFaceMode, mode));
-
-    if (context)
-    {
-        CullFaceMode modePacked                               = FromGL<CullFaceMode>(mode);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateCullFace(context, modePacked));
-        if (isCallValid)
-        {
-            context->cullFace(modePacked);
-        }
-        ANGLE_CAPTURE(CullFace, isCallValid, context, modePacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DeleteLists(GLuint list, GLsizei range)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DeleteLists, "glDeleteLists",
-          "context = %d, list = %u, range = %d", CID(context), list, range);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateDeleteLists(context, list, range));
-        if (isCallValid)
-        {
-            context->deleteLists(list, range);
-        }
-        ANGLE_CAPTURE(DeleteLists, isCallValid, context, list, range);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DepthFunc(GLenum func)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DepthFunc, "glDepthFunc", "context = %d, func = %s",
-          CID(context), GLenumToString(GLenumGroup::DepthFunction, func));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateDepthFunc(context, func));
-        if (isCallValid)
-        {
-            context->depthFunc(func);
-        }
-        ANGLE_CAPTURE(DepthFunc, isCallValid, context, func);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DepthMask(GLboolean flag)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DepthMask, "glDepthMask", "context = %d, flag = %s",
-          CID(context), GLbooleanToString(flag));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateDepthMask(context, flag));
-        if (isCallValid)
-        {
-            context->depthMask(flag);
-        }
-        ANGLE_CAPTURE(DepthMask, isCallValid, context, flag);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DepthRange(GLdouble n, GLdouble f)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DepthRange, "glDepthRange", "context = %d, n = %f, f = %f",
-          CID(context), n, f);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateDepthRange(context, n, f));
-        if (isCallValid)
-        {
-            context->depthRange(n, f);
-        }
-        ANGLE_CAPTURE(DepthRange, isCallValid, context, n, f);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Disable(GLenum cap)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Disable, "glDisable", "context = %d, cap = %s", CID(context),
-          GLenumToString(GLenumGroup::EnableCap, cap));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateDisable(context, cap));
-        if (isCallValid)
-        {
-            context->disable(cap);
-        }
-        ANGLE_CAPTURE(Disable, isCallValid, context, cap);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DrawBuffer(GLenum buf)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawBuffer, "glDrawBuffer", "context = %d, buf = %s",
-          CID(context), GLenumToString(GLenumGroup::DrawBufferMode, buf));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateDrawBuffer(context, buf));
-        if (isCallValid)
-        {
-            context->drawBuffer(buf);
-        }
-        ANGLE_CAPTURE(DrawBuffer, isCallValid, context, buf);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY
-DrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawPixels, "glDrawPixels",
-          "context = %d, width = %d, height = %d, format = %s, type = %s, pixels = 0x%016" PRIxPTR
-          "",
-          CID(context), width, height, GLenumToString(GLenumGroup::PixelFormat, format),
-          GLenumToString(GLenumGroup::PixelType, type), (uintptr_t)pixels);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateDrawPixels(context, width, height, format, type, pixels));
-        if (isCallValid)
-        {
-            context->drawPixels(width, height, format, type, pixels);
-        }
-        ANGLE_CAPTURE(DrawPixels, isCallValid, context, width, height, format, type, pixels);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY EdgeFlag(GLboolean flag)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::EdgeFlag, "glEdgeFlag", "context = %d, flag = %s", CID(context),
-          GLbooleanToString(flag));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateEdgeFlag(context, flag));
-        if (isCallValid)
-        {
-            context->edgeFlag(flag);
-        }
-        ANGLE_CAPTURE(EdgeFlag, isCallValid, context, flag);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY EdgeFlagv(const GLboolean *flag)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::EdgeFlagv, "glEdgeFlagv",
-          "context = %d, flag = 0x%016" PRIxPTR "", CID(context), (uintptr_t)flag);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateEdgeFlagv(context, flag));
-        if (isCallValid)
-        {
-            context->edgeFlagv(flag);
-        }
-        ANGLE_CAPTURE(EdgeFlagv, isCallValid, context, flag);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Enable(GLenum cap)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Enable, "glEnable", "context = %d, cap = %s", CID(context),
-          GLenumToString(GLenumGroup::EnableCap, cap));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateEnable(context, cap));
-        if (isCallValid)
-        {
-            context->enable(cap);
-        }
-        ANGLE_CAPTURE(Enable, isCallValid, context, cap);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY End()
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::End, "glEnd", "context = %d", CID(context));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateEnd(context));
-        if (isCallValid)
-        {
-            context->end();
-        }
-        ANGLE_CAPTURE(End, isCallValid, context);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY EndList()
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::EndList, "glEndList", "context = %d", CID(context));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateEndList(context));
-        if (isCallValid)
-        {
-            context->endList();
-        }
-        ANGLE_CAPTURE(EndList, isCallValid, context);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY EvalCoord1d(GLdouble u)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::EvalCoord1d, "glEvalCoord1d", "context = %d, u = %f",
-          CID(context), u);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateEvalCoord1d(context, u));
-        if (isCallValid)
-        {
-            context->evalCoord1d(u);
-        }
-        ANGLE_CAPTURE(EvalCoord1d, isCallValid, context, u);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY EvalCoord1dv(const GLdouble *u)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::EvalCoord1dv, "glEvalCoord1dv",
-          "context = %d, u = 0x%016" PRIxPTR "", CID(context), (uintptr_t)u);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateEvalCoord1dv(context, u));
-        if (isCallValid)
-        {
-            context->evalCoord1dv(u);
-        }
-        ANGLE_CAPTURE(EvalCoord1dv, isCallValid, context, u);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY EvalCoord1f(GLfloat u)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::EvalCoord1f, "glEvalCoord1f", "context = %d, u = %f",
-          CID(context), u);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateEvalCoord1f(context, u));
-        if (isCallValid)
-        {
-            context->evalCoord1f(u);
-        }
-        ANGLE_CAPTURE(EvalCoord1f, isCallValid, context, u);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY EvalCoord1fv(const GLfloat *u)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::EvalCoord1fv, "glEvalCoord1fv",
-          "context = %d, u = 0x%016" PRIxPTR "", CID(context), (uintptr_t)u);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateEvalCoord1fv(context, u));
-        if (isCallValid)
-        {
-            context->evalCoord1fv(u);
-        }
-        ANGLE_CAPTURE(EvalCoord1fv, isCallValid, context, u);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY EvalCoord2d(GLdouble u, GLdouble v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::EvalCoord2d, "glEvalCoord2d", "context = %d, u = %f, v = %f",
-          CID(context), u, v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateEvalCoord2d(context, u, v));
-        if (isCallValid)
-        {
-            context->evalCoord2d(u, v);
-        }
-        ANGLE_CAPTURE(EvalCoord2d, isCallValid, context, u, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY EvalCoord2dv(const GLdouble *u)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::EvalCoord2dv, "glEvalCoord2dv",
-          "context = %d, u = 0x%016" PRIxPTR "", CID(context), (uintptr_t)u);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateEvalCoord2dv(context, u));
-        if (isCallValid)
-        {
-            context->evalCoord2dv(u);
-        }
-        ANGLE_CAPTURE(EvalCoord2dv, isCallValid, context, u);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY EvalCoord2f(GLfloat u, GLfloat v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::EvalCoord2f, "glEvalCoord2f", "context = %d, u = %f, v = %f",
-          CID(context), u, v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateEvalCoord2f(context, u, v));
-        if (isCallValid)
-        {
-            context->evalCoord2f(u, v);
-        }
-        ANGLE_CAPTURE(EvalCoord2f, isCallValid, context, u, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY EvalCoord2fv(const GLfloat *u)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::EvalCoord2fv, "glEvalCoord2fv",
-          "context = %d, u = 0x%016" PRIxPTR "", CID(context), (uintptr_t)u);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateEvalCoord2fv(context, u));
-        if (isCallValid)
-        {
-            context->evalCoord2fv(u);
-        }
-        ANGLE_CAPTURE(EvalCoord2fv, isCallValid, context, u);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY EvalMesh1(GLenum mode, GLint i1, GLint i2)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::EvalMesh1, "glEvalMesh1",
-          "context = %d, mode = %s, i1 = %d, i2 = %d", CID(context),
-          GLenumToString(GLenumGroup::MeshMode1, mode), i1, i2);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateEvalMesh1(context, mode, i1, i2));
-        if (isCallValid)
-        {
-            context->evalMesh1(mode, i1, i2);
-        }
-        ANGLE_CAPTURE(EvalMesh1, isCallValid, context, mode, i1, i2);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY EvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::EvalMesh2, "glEvalMesh2",
-          "context = %d, mode = %s, i1 = %d, i2 = %d, j1 = %d, j2 = %d", CID(context),
-          GLenumToString(GLenumGroup::MeshMode2, mode), i1, i2, j1, j2);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateEvalMesh2(context, mode, i1, i2, j1, j2));
-        if (isCallValid)
-        {
-            context->evalMesh2(mode, i1, i2, j1, j2);
-        }
-        ANGLE_CAPTURE(EvalMesh2, isCallValid, context, mode, i1, i2, j1, j2);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY EvalPoint1(GLint i)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::EvalPoint1, "glEvalPoint1", "context = %d, i = %d", CID(context),
-          i);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateEvalPoint1(context, i));
-        if (isCallValid)
-        {
-            context->evalPoint1(i);
-        }
-        ANGLE_CAPTURE(EvalPoint1, isCallValid, context, i);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY EvalPoint2(GLint i, GLint j)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::EvalPoint2, "glEvalPoint2", "context = %d, i = %d, j = %d",
-          CID(context), i, j);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateEvalPoint2(context, i, j));
-        if (isCallValid)
-        {
-            context->evalPoint2(i, j);
-        }
-        ANGLE_CAPTURE(EvalPoint2, isCallValid, context, i, j);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY FeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::FeedbackBuffer, "glFeedbackBuffer",
-          "context = %d, size = %d, type = %s, buffer = 0x%016" PRIxPTR "", CID(context), size,
-          GLenumToString(GLenumGroup::FeedbackType, type), (uintptr_t)buffer);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateFeedbackBuffer(context, size, type, buffer));
-        if (isCallValid)
-        {
-            context->feedbackBuffer(size, type, buffer);
-        }
-        ANGLE_CAPTURE(FeedbackBuffer, isCallValid, context, size, type, buffer);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Finish()
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Finish, "glFinish", "context = %d", CID(context));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateFinish(context));
-        if (isCallValid)
-        {
-            context->finish();
-        }
-        ANGLE_CAPTURE(Finish, isCallValid, context);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Flush()
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Flush, "glFlush", "context = %d", CID(context));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateFlush(context));
-        if (isCallValid)
-        {
-            context->flush();
-        }
-        ANGLE_CAPTURE(Flush, isCallValid, context);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Fogf(GLenum pname, GLfloat param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Fogf, "glFogf", "context = %d, pname = %s, param = %f",
-          CID(context), GLenumToString(GLenumGroup::FogParameter, pname), param);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateFogf(context, pname, param));
-        if (isCallValid)
-        {
-            context->fogf(pname, param);
-        }
-        ANGLE_CAPTURE(Fogf, isCallValid, context, pname, param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Fogfv(GLenum pname, const GLfloat *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Fogfv, "glFogfv",
-          "context = %d, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::FogParameter, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateFogfv(context, pname, params));
-        if (isCallValid)
-        {
-            context->fogfv(pname, params);
-        }
-        ANGLE_CAPTURE(Fogfv, isCallValid, context, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Fogi(GLenum pname, GLint param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Fogi, "glFogi", "context = %d, pname = %s, param = %d",
-          CID(context), GLenumToString(GLenumGroup::FogParameter, pname), param);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateFogi(context, pname, param));
-        if (isCallValid)
-        {
-            context->fogi(pname, param);
-        }
-        ANGLE_CAPTURE(Fogi, isCallValid, context, pname, param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Fogiv(GLenum pname, const GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Fogiv, "glFogiv",
-          "context = %d, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::FogParameter, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateFogiv(context, pname, params));
-        if (isCallValid)
-        {
-            context->fogiv(pname, params);
-        }
-        ANGLE_CAPTURE(Fogiv, isCallValid, context, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY FrontFace(GLenum mode)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::FrontFace, "glFrontFace", "context = %d, mode = %s",
-          CID(context), GLenumToString(GLenumGroup::FrontFaceDirection, mode));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateFrontFace(context, mode));
-        if (isCallValid)
-        {
-            context->frontFace(mode);
-        }
-        ANGLE_CAPTURE(FrontFace, isCallValid, context, mode);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY
-Frustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Frustum, "glFrustum",
-          "context = %d, left = %f, right = %f, bottom = %f, top = %f, zNear = %f, zFar = %f",
-          CID(context), left, right, bottom, top, zNear, zFar);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateFrustum(context, left, right, bottom, top, zNear, zFar));
-        if (isCallValid)
-        {
-            context->frustum(left, right, bottom, top, zNear, zFar);
-        }
-        ANGLE_CAPTURE(Frustum, isCallValid, context, left, right, bottom, top, zNear, zFar);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-GLuint GL_APIENTRY GenLists(GLsizei range)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GenLists, "glGenLists", "context = %d, range = %d", CID(context),
-          range);
-
-    GLuint returnValue;
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateGenLists(context, range));
-        if (isCallValid)
-        {
-            returnValue = context->genLists(range);
-        }
-        else
-        {
-            returnValue = GetDefaultReturnValue<EntryPoint::GenLists, GLuint>();
-        }
-        ANGLE_CAPTURE(GenLists, isCallValid, context, range, returnValue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::GenLists, GLuint>();
-    }
-    return returnValue;
-}
-
-void GL_APIENTRY GetBooleanv(GLenum pname, GLboolean *data)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetBooleanv, "glGetBooleanv",
-          "context = %d, pname = %s, data = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::GetPName, pname), (uintptr_t)data);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateGetBooleanv(context, pname, data));
-        if (isCallValid)
-        {
-            context->getBooleanv(pname, data);
-        }
-        ANGLE_CAPTURE(GetBooleanv, isCallValid, context, pname, data);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetClipPlane(GLenum plane, GLdouble *equation)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetClipPlane, "glGetClipPlane",
-          "context = %d, plane = %s, equation = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::ClipPlaneName, plane), (uintptr_t)equation);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetClipPlane(context, plane, equation));
-        if (isCallValid)
-        {
-            context->getClipPlane(plane, equation);
-        }
-        ANGLE_CAPTURE(GetClipPlane, isCallValid, context, plane, equation);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetDoublev(GLenum pname, GLdouble *data)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetDoublev, "glGetDoublev",
-          "context = %d, pname = %s, data = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::GetPName, pname), (uintptr_t)data);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateGetDoublev(context, pname, data));
-        if (isCallValid)
-        {
-            context->getDoublev(pname, data);
-        }
-        ANGLE_CAPTURE(GetDoublev, isCallValid, context, pname, data);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-GLenum GL_APIENTRY GetError()
-{
-    Context *context = GetGlobalContext();
-    EVENT(context, gl::EntryPoint::GetError, "glGetError", "context = %d", CID(context));
-
-    GLenum returnValue;
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateGetError(context));
-        if (isCallValid)
-        {
-            returnValue = context->getError();
-        }
-        else
-        {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetError, GLenum>();
-        }
-        ANGLE_CAPTURE(GetError, isCallValid, context, returnValue);
-    }
-    else
-    {
-
-        returnValue = GetDefaultReturnValue<EntryPoint::GetError, GLenum>();
-    }
-    return returnValue;
-}
-
-void GL_APIENTRY GetFloatv(GLenum pname, GLfloat *data)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetFloatv, "glGetFloatv",
-          "context = %d, pname = %s, data = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::GetPName, pname), (uintptr_t)data);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateGetFloatv(context, pname, data));
-        if (isCallValid)
-        {
-            context->getFloatv(pname, data);
-        }
-        ANGLE_CAPTURE(GetFloatv, isCallValid, context, pname, data);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetIntegerv(GLenum pname, GLint *data)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetIntegerv, "glGetIntegerv",
-          "context = %d, pname = %s, data = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::GetPName, pname), (uintptr_t)data);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateGetIntegerv(context, pname, data));
-        if (isCallValid)
-        {
-            context->getIntegerv(pname, data);
-        }
-        ANGLE_CAPTURE(GetIntegerv, isCallValid, context, pname, data);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetLightfv(GLenum light, GLenum pname, GLfloat *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetLightfv, "glGetLightfv",
-          "context = %d, light = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::LightName, light),
-          GLenumToString(GLenumGroup::LightParameter, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        LightParameter pnamePacked                            = FromGL<LightParameter>(pname);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetLightfv(context, light, pnamePacked, params));
-        if (isCallValid)
-        {
-            context->getLightfv(light, pnamePacked, params);
-        }
-        ANGLE_CAPTURE(GetLightfv, isCallValid, context, light, pnamePacked, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetLightiv(GLenum light, GLenum pname, GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetLightiv, "glGetLightiv",
-          "context = %d, light = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::LightName, light),
-          GLenumToString(GLenumGroup::LightParameter, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetLightiv(context, light, pname, params));
-        if (isCallValid)
-        {
-            context->getLightiv(light, pname, params);
-        }
-        ANGLE_CAPTURE(GetLightiv, isCallValid, context, light, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetMapdv(GLenum target, GLenum query, GLdouble *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetMapdv, "glGetMapdv",
-          "context = %d, target = %s, query = %s, v = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::MapTarget, target),
-          GLenumToString(GLenumGroup::GetMapQuery, query), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetMapdv(context, target, query, v));
-        if (isCallValid)
-        {
-            context->getMapdv(target, query, v);
-        }
-        ANGLE_CAPTURE(GetMapdv, isCallValid, context, target, query, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetMapfv(GLenum target, GLenum query, GLfloat *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetMapfv, "glGetMapfv",
-          "context = %d, target = %s, query = %s, v = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::MapTarget, target),
-          GLenumToString(GLenumGroup::GetMapQuery, query), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetMapfv(context, target, query, v));
-        if (isCallValid)
-        {
-            context->getMapfv(target, query, v);
-        }
-        ANGLE_CAPTURE(GetMapfv, isCallValid, context, target, query, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetMapiv(GLenum target, GLenum query, GLint *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetMapiv, "glGetMapiv",
-          "context = %d, target = %s, query = %s, v = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::MapTarget, target),
-          GLenumToString(GLenumGroup::GetMapQuery, query), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetMapiv(context, target, query, v));
-        if (isCallValid)
-        {
-            context->getMapiv(target, query, v);
-        }
-        ANGLE_CAPTURE(GetMapiv, isCallValid, context, target, query, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetMaterialfv(GLenum face, GLenum pname, GLfloat *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetMaterialfv, "glGetMaterialfv",
-          "context = %d, face = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::MaterialFace, face),
-          GLenumToString(GLenumGroup::MaterialParameter, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        MaterialParameter pnamePacked                         = FromGL<MaterialParameter>(pname);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetMaterialfv(context, face, pnamePacked, params));
-        if (isCallValid)
-        {
-            context->getMaterialfv(face, pnamePacked, params);
-        }
-        ANGLE_CAPTURE(GetMaterialfv, isCallValid, context, face, pnamePacked, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetMaterialiv(GLenum face, GLenum pname, GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetMaterialiv, "glGetMaterialiv",
-          "context = %d, face = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::MaterialFace, face),
-          GLenumToString(GLenumGroup::MaterialParameter, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetMaterialiv(context, face, pname, params));
-        if (isCallValid)
-        {
-            context->getMaterialiv(face, pname, params);
-        }
-        ANGLE_CAPTURE(GetMaterialiv, isCallValid, context, face, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetPixelMapfv(GLenum map, GLfloat *values)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetPixelMapfv, "glGetPixelMapfv",
-          "context = %d, map = %s, values = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::PixelMap, map), (uintptr_t)values);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetPixelMapfv(context, map, values));
-        if (isCallValid)
-        {
-            context->getPixelMapfv(map, values);
-        }
-        ANGLE_CAPTURE(GetPixelMapfv, isCallValid, context, map, values);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetPixelMapuiv(GLenum map, GLuint *values)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetPixelMapuiv, "glGetPixelMapuiv",
-          "context = %d, map = %s, values = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::PixelMap, map), (uintptr_t)values);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetPixelMapuiv(context, map, values));
-        if (isCallValid)
-        {
-            context->getPixelMapuiv(map, values);
-        }
-        ANGLE_CAPTURE(GetPixelMapuiv, isCallValid, context, map, values);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetPixelMapusv(GLenum map, GLushort *values)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetPixelMapusv, "glGetPixelMapusv",
-          "context = %d, map = %s, values = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::PixelMap, map), (uintptr_t)values);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetPixelMapusv(context, map, values));
-        if (isCallValid)
-        {
-            context->getPixelMapusv(map, values);
-        }
-        ANGLE_CAPTURE(GetPixelMapusv, isCallValid, context, map, values);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetPolygonStipple(GLubyte *mask)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetPolygonStipple, "glGetPolygonStipple",
-          "context = %d, mask = 0x%016" PRIxPTR "", CID(context), (uintptr_t)mask);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateGetPolygonStipple(context, mask));
-        if (isCallValid)
-        {
-            context->getPolygonStipple(mask);
-        }
-        ANGLE_CAPTURE(GetPolygonStipple, isCallValid, context, mask);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-const GLubyte *GL_APIENTRY GetString(GLenum name)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetString, "glGetString", "context = %d, name = %s",
-          CID(context), GLenumToString(GLenumGroup::StringName, name));
-
-    const GLubyte *returnValue;
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateGetString(context, name));
-        if (isCallValid)
-        {
-            returnValue = context->getString(name);
-        }
-        else
-        {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetString, const GLubyte *>();
-        }
-        ANGLE_CAPTURE(GetString, isCallValid, context, name, returnValue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::GetString, const GLubyte *>();
-    }
-    return returnValue;
-}
-
-void GL_APIENTRY GetTexEnvfv(GLenum target, GLenum pname, GLfloat *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTexEnvfv, "glGetTexEnvfv",
-          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureEnvTarget, target),
-          GLenumToString(GLenumGroup::TextureEnvParameter, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        TextureEnvTarget targetPacked                         = FromGL<TextureEnvTarget>(target);
-        TextureEnvParameter pnamePacked                       = FromGL<TextureEnvParameter>(pname);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetTexEnvfv(context, targetPacked, pnamePacked, params));
-        if (isCallValid)
-        {
-            context->getTexEnvfv(targetPacked, pnamePacked, params);
-        }
-        ANGLE_CAPTURE(GetTexEnvfv, isCallValid, context, targetPacked, pnamePacked, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetTexEnviv(GLenum target, GLenum pname, GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTexEnviv, "glGetTexEnviv",
-          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureEnvTarget, target),
-          GLenumToString(GLenumGroup::TextureEnvParameter, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        TextureEnvTarget targetPacked                         = FromGL<TextureEnvTarget>(target);
-        TextureEnvParameter pnamePacked                       = FromGL<TextureEnvParameter>(pname);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetTexEnviv(context, targetPacked, pnamePacked, params));
-        if (isCallValid)
-        {
-            context->getTexEnviv(targetPacked, pnamePacked, params);
-        }
-        ANGLE_CAPTURE(GetTexEnviv, isCallValid, context, targetPacked, pnamePacked, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetTexGendv(GLenum coord, GLenum pname, GLdouble *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTexGendv, "glGetTexGendv",
-          "context = %d, coord = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureCoordName, coord),
-          GLenumToString(GLenumGroup::TextureGenParameter, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetTexGendv(context, coord, pname, params));
-        if (isCallValid)
-        {
-            context->getTexGendv(coord, pname, params);
-        }
-        ANGLE_CAPTURE(GetTexGendv, isCallValid, context, coord, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetTexGenfv(GLenum coord, GLenum pname, GLfloat *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTexGenfv, "glGetTexGenfv",
-          "context = %d, coord = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureCoordName, coord),
-          GLenumToString(GLenumGroup::TextureGenParameter, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetTexGenfv(context, coord, pname, params));
-        if (isCallValid)
-        {
-            context->getTexGenfv(coord, pname, params);
-        }
-        ANGLE_CAPTURE(GetTexGenfv, isCallValid, context, coord, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetTexGeniv(GLenum coord, GLenum pname, GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTexGeniv, "glGetTexGeniv",
-          "context = %d, coord = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureCoordName, coord),
-          GLenumToString(GLenumGroup::TextureGenParameter, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetTexGeniv(context, coord, pname, params));
-        if (isCallValid)
-        {
-            context->getTexGeniv(coord, pname, params);
-        }
-        ANGLE_CAPTURE(GetTexGeniv, isCallValid, context, coord, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetTexImage(GLenum target, GLint level, GLenum format, GLenum type, void *pixels)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTexImage, "glGetTexImage",
-          "context = %d, target = %s, level = %d, format = %s, type = %s, pixels = 0x%016" PRIxPTR
-          "",
-          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level,
-          GLenumToString(GLenumGroup::PixelFormat, format),
-          GLenumToString(GLenumGroup::PixelType, type), (uintptr_t)pixels);
-
-    if (context)
-    {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetTexImage(context, targetPacked, level, format, type, pixels));
-        if (isCallValid)
-        {
-            context->getTexImage(targetPacked, level, format, type, pixels);
-        }
-        ANGLE_CAPTURE(GetTexImage, isCallValid, context, targetPacked, level, format, type, pixels);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTexLevelParameterfv, "glGetTexLevelParameterfv",
-          "context = %d, target = %s, level = %d, pname = %s, params = 0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level,
-          GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetTexLevelParameterfv(context, targetPacked, level, pname, params));
-        if (isCallValid)
-        {
-            context->getTexLevelParameterfv(targetPacked, level, pname, params);
-        }
-        ANGLE_CAPTURE(GetTexLevelParameterfv, isCallValid, context, targetPacked, level, pname,
-                      params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTexLevelParameteriv, "glGetTexLevelParameteriv",
-          "context = %d, target = %s, level = %d, pname = %s, params = 0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level,
-          GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetTexLevelParameteriv(context, targetPacked, level, pname, params));
-        if (isCallValid)
-        {
-            context->getTexLevelParameteriv(targetPacked, level, pname, params);
-        }
-        ANGLE_CAPTURE(GetTexLevelParameteriv, isCallValid, context, targetPacked, level, pname,
-                      params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTexParameterfv, "glGetTexParameterfv",
-          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureTarget, target),
-          GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetTexParameterfv(context, targetPacked, pname, params));
-        if (isCallValid)
-        {
-            context->getTexParameterfv(targetPacked, pname, params);
-        }
-        ANGLE_CAPTURE(GetTexParameterfv, isCallValid, context, targetPacked, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetTexParameteriv(GLenum target, GLenum pname, GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTexParameteriv, "glGetTexParameteriv",
-          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureTarget, target),
-          GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetTexParameteriv(context, targetPacked, pname, params));
-        if (isCallValid)
-        {
-            context->getTexParameteriv(targetPacked, pname, params);
-        }
-        ANGLE_CAPTURE(GetTexParameteriv, isCallValid, context, targetPacked, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Hint(GLenum target, GLenum mode)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Hint, "glHint", "context = %d, target = %s, mode = %s",
-          CID(context), GLenumToString(GLenumGroup::HintTarget, target),
-          GLenumToString(GLenumGroup::HintMode, mode));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateHint(context, target, mode));
-        if (isCallValid)
-        {
-            context->hint(target, mode);
-        }
-        ANGLE_CAPTURE(Hint, isCallValid, context, target, mode);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY IndexMask(GLuint mask)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IndexMask, "glIndexMask", "context = %d, mask = %u",
-          CID(context), mask);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateIndexMask(context, mask));
-        if (isCallValid)
-        {
-            context->indexMask(mask);
-        }
-        ANGLE_CAPTURE(IndexMask, isCallValid, context, mask);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Indexd(GLdouble c)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Indexd, "glIndexd", "context = %d, c = %f", CID(context), c);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateIndexd(context, c));
-        if (isCallValid)
-        {
-            context->indexd(c);
-        }
-        ANGLE_CAPTURE(Indexd, isCallValid, context, c);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Indexdv(const GLdouble *c)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Indexdv, "glIndexdv", "context = %d, c = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)c);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateIndexdv(context, c));
-        if (isCallValid)
-        {
-            context->indexdv(c);
-        }
-        ANGLE_CAPTURE(Indexdv, isCallValid, context, c);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Indexf(GLfloat c)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Indexf, "glIndexf", "context = %d, c = %f", CID(context), c);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateIndexf(context, c));
-        if (isCallValid)
-        {
-            context->indexf(c);
-        }
-        ANGLE_CAPTURE(Indexf, isCallValid, context, c);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Indexfv(const GLfloat *c)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Indexfv, "glIndexfv", "context = %d, c = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)c);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateIndexfv(context, c));
-        if (isCallValid)
-        {
-            context->indexfv(c);
-        }
-        ANGLE_CAPTURE(Indexfv, isCallValid, context, c);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Indexi(GLint c)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Indexi, "glIndexi", "context = %d, c = %d", CID(context), c);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateIndexi(context, c));
-        if (isCallValid)
-        {
-            context->indexi(c);
-        }
-        ANGLE_CAPTURE(Indexi, isCallValid, context, c);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Indexiv(const GLint *c)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Indexiv, "glIndexiv", "context = %d, c = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)c);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateIndexiv(context, c));
-        if (isCallValid)
-        {
-            context->indexiv(c);
-        }
-        ANGLE_CAPTURE(Indexiv, isCallValid, context, c);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Indexs(GLshort c)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Indexs, "glIndexs", "context = %d, c = %d", CID(context), c);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateIndexs(context, c));
-        if (isCallValid)
-        {
-            context->indexs(c);
-        }
-        ANGLE_CAPTURE(Indexs, isCallValid, context, c);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Indexsv(const GLshort *c)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Indexsv, "glIndexsv", "context = %d, c = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)c);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateIndexsv(context, c));
-        if (isCallValid)
-        {
-            context->indexsv(c);
-        }
-        ANGLE_CAPTURE(Indexsv, isCallValid, context, c);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY InitNames()
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::InitNames, "glInitNames", "context = %d", CID(context));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateInitNames(context));
-        if (isCallValid)
-        {
-            context->initNames();
-        }
-        ANGLE_CAPTURE(InitNames, isCallValid, context);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-GLboolean GL_APIENTRY IsEnabled(GLenum cap)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IsEnabled, "glIsEnabled", "context = %d, cap = %s", CID(context),
-          GLenumToString(GLenumGroup::EnableCap, cap));
-
-    GLboolean returnValue;
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateIsEnabled(context, cap));
-        if (isCallValid)
-        {
-            returnValue = context->isEnabled(cap);
-        }
-        else
-        {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsEnabled, GLboolean>();
-        }
-        ANGLE_CAPTURE(IsEnabled, isCallValid, context, cap, returnValue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::IsEnabled, GLboolean>();
-    }
-    return returnValue;
-}
-
-GLboolean GL_APIENTRY IsList(GLuint list)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IsList, "glIsList", "context = %d, list = %u", CID(context),
-          list);
-
-    GLboolean returnValue;
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateIsList(context, list));
-        if (isCallValid)
-        {
-            returnValue = context->isList(list);
-        }
-        else
-        {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsList, GLboolean>();
-        }
-        ANGLE_CAPTURE(IsList, isCallValid, context, list, returnValue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::IsList, GLboolean>();
-    }
-    return returnValue;
-}
-
-void GL_APIENTRY LightModelf(GLenum pname, GLfloat param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::LightModelf, "glLightModelf",
-          "context = %d, pname = %s, param = %f", CID(context),
-          GLenumToString(GLenumGroup::LightModelParameter, pname), param);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateLightModelf(context, pname, param));
-        if (isCallValid)
-        {
-            context->lightModelf(pname, param);
-        }
-        ANGLE_CAPTURE(LightModelf, isCallValid, context, pname, param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY LightModelfv(GLenum pname, const GLfloat *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::LightModelfv, "glLightModelfv",
-          "context = %d, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::LightModelParameter, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateLightModelfv(context, pname, params));
-        if (isCallValid)
-        {
-            context->lightModelfv(pname, params);
-        }
-        ANGLE_CAPTURE(LightModelfv, isCallValid, context, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY LightModeli(GLenum pname, GLint param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::LightModeli, "glLightModeli",
-          "context = %d, pname = %s, param = %d", CID(context),
-          GLenumToString(GLenumGroup::LightModelParameter, pname), param);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateLightModeli(context, pname, param));
-        if (isCallValid)
-        {
-            context->lightModeli(pname, param);
-        }
-        ANGLE_CAPTURE(LightModeli, isCallValid, context, pname, param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY LightModeliv(GLenum pname, const GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::LightModeliv, "glLightModeliv",
-          "context = %d, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::LightModelParameter, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateLightModeliv(context, pname, params));
-        if (isCallValid)
-        {
-            context->lightModeliv(pname, params);
-        }
-        ANGLE_CAPTURE(LightModeliv, isCallValid, context, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Lightf(GLenum light, GLenum pname, GLfloat param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Lightf, "glLightf",
-          "context = %d, light = %s, pname = %s, param = %f", CID(context),
-          GLenumToString(GLenumGroup::LightName, light),
-          GLenumToString(GLenumGroup::LightParameter, pname), param);
-
-    if (context)
-    {
-        LightParameter pnamePacked                            = FromGL<LightParameter>(pname);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateLightf(context, light, pnamePacked, param));
-        if (isCallValid)
-        {
-            context->lightf(light, pnamePacked, param);
-        }
-        ANGLE_CAPTURE(Lightf, isCallValid, context, light, pnamePacked, param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Lightfv(GLenum light, GLenum pname, const GLfloat *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Lightfv, "glLightfv",
-          "context = %d, light = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::LightName, light),
-          GLenumToString(GLenumGroup::LightParameter, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        LightParameter pnamePacked                            = FromGL<LightParameter>(pname);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateLightfv(context, light, pnamePacked, params));
-        if (isCallValid)
-        {
-            context->lightfv(light, pnamePacked, params);
-        }
-        ANGLE_CAPTURE(Lightfv, isCallValid, context, light, pnamePacked, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Lighti(GLenum light, GLenum pname, GLint param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Lighti, "glLighti",
-          "context = %d, light = %s, pname = %s, param = %d", CID(context),
-          GLenumToString(GLenumGroup::LightName, light),
-          GLenumToString(GLenumGroup::LightParameter, pname), param);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateLighti(context, light, pname, param));
-        if (isCallValid)
-        {
-            context->lighti(light, pname, param);
-        }
-        ANGLE_CAPTURE(Lighti, isCallValid, context, light, pname, param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Lightiv(GLenum light, GLenum pname, const GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Lightiv, "glLightiv",
-          "context = %d, light = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::LightName, light),
-          GLenumToString(GLenumGroup::LightParameter, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateLightiv(context, light, pname, params));
-        if (isCallValid)
-        {
-            context->lightiv(light, pname, params);
-        }
-        ANGLE_CAPTURE(Lightiv, isCallValid, context, light, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY LineStipple(GLint factor, GLushort pattern)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::LineStipple, "glLineStipple",
-          "context = %d, factor = %d, pattern = %u", CID(context), factor, pattern);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateLineStipple(context, factor, pattern));
-        if (isCallValid)
-        {
-            context->lineStipple(factor, pattern);
-        }
-        ANGLE_CAPTURE(LineStipple, isCallValid, context, factor, pattern);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY LineWidth(GLfloat width)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::LineWidth, "glLineWidth", "context = %d, width = %f",
-          CID(context), width);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateLineWidth(context, width));
-        if (isCallValid)
-        {
-            context->lineWidth(width);
-        }
-        ANGLE_CAPTURE(LineWidth, isCallValid, context, width);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ListBase(GLuint base)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ListBase, "glListBase", "context = %d, base = %u", CID(context),
-          base);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateListBase(context, base));
-        if (isCallValid)
-        {
-            context->listBase(base);
-        }
-        ANGLE_CAPTURE(ListBase, isCallValid, context, base);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY LoadIdentity()
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::LoadIdentity, "glLoadIdentity", "context = %d", CID(context));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateLoadIdentity(context));
-        if (isCallValid)
-        {
-            context->loadIdentity();
-        }
-        ANGLE_CAPTURE(LoadIdentity, isCallValid, context);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY LoadMatrixd(const GLdouble *m)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::LoadMatrixd, "glLoadMatrixd",
-          "context = %d, m = 0x%016" PRIxPTR "", CID(context), (uintptr_t)m);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateLoadMatrixd(context, m));
-        if (isCallValid)
-        {
-            context->loadMatrixd(m);
-        }
-        ANGLE_CAPTURE(LoadMatrixd, isCallValid, context, m);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY LoadMatrixf(const GLfloat *m)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::LoadMatrixf, "glLoadMatrixf",
-          "context = %d, m = 0x%016" PRIxPTR "", CID(context), (uintptr_t)m);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateLoadMatrixf(context, m));
-        if (isCallValid)
-        {
-            context->loadMatrixf(m);
-        }
-        ANGLE_CAPTURE(LoadMatrixf, isCallValid, context, m);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY LoadName(GLuint name)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::LoadName, "glLoadName", "context = %d, name = %u", CID(context),
-          name);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateLoadName(context, name));
-        if (isCallValid)
-        {
-            context->loadName(name);
-        }
-        ANGLE_CAPTURE(LoadName, isCallValid, context, name);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY LogicOp(GLenum opcode)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::LogicOp, "glLogicOp", "context = %d, opcode = %s", CID(context),
-          GLenumToString(GLenumGroup::LogicOp, opcode));
-
-    if (context)
-    {
-        LogicalOperation opcodePacked                         = FromGL<LogicalOperation>(opcode);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateLogicOp(context, opcodePacked));
-        if (isCallValid)
-        {
-            context->logicOp(opcodePacked);
-        }
-        ANGLE_CAPTURE(LogicOp, isCallValid, context, opcodePacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY
-Map1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Map1d, "glMap1d",
-          "context = %d, target = %s, u1 = %f, u2 = %f, stride = %d, order = %d, points = "
-          "0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::MapTarget, target), u1, u2, stride, order,
-          (uintptr_t)points);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateMap1d(context, target, u1, u2, stride, order, points));
-        if (isCallValid)
-        {
-            context->map1d(target, u1, u2, stride, order, points);
-        }
-        ANGLE_CAPTURE(Map1d, isCallValid, context, target, u1, u2, stride, order, points);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY
-Map1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Map1f, "glMap1f",
-          "context = %d, target = %s, u1 = %f, u2 = %f, stride = %d, order = %d, points = "
-          "0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::MapTarget, target), u1, u2, stride, order,
-          (uintptr_t)points);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateMap1f(context, target, u1, u2, stride, order, points));
-        if (isCallValid)
-        {
-            context->map1f(target, u1, u2, stride, order, points);
-        }
-        ANGLE_CAPTURE(Map1f, isCallValid, context, target, u1, u2, stride, order, points);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Map2d(GLenum target,
-                       GLdouble u1,
-                       GLdouble u2,
-                       GLint ustride,
-                       GLint uorder,
-                       GLdouble v1,
-                       GLdouble v2,
-                       GLint vstride,
-                       GLint vorder,
-                       const GLdouble *points)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Map2d, "glMap2d",
-          "context = %d, target = %s, u1 = %f, u2 = %f, ustride = %d, uorder = %d, v1 = %f, v2 = "
-          "%f, vstride = %d, vorder = %d, points = 0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::MapTarget, target), u1, u2, ustride, uorder, v1,
-          v2, vstride, vorder, (uintptr_t)points);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMap2d(context, target, u1, u2, ustride, uorder,
-                                                        v1, v2, vstride, vorder, points));
-        if (isCallValid)
-        {
-            context->map2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
-        }
-        ANGLE_CAPTURE(Map2d, isCallValid, context, target, u1, u2, ustride, uorder, v1, v2, vstride,
-                      vorder, points);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Map2f(GLenum target,
-                       GLfloat u1,
-                       GLfloat u2,
-                       GLint ustride,
-                       GLint uorder,
-                       GLfloat v1,
-                       GLfloat v2,
-                       GLint vstride,
-                       GLint vorder,
-                       const GLfloat *points)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Map2f, "glMap2f",
-          "context = %d, target = %s, u1 = %f, u2 = %f, ustride = %d, uorder = %d, v1 = %f, v2 = "
-          "%f, vstride = %d, vorder = %d, points = 0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::MapTarget, target), u1, u2, ustride, uorder, v1,
-          v2, vstride, vorder, (uintptr_t)points);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMap2f(context, target, u1, u2, ustride, uorder,
-                                                        v1, v2, vstride, vorder, points));
-        if (isCallValid)
-        {
-            context->map2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
-        }
-        ANGLE_CAPTURE(Map2f, isCallValid, context, target, u1, u2, ustride, uorder, v1, v2, vstride,
-                      vorder, points);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MapGrid1d(GLint un, GLdouble u1, GLdouble u2)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MapGrid1d, "glMapGrid1d",
-          "context = %d, un = %d, u1 = %f, u2 = %f", CID(context), un, u1, u2);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateMapGrid1d(context, un, u1, u2));
-        if (isCallValid)
-        {
-            context->mapGrid1d(un, u1, u2);
-        }
-        ANGLE_CAPTURE(MapGrid1d, isCallValid, context, un, u1, u2);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MapGrid1f(GLint un, GLfloat u1, GLfloat u2)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MapGrid1f, "glMapGrid1f",
-          "context = %d, un = %d, u1 = %f, u2 = %f", CID(context), un, u1, u2);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateMapGrid1f(context, un, u1, u2));
-        if (isCallValid)
-        {
-            context->mapGrid1f(un, u1, u2);
-        }
-        ANGLE_CAPTURE(MapGrid1f, isCallValid, context, un, u1, u2);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MapGrid2d, "glMapGrid2d",
-          "context = %d, un = %d, u1 = %f, u2 = %f, vn = %d, v1 = %f, v2 = %f", CID(context), un,
-          u1, u2, vn, v1, v2);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMapGrid2d(context, un, u1, u2, vn, v1, v2));
-        if (isCallValid)
-        {
-            context->mapGrid2d(un, u1, u2, vn, v1, v2);
-        }
-        ANGLE_CAPTURE(MapGrid2d, isCallValid, context, un, u1, u2, vn, v1, v2);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MapGrid2f, "glMapGrid2f",
-          "context = %d, un = %d, u1 = %f, u2 = %f, vn = %d, v1 = %f, v2 = %f", CID(context), un,
-          u1, u2, vn, v1, v2);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMapGrid2f(context, un, u1, u2, vn, v1, v2));
-        if (isCallValid)
-        {
-            context->mapGrid2f(un, u1, u2, vn, v1, v2);
-        }
-        ANGLE_CAPTURE(MapGrid2f, isCallValid, context, un, u1, u2, vn, v1, v2);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Materialf(GLenum face, GLenum pname, GLfloat param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Materialf, "glMaterialf",
-          "context = %d, face = %s, pname = %s, param = %f", CID(context),
-          GLenumToString(GLenumGroup::MaterialFace, face),
-          GLenumToString(GLenumGroup::MaterialParameter, pname), param);
-
-    if (context)
-    {
-        MaterialParameter pnamePacked                         = FromGL<MaterialParameter>(pname);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMaterialf(context, face, pnamePacked, param));
-        if (isCallValid)
-        {
-            context->materialf(face, pnamePacked, param);
-        }
-        ANGLE_CAPTURE(Materialf, isCallValid, context, face, pnamePacked, param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Materialfv(GLenum face, GLenum pname, const GLfloat *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Materialfv, "glMaterialfv",
-          "context = %d, face = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::MaterialFace, face),
-          GLenumToString(GLenumGroup::MaterialParameter, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        MaterialParameter pnamePacked                         = FromGL<MaterialParameter>(pname);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMaterialfv(context, face, pnamePacked, params));
-        if (isCallValid)
-        {
-            context->materialfv(face, pnamePacked, params);
-        }
-        ANGLE_CAPTURE(Materialfv, isCallValid, context, face, pnamePacked, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Materiali(GLenum face, GLenum pname, GLint param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Materiali, "glMateriali",
-          "context = %d, face = %s, pname = %s, param = %d", CID(context),
-          GLenumToString(GLenumGroup::MaterialFace, face),
-          GLenumToString(GLenumGroup::MaterialParameter, pname), param);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMateriali(context, face, pname, param));
-        if (isCallValid)
-        {
-            context->materiali(face, pname, param);
-        }
-        ANGLE_CAPTURE(Materiali, isCallValid, context, face, pname, param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Materialiv(GLenum face, GLenum pname, const GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Materialiv, "glMaterialiv",
-          "context = %d, face = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::MaterialFace, face),
-          GLenumToString(GLenumGroup::MaterialParameter, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMaterialiv(context, face, pname, params));
-        if (isCallValid)
-        {
-            context->materialiv(face, pname, params);
-        }
-        ANGLE_CAPTURE(Materialiv, isCallValid, context, face, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MatrixMode(GLenum mode)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MatrixMode, "glMatrixMode", "context = %d, mode = %s",
-          CID(context), GLenumToString(GLenumGroup::MatrixMode, mode));
-
-    if (context)
-    {
-        MatrixType modePacked                                 = FromGL<MatrixType>(mode);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateMatrixMode(context, modePacked));
-        if (isCallValid)
-        {
-            context->matrixMode(modePacked);
-        }
-        ANGLE_CAPTURE(MatrixMode, isCallValid, context, modePacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultMatrixd(const GLdouble *m)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultMatrixd, "glMultMatrixd",
-          "context = %d, m = 0x%016" PRIxPTR "", CID(context), (uintptr_t)m);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateMultMatrixd(context, m));
-        if (isCallValid)
-        {
-            context->multMatrixd(m);
-        }
-        ANGLE_CAPTURE(MultMatrixd, isCallValid, context, m);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultMatrixf(const GLfloat *m)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultMatrixf, "glMultMatrixf",
-          "context = %d, m = 0x%016" PRIxPTR "", CID(context), (uintptr_t)m);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateMultMatrixf(context, m));
-        if (isCallValid)
-        {
-            context->multMatrixf(m);
-        }
-        ANGLE_CAPTURE(MultMatrixf, isCallValid, context, m);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY NewList(GLuint list, GLenum mode)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::NewList, "glNewList", "context = %d, list = %u, mode = %s",
-          CID(context), list, GLenumToString(GLenumGroup::ListMode, mode));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateNewList(context, list, mode));
-        if (isCallValid)
-        {
-            context->newList(list, mode);
-        }
-        ANGLE_CAPTURE(NewList, isCallValid, context, list, mode);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Normal3b(GLbyte nx, GLbyte ny, GLbyte nz)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Normal3b, "glNormal3b",
-          "context = %d, nx = %d, ny = %d, nz = %d", CID(context), nx, ny, nz);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateNormal3b(context, nx, ny, nz));
-        if (isCallValid)
-        {
-            context->normal3b(nx, ny, nz);
-        }
-        ANGLE_CAPTURE(Normal3b, isCallValid, context, nx, ny, nz);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Normal3bv(const GLbyte *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Normal3bv, "glNormal3bv", "context = %d, v = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateNormal3bv(context, v));
-        if (isCallValid)
-        {
-            context->normal3bv(v);
-        }
-        ANGLE_CAPTURE(Normal3bv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Normal3d(GLdouble nx, GLdouble ny, GLdouble nz)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Normal3d, "glNormal3d",
-          "context = %d, nx = %f, ny = %f, nz = %f", CID(context), nx, ny, nz);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateNormal3d(context, nx, ny, nz));
-        if (isCallValid)
-        {
-            context->normal3d(nx, ny, nz);
-        }
-        ANGLE_CAPTURE(Normal3d, isCallValid, context, nx, ny, nz);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Normal3dv(const GLdouble *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Normal3dv, "glNormal3dv", "context = %d, v = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateNormal3dv(context, v));
-        if (isCallValid)
-        {
-            context->normal3dv(v);
-        }
-        ANGLE_CAPTURE(Normal3dv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Normal3f(GLfloat nx, GLfloat ny, GLfloat nz)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Normal3f, "glNormal3f",
-          "context = %d, nx = %f, ny = %f, nz = %f", CID(context), nx, ny, nz);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateNormal3f(context, nx, ny, nz));
-        if (isCallValid)
-        {
-            context->normal3f(nx, ny, nz);
-        }
-        ANGLE_CAPTURE(Normal3f, isCallValid, context, nx, ny, nz);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Normal3fv(const GLfloat *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Normal3fv, "glNormal3fv", "context = %d, v = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateNormal3fv(context, v));
-        if (isCallValid)
-        {
-            context->normal3fv(v);
-        }
-        ANGLE_CAPTURE(Normal3fv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Normal3i(GLint nx, GLint ny, GLint nz)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Normal3i, "glNormal3i",
-          "context = %d, nx = %d, ny = %d, nz = %d", CID(context), nx, ny, nz);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateNormal3i(context, nx, ny, nz));
-        if (isCallValid)
-        {
-            context->normal3i(nx, ny, nz);
-        }
-        ANGLE_CAPTURE(Normal3i, isCallValid, context, nx, ny, nz);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Normal3iv(const GLint *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Normal3iv, "glNormal3iv", "context = %d, v = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateNormal3iv(context, v));
-        if (isCallValid)
-        {
-            context->normal3iv(v);
-        }
-        ANGLE_CAPTURE(Normal3iv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Normal3s(GLshort nx, GLshort ny, GLshort nz)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Normal3s, "glNormal3s",
-          "context = %d, nx = %d, ny = %d, nz = %d", CID(context), nx, ny, nz);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateNormal3s(context, nx, ny, nz));
-        if (isCallValid)
-        {
-            context->normal3s(nx, ny, nz);
-        }
-        ANGLE_CAPTURE(Normal3s, isCallValid, context, nx, ny, nz);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Normal3sv(const GLshort *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Normal3sv, "glNormal3sv", "context = %d, v = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateNormal3sv(context, v));
-        if (isCallValid)
-        {
-            context->normal3sv(v);
-        }
-        ANGLE_CAPTURE(Normal3sv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY
-Ortho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Ortho, "glOrtho",
-          "context = %d, left = %f, right = %f, bottom = %f, top = %f, zNear = %f, zFar = %f",
-          CID(context), left, right, bottom, top, zNear, zFar);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateOrtho(context, left, right, bottom, top, zNear, zFar));
-        if (isCallValid)
-        {
-            context->ortho(left, right, bottom, top, zNear, zFar);
-        }
-        ANGLE_CAPTURE(Ortho, isCallValid, context, left, right, bottom, top, zNear, zFar);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY PassThrough(GLfloat token)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PassThrough, "glPassThrough", "context = %d, token = %f",
-          CID(context), token);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidatePassThrough(context, token));
-        if (isCallValid)
-        {
-            context->passThrough(token);
-        }
-        ANGLE_CAPTURE(PassThrough, isCallValid, context, token);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY PixelMapfv(GLenum map, GLsizei mapsize, const GLfloat *values)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PixelMapfv, "glPixelMapfv",
-          "context = %d, map = %s, mapsize = %d, values = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::PixelMap, map), mapsize, (uintptr_t)values);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidatePixelMapfv(context, map, mapsize, values));
-        if (isCallValid)
-        {
-            context->pixelMapfv(map, mapsize, values);
-        }
-        ANGLE_CAPTURE(PixelMapfv, isCallValid, context, map, mapsize, values);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY PixelMapuiv(GLenum map, GLsizei mapsize, const GLuint *values)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PixelMapuiv, "glPixelMapuiv",
-          "context = %d, map = %s, mapsize = %d, values = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::PixelMap, map), mapsize, (uintptr_t)values);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidatePixelMapuiv(context, map, mapsize, values));
-        if (isCallValid)
-        {
-            context->pixelMapuiv(map, mapsize, values);
-        }
-        ANGLE_CAPTURE(PixelMapuiv, isCallValid, context, map, mapsize, values);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY PixelMapusv(GLenum map, GLsizei mapsize, const GLushort *values)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PixelMapusv, "glPixelMapusv",
-          "context = %d, map = %s, mapsize = %d, values = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::PixelMap, map), mapsize, (uintptr_t)values);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidatePixelMapusv(context, map, mapsize, values));
-        if (isCallValid)
-        {
-            context->pixelMapusv(map, mapsize, values);
-        }
-        ANGLE_CAPTURE(PixelMapusv, isCallValid, context, map, mapsize, values);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY PixelStoref(GLenum pname, GLfloat param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PixelStoref, "glPixelStoref",
-          "context = %d, pname = %s, param = %f", CID(context),
-          GLenumToString(GLenumGroup::PixelStoreParameter, pname), param);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidatePixelStoref(context, pname, param));
-        if (isCallValid)
-        {
-            context->pixelStoref(pname, param);
-        }
-        ANGLE_CAPTURE(PixelStoref, isCallValid, context, pname, param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY PixelStorei(GLenum pname, GLint param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PixelStorei, "glPixelStorei",
-          "context = %d, pname = %s, param = %d", CID(context),
-          GLenumToString(GLenumGroup::PixelStoreParameter, pname), param);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidatePixelStorei(context, pname, param));
-        if (isCallValid)
-        {
-            context->pixelStorei(pname, param);
-        }
-        ANGLE_CAPTURE(PixelStorei, isCallValid, context, pname, param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY PixelTransferf(GLenum pname, GLfloat param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PixelTransferf, "glPixelTransferf",
-          "context = %d, pname = %s, param = %f", CID(context),
-          GLenumToString(GLenumGroup::PixelTransferParameter, pname), param);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidatePixelTransferf(context, pname, param));
-        if (isCallValid)
-        {
-            context->pixelTransferf(pname, param);
-        }
-        ANGLE_CAPTURE(PixelTransferf, isCallValid, context, pname, param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY PixelTransferi(GLenum pname, GLint param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PixelTransferi, "glPixelTransferi",
-          "context = %d, pname = %s, param = %d", CID(context),
-          GLenumToString(GLenumGroup::PixelTransferParameter, pname), param);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidatePixelTransferi(context, pname, param));
-        if (isCallValid)
-        {
-            context->pixelTransferi(pname, param);
-        }
-        ANGLE_CAPTURE(PixelTransferi, isCallValid, context, pname, param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY PixelZoom(GLfloat xfactor, GLfloat yfactor)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PixelZoom, "glPixelZoom",
-          "context = %d, xfactor = %f, yfactor = %f", CID(context), xfactor, yfactor);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidatePixelZoom(context, xfactor, yfactor));
-        if (isCallValid)
-        {
-            context->pixelZoom(xfactor, yfactor);
-        }
-        ANGLE_CAPTURE(PixelZoom, isCallValid, context, xfactor, yfactor);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY PointSize(GLfloat size)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PointSize, "glPointSize", "context = %d, size = %f",
-          CID(context), size);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidatePointSize(context, size));
-        if (isCallValid)
-        {
-            context->pointSize(size);
-        }
-        ANGLE_CAPTURE(PointSize, isCallValid, context, size);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY PolygonMode(GLenum face, GLenum mode)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PolygonMode, "glPolygonMode",
-          "context = %d, face = %s, mode = %s", CID(context),
-          GLenumToString(GLenumGroup::MaterialFace, face),
-          GLenumToString(GLenumGroup::PolygonMode, mode));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidatePolygonMode(context, face, mode));
-        if (isCallValid)
-        {
-            context->polygonMode(face, mode);
-        }
-        ANGLE_CAPTURE(PolygonMode, isCallValid, context, face, mode);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY PolygonStipple(const GLubyte *mask)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PolygonStipple, "glPolygonStipple",
-          "context = %d, mask = 0x%016" PRIxPTR "", CID(context), (uintptr_t)mask);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidatePolygonStipple(context, mask));
-        if (isCallValid)
-        {
-            context->polygonStipple(mask);
-        }
-        ANGLE_CAPTURE(PolygonStipple, isCallValid, context, mask);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY PopAttrib()
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PopAttrib, "glPopAttrib", "context = %d", CID(context));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidatePopAttrib(context));
-        if (isCallValid)
-        {
-            context->popAttrib();
-        }
-        ANGLE_CAPTURE(PopAttrib, isCallValid, context);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY PopMatrix()
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PopMatrix, "glPopMatrix", "context = %d", CID(context));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidatePopMatrix(context));
-        if (isCallValid)
-        {
-            context->popMatrix();
-        }
-        ANGLE_CAPTURE(PopMatrix, isCallValid, context);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY PopName()
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PopName, "glPopName", "context = %d", CID(context));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidatePopName(context));
-        if (isCallValid)
-        {
-            context->popName();
-        }
-        ANGLE_CAPTURE(PopName, isCallValid, context);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY PushAttrib(GLbitfield mask)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PushAttrib, "glPushAttrib", "context = %d, mask = %s",
-          CID(context), GLbitfieldToString(GLenumGroup::AttribMask, mask).c_str());
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidatePushAttrib(context, mask));
-        if (isCallValid)
-        {
-            context->pushAttrib(mask);
-        }
-        ANGLE_CAPTURE(PushAttrib, isCallValid, context, mask);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY PushMatrix()
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PushMatrix, "glPushMatrix", "context = %d", CID(context));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidatePushMatrix(context));
-        if (isCallValid)
-        {
-            context->pushMatrix();
-        }
-        ANGLE_CAPTURE(PushMatrix, isCallValid, context);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY PushName(GLuint name)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PushName, "glPushName", "context = %d, name = %u", CID(context),
-          name);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidatePushName(context, name));
-        if (isCallValid)
-        {
-            context->pushName(name);
-        }
-        ANGLE_CAPTURE(PushName, isCallValid, context, name);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY RasterPos2d(GLdouble x, GLdouble y)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::RasterPos2d, "glRasterPos2d", "context = %d, x = %f, y = %f",
-          CID(context), x, y);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateRasterPos2d(context, x, y));
-        if (isCallValid)
-        {
-            context->rasterPos2d(x, y);
-        }
-        ANGLE_CAPTURE(RasterPos2d, isCallValid, context, x, y);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY RasterPos2dv(const GLdouble *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::RasterPos2dv, "glRasterPos2dv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateRasterPos2dv(context, v));
-        if (isCallValid)
-        {
-            context->rasterPos2dv(v);
-        }
-        ANGLE_CAPTURE(RasterPos2dv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY RasterPos2f(GLfloat x, GLfloat y)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::RasterPos2f, "glRasterPos2f", "context = %d, x = %f, y = %f",
-          CID(context), x, y);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateRasterPos2f(context, x, y));
-        if (isCallValid)
-        {
-            context->rasterPos2f(x, y);
-        }
-        ANGLE_CAPTURE(RasterPos2f, isCallValid, context, x, y);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY RasterPos2fv(const GLfloat *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::RasterPos2fv, "glRasterPos2fv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateRasterPos2fv(context, v));
-        if (isCallValid)
-        {
-            context->rasterPos2fv(v);
-        }
-        ANGLE_CAPTURE(RasterPos2fv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY RasterPos2i(GLint x, GLint y)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::RasterPos2i, "glRasterPos2i", "context = %d, x = %d, y = %d",
-          CID(context), x, y);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateRasterPos2i(context, x, y));
-        if (isCallValid)
-        {
-            context->rasterPos2i(x, y);
-        }
-        ANGLE_CAPTURE(RasterPos2i, isCallValid, context, x, y);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY RasterPos2iv(const GLint *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::RasterPos2iv, "glRasterPos2iv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateRasterPos2iv(context, v));
-        if (isCallValid)
-        {
-            context->rasterPos2iv(v);
-        }
-        ANGLE_CAPTURE(RasterPos2iv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY RasterPos2s(GLshort x, GLshort y)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::RasterPos2s, "glRasterPos2s", "context = %d, x = %d, y = %d",
-          CID(context), x, y);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateRasterPos2s(context, x, y));
-        if (isCallValid)
-        {
-            context->rasterPos2s(x, y);
-        }
-        ANGLE_CAPTURE(RasterPos2s, isCallValid, context, x, y);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY RasterPos2sv(const GLshort *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::RasterPos2sv, "glRasterPos2sv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateRasterPos2sv(context, v));
-        if (isCallValid)
-        {
-            context->rasterPos2sv(v);
-        }
-        ANGLE_CAPTURE(RasterPos2sv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY RasterPos3d(GLdouble x, GLdouble y, GLdouble z)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::RasterPos3d, "glRasterPos3d",
-          "context = %d, x = %f, y = %f, z = %f", CID(context), x, y, z);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateRasterPos3d(context, x, y, z));
-        if (isCallValid)
-        {
-            context->rasterPos3d(x, y, z);
-        }
-        ANGLE_CAPTURE(RasterPos3d, isCallValid, context, x, y, z);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY RasterPos3dv(const GLdouble *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::RasterPos3dv, "glRasterPos3dv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateRasterPos3dv(context, v));
-        if (isCallValid)
-        {
-            context->rasterPos3dv(v);
-        }
-        ANGLE_CAPTURE(RasterPos3dv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY RasterPos3f(GLfloat x, GLfloat y, GLfloat z)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::RasterPos3f, "glRasterPos3f",
-          "context = %d, x = %f, y = %f, z = %f", CID(context), x, y, z);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateRasterPos3f(context, x, y, z));
-        if (isCallValid)
-        {
-            context->rasterPos3f(x, y, z);
-        }
-        ANGLE_CAPTURE(RasterPos3f, isCallValid, context, x, y, z);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY RasterPos3fv(const GLfloat *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::RasterPos3fv, "glRasterPos3fv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateRasterPos3fv(context, v));
-        if (isCallValid)
-        {
-            context->rasterPos3fv(v);
-        }
-        ANGLE_CAPTURE(RasterPos3fv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY RasterPos3i(GLint x, GLint y, GLint z)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::RasterPos3i, "glRasterPos3i",
-          "context = %d, x = %d, y = %d, z = %d", CID(context), x, y, z);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateRasterPos3i(context, x, y, z));
-        if (isCallValid)
-        {
-            context->rasterPos3i(x, y, z);
-        }
-        ANGLE_CAPTURE(RasterPos3i, isCallValid, context, x, y, z);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY RasterPos3iv(const GLint *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::RasterPos3iv, "glRasterPos3iv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateRasterPos3iv(context, v));
-        if (isCallValid)
-        {
-            context->rasterPos3iv(v);
-        }
-        ANGLE_CAPTURE(RasterPos3iv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY RasterPos3s(GLshort x, GLshort y, GLshort z)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::RasterPos3s, "glRasterPos3s",
-          "context = %d, x = %d, y = %d, z = %d", CID(context), x, y, z);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateRasterPos3s(context, x, y, z));
-        if (isCallValid)
-        {
-            context->rasterPos3s(x, y, z);
-        }
-        ANGLE_CAPTURE(RasterPos3s, isCallValid, context, x, y, z);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY RasterPos3sv(const GLshort *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::RasterPos3sv, "glRasterPos3sv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateRasterPos3sv(context, v));
-        if (isCallValid)
-        {
-            context->rasterPos3sv(v);
-        }
-        ANGLE_CAPTURE(RasterPos3sv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY RasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::RasterPos4d, "glRasterPos4d",
-          "context = %d, x = %f, y = %f, z = %f, w = %f", CID(context), x, y, z, w);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateRasterPos4d(context, x, y, z, w));
-        if (isCallValid)
-        {
-            context->rasterPos4d(x, y, z, w);
-        }
-        ANGLE_CAPTURE(RasterPos4d, isCallValid, context, x, y, z, w);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY RasterPos4dv(const GLdouble *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::RasterPos4dv, "glRasterPos4dv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateRasterPos4dv(context, v));
-        if (isCallValid)
-        {
-            context->rasterPos4dv(v);
-        }
-        ANGLE_CAPTURE(RasterPos4dv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY RasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::RasterPos4f, "glRasterPos4f",
-          "context = %d, x = %f, y = %f, z = %f, w = %f", CID(context), x, y, z, w);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateRasterPos4f(context, x, y, z, w));
-        if (isCallValid)
-        {
-            context->rasterPos4f(x, y, z, w);
-        }
-        ANGLE_CAPTURE(RasterPos4f, isCallValid, context, x, y, z, w);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY RasterPos4fv(const GLfloat *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::RasterPos4fv, "glRasterPos4fv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateRasterPos4fv(context, v));
-        if (isCallValid)
-        {
-            context->rasterPos4fv(v);
-        }
-        ANGLE_CAPTURE(RasterPos4fv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY RasterPos4i(GLint x, GLint y, GLint z, GLint w)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::RasterPos4i, "glRasterPos4i",
-          "context = %d, x = %d, y = %d, z = %d, w = %d", CID(context), x, y, z, w);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateRasterPos4i(context, x, y, z, w));
-        if (isCallValid)
-        {
-            context->rasterPos4i(x, y, z, w);
-        }
-        ANGLE_CAPTURE(RasterPos4i, isCallValid, context, x, y, z, w);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY RasterPos4iv(const GLint *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::RasterPos4iv, "glRasterPos4iv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateRasterPos4iv(context, v));
-        if (isCallValid)
-        {
-            context->rasterPos4iv(v);
-        }
-        ANGLE_CAPTURE(RasterPos4iv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY RasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::RasterPos4s, "glRasterPos4s",
-          "context = %d, x = %d, y = %d, z = %d, w = %d", CID(context), x, y, z, w);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateRasterPos4s(context, x, y, z, w));
-        if (isCallValid)
-        {
-            context->rasterPos4s(x, y, z, w);
-        }
-        ANGLE_CAPTURE(RasterPos4s, isCallValid, context, x, y, z, w);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY RasterPos4sv(const GLshort *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::RasterPos4sv, "glRasterPos4sv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateRasterPos4sv(context, v));
-        if (isCallValid)
-        {
-            context->rasterPos4sv(v);
-        }
-        ANGLE_CAPTURE(RasterPos4sv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ReadBuffer(GLenum src)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ReadBuffer, "glReadBuffer", "context = %d, src = %s",
-          CID(context), GLenumToString(GLenumGroup::ReadBufferMode, src));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateReadBuffer(context, src));
-        if (isCallValid)
-        {
-            context->readBuffer(src);
-        }
-        ANGLE_CAPTURE(ReadBuffer, isCallValid, context, src);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ReadPixels(GLint x,
-                            GLint y,
-                            GLsizei width,
-                            GLsizei height,
-                            GLenum format,
-                            GLenum type,
-                            void *pixels)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ReadPixels, "glReadPixels",
-          "context = %d, x = %d, y = %d, width = %d, height = %d, format = %s, type = %s, pixels = "
-          "0x%016" PRIxPTR "",
-          CID(context), x, y, width, height, GLenumToString(GLenumGroup::PixelFormat, format),
-          GLenumToString(GLenumGroup::PixelType, type), (uintptr_t)pixels);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateReadPixels(context, x, y, width, height, format, type, pixels));
-        if (isCallValid)
-        {
-            context->readPixels(x, y, width, height, format, type, pixels);
-        }
-        ANGLE_CAPTURE(ReadPixels, isCallValid, context, x, y, width, height, format, type, pixels);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Rectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Rectd, "glRectd",
-          "context = %d, x1 = %f, y1 = %f, x2 = %f, y2 = %f", CID(context), x1, y1, x2, y2);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateRectd(context, x1, y1, x2, y2));
-        if (isCallValid)
-        {
-            context->rectd(x1, y1, x2, y2);
-        }
-        ANGLE_CAPTURE(Rectd, isCallValid, context, x1, y1, x2, y2);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Rectdv(const GLdouble *v1, const GLdouble *v2)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Rectdv, "glRectdv",
-          "context = %d, v1 = 0x%016" PRIxPTR ", v2 = 0x%016" PRIxPTR "", CID(context),
-          (uintptr_t)v1, (uintptr_t)v2);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateRectdv(context, v1, v2));
-        if (isCallValid)
-        {
-            context->rectdv(v1, v2);
-        }
-        ANGLE_CAPTURE(Rectdv, isCallValid, context, v1, v2);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Rectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Rectf, "glRectf",
-          "context = %d, x1 = %f, y1 = %f, x2 = %f, y2 = %f", CID(context), x1, y1, x2, y2);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateRectf(context, x1, y1, x2, y2));
-        if (isCallValid)
-        {
-            context->rectf(x1, y1, x2, y2);
-        }
-        ANGLE_CAPTURE(Rectf, isCallValid, context, x1, y1, x2, y2);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Rectfv(const GLfloat *v1, const GLfloat *v2)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Rectfv, "glRectfv",
-          "context = %d, v1 = 0x%016" PRIxPTR ", v2 = 0x%016" PRIxPTR "", CID(context),
-          (uintptr_t)v1, (uintptr_t)v2);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateRectfv(context, v1, v2));
-        if (isCallValid)
-        {
-            context->rectfv(v1, v2);
-        }
-        ANGLE_CAPTURE(Rectfv, isCallValid, context, v1, v2);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Recti(GLint x1, GLint y1, GLint x2, GLint y2)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Recti, "glRecti",
-          "context = %d, x1 = %d, y1 = %d, x2 = %d, y2 = %d", CID(context), x1, y1, x2, y2);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateRecti(context, x1, y1, x2, y2));
-        if (isCallValid)
-        {
-            context->recti(x1, y1, x2, y2);
-        }
-        ANGLE_CAPTURE(Recti, isCallValid, context, x1, y1, x2, y2);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Rectiv(const GLint *v1, const GLint *v2)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Rectiv, "glRectiv",
-          "context = %d, v1 = 0x%016" PRIxPTR ", v2 = 0x%016" PRIxPTR "", CID(context),
-          (uintptr_t)v1, (uintptr_t)v2);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateRectiv(context, v1, v2));
-        if (isCallValid)
-        {
-            context->rectiv(v1, v2);
-        }
-        ANGLE_CAPTURE(Rectiv, isCallValid, context, v1, v2);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Rects(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Rects, "glRects",
-          "context = %d, x1 = %d, y1 = %d, x2 = %d, y2 = %d", CID(context), x1, y1, x2, y2);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateRects(context, x1, y1, x2, y2));
-        if (isCallValid)
-        {
-            context->rects(x1, y1, x2, y2);
-        }
-        ANGLE_CAPTURE(Rects, isCallValid, context, x1, y1, x2, y2);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Rectsv(const GLshort *v1, const GLshort *v2)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Rectsv, "glRectsv",
-          "context = %d, v1 = 0x%016" PRIxPTR ", v2 = 0x%016" PRIxPTR "", CID(context),
-          (uintptr_t)v1, (uintptr_t)v2);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateRectsv(context, v1, v2));
-        if (isCallValid)
-        {
-            context->rectsv(v1, v2);
-        }
-        ANGLE_CAPTURE(Rectsv, isCallValid, context, v1, v2);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-GLint GL_APIENTRY RenderMode(GLenum mode)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::RenderMode, "glRenderMode", "context = %d, mode = %s",
-          CID(context), GLenumToString(GLenumGroup::RenderingMode, mode));
-
-    GLint returnValue;
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateRenderMode(context, mode));
-        if (isCallValid)
-        {
-            returnValue = context->renderMode(mode);
-        }
-        else
-        {
-            returnValue = GetDefaultReturnValue<EntryPoint::RenderMode, GLint>();
-        }
-        ANGLE_CAPTURE(RenderMode, isCallValid, context, mode, returnValue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::RenderMode, GLint>();
-    }
-    return returnValue;
-}
-
-void GL_APIENTRY Rotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Rotated, "glRotated",
-          "context = %d, angle = %f, x = %f, y = %f, z = %f", CID(context), angle, x, y, z);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateRotated(context, angle, x, y, z));
-        if (isCallValid)
-        {
-            context->rotated(angle, x, y, z);
-        }
-        ANGLE_CAPTURE(Rotated, isCallValid, context, angle, x, y, z);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Rotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Rotatef, "glRotatef",
-          "context = %d, angle = %f, x = %f, y = %f, z = %f", CID(context), angle, x, y, z);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateRotatef(context, angle, x, y, z));
-        if (isCallValid)
-        {
-            context->rotatef(angle, x, y, z);
-        }
-        ANGLE_CAPTURE(Rotatef, isCallValid, context, angle, x, y, z);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Scaled(GLdouble x, GLdouble y, GLdouble z)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Scaled, "glScaled", "context = %d, x = %f, y = %f, z = %f",
-          CID(context), x, y, z);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateScaled(context, x, y, z));
-        if (isCallValid)
-        {
-            context->scaled(x, y, z);
-        }
-        ANGLE_CAPTURE(Scaled, isCallValid, context, x, y, z);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Scalef(GLfloat x, GLfloat y, GLfloat z)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Scalef, "glScalef", "context = %d, x = %f, y = %f, z = %f",
-          CID(context), x, y, z);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateScalef(context, x, y, z));
-        if (isCallValid)
-        {
-            context->scalef(x, y, z);
-        }
-        ANGLE_CAPTURE(Scalef, isCallValid, context, x, y, z);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Scissor(GLint x, GLint y, GLsizei width, GLsizei height)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Scissor, "glScissor",
-          "context = %d, x = %d, y = %d, width = %d, height = %d", CID(context), x, y, width,
-          height);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateScissor(context, x, y, width, height));
-        if (isCallValid)
-        {
-            context->scissor(x, y, width, height);
-        }
-        ANGLE_CAPTURE(Scissor, isCallValid, context, x, y, width, height);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY SelectBuffer(GLsizei size, GLuint *buffer)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SelectBuffer, "glSelectBuffer",
-          "context = %d, size = %d, buffer = 0x%016" PRIxPTR "", CID(context), size,
-          (uintptr_t)buffer);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateSelectBuffer(context, size, buffer));
-        if (isCallValid)
-        {
-            context->selectBuffer(size, buffer);
-        }
-        ANGLE_CAPTURE(SelectBuffer, isCallValid, context, size, buffer);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ShadeModel(GLenum mode)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ShadeModel, "glShadeModel", "context = %d, mode = %s",
-          CID(context), GLenumToString(GLenumGroup::ShadingModel, mode));
-
-    if (context)
-    {
-        ShadingModel modePacked                               = FromGL<ShadingModel>(mode);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateShadeModel(context, modePacked));
-        if (isCallValid)
-        {
-            context->shadeModel(modePacked);
-        }
-        ANGLE_CAPTURE(ShadeModel, isCallValid, context, modePacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY StencilFunc(GLenum func, GLint ref, GLuint mask)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::StencilFunc, "glStencilFunc",
-          "context = %d, func = %s, ref = %d, mask = %u", CID(context),
-          GLenumToString(GLenumGroup::StencilFunction, func), ref, mask);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateStencilFunc(context, func, ref, mask));
-        if (isCallValid)
-        {
-            context->stencilFunc(func, ref, mask);
-        }
-        ANGLE_CAPTURE(StencilFunc, isCallValid, context, func, ref, mask);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY StencilMask(GLuint mask)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::StencilMask, "glStencilMask", "context = %d, mask = %u",
-          CID(context), mask);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateStencilMask(context, mask));
-        if (isCallValid)
-        {
-            context->stencilMask(mask);
-        }
-        ANGLE_CAPTURE(StencilMask, isCallValid, context, mask);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY StencilOp(GLenum fail, GLenum zfail, GLenum zpass)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::StencilOp, "glStencilOp",
-          "context = %d, fail = %s, zfail = %s, zpass = %s", CID(context),
-          GLenumToString(GLenumGroup::StencilOp, fail),
-          GLenumToString(GLenumGroup::StencilOp, zfail),
-          GLenumToString(GLenumGroup::StencilOp, zpass));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateStencilOp(context, fail, zfail, zpass));
-        if (isCallValid)
-        {
-            context->stencilOp(fail, zfail, zpass);
-        }
-        ANGLE_CAPTURE(StencilOp, isCallValid, context, fail, zfail, zpass);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoord1d(GLdouble s)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoord1d, "glTexCoord1d", "context = %d, s = %f", CID(context),
-          s);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateTexCoord1d(context, s));
-        if (isCallValid)
-        {
-            context->texCoord1d(s);
-        }
-        ANGLE_CAPTURE(TexCoord1d, isCallValid, context, s);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoord1dv(const GLdouble *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoord1dv, "glTexCoord1dv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateTexCoord1dv(context, v));
-        if (isCallValid)
-        {
-            context->texCoord1dv(v);
-        }
-        ANGLE_CAPTURE(TexCoord1dv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoord1f(GLfloat s)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoord1f, "glTexCoord1f", "context = %d, s = %f", CID(context),
-          s);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateTexCoord1f(context, s));
-        if (isCallValid)
-        {
-            context->texCoord1f(s);
-        }
-        ANGLE_CAPTURE(TexCoord1f, isCallValid, context, s);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoord1fv(const GLfloat *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoord1fv, "glTexCoord1fv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateTexCoord1fv(context, v));
-        if (isCallValid)
-        {
-            context->texCoord1fv(v);
-        }
-        ANGLE_CAPTURE(TexCoord1fv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoord1i(GLint s)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoord1i, "glTexCoord1i", "context = %d, s = %d", CID(context),
-          s);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateTexCoord1i(context, s));
-        if (isCallValid)
-        {
-            context->texCoord1i(s);
-        }
-        ANGLE_CAPTURE(TexCoord1i, isCallValid, context, s);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoord1iv(const GLint *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoord1iv, "glTexCoord1iv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateTexCoord1iv(context, v));
-        if (isCallValid)
-        {
-            context->texCoord1iv(v);
-        }
-        ANGLE_CAPTURE(TexCoord1iv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoord1s(GLshort s)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoord1s, "glTexCoord1s", "context = %d, s = %d", CID(context),
-          s);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateTexCoord1s(context, s));
-        if (isCallValid)
-        {
-            context->texCoord1s(s);
-        }
-        ANGLE_CAPTURE(TexCoord1s, isCallValid, context, s);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoord1sv(const GLshort *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoord1sv, "glTexCoord1sv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateTexCoord1sv(context, v));
-        if (isCallValid)
-        {
-            context->texCoord1sv(v);
-        }
-        ANGLE_CAPTURE(TexCoord1sv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoord2d(GLdouble s, GLdouble t)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoord2d, "glTexCoord2d", "context = %d, s = %f, t = %f",
-          CID(context), s, t);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateTexCoord2d(context, s, t));
-        if (isCallValid)
-        {
-            context->texCoord2d(s, t);
-        }
-        ANGLE_CAPTURE(TexCoord2d, isCallValid, context, s, t);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoord2dv(const GLdouble *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoord2dv, "glTexCoord2dv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateTexCoord2dv(context, v));
-        if (isCallValid)
-        {
-            context->texCoord2dv(v);
-        }
-        ANGLE_CAPTURE(TexCoord2dv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoord2f(GLfloat s, GLfloat t)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoord2f, "glTexCoord2f", "context = %d, s = %f, t = %f",
-          CID(context), s, t);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateTexCoord2f(context, s, t));
-        if (isCallValid)
-        {
-            context->texCoord2f(s, t);
-        }
-        ANGLE_CAPTURE(TexCoord2f, isCallValid, context, s, t);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoord2fv(const GLfloat *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoord2fv, "glTexCoord2fv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateTexCoord2fv(context, v));
-        if (isCallValid)
-        {
-            context->texCoord2fv(v);
-        }
-        ANGLE_CAPTURE(TexCoord2fv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoord2i(GLint s, GLint t)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoord2i, "glTexCoord2i", "context = %d, s = %d, t = %d",
-          CID(context), s, t);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateTexCoord2i(context, s, t));
-        if (isCallValid)
-        {
-            context->texCoord2i(s, t);
-        }
-        ANGLE_CAPTURE(TexCoord2i, isCallValid, context, s, t);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoord2iv(const GLint *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoord2iv, "glTexCoord2iv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateTexCoord2iv(context, v));
-        if (isCallValid)
-        {
-            context->texCoord2iv(v);
-        }
-        ANGLE_CAPTURE(TexCoord2iv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoord2s(GLshort s, GLshort t)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoord2s, "glTexCoord2s", "context = %d, s = %d, t = %d",
-          CID(context), s, t);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateTexCoord2s(context, s, t));
-        if (isCallValid)
-        {
-            context->texCoord2s(s, t);
-        }
-        ANGLE_CAPTURE(TexCoord2s, isCallValid, context, s, t);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoord2sv(const GLshort *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoord2sv, "glTexCoord2sv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateTexCoord2sv(context, v));
-        if (isCallValid)
-        {
-            context->texCoord2sv(v);
-        }
-        ANGLE_CAPTURE(TexCoord2sv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoord3d(GLdouble s, GLdouble t, GLdouble r)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoord3d, "glTexCoord3d",
-          "context = %d, s = %f, t = %f, r = %f", CID(context), s, t, r);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateTexCoord3d(context, s, t, r));
-        if (isCallValid)
-        {
-            context->texCoord3d(s, t, r);
-        }
-        ANGLE_CAPTURE(TexCoord3d, isCallValid, context, s, t, r);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoord3dv(const GLdouble *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoord3dv, "glTexCoord3dv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateTexCoord3dv(context, v));
-        if (isCallValid)
-        {
-            context->texCoord3dv(v);
-        }
-        ANGLE_CAPTURE(TexCoord3dv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoord3f(GLfloat s, GLfloat t, GLfloat r)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoord3f, "glTexCoord3f",
-          "context = %d, s = %f, t = %f, r = %f", CID(context), s, t, r);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateTexCoord3f(context, s, t, r));
-        if (isCallValid)
-        {
-            context->texCoord3f(s, t, r);
-        }
-        ANGLE_CAPTURE(TexCoord3f, isCallValid, context, s, t, r);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoord3fv(const GLfloat *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoord3fv, "glTexCoord3fv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateTexCoord3fv(context, v));
-        if (isCallValid)
-        {
-            context->texCoord3fv(v);
-        }
-        ANGLE_CAPTURE(TexCoord3fv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoord3i(GLint s, GLint t, GLint r)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoord3i, "glTexCoord3i",
-          "context = %d, s = %d, t = %d, r = %d", CID(context), s, t, r);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateTexCoord3i(context, s, t, r));
-        if (isCallValid)
-        {
-            context->texCoord3i(s, t, r);
-        }
-        ANGLE_CAPTURE(TexCoord3i, isCallValid, context, s, t, r);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoord3iv(const GLint *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoord3iv, "glTexCoord3iv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateTexCoord3iv(context, v));
-        if (isCallValid)
-        {
-            context->texCoord3iv(v);
-        }
-        ANGLE_CAPTURE(TexCoord3iv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoord3s(GLshort s, GLshort t, GLshort r)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoord3s, "glTexCoord3s",
-          "context = %d, s = %d, t = %d, r = %d", CID(context), s, t, r);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateTexCoord3s(context, s, t, r));
-        if (isCallValid)
-        {
-            context->texCoord3s(s, t, r);
-        }
-        ANGLE_CAPTURE(TexCoord3s, isCallValid, context, s, t, r);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoord3sv(const GLshort *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoord3sv, "glTexCoord3sv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateTexCoord3sv(context, v));
-        if (isCallValid)
-        {
-            context->texCoord3sv(v);
-        }
-        ANGLE_CAPTURE(TexCoord3sv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoord4d, "glTexCoord4d",
-          "context = %d, s = %f, t = %f, r = %f, q = %f", CID(context), s, t, r, q);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateTexCoord4d(context, s, t, r, q));
-        if (isCallValid)
-        {
-            context->texCoord4d(s, t, r, q);
-        }
-        ANGLE_CAPTURE(TexCoord4d, isCallValid, context, s, t, r, q);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoord4dv(const GLdouble *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoord4dv, "glTexCoord4dv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateTexCoord4dv(context, v));
-        if (isCallValid)
-        {
-            context->texCoord4dv(v);
-        }
-        ANGLE_CAPTURE(TexCoord4dv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoord4f, "glTexCoord4f",
-          "context = %d, s = %f, t = %f, r = %f, q = %f", CID(context), s, t, r, q);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateTexCoord4f(context, s, t, r, q));
-        if (isCallValid)
-        {
-            context->texCoord4f(s, t, r, q);
-        }
-        ANGLE_CAPTURE(TexCoord4f, isCallValid, context, s, t, r, q);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoord4fv(const GLfloat *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoord4fv, "glTexCoord4fv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateTexCoord4fv(context, v));
-        if (isCallValid)
-        {
-            context->texCoord4fv(v);
-        }
-        ANGLE_CAPTURE(TexCoord4fv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoord4i(GLint s, GLint t, GLint r, GLint q)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoord4i, "glTexCoord4i",
-          "context = %d, s = %d, t = %d, r = %d, q = %d", CID(context), s, t, r, q);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateTexCoord4i(context, s, t, r, q));
-        if (isCallValid)
-        {
-            context->texCoord4i(s, t, r, q);
-        }
-        ANGLE_CAPTURE(TexCoord4i, isCallValid, context, s, t, r, q);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoord4iv(const GLint *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoord4iv, "glTexCoord4iv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateTexCoord4iv(context, v));
-        if (isCallValid)
-        {
-            context->texCoord4iv(v);
-        }
-        ANGLE_CAPTURE(TexCoord4iv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoord4s, "glTexCoord4s",
-          "context = %d, s = %d, t = %d, r = %d, q = %d", CID(context), s, t, r, q);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateTexCoord4s(context, s, t, r, q));
-        if (isCallValid)
-        {
-            context->texCoord4s(s, t, r, q);
-        }
-        ANGLE_CAPTURE(TexCoord4s, isCallValid, context, s, t, r, q);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoord4sv(const GLshort *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoord4sv, "glTexCoord4sv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateTexCoord4sv(context, v));
-        if (isCallValid)
-        {
-            context->texCoord4sv(v);
-        }
-        ANGLE_CAPTURE(TexCoord4sv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexEnvf(GLenum target, GLenum pname, GLfloat param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexEnvf, "glTexEnvf",
-          "context = %d, target = %s, pname = %s, param = %f", CID(context),
-          GLenumToString(GLenumGroup::TextureEnvTarget, target),
-          GLenumToString(GLenumGroup::TextureEnvParameter, pname), param);
-
-    if (context)
-    {
-        TextureEnvTarget targetPacked                         = FromGL<TextureEnvTarget>(target);
-        TextureEnvParameter pnamePacked                       = FromGL<TextureEnvParameter>(pname);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateTexEnvf(context, targetPacked, pnamePacked, param));
-        if (isCallValid)
-        {
-            context->texEnvf(targetPacked, pnamePacked, param);
-        }
-        ANGLE_CAPTURE(TexEnvf, isCallValid, context, targetPacked, pnamePacked, param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexEnvfv, "glTexEnvfv",
-          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureEnvTarget, target),
-          GLenumToString(GLenumGroup::TextureEnvParameter, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        TextureEnvTarget targetPacked                         = FromGL<TextureEnvTarget>(target);
-        TextureEnvParameter pnamePacked                       = FromGL<TextureEnvParameter>(pname);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateTexEnvfv(context, targetPacked, pnamePacked, params));
-        if (isCallValid)
-        {
-            context->texEnvfv(targetPacked, pnamePacked, params);
-        }
-        ANGLE_CAPTURE(TexEnvfv, isCallValid, context, targetPacked, pnamePacked, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexEnvi(GLenum target, GLenum pname, GLint param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexEnvi, "glTexEnvi",
-          "context = %d, target = %s, pname = %s, param = %d", CID(context),
-          GLenumToString(GLenumGroup::TextureEnvTarget, target),
-          GLenumToString(GLenumGroup::TextureEnvParameter, pname), param);
-
-    if (context)
-    {
-        TextureEnvTarget targetPacked                         = FromGL<TextureEnvTarget>(target);
-        TextureEnvParameter pnamePacked                       = FromGL<TextureEnvParameter>(pname);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateTexEnvi(context, targetPacked, pnamePacked, param));
-        if (isCallValid)
-        {
-            context->texEnvi(targetPacked, pnamePacked, param);
-        }
-        ANGLE_CAPTURE(TexEnvi, isCallValid, context, targetPacked, pnamePacked, param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexEnviv(GLenum target, GLenum pname, const GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexEnviv, "glTexEnviv",
-          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureEnvTarget, target),
-          GLenumToString(GLenumGroup::TextureEnvParameter, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        TextureEnvTarget targetPacked                         = FromGL<TextureEnvTarget>(target);
-        TextureEnvParameter pnamePacked                       = FromGL<TextureEnvParameter>(pname);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateTexEnviv(context, targetPacked, pnamePacked, params));
-        if (isCallValid)
-        {
-            context->texEnviv(targetPacked, pnamePacked, params);
-        }
-        ANGLE_CAPTURE(TexEnviv, isCallValid, context, targetPacked, pnamePacked, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexGend(GLenum coord, GLenum pname, GLdouble param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexGend, "glTexGend",
-          "context = %d, coord = %s, pname = %s, param = %f", CID(context),
-          GLenumToString(GLenumGroup::TextureCoordName, coord),
-          GLenumToString(GLenumGroup::TextureGenParameter, pname), param);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateTexGend(context, coord, pname, param));
-        if (isCallValid)
-        {
-            context->texGend(coord, pname, param);
-        }
-        ANGLE_CAPTURE(TexGend, isCallValid, context, coord, pname, param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexGendv(GLenum coord, GLenum pname, const GLdouble *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexGendv, "glTexGendv",
-          "context = %d, coord = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureCoordName, coord),
-          GLenumToString(GLenumGroup::TextureGenParameter, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateTexGendv(context, coord, pname, params));
-        if (isCallValid)
-        {
-            context->texGendv(coord, pname, params);
-        }
-        ANGLE_CAPTURE(TexGendv, isCallValid, context, coord, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexGenf(GLenum coord, GLenum pname, GLfloat param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexGenf, "glTexGenf",
-          "context = %d, coord = %s, pname = %s, param = %f", CID(context),
-          GLenumToString(GLenumGroup::TextureCoordName, coord),
-          GLenumToString(GLenumGroup::TextureGenParameter, pname), param);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateTexGenf(context, coord, pname, param));
-        if (isCallValid)
-        {
-            context->texGenf(coord, pname, param);
-        }
-        ANGLE_CAPTURE(TexGenf, isCallValid, context, coord, pname, param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexGenfv(GLenum coord, GLenum pname, const GLfloat *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexGenfv, "glTexGenfv",
-          "context = %d, coord = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureCoordName, coord),
-          GLenumToString(GLenumGroup::TextureGenParameter, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateTexGenfv(context, coord, pname, params));
-        if (isCallValid)
-        {
-            context->texGenfv(coord, pname, params);
-        }
-        ANGLE_CAPTURE(TexGenfv, isCallValid, context, coord, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexGeni(GLenum coord, GLenum pname, GLint param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexGeni, "glTexGeni",
-          "context = %d, coord = %s, pname = %s, param = %d", CID(context),
-          GLenumToString(GLenumGroup::TextureCoordName, coord),
-          GLenumToString(GLenumGroup::TextureGenParameter, pname), param);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateTexGeni(context, coord, pname, param));
-        if (isCallValid)
-        {
-            context->texGeni(coord, pname, param);
-        }
-        ANGLE_CAPTURE(TexGeni, isCallValid, context, coord, pname, param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexGeniv(GLenum coord, GLenum pname, const GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexGeniv, "glTexGeniv",
-          "context = %d, coord = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureCoordName, coord),
-          GLenumToString(GLenumGroup::TextureGenParameter, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateTexGeniv(context, coord, pname, params));
-        if (isCallValid)
-        {
-            context->texGeniv(coord, pname, params);
-        }
-        ANGLE_CAPTURE(TexGeniv, isCallValid, context, coord, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexImage1D(GLenum target,
-                            GLint level,
-                            GLint internalformat,
-                            GLsizei width,
-                            GLint border,
-                            GLenum format,
-                            GLenum type,
-                            const void *pixels)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexImage1D, "glTexImage1D",
-          "context = %d, target = %s, level = %d, internalformat = %d, width = %d, border = %d, "
-          "format = %s, type = %s, pixels = 0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, internalformat,
-          width, border, GLenumToString(GLenumGroup::PixelFormat, format),
-          GLenumToString(GLenumGroup::PixelType, type), (uintptr_t)pixels);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateTexImage1D(context, target, level, internalformat,
-                                                             width, border, format, type, pixels));
-        if (isCallValid)
-        {
-            context->texImage1D(target, level, internalformat, width, border, format, type, pixels);
-        }
-        ANGLE_CAPTURE(TexImage1D, isCallValid, context, target, level, internalformat, width,
-                      border, format, type, pixels);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexImage2D(GLenum target,
-                            GLint level,
-                            GLint internalformat,
-                            GLsizei width,
-                            GLsizei height,
-                            GLint border,
-                            GLenum format,
-                            GLenum type,
-                            const void *pixels)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexImage2D, "glTexImage2D",
-          "context = %d, target = %s, level = %d, internalformat = %d, width = %d, height = %d, "
-          "border = %d, format = %s, type = %s, pixels = 0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, internalformat,
-          width, height, border, GLenumToString(GLenumGroup::PixelFormat, format),
-          GLenumToString(GLenumGroup::PixelType, type), (uintptr_t)pixels);
-
-    if (context)
-    {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateTexImage2D(context, targetPacked, level, internalformat, width,
-                                               height, border, format, type, pixels));
-        if (isCallValid)
-        {
-            context->texImage2D(targetPacked, level, internalformat, width, height, border, format,
-                                type, pixels);
-        }
-        ANGLE_CAPTURE(TexImage2D, isCallValid, context, targetPacked, level, internalformat, width,
-                      height, border, format, type, pixels);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexParameterf(GLenum target, GLenum pname, GLfloat param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexParameterf, "glTexParameterf",
-          "context = %d, target = %s, pname = %s, param = %f", CID(context),
-          GLenumToString(GLenumGroup::TextureTarget, target),
-          GLenumToString(GLenumGroup::TextureParameterName, pname), param);
-
-    if (context)
-    {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateTexParameterf(context, targetPacked, pname, param));
-        if (isCallValid)
-        {
-            context->texParameterf(targetPacked, pname, param);
-        }
-        ANGLE_CAPTURE(TexParameterf, isCallValid, context, targetPacked, pname, param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexParameterfv, "glTexParameterfv",
-          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureTarget, target),
-          GLenumToString(GLenumGroup::TextureParameterName, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateTexParameterfv(context, targetPacked, pname, params));
-        if (isCallValid)
-        {
-            context->texParameterfv(targetPacked, pname, params);
-        }
-        ANGLE_CAPTURE(TexParameterfv, isCallValid, context, targetPacked, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexParameteri(GLenum target, GLenum pname, GLint param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexParameteri, "glTexParameteri",
-          "context = %d, target = %s, pname = %s, param = %d", CID(context),
-          GLenumToString(GLenumGroup::TextureTarget, target),
-          GLenumToString(GLenumGroup::TextureParameterName, pname), param);
-
-    if (context)
-    {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateTexParameteri(context, targetPacked, pname, param));
-        if (isCallValid)
-        {
-            context->texParameteri(targetPacked, pname, param);
-        }
-        ANGLE_CAPTURE(TexParameteri, isCallValid, context, targetPacked, pname, param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexParameteriv, "glTexParameteriv",
-          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureTarget, target),
-          GLenumToString(GLenumGroup::TextureParameterName, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateTexParameteriv(context, targetPacked, pname, params));
-        if (isCallValid)
-        {
-            context->texParameteriv(targetPacked, pname, params);
-        }
-        ANGLE_CAPTURE(TexParameteriv, isCallValid, context, targetPacked, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Translated(GLdouble x, GLdouble y, GLdouble z)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Translated, "glTranslated",
-          "context = %d, x = %f, y = %f, z = %f", CID(context), x, y, z);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateTranslated(context, x, y, z));
-        if (isCallValid)
-        {
-            context->translated(x, y, z);
-        }
-        ANGLE_CAPTURE(Translated, isCallValid, context, x, y, z);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Translatef(GLfloat x, GLfloat y, GLfloat z)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Translatef, "glTranslatef",
-          "context = %d, x = %f, y = %f, z = %f", CID(context), x, y, z);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateTranslatef(context, x, y, z));
-        if (isCallValid)
-        {
-            context->translatef(x, y, z);
-        }
-        ANGLE_CAPTURE(Translatef, isCallValid, context, x, y, z);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Vertex2d(GLdouble x, GLdouble y)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Vertex2d, "glVertex2d", "context = %d, x = %f, y = %f",
-          CID(context), x, y);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateVertex2d(context, x, y));
-        if (isCallValid)
-        {
-            context->vertex2d(x, y);
-        }
-        ANGLE_CAPTURE(Vertex2d, isCallValid, context, x, y);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Vertex2dv(const GLdouble *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Vertex2dv, "glVertex2dv", "context = %d, v = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateVertex2dv(context, v));
-        if (isCallValid)
-        {
-            context->vertex2dv(v);
-        }
-        ANGLE_CAPTURE(Vertex2dv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Vertex2f(GLfloat x, GLfloat y)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Vertex2f, "glVertex2f", "context = %d, x = %f, y = %f",
-          CID(context), x, y);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateVertex2f(context, x, y));
-        if (isCallValid)
-        {
-            context->vertex2f(x, y);
-        }
-        ANGLE_CAPTURE(Vertex2f, isCallValid, context, x, y);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Vertex2fv(const GLfloat *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Vertex2fv, "glVertex2fv", "context = %d, v = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateVertex2fv(context, v));
-        if (isCallValid)
-        {
-            context->vertex2fv(v);
-        }
-        ANGLE_CAPTURE(Vertex2fv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Vertex2i(GLint x, GLint y)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Vertex2i, "glVertex2i", "context = %d, x = %d, y = %d",
-          CID(context), x, y);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateVertex2i(context, x, y));
-        if (isCallValid)
-        {
-            context->vertex2i(x, y);
-        }
-        ANGLE_CAPTURE(Vertex2i, isCallValid, context, x, y);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Vertex2iv(const GLint *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Vertex2iv, "glVertex2iv", "context = %d, v = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateVertex2iv(context, v));
-        if (isCallValid)
-        {
-            context->vertex2iv(v);
-        }
-        ANGLE_CAPTURE(Vertex2iv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Vertex2s(GLshort x, GLshort y)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Vertex2s, "glVertex2s", "context = %d, x = %d, y = %d",
-          CID(context), x, y);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateVertex2s(context, x, y));
-        if (isCallValid)
-        {
-            context->vertex2s(x, y);
-        }
-        ANGLE_CAPTURE(Vertex2s, isCallValid, context, x, y);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Vertex2sv(const GLshort *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Vertex2sv, "glVertex2sv", "context = %d, v = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateVertex2sv(context, v));
-        if (isCallValid)
-        {
-            context->vertex2sv(v);
-        }
-        ANGLE_CAPTURE(Vertex2sv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Vertex3d(GLdouble x, GLdouble y, GLdouble z)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Vertex3d, "glVertex3d", "context = %d, x = %f, y = %f, z = %f",
-          CID(context), x, y, z);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateVertex3d(context, x, y, z));
-        if (isCallValid)
-        {
-            context->vertex3d(x, y, z);
-        }
-        ANGLE_CAPTURE(Vertex3d, isCallValid, context, x, y, z);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Vertex3dv(const GLdouble *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Vertex3dv, "glVertex3dv", "context = %d, v = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateVertex3dv(context, v));
-        if (isCallValid)
-        {
-            context->vertex3dv(v);
-        }
-        ANGLE_CAPTURE(Vertex3dv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Vertex3f(GLfloat x, GLfloat y, GLfloat z)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Vertex3f, "glVertex3f", "context = %d, x = %f, y = %f, z = %f",
-          CID(context), x, y, z);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateVertex3f(context, x, y, z));
-        if (isCallValid)
-        {
-            context->vertex3f(x, y, z);
-        }
-        ANGLE_CAPTURE(Vertex3f, isCallValid, context, x, y, z);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Vertex3fv(const GLfloat *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Vertex3fv, "glVertex3fv", "context = %d, v = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateVertex3fv(context, v));
-        if (isCallValid)
-        {
-            context->vertex3fv(v);
-        }
-        ANGLE_CAPTURE(Vertex3fv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Vertex3i(GLint x, GLint y, GLint z)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Vertex3i, "glVertex3i", "context = %d, x = %d, y = %d, z = %d",
-          CID(context), x, y, z);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateVertex3i(context, x, y, z));
-        if (isCallValid)
-        {
-            context->vertex3i(x, y, z);
-        }
-        ANGLE_CAPTURE(Vertex3i, isCallValid, context, x, y, z);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Vertex3iv(const GLint *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Vertex3iv, "glVertex3iv", "context = %d, v = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateVertex3iv(context, v));
-        if (isCallValid)
-        {
-            context->vertex3iv(v);
-        }
-        ANGLE_CAPTURE(Vertex3iv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Vertex3s(GLshort x, GLshort y, GLshort z)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Vertex3s, "glVertex3s", "context = %d, x = %d, y = %d, z = %d",
-          CID(context), x, y, z);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateVertex3s(context, x, y, z));
-        if (isCallValid)
-        {
-            context->vertex3s(x, y, z);
-        }
-        ANGLE_CAPTURE(Vertex3s, isCallValid, context, x, y, z);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Vertex3sv(const GLshort *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Vertex3sv, "glVertex3sv", "context = %d, v = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateVertex3sv(context, v));
-        if (isCallValid)
-        {
-            context->vertex3sv(v);
-        }
-        ANGLE_CAPTURE(Vertex3sv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Vertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Vertex4d, "glVertex4d",
-          "context = %d, x = %f, y = %f, z = %f, w = %f", CID(context), x, y, z, w);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateVertex4d(context, x, y, z, w));
-        if (isCallValid)
-        {
-            context->vertex4d(x, y, z, w);
-        }
-        ANGLE_CAPTURE(Vertex4d, isCallValid, context, x, y, z, w);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Vertex4dv(const GLdouble *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Vertex4dv, "glVertex4dv", "context = %d, v = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateVertex4dv(context, v));
-        if (isCallValid)
-        {
-            context->vertex4dv(v);
-        }
-        ANGLE_CAPTURE(Vertex4dv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Vertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Vertex4f, "glVertex4f",
-          "context = %d, x = %f, y = %f, z = %f, w = %f", CID(context), x, y, z, w);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateVertex4f(context, x, y, z, w));
-        if (isCallValid)
-        {
-            context->vertex4f(x, y, z, w);
-        }
-        ANGLE_CAPTURE(Vertex4f, isCallValid, context, x, y, z, w);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Vertex4fv(const GLfloat *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Vertex4fv, "glVertex4fv", "context = %d, v = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateVertex4fv(context, v));
-        if (isCallValid)
-        {
-            context->vertex4fv(v);
-        }
-        ANGLE_CAPTURE(Vertex4fv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Vertex4i(GLint x, GLint y, GLint z, GLint w)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Vertex4i, "glVertex4i",
-          "context = %d, x = %d, y = %d, z = %d, w = %d", CID(context), x, y, z, w);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateVertex4i(context, x, y, z, w));
-        if (isCallValid)
-        {
-            context->vertex4i(x, y, z, w);
-        }
-        ANGLE_CAPTURE(Vertex4i, isCallValid, context, x, y, z, w);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Vertex4iv(const GLint *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Vertex4iv, "glVertex4iv", "context = %d, v = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateVertex4iv(context, v));
-        if (isCallValid)
-        {
-            context->vertex4iv(v);
-        }
-        ANGLE_CAPTURE(Vertex4iv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Vertex4s(GLshort x, GLshort y, GLshort z, GLshort w)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Vertex4s, "glVertex4s",
-          "context = %d, x = %d, y = %d, z = %d, w = %d", CID(context), x, y, z, w);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateVertex4s(context, x, y, z, w));
-        if (isCallValid)
-        {
-            context->vertex4s(x, y, z, w);
-        }
-        ANGLE_CAPTURE(Vertex4s, isCallValid, context, x, y, z, w);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Vertex4sv(const GLshort *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Vertex4sv, "glVertex4sv", "context = %d, v = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateVertex4sv(context, v));
-        if (isCallValid)
-        {
-            context->vertex4sv(v);
-        }
-        ANGLE_CAPTURE(Vertex4sv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Viewport(GLint x, GLint y, GLsizei width, GLsizei height)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Viewport, "glViewport",
-          "context = %d, x = %d, y = %d, width = %d, height = %d", CID(context), x, y, width,
-          height);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateViewport(context, x, y, width, height));
-        if (isCallValid)
-        {
-            context->viewport(x, y, width, height);
-        }
-        ANGLE_CAPTURE(Viewport, isCallValid, context, x, y, width, height);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-}  // namespace gl
diff --git a/src/libGL/entry_points_gl_1_0_autogen.h b/src/libGL/entry_points_gl_1_0_autogen.h
deleted file mode 100644
index a1f114d..0000000
--- a/src/libGL/entry_points_gl_1_0_autogen.h
+++ /dev/null
@@ -1,394 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// entry_points_gl_1_0_autogen.h:
-//   Defines the GL 1.0 entry points.
-
-#ifndef LIBGL_ENTRY_POINTS_GL_1_0_AUTOGEN_H_
-#define LIBGL_ENTRY_POINTS_GL_1_0_AUTOGEN_H_
-
-#include <export.h>
-#include "angle_gl.h"
-
-namespace gl
-{
-ANGLE_EXPORT void GL_APIENTRY Accum(GLenum op, GLfloat value);
-ANGLE_EXPORT void GL_APIENTRY AlphaFunc(GLenum func, GLfloat ref);
-ANGLE_EXPORT void GL_APIENTRY Begin(GLenum mode);
-ANGLE_EXPORT void GL_APIENTRY Bitmap(GLsizei width,
-                                     GLsizei height,
-                                     GLfloat xorig,
-                                     GLfloat yorig,
-                                     GLfloat xmove,
-                                     GLfloat ymove,
-                                     const GLubyte *bitmap);
-ANGLE_EXPORT void GL_APIENTRY BlendFunc(GLenum sfactor, GLenum dfactor);
-ANGLE_EXPORT void GL_APIENTRY CallList(GLuint list);
-ANGLE_EXPORT void GL_APIENTRY CallLists(GLsizei n, GLenum type, const void *lists);
-ANGLE_EXPORT void GL_APIENTRY Clear(GLbitfield mask);
-ANGLE_EXPORT void GL_APIENTRY ClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-ANGLE_EXPORT void GL_APIENTRY ClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-ANGLE_EXPORT void GL_APIENTRY ClearDepth(GLdouble depth);
-ANGLE_EXPORT void GL_APIENTRY ClearIndex(GLfloat c);
-ANGLE_EXPORT void GL_APIENTRY ClearStencil(GLint s);
-ANGLE_EXPORT void GL_APIENTRY ClipPlane(GLenum plane, const GLdouble *equation);
-ANGLE_EXPORT void GL_APIENTRY Color3b(GLbyte red, GLbyte green, GLbyte blue);
-ANGLE_EXPORT void GL_APIENTRY Color3bv(const GLbyte *v);
-ANGLE_EXPORT void GL_APIENTRY Color3d(GLdouble red, GLdouble green, GLdouble blue);
-ANGLE_EXPORT void GL_APIENTRY Color3dv(const GLdouble *v);
-ANGLE_EXPORT void GL_APIENTRY Color3f(GLfloat red, GLfloat green, GLfloat blue);
-ANGLE_EXPORT void GL_APIENTRY Color3fv(const GLfloat *v);
-ANGLE_EXPORT void GL_APIENTRY Color3i(GLint red, GLint green, GLint blue);
-ANGLE_EXPORT void GL_APIENTRY Color3iv(const GLint *v);
-ANGLE_EXPORT void GL_APIENTRY Color3s(GLshort red, GLshort green, GLshort blue);
-ANGLE_EXPORT void GL_APIENTRY Color3sv(const GLshort *v);
-ANGLE_EXPORT void GL_APIENTRY Color3ub(GLubyte red, GLubyte green, GLubyte blue);
-ANGLE_EXPORT void GL_APIENTRY Color3ubv(const GLubyte *v);
-ANGLE_EXPORT void GL_APIENTRY Color3ui(GLuint red, GLuint green, GLuint blue);
-ANGLE_EXPORT void GL_APIENTRY Color3uiv(const GLuint *v);
-ANGLE_EXPORT void GL_APIENTRY Color3us(GLushort red, GLushort green, GLushort blue);
-ANGLE_EXPORT void GL_APIENTRY Color3usv(const GLushort *v);
-ANGLE_EXPORT void GL_APIENTRY Color4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
-ANGLE_EXPORT void GL_APIENTRY Color4bv(const GLbyte *v);
-ANGLE_EXPORT void GL_APIENTRY Color4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
-ANGLE_EXPORT void GL_APIENTRY Color4dv(const GLdouble *v);
-ANGLE_EXPORT void GL_APIENTRY Color4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-ANGLE_EXPORT void GL_APIENTRY Color4fv(const GLfloat *v);
-ANGLE_EXPORT void GL_APIENTRY Color4i(GLint red, GLint green, GLint blue, GLint alpha);
-ANGLE_EXPORT void GL_APIENTRY Color4iv(const GLint *v);
-ANGLE_EXPORT void GL_APIENTRY Color4s(GLshort red, GLshort green, GLshort blue, GLshort alpha);
-ANGLE_EXPORT void GL_APIENTRY Color4sv(const GLshort *v);
-ANGLE_EXPORT void GL_APIENTRY Color4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
-ANGLE_EXPORT void GL_APIENTRY Color4ubv(const GLubyte *v);
-ANGLE_EXPORT void GL_APIENTRY Color4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha);
-ANGLE_EXPORT void GL_APIENTRY Color4uiv(const GLuint *v);
-ANGLE_EXPORT void GL_APIENTRY Color4us(GLushort red, GLushort green, GLushort blue, GLushort alpha);
-ANGLE_EXPORT void GL_APIENTRY Color4usv(const GLushort *v);
-ANGLE_EXPORT void GL_APIENTRY ColorMask(GLboolean red,
-                                        GLboolean green,
-                                        GLboolean blue,
-                                        GLboolean alpha);
-ANGLE_EXPORT void GL_APIENTRY ColorMaterial(GLenum face, GLenum mode);
-ANGLE_EXPORT void GL_APIENTRY
-CopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
-ANGLE_EXPORT void GL_APIENTRY CullFace(GLenum mode);
-ANGLE_EXPORT void GL_APIENTRY DeleteLists(GLuint list, GLsizei range);
-ANGLE_EXPORT void GL_APIENTRY DepthFunc(GLenum func);
-ANGLE_EXPORT void GL_APIENTRY DepthMask(GLboolean flag);
-ANGLE_EXPORT void GL_APIENTRY DepthRange(GLdouble n, GLdouble f);
-ANGLE_EXPORT void GL_APIENTRY Disable(GLenum cap);
-ANGLE_EXPORT void GL_APIENTRY DrawBuffer(GLenum buf);
-ANGLE_EXPORT void GL_APIENTRY
-DrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
-ANGLE_EXPORT void GL_APIENTRY EdgeFlag(GLboolean flag);
-ANGLE_EXPORT void GL_APIENTRY EdgeFlagv(const GLboolean *flag);
-ANGLE_EXPORT void GL_APIENTRY Enable(GLenum cap);
-ANGLE_EXPORT void GL_APIENTRY End();
-ANGLE_EXPORT void GL_APIENTRY EndList();
-ANGLE_EXPORT void GL_APIENTRY EvalCoord1d(GLdouble u);
-ANGLE_EXPORT void GL_APIENTRY EvalCoord1dv(const GLdouble *u);
-ANGLE_EXPORT void GL_APIENTRY EvalCoord1f(GLfloat u);
-ANGLE_EXPORT void GL_APIENTRY EvalCoord1fv(const GLfloat *u);
-ANGLE_EXPORT void GL_APIENTRY EvalCoord2d(GLdouble u, GLdouble v);
-ANGLE_EXPORT void GL_APIENTRY EvalCoord2dv(const GLdouble *u);
-ANGLE_EXPORT void GL_APIENTRY EvalCoord2f(GLfloat u, GLfloat v);
-ANGLE_EXPORT void GL_APIENTRY EvalCoord2fv(const GLfloat *u);
-ANGLE_EXPORT void GL_APIENTRY EvalMesh1(GLenum mode, GLint i1, GLint i2);
-ANGLE_EXPORT void GL_APIENTRY EvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
-ANGLE_EXPORT void GL_APIENTRY EvalPoint1(GLint i);
-ANGLE_EXPORT void GL_APIENTRY EvalPoint2(GLint i, GLint j);
-ANGLE_EXPORT void GL_APIENTRY FeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer);
-ANGLE_EXPORT void GL_APIENTRY Finish();
-ANGLE_EXPORT void GL_APIENTRY Flush();
-ANGLE_EXPORT void GL_APIENTRY Fogf(GLenum pname, GLfloat param);
-ANGLE_EXPORT void GL_APIENTRY Fogfv(GLenum pname, const GLfloat *params);
-ANGLE_EXPORT void GL_APIENTRY Fogi(GLenum pname, GLint param);
-ANGLE_EXPORT void GL_APIENTRY Fogiv(GLenum pname, const GLint *params);
-ANGLE_EXPORT void GL_APIENTRY FrontFace(GLenum mode);
-ANGLE_EXPORT void GL_APIENTRY Frustum(GLdouble left,
-                                      GLdouble right,
-                                      GLdouble bottom,
-                                      GLdouble top,
-                                      GLdouble zNear,
-                                      GLdouble zFar);
-ANGLE_EXPORT GLuint GL_APIENTRY GenLists(GLsizei range);
-ANGLE_EXPORT void GL_APIENTRY GetBooleanv(GLenum pname, GLboolean *data);
-ANGLE_EXPORT void GL_APIENTRY GetClipPlane(GLenum plane, GLdouble *equation);
-ANGLE_EXPORT void GL_APIENTRY GetDoublev(GLenum pname, GLdouble *data);
-ANGLE_EXPORT GLenum GL_APIENTRY GetError();
-ANGLE_EXPORT void GL_APIENTRY GetFloatv(GLenum pname, GLfloat *data);
-ANGLE_EXPORT void GL_APIENTRY GetIntegerv(GLenum pname, GLint *data);
-ANGLE_EXPORT void GL_APIENTRY GetLightfv(GLenum light, GLenum pname, GLfloat *params);
-ANGLE_EXPORT void GL_APIENTRY GetLightiv(GLenum light, GLenum pname, GLint *params);
-ANGLE_EXPORT void GL_APIENTRY GetMapdv(GLenum target, GLenum query, GLdouble *v);
-ANGLE_EXPORT void GL_APIENTRY GetMapfv(GLenum target, GLenum query, GLfloat *v);
-ANGLE_EXPORT void GL_APIENTRY GetMapiv(GLenum target, GLenum query, GLint *v);
-ANGLE_EXPORT void GL_APIENTRY GetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
-ANGLE_EXPORT void GL_APIENTRY GetMaterialiv(GLenum face, GLenum pname, GLint *params);
-ANGLE_EXPORT void GL_APIENTRY GetPixelMapfv(GLenum map, GLfloat *values);
-ANGLE_EXPORT void GL_APIENTRY GetPixelMapuiv(GLenum map, GLuint *values);
-ANGLE_EXPORT void GL_APIENTRY GetPixelMapusv(GLenum map, GLushort *values);
-ANGLE_EXPORT void GL_APIENTRY GetPolygonStipple(GLubyte *mask);
-ANGLE_EXPORT const GLubyte *GL_APIENTRY GetString(GLenum name);
-ANGLE_EXPORT void GL_APIENTRY GetTexEnvfv(GLenum target, GLenum pname, GLfloat *params);
-ANGLE_EXPORT void GL_APIENTRY GetTexEnviv(GLenum target, GLenum pname, GLint *params);
-ANGLE_EXPORT void GL_APIENTRY GetTexGendv(GLenum coord, GLenum pname, GLdouble *params);
-ANGLE_EXPORT void GL_APIENTRY GetTexGenfv(GLenum coord, GLenum pname, GLfloat *params);
-ANGLE_EXPORT void GL_APIENTRY GetTexGeniv(GLenum coord, GLenum pname, GLint *params);
-ANGLE_EXPORT void GL_APIENTRY
-GetTexImage(GLenum target, GLint level, GLenum format, GLenum type, void *pixels);
-ANGLE_EXPORT void GL_APIENTRY GetTexLevelParameterfv(GLenum target,
-                                                     GLint level,
-                                                     GLenum pname,
-                                                     GLfloat *params);
-ANGLE_EXPORT void GL_APIENTRY GetTexLevelParameteriv(GLenum target,
-                                                     GLint level,
-                                                     GLenum pname,
-                                                     GLint *params);
-ANGLE_EXPORT void GL_APIENTRY GetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
-ANGLE_EXPORT void GL_APIENTRY GetTexParameteriv(GLenum target, GLenum pname, GLint *params);
-ANGLE_EXPORT void GL_APIENTRY Hint(GLenum target, GLenum mode);
-ANGLE_EXPORT void GL_APIENTRY IndexMask(GLuint mask);
-ANGLE_EXPORT void GL_APIENTRY Indexd(GLdouble c);
-ANGLE_EXPORT void GL_APIENTRY Indexdv(const GLdouble *c);
-ANGLE_EXPORT void GL_APIENTRY Indexf(GLfloat c);
-ANGLE_EXPORT void GL_APIENTRY Indexfv(const GLfloat *c);
-ANGLE_EXPORT void GL_APIENTRY Indexi(GLint c);
-ANGLE_EXPORT void GL_APIENTRY Indexiv(const GLint *c);
-ANGLE_EXPORT void GL_APIENTRY Indexs(GLshort c);
-ANGLE_EXPORT void GL_APIENTRY Indexsv(const GLshort *c);
-ANGLE_EXPORT void GL_APIENTRY InitNames();
-ANGLE_EXPORT GLboolean GL_APIENTRY IsEnabled(GLenum cap);
-ANGLE_EXPORT GLboolean GL_APIENTRY IsList(GLuint list);
-ANGLE_EXPORT void GL_APIENTRY LightModelf(GLenum pname, GLfloat param);
-ANGLE_EXPORT void GL_APIENTRY LightModelfv(GLenum pname, const GLfloat *params);
-ANGLE_EXPORT void GL_APIENTRY LightModeli(GLenum pname, GLint param);
-ANGLE_EXPORT void GL_APIENTRY LightModeliv(GLenum pname, const GLint *params);
-ANGLE_EXPORT void GL_APIENTRY Lightf(GLenum light, GLenum pname, GLfloat param);
-ANGLE_EXPORT void GL_APIENTRY Lightfv(GLenum light, GLenum pname, const GLfloat *params);
-ANGLE_EXPORT void GL_APIENTRY Lighti(GLenum light, GLenum pname, GLint param);
-ANGLE_EXPORT void GL_APIENTRY Lightiv(GLenum light, GLenum pname, const GLint *params);
-ANGLE_EXPORT void GL_APIENTRY LineStipple(GLint factor, GLushort pattern);
-ANGLE_EXPORT void GL_APIENTRY LineWidth(GLfloat width);
-ANGLE_EXPORT void GL_APIENTRY ListBase(GLuint base);
-ANGLE_EXPORT void GL_APIENTRY LoadIdentity();
-ANGLE_EXPORT void GL_APIENTRY LoadMatrixd(const GLdouble *m);
-ANGLE_EXPORT void GL_APIENTRY LoadMatrixf(const GLfloat *m);
-ANGLE_EXPORT void GL_APIENTRY LoadName(GLuint name);
-ANGLE_EXPORT void GL_APIENTRY LogicOp(GLenum opcode);
-ANGLE_EXPORT void GL_APIENTRY
-Map1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
-ANGLE_EXPORT void GL_APIENTRY
-Map1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
-ANGLE_EXPORT void GL_APIENTRY Map2d(GLenum target,
-                                    GLdouble u1,
-                                    GLdouble u2,
-                                    GLint ustride,
-                                    GLint uorder,
-                                    GLdouble v1,
-                                    GLdouble v2,
-                                    GLint vstride,
-                                    GLint vorder,
-                                    const GLdouble *points);
-ANGLE_EXPORT void GL_APIENTRY Map2f(GLenum target,
-                                    GLfloat u1,
-                                    GLfloat u2,
-                                    GLint ustride,
-                                    GLint uorder,
-                                    GLfloat v1,
-                                    GLfloat v2,
-                                    GLint vstride,
-                                    GLint vorder,
-                                    const GLfloat *points);
-ANGLE_EXPORT void GL_APIENTRY MapGrid1d(GLint un, GLdouble u1, GLdouble u2);
-ANGLE_EXPORT void GL_APIENTRY MapGrid1f(GLint un, GLfloat u1, GLfloat u2);
-ANGLE_EXPORT void GL_APIENTRY
-MapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
-ANGLE_EXPORT void GL_APIENTRY
-MapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
-ANGLE_EXPORT void GL_APIENTRY Materialf(GLenum face, GLenum pname, GLfloat param);
-ANGLE_EXPORT void GL_APIENTRY Materialfv(GLenum face, GLenum pname, const GLfloat *params);
-ANGLE_EXPORT void GL_APIENTRY Materiali(GLenum face, GLenum pname, GLint param);
-ANGLE_EXPORT void GL_APIENTRY Materialiv(GLenum face, GLenum pname, const GLint *params);
-ANGLE_EXPORT void GL_APIENTRY MatrixMode(GLenum mode);
-ANGLE_EXPORT void GL_APIENTRY MultMatrixd(const GLdouble *m);
-ANGLE_EXPORT void GL_APIENTRY MultMatrixf(const GLfloat *m);
-ANGLE_EXPORT void GL_APIENTRY NewList(GLuint list, GLenum mode);
-ANGLE_EXPORT void GL_APIENTRY Normal3b(GLbyte nx, GLbyte ny, GLbyte nz);
-ANGLE_EXPORT void GL_APIENTRY Normal3bv(const GLbyte *v);
-ANGLE_EXPORT void GL_APIENTRY Normal3d(GLdouble nx, GLdouble ny, GLdouble nz);
-ANGLE_EXPORT void GL_APIENTRY Normal3dv(const GLdouble *v);
-ANGLE_EXPORT void GL_APIENTRY Normal3f(GLfloat nx, GLfloat ny, GLfloat nz);
-ANGLE_EXPORT void GL_APIENTRY Normal3fv(const GLfloat *v);
-ANGLE_EXPORT void GL_APIENTRY Normal3i(GLint nx, GLint ny, GLint nz);
-ANGLE_EXPORT void GL_APIENTRY Normal3iv(const GLint *v);
-ANGLE_EXPORT void GL_APIENTRY Normal3s(GLshort nx, GLshort ny, GLshort nz);
-ANGLE_EXPORT void GL_APIENTRY Normal3sv(const GLshort *v);
-ANGLE_EXPORT void GL_APIENTRY
-Ortho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
-ANGLE_EXPORT void GL_APIENTRY PassThrough(GLfloat token);
-ANGLE_EXPORT void GL_APIENTRY PixelMapfv(GLenum map, GLsizei mapsize, const GLfloat *values);
-ANGLE_EXPORT void GL_APIENTRY PixelMapuiv(GLenum map, GLsizei mapsize, const GLuint *values);
-ANGLE_EXPORT void GL_APIENTRY PixelMapusv(GLenum map, GLsizei mapsize, const GLushort *values);
-ANGLE_EXPORT void GL_APIENTRY PixelStoref(GLenum pname, GLfloat param);
-ANGLE_EXPORT void GL_APIENTRY PixelStorei(GLenum pname, GLint param);
-ANGLE_EXPORT void GL_APIENTRY PixelTransferf(GLenum pname, GLfloat param);
-ANGLE_EXPORT void GL_APIENTRY PixelTransferi(GLenum pname, GLint param);
-ANGLE_EXPORT void GL_APIENTRY PixelZoom(GLfloat xfactor, GLfloat yfactor);
-ANGLE_EXPORT void GL_APIENTRY PointSize(GLfloat size);
-ANGLE_EXPORT void GL_APIENTRY PolygonMode(GLenum face, GLenum mode);
-ANGLE_EXPORT void GL_APIENTRY PolygonStipple(const GLubyte *mask);
-ANGLE_EXPORT void GL_APIENTRY PopAttrib();
-ANGLE_EXPORT void GL_APIENTRY PopMatrix();
-ANGLE_EXPORT void GL_APIENTRY PopName();
-ANGLE_EXPORT void GL_APIENTRY PushAttrib(GLbitfield mask);
-ANGLE_EXPORT void GL_APIENTRY PushMatrix();
-ANGLE_EXPORT void GL_APIENTRY PushName(GLuint name);
-ANGLE_EXPORT void GL_APIENTRY RasterPos2d(GLdouble x, GLdouble y);
-ANGLE_EXPORT void GL_APIENTRY RasterPos2dv(const GLdouble *v);
-ANGLE_EXPORT void GL_APIENTRY RasterPos2f(GLfloat x, GLfloat y);
-ANGLE_EXPORT void GL_APIENTRY RasterPos2fv(const GLfloat *v);
-ANGLE_EXPORT void GL_APIENTRY RasterPos2i(GLint x, GLint y);
-ANGLE_EXPORT void GL_APIENTRY RasterPos2iv(const GLint *v);
-ANGLE_EXPORT void GL_APIENTRY RasterPos2s(GLshort x, GLshort y);
-ANGLE_EXPORT void GL_APIENTRY RasterPos2sv(const GLshort *v);
-ANGLE_EXPORT void GL_APIENTRY RasterPos3d(GLdouble x, GLdouble y, GLdouble z);
-ANGLE_EXPORT void GL_APIENTRY RasterPos3dv(const GLdouble *v);
-ANGLE_EXPORT void GL_APIENTRY RasterPos3f(GLfloat x, GLfloat y, GLfloat z);
-ANGLE_EXPORT void GL_APIENTRY RasterPos3fv(const GLfloat *v);
-ANGLE_EXPORT void GL_APIENTRY RasterPos3i(GLint x, GLint y, GLint z);
-ANGLE_EXPORT void GL_APIENTRY RasterPos3iv(const GLint *v);
-ANGLE_EXPORT void GL_APIENTRY RasterPos3s(GLshort x, GLshort y, GLshort z);
-ANGLE_EXPORT void GL_APIENTRY RasterPos3sv(const GLshort *v);
-ANGLE_EXPORT void GL_APIENTRY RasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
-ANGLE_EXPORT void GL_APIENTRY RasterPos4dv(const GLdouble *v);
-ANGLE_EXPORT void GL_APIENTRY RasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
-ANGLE_EXPORT void GL_APIENTRY RasterPos4fv(const GLfloat *v);
-ANGLE_EXPORT void GL_APIENTRY RasterPos4i(GLint x, GLint y, GLint z, GLint w);
-ANGLE_EXPORT void GL_APIENTRY RasterPos4iv(const GLint *v);
-ANGLE_EXPORT void GL_APIENTRY RasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w);
-ANGLE_EXPORT void GL_APIENTRY RasterPos4sv(const GLshort *v);
-ANGLE_EXPORT void GL_APIENTRY ReadBuffer(GLenum src);
-ANGLE_EXPORT void GL_APIENTRY ReadPixels(GLint x,
-                                         GLint y,
-                                         GLsizei width,
-                                         GLsizei height,
-                                         GLenum format,
-                                         GLenum type,
-                                         void *pixels);
-ANGLE_EXPORT void GL_APIENTRY Rectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
-ANGLE_EXPORT void GL_APIENTRY Rectdv(const GLdouble *v1, const GLdouble *v2);
-ANGLE_EXPORT void GL_APIENTRY Rectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
-ANGLE_EXPORT void GL_APIENTRY Rectfv(const GLfloat *v1, const GLfloat *v2);
-ANGLE_EXPORT void GL_APIENTRY Recti(GLint x1, GLint y1, GLint x2, GLint y2);
-ANGLE_EXPORT void GL_APIENTRY Rectiv(const GLint *v1, const GLint *v2);
-ANGLE_EXPORT void GL_APIENTRY Rects(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
-ANGLE_EXPORT void GL_APIENTRY Rectsv(const GLshort *v1, const GLshort *v2);
-ANGLE_EXPORT GLint GL_APIENTRY RenderMode(GLenum mode);
-ANGLE_EXPORT void GL_APIENTRY Rotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
-ANGLE_EXPORT void GL_APIENTRY Rotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
-ANGLE_EXPORT void GL_APIENTRY Scaled(GLdouble x, GLdouble y, GLdouble z);
-ANGLE_EXPORT void GL_APIENTRY Scalef(GLfloat x, GLfloat y, GLfloat z);
-ANGLE_EXPORT void GL_APIENTRY Scissor(GLint x, GLint y, GLsizei width, GLsizei height);
-ANGLE_EXPORT void GL_APIENTRY SelectBuffer(GLsizei size, GLuint *buffer);
-ANGLE_EXPORT void GL_APIENTRY ShadeModel(GLenum mode);
-ANGLE_EXPORT void GL_APIENTRY StencilFunc(GLenum func, GLint ref, GLuint mask);
-ANGLE_EXPORT void GL_APIENTRY StencilMask(GLuint mask);
-ANGLE_EXPORT void GL_APIENTRY StencilOp(GLenum fail, GLenum zfail, GLenum zpass);
-ANGLE_EXPORT void GL_APIENTRY TexCoord1d(GLdouble s);
-ANGLE_EXPORT void GL_APIENTRY TexCoord1dv(const GLdouble *v);
-ANGLE_EXPORT void GL_APIENTRY TexCoord1f(GLfloat s);
-ANGLE_EXPORT void GL_APIENTRY TexCoord1fv(const GLfloat *v);
-ANGLE_EXPORT void GL_APIENTRY TexCoord1i(GLint s);
-ANGLE_EXPORT void GL_APIENTRY TexCoord1iv(const GLint *v);
-ANGLE_EXPORT void GL_APIENTRY TexCoord1s(GLshort s);
-ANGLE_EXPORT void GL_APIENTRY TexCoord1sv(const GLshort *v);
-ANGLE_EXPORT void GL_APIENTRY TexCoord2d(GLdouble s, GLdouble t);
-ANGLE_EXPORT void GL_APIENTRY TexCoord2dv(const GLdouble *v);
-ANGLE_EXPORT void GL_APIENTRY TexCoord2f(GLfloat s, GLfloat t);
-ANGLE_EXPORT void GL_APIENTRY TexCoord2fv(const GLfloat *v);
-ANGLE_EXPORT void GL_APIENTRY TexCoord2i(GLint s, GLint t);
-ANGLE_EXPORT void GL_APIENTRY TexCoord2iv(const GLint *v);
-ANGLE_EXPORT void GL_APIENTRY TexCoord2s(GLshort s, GLshort t);
-ANGLE_EXPORT void GL_APIENTRY TexCoord2sv(const GLshort *v);
-ANGLE_EXPORT void GL_APIENTRY TexCoord3d(GLdouble s, GLdouble t, GLdouble r);
-ANGLE_EXPORT void GL_APIENTRY TexCoord3dv(const GLdouble *v);
-ANGLE_EXPORT void GL_APIENTRY TexCoord3f(GLfloat s, GLfloat t, GLfloat r);
-ANGLE_EXPORT void GL_APIENTRY TexCoord3fv(const GLfloat *v);
-ANGLE_EXPORT void GL_APIENTRY TexCoord3i(GLint s, GLint t, GLint r);
-ANGLE_EXPORT void GL_APIENTRY TexCoord3iv(const GLint *v);
-ANGLE_EXPORT void GL_APIENTRY TexCoord3s(GLshort s, GLshort t, GLshort r);
-ANGLE_EXPORT void GL_APIENTRY TexCoord3sv(const GLshort *v);
-ANGLE_EXPORT void GL_APIENTRY TexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
-ANGLE_EXPORT void GL_APIENTRY TexCoord4dv(const GLdouble *v);
-ANGLE_EXPORT void GL_APIENTRY TexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
-ANGLE_EXPORT void GL_APIENTRY TexCoord4fv(const GLfloat *v);
-ANGLE_EXPORT void GL_APIENTRY TexCoord4i(GLint s, GLint t, GLint r, GLint q);
-ANGLE_EXPORT void GL_APIENTRY TexCoord4iv(const GLint *v);
-ANGLE_EXPORT void GL_APIENTRY TexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q);
-ANGLE_EXPORT void GL_APIENTRY TexCoord4sv(const GLshort *v);
-ANGLE_EXPORT void GL_APIENTRY TexEnvf(GLenum target, GLenum pname, GLfloat param);
-ANGLE_EXPORT void GL_APIENTRY TexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
-ANGLE_EXPORT void GL_APIENTRY TexEnvi(GLenum target, GLenum pname, GLint param);
-ANGLE_EXPORT void GL_APIENTRY TexEnviv(GLenum target, GLenum pname, const GLint *params);
-ANGLE_EXPORT void GL_APIENTRY TexGend(GLenum coord, GLenum pname, GLdouble param);
-ANGLE_EXPORT void GL_APIENTRY TexGendv(GLenum coord, GLenum pname, const GLdouble *params);
-ANGLE_EXPORT void GL_APIENTRY TexGenf(GLenum coord, GLenum pname, GLfloat param);
-ANGLE_EXPORT void GL_APIENTRY TexGenfv(GLenum coord, GLenum pname, const GLfloat *params);
-ANGLE_EXPORT void GL_APIENTRY TexGeni(GLenum coord, GLenum pname, GLint param);
-ANGLE_EXPORT void GL_APIENTRY TexGeniv(GLenum coord, GLenum pname, const GLint *params);
-ANGLE_EXPORT void GL_APIENTRY TexImage1D(GLenum target,
-                                         GLint level,
-                                         GLint internalformat,
-                                         GLsizei width,
-                                         GLint border,
-                                         GLenum format,
-                                         GLenum type,
-                                         const void *pixels);
-ANGLE_EXPORT void GL_APIENTRY TexImage2D(GLenum target,
-                                         GLint level,
-                                         GLint internalformat,
-                                         GLsizei width,
-                                         GLsizei height,
-                                         GLint border,
-                                         GLenum format,
-                                         GLenum type,
-                                         const void *pixels);
-ANGLE_EXPORT void GL_APIENTRY TexParameterf(GLenum target, GLenum pname, GLfloat param);
-ANGLE_EXPORT void GL_APIENTRY TexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
-ANGLE_EXPORT void GL_APIENTRY TexParameteri(GLenum target, GLenum pname, GLint param);
-ANGLE_EXPORT void GL_APIENTRY TexParameteriv(GLenum target, GLenum pname, const GLint *params);
-ANGLE_EXPORT void GL_APIENTRY Translated(GLdouble x, GLdouble y, GLdouble z);
-ANGLE_EXPORT void GL_APIENTRY Translatef(GLfloat x, GLfloat y, GLfloat z);
-ANGLE_EXPORT void GL_APIENTRY Vertex2d(GLdouble x, GLdouble y);
-ANGLE_EXPORT void GL_APIENTRY Vertex2dv(const GLdouble *v);
-ANGLE_EXPORT void GL_APIENTRY Vertex2f(GLfloat x, GLfloat y);
-ANGLE_EXPORT void GL_APIENTRY Vertex2fv(const GLfloat *v);
-ANGLE_EXPORT void GL_APIENTRY Vertex2i(GLint x, GLint y);
-ANGLE_EXPORT void GL_APIENTRY Vertex2iv(const GLint *v);
-ANGLE_EXPORT void GL_APIENTRY Vertex2s(GLshort x, GLshort y);
-ANGLE_EXPORT void GL_APIENTRY Vertex2sv(const GLshort *v);
-ANGLE_EXPORT void GL_APIENTRY Vertex3d(GLdouble x, GLdouble y, GLdouble z);
-ANGLE_EXPORT void GL_APIENTRY Vertex3dv(const GLdouble *v);
-ANGLE_EXPORT void GL_APIENTRY Vertex3f(GLfloat x, GLfloat y, GLfloat z);
-ANGLE_EXPORT void GL_APIENTRY Vertex3fv(const GLfloat *v);
-ANGLE_EXPORT void GL_APIENTRY Vertex3i(GLint x, GLint y, GLint z);
-ANGLE_EXPORT void GL_APIENTRY Vertex3iv(const GLint *v);
-ANGLE_EXPORT void GL_APIENTRY Vertex3s(GLshort x, GLshort y, GLshort z);
-ANGLE_EXPORT void GL_APIENTRY Vertex3sv(const GLshort *v);
-ANGLE_EXPORT void GL_APIENTRY Vertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
-ANGLE_EXPORT void GL_APIENTRY Vertex4dv(const GLdouble *v);
-ANGLE_EXPORT void GL_APIENTRY Vertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
-ANGLE_EXPORT void GL_APIENTRY Vertex4fv(const GLfloat *v);
-ANGLE_EXPORT void GL_APIENTRY Vertex4i(GLint x, GLint y, GLint z, GLint w);
-ANGLE_EXPORT void GL_APIENTRY Vertex4iv(const GLint *v);
-ANGLE_EXPORT void GL_APIENTRY Vertex4s(GLshort x, GLshort y, GLshort z, GLshort w);
-ANGLE_EXPORT void GL_APIENTRY Vertex4sv(const GLshort *v);
-ANGLE_EXPORT void GL_APIENTRY Viewport(GLint x, GLint y, GLsizei width, GLsizei height);
-}  // namespace gl
-
-#endif  // LIBGL_ENTRY_POINTS_GL_1_0_AUTOGEN_H_
diff --git a/src/libGL/entry_points_gl_1_1_autogen.cpp b/src/libGL/entry_points_gl_1_1_autogen.cpp
deleted file mode 100644
index 863820f..0000000
--- a/src/libGL/entry_points_gl_1_1_autogen.cpp
+++ /dev/null
@@ -1,831 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// entry_points_gl_1_1_autogen.cpp:
-//   Defines the GL 1.1 entry points.
-
-#include "libGL/entry_points_gl_1_1_autogen.h"
-
-#include "libANGLE/Context.h"
-#include "libANGLE/Context.inl.h"
-#include "libANGLE/entry_points_utils.h"
-#include "libANGLE/gl_enum_utils.h"
-#include "libANGLE/validationEGL.h"
-#include "libANGLE/validationES.h"
-#include "libANGLE/validationES1.h"
-#include "libANGLE/validationES2.h"
-#include "libANGLE/validationES3.h"
-#include "libANGLE/validationES31.h"
-#include "libANGLE/validationES32.h"
-#include "libANGLE/validationESEXT.h"
-#include "libANGLE/validationGL11_autogen.h"
-#include "libGLESv2/global_state.h"
-
-namespace gl
-{
-GLboolean GL_APIENTRY AreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::AreTexturesResident, "glAreTexturesResident",
-          "context = %d, n = %d, textures = 0x%016" PRIxPTR ", residences = 0x%016" PRIxPTR "",
-          CID(context), n, (uintptr_t)textures, (uintptr_t)residences);
-
-    GLboolean returnValue;
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateAreTexturesResident(context, n, textures, residences));
-        if (isCallValid)
-        {
-            returnValue = context->areTexturesResident(n, textures, residences);
-        }
-        else
-        {
-            returnValue = GetDefaultReturnValue<EntryPoint::AreTexturesResident, GLboolean>();
-        }
-        ANGLE_CAPTURE(AreTexturesResident, isCallValid, context, n, textures, residences,
-                      returnValue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::AreTexturesResident, GLboolean>();
-    }
-    return returnValue;
-}
-
-void GL_APIENTRY ArrayElement(GLint i)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ArrayElement, "glArrayElement", "context = %d, i = %d",
-          CID(context), i);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateArrayElement(context, i));
-        if (isCallValid)
-        {
-            context->arrayElement(i);
-        }
-        ANGLE_CAPTURE(ArrayElement, isCallValid, context, i);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY BindTexture(GLenum target, GLuint texture)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindTexture, "glBindTexture",
-          "context = %d, target = %s, texture = %u", CID(context),
-          GLenumToString(GLenumGroup::TextureTarget, target), texture);
-
-    if (context)
-    {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateBindTexture(context, targetPacked, texturePacked));
-        if (isCallValid)
-        {
-            context->bindTexture(targetPacked, texturePacked);
-        }
-        ANGLE_CAPTURE(BindTexture, isCallValid, context, targetPacked, texturePacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ColorPointer(GLint size, GLenum type, GLsizei stride, const void *pointer)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ColorPointer, "glColorPointer",
-          "context = %d, size = %d, type = %s, stride = %d, pointer = 0x%016" PRIxPTR "",
-          CID(context), size, GLenumToString(GLenumGroup::ColorPointerType, type), stride,
-          (uintptr_t)pointer);
-
-    if (context)
-    {
-        VertexAttribType typePacked                           = FromGL<VertexAttribType>(type);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateColorPointer(context, size, typePacked, stride, pointer));
-        if (isCallValid)
-        {
-            context->colorPointer(size, typePacked, stride, pointer);
-        }
-        ANGLE_CAPTURE(ColorPointer, isCallValid, context, size, typePacked, stride, pointer);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY CopyTexImage1D(GLenum target,
-                                GLint level,
-                                GLenum internalformat,
-                                GLint x,
-                                GLint y,
-                                GLsizei width,
-                                GLint border)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CopyTexImage1D, "glCopyTexImage1D",
-          "context = %d, target = %s, level = %d, internalformat = %s, x = %d, y = %d, width = %d, "
-          "border = %d",
-          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level,
-          GLenumToString(GLenumGroup::InternalFormat, internalformat), x, y, width, border);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateCopyTexImage1D(context, target, level, internalformat, x, y, width, border));
-        if (isCallValid)
-        {
-            context->copyTexImage1D(target, level, internalformat, x, y, width, border);
-        }
-        ANGLE_CAPTURE(CopyTexImage1D, isCallValid, context, target, level, internalformat, x, y,
-                      width, border);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY CopyTexImage2D(GLenum target,
-                                GLint level,
-                                GLenum internalformat,
-                                GLint x,
-                                GLint y,
-                                GLsizei width,
-                                GLsizei height,
-                                GLint border)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CopyTexImage2D, "glCopyTexImage2D",
-          "context = %d, target = %s, level = %d, internalformat = %s, x = %d, y = %d, width = %d, "
-          "height = %d, border = %d",
-          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level,
-          GLenumToString(GLenumGroup::InternalFormat, internalformat), x, y, width, height, border);
-
-    if (context)
-    {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateCopyTexImage2D(context, targetPacked, level, internalformat, x,
-                                                   y, width, height, border));
-        if (isCallValid)
-        {
-            context->copyTexImage2D(targetPacked, level, internalformat, x, y, width, height,
-                                    border);
-        }
-        ANGLE_CAPTURE(CopyTexImage2D, isCallValid, context, targetPacked, level, internalformat, x,
-                      y, width, height, border);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY
-CopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CopyTexSubImage1D, "glCopyTexSubImage1D",
-          "context = %d, target = %s, level = %d, xoffset = %d, x = %d, y = %d, width = %d",
-          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, xoffset, x, y,
-          width);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateCopyTexSubImage1D(context, target, level, xoffset, x, y, width));
-        if (isCallValid)
-        {
-            context->copyTexSubImage1D(target, level, xoffset, x, y, width);
-        }
-        ANGLE_CAPTURE(CopyTexSubImage1D, isCallValid, context, target, level, xoffset, x, y, width);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY CopyTexSubImage2D(GLenum target,
-                                   GLint level,
-                                   GLint xoffset,
-                                   GLint yoffset,
-                                   GLint x,
-                                   GLint y,
-                                   GLsizei width,
-                                   GLsizei height)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CopyTexSubImage2D, "glCopyTexSubImage2D",
-          "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, x = %d, y = %d, "
-          "width = %d, height = %d",
-          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, xoffset, yoffset,
-          x, y, width, height);
-
-    if (context)
-    {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateCopyTexSubImage2D(context, targetPacked, level, xoffset,
-                                                      yoffset, x, y, width, height));
-        if (isCallValid)
-        {
-            context->copyTexSubImage2D(targetPacked, level, xoffset, yoffset, x, y, width, height);
-        }
-        ANGLE_CAPTURE(CopyTexSubImage2D, isCallValid, context, targetPacked, level, xoffset,
-                      yoffset, x, y, width, height);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DeleteTextures(GLsizei n, const GLuint *textures)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DeleteTextures, "glDeleteTextures",
-          "context = %d, n = %d, textures = 0x%016" PRIxPTR "", CID(context), n,
-          (uintptr_t)textures);
-
-    if (context)
-    {
-        const TextureID *texturesPacked                       = FromGL<const TextureID *>(textures);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateDeleteTextures(context, n, texturesPacked));
-        if (isCallValid)
-        {
-            context->deleteTextures(n, texturesPacked);
-        }
-        ANGLE_CAPTURE(DeleteTextures, isCallValid, context, n, texturesPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DisableClientState(GLenum array)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DisableClientState, "glDisableClientState",
-          "context = %d, array = %s", CID(context), GLenumToString(GLenumGroup::EnableCap, array));
-
-    if (context)
-    {
-        ClientVertexArrayType arrayPacked = FromGL<ClientVertexArrayType>(array);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateDisableClientState(context, arrayPacked));
-        if (isCallValid)
-        {
-            context->disableClientState(arrayPacked);
-        }
-        ANGLE_CAPTURE(DisableClientState, isCallValid, context, arrayPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DrawArrays(GLenum mode, GLint first, GLsizei count)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawArrays, "glDrawArrays",
-          "context = %d, mode = %s, first = %d, count = %d", CID(context),
-          GLenumToString(GLenumGroup::PrimitiveType, mode), first, count);
-
-    if (context)
-    {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateDrawArrays(context, modePacked, first, count));
-        if (isCallValid)
-        {
-            context->drawArrays(modePacked, first, count);
-        }
-        ANGLE_CAPTURE(DrawArrays, isCallValid, context, modePacked, first, count);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DrawElements(GLenum mode, GLsizei count, GLenum type, const void *indices)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawElements, "glDrawElements",
-          "context = %d, mode = %s, count = %d, type = %s, indices = 0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), count,
-          GLenumToString(GLenumGroup::DrawElementsType, type), (uintptr_t)indices);
-
-    if (context)
-    {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateDrawElements(context, modePacked, count, typePacked, indices));
-        if (isCallValid)
-        {
-            context->drawElements(modePacked, count, typePacked, indices);
-        }
-        ANGLE_CAPTURE(DrawElements, isCallValid, context, modePacked, count, typePacked, indices);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY EdgeFlagPointer(GLsizei stride, const void *pointer)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::EdgeFlagPointer, "glEdgeFlagPointer",
-          "context = %d, stride = %d, pointer = 0x%016" PRIxPTR "", CID(context), stride,
-          (uintptr_t)pointer);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateEdgeFlagPointer(context, stride, pointer));
-        if (isCallValid)
-        {
-            context->edgeFlagPointer(stride, pointer);
-        }
-        ANGLE_CAPTURE(EdgeFlagPointer, isCallValid, context, stride, pointer);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY EnableClientState(GLenum array)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::EnableClientState, "glEnableClientState",
-          "context = %d, array = %s", CID(context), GLenumToString(GLenumGroup::EnableCap, array));
-
-    if (context)
-    {
-        ClientVertexArrayType arrayPacked = FromGL<ClientVertexArrayType>(array);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateEnableClientState(context, arrayPacked));
-        if (isCallValid)
-        {
-            context->enableClientState(arrayPacked);
-        }
-        ANGLE_CAPTURE(EnableClientState, isCallValid, context, arrayPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GenTextures(GLsizei n, GLuint *textures)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GenTextures, "glGenTextures",
-          "context = %d, n = %d, textures = 0x%016" PRIxPTR "", CID(context), n,
-          (uintptr_t)textures);
-
-    if (context)
-    {
-        TextureID *texturesPacked                             = FromGL<TextureID *>(textures);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGenTextures(context, n, texturesPacked));
-        if (isCallValid)
-        {
-            context->genTextures(n, texturesPacked);
-        }
-        ANGLE_CAPTURE(GenTextures, isCallValid, context, n, texturesPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetPointerv(GLenum pname, void **params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetPointerv, "glGetPointerv",
-          "context = %d, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::GetPointervPName, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetPointerv(context, pname, params));
-        if (isCallValid)
-        {
-            context->getPointerv(pname, params);
-        }
-        ANGLE_CAPTURE(GetPointerv, isCallValid, context, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY IndexPointer(GLenum type, GLsizei stride, const void *pointer)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IndexPointer, "glIndexPointer",
-          "context = %d, type = %s, stride = %d, pointer = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::IndexPointerType, type), stride, (uintptr_t)pointer);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateIndexPointer(context, type, stride, pointer));
-        if (isCallValid)
-        {
-            context->indexPointer(type, stride, pointer);
-        }
-        ANGLE_CAPTURE(IndexPointer, isCallValid, context, type, stride, pointer);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Indexub(GLubyte c)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Indexub, "glIndexub", "context = %d, c = %d", CID(context), c);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateIndexub(context, c));
-        if (isCallValid)
-        {
-            context->indexub(c);
-        }
-        ANGLE_CAPTURE(Indexub, isCallValid, context, c);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Indexubv(const GLubyte *c)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Indexubv, "glIndexubv", "context = %d, c = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)c);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateIndexubv(context, c));
-        if (isCallValid)
-        {
-            context->indexubv(c);
-        }
-        ANGLE_CAPTURE(Indexubv, isCallValid, context, c);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY InterleavedArrays(GLenum format, GLsizei stride, const void *pointer)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::InterleavedArrays, "glInterleavedArrays",
-          "context = %d, format = %s, stride = %d, pointer = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::InterleavedArrayFormat, format), stride, (uintptr_t)pointer);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateInterleavedArrays(context, format, stride, pointer));
-        if (isCallValid)
-        {
-            context->interleavedArrays(format, stride, pointer);
-        }
-        ANGLE_CAPTURE(InterleavedArrays, isCallValid, context, format, stride, pointer);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-GLboolean GL_APIENTRY IsTexture(GLuint texture)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IsTexture, "glIsTexture", "context = %d, texture = %u",
-          CID(context), texture);
-
-    GLboolean returnValue;
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateIsTexture(context, texturePacked));
-        if (isCallValid)
-        {
-            returnValue = context->isTexture(texturePacked);
-        }
-        else
-        {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsTexture, GLboolean>();
-        }
-        ANGLE_CAPTURE(IsTexture, isCallValid, context, texturePacked, returnValue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::IsTexture, GLboolean>();
-    }
-    return returnValue;
-}
-
-void GL_APIENTRY NormalPointer(GLenum type, GLsizei stride, const void *pointer)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::NormalPointer, "glNormalPointer",
-          "context = %d, type = %s, stride = %d, pointer = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::NormalPointerType, type), stride, (uintptr_t)pointer);
-
-    if (context)
-    {
-        VertexAttribType typePacked                           = FromGL<VertexAttribType>(type);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateNormalPointer(context, typePacked, stride, pointer));
-        if (isCallValid)
-        {
-            context->normalPointer(typePacked, stride, pointer);
-        }
-        ANGLE_CAPTURE(NormalPointer, isCallValid, context, typePacked, stride, pointer);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY PolygonOffset(GLfloat factor, GLfloat units)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PolygonOffset, "glPolygonOffset",
-          "context = %d, factor = %f, units = %f", CID(context), factor, units);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidatePolygonOffset(context, factor, units));
-        if (isCallValid)
-        {
-            context->polygonOffset(factor, units);
-        }
-        ANGLE_CAPTURE(PolygonOffset, isCallValid, context, factor, units);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY PopClientAttrib()
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PopClientAttrib, "glPopClientAttrib", "context = %d",
-          CID(context));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidatePopClientAttrib(context));
-        if (isCallValid)
-        {
-            context->popClientAttrib();
-        }
-        ANGLE_CAPTURE(PopClientAttrib, isCallValid, context);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY PrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PrioritizeTextures, "glPrioritizeTextures",
-          "context = %d, n = %d, textures = 0x%016" PRIxPTR ", priorities = 0x%016" PRIxPTR "",
-          CID(context), n, (uintptr_t)textures, (uintptr_t)priorities);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidatePrioritizeTextures(context, n, textures, priorities));
-        if (isCallValid)
-        {
-            context->prioritizeTextures(n, textures, priorities);
-        }
-        ANGLE_CAPTURE(PrioritizeTextures, isCallValid, context, n, textures, priorities);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY PushClientAttrib(GLbitfield mask)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PushClientAttrib, "glPushClientAttrib",
-          "context = %d, mask = %s", CID(context),
-          GLbitfieldToString(GLenumGroup::ClientAttribMask, mask).c_str());
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidatePushClientAttrib(context, mask));
-        if (isCallValid)
-        {
-            context->pushClientAttrib(mask);
-        }
-        ANGLE_CAPTURE(PushClientAttrib, isCallValid, context, mask);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoordPointer(GLint size, GLenum type, GLsizei stride, const void *pointer)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoordPointer, "glTexCoordPointer",
-          "context = %d, size = %d, type = %s, stride = %d, pointer = 0x%016" PRIxPTR "",
-          CID(context), size, GLenumToString(GLenumGroup::TexCoordPointerType, type), stride,
-          (uintptr_t)pointer);
-
-    if (context)
-    {
-        VertexAttribType typePacked                           = FromGL<VertexAttribType>(type);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateTexCoordPointer(context, size, typePacked, stride, pointer));
-        if (isCallValid)
-        {
-            context->texCoordPointer(size, typePacked, stride, pointer);
-        }
-        ANGLE_CAPTURE(TexCoordPointer, isCallValid, context, size, typePacked, stride, pointer);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexSubImage1D(GLenum target,
-                               GLint level,
-                               GLint xoffset,
-                               GLsizei width,
-                               GLenum format,
-                               GLenum type,
-                               const void *pixels)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexSubImage1D, "glTexSubImage1D",
-          "context = %d, target = %s, level = %d, xoffset = %d, width = %d, format = %s, type = "
-          "%s, pixels = 0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, xoffset, width,
-          GLenumToString(GLenumGroup::PixelFormat, format),
-          GLenumToString(GLenumGroup::PixelType, type), (uintptr_t)pixels);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateTexSubImage1D(context, target, level, xoffset, width, format, type, pixels));
-        if (isCallValid)
-        {
-            context->texSubImage1D(target, level, xoffset, width, format, type, pixels);
-        }
-        ANGLE_CAPTURE(TexSubImage1D, isCallValid, context, target, level, xoffset, width, format,
-                      type, pixels);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexSubImage2D(GLenum target,
-                               GLint level,
-                               GLint xoffset,
-                               GLint yoffset,
-                               GLsizei width,
-                               GLsizei height,
-                               GLenum format,
-                               GLenum type,
-                               const void *pixels)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexSubImage2D, "glTexSubImage2D",
-          "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, width = %d, height = "
-          "%d, format = %s, type = %s, pixels = 0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, xoffset, yoffset,
-          width, height, GLenumToString(GLenumGroup::PixelFormat, format),
-          GLenumToString(GLenumGroup::PixelType, type), (uintptr_t)pixels);
-
-    if (context)
-    {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateTexSubImage2D(context, targetPacked, level, xoffset, yoffset,
-                                                  width, height, format, type, pixels));
-        if (isCallValid)
-        {
-            context->texSubImage2D(targetPacked, level, xoffset, yoffset, width, height, format,
-                                   type, pixels);
-        }
-        ANGLE_CAPTURE(TexSubImage2D, isCallValid, context, targetPacked, level, xoffset, yoffset,
-                      width, height, format, type, pixels);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexPointer(GLint size, GLenum type, GLsizei stride, const void *pointer)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexPointer, "glVertexPointer",
-          "context = %d, size = %d, type = %s, stride = %d, pointer = 0x%016" PRIxPTR "",
-          CID(context), size, GLenumToString(GLenumGroup::VertexPointerType, type), stride,
-          (uintptr_t)pointer);
-
-    if (context)
-    {
-        VertexAttribType typePacked                           = FromGL<VertexAttribType>(type);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateVertexPointer(context, size, typePacked, stride, pointer));
-        if (isCallValid)
-        {
-            context->vertexPointer(size, typePacked, stride, pointer);
-        }
-        ANGLE_CAPTURE(VertexPointer, isCallValid, context, size, typePacked, stride, pointer);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-}  // namespace gl
diff --git a/src/libGL/entry_points_gl_1_1_autogen.h b/src/libGL/entry_points_gl_1_1_autogen.h
deleted file mode 100644
index 95e9a44..0000000
--- a/src/libGL/entry_points_gl_1_1_autogen.h
+++ /dev/null
@@ -1,102 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// entry_points_gl_1_1_autogen.h:
-//   Defines the GL 1.1 entry points.
-
-#ifndef LIBGL_ENTRY_POINTS_GL_1_1_AUTOGEN_H_
-#define LIBGL_ENTRY_POINTS_GL_1_1_AUTOGEN_H_
-
-#include <export.h>
-#include "angle_gl.h"
-
-namespace gl
-{
-ANGLE_EXPORT GLboolean GL_APIENTRY AreTexturesResident(GLsizei n,
-                                                       const GLuint *textures,
-                                                       GLboolean *residences);
-ANGLE_EXPORT void GL_APIENTRY ArrayElement(GLint i);
-ANGLE_EXPORT void GL_APIENTRY BindTexture(GLenum target, GLuint texture);
-ANGLE_EXPORT void GL_APIENTRY ColorPointer(GLint size,
-                                           GLenum type,
-                                           GLsizei stride,
-                                           const void *pointer);
-ANGLE_EXPORT void GL_APIENTRY CopyTexImage1D(GLenum target,
-                                             GLint level,
-                                             GLenum internalformat,
-                                             GLint x,
-                                             GLint y,
-                                             GLsizei width,
-                                             GLint border);
-ANGLE_EXPORT void GL_APIENTRY CopyTexImage2D(GLenum target,
-                                             GLint level,
-                                             GLenum internalformat,
-                                             GLint x,
-                                             GLint y,
-                                             GLsizei width,
-                                             GLsizei height,
-                                             GLint border);
-ANGLE_EXPORT void GL_APIENTRY
-CopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
-ANGLE_EXPORT void GL_APIENTRY CopyTexSubImage2D(GLenum target,
-                                                GLint level,
-                                                GLint xoffset,
-                                                GLint yoffset,
-                                                GLint x,
-                                                GLint y,
-                                                GLsizei width,
-                                                GLsizei height);
-ANGLE_EXPORT void GL_APIENTRY DeleteTextures(GLsizei n, const GLuint *textures);
-ANGLE_EXPORT void GL_APIENTRY DisableClientState(GLenum array);
-ANGLE_EXPORT void GL_APIENTRY DrawArrays(GLenum mode, GLint first, GLsizei count);
-ANGLE_EXPORT void GL_APIENTRY DrawElements(GLenum mode,
-                                           GLsizei count,
-                                           GLenum type,
-                                           const void *indices);
-ANGLE_EXPORT void GL_APIENTRY EdgeFlagPointer(GLsizei stride, const void *pointer);
-ANGLE_EXPORT void GL_APIENTRY EnableClientState(GLenum array);
-ANGLE_EXPORT void GL_APIENTRY GenTextures(GLsizei n, GLuint *textures);
-ANGLE_EXPORT void GL_APIENTRY GetPointerv(GLenum pname, void **params);
-ANGLE_EXPORT void GL_APIENTRY IndexPointer(GLenum type, GLsizei stride, const void *pointer);
-ANGLE_EXPORT void GL_APIENTRY Indexub(GLubyte c);
-ANGLE_EXPORT void GL_APIENTRY Indexubv(const GLubyte *c);
-ANGLE_EXPORT void GL_APIENTRY InterleavedArrays(GLenum format, GLsizei stride, const void *pointer);
-ANGLE_EXPORT GLboolean GL_APIENTRY IsTexture(GLuint texture);
-ANGLE_EXPORT void GL_APIENTRY NormalPointer(GLenum type, GLsizei stride, const void *pointer);
-ANGLE_EXPORT void GL_APIENTRY PolygonOffset(GLfloat factor, GLfloat units);
-ANGLE_EXPORT void GL_APIENTRY PopClientAttrib();
-ANGLE_EXPORT void GL_APIENTRY PrioritizeTextures(GLsizei n,
-                                                 const GLuint *textures,
-                                                 const GLfloat *priorities);
-ANGLE_EXPORT void GL_APIENTRY PushClientAttrib(GLbitfield mask);
-ANGLE_EXPORT void GL_APIENTRY TexCoordPointer(GLint size,
-                                              GLenum type,
-                                              GLsizei stride,
-                                              const void *pointer);
-ANGLE_EXPORT void GL_APIENTRY TexSubImage1D(GLenum target,
-                                            GLint level,
-                                            GLint xoffset,
-                                            GLsizei width,
-                                            GLenum format,
-                                            GLenum type,
-                                            const void *pixels);
-ANGLE_EXPORT void GL_APIENTRY TexSubImage2D(GLenum target,
-                                            GLint level,
-                                            GLint xoffset,
-                                            GLint yoffset,
-                                            GLsizei width,
-                                            GLsizei height,
-                                            GLenum format,
-                                            GLenum type,
-                                            const void *pixels);
-ANGLE_EXPORT void GL_APIENTRY VertexPointer(GLint size,
-                                            GLenum type,
-                                            GLsizei stride,
-                                            const void *pointer);
-}  // namespace gl
-
-#endif  // LIBGL_ENTRY_POINTS_GL_1_1_AUTOGEN_H_
diff --git a/src/libGL/entry_points_gl_1_2_autogen.cpp b/src/libGL/entry_points_gl_1_2_autogen.cpp
deleted file mode 100644
index 2e8fc45..0000000
--- a/src/libGL/entry_points_gl_1_2_autogen.cpp
+++ /dev/null
@@ -1,184 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// entry_points_gl_1_2_autogen.cpp:
-//   Defines the GL 1.2 entry points.
-
-#include "libGL/entry_points_gl_1_2_autogen.h"
-
-#include "libANGLE/Context.h"
-#include "libANGLE/Context.inl.h"
-#include "libANGLE/entry_points_utils.h"
-#include "libANGLE/gl_enum_utils.h"
-#include "libANGLE/validationEGL.h"
-#include "libANGLE/validationES.h"
-#include "libANGLE/validationES1.h"
-#include "libANGLE/validationES2.h"
-#include "libANGLE/validationES3.h"
-#include "libANGLE/validationES31.h"
-#include "libANGLE/validationES32.h"
-#include "libANGLE/validationESEXT.h"
-#include "libANGLE/validationGL12_autogen.h"
-#include "libGLESv2/global_state.h"
-
-namespace gl
-{
-void GL_APIENTRY CopyTexSubImage3D(GLenum target,
-                                   GLint level,
-                                   GLint xoffset,
-                                   GLint yoffset,
-                                   GLint zoffset,
-                                   GLint x,
-                                   GLint y,
-                                   GLsizei width,
-                                   GLsizei height)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CopyTexSubImage3D, "glCopyTexSubImage3D",
-          "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, x = "
-          "%d, y = %d, width = %d, height = %d",
-          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, xoffset, yoffset,
-          zoffset, x, y, width, height);
-
-    if (context)
-    {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateCopyTexSubImage3D(context, targetPacked, level, xoffset,
-                                                      yoffset, zoffset, x, y, width, height));
-        if (isCallValid)
-        {
-            context->copyTexSubImage3D(targetPacked, level, xoffset, yoffset, zoffset, x, y, width,
-                                       height);
-        }
-        ANGLE_CAPTURE(CopyTexSubImage3D, isCallValid, context, targetPacked, level, xoffset,
-                      yoffset, zoffset, x, y, width, height);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DrawRangeElements(GLenum mode,
-                                   GLuint start,
-                                   GLuint end,
-                                   GLsizei count,
-                                   GLenum type,
-                                   const void *indices)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawRangeElements, "glDrawRangeElements",
-          "context = %d, mode = %s, start = %u, end = %u, count = %d, type = %s, indices = "
-          "0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), start, end, count,
-          GLenumToString(GLenumGroup::DrawElementsType, type), (uintptr_t)indices);
-
-    if (context)
-    {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateDrawRangeElements(context, modePacked, start, end,
-                                                                    count, typePacked, indices));
-        if (isCallValid)
-        {
-            context->drawRangeElements(modePacked, start, end, count, typePacked, indices);
-        }
-        ANGLE_CAPTURE(DrawRangeElements, isCallValid, context, modePacked, start, end, count,
-                      typePacked, indices);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexImage3D(GLenum target,
-                            GLint level,
-                            GLint internalformat,
-                            GLsizei width,
-                            GLsizei height,
-                            GLsizei depth,
-                            GLint border,
-                            GLenum format,
-                            GLenum type,
-                            const void *pixels)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexImage3D, "glTexImage3D",
-          "context = %d, target = %s, level = %d, internalformat = %d, width = %d, height = %d, "
-          "depth = %d, border = %d, format = %s, type = %s, pixels = 0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, internalformat,
-          width, height, depth, border, GLenumToString(GLenumGroup::PixelFormat, format),
-          GLenumToString(GLenumGroup::PixelType, type), (uintptr_t)pixels);
-
-    if (context)
-    {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateTexImage3D(context, targetPacked, level, internalformat, width,
-                                               height, depth, border, format, type, pixels));
-        if (isCallValid)
-        {
-            context->texImage3D(targetPacked, level, internalformat, width, height, depth, border,
-                                format, type, pixels);
-        }
-        ANGLE_CAPTURE(TexImage3D, isCallValid, context, targetPacked, level, internalformat, width,
-                      height, depth, border, format, type, pixels);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexSubImage3D(GLenum target,
-                               GLint level,
-                               GLint xoffset,
-                               GLint yoffset,
-                               GLint zoffset,
-                               GLsizei width,
-                               GLsizei height,
-                               GLsizei depth,
-                               GLenum format,
-                               GLenum type,
-                               const void *pixels)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexSubImage3D, "glTexSubImage3D",
-          "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, width "
-          "= %d, height = %d, depth = %d, format = %s, type = %s, pixels = 0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, xoffset, yoffset,
-          zoffset, width, height, depth, GLenumToString(GLenumGroup::PixelFormat, format),
-          GLenumToString(GLenumGroup::PixelType, type), (uintptr_t)pixels);
-
-    if (context)
-    {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateTexSubImage3D(context, targetPacked, level, xoffset, yoffset, zoffset, width,
-                                   height, depth, format, type, pixels));
-        if (isCallValid)
-        {
-            context->texSubImage3D(targetPacked, level, xoffset, yoffset, zoffset, width, height,
-                                   depth, format, type, pixels);
-        }
-        ANGLE_CAPTURE(TexSubImage3D, isCallValid, context, targetPacked, level, xoffset, yoffset,
-                      zoffset, width, height, depth, format, type, pixels);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-}  // namespace gl
diff --git a/src/libGL/entry_points_gl_1_2_autogen.h b/src/libGL/entry_points_gl_1_2_autogen.h
deleted file mode 100644
index 764d9dd..0000000
--- a/src/libGL/entry_points_gl_1_2_autogen.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// entry_points_gl_1_2_autogen.h:
-//   Defines the GL 1.2 entry points.
-
-#ifndef LIBGL_ENTRY_POINTS_GL_1_2_AUTOGEN_H_
-#define LIBGL_ENTRY_POINTS_GL_1_2_AUTOGEN_H_
-
-#include <export.h>
-#include "angle_gl.h"
-
-namespace gl
-{
-ANGLE_EXPORT void GL_APIENTRY CopyTexSubImage3D(GLenum target,
-                                                GLint level,
-                                                GLint xoffset,
-                                                GLint yoffset,
-                                                GLint zoffset,
-                                                GLint x,
-                                                GLint y,
-                                                GLsizei width,
-                                                GLsizei height);
-ANGLE_EXPORT void GL_APIENTRY DrawRangeElements(GLenum mode,
-                                                GLuint start,
-                                                GLuint end,
-                                                GLsizei count,
-                                                GLenum type,
-                                                const void *indices);
-ANGLE_EXPORT void GL_APIENTRY TexImage3D(GLenum target,
-                                         GLint level,
-                                         GLint internalformat,
-                                         GLsizei width,
-                                         GLsizei height,
-                                         GLsizei depth,
-                                         GLint border,
-                                         GLenum format,
-                                         GLenum type,
-                                         const void *pixels);
-ANGLE_EXPORT void GL_APIENTRY TexSubImage3D(GLenum target,
-                                            GLint level,
-                                            GLint xoffset,
-                                            GLint yoffset,
-                                            GLint zoffset,
-                                            GLsizei width,
-                                            GLsizei height,
-                                            GLsizei depth,
-                                            GLenum format,
-                                            GLenum type,
-                                            const void *pixels);
-}  // namespace gl
-
-#endif  // LIBGL_ENTRY_POINTS_GL_1_2_AUTOGEN_H_
diff --git a/src/libGL/entry_points_gl_1_3_autogen.cpp b/src/libGL/entry_points_gl_1_3_autogen.cpp
deleted file mode 100644
index 178423c..0000000
--- a/src/libGL/entry_points_gl_1_3_autogen.cpp
+++ /dev/null
@@ -1,1210 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// entry_points_gl_1_3_autogen.cpp:
-//   Defines the GL 1.3 entry points.
-
-#include "libGL/entry_points_gl_1_3_autogen.h"
-
-#include "libANGLE/Context.h"
-#include "libANGLE/Context.inl.h"
-#include "libANGLE/entry_points_utils.h"
-#include "libANGLE/gl_enum_utils.h"
-#include "libANGLE/validationEGL.h"
-#include "libANGLE/validationES.h"
-#include "libANGLE/validationES1.h"
-#include "libANGLE/validationES2.h"
-#include "libANGLE/validationES3.h"
-#include "libANGLE/validationES31.h"
-#include "libANGLE/validationES32.h"
-#include "libANGLE/validationESEXT.h"
-#include "libANGLE/validationGL13_autogen.h"
-#include "libGLESv2/global_state.h"
-
-namespace gl
-{
-void GL_APIENTRY ActiveTexture(GLenum texture)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ActiveTexture, "glActiveTexture", "context = %d, texture = %s",
-          CID(context), GLenumToString(GLenumGroup::TextureUnit, texture));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateActiveTexture(context, texture));
-        if (isCallValid)
-        {
-            context->activeTexture(texture);
-        }
-        ANGLE_CAPTURE(ActiveTexture, isCallValid, context, texture);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ClientActiveTexture(GLenum texture)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ClientActiveTexture, "glClientActiveTexture",
-          "context = %d, texture = %s", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, texture));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateClientActiveTexture(context, texture));
-        if (isCallValid)
-        {
-            context->clientActiveTexture(texture);
-        }
-        ANGLE_CAPTURE(ClientActiveTexture, isCallValid, context, texture);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY CompressedTexImage1D(GLenum target,
-                                      GLint level,
-                                      GLenum internalformat,
-                                      GLsizei width,
-                                      GLint border,
-                                      GLsizei imageSize,
-                                      const void *data)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CompressedTexImage1D, "glCompressedTexImage1D",
-          "context = %d, target = %s, level = %d, internalformat = %s, width = %d, border = %d, "
-          "imageSize = %d, data = 0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level,
-          GLenumToString(GLenumGroup::InternalFormat, internalformat), width, border, imageSize,
-          (uintptr_t)data);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateCompressedTexImage1D(context, target, level, internalformat,
-                                                         width, border, imageSize, data));
-        if (isCallValid)
-        {
-            context->compressedTexImage1D(target, level, internalformat, width, border, imageSize,
-                                          data);
-        }
-        ANGLE_CAPTURE(CompressedTexImage1D, isCallValid, context, target, level, internalformat,
-                      width, border, imageSize, data);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY CompressedTexImage2D(GLenum target,
-                                      GLint level,
-                                      GLenum internalformat,
-                                      GLsizei width,
-                                      GLsizei height,
-                                      GLint border,
-                                      GLsizei imageSize,
-                                      const void *data)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CompressedTexImage2D, "glCompressedTexImage2D",
-          "context = %d, target = %s, level = %d, internalformat = %s, width = %d, height = %d, "
-          "border = %d, imageSize = %d, data = 0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level,
-          GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height, border,
-          imageSize, (uintptr_t)data);
-
-    if (context)
-    {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateCompressedTexImage2D(context, targetPacked, level, internalformat, width,
-                                          height, border, imageSize, data));
-        if (isCallValid)
-        {
-            context->compressedTexImage2D(targetPacked, level, internalformat, width, height,
-                                          border, imageSize, data);
-        }
-        ANGLE_CAPTURE(CompressedTexImage2D, isCallValid, context, targetPacked, level,
-                      internalformat, width, height, border, imageSize, data);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY CompressedTexImage3D(GLenum target,
-                                      GLint level,
-                                      GLenum internalformat,
-                                      GLsizei width,
-                                      GLsizei height,
-                                      GLsizei depth,
-                                      GLint border,
-                                      GLsizei imageSize,
-                                      const void *data)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CompressedTexImage3D, "glCompressedTexImage3D",
-          "context = %d, target = %s, level = %d, internalformat = %s, width = %d, height = %d, "
-          "depth = %d, border = %d, imageSize = %d, data = 0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level,
-          GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height, depth, border,
-          imageSize, (uintptr_t)data);
-
-    if (context)
-    {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateCompressedTexImage3D(context, targetPacked, level, internalformat, width,
-                                          height, depth, border, imageSize, data));
-        if (isCallValid)
-        {
-            context->compressedTexImage3D(targetPacked, level, internalformat, width, height, depth,
-                                          border, imageSize, data);
-        }
-        ANGLE_CAPTURE(CompressedTexImage3D, isCallValid, context, targetPacked, level,
-                      internalformat, width, height, depth, border, imageSize, data);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY CompressedTexSubImage1D(GLenum target,
-                                         GLint level,
-                                         GLint xoffset,
-                                         GLsizei width,
-                                         GLenum format,
-                                         GLsizei imageSize,
-                                         const void *data)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CompressedTexSubImage1D, "glCompressedTexSubImage1D",
-          "context = %d, target = %s, level = %d, xoffset = %d, width = %d, format = %s, imageSize "
-          "= %d, data = 0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, xoffset, width,
-          GLenumToString(GLenumGroup::PixelFormat, format), imageSize, (uintptr_t)data);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateCompressedTexSubImage1D(context, target, level, xoffset, width,
-                                                            format, imageSize, data));
-        if (isCallValid)
-        {
-            context->compressedTexSubImage1D(target, level, xoffset, width, format, imageSize,
-                                             data);
-        }
-        ANGLE_CAPTURE(CompressedTexSubImage1D, isCallValid, context, target, level, xoffset, width,
-                      format, imageSize, data);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY CompressedTexSubImage2D(GLenum target,
-                                         GLint level,
-                                         GLint xoffset,
-                                         GLint yoffset,
-                                         GLsizei width,
-                                         GLsizei height,
-                                         GLenum format,
-                                         GLsizei imageSize,
-                                         const void *data)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CompressedTexSubImage2D, "glCompressedTexSubImage2D",
-          "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, width = %d, height = "
-          "%d, format = %s, imageSize = %d, data = 0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, xoffset, yoffset,
-          width, height, GLenumToString(GLenumGroup::PixelFormat, format), imageSize,
-          (uintptr_t)data);
-
-    if (context)
-    {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateCompressedTexSubImage2D(context, targetPacked, level, xoffset, yoffset, width,
-                                             height, format, imageSize, data));
-        if (isCallValid)
-        {
-            context->compressedTexSubImage2D(targetPacked, level, xoffset, yoffset, width, height,
-                                             format, imageSize, data);
-        }
-        ANGLE_CAPTURE(CompressedTexSubImage2D, isCallValid, context, targetPacked, level, xoffset,
-                      yoffset, width, height, format, imageSize, data);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY CompressedTexSubImage3D(GLenum target,
-                                         GLint level,
-                                         GLint xoffset,
-                                         GLint yoffset,
-                                         GLint zoffset,
-                                         GLsizei width,
-                                         GLsizei height,
-                                         GLsizei depth,
-                                         GLenum format,
-                                         GLsizei imageSize,
-                                         const void *data)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CompressedTexSubImage3D, "glCompressedTexSubImage3D",
-          "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, width "
-          "= %d, height = %d, depth = %d, format = %s, imageSize = %d, data = 0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, xoffset, yoffset,
-          zoffset, width, height, depth, GLenumToString(GLenumGroup::PixelFormat, format),
-          imageSize, (uintptr_t)data);
-
-    if (context)
-    {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateCompressedTexSubImage3D(context, targetPacked, level, xoffset,
-                                                            yoffset, zoffset, width, height, depth,
-                                                            format, imageSize, data));
-        if (isCallValid)
-        {
-            context->compressedTexSubImage3D(targetPacked, level, xoffset, yoffset, zoffset, width,
-                                             height, depth, format, imageSize, data);
-        }
-        ANGLE_CAPTURE(CompressedTexSubImage3D, isCallValid, context, targetPacked, level, xoffset,
-                      yoffset, zoffset, width, height, depth, format, imageSize, data);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetCompressedTexImage(GLenum target, GLint level, void *img)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetCompressedTexImage, "glGetCompressedTexImage",
-          "context = %d, target = %s, level = %d, img = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureTarget, target), level, (uintptr_t)img);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetCompressedTexImage(context, target, level, img));
-        if (isCallValid)
-        {
-            context->getCompressedTexImage(target, level, img);
-        }
-        ANGLE_CAPTURE(GetCompressedTexImage, isCallValid, context, target, level, img);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY LoadTransposeMatrixd(const GLdouble *m)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::LoadTransposeMatrixd, "glLoadTransposeMatrixd",
-          "context = %d, m = 0x%016" PRIxPTR "", CID(context), (uintptr_t)m);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateLoadTransposeMatrixd(context, m));
-        if (isCallValid)
-        {
-            context->loadTransposeMatrixd(m);
-        }
-        ANGLE_CAPTURE(LoadTransposeMatrixd, isCallValid, context, m);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY LoadTransposeMatrixf(const GLfloat *m)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::LoadTransposeMatrixf, "glLoadTransposeMatrixf",
-          "context = %d, m = 0x%016" PRIxPTR "", CID(context), (uintptr_t)m);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateLoadTransposeMatrixf(context, m));
-        if (isCallValid)
-        {
-            context->loadTransposeMatrixf(m);
-        }
-        ANGLE_CAPTURE(LoadTransposeMatrixf, isCallValid, context, m);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultTransposeMatrixd(const GLdouble *m)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultTransposeMatrixd, "glMultTransposeMatrixd",
-          "context = %d, m = 0x%016" PRIxPTR "", CID(context), (uintptr_t)m);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateMultTransposeMatrixd(context, m));
-        if (isCallValid)
-        {
-            context->multTransposeMatrixd(m);
-        }
-        ANGLE_CAPTURE(MultTransposeMatrixd, isCallValid, context, m);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultTransposeMatrixf(const GLfloat *m)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultTransposeMatrixf, "glMultTransposeMatrixf",
-          "context = %d, m = 0x%016" PRIxPTR "", CID(context), (uintptr_t)m);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateMultTransposeMatrixf(context, m));
-        if (isCallValid)
-        {
-            context->multTransposeMatrixf(m);
-        }
-        ANGLE_CAPTURE(MultTransposeMatrixf, isCallValid, context, m);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiTexCoord1d(GLenum target, GLdouble s)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoord1d, "glMultiTexCoord1d",
-          "context = %d, target = %s, s = %f", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, target), s);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMultiTexCoord1d(context, target, s));
-        if (isCallValid)
-        {
-            context->multiTexCoord1d(target, s);
-        }
-        ANGLE_CAPTURE(MultiTexCoord1d, isCallValid, context, target, s);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiTexCoord1dv(GLenum target, const GLdouble *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoord1dv, "glMultiTexCoord1dv",
-          "context = %d, target = %s, v = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, target), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMultiTexCoord1dv(context, target, v));
-        if (isCallValid)
-        {
-            context->multiTexCoord1dv(target, v);
-        }
-        ANGLE_CAPTURE(MultiTexCoord1dv, isCallValid, context, target, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiTexCoord1f(GLenum target, GLfloat s)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoord1f, "glMultiTexCoord1f",
-          "context = %d, target = %s, s = %f", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, target), s);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMultiTexCoord1f(context, target, s));
-        if (isCallValid)
-        {
-            context->multiTexCoord1f(target, s);
-        }
-        ANGLE_CAPTURE(MultiTexCoord1f, isCallValid, context, target, s);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiTexCoord1fv(GLenum target, const GLfloat *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoord1fv, "glMultiTexCoord1fv",
-          "context = %d, target = %s, v = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, target), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMultiTexCoord1fv(context, target, v));
-        if (isCallValid)
-        {
-            context->multiTexCoord1fv(target, v);
-        }
-        ANGLE_CAPTURE(MultiTexCoord1fv, isCallValid, context, target, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiTexCoord1i(GLenum target, GLint s)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoord1i, "glMultiTexCoord1i",
-          "context = %d, target = %s, s = %d", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, target), s);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMultiTexCoord1i(context, target, s));
-        if (isCallValid)
-        {
-            context->multiTexCoord1i(target, s);
-        }
-        ANGLE_CAPTURE(MultiTexCoord1i, isCallValid, context, target, s);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiTexCoord1iv(GLenum target, const GLint *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoord1iv, "glMultiTexCoord1iv",
-          "context = %d, target = %s, v = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, target), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMultiTexCoord1iv(context, target, v));
-        if (isCallValid)
-        {
-            context->multiTexCoord1iv(target, v);
-        }
-        ANGLE_CAPTURE(MultiTexCoord1iv, isCallValid, context, target, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiTexCoord1s(GLenum target, GLshort s)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoord1s, "glMultiTexCoord1s",
-          "context = %d, target = %s, s = %d", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, target), s);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMultiTexCoord1s(context, target, s));
-        if (isCallValid)
-        {
-            context->multiTexCoord1s(target, s);
-        }
-        ANGLE_CAPTURE(MultiTexCoord1s, isCallValid, context, target, s);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiTexCoord1sv(GLenum target, const GLshort *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoord1sv, "glMultiTexCoord1sv",
-          "context = %d, target = %s, v = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, target), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMultiTexCoord1sv(context, target, v));
-        if (isCallValid)
-        {
-            context->multiTexCoord1sv(target, v);
-        }
-        ANGLE_CAPTURE(MultiTexCoord1sv, isCallValid, context, target, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiTexCoord2d(GLenum target, GLdouble s, GLdouble t)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoord2d, "glMultiTexCoord2d",
-          "context = %d, target = %s, s = %f, t = %f", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, target), s, t);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMultiTexCoord2d(context, target, s, t));
-        if (isCallValid)
-        {
-            context->multiTexCoord2d(target, s, t);
-        }
-        ANGLE_CAPTURE(MultiTexCoord2d, isCallValid, context, target, s, t);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiTexCoord2dv(GLenum target, const GLdouble *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoord2dv, "glMultiTexCoord2dv",
-          "context = %d, target = %s, v = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, target), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMultiTexCoord2dv(context, target, v));
-        if (isCallValid)
-        {
-            context->multiTexCoord2dv(target, v);
-        }
-        ANGLE_CAPTURE(MultiTexCoord2dv, isCallValid, context, target, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiTexCoord2f(GLenum target, GLfloat s, GLfloat t)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoord2f, "glMultiTexCoord2f",
-          "context = %d, target = %s, s = %f, t = %f", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, target), s, t);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMultiTexCoord2f(context, target, s, t));
-        if (isCallValid)
-        {
-            context->multiTexCoord2f(target, s, t);
-        }
-        ANGLE_CAPTURE(MultiTexCoord2f, isCallValid, context, target, s, t);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiTexCoord2fv(GLenum target, const GLfloat *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoord2fv, "glMultiTexCoord2fv",
-          "context = %d, target = %s, v = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, target), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMultiTexCoord2fv(context, target, v));
-        if (isCallValid)
-        {
-            context->multiTexCoord2fv(target, v);
-        }
-        ANGLE_CAPTURE(MultiTexCoord2fv, isCallValid, context, target, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiTexCoord2i(GLenum target, GLint s, GLint t)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoord2i, "glMultiTexCoord2i",
-          "context = %d, target = %s, s = %d, t = %d", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, target), s, t);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMultiTexCoord2i(context, target, s, t));
-        if (isCallValid)
-        {
-            context->multiTexCoord2i(target, s, t);
-        }
-        ANGLE_CAPTURE(MultiTexCoord2i, isCallValid, context, target, s, t);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiTexCoord2iv(GLenum target, const GLint *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoord2iv, "glMultiTexCoord2iv",
-          "context = %d, target = %s, v = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, target), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMultiTexCoord2iv(context, target, v));
-        if (isCallValid)
-        {
-            context->multiTexCoord2iv(target, v);
-        }
-        ANGLE_CAPTURE(MultiTexCoord2iv, isCallValid, context, target, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiTexCoord2s(GLenum target, GLshort s, GLshort t)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoord2s, "glMultiTexCoord2s",
-          "context = %d, target = %s, s = %d, t = %d", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, target), s, t);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMultiTexCoord2s(context, target, s, t));
-        if (isCallValid)
-        {
-            context->multiTexCoord2s(target, s, t);
-        }
-        ANGLE_CAPTURE(MultiTexCoord2s, isCallValid, context, target, s, t);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiTexCoord2sv(GLenum target, const GLshort *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoord2sv, "glMultiTexCoord2sv",
-          "context = %d, target = %s, v = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, target), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMultiTexCoord2sv(context, target, v));
-        if (isCallValid)
-        {
-            context->multiTexCoord2sv(target, v);
-        }
-        ANGLE_CAPTURE(MultiTexCoord2sv, isCallValid, context, target, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoord3d, "glMultiTexCoord3d",
-          "context = %d, target = %s, s = %f, t = %f, r = %f", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, target), s, t, r);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMultiTexCoord3d(context, target, s, t, r));
-        if (isCallValid)
-        {
-            context->multiTexCoord3d(target, s, t, r);
-        }
-        ANGLE_CAPTURE(MultiTexCoord3d, isCallValid, context, target, s, t, r);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiTexCoord3dv(GLenum target, const GLdouble *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoord3dv, "glMultiTexCoord3dv",
-          "context = %d, target = %s, v = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, target), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMultiTexCoord3dv(context, target, v));
-        if (isCallValid)
-        {
-            context->multiTexCoord3dv(target, v);
-        }
-        ANGLE_CAPTURE(MultiTexCoord3dv, isCallValid, context, target, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoord3f, "glMultiTexCoord3f",
-          "context = %d, target = %s, s = %f, t = %f, r = %f", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, target), s, t, r);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMultiTexCoord3f(context, target, s, t, r));
-        if (isCallValid)
-        {
-            context->multiTexCoord3f(target, s, t, r);
-        }
-        ANGLE_CAPTURE(MultiTexCoord3f, isCallValid, context, target, s, t, r);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiTexCoord3fv(GLenum target, const GLfloat *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoord3fv, "glMultiTexCoord3fv",
-          "context = %d, target = %s, v = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, target), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMultiTexCoord3fv(context, target, v));
-        if (isCallValid)
-        {
-            context->multiTexCoord3fv(target, v);
-        }
-        ANGLE_CAPTURE(MultiTexCoord3fv, isCallValid, context, target, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoord3i, "glMultiTexCoord3i",
-          "context = %d, target = %s, s = %d, t = %d, r = %d", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, target), s, t, r);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMultiTexCoord3i(context, target, s, t, r));
-        if (isCallValid)
-        {
-            context->multiTexCoord3i(target, s, t, r);
-        }
-        ANGLE_CAPTURE(MultiTexCoord3i, isCallValid, context, target, s, t, r);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiTexCoord3iv(GLenum target, const GLint *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoord3iv, "glMultiTexCoord3iv",
-          "context = %d, target = %s, v = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, target), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMultiTexCoord3iv(context, target, v));
-        if (isCallValid)
-        {
-            context->multiTexCoord3iv(target, v);
-        }
-        ANGLE_CAPTURE(MultiTexCoord3iv, isCallValid, context, target, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoord3s, "glMultiTexCoord3s",
-          "context = %d, target = %s, s = %d, t = %d, r = %d", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, target), s, t, r);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMultiTexCoord3s(context, target, s, t, r));
-        if (isCallValid)
-        {
-            context->multiTexCoord3s(target, s, t, r);
-        }
-        ANGLE_CAPTURE(MultiTexCoord3s, isCallValid, context, target, s, t, r);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiTexCoord3sv(GLenum target, const GLshort *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoord3sv, "glMultiTexCoord3sv",
-          "context = %d, target = %s, v = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, target), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMultiTexCoord3sv(context, target, v));
-        if (isCallValid)
-        {
-            context->multiTexCoord3sv(target, v);
-        }
-        ANGLE_CAPTURE(MultiTexCoord3sv, isCallValid, context, target, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoord4d, "glMultiTexCoord4d",
-          "context = %d, target = %s, s = %f, t = %f, r = %f, q = %f", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, target), s, t, r, q);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMultiTexCoord4d(context, target, s, t, r, q));
-        if (isCallValid)
-        {
-            context->multiTexCoord4d(target, s, t, r, q);
-        }
-        ANGLE_CAPTURE(MultiTexCoord4d, isCallValid, context, target, s, t, r, q);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiTexCoord4dv(GLenum target, const GLdouble *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoord4dv, "glMultiTexCoord4dv",
-          "context = %d, target = %s, v = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, target), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMultiTexCoord4dv(context, target, v));
-        if (isCallValid)
-        {
-            context->multiTexCoord4dv(target, v);
-        }
-        ANGLE_CAPTURE(MultiTexCoord4dv, isCallValid, context, target, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoord4f, "glMultiTexCoord4f",
-          "context = %d, target = %s, s = %f, t = %f, r = %f, q = %f", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, target), s, t, r, q);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMultiTexCoord4f(context, target, s, t, r, q));
-        if (isCallValid)
-        {
-            context->multiTexCoord4f(target, s, t, r, q);
-        }
-        ANGLE_CAPTURE(MultiTexCoord4f, isCallValid, context, target, s, t, r, q);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiTexCoord4fv(GLenum target, const GLfloat *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoord4fv, "glMultiTexCoord4fv",
-          "context = %d, target = %s, v = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, target), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMultiTexCoord4fv(context, target, v));
-        if (isCallValid)
-        {
-            context->multiTexCoord4fv(target, v);
-        }
-        ANGLE_CAPTURE(MultiTexCoord4fv, isCallValid, context, target, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoord4i, "glMultiTexCoord4i",
-          "context = %d, target = %s, s = %d, t = %d, r = %d, q = %d", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, target), s, t, r, q);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMultiTexCoord4i(context, target, s, t, r, q));
-        if (isCallValid)
-        {
-            context->multiTexCoord4i(target, s, t, r, q);
-        }
-        ANGLE_CAPTURE(MultiTexCoord4i, isCallValid, context, target, s, t, r, q);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiTexCoord4iv(GLenum target, const GLint *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoord4iv, "glMultiTexCoord4iv",
-          "context = %d, target = %s, v = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, target), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMultiTexCoord4iv(context, target, v));
-        if (isCallValid)
-        {
-            context->multiTexCoord4iv(target, v);
-        }
-        ANGLE_CAPTURE(MultiTexCoord4iv, isCallValid, context, target, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoord4s, "glMultiTexCoord4s",
-          "context = %d, target = %s, s = %d, t = %d, r = %d, q = %d", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, target), s, t, r, q);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMultiTexCoord4s(context, target, s, t, r, q));
-        if (isCallValid)
-        {
-            context->multiTexCoord4s(target, s, t, r, q);
-        }
-        ANGLE_CAPTURE(MultiTexCoord4s, isCallValid, context, target, s, t, r, q);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiTexCoord4sv(GLenum target, const GLshort *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoord4sv, "glMultiTexCoord4sv",
-          "context = %d, target = %s, v = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, target), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMultiTexCoord4sv(context, target, v));
-        if (isCallValid)
-        {
-            context->multiTexCoord4sv(target, v);
-        }
-        ANGLE_CAPTURE(MultiTexCoord4sv, isCallValid, context, target, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY SampleCoverage(GLfloat value, GLboolean invert)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SampleCoverage, "glSampleCoverage",
-          "context = %d, value = %f, invert = %s", CID(context), value, GLbooleanToString(invert));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateSampleCoverage(context, value, invert));
-        if (isCallValid)
-        {
-            context->sampleCoverage(value, invert);
-        }
-        ANGLE_CAPTURE(SampleCoverage, isCallValid, context, value, invert);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-}  // namespace gl
diff --git a/src/libGL/entry_points_gl_1_3_autogen.h b/src/libGL/entry_points_gl_1_3_autogen.h
deleted file mode 100644
index 527d949..0000000
--- a/src/libGL/entry_points_gl_1_3_autogen.h
+++ /dev/null
@@ -1,115 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// entry_points_gl_1_3_autogen.h:
-//   Defines the GL 1.3 entry points.
-
-#ifndef LIBGL_ENTRY_POINTS_GL_1_3_AUTOGEN_H_
-#define LIBGL_ENTRY_POINTS_GL_1_3_AUTOGEN_H_
-
-#include <export.h>
-#include "angle_gl.h"
-
-namespace gl
-{
-ANGLE_EXPORT void GL_APIENTRY ActiveTexture(GLenum texture);
-ANGLE_EXPORT void GL_APIENTRY ClientActiveTexture(GLenum texture);
-ANGLE_EXPORT void GL_APIENTRY CompressedTexImage1D(GLenum target,
-                                                   GLint level,
-                                                   GLenum internalformat,
-                                                   GLsizei width,
-                                                   GLint border,
-                                                   GLsizei imageSize,
-                                                   const void *data);
-ANGLE_EXPORT void GL_APIENTRY CompressedTexImage2D(GLenum target,
-                                                   GLint level,
-                                                   GLenum internalformat,
-                                                   GLsizei width,
-                                                   GLsizei height,
-                                                   GLint border,
-                                                   GLsizei imageSize,
-                                                   const void *data);
-ANGLE_EXPORT void GL_APIENTRY CompressedTexImage3D(GLenum target,
-                                                   GLint level,
-                                                   GLenum internalformat,
-                                                   GLsizei width,
-                                                   GLsizei height,
-                                                   GLsizei depth,
-                                                   GLint border,
-                                                   GLsizei imageSize,
-                                                   const void *data);
-ANGLE_EXPORT void GL_APIENTRY CompressedTexSubImage1D(GLenum target,
-                                                      GLint level,
-                                                      GLint xoffset,
-                                                      GLsizei width,
-                                                      GLenum format,
-                                                      GLsizei imageSize,
-                                                      const void *data);
-ANGLE_EXPORT void GL_APIENTRY CompressedTexSubImage2D(GLenum target,
-                                                      GLint level,
-                                                      GLint xoffset,
-                                                      GLint yoffset,
-                                                      GLsizei width,
-                                                      GLsizei height,
-                                                      GLenum format,
-                                                      GLsizei imageSize,
-                                                      const void *data);
-ANGLE_EXPORT void GL_APIENTRY CompressedTexSubImage3D(GLenum target,
-                                                      GLint level,
-                                                      GLint xoffset,
-                                                      GLint yoffset,
-                                                      GLint zoffset,
-                                                      GLsizei width,
-                                                      GLsizei height,
-                                                      GLsizei depth,
-                                                      GLenum format,
-                                                      GLsizei imageSize,
-                                                      const void *data);
-ANGLE_EXPORT void GL_APIENTRY GetCompressedTexImage(GLenum target, GLint level, void *img);
-ANGLE_EXPORT void GL_APIENTRY LoadTransposeMatrixd(const GLdouble *m);
-ANGLE_EXPORT void GL_APIENTRY LoadTransposeMatrixf(const GLfloat *m);
-ANGLE_EXPORT void GL_APIENTRY MultTransposeMatrixd(const GLdouble *m);
-ANGLE_EXPORT void GL_APIENTRY MultTransposeMatrixf(const GLfloat *m);
-ANGLE_EXPORT void GL_APIENTRY MultiTexCoord1d(GLenum target, GLdouble s);
-ANGLE_EXPORT void GL_APIENTRY MultiTexCoord1dv(GLenum target, const GLdouble *v);
-ANGLE_EXPORT void GL_APIENTRY MultiTexCoord1f(GLenum target, GLfloat s);
-ANGLE_EXPORT void GL_APIENTRY MultiTexCoord1fv(GLenum target, const GLfloat *v);
-ANGLE_EXPORT void GL_APIENTRY MultiTexCoord1i(GLenum target, GLint s);
-ANGLE_EXPORT void GL_APIENTRY MultiTexCoord1iv(GLenum target, const GLint *v);
-ANGLE_EXPORT void GL_APIENTRY MultiTexCoord1s(GLenum target, GLshort s);
-ANGLE_EXPORT void GL_APIENTRY MultiTexCoord1sv(GLenum target, const GLshort *v);
-ANGLE_EXPORT void GL_APIENTRY MultiTexCoord2d(GLenum target, GLdouble s, GLdouble t);
-ANGLE_EXPORT void GL_APIENTRY MultiTexCoord2dv(GLenum target, const GLdouble *v);
-ANGLE_EXPORT void GL_APIENTRY MultiTexCoord2f(GLenum target, GLfloat s, GLfloat t);
-ANGLE_EXPORT void GL_APIENTRY MultiTexCoord2fv(GLenum target, const GLfloat *v);
-ANGLE_EXPORT void GL_APIENTRY MultiTexCoord2i(GLenum target, GLint s, GLint t);
-ANGLE_EXPORT void GL_APIENTRY MultiTexCoord2iv(GLenum target, const GLint *v);
-ANGLE_EXPORT void GL_APIENTRY MultiTexCoord2s(GLenum target, GLshort s, GLshort t);
-ANGLE_EXPORT void GL_APIENTRY MultiTexCoord2sv(GLenum target, const GLshort *v);
-ANGLE_EXPORT void GL_APIENTRY MultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r);
-ANGLE_EXPORT void GL_APIENTRY MultiTexCoord3dv(GLenum target, const GLdouble *v);
-ANGLE_EXPORT void GL_APIENTRY MultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r);
-ANGLE_EXPORT void GL_APIENTRY MultiTexCoord3fv(GLenum target, const GLfloat *v);
-ANGLE_EXPORT void GL_APIENTRY MultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r);
-ANGLE_EXPORT void GL_APIENTRY MultiTexCoord3iv(GLenum target, const GLint *v);
-ANGLE_EXPORT void GL_APIENTRY MultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r);
-ANGLE_EXPORT void GL_APIENTRY MultiTexCoord3sv(GLenum target, const GLshort *v);
-ANGLE_EXPORT void GL_APIENTRY
-MultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
-ANGLE_EXPORT void GL_APIENTRY MultiTexCoord4dv(GLenum target, const GLdouble *v);
-ANGLE_EXPORT void GL_APIENTRY
-MultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
-ANGLE_EXPORT void GL_APIENTRY MultiTexCoord4fv(GLenum target, const GLfloat *v);
-ANGLE_EXPORT void GL_APIENTRY MultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q);
-ANGLE_EXPORT void GL_APIENTRY MultiTexCoord4iv(GLenum target, const GLint *v);
-ANGLE_EXPORT void GL_APIENTRY
-MultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
-ANGLE_EXPORT void GL_APIENTRY MultiTexCoord4sv(GLenum target, const GLshort *v);
-ANGLE_EXPORT void GL_APIENTRY SampleCoverage(GLfloat value, GLboolean invert);
-}  // namespace gl
-
-#endif  // LIBGL_ENTRY_POINTS_GL_1_3_AUTOGEN_H_
diff --git a/src/libGL/entry_points_gl_1_4_autogen.cpp b/src/libGL/entry_points_gl_1_4_autogen.cpp
deleted file mode 100644
index 1e587f6..0000000
--- a/src/libGL/entry_points_gl_1_4_autogen.cpp
+++ /dev/null
@@ -1,1118 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// entry_points_gl_1_4_autogen.cpp:
-//   Defines the GL 1.4 entry points.
-
-#include "libGL/entry_points_gl_1_4_autogen.h"
-
-#include "libANGLE/Context.h"
-#include "libANGLE/Context.inl.h"
-#include "libANGLE/entry_points_utils.h"
-#include "libANGLE/gl_enum_utils.h"
-#include "libANGLE/validationEGL.h"
-#include "libANGLE/validationES.h"
-#include "libANGLE/validationES1.h"
-#include "libANGLE/validationES2.h"
-#include "libANGLE/validationES3.h"
-#include "libANGLE/validationES31.h"
-#include "libANGLE/validationES32.h"
-#include "libANGLE/validationESEXT.h"
-#include "libANGLE/validationGL14_autogen.h"
-#include "libGLESv2/global_state.h"
-
-namespace gl
-{
-void GL_APIENTRY BlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BlendColor, "glBlendColor",
-          "context = %d, red = %f, green = %f, blue = %f, alpha = %f", CID(context), red, green,
-          blue, alpha);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateBlendColor(context, red, green, blue, alpha));
-        if (isCallValid)
-        {
-            context->blendColor(red, green, blue, alpha);
-        }
-        ANGLE_CAPTURE(BlendColor, isCallValid, context, red, green, blue, alpha);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY BlendEquation(GLenum mode)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BlendEquation, "glBlendEquation", "context = %d, mode = %s",
-          CID(context), GLenumToString(GLenumGroup::BlendEquationModeEXT, mode));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateBlendEquation(context, mode));
-        if (isCallValid)
-        {
-            context->blendEquation(mode);
-        }
-        ANGLE_CAPTURE(BlendEquation, isCallValid, context, mode);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY BlendFuncSeparate(GLenum sfactorRGB,
-                                   GLenum dfactorRGB,
-                                   GLenum sfactorAlpha,
-                                   GLenum dfactorAlpha)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BlendFuncSeparate, "glBlendFuncSeparate",
-          "context = %d, sfactorRGB = %s, dfactorRGB = %s, sfactorAlpha = %s, dfactorAlpha = %s",
-          CID(context), GLenumToString(GLenumGroup::BlendingFactor, sfactorRGB),
-          GLenumToString(GLenumGroup::BlendingFactor, dfactorRGB),
-          GLenumToString(GLenumGroup::BlendingFactor, sfactorAlpha),
-          GLenumToString(GLenumGroup::BlendingFactor, dfactorAlpha));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateBlendFuncSeparate(context, sfactorRGB, dfactorRGB,
-                                                                    sfactorAlpha, dfactorAlpha));
-        if (isCallValid)
-        {
-            context->blendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
-        }
-        ANGLE_CAPTURE(BlendFuncSeparate, isCallValid, context, sfactorRGB, dfactorRGB, sfactorAlpha,
-                      dfactorAlpha);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY FogCoordPointer(GLenum type, GLsizei stride, const void *pointer)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::FogCoordPointer, "glFogCoordPointer",
-          "context = %d, type = %s, stride = %d, pointer = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::FogPointerTypeEXT, type), stride, (uintptr_t)pointer);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateFogCoordPointer(context, type, stride, pointer));
-        if (isCallValid)
-        {
-            context->fogCoordPointer(type, stride, pointer);
-        }
-        ANGLE_CAPTURE(FogCoordPointer, isCallValid, context, type, stride, pointer);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY FogCoordd(GLdouble coord)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::FogCoordd, "glFogCoordd", "context = %d, coord = %f",
-          CID(context), coord);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateFogCoordd(context, coord));
-        if (isCallValid)
-        {
-            context->fogCoordd(coord);
-        }
-        ANGLE_CAPTURE(FogCoordd, isCallValid, context, coord);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY FogCoorddv(const GLdouble *coord)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::FogCoorddv, "glFogCoorddv",
-          "context = %d, coord = 0x%016" PRIxPTR "", CID(context), (uintptr_t)coord);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateFogCoorddv(context, coord));
-        if (isCallValid)
-        {
-            context->fogCoorddv(coord);
-        }
-        ANGLE_CAPTURE(FogCoorddv, isCallValid, context, coord);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY FogCoordf(GLfloat coord)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::FogCoordf, "glFogCoordf", "context = %d, coord = %f",
-          CID(context), coord);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateFogCoordf(context, coord));
-        if (isCallValid)
-        {
-            context->fogCoordf(coord);
-        }
-        ANGLE_CAPTURE(FogCoordf, isCallValid, context, coord);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY FogCoordfv(const GLfloat *coord)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::FogCoordfv, "glFogCoordfv",
-          "context = %d, coord = 0x%016" PRIxPTR "", CID(context), (uintptr_t)coord);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateFogCoordfv(context, coord));
-        if (isCallValid)
-        {
-            context->fogCoordfv(coord);
-        }
-        ANGLE_CAPTURE(FogCoordfv, isCallValid, context, coord);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiDrawArrays(GLenum mode,
-                                 const GLint *first,
-                                 const GLsizei *count,
-                                 GLsizei drawcount)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiDrawArrays, "glMultiDrawArrays",
-          "context = %d, mode = %s, first = 0x%016" PRIxPTR ", count = 0x%016" PRIxPTR
-          ", drawcount = %d",
-          CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), (uintptr_t)first,
-          (uintptr_t)count, drawcount);
-
-    if (context)
-    {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateMultiDrawArrays(context, modePacked, first, count, drawcount));
-        if (isCallValid)
-        {
-            context->multiDrawArrays(modePacked, first, count, drawcount);
-        }
-        ANGLE_CAPTURE(MultiDrawArrays, isCallValid, context, modePacked, first, count, drawcount);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiDrawElements(GLenum mode,
-                                   const GLsizei *count,
-                                   GLenum type,
-                                   const void *const *indices,
-                                   GLsizei drawcount)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiDrawElements, "glMultiDrawElements",
-          "context = %d, mode = %s, count = 0x%016" PRIxPTR ", type = %s, indices = 0x%016" PRIxPTR
-          ", drawcount = %d",
-          CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), (uintptr_t)count,
-          GLenumToString(GLenumGroup::DrawElementsType, type), (uintptr_t)indices, drawcount);
-
-    if (context)
-    {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateMultiDrawElements(context, modePacked, count, typePacked, indices, drawcount));
-        if (isCallValid)
-        {
-            context->multiDrawElements(modePacked, count, typePacked, indices, drawcount);
-        }
-        ANGLE_CAPTURE(MultiDrawElements, isCallValid, context, modePacked, count, typePacked,
-                      indices, drawcount);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY PointParameterf(GLenum pname, GLfloat param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PointParameterf, "glPointParameterf",
-          "context = %d, pname = %s, param = %f", CID(context),
-          GLenumToString(GLenumGroup::DefaultGroup, pname), param);
-
-    if (context)
-    {
-        PointParameter pnamePacked                            = FromGL<PointParameter>(pname);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidatePointParameterf(context, pnamePacked, param));
-        if (isCallValid)
-        {
-            context->pointParameterf(pnamePacked, param);
-        }
-        ANGLE_CAPTURE(PointParameterf, isCallValid, context, pnamePacked, param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY PointParameterfv(GLenum pname, const GLfloat *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PointParameterfv, "glPointParameterfv",
-          "context = %d, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        PointParameter pnamePacked                            = FromGL<PointParameter>(pname);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidatePointParameterfv(context, pnamePacked, params));
-        if (isCallValid)
-        {
-            context->pointParameterfv(pnamePacked, params);
-        }
-        ANGLE_CAPTURE(PointParameterfv, isCallValid, context, pnamePacked, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY PointParameteri(GLenum pname, GLint param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PointParameteri, "glPointParameteri",
-          "context = %d, pname = %s, param = %d", CID(context),
-          GLenumToString(GLenumGroup::DefaultGroup, pname), param);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidatePointParameteri(context, pname, param));
-        if (isCallValid)
-        {
-            context->pointParameteri(pname, param);
-        }
-        ANGLE_CAPTURE(PointParameteri, isCallValid, context, pname, param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY PointParameteriv(GLenum pname, const GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PointParameteriv, "glPointParameteriv",
-          "context = %d, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidatePointParameteriv(context, pname, params));
-        if (isCallValid)
-        {
-            context->pointParameteriv(pname, params);
-        }
-        ANGLE_CAPTURE(PointParameteriv, isCallValid, context, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY SecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SecondaryColor3b, "glSecondaryColor3b",
-          "context = %d, red = %d, green = %d, blue = %d", CID(context), red, green, blue);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateSecondaryColor3b(context, red, green, blue));
-        if (isCallValid)
-        {
-            context->secondaryColor3b(red, green, blue);
-        }
-        ANGLE_CAPTURE(SecondaryColor3b, isCallValid, context, red, green, blue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY SecondaryColor3bv(const GLbyte *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SecondaryColor3bv, "glSecondaryColor3bv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateSecondaryColor3bv(context, v));
-        if (isCallValid)
-        {
-            context->secondaryColor3bv(v);
-        }
-        ANGLE_CAPTURE(SecondaryColor3bv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY SecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SecondaryColor3d, "glSecondaryColor3d",
-          "context = %d, red = %f, green = %f, blue = %f", CID(context), red, green, blue);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateSecondaryColor3d(context, red, green, blue));
-        if (isCallValid)
-        {
-            context->secondaryColor3d(red, green, blue);
-        }
-        ANGLE_CAPTURE(SecondaryColor3d, isCallValid, context, red, green, blue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY SecondaryColor3dv(const GLdouble *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SecondaryColor3dv, "glSecondaryColor3dv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateSecondaryColor3dv(context, v));
-        if (isCallValid)
-        {
-            context->secondaryColor3dv(v);
-        }
-        ANGLE_CAPTURE(SecondaryColor3dv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY SecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SecondaryColor3f, "glSecondaryColor3f",
-          "context = %d, red = %f, green = %f, blue = %f", CID(context), red, green, blue);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateSecondaryColor3f(context, red, green, blue));
-        if (isCallValid)
-        {
-            context->secondaryColor3f(red, green, blue);
-        }
-        ANGLE_CAPTURE(SecondaryColor3f, isCallValid, context, red, green, blue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY SecondaryColor3fv(const GLfloat *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SecondaryColor3fv, "glSecondaryColor3fv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateSecondaryColor3fv(context, v));
-        if (isCallValid)
-        {
-            context->secondaryColor3fv(v);
-        }
-        ANGLE_CAPTURE(SecondaryColor3fv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY SecondaryColor3i(GLint red, GLint green, GLint blue)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SecondaryColor3i, "glSecondaryColor3i",
-          "context = %d, red = %d, green = %d, blue = %d", CID(context), red, green, blue);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateSecondaryColor3i(context, red, green, blue));
-        if (isCallValid)
-        {
-            context->secondaryColor3i(red, green, blue);
-        }
-        ANGLE_CAPTURE(SecondaryColor3i, isCallValid, context, red, green, blue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY SecondaryColor3iv(const GLint *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SecondaryColor3iv, "glSecondaryColor3iv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateSecondaryColor3iv(context, v));
-        if (isCallValid)
-        {
-            context->secondaryColor3iv(v);
-        }
-        ANGLE_CAPTURE(SecondaryColor3iv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY SecondaryColor3s(GLshort red, GLshort green, GLshort blue)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SecondaryColor3s, "glSecondaryColor3s",
-          "context = %d, red = %d, green = %d, blue = %d", CID(context), red, green, blue);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateSecondaryColor3s(context, red, green, blue));
-        if (isCallValid)
-        {
-            context->secondaryColor3s(red, green, blue);
-        }
-        ANGLE_CAPTURE(SecondaryColor3s, isCallValid, context, red, green, blue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY SecondaryColor3sv(const GLshort *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SecondaryColor3sv, "glSecondaryColor3sv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateSecondaryColor3sv(context, v));
-        if (isCallValid)
-        {
-            context->secondaryColor3sv(v);
-        }
-        ANGLE_CAPTURE(SecondaryColor3sv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY SecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SecondaryColor3ub, "glSecondaryColor3ub",
-          "context = %d, red = %d, green = %d, blue = %d", CID(context), red, green, blue);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateSecondaryColor3ub(context, red, green, blue));
-        if (isCallValid)
-        {
-            context->secondaryColor3ub(red, green, blue);
-        }
-        ANGLE_CAPTURE(SecondaryColor3ub, isCallValid, context, red, green, blue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY SecondaryColor3ubv(const GLubyte *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SecondaryColor3ubv, "glSecondaryColor3ubv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateSecondaryColor3ubv(context, v));
-        if (isCallValid)
-        {
-            context->secondaryColor3ubv(v);
-        }
-        ANGLE_CAPTURE(SecondaryColor3ubv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY SecondaryColor3ui(GLuint red, GLuint green, GLuint blue)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SecondaryColor3ui, "glSecondaryColor3ui",
-          "context = %d, red = %u, green = %u, blue = %u", CID(context), red, green, blue);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateSecondaryColor3ui(context, red, green, blue));
-        if (isCallValid)
-        {
-            context->secondaryColor3ui(red, green, blue);
-        }
-        ANGLE_CAPTURE(SecondaryColor3ui, isCallValid, context, red, green, blue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY SecondaryColor3uiv(const GLuint *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SecondaryColor3uiv, "glSecondaryColor3uiv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateSecondaryColor3uiv(context, v));
-        if (isCallValid)
-        {
-            context->secondaryColor3uiv(v);
-        }
-        ANGLE_CAPTURE(SecondaryColor3uiv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY SecondaryColor3us(GLushort red, GLushort green, GLushort blue)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SecondaryColor3us, "glSecondaryColor3us",
-          "context = %d, red = %u, green = %u, blue = %u", CID(context), red, green, blue);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateSecondaryColor3us(context, red, green, blue));
-        if (isCallValid)
-        {
-            context->secondaryColor3us(red, green, blue);
-        }
-        ANGLE_CAPTURE(SecondaryColor3us, isCallValid, context, red, green, blue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY SecondaryColor3usv(const GLushort *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SecondaryColor3usv, "glSecondaryColor3usv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateSecondaryColor3usv(context, v));
-        if (isCallValid)
-        {
-            context->secondaryColor3usv(v);
-        }
-        ANGLE_CAPTURE(SecondaryColor3usv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY SecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const void *pointer)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SecondaryColorPointer, "glSecondaryColorPointer",
-          "context = %d, size = %d, type = %s, stride = %d, pointer = 0x%016" PRIxPTR "",
-          CID(context), size, GLenumToString(GLenumGroup::ColorPointerType, type), stride,
-          (uintptr_t)pointer);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateSecondaryColorPointer(context, size, type, stride, pointer));
-        if (isCallValid)
-        {
-            context->secondaryColorPointer(size, type, stride, pointer);
-        }
-        ANGLE_CAPTURE(SecondaryColorPointer, isCallValid, context, size, type, stride, pointer);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY WindowPos2d(GLdouble x, GLdouble y)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::WindowPos2d, "glWindowPos2d", "context = %d, x = %f, y = %f",
-          CID(context), x, y);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateWindowPos2d(context, x, y));
-        if (isCallValid)
-        {
-            context->windowPos2d(x, y);
-        }
-        ANGLE_CAPTURE(WindowPos2d, isCallValid, context, x, y);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY WindowPos2dv(const GLdouble *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::WindowPos2dv, "glWindowPos2dv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateWindowPos2dv(context, v));
-        if (isCallValid)
-        {
-            context->windowPos2dv(v);
-        }
-        ANGLE_CAPTURE(WindowPos2dv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY WindowPos2f(GLfloat x, GLfloat y)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::WindowPos2f, "glWindowPos2f", "context = %d, x = %f, y = %f",
-          CID(context), x, y);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateWindowPos2f(context, x, y));
-        if (isCallValid)
-        {
-            context->windowPos2f(x, y);
-        }
-        ANGLE_CAPTURE(WindowPos2f, isCallValid, context, x, y);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY WindowPos2fv(const GLfloat *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::WindowPos2fv, "glWindowPos2fv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateWindowPos2fv(context, v));
-        if (isCallValid)
-        {
-            context->windowPos2fv(v);
-        }
-        ANGLE_CAPTURE(WindowPos2fv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY WindowPos2i(GLint x, GLint y)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::WindowPos2i, "glWindowPos2i", "context = %d, x = %d, y = %d",
-          CID(context), x, y);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateWindowPos2i(context, x, y));
-        if (isCallValid)
-        {
-            context->windowPos2i(x, y);
-        }
-        ANGLE_CAPTURE(WindowPos2i, isCallValid, context, x, y);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY WindowPos2iv(const GLint *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::WindowPos2iv, "glWindowPos2iv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateWindowPos2iv(context, v));
-        if (isCallValid)
-        {
-            context->windowPos2iv(v);
-        }
-        ANGLE_CAPTURE(WindowPos2iv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY WindowPos2s(GLshort x, GLshort y)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::WindowPos2s, "glWindowPos2s", "context = %d, x = %d, y = %d",
-          CID(context), x, y);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateWindowPos2s(context, x, y));
-        if (isCallValid)
-        {
-            context->windowPos2s(x, y);
-        }
-        ANGLE_CAPTURE(WindowPos2s, isCallValid, context, x, y);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY WindowPos2sv(const GLshort *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::WindowPos2sv, "glWindowPos2sv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateWindowPos2sv(context, v));
-        if (isCallValid)
-        {
-            context->windowPos2sv(v);
-        }
-        ANGLE_CAPTURE(WindowPos2sv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY WindowPos3d(GLdouble x, GLdouble y, GLdouble z)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::WindowPos3d, "glWindowPos3d",
-          "context = %d, x = %f, y = %f, z = %f", CID(context), x, y, z);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateWindowPos3d(context, x, y, z));
-        if (isCallValid)
-        {
-            context->windowPos3d(x, y, z);
-        }
-        ANGLE_CAPTURE(WindowPos3d, isCallValid, context, x, y, z);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY WindowPos3dv(const GLdouble *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::WindowPos3dv, "glWindowPos3dv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateWindowPos3dv(context, v));
-        if (isCallValid)
-        {
-            context->windowPos3dv(v);
-        }
-        ANGLE_CAPTURE(WindowPos3dv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY WindowPos3f(GLfloat x, GLfloat y, GLfloat z)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::WindowPos3f, "glWindowPos3f",
-          "context = %d, x = %f, y = %f, z = %f", CID(context), x, y, z);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateWindowPos3f(context, x, y, z));
-        if (isCallValid)
-        {
-            context->windowPos3f(x, y, z);
-        }
-        ANGLE_CAPTURE(WindowPos3f, isCallValid, context, x, y, z);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY WindowPos3fv(const GLfloat *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::WindowPos3fv, "glWindowPos3fv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateWindowPos3fv(context, v));
-        if (isCallValid)
-        {
-            context->windowPos3fv(v);
-        }
-        ANGLE_CAPTURE(WindowPos3fv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY WindowPos3i(GLint x, GLint y, GLint z)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::WindowPos3i, "glWindowPos3i",
-          "context = %d, x = %d, y = %d, z = %d", CID(context), x, y, z);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateWindowPos3i(context, x, y, z));
-        if (isCallValid)
-        {
-            context->windowPos3i(x, y, z);
-        }
-        ANGLE_CAPTURE(WindowPos3i, isCallValid, context, x, y, z);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY WindowPos3iv(const GLint *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::WindowPos3iv, "glWindowPos3iv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateWindowPos3iv(context, v));
-        if (isCallValid)
-        {
-            context->windowPos3iv(v);
-        }
-        ANGLE_CAPTURE(WindowPos3iv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY WindowPos3s(GLshort x, GLshort y, GLshort z)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::WindowPos3s, "glWindowPos3s",
-          "context = %d, x = %d, y = %d, z = %d", CID(context), x, y, z);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateWindowPos3s(context, x, y, z));
-        if (isCallValid)
-        {
-            context->windowPos3s(x, y, z);
-        }
-        ANGLE_CAPTURE(WindowPos3s, isCallValid, context, x, y, z);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY WindowPos3sv(const GLshort *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::WindowPos3sv, "glWindowPos3sv",
-          "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateWindowPos3sv(context, v));
-        if (isCallValid)
-        {
-            context->windowPos3sv(v);
-        }
-        ANGLE_CAPTURE(WindowPos3sv, isCallValid, context, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-}  // namespace gl
diff --git a/src/libGL/entry_points_gl_1_4_autogen.h b/src/libGL/entry_points_gl_1_4_autogen.h
deleted file mode 100644
index 7792211..0000000
--- a/src/libGL/entry_points_gl_1_4_autogen.h
+++ /dev/null
@@ -1,81 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// entry_points_gl_1_4_autogen.h:
-//   Defines the GL 1.4 entry points.
-
-#ifndef LIBGL_ENTRY_POINTS_GL_1_4_AUTOGEN_H_
-#define LIBGL_ENTRY_POINTS_GL_1_4_AUTOGEN_H_
-
-#include <export.h>
-#include "angle_gl.h"
-
-namespace gl
-{
-ANGLE_EXPORT void GL_APIENTRY BlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-ANGLE_EXPORT void GL_APIENTRY BlendEquation(GLenum mode);
-ANGLE_EXPORT void GL_APIENTRY BlendFuncSeparate(GLenum sfactorRGB,
-                                                GLenum dfactorRGB,
-                                                GLenum sfactorAlpha,
-                                                GLenum dfactorAlpha);
-ANGLE_EXPORT void GL_APIENTRY FogCoordPointer(GLenum type, GLsizei stride, const void *pointer);
-ANGLE_EXPORT void GL_APIENTRY FogCoordd(GLdouble coord);
-ANGLE_EXPORT void GL_APIENTRY FogCoorddv(const GLdouble *coord);
-ANGLE_EXPORT void GL_APIENTRY FogCoordf(GLfloat coord);
-ANGLE_EXPORT void GL_APIENTRY FogCoordfv(const GLfloat *coord);
-ANGLE_EXPORT void GL_APIENTRY MultiDrawArrays(GLenum mode,
-                                              const GLint *first,
-                                              const GLsizei *count,
-                                              GLsizei drawcount);
-ANGLE_EXPORT void GL_APIENTRY MultiDrawElements(GLenum mode,
-                                                const GLsizei *count,
-                                                GLenum type,
-                                                const void *const *indices,
-                                                GLsizei drawcount);
-ANGLE_EXPORT void GL_APIENTRY PointParameterf(GLenum pname, GLfloat param);
-ANGLE_EXPORT void GL_APIENTRY PointParameterfv(GLenum pname, const GLfloat *params);
-ANGLE_EXPORT void GL_APIENTRY PointParameteri(GLenum pname, GLint param);
-ANGLE_EXPORT void GL_APIENTRY PointParameteriv(GLenum pname, const GLint *params);
-ANGLE_EXPORT void GL_APIENTRY SecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue);
-ANGLE_EXPORT void GL_APIENTRY SecondaryColor3bv(const GLbyte *v);
-ANGLE_EXPORT void GL_APIENTRY SecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue);
-ANGLE_EXPORT void GL_APIENTRY SecondaryColor3dv(const GLdouble *v);
-ANGLE_EXPORT void GL_APIENTRY SecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue);
-ANGLE_EXPORT void GL_APIENTRY SecondaryColor3fv(const GLfloat *v);
-ANGLE_EXPORT void GL_APIENTRY SecondaryColor3i(GLint red, GLint green, GLint blue);
-ANGLE_EXPORT void GL_APIENTRY SecondaryColor3iv(const GLint *v);
-ANGLE_EXPORT void GL_APIENTRY SecondaryColor3s(GLshort red, GLshort green, GLshort blue);
-ANGLE_EXPORT void GL_APIENTRY SecondaryColor3sv(const GLshort *v);
-ANGLE_EXPORT void GL_APIENTRY SecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue);
-ANGLE_EXPORT void GL_APIENTRY SecondaryColor3ubv(const GLubyte *v);
-ANGLE_EXPORT void GL_APIENTRY SecondaryColor3ui(GLuint red, GLuint green, GLuint blue);
-ANGLE_EXPORT void GL_APIENTRY SecondaryColor3uiv(const GLuint *v);
-ANGLE_EXPORT void GL_APIENTRY SecondaryColor3us(GLushort red, GLushort green, GLushort blue);
-ANGLE_EXPORT void GL_APIENTRY SecondaryColor3usv(const GLushort *v);
-ANGLE_EXPORT void GL_APIENTRY SecondaryColorPointer(GLint size,
-                                                    GLenum type,
-                                                    GLsizei stride,
-                                                    const void *pointer);
-ANGLE_EXPORT void GL_APIENTRY WindowPos2d(GLdouble x, GLdouble y);
-ANGLE_EXPORT void GL_APIENTRY WindowPos2dv(const GLdouble *v);
-ANGLE_EXPORT void GL_APIENTRY WindowPos2f(GLfloat x, GLfloat y);
-ANGLE_EXPORT void GL_APIENTRY WindowPos2fv(const GLfloat *v);
-ANGLE_EXPORT void GL_APIENTRY WindowPos2i(GLint x, GLint y);
-ANGLE_EXPORT void GL_APIENTRY WindowPos2iv(const GLint *v);
-ANGLE_EXPORT void GL_APIENTRY WindowPos2s(GLshort x, GLshort y);
-ANGLE_EXPORT void GL_APIENTRY WindowPos2sv(const GLshort *v);
-ANGLE_EXPORT void GL_APIENTRY WindowPos3d(GLdouble x, GLdouble y, GLdouble z);
-ANGLE_EXPORT void GL_APIENTRY WindowPos3dv(const GLdouble *v);
-ANGLE_EXPORT void GL_APIENTRY WindowPos3f(GLfloat x, GLfloat y, GLfloat z);
-ANGLE_EXPORT void GL_APIENTRY WindowPos3fv(const GLfloat *v);
-ANGLE_EXPORT void GL_APIENTRY WindowPos3i(GLint x, GLint y, GLint z);
-ANGLE_EXPORT void GL_APIENTRY WindowPos3iv(const GLint *v);
-ANGLE_EXPORT void GL_APIENTRY WindowPos3s(GLshort x, GLshort y, GLshort z);
-ANGLE_EXPORT void GL_APIENTRY WindowPos3sv(const GLshort *v);
-}  // namespace gl
-
-#endif  // LIBGL_ENTRY_POINTS_GL_1_4_AUTOGEN_H_
diff --git a/src/libGL/entry_points_gl_1_5_autogen.cpp b/src/libGL/entry_points_gl_1_5_autogen.cpp
deleted file mode 100644
index 95f9efc..0000000
--- a/src/libGL/entry_points_gl_1_5_autogen.cpp
+++ /dev/null
@@ -1,528 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// entry_points_gl_1_5_autogen.cpp:
-//   Defines the GL 1.5 entry points.
-
-#include "libGL/entry_points_gl_1_5_autogen.h"
-
-#include "libANGLE/Context.h"
-#include "libANGLE/Context.inl.h"
-#include "libANGLE/entry_points_utils.h"
-#include "libANGLE/gl_enum_utils.h"
-#include "libANGLE/validationEGL.h"
-#include "libANGLE/validationES.h"
-#include "libANGLE/validationES1.h"
-#include "libANGLE/validationES2.h"
-#include "libANGLE/validationES3.h"
-#include "libANGLE/validationES31.h"
-#include "libANGLE/validationES32.h"
-#include "libANGLE/validationESEXT.h"
-#include "libANGLE/validationGL15_autogen.h"
-#include "libGLESv2/global_state.h"
-
-namespace gl
-{
-void GL_APIENTRY BeginQuery(GLenum target, GLuint id)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BeginQuery, "glBeginQuery", "context = %d, target = %s, id = %u",
-          CID(context), GLenumToString(GLenumGroup::QueryTarget, target), id);
-
-    if (context)
-    {
-        QueryType targetPacked                                = FromGL<QueryType>(target);
-        QueryID idPacked                                      = FromGL<QueryID>(id);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateBeginQuery(context, targetPacked, idPacked));
-        if (isCallValid)
-        {
-            context->beginQuery(targetPacked, idPacked);
-        }
-        ANGLE_CAPTURE(BeginQuery, isCallValid, context, targetPacked, idPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY BindBuffer(GLenum target, GLuint buffer)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindBuffer, "glBindBuffer",
-          "context = %d, target = %s, buffer = %u", CID(context),
-          GLenumToString(GLenumGroup::BufferTargetARB, target), buffer);
-
-    if (context)
-    {
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateBindBuffer(context, targetPacked, bufferPacked));
-        if (isCallValid)
-        {
-            context->bindBuffer(targetPacked, bufferPacked);
-        }
-        ANGLE_CAPTURE(BindBuffer, isCallValid, context, targetPacked, bufferPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY BufferData(GLenum target, GLsizeiptr size, const void *data, GLenum usage)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BufferData, "glBufferData",
-          "context = %d, target = %s, size = %llu, data = 0x%016" PRIxPTR ", usage = %s",
-          CID(context), GLenumToString(GLenumGroup::BufferTargetARB, target),
-          static_cast<unsigned long long>(size), (uintptr_t)data,
-          GLenumToString(GLenumGroup::BufferUsageARB, usage));
-
-    if (context)
-    {
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
-        BufferUsage usagePacked                               = FromGL<BufferUsage>(usage);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateBufferData(context, targetPacked, size, data, usagePacked));
-        if (isCallValid)
-        {
-            context->bufferData(targetPacked, size, data, usagePacked);
-        }
-        ANGLE_CAPTURE(BufferData, isCallValid, context, targetPacked, size, data, usagePacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY BufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void *data)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BufferSubData, "glBufferSubData",
-          "context = %d, target = %s, offset = %llu, size = %llu, data = 0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::BufferTargetARB, target),
-          static_cast<unsigned long long>(offset), static_cast<unsigned long long>(size),
-          (uintptr_t)data);
-
-    if (context)
-    {
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateBufferSubData(context, targetPacked, offset, size, data));
-        if (isCallValid)
-        {
-            context->bufferSubData(targetPacked, offset, size, data);
-        }
-        ANGLE_CAPTURE(BufferSubData, isCallValid, context, targetPacked, offset, size, data);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DeleteBuffers(GLsizei n, const GLuint *buffers)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DeleteBuffers, "glDeleteBuffers",
-          "context = %d, n = %d, buffers = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)buffers);
-
-    if (context)
-    {
-        const BufferID *buffersPacked                         = FromGL<const BufferID *>(buffers);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateDeleteBuffers(context, n, buffersPacked));
-        if (isCallValid)
-        {
-            context->deleteBuffers(n, buffersPacked);
-        }
-        ANGLE_CAPTURE(DeleteBuffers, isCallValid, context, n, buffersPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DeleteQueries(GLsizei n, const GLuint *ids)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DeleteQueries, "glDeleteQueries",
-          "context = %d, n = %d, ids = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)ids);
-
-    if (context)
-    {
-        const QueryID *idsPacked                              = FromGL<const QueryID *>(ids);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateDeleteQueries(context, n, idsPacked));
-        if (isCallValid)
-        {
-            context->deleteQueries(n, idsPacked);
-        }
-        ANGLE_CAPTURE(DeleteQueries, isCallValid, context, n, idsPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY EndQuery(GLenum target)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::EndQuery, "glEndQuery", "context = %d, target = %s",
-          CID(context), GLenumToString(GLenumGroup::QueryTarget, target));
-
-    if (context)
-    {
-        QueryType targetPacked                                = FromGL<QueryType>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateEndQuery(context, targetPacked));
-        if (isCallValid)
-        {
-            context->endQuery(targetPacked);
-        }
-        ANGLE_CAPTURE(EndQuery, isCallValid, context, targetPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GenBuffers(GLsizei n, GLuint *buffers)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GenBuffers, "glGenBuffers",
-          "context = %d, n = %d, buffers = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)buffers);
-
-    if (context)
-    {
-        BufferID *buffersPacked                               = FromGL<BufferID *>(buffers);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGenBuffers(context, n, buffersPacked));
-        if (isCallValid)
-        {
-            context->genBuffers(n, buffersPacked);
-        }
-        ANGLE_CAPTURE(GenBuffers, isCallValid, context, n, buffersPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GenQueries(GLsizei n, GLuint *ids)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GenQueries, "glGenQueries",
-          "context = %d, n = %d, ids = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)ids);
-
-    if (context)
-    {
-        QueryID *idsPacked                                    = FromGL<QueryID *>(ids);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateGenQueries(context, n, idsPacked));
-        if (isCallValid)
-        {
-            context->genQueries(n, idsPacked);
-        }
-        ANGLE_CAPTURE(GenQueries, isCallValid, context, n, idsPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetBufferParameteriv, "glGetBufferParameteriv",
-          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::BufferTargetARB, target),
-          GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetBufferParameteriv(context, targetPacked, pname, params));
-        if (isCallValid)
-        {
-            context->getBufferParameteriv(targetPacked, pname, params);
-        }
-        ANGLE_CAPTURE(GetBufferParameteriv, isCallValid, context, targetPacked, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetBufferPointerv(GLenum target, GLenum pname, void **params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetBufferPointerv, "glGetBufferPointerv",
-          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::BufferTargetARB, target),
-          GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetBufferPointerv(context, targetPacked, pname, params));
-        if (isCallValid)
-        {
-            context->getBufferPointerv(targetPacked, pname, params);
-        }
-        ANGLE_CAPTURE(GetBufferPointerv, isCallValid, context, targetPacked, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, void *data)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetBufferSubData, "glGetBufferSubData",
-          "context = %d, target = %s, offset = %llu, size = %llu, data = 0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::BufferTargetARB, target),
-          static_cast<unsigned long long>(offset), static_cast<unsigned long long>(size),
-          (uintptr_t)data);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetBufferSubData(context, target, offset, size, data));
-        if (isCallValid)
-        {
-            context->getBufferSubData(target, offset, size, data);
-        }
-        ANGLE_CAPTURE(GetBufferSubData, isCallValid, context, target, offset, size, data);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
-{
-    Context *context = GetGlobalContext();
-    EVENT(context, gl::EntryPoint::GetQueryObjectiv, "glGetQueryObjectiv",
-          "context = %d, id = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), id,
-          GLenumToString(GLenumGroup::QueryObjectParameterName, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        QueryID idPacked                                      = FromGL<QueryID>(id);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetQueryObjectiv(context, idPacked, pname, params));
-        if (isCallValid)
-        {
-            context->getQueryObjectiv(idPacked, pname, params);
-        }
-        ANGLE_CAPTURE(GetQueryObjectiv, isCallValid, context, idPacked, pname, params);
-    }
-    else
-    {}
-}
-
-void GL_APIENTRY GetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetQueryObjectuiv, "glGetQueryObjectuiv",
-          "context = %d, id = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), id,
-          GLenumToString(GLenumGroup::QueryObjectParameterName, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        QueryID idPacked                                      = FromGL<QueryID>(id);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetQueryObjectuiv(context, idPacked, pname, params));
-        if (isCallValid)
-        {
-            context->getQueryObjectuiv(idPacked, pname, params);
-        }
-        ANGLE_CAPTURE(GetQueryObjectuiv, isCallValid, context, idPacked, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetQueryiv(GLenum target, GLenum pname, GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetQueryiv, "glGetQueryiv",
-          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::QueryTarget, target),
-          GLenumToString(GLenumGroup::QueryParameterName, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        QueryType targetPacked                                = FromGL<QueryType>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetQueryiv(context, targetPacked, pname, params));
-        if (isCallValid)
-        {
-            context->getQueryiv(targetPacked, pname, params);
-        }
-        ANGLE_CAPTURE(GetQueryiv, isCallValid, context, targetPacked, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-GLboolean GL_APIENTRY IsBuffer(GLuint buffer)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IsBuffer, "glIsBuffer", "context = %d, buffer = %u",
-          CID(context), buffer);
-
-    GLboolean returnValue;
-    if (context)
-    {
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateIsBuffer(context, bufferPacked));
-        if (isCallValid)
-        {
-            returnValue = context->isBuffer(bufferPacked);
-        }
-        else
-        {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsBuffer, GLboolean>();
-        }
-        ANGLE_CAPTURE(IsBuffer, isCallValid, context, bufferPacked, returnValue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::IsBuffer, GLboolean>();
-    }
-    return returnValue;
-}
-
-GLboolean GL_APIENTRY IsQuery(GLuint id)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IsQuery, "glIsQuery", "context = %d, id = %u", CID(context), id);
-
-    GLboolean returnValue;
-    if (context)
-    {
-        QueryID idPacked                                      = FromGL<QueryID>(id);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateIsQuery(context, idPacked));
-        if (isCallValid)
-        {
-            returnValue = context->isQuery(idPacked);
-        }
-        else
-        {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsQuery, GLboolean>();
-        }
-        ANGLE_CAPTURE(IsQuery, isCallValid, context, idPacked, returnValue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::IsQuery, GLboolean>();
-    }
-    return returnValue;
-}
-
-void *GL_APIENTRY MapBuffer(GLenum target, GLenum access)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MapBuffer, "glMapBuffer",
-          "context = %d, target = %s, access = %s", CID(context),
-          GLenumToString(GLenumGroup::BufferTargetARB, target),
-          GLenumToString(GLenumGroup::BufferAccessARB, access));
-
-    void *returnValue;
-    if (context)
-    {
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMapBuffer(context, targetPacked, access));
-        if (isCallValid)
-        {
-            returnValue = context->mapBuffer(targetPacked, access);
-        }
-        else
-        {
-            returnValue = GetDefaultReturnValue<EntryPoint::MapBuffer, void *>();
-        }
-        ANGLE_CAPTURE(MapBuffer, isCallValid, context, targetPacked, access, returnValue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::MapBuffer, void *>();
-    }
-    return returnValue;
-}
-
-GLboolean GL_APIENTRY UnmapBuffer(GLenum target)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::UnmapBuffer, "glUnmapBuffer", "context = %d, target = %s",
-          CID(context), GLenumToString(GLenumGroup::BufferTargetARB, target));
-
-    GLboolean returnValue;
-    if (context)
-    {
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateUnmapBuffer(context, targetPacked));
-        if (isCallValid)
-        {
-            returnValue = context->unmapBuffer(targetPacked);
-        }
-        else
-        {
-            returnValue = GetDefaultReturnValue<EntryPoint::UnmapBuffer, GLboolean>();
-        }
-        ANGLE_CAPTURE(UnmapBuffer, isCallValid, context, targetPacked, returnValue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::UnmapBuffer, GLboolean>();
-    }
-    return returnValue;
-}
-}  // namespace gl
diff --git a/src/libGL/entry_points_gl_1_5_autogen.h b/src/libGL/entry_points_gl_1_5_autogen.h
deleted file mode 100644
index b99ea84..0000000
--- a/src/libGL/entry_points_gl_1_5_autogen.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// entry_points_gl_1_5_autogen.h:
-//   Defines the GL 1.5 entry points.
-
-#ifndef LIBGL_ENTRY_POINTS_GL_1_5_AUTOGEN_H_
-#define LIBGL_ENTRY_POINTS_GL_1_5_AUTOGEN_H_
-
-#include <export.h>
-#include "angle_gl.h"
-
-namespace gl
-{
-ANGLE_EXPORT void GL_APIENTRY BeginQuery(GLenum target, GLuint id);
-ANGLE_EXPORT void GL_APIENTRY BindBuffer(GLenum target, GLuint buffer);
-ANGLE_EXPORT void GL_APIENTRY BufferData(GLenum target,
-                                         GLsizeiptr size,
-                                         const void *data,
-                                         GLenum usage);
-ANGLE_EXPORT void GL_APIENTRY BufferSubData(GLenum target,
-                                            GLintptr offset,
-                                            GLsizeiptr size,
-                                            const void *data);
-ANGLE_EXPORT void GL_APIENTRY DeleteBuffers(GLsizei n, const GLuint *buffers);
-ANGLE_EXPORT void GL_APIENTRY DeleteQueries(GLsizei n, const GLuint *ids);
-ANGLE_EXPORT void GL_APIENTRY EndQuery(GLenum target);
-ANGLE_EXPORT void GL_APIENTRY GenBuffers(GLsizei n, GLuint *buffers);
-ANGLE_EXPORT void GL_APIENTRY GenQueries(GLsizei n, GLuint *ids);
-ANGLE_EXPORT void GL_APIENTRY GetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
-ANGLE_EXPORT void GL_APIENTRY GetBufferPointerv(GLenum target, GLenum pname, void **params);
-ANGLE_EXPORT void GL_APIENTRY GetBufferSubData(GLenum target,
-                                               GLintptr offset,
-                                               GLsizeiptr size,
-                                               void *data);
-ANGLE_EXPORT void GL_APIENTRY GetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
-ANGLE_EXPORT void GL_APIENTRY GetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
-ANGLE_EXPORT void GL_APIENTRY GetQueryiv(GLenum target, GLenum pname, GLint *params);
-ANGLE_EXPORT GLboolean GL_APIENTRY IsBuffer(GLuint buffer);
-ANGLE_EXPORT GLboolean GL_APIENTRY IsQuery(GLuint id);
-ANGLE_EXPORT void *GL_APIENTRY MapBuffer(GLenum target, GLenum access);
-ANGLE_EXPORT GLboolean GL_APIENTRY UnmapBuffer(GLenum target);
-}  // namespace gl
-
-#endif  // LIBGL_ENTRY_POINTS_GL_1_5_AUTOGEN_H_
diff --git a/src/libGL/entry_points_gl_1_autogen.cpp b/src/libGL/entry_points_gl_1_autogen.cpp
new file mode 100644
index 0000000..58fe7c4
--- /dev/null
+++ b/src/libGL/entry_points_gl_1_autogen.cpp
@@ -0,0 +1,10659 @@
+// GENERATED FILE - DO NOT EDIT.
+// Generated by generate_entry_points.py using data from gl.xml.
+//
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// entry_points_gl_1_autogen.cpp:
+//   Defines the Desktop GL 1.x entry points.
+
+#include "libGL/entry_points_gl_1_autogen.h"
+
+#include "libANGLE/Context.h"
+#include "libANGLE/Context.inl.h"
+#include "libANGLE/entry_points_utils.h"
+#include "libANGLE/gl_enum_utils.h"
+#include "libANGLE/validationEGL.h"
+#include "libANGLE/validationES.h"
+#include "libANGLE/validationES1.h"
+#include "libANGLE/validationES2.h"
+#include "libANGLE/validationES3.h"
+#include "libANGLE/validationES31.h"
+#include "libANGLE/validationES32.h"
+#include "libANGLE/validationESEXT.h"
+#include "libANGLE/validationGL1_autogen.h"
+#include "libGLESv2/global_state.h"
+
+namespace gl
+{
+
+// GL 1.0
+void GL_APIENTRY Accum(GLenum op, GLfloat value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLAccum, "context = %d, op = %s, value = %f", CID(context),
+          GLenumToString(GLenumGroup::AccumOp, op), value);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateAccum(context, op, value));
+        if (isCallValid)
+        {
+            context->accum(op, value);
+        }
+        ANGLE_CAPTURE(Accum, isCallValid, context, op, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY AlphaFunc(GLenum func, GLfloat ref)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLAlphaFunc, "context = %d, func = %s, ref = %f", CID(context),
+          GLenumToString(GLenumGroup::AlphaFunction, func), ref);
+
+    if (context)
+    {
+        AlphaTestFunc funcPacked                              = PackParam<AlphaTestFunc>(func);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateAlphaFunc(context, funcPacked, ref));
+        if (isCallValid)
+        {
+            context->alphaFunc(funcPacked, ref);
+        }
+        ANGLE_CAPTURE(AlphaFunc, isCallValid, context, funcPacked, ref);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Begin(GLenum mode)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLBegin, "context = %d, mode = %s", CID(context),
+          GLenumToString(GLenumGroup::PrimitiveType, mode));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateBegin(context, mode));
+        if (isCallValid)
+        {
+            context->begin(mode);
+        }
+        ANGLE_CAPTURE(Begin, isCallValid, context, mode);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Bitmap(GLsizei width,
+                        GLsizei height,
+                        GLfloat xorig,
+                        GLfloat yorig,
+                        GLfloat xmove,
+                        GLfloat ymove,
+                        const GLubyte *bitmap)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLBitmap,
+          "context = %d, width = %d, height = %d, xorig = %f, yorig = %f, xmove = %f, ymove = %f, "
+          "bitmap = 0x%016" PRIxPTR "",
+          CID(context), width, height, xorig, yorig, xmove, ymove, (uintptr_t)bitmap);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateBitmap(context, width, height, xorig, yorig, xmove, ymove, bitmap));
+        if (isCallValid)
+        {
+            context->bitmap(width, height, xorig, yorig, xmove, ymove, bitmap);
+        }
+        ANGLE_CAPTURE(Bitmap, isCallValid, context, width, height, xorig, yorig, xmove, ymove,
+                      bitmap);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY BlendFunc(GLenum sfactor, GLenum dfactor)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLBlendFunc, "context = %d, sfactor = %s, dfactor = %s", CID(context),
+          GLenumToString(GLenumGroup::BlendingFactor, sfactor),
+          GLenumToString(GLenumGroup::BlendingFactor, dfactor));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateBlendFunc(context, sfactor, dfactor));
+        if (isCallValid)
+        {
+            context->blendFunc(sfactor, dfactor);
+        }
+        ANGLE_CAPTURE(BlendFunc, isCallValid, context, sfactor, dfactor);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY CallList(GLuint list)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLCallList, "context = %d, list = %u", CID(context), list);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateCallList(context, list));
+        if (isCallValid)
+        {
+            context->callList(list);
+        }
+        ANGLE_CAPTURE(CallList, isCallValid, context, list);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY CallLists(GLsizei n, GLenum type, const void *lists)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLCallLists, "context = %d, n = %d, type = %s, lists = 0x%016" PRIxPTR "",
+          CID(context), n, GLenumToString(GLenumGroup::ListNameType, type), (uintptr_t)lists);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateCallLists(context, n, type, lists));
+        if (isCallValid)
+        {
+            context->callLists(n, type, lists);
+        }
+        ANGLE_CAPTURE(CallLists, isCallValid, context, n, type, lists);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Clear(GLbitfield mask)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLClear, "context = %d, mask = %s", CID(context),
+          GLbitfieldToString(GLenumGroup::ClearBufferMask, mask).c_str());
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateClear(context, mask));
+        if (isCallValid)
+        {
+            context->clear(mask);
+        }
+        ANGLE_CAPTURE(Clear, isCallValid, context, mask);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLClearAccum, "context = %d, red = %f, green = %f, blue = %f, alpha = %f",
+          CID(context), red, green, blue, alpha);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateClearAccum(context, red, green, blue, alpha));
+        if (isCallValid)
+        {
+            context->clearAccum(red, green, blue, alpha);
+        }
+        ANGLE_CAPTURE(ClearAccum, isCallValid, context, red, green, blue, alpha);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLClearColor, "context = %d, red = %f, green = %f, blue = %f, alpha = %f",
+          CID(context), red, green, blue, alpha);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateClearColor(context, red, green, blue, alpha));
+        if (isCallValid)
+        {
+            context->clearColor(red, green, blue, alpha);
+        }
+        ANGLE_CAPTURE(ClearColor, isCallValid, context, red, green, blue, alpha);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ClearDepth(GLdouble depth)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLClearDepth, "context = %d, depth = %f", CID(context), depth);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateClearDepth(context, depth));
+        if (isCallValid)
+        {
+            context->clearDepth(depth);
+        }
+        ANGLE_CAPTURE(ClearDepth, isCallValid, context, depth);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ClearIndex(GLfloat c)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLClearIndex, "context = %d, c = %f", CID(context), c);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateClearIndex(context, c));
+        if (isCallValid)
+        {
+            context->clearIndex(c);
+        }
+        ANGLE_CAPTURE(ClearIndex, isCallValid, context, c);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ClearStencil(GLint s)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLClearStencil, "context = %d, s = %d", CID(context), s);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateClearStencil(context, s));
+        if (isCallValid)
+        {
+            context->clearStencil(s);
+        }
+        ANGLE_CAPTURE(ClearStencil, isCallValid, context, s);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ClipPlane(GLenum plane, const GLdouble *equation)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLClipPlane, "context = %d, plane = %s, equation = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::ClipPlaneName, plane), (uintptr_t)equation);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateClipPlane(context, plane, equation));
+        if (isCallValid)
+        {
+            context->clipPlane(plane, equation);
+        }
+        ANGLE_CAPTURE(ClipPlane, isCallValid, context, plane, equation);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Color3b(GLbyte red, GLbyte green, GLbyte blue)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColor3b, "context = %d, red = %d, green = %d, blue = %d", CID(context), red,
+          green, blue);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateColor3b(context, red, green, blue));
+        if (isCallValid)
+        {
+            context->color3b(red, green, blue);
+        }
+        ANGLE_CAPTURE(Color3b, isCallValid, context, red, green, blue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Color3bv(const GLbyte *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColor3bv, "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateColor3bv(context, v));
+        if (isCallValid)
+        {
+            context->color3bv(v);
+        }
+        ANGLE_CAPTURE(Color3bv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Color3d(GLdouble red, GLdouble green, GLdouble blue)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColor3d, "context = %d, red = %f, green = %f, blue = %f", CID(context), red,
+          green, blue);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateColor3d(context, red, green, blue));
+        if (isCallValid)
+        {
+            context->color3d(red, green, blue);
+        }
+        ANGLE_CAPTURE(Color3d, isCallValid, context, red, green, blue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Color3dv(const GLdouble *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColor3dv, "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateColor3dv(context, v));
+        if (isCallValid)
+        {
+            context->color3dv(v);
+        }
+        ANGLE_CAPTURE(Color3dv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Color3f(GLfloat red, GLfloat green, GLfloat blue)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColor3f, "context = %d, red = %f, green = %f, blue = %f", CID(context), red,
+          green, blue);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateColor3f(context, red, green, blue));
+        if (isCallValid)
+        {
+            context->color3f(red, green, blue);
+        }
+        ANGLE_CAPTURE(Color3f, isCallValid, context, red, green, blue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Color3fv(const GLfloat *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColor3fv, "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateColor3fv(context, v));
+        if (isCallValid)
+        {
+            context->color3fv(v);
+        }
+        ANGLE_CAPTURE(Color3fv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Color3i(GLint red, GLint green, GLint blue)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColor3i, "context = %d, red = %d, green = %d, blue = %d", CID(context), red,
+          green, blue);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateColor3i(context, red, green, blue));
+        if (isCallValid)
+        {
+            context->color3i(red, green, blue);
+        }
+        ANGLE_CAPTURE(Color3i, isCallValid, context, red, green, blue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Color3iv(const GLint *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColor3iv, "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateColor3iv(context, v));
+        if (isCallValid)
+        {
+            context->color3iv(v);
+        }
+        ANGLE_CAPTURE(Color3iv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Color3s(GLshort red, GLshort green, GLshort blue)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColor3s, "context = %d, red = %d, green = %d, blue = %d", CID(context), red,
+          green, blue);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateColor3s(context, red, green, blue));
+        if (isCallValid)
+        {
+            context->color3s(red, green, blue);
+        }
+        ANGLE_CAPTURE(Color3s, isCallValid, context, red, green, blue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Color3sv(const GLshort *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColor3sv, "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateColor3sv(context, v));
+        if (isCallValid)
+        {
+            context->color3sv(v);
+        }
+        ANGLE_CAPTURE(Color3sv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Color3ub(GLubyte red, GLubyte green, GLubyte blue)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColor3ub, "context = %d, red = %d, green = %d, blue = %d", CID(context), red,
+          green, blue);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateColor3ub(context, red, green, blue));
+        if (isCallValid)
+        {
+            context->color3ub(red, green, blue);
+        }
+        ANGLE_CAPTURE(Color3ub, isCallValid, context, red, green, blue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Color3ubv(const GLubyte *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColor3ubv, "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateColor3ubv(context, v));
+        if (isCallValid)
+        {
+            context->color3ubv(v);
+        }
+        ANGLE_CAPTURE(Color3ubv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Color3ui(GLuint red, GLuint green, GLuint blue)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColor3ui, "context = %d, red = %u, green = %u, blue = %u", CID(context), red,
+          green, blue);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateColor3ui(context, red, green, blue));
+        if (isCallValid)
+        {
+            context->color3ui(red, green, blue);
+        }
+        ANGLE_CAPTURE(Color3ui, isCallValid, context, red, green, blue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Color3uiv(const GLuint *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColor3uiv, "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateColor3uiv(context, v));
+        if (isCallValid)
+        {
+            context->color3uiv(v);
+        }
+        ANGLE_CAPTURE(Color3uiv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Color3us(GLushort red, GLushort green, GLushort blue)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColor3us, "context = %d, red = %u, green = %u, blue = %u", CID(context), red,
+          green, blue);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateColor3us(context, red, green, blue));
+        if (isCallValid)
+        {
+            context->color3us(red, green, blue);
+        }
+        ANGLE_CAPTURE(Color3us, isCallValid, context, red, green, blue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Color3usv(const GLushort *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColor3usv, "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateColor3usv(context, v));
+        if (isCallValid)
+        {
+            context->color3usv(v);
+        }
+        ANGLE_CAPTURE(Color3usv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Color4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColor4b, "context = %d, red = %d, green = %d, blue = %d, alpha = %d",
+          CID(context), red, green, blue, alpha);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateColor4b(context, red, green, blue, alpha));
+        if (isCallValid)
+        {
+            context->color4b(red, green, blue, alpha);
+        }
+        ANGLE_CAPTURE(Color4b, isCallValid, context, red, green, blue, alpha);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Color4bv(const GLbyte *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColor4bv, "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateColor4bv(context, v));
+        if (isCallValid)
+        {
+            context->color4bv(v);
+        }
+        ANGLE_CAPTURE(Color4bv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Color4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColor4d, "context = %d, red = %f, green = %f, blue = %f, alpha = %f",
+          CID(context), red, green, blue, alpha);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateColor4d(context, red, green, blue, alpha));
+        if (isCallValid)
+        {
+            context->color4d(red, green, blue, alpha);
+        }
+        ANGLE_CAPTURE(Color4d, isCallValid, context, red, green, blue, alpha);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Color4dv(const GLdouble *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColor4dv, "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateColor4dv(context, v));
+        if (isCallValid)
+        {
+            context->color4dv(v);
+        }
+        ANGLE_CAPTURE(Color4dv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Color4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColor4f, "context = %d, red = %f, green = %f, blue = %f, alpha = %f",
+          CID(context), red, green, blue, alpha);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateColor4f(context, red, green, blue, alpha));
+        if (isCallValid)
+        {
+            context->color4f(red, green, blue, alpha);
+        }
+        ANGLE_CAPTURE(Color4f, isCallValid, context, red, green, blue, alpha);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Color4fv(const GLfloat *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColor4fv, "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateColor4fv(context, v));
+        if (isCallValid)
+        {
+            context->color4fv(v);
+        }
+        ANGLE_CAPTURE(Color4fv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Color4i(GLint red, GLint green, GLint blue, GLint alpha)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColor4i, "context = %d, red = %d, green = %d, blue = %d, alpha = %d",
+          CID(context), red, green, blue, alpha);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateColor4i(context, red, green, blue, alpha));
+        if (isCallValid)
+        {
+            context->color4i(red, green, blue, alpha);
+        }
+        ANGLE_CAPTURE(Color4i, isCallValid, context, red, green, blue, alpha);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Color4iv(const GLint *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColor4iv, "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateColor4iv(context, v));
+        if (isCallValid)
+        {
+            context->color4iv(v);
+        }
+        ANGLE_CAPTURE(Color4iv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Color4s(GLshort red, GLshort green, GLshort blue, GLshort alpha)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColor4s, "context = %d, red = %d, green = %d, blue = %d, alpha = %d",
+          CID(context), red, green, blue, alpha);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateColor4s(context, red, green, blue, alpha));
+        if (isCallValid)
+        {
+            context->color4s(red, green, blue, alpha);
+        }
+        ANGLE_CAPTURE(Color4s, isCallValid, context, red, green, blue, alpha);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Color4sv(const GLshort *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColor4sv, "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateColor4sv(context, v));
+        if (isCallValid)
+        {
+            context->color4sv(v);
+        }
+        ANGLE_CAPTURE(Color4sv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Color4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColor4ub, "context = %d, red = %d, green = %d, blue = %d, alpha = %d",
+          CID(context), red, green, blue, alpha);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateColor4ub(context, red, green, blue, alpha));
+        if (isCallValid)
+        {
+            context->color4ub(red, green, blue, alpha);
+        }
+        ANGLE_CAPTURE(Color4ub, isCallValid, context, red, green, blue, alpha);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Color4ubv(const GLubyte *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColor4ubv, "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateColor4ubv(context, v));
+        if (isCallValid)
+        {
+            context->color4ubv(v);
+        }
+        ANGLE_CAPTURE(Color4ubv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Color4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColor4ui, "context = %d, red = %u, green = %u, blue = %u, alpha = %u",
+          CID(context), red, green, blue, alpha);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateColor4ui(context, red, green, blue, alpha));
+        if (isCallValid)
+        {
+            context->color4ui(red, green, blue, alpha);
+        }
+        ANGLE_CAPTURE(Color4ui, isCallValid, context, red, green, blue, alpha);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Color4uiv(const GLuint *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColor4uiv, "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateColor4uiv(context, v));
+        if (isCallValid)
+        {
+            context->color4uiv(v);
+        }
+        ANGLE_CAPTURE(Color4uiv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Color4us(GLushort red, GLushort green, GLushort blue, GLushort alpha)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColor4us, "context = %d, red = %u, green = %u, blue = %u, alpha = %u",
+          CID(context), red, green, blue, alpha);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateColor4us(context, red, green, blue, alpha));
+        if (isCallValid)
+        {
+            context->color4us(red, green, blue, alpha);
+        }
+        ANGLE_CAPTURE(Color4us, isCallValid, context, red, green, blue, alpha);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Color4usv(const GLushort *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColor4usv, "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateColor4usv(context, v));
+        if (isCallValid)
+        {
+            context->color4usv(v);
+        }
+        ANGLE_CAPTURE(Color4usv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColorMask, "context = %d, red = %s, green = %s, blue = %s, alpha = %s",
+          CID(context), GLbooleanToString(red), GLbooleanToString(green), GLbooleanToString(blue),
+          GLbooleanToString(alpha));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateColorMask(context, red, green, blue, alpha));
+        if (isCallValid)
+        {
+            context->colorMask(red, green, blue, alpha);
+        }
+        ANGLE_CAPTURE(ColorMask, isCallValid, context, red, green, blue, alpha);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ColorMaterial(GLenum face, GLenum mode)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColorMaterial, "context = %d, face = %s, mode = %s", CID(context),
+          GLenumToString(GLenumGroup::MaterialFace, face),
+          GLenumToString(GLenumGroup::ColorMaterialParameter, mode));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateColorMaterial(context, face, mode));
+        if (isCallValid)
+        {
+            context->colorMaterial(face, mode);
+        }
+        ANGLE_CAPTURE(ColorMaterial, isCallValid, context, face, mode);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY CopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLCopyPixels, "context = %d, x = %d, y = %d, width = %d, height = %d, type = %s",
+          CID(context), x, y, width, height, GLenumToString(GLenumGroup::PixelCopyType, type));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateCopyPixels(context, x, y, width, height, type));
+        if (isCallValid)
+        {
+            context->copyPixels(x, y, width, height, type);
+        }
+        ANGLE_CAPTURE(CopyPixels, isCallValid, context, x, y, width, height, type);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY CullFace(GLenum mode)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLCullFace, "context = %d, mode = %s", CID(context),
+          GLenumToString(GLenumGroup::CullFaceMode, mode));
+
+    if (context)
+    {
+        CullFaceMode modePacked                               = PackParam<CullFaceMode>(mode);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateCullFace(context, modePacked));
+        if (isCallValid)
+        {
+            context->cullFace(modePacked);
+        }
+        ANGLE_CAPTURE(CullFace, isCallValid, context, modePacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DeleteLists(GLuint list, GLsizei range)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDeleteLists, "context = %d, list = %u, range = %d", CID(context), list, range);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateDeleteLists(context, list, range));
+        if (isCallValid)
+        {
+            context->deleteLists(list, range);
+        }
+        ANGLE_CAPTURE(DeleteLists, isCallValid, context, list, range);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DepthFunc(GLenum func)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDepthFunc, "context = %d, func = %s", CID(context),
+          GLenumToString(GLenumGroup::DepthFunction, func));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateDepthFunc(context, func));
+        if (isCallValid)
+        {
+            context->depthFunc(func);
+        }
+        ANGLE_CAPTURE(DepthFunc, isCallValid, context, func);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DepthMask(GLboolean flag)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDepthMask, "context = %d, flag = %s", CID(context), GLbooleanToString(flag));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateDepthMask(context, flag));
+        if (isCallValid)
+        {
+            context->depthMask(flag);
+        }
+        ANGLE_CAPTURE(DepthMask, isCallValid, context, flag);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DepthRange(GLdouble n, GLdouble f)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDepthRange, "context = %d, n = %f, f = %f", CID(context), n, f);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateDepthRange(context, n, f));
+        if (isCallValid)
+        {
+            context->depthRange(n, f);
+        }
+        ANGLE_CAPTURE(DepthRange, isCallValid, context, n, f);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Disable(GLenum cap)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDisable, "context = %d, cap = %s", CID(context),
+          GLenumToString(GLenumGroup::EnableCap, cap));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateDisable(context, cap));
+        if (isCallValid)
+        {
+            context->disable(cap);
+        }
+        ANGLE_CAPTURE(Disable, isCallValid, context, cap);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DrawBuffer(GLenum buf)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDrawBuffer, "context = %d, buf = %s", CID(context),
+          GLenumToString(GLenumGroup::DrawBufferMode, buf));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateDrawBuffer(context, buf));
+        if (isCallValid)
+        {
+            context->drawBuffer(buf);
+        }
+        ANGLE_CAPTURE(DrawBuffer, isCallValid, context, buf);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY
+DrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDrawPixels,
+          "context = %d, width = %d, height = %d, format = %s, type = %s, pixels = 0x%016" PRIxPTR
+          "",
+          CID(context), width, height, GLenumToString(GLenumGroup::PixelFormat, format),
+          GLenumToString(GLenumGroup::PixelType, type), (uintptr_t)pixels);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateDrawPixels(context, width, height, format, type, pixels));
+        if (isCallValid)
+        {
+            context->drawPixels(width, height, format, type, pixels);
+        }
+        ANGLE_CAPTURE(DrawPixels, isCallValid, context, width, height, format, type, pixels);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY EdgeFlag(GLboolean flag)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLEdgeFlag, "context = %d, flag = %s", CID(context), GLbooleanToString(flag));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateEdgeFlag(context, flag));
+        if (isCallValid)
+        {
+            context->edgeFlag(flag);
+        }
+        ANGLE_CAPTURE(EdgeFlag, isCallValid, context, flag);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY EdgeFlagv(const GLboolean *flag)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLEdgeFlagv, "context = %d, flag = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)flag);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateEdgeFlagv(context, flag));
+        if (isCallValid)
+        {
+            context->edgeFlagv(flag);
+        }
+        ANGLE_CAPTURE(EdgeFlagv, isCallValid, context, flag);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Enable(GLenum cap)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLEnable, "context = %d, cap = %s", CID(context),
+          GLenumToString(GLenumGroup::EnableCap, cap));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateEnable(context, cap));
+        if (isCallValid)
+        {
+            context->enable(cap);
+        }
+        ANGLE_CAPTURE(Enable, isCallValid, context, cap);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY End()
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLEnd, "context = %d", CID(context));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateEnd(context));
+        if (isCallValid)
+        {
+            context->end();
+        }
+        ANGLE_CAPTURE(End, isCallValid, context);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY EndList()
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLEndList, "context = %d", CID(context));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateEndList(context));
+        if (isCallValid)
+        {
+            context->endList();
+        }
+        ANGLE_CAPTURE(EndList, isCallValid, context);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY EvalCoord1d(GLdouble u)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLEvalCoord1d, "context = %d, u = %f", CID(context), u);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateEvalCoord1d(context, u));
+        if (isCallValid)
+        {
+            context->evalCoord1d(u);
+        }
+        ANGLE_CAPTURE(EvalCoord1d, isCallValid, context, u);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY EvalCoord1dv(const GLdouble *u)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLEvalCoord1dv, "context = %d, u = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)u);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateEvalCoord1dv(context, u));
+        if (isCallValid)
+        {
+            context->evalCoord1dv(u);
+        }
+        ANGLE_CAPTURE(EvalCoord1dv, isCallValid, context, u);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY EvalCoord1f(GLfloat u)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLEvalCoord1f, "context = %d, u = %f", CID(context), u);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateEvalCoord1f(context, u));
+        if (isCallValid)
+        {
+            context->evalCoord1f(u);
+        }
+        ANGLE_CAPTURE(EvalCoord1f, isCallValid, context, u);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY EvalCoord1fv(const GLfloat *u)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLEvalCoord1fv, "context = %d, u = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)u);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateEvalCoord1fv(context, u));
+        if (isCallValid)
+        {
+            context->evalCoord1fv(u);
+        }
+        ANGLE_CAPTURE(EvalCoord1fv, isCallValid, context, u);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY EvalCoord2d(GLdouble u, GLdouble v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLEvalCoord2d, "context = %d, u = %f, v = %f", CID(context), u, v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateEvalCoord2d(context, u, v));
+        if (isCallValid)
+        {
+            context->evalCoord2d(u, v);
+        }
+        ANGLE_CAPTURE(EvalCoord2d, isCallValid, context, u, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY EvalCoord2dv(const GLdouble *u)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLEvalCoord2dv, "context = %d, u = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)u);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateEvalCoord2dv(context, u));
+        if (isCallValid)
+        {
+            context->evalCoord2dv(u);
+        }
+        ANGLE_CAPTURE(EvalCoord2dv, isCallValid, context, u);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY EvalCoord2f(GLfloat u, GLfloat v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLEvalCoord2f, "context = %d, u = %f, v = %f", CID(context), u, v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateEvalCoord2f(context, u, v));
+        if (isCallValid)
+        {
+            context->evalCoord2f(u, v);
+        }
+        ANGLE_CAPTURE(EvalCoord2f, isCallValid, context, u, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY EvalCoord2fv(const GLfloat *u)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLEvalCoord2fv, "context = %d, u = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)u);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateEvalCoord2fv(context, u));
+        if (isCallValid)
+        {
+            context->evalCoord2fv(u);
+        }
+        ANGLE_CAPTURE(EvalCoord2fv, isCallValid, context, u);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY EvalMesh1(GLenum mode, GLint i1, GLint i2)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLEvalMesh1, "context = %d, mode = %s, i1 = %d, i2 = %d", CID(context),
+          GLenumToString(GLenumGroup::MeshMode1, mode), i1, i2);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateEvalMesh1(context, mode, i1, i2));
+        if (isCallValid)
+        {
+            context->evalMesh1(mode, i1, i2);
+        }
+        ANGLE_CAPTURE(EvalMesh1, isCallValid, context, mode, i1, i2);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY EvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLEvalMesh2, "context = %d, mode = %s, i1 = %d, i2 = %d, j1 = %d, j2 = %d",
+          CID(context), GLenumToString(GLenumGroup::MeshMode2, mode), i1, i2, j1, j2);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateEvalMesh2(context, mode, i1, i2, j1, j2));
+        if (isCallValid)
+        {
+            context->evalMesh2(mode, i1, i2, j1, j2);
+        }
+        ANGLE_CAPTURE(EvalMesh2, isCallValid, context, mode, i1, i2, j1, j2);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY EvalPoint1(GLint i)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLEvalPoint1, "context = %d, i = %d", CID(context), i);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateEvalPoint1(context, i));
+        if (isCallValid)
+        {
+            context->evalPoint1(i);
+        }
+        ANGLE_CAPTURE(EvalPoint1, isCallValid, context, i);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY EvalPoint2(GLint i, GLint j)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLEvalPoint2, "context = %d, i = %d, j = %d", CID(context), i, j);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateEvalPoint2(context, i, j));
+        if (isCallValid)
+        {
+            context->evalPoint2(i, j);
+        }
+        ANGLE_CAPTURE(EvalPoint2, isCallValid, context, i, j);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY FeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLFeedbackBuffer,
+          "context = %d, size = %d, type = %s, buffer = 0x%016" PRIxPTR "", CID(context), size,
+          GLenumToString(GLenumGroup::FeedbackType, type), (uintptr_t)buffer);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateFeedbackBuffer(context, size, type, buffer));
+        if (isCallValid)
+        {
+            context->feedbackBuffer(size, type, buffer);
+        }
+        ANGLE_CAPTURE(FeedbackBuffer, isCallValid, context, size, type, buffer);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Finish()
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLFinish, "context = %d", CID(context));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateFinish(context));
+        if (isCallValid)
+        {
+            context->finish();
+        }
+        ANGLE_CAPTURE(Finish, isCallValid, context);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Flush()
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLFlush, "context = %d", CID(context));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateFlush(context));
+        if (isCallValid)
+        {
+            context->flush();
+        }
+        ANGLE_CAPTURE(Flush, isCallValid, context);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Fogf(GLenum pname, GLfloat param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLFogf, "context = %d, pname = %s, param = %f", CID(context),
+          GLenumToString(GLenumGroup::FogParameter, pname), param);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateFogf(context, pname, param));
+        if (isCallValid)
+        {
+            context->fogf(pname, param);
+        }
+        ANGLE_CAPTURE(Fogf, isCallValid, context, pname, param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Fogfv(GLenum pname, const GLfloat *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLFogfv, "context = %d, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::FogParameter, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateFogfv(context, pname, params));
+        if (isCallValid)
+        {
+            context->fogfv(pname, params);
+        }
+        ANGLE_CAPTURE(Fogfv, isCallValid, context, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Fogi(GLenum pname, GLint param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLFogi, "context = %d, pname = %s, param = %d", CID(context),
+          GLenumToString(GLenumGroup::FogParameter, pname), param);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateFogi(context, pname, param));
+        if (isCallValid)
+        {
+            context->fogi(pname, param);
+        }
+        ANGLE_CAPTURE(Fogi, isCallValid, context, pname, param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Fogiv(GLenum pname, const GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLFogiv, "context = %d, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::FogParameter, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateFogiv(context, pname, params));
+        if (isCallValid)
+        {
+            context->fogiv(pname, params);
+        }
+        ANGLE_CAPTURE(Fogiv, isCallValid, context, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY FrontFace(GLenum mode)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLFrontFace, "context = %d, mode = %s", CID(context),
+          GLenumToString(GLenumGroup::FrontFaceDirection, mode));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateFrontFace(context, mode));
+        if (isCallValid)
+        {
+            context->frontFace(mode);
+        }
+        ANGLE_CAPTURE(FrontFace, isCallValid, context, mode);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY
+Frustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLFrustum,
+          "context = %d, left = %f, right = %f, bottom = %f, top = %f, zNear = %f, zFar = %f",
+          CID(context), left, right, bottom, top, zNear, zFar);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateFrustum(context, left, right, bottom, top, zNear, zFar));
+        if (isCallValid)
+        {
+            context->frustum(left, right, bottom, top, zNear, zFar);
+        }
+        ANGLE_CAPTURE(Frustum, isCallValid, context, left, right, bottom, top, zNear, zFar);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+GLuint GL_APIENTRY GenLists(GLsizei range)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGenLists, "context = %d, range = %d", CID(context), range);
+
+    GLuint returnValue;
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateGenLists(context, range));
+        if (isCallValid)
+        {
+            returnValue = context->genLists(range);
+        }
+        else
+        {
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGenLists, GLuint>();
+        }
+        ANGLE_CAPTURE(GenLists, isCallValid, context, range, returnValue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGenLists, GLuint>();
+    }
+    return returnValue;
+}
+
+void GL_APIENTRY GetBooleanv(GLenum pname, GLboolean *data)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetBooleanv, "context = %d, pname = %s, data = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::GetPName, pname), (uintptr_t)data);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateGetBooleanv(context, pname, data));
+        if (isCallValid)
+        {
+            context->getBooleanv(pname, data);
+        }
+        ANGLE_CAPTURE(GetBooleanv, isCallValid, context, pname, data);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetClipPlane(GLenum plane, GLdouble *equation)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetClipPlane, "context = %d, plane = %s, equation = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::ClipPlaneName, plane), (uintptr_t)equation);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGetClipPlane(context, plane, equation));
+        if (isCallValid)
+        {
+            context->getClipPlane(plane, equation);
+        }
+        ANGLE_CAPTURE(GetClipPlane, isCallValid, context, plane, equation);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetDoublev(GLenum pname, GLdouble *data)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetDoublev, "context = %d, pname = %s, data = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::GetPName, pname), (uintptr_t)data);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateGetDoublev(context, pname, data));
+        if (isCallValid)
+        {
+            context->getDoublev(pname, data);
+        }
+        ANGLE_CAPTURE(GetDoublev, isCallValid, context, pname, data);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+GLenum GL_APIENTRY GetError()
+{
+    Context *context = GetGlobalContext();
+    EVENT(context, GLGetError, "context = %d", CID(context));
+
+    GLenum returnValue;
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateGetError(context));
+        if (isCallValid)
+        {
+            returnValue = context->getError();
+        }
+        else
+        {
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetError, GLenum>();
+        }
+        ANGLE_CAPTURE(GetError, isCallValid, context, returnValue);
+    }
+    else
+    {
+
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetError, GLenum>();
+    }
+    return returnValue;
+}
+
+void GL_APIENTRY GetFloatv(GLenum pname, GLfloat *data)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetFloatv, "context = %d, pname = %s, data = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::GetPName, pname), (uintptr_t)data);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateGetFloatv(context, pname, data));
+        if (isCallValid)
+        {
+            context->getFloatv(pname, data);
+        }
+        ANGLE_CAPTURE(GetFloatv, isCallValid, context, pname, data);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetIntegerv(GLenum pname, GLint *data)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetIntegerv, "context = %d, pname = %s, data = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::GetPName, pname), (uintptr_t)data);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateGetIntegerv(context, pname, data));
+        if (isCallValid)
+        {
+            context->getIntegerv(pname, data);
+        }
+        ANGLE_CAPTURE(GetIntegerv, isCallValid, context, pname, data);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetLightfv(GLenum light, GLenum pname, GLfloat *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetLightfv, "context = %d, light = %s, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::LightName, light),
+          GLenumToString(GLenumGroup::LightParameter, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        LightParameter pnamePacked                            = PackParam<LightParameter>(pname);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGetLightfv(context, light, pnamePacked, params));
+        if (isCallValid)
+        {
+            context->getLightfv(light, pnamePacked, params);
+        }
+        ANGLE_CAPTURE(GetLightfv, isCallValid, context, light, pnamePacked, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetLightiv(GLenum light, GLenum pname, GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetLightiv, "context = %d, light = %s, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::LightName, light),
+          GLenumToString(GLenumGroup::LightParameter, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGetLightiv(context, light, pname, params));
+        if (isCallValid)
+        {
+            context->getLightiv(light, pname, params);
+        }
+        ANGLE_CAPTURE(GetLightiv, isCallValid, context, light, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetMapdv(GLenum target, GLenum query, GLdouble *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetMapdv, "context = %d, target = %s, query = %s, v = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::MapTarget, target),
+          GLenumToString(GLenumGroup::GetMapQuery, query), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGetMapdv(context, target, query, v));
+        if (isCallValid)
+        {
+            context->getMapdv(target, query, v);
+        }
+        ANGLE_CAPTURE(GetMapdv, isCallValid, context, target, query, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetMapfv(GLenum target, GLenum query, GLfloat *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetMapfv, "context = %d, target = %s, query = %s, v = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::MapTarget, target),
+          GLenumToString(GLenumGroup::GetMapQuery, query), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGetMapfv(context, target, query, v));
+        if (isCallValid)
+        {
+            context->getMapfv(target, query, v);
+        }
+        ANGLE_CAPTURE(GetMapfv, isCallValid, context, target, query, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetMapiv(GLenum target, GLenum query, GLint *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetMapiv, "context = %d, target = %s, query = %s, v = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::MapTarget, target),
+          GLenumToString(GLenumGroup::GetMapQuery, query), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGetMapiv(context, target, query, v));
+        if (isCallValid)
+        {
+            context->getMapiv(target, query, v);
+        }
+        ANGLE_CAPTURE(GetMapiv, isCallValid, context, target, query, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetMaterialfv(GLenum face, GLenum pname, GLfloat *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetMaterialfv,
+          "context = %d, face = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::MaterialFace, face),
+          GLenumToString(GLenumGroup::MaterialParameter, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        MaterialParameter pnamePacked                         = PackParam<MaterialParameter>(pname);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetMaterialfv(context, face, pnamePacked, params));
+        if (isCallValid)
+        {
+            context->getMaterialfv(face, pnamePacked, params);
+        }
+        ANGLE_CAPTURE(GetMaterialfv, isCallValid, context, face, pnamePacked, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetMaterialiv(GLenum face, GLenum pname, GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetMaterialiv,
+          "context = %d, face = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::MaterialFace, face),
+          GLenumToString(GLenumGroup::MaterialParameter, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGetMaterialiv(context, face, pname, params));
+        if (isCallValid)
+        {
+            context->getMaterialiv(face, pname, params);
+        }
+        ANGLE_CAPTURE(GetMaterialiv, isCallValid, context, face, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetPixelMapfv(GLenum map, GLfloat *values)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetPixelMapfv, "context = %d, map = %s, values = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::PixelMap, map), (uintptr_t)values);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGetPixelMapfv(context, map, values));
+        if (isCallValid)
+        {
+            context->getPixelMapfv(map, values);
+        }
+        ANGLE_CAPTURE(GetPixelMapfv, isCallValid, context, map, values);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetPixelMapuiv(GLenum map, GLuint *values)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetPixelMapuiv, "context = %d, map = %s, values = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::PixelMap, map), (uintptr_t)values);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGetPixelMapuiv(context, map, values));
+        if (isCallValid)
+        {
+            context->getPixelMapuiv(map, values);
+        }
+        ANGLE_CAPTURE(GetPixelMapuiv, isCallValid, context, map, values);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetPixelMapusv(GLenum map, GLushort *values)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetPixelMapusv, "context = %d, map = %s, values = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::PixelMap, map), (uintptr_t)values);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGetPixelMapusv(context, map, values));
+        if (isCallValid)
+        {
+            context->getPixelMapusv(map, values);
+        }
+        ANGLE_CAPTURE(GetPixelMapusv, isCallValid, context, map, values);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetPolygonStipple(GLubyte *mask)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetPolygonStipple, "context = %d, mask = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)mask);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateGetPolygonStipple(context, mask));
+        if (isCallValid)
+        {
+            context->getPolygonStipple(mask);
+        }
+        ANGLE_CAPTURE(GetPolygonStipple, isCallValid, context, mask);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+const GLubyte *GL_APIENTRY GetString(GLenum name)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetString, "context = %d, name = %s", CID(context),
+          GLenumToString(GLenumGroup::StringName, name));
+
+    const GLubyte *returnValue;
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateGetString(context, name));
+        if (isCallValid)
+        {
+            returnValue = context->getString(name);
+        }
+        else
+        {
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetString, const GLubyte *>();
+        }
+        ANGLE_CAPTURE(GetString, isCallValid, context, name, returnValue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetString, const GLubyte *>();
+    }
+    return returnValue;
+}
+
+void GL_APIENTRY GetTexEnvfv(GLenum target, GLenum pname, GLfloat *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetTexEnvfv,
+          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::TextureEnvTarget, target),
+          GLenumToString(GLenumGroup::TextureEnvParameter, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        TextureEnvTarget targetPacked   = PackParam<TextureEnvTarget>(target);
+        TextureEnvParameter pnamePacked = PackParam<TextureEnvParameter>(pname);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetTexEnvfv(context, targetPacked, pnamePacked, params));
+        if (isCallValid)
+        {
+            context->getTexEnvfv(targetPacked, pnamePacked, params);
+        }
+        ANGLE_CAPTURE(GetTexEnvfv, isCallValid, context, targetPacked, pnamePacked, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetTexEnviv(GLenum target, GLenum pname, GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetTexEnviv,
+          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::TextureEnvTarget, target),
+          GLenumToString(GLenumGroup::TextureEnvParameter, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        TextureEnvTarget targetPacked   = PackParam<TextureEnvTarget>(target);
+        TextureEnvParameter pnamePacked = PackParam<TextureEnvParameter>(pname);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetTexEnviv(context, targetPacked, pnamePacked, params));
+        if (isCallValid)
+        {
+            context->getTexEnviv(targetPacked, pnamePacked, params);
+        }
+        ANGLE_CAPTURE(GetTexEnviv, isCallValid, context, targetPacked, pnamePacked, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetTexGendv(GLenum coord, GLenum pname, GLdouble *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetTexGendv,
+          "context = %d, coord = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::TextureCoordName, coord),
+          GLenumToString(GLenumGroup::TextureGenParameter, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGetTexGendv(context, coord, pname, params));
+        if (isCallValid)
+        {
+            context->getTexGendv(coord, pname, params);
+        }
+        ANGLE_CAPTURE(GetTexGendv, isCallValid, context, coord, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetTexGenfv(GLenum coord, GLenum pname, GLfloat *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetTexGenfv,
+          "context = %d, coord = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::TextureCoordName, coord),
+          GLenumToString(GLenumGroup::TextureGenParameter, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGetTexGenfv(context, coord, pname, params));
+        if (isCallValid)
+        {
+            context->getTexGenfv(coord, pname, params);
+        }
+        ANGLE_CAPTURE(GetTexGenfv, isCallValid, context, coord, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetTexGeniv(GLenum coord, GLenum pname, GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetTexGeniv,
+          "context = %d, coord = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::TextureCoordName, coord),
+          GLenumToString(GLenumGroup::TextureGenParameter, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGetTexGeniv(context, coord, pname, params));
+        if (isCallValid)
+        {
+            context->getTexGeniv(coord, pname, params);
+        }
+        ANGLE_CAPTURE(GetTexGeniv, isCallValid, context, coord, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetTexImage(GLenum target, GLint level, GLenum format, GLenum type, void *pixels)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetTexImage,
+          "context = %d, target = %s, level = %d, format = %s, type = %s, pixels = 0x%016" PRIxPTR
+          "",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level,
+          GLenumToString(GLenumGroup::PixelFormat, format),
+          GLenumToString(GLenumGroup::PixelType, type), (uintptr_t)pixels);
+
+    if (context)
+    {
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetTexImage(context, targetPacked, level, format, type, pixels));
+        if (isCallValid)
+        {
+            context->getTexImage(targetPacked, level, format, type, pixels);
+        }
+        ANGLE_CAPTURE(GetTexImage, isCallValid, context, targetPacked, level, format, type, pixels);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetTexLevelParameterfv,
+          "context = %d, target = %s, level = %d, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level,
+          GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetTexLevelParameterfv(context, targetPacked, level, pname, params));
+        if (isCallValid)
+        {
+            context->getTexLevelParameterfv(targetPacked, level, pname, params);
+        }
+        ANGLE_CAPTURE(GetTexLevelParameterfv, isCallValid, context, targetPacked, level, pname,
+                      params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetTexLevelParameteriv,
+          "context = %d, target = %s, level = %d, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level,
+          GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetTexLevelParameteriv(context, targetPacked, level, pname, params));
+        if (isCallValid)
+        {
+            context->getTexLevelParameteriv(targetPacked, level, pname, params);
+        }
+        ANGLE_CAPTURE(GetTexLevelParameteriv, isCallValid, context, targetPacked, level, pname,
+                      params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetTexParameterfv,
+          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::TextureTarget, target),
+          GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetTexParameterfv(context, targetPacked, pname, params));
+        if (isCallValid)
+        {
+            context->getTexParameterfv(targetPacked, pname, params);
+        }
+        ANGLE_CAPTURE(GetTexParameterfv, isCallValid, context, targetPacked, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetTexParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetTexParameteriv,
+          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::TextureTarget, target),
+          GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetTexParameteriv(context, targetPacked, pname, params));
+        if (isCallValid)
+        {
+            context->getTexParameteriv(targetPacked, pname, params);
+        }
+        ANGLE_CAPTURE(GetTexParameteriv, isCallValid, context, targetPacked, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Hint(GLenum target, GLenum mode)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLHint, "context = %d, target = %s, mode = %s", CID(context),
+          GLenumToString(GLenumGroup::HintTarget, target),
+          GLenumToString(GLenumGroup::HintMode, mode));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateHint(context, target, mode));
+        if (isCallValid)
+        {
+            context->hint(target, mode);
+        }
+        ANGLE_CAPTURE(Hint, isCallValid, context, target, mode);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY IndexMask(GLuint mask)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLIndexMask, "context = %d, mask = %u", CID(context), mask);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateIndexMask(context, mask));
+        if (isCallValid)
+        {
+            context->indexMask(mask);
+        }
+        ANGLE_CAPTURE(IndexMask, isCallValid, context, mask);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Indexd(GLdouble c)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLIndexd, "context = %d, c = %f", CID(context), c);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateIndexd(context, c));
+        if (isCallValid)
+        {
+            context->indexd(c);
+        }
+        ANGLE_CAPTURE(Indexd, isCallValid, context, c);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Indexdv(const GLdouble *c)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLIndexdv, "context = %d, c = 0x%016" PRIxPTR "", CID(context), (uintptr_t)c);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateIndexdv(context, c));
+        if (isCallValid)
+        {
+            context->indexdv(c);
+        }
+        ANGLE_CAPTURE(Indexdv, isCallValid, context, c);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Indexf(GLfloat c)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLIndexf, "context = %d, c = %f", CID(context), c);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateIndexf(context, c));
+        if (isCallValid)
+        {
+            context->indexf(c);
+        }
+        ANGLE_CAPTURE(Indexf, isCallValid, context, c);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Indexfv(const GLfloat *c)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLIndexfv, "context = %d, c = 0x%016" PRIxPTR "", CID(context), (uintptr_t)c);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateIndexfv(context, c));
+        if (isCallValid)
+        {
+            context->indexfv(c);
+        }
+        ANGLE_CAPTURE(Indexfv, isCallValid, context, c);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Indexi(GLint c)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLIndexi, "context = %d, c = %d", CID(context), c);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateIndexi(context, c));
+        if (isCallValid)
+        {
+            context->indexi(c);
+        }
+        ANGLE_CAPTURE(Indexi, isCallValid, context, c);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Indexiv(const GLint *c)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLIndexiv, "context = %d, c = 0x%016" PRIxPTR "", CID(context), (uintptr_t)c);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateIndexiv(context, c));
+        if (isCallValid)
+        {
+            context->indexiv(c);
+        }
+        ANGLE_CAPTURE(Indexiv, isCallValid, context, c);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Indexs(GLshort c)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLIndexs, "context = %d, c = %d", CID(context), c);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateIndexs(context, c));
+        if (isCallValid)
+        {
+            context->indexs(c);
+        }
+        ANGLE_CAPTURE(Indexs, isCallValid, context, c);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Indexsv(const GLshort *c)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLIndexsv, "context = %d, c = 0x%016" PRIxPTR "", CID(context), (uintptr_t)c);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateIndexsv(context, c));
+        if (isCallValid)
+        {
+            context->indexsv(c);
+        }
+        ANGLE_CAPTURE(Indexsv, isCallValid, context, c);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY InitNames()
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLInitNames, "context = %d", CID(context));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateInitNames(context));
+        if (isCallValid)
+        {
+            context->initNames();
+        }
+        ANGLE_CAPTURE(InitNames, isCallValid, context);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+GLboolean GL_APIENTRY IsEnabled(GLenum cap)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLIsEnabled, "context = %d, cap = %s", CID(context),
+          GLenumToString(GLenumGroup::EnableCap, cap));
+
+    GLboolean returnValue;
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateIsEnabled(context, cap));
+        if (isCallValid)
+        {
+            returnValue = context->isEnabled(cap);
+        }
+        else
+        {
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsEnabled, GLboolean>();
+        }
+        ANGLE_CAPTURE(IsEnabled, isCallValid, context, cap, returnValue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsEnabled, GLboolean>();
+    }
+    return returnValue;
+}
+
+GLboolean GL_APIENTRY IsList(GLuint list)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLIsList, "context = %d, list = %u", CID(context), list);
+
+    GLboolean returnValue;
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateIsList(context, list));
+        if (isCallValid)
+        {
+            returnValue = context->isList(list);
+        }
+        else
+        {
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsList, GLboolean>();
+        }
+        ANGLE_CAPTURE(IsList, isCallValid, context, list, returnValue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsList, GLboolean>();
+    }
+    return returnValue;
+}
+
+void GL_APIENTRY LightModelf(GLenum pname, GLfloat param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLLightModelf, "context = %d, pname = %s, param = %f", CID(context),
+          GLenumToString(GLenumGroup::LightModelParameter, pname), param);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateLightModelf(context, pname, param));
+        if (isCallValid)
+        {
+            context->lightModelf(pname, param);
+        }
+        ANGLE_CAPTURE(LightModelf, isCallValid, context, pname, param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY LightModelfv(GLenum pname, const GLfloat *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLLightModelfv, "context = %d, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::LightModelParameter, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateLightModelfv(context, pname, params));
+        if (isCallValid)
+        {
+            context->lightModelfv(pname, params);
+        }
+        ANGLE_CAPTURE(LightModelfv, isCallValid, context, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY LightModeli(GLenum pname, GLint param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLLightModeli, "context = %d, pname = %s, param = %d", CID(context),
+          GLenumToString(GLenumGroup::LightModelParameter, pname), param);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateLightModeli(context, pname, param));
+        if (isCallValid)
+        {
+            context->lightModeli(pname, param);
+        }
+        ANGLE_CAPTURE(LightModeli, isCallValid, context, pname, param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY LightModeliv(GLenum pname, const GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLLightModeliv, "context = %d, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::LightModelParameter, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateLightModeliv(context, pname, params));
+        if (isCallValid)
+        {
+            context->lightModeliv(pname, params);
+        }
+        ANGLE_CAPTURE(LightModeliv, isCallValid, context, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Lightf(GLenum light, GLenum pname, GLfloat param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLLightf, "context = %d, light = %s, pname = %s, param = %f", CID(context),
+          GLenumToString(GLenumGroup::LightName, light),
+          GLenumToString(GLenumGroup::LightParameter, pname), param);
+
+    if (context)
+    {
+        LightParameter pnamePacked                            = PackParam<LightParameter>(pname);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateLightf(context, light, pnamePacked, param));
+        if (isCallValid)
+        {
+            context->lightf(light, pnamePacked, param);
+        }
+        ANGLE_CAPTURE(Lightf, isCallValid, context, light, pnamePacked, param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Lightfv(GLenum light, GLenum pname, const GLfloat *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLLightfv, "context = %d, light = %s, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::LightName, light),
+          GLenumToString(GLenumGroup::LightParameter, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        LightParameter pnamePacked                            = PackParam<LightParameter>(pname);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateLightfv(context, light, pnamePacked, params));
+        if (isCallValid)
+        {
+            context->lightfv(light, pnamePacked, params);
+        }
+        ANGLE_CAPTURE(Lightfv, isCallValid, context, light, pnamePacked, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Lighti(GLenum light, GLenum pname, GLint param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLLighti, "context = %d, light = %s, pname = %s, param = %d", CID(context),
+          GLenumToString(GLenumGroup::LightName, light),
+          GLenumToString(GLenumGroup::LightParameter, pname), param);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateLighti(context, light, pname, param));
+        if (isCallValid)
+        {
+            context->lighti(light, pname, param);
+        }
+        ANGLE_CAPTURE(Lighti, isCallValid, context, light, pname, param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Lightiv(GLenum light, GLenum pname, const GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLLightiv, "context = %d, light = %s, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::LightName, light),
+          GLenumToString(GLenumGroup::LightParameter, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateLightiv(context, light, pname, params));
+        if (isCallValid)
+        {
+            context->lightiv(light, pname, params);
+        }
+        ANGLE_CAPTURE(Lightiv, isCallValid, context, light, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY LineStipple(GLint factor, GLushort pattern)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLLineStipple, "context = %d, factor = %d, pattern = %u", CID(context), factor,
+          pattern);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateLineStipple(context, factor, pattern));
+        if (isCallValid)
+        {
+            context->lineStipple(factor, pattern);
+        }
+        ANGLE_CAPTURE(LineStipple, isCallValid, context, factor, pattern);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY LineWidth(GLfloat width)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLLineWidth, "context = %d, width = %f", CID(context), width);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateLineWidth(context, width));
+        if (isCallValid)
+        {
+            context->lineWidth(width);
+        }
+        ANGLE_CAPTURE(LineWidth, isCallValid, context, width);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ListBase(GLuint base)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLListBase, "context = %d, base = %u", CID(context), base);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateListBase(context, base));
+        if (isCallValid)
+        {
+            context->listBase(base);
+        }
+        ANGLE_CAPTURE(ListBase, isCallValid, context, base);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY LoadIdentity()
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLLoadIdentity, "context = %d", CID(context));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateLoadIdentity(context));
+        if (isCallValid)
+        {
+            context->loadIdentity();
+        }
+        ANGLE_CAPTURE(LoadIdentity, isCallValid, context);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY LoadMatrixd(const GLdouble *m)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLLoadMatrixd, "context = %d, m = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)m);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateLoadMatrixd(context, m));
+        if (isCallValid)
+        {
+            context->loadMatrixd(m);
+        }
+        ANGLE_CAPTURE(LoadMatrixd, isCallValid, context, m);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY LoadMatrixf(const GLfloat *m)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLLoadMatrixf, "context = %d, m = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)m);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateLoadMatrixf(context, m));
+        if (isCallValid)
+        {
+            context->loadMatrixf(m);
+        }
+        ANGLE_CAPTURE(LoadMatrixf, isCallValid, context, m);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY LoadName(GLuint name)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLLoadName, "context = %d, name = %u", CID(context), name);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateLoadName(context, name));
+        if (isCallValid)
+        {
+            context->loadName(name);
+        }
+        ANGLE_CAPTURE(LoadName, isCallValid, context, name);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY LogicOp(GLenum opcode)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLLogicOp, "context = %d, opcode = %s", CID(context),
+          GLenumToString(GLenumGroup::LogicOp, opcode));
+
+    if (context)
+    {
+        LogicalOperation opcodePacked                         = PackParam<LogicalOperation>(opcode);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateLogicOp(context, opcodePacked));
+        if (isCallValid)
+        {
+            context->logicOp(opcodePacked);
+        }
+        ANGLE_CAPTURE(LogicOp, isCallValid, context, opcodePacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY
+Map1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMap1d,
+          "context = %d, target = %s, u1 = %f, u2 = %f, stride = %d, order = %d, points = "
+          "0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::MapTarget, target), u1, u2, stride, order,
+          (uintptr_t)points);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateMap1d(context, target, u1, u2, stride, order, points));
+        if (isCallValid)
+        {
+            context->map1d(target, u1, u2, stride, order, points);
+        }
+        ANGLE_CAPTURE(Map1d, isCallValid, context, target, u1, u2, stride, order, points);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY
+Map1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMap1f,
+          "context = %d, target = %s, u1 = %f, u2 = %f, stride = %d, order = %d, points = "
+          "0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::MapTarget, target), u1, u2, stride, order,
+          (uintptr_t)points);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateMap1f(context, target, u1, u2, stride, order, points));
+        if (isCallValid)
+        {
+            context->map1f(target, u1, u2, stride, order, points);
+        }
+        ANGLE_CAPTURE(Map1f, isCallValid, context, target, u1, u2, stride, order, points);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Map2d(GLenum target,
+                       GLdouble u1,
+                       GLdouble u2,
+                       GLint ustride,
+                       GLint uorder,
+                       GLdouble v1,
+                       GLdouble v2,
+                       GLint vstride,
+                       GLint vorder,
+                       const GLdouble *points)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMap2d,
+          "context = %d, target = %s, u1 = %f, u2 = %f, ustride = %d, uorder = %d, v1 = %f, v2 = "
+          "%f, vstride = %d, vorder = %d, points = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::MapTarget, target), u1, u2, ustride, uorder, v1,
+          v2, vstride, vorder, (uintptr_t)points);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMap2d(context, target, u1, u2, ustride, uorder,
+                                                        v1, v2, vstride, vorder, points));
+        if (isCallValid)
+        {
+            context->map2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
+        }
+        ANGLE_CAPTURE(Map2d, isCallValid, context, target, u1, u2, ustride, uorder, v1, v2, vstride,
+                      vorder, points);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Map2f(GLenum target,
+                       GLfloat u1,
+                       GLfloat u2,
+                       GLint ustride,
+                       GLint uorder,
+                       GLfloat v1,
+                       GLfloat v2,
+                       GLint vstride,
+                       GLint vorder,
+                       const GLfloat *points)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMap2f,
+          "context = %d, target = %s, u1 = %f, u2 = %f, ustride = %d, uorder = %d, v1 = %f, v2 = "
+          "%f, vstride = %d, vorder = %d, points = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::MapTarget, target), u1, u2, ustride, uorder, v1,
+          v2, vstride, vorder, (uintptr_t)points);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMap2f(context, target, u1, u2, ustride, uorder,
+                                                        v1, v2, vstride, vorder, points));
+        if (isCallValid)
+        {
+            context->map2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
+        }
+        ANGLE_CAPTURE(Map2f, isCallValid, context, target, u1, u2, ustride, uorder, v1, v2, vstride,
+                      vorder, points);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MapGrid1d(GLint un, GLdouble u1, GLdouble u2)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMapGrid1d, "context = %d, un = %d, u1 = %f, u2 = %f", CID(context), un, u1,
+          u2);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateMapGrid1d(context, un, u1, u2));
+        if (isCallValid)
+        {
+            context->mapGrid1d(un, u1, u2);
+        }
+        ANGLE_CAPTURE(MapGrid1d, isCallValid, context, un, u1, u2);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MapGrid1f(GLint un, GLfloat u1, GLfloat u2)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMapGrid1f, "context = %d, un = %d, u1 = %f, u2 = %f", CID(context), un, u1,
+          u2);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateMapGrid1f(context, un, u1, u2));
+        if (isCallValid)
+        {
+            context->mapGrid1f(un, u1, u2);
+        }
+        ANGLE_CAPTURE(MapGrid1f, isCallValid, context, un, u1, u2);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMapGrid2d,
+          "context = %d, un = %d, u1 = %f, u2 = %f, vn = %d, v1 = %f, v2 = %f", CID(context), un,
+          u1, u2, vn, v1, v2);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMapGrid2d(context, un, u1, u2, vn, v1, v2));
+        if (isCallValid)
+        {
+            context->mapGrid2d(un, u1, u2, vn, v1, v2);
+        }
+        ANGLE_CAPTURE(MapGrid2d, isCallValid, context, un, u1, u2, vn, v1, v2);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMapGrid2f,
+          "context = %d, un = %d, u1 = %f, u2 = %f, vn = %d, v1 = %f, v2 = %f", CID(context), un,
+          u1, u2, vn, v1, v2);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMapGrid2f(context, un, u1, u2, vn, v1, v2));
+        if (isCallValid)
+        {
+            context->mapGrid2f(un, u1, u2, vn, v1, v2);
+        }
+        ANGLE_CAPTURE(MapGrid2f, isCallValid, context, un, u1, u2, vn, v1, v2);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Materialf(GLenum face, GLenum pname, GLfloat param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMaterialf, "context = %d, face = %s, pname = %s, param = %f", CID(context),
+          GLenumToString(GLenumGroup::MaterialFace, face),
+          GLenumToString(GLenumGroup::MaterialParameter, pname), param);
+
+    if (context)
+    {
+        MaterialParameter pnamePacked                         = PackParam<MaterialParameter>(pname);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMaterialf(context, face, pnamePacked, param));
+        if (isCallValid)
+        {
+            context->materialf(face, pnamePacked, param);
+        }
+        ANGLE_CAPTURE(Materialf, isCallValid, context, face, pnamePacked, param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Materialfv(GLenum face, GLenum pname, const GLfloat *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMaterialfv, "context = %d, face = %s, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::MaterialFace, face),
+          GLenumToString(GLenumGroup::MaterialParameter, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        MaterialParameter pnamePacked                         = PackParam<MaterialParameter>(pname);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMaterialfv(context, face, pnamePacked, params));
+        if (isCallValid)
+        {
+            context->materialfv(face, pnamePacked, params);
+        }
+        ANGLE_CAPTURE(Materialfv, isCallValid, context, face, pnamePacked, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Materiali(GLenum face, GLenum pname, GLint param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMateriali, "context = %d, face = %s, pname = %s, param = %d", CID(context),
+          GLenumToString(GLenumGroup::MaterialFace, face),
+          GLenumToString(GLenumGroup::MaterialParameter, pname), param);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMateriali(context, face, pname, param));
+        if (isCallValid)
+        {
+            context->materiali(face, pname, param);
+        }
+        ANGLE_CAPTURE(Materiali, isCallValid, context, face, pname, param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Materialiv(GLenum face, GLenum pname, const GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMaterialiv, "context = %d, face = %s, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::MaterialFace, face),
+          GLenumToString(GLenumGroup::MaterialParameter, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMaterialiv(context, face, pname, params));
+        if (isCallValid)
+        {
+            context->materialiv(face, pname, params);
+        }
+        ANGLE_CAPTURE(Materialiv, isCallValid, context, face, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MatrixMode(GLenum mode)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMatrixMode, "context = %d, mode = %s", CID(context),
+          GLenumToString(GLenumGroup::MatrixMode, mode));
+
+    if (context)
+    {
+        MatrixType modePacked                                 = PackParam<MatrixType>(mode);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateMatrixMode(context, modePacked));
+        if (isCallValid)
+        {
+            context->matrixMode(modePacked);
+        }
+        ANGLE_CAPTURE(MatrixMode, isCallValid, context, modePacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultMatrixd(const GLdouble *m)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultMatrixd, "context = %d, m = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)m);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateMultMatrixd(context, m));
+        if (isCallValid)
+        {
+            context->multMatrixd(m);
+        }
+        ANGLE_CAPTURE(MultMatrixd, isCallValid, context, m);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultMatrixf(const GLfloat *m)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultMatrixf, "context = %d, m = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)m);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateMultMatrixf(context, m));
+        if (isCallValid)
+        {
+            context->multMatrixf(m);
+        }
+        ANGLE_CAPTURE(MultMatrixf, isCallValid, context, m);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY NewList(GLuint list, GLenum mode)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLNewList, "context = %d, list = %u, mode = %s", CID(context), list,
+          GLenumToString(GLenumGroup::ListMode, mode));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateNewList(context, list, mode));
+        if (isCallValid)
+        {
+            context->newList(list, mode);
+        }
+        ANGLE_CAPTURE(NewList, isCallValid, context, list, mode);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Normal3b(GLbyte nx, GLbyte ny, GLbyte nz)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLNormal3b, "context = %d, nx = %d, ny = %d, nz = %d", CID(context), nx, ny, nz);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateNormal3b(context, nx, ny, nz));
+        if (isCallValid)
+        {
+            context->normal3b(nx, ny, nz);
+        }
+        ANGLE_CAPTURE(Normal3b, isCallValid, context, nx, ny, nz);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Normal3bv(const GLbyte *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLNormal3bv, "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateNormal3bv(context, v));
+        if (isCallValid)
+        {
+            context->normal3bv(v);
+        }
+        ANGLE_CAPTURE(Normal3bv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Normal3d(GLdouble nx, GLdouble ny, GLdouble nz)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLNormal3d, "context = %d, nx = %f, ny = %f, nz = %f", CID(context), nx, ny, nz);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateNormal3d(context, nx, ny, nz));
+        if (isCallValid)
+        {
+            context->normal3d(nx, ny, nz);
+        }
+        ANGLE_CAPTURE(Normal3d, isCallValid, context, nx, ny, nz);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Normal3dv(const GLdouble *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLNormal3dv, "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateNormal3dv(context, v));
+        if (isCallValid)
+        {
+            context->normal3dv(v);
+        }
+        ANGLE_CAPTURE(Normal3dv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Normal3f(GLfloat nx, GLfloat ny, GLfloat nz)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLNormal3f, "context = %d, nx = %f, ny = %f, nz = %f", CID(context), nx, ny, nz);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateNormal3f(context, nx, ny, nz));
+        if (isCallValid)
+        {
+            context->normal3f(nx, ny, nz);
+        }
+        ANGLE_CAPTURE(Normal3f, isCallValid, context, nx, ny, nz);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Normal3fv(const GLfloat *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLNormal3fv, "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateNormal3fv(context, v));
+        if (isCallValid)
+        {
+            context->normal3fv(v);
+        }
+        ANGLE_CAPTURE(Normal3fv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Normal3i(GLint nx, GLint ny, GLint nz)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLNormal3i, "context = %d, nx = %d, ny = %d, nz = %d", CID(context), nx, ny, nz);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateNormal3i(context, nx, ny, nz));
+        if (isCallValid)
+        {
+            context->normal3i(nx, ny, nz);
+        }
+        ANGLE_CAPTURE(Normal3i, isCallValid, context, nx, ny, nz);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Normal3iv(const GLint *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLNormal3iv, "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateNormal3iv(context, v));
+        if (isCallValid)
+        {
+            context->normal3iv(v);
+        }
+        ANGLE_CAPTURE(Normal3iv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Normal3s(GLshort nx, GLshort ny, GLshort nz)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLNormal3s, "context = %d, nx = %d, ny = %d, nz = %d", CID(context), nx, ny, nz);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateNormal3s(context, nx, ny, nz));
+        if (isCallValid)
+        {
+            context->normal3s(nx, ny, nz);
+        }
+        ANGLE_CAPTURE(Normal3s, isCallValid, context, nx, ny, nz);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Normal3sv(const GLshort *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLNormal3sv, "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateNormal3sv(context, v));
+        if (isCallValid)
+        {
+            context->normal3sv(v);
+        }
+        ANGLE_CAPTURE(Normal3sv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY
+Ortho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLOrtho,
+          "context = %d, left = %f, right = %f, bottom = %f, top = %f, zNear = %f, zFar = %f",
+          CID(context), left, right, bottom, top, zNear, zFar);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateOrtho(context, left, right, bottom, top, zNear, zFar));
+        if (isCallValid)
+        {
+            context->ortho(left, right, bottom, top, zNear, zFar);
+        }
+        ANGLE_CAPTURE(Ortho, isCallValid, context, left, right, bottom, top, zNear, zFar);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY PassThrough(GLfloat token)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLPassThrough, "context = %d, token = %f", CID(context), token);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidatePassThrough(context, token));
+        if (isCallValid)
+        {
+            context->passThrough(token);
+        }
+        ANGLE_CAPTURE(PassThrough, isCallValid, context, token);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY PixelMapfv(GLenum map, GLsizei mapsize, const GLfloat *values)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLPixelMapfv, "context = %d, map = %s, mapsize = %d, values = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::PixelMap, map), mapsize, (uintptr_t)values);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidatePixelMapfv(context, map, mapsize, values));
+        if (isCallValid)
+        {
+            context->pixelMapfv(map, mapsize, values);
+        }
+        ANGLE_CAPTURE(PixelMapfv, isCallValid, context, map, mapsize, values);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY PixelMapuiv(GLenum map, GLsizei mapsize, const GLuint *values)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLPixelMapuiv,
+          "context = %d, map = %s, mapsize = %d, values = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::PixelMap, map), mapsize, (uintptr_t)values);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidatePixelMapuiv(context, map, mapsize, values));
+        if (isCallValid)
+        {
+            context->pixelMapuiv(map, mapsize, values);
+        }
+        ANGLE_CAPTURE(PixelMapuiv, isCallValid, context, map, mapsize, values);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY PixelMapusv(GLenum map, GLsizei mapsize, const GLushort *values)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLPixelMapusv,
+          "context = %d, map = %s, mapsize = %d, values = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::PixelMap, map), mapsize, (uintptr_t)values);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidatePixelMapusv(context, map, mapsize, values));
+        if (isCallValid)
+        {
+            context->pixelMapusv(map, mapsize, values);
+        }
+        ANGLE_CAPTURE(PixelMapusv, isCallValid, context, map, mapsize, values);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY PixelStoref(GLenum pname, GLfloat param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLPixelStoref, "context = %d, pname = %s, param = %f", CID(context),
+          GLenumToString(GLenumGroup::PixelStoreParameter, pname), param);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidatePixelStoref(context, pname, param));
+        if (isCallValid)
+        {
+            context->pixelStoref(pname, param);
+        }
+        ANGLE_CAPTURE(PixelStoref, isCallValid, context, pname, param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY PixelStorei(GLenum pname, GLint param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLPixelStorei, "context = %d, pname = %s, param = %d", CID(context),
+          GLenumToString(GLenumGroup::PixelStoreParameter, pname), param);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidatePixelStorei(context, pname, param));
+        if (isCallValid)
+        {
+            context->pixelStorei(pname, param);
+        }
+        ANGLE_CAPTURE(PixelStorei, isCallValid, context, pname, param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY PixelTransferf(GLenum pname, GLfloat param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLPixelTransferf, "context = %d, pname = %s, param = %f", CID(context),
+          GLenumToString(GLenumGroup::PixelTransferParameter, pname), param);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidatePixelTransferf(context, pname, param));
+        if (isCallValid)
+        {
+            context->pixelTransferf(pname, param);
+        }
+        ANGLE_CAPTURE(PixelTransferf, isCallValid, context, pname, param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY PixelTransferi(GLenum pname, GLint param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLPixelTransferi, "context = %d, pname = %s, param = %d", CID(context),
+          GLenumToString(GLenumGroup::PixelTransferParameter, pname), param);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidatePixelTransferi(context, pname, param));
+        if (isCallValid)
+        {
+            context->pixelTransferi(pname, param);
+        }
+        ANGLE_CAPTURE(PixelTransferi, isCallValid, context, pname, param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY PixelZoom(GLfloat xfactor, GLfloat yfactor)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLPixelZoom, "context = %d, xfactor = %f, yfactor = %f", CID(context), xfactor,
+          yfactor);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidatePixelZoom(context, xfactor, yfactor));
+        if (isCallValid)
+        {
+            context->pixelZoom(xfactor, yfactor);
+        }
+        ANGLE_CAPTURE(PixelZoom, isCallValid, context, xfactor, yfactor);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY PointSize(GLfloat size)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLPointSize, "context = %d, size = %f", CID(context), size);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidatePointSize(context, size));
+        if (isCallValid)
+        {
+            context->pointSize(size);
+        }
+        ANGLE_CAPTURE(PointSize, isCallValid, context, size);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY PolygonMode(GLenum face, GLenum mode)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLPolygonMode, "context = %d, face = %s, mode = %s", CID(context),
+          GLenumToString(GLenumGroup::MaterialFace, face),
+          GLenumToString(GLenumGroup::PolygonMode, mode));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidatePolygonMode(context, face, mode));
+        if (isCallValid)
+        {
+            context->polygonMode(face, mode);
+        }
+        ANGLE_CAPTURE(PolygonMode, isCallValid, context, face, mode);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY PolygonStipple(const GLubyte *mask)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLPolygonStipple, "context = %d, mask = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)mask);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidatePolygonStipple(context, mask));
+        if (isCallValid)
+        {
+            context->polygonStipple(mask);
+        }
+        ANGLE_CAPTURE(PolygonStipple, isCallValid, context, mask);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY PopAttrib()
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLPopAttrib, "context = %d", CID(context));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidatePopAttrib(context));
+        if (isCallValid)
+        {
+            context->popAttrib();
+        }
+        ANGLE_CAPTURE(PopAttrib, isCallValid, context);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY PopMatrix()
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLPopMatrix, "context = %d", CID(context));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidatePopMatrix(context));
+        if (isCallValid)
+        {
+            context->popMatrix();
+        }
+        ANGLE_CAPTURE(PopMatrix, isCallValid, context);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY PopName()
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLPopName, "context = %d", CID(context));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidatePopName(context));
+        if (isCallValid)
+        {
+            context->popName();
+        }
+        ANGLE_CAPTURE(PopName, isCallValid, context);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY PushAttrib(GLbitfield mask)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLPushAttrib, "context = %d, mask = %s", CID(context),
+          GLbitfieldToString(GLenumGroup::AttribMask, mask).c_str());
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidatePushAttrib(context, mask));
+        if (isCallValid)
+        {
+            context->pushAttrib(mask);
+        }
+        ANGLE_CAPTURE(PushAttrib, isCallValid, context, mask);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY PushMatrix()
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLPushMatrix, "context = %d", CID(context));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidatePushMatrix(context));
+        if (isCallValid)
+        {
+            context->pushMatrix();
+        }
+        ANGLE_CAPTURE(PushMatrix, isCallValid, context);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY PushName(GLuint name)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLPushName, "context = %d, name = %u", CID(context), name);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidatePushName(context, name));
+        if (isCallValid)
+        {
+            context->pushName(name);
+        }
+        ANGLE_CAPTURE(PushName, isCallValid, context, name);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY RasterPos2d(GLdouble x, GLdouble y)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLRasterPos2d, "context = %d, x = %f, y = %f", CID(context), x, y);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateRasterPos2d(context, x, y));
+        if (isCallValid)
+        {
+            context->rasterPos2d(x, y);
+        }
+        ANGLE_CAPTURE(RasterPos2d, isCallValid, context, x, y);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY RasterPos2dv(const GLdouble *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLRasterPos2dv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateRasterPos2dv(context, v));
+        if (isCallValid)
+        {
+            context->rasterPos2dv(v);
+        }
+        ANGLE_CAPTURE(RasterPos2dv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY RasterPos2f(GLfloat x, GLfloat y)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLRasterPos2f, "context = %d, x = %f, y = %f", CID(context), x, y);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateRasterPos2f(context, x, y));
+        if (isCallValid)
+        {
+            context->rasterPos2f(x, y);
+        }
+        ANGLE_CAPTURE(RasterPos2f, isCallValid, context, x, y);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY RasterPos2fv(const GLfloat *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLRasterPos2fv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateRasterPos2fv(context, v));
+        if (isCallValid)
+        {
+            context->rasterPos2fv(v);
+        }
+        ANGLE_CAPTURE(RasterPos2fv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY RasterPos2i(GLint x, GLint y)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLRasterPos2i, "context = %d, x = %d, y = %d", CID(context), x, y);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateRasterPos2i(context, x, y));
+        if (isCallValid)
+        {
+            context->rasterPos2i(x, y);
+        }
+        ANGLE_CAPTURE(RasterPos2i, isCallValid, context, x, y);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY RasterPos2iv(const GLint *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLRasterPos2iv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateRasterPos2iv(context, v));
+        if (isCallValid)
+        {
+            context->rasterPos2iv(v);
+        }
+        ANGLE_CAPTURE(RasterPos2iv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY RasterPos2s(GLshort x, GLshort y)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLRasterPos2s, "context = %d, x = %d, y = %d", CID(context), x, y);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateRasterPos2s(context, x, y));
+        if (isCallValid)
+        {
+            context->rasterPos2s(x, y);
+        }
+        ANGLE_CAPTURE(RasterPos2s, isCallValid, context, x, y);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY RasterPos2sv(const GLshort *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLRasterPos2sv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateRasterPos2sv(context, v));
+        if (isCallValid)
+        {
+            context->rasterPos2sv(v);
+        }
+        ANGLE_CAPTURE(RasterPos2sv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY RasterPos3d(GLdouble x, GLdouble y, GLdouble z)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLRasterPos3d, "context = %d, x = %f, y = %f, z = %f", CID(context), x, y, z);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateRasterPos3d(context, x, y, z));
+        if (isCallValid)
+        {
+            context->rasterPos3d(x, y, z);
+        }
+        ANGLE_CAPTURE(RasterPos3d, isCallValid, context, x, y, z);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY RasterPos3dv(const GLdouble *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLRasterPos3dv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateRasterPos3dv(context, v));
+        if (isCallValid)
+        {
+            context->rasterPos3dv(v);
+        }
+        ANGLE_CAPTURE(RasterPos3dv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY RasterPos3f(GLfloat x, GLfloat y, GLfloat z)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLRasterPos3f, "context = %d, x = %f, y = %f, z = %f", CID(context), x, y, z);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateRasterPos3f(context, x, y, z));
+        if (isCallValid)
+        {
+            context->rasterPos3f(x, y, z);
+        }
+        ANGLE_CAPTURE(RasterPos3f, isCallValid, context, x, y, z);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY RasterPos3fv(const GLfloat *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLRasterPos3fv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateRasterPos3fv(context, v));
+        if (isCallValid)
+        {
+            context->rasterPos3fv(v);
+        }
+        ANGLE_CAPTURE(RasterPos3fv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY RasterPos3i(GLint x, GLint y, GLint z)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLRasterPos3i, "context = %d, x = %d, y = %d, z = %d", CID(context), x, y, z);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateRasterPos3i(context, x, y, z));
+        if (isCallValid)
+        {
+            context->rasterPos3i(x, y, z);
+        }
+        ANGLE_CAPTURE(RasterPos3i, isCallValid, context, x, y, z);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY RasterPos3iv(const GLint *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLRasterPos3iv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateRasterPos3iv(context, v));
+        if (isCallValid)
+        {
+            context->rasterPos3iv(v);
+        }
+        ANGLE_CAPTURE(RasterPos3iv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY RasterPos3s(GLshort x, GLshort y, GLshort z)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLRasterPos3s, "context = %d, x = %d, y = %d, z = %d", CID(context), x, y, z);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateRasterPos3s(context, x, y, z));
+        if (isCallValid)
+        {
+            context->rasterPos3s(x, y, z);
+        }
+        ANGLE_CAPTURE(RasterPos3s, isCallValid, context, x, y, z);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY RasterPos3sv(const GLshort *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLRasterPos3sv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateRasterPos3sv(context, v));
+        if (isCallValid)
+        {
+            context->rasterPos3sv(v);
+        }
+        ANGLE_CAPTURE(RasterPos3sv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY RasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLRasterPos4d, "context = %d, x = %f, y = %f, z = %f, w = %f", CID(context), x,
+          y, z, w);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateRasterPos4d(context, x, y, z, w));
+        if (isCallValid)
+        {
+            context->rasterPos4d(x, y, z, w);
+        }
+        ANGLE_CAPTURE(RasterPos4d, isCallValid, context, x, y, z, w);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY RasterPos4dv(const GLdouble *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLRasterPos4dv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateRasterPos4dv(context, v));
+        if (isCallValid)
+        {
+            context->rasterPos4dv(v);
+        }
+        ANGLE_CAPTURE(RasterPos4dv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY RasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLRasterPos4f, "context = %d, x = %f, y = %f, z = %f, w = %f", CID(context), x,
+          y, z, w);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateRasterPos4f(context, x, y, z, w));
+        if (isCallValid)
+        {
+            context->rasterPos4f(x, y, z, w);
+        }
+        ANGLE_CAPTURE(RasterPos4f, isCallValid, context, x, y, z, w);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY RasterPos4fv(const GLfloat *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLRasterPos4fv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateRasterPos4fv(context, v));
+        if (isCallValid)
+        {
+            context->rasterPos4fv(v);
+        }
+        ANGLE_CAPTURE(RasterPos4fv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY RasterPos4i(GLint x, GLint y, GLint z, GLint w)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLRasterPos4i, "context = %d, x = %d, y = %d, z = %d, w = %d", CID(context), x,
+          y, z, w);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateRasterPos4i(context, x, y, z, w));
+        if (isCallValid)
+        {
+            context->rasterPos4i(x, y, z, w);
+        }
+        ANGLE_CAPTURE(RasterPos4i, isCallValid, context, x, y, z, w);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY RasterPos4iv(const GLint *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLRasterPos4iv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateRasterPos4iv(context, v));
+        if (isCallValid)
+        {
+            context->rasterPos4iv(v);
+        }
+        ANGLE_CAPTURE(RasterPos4iv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY RasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLRasterPos4s, "context = %d, x = %d, y = %d, z = %d, w = %d", CID(context), x,
+          y, z, w);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateRasterPos4s(context, x, y, z, w));
+        if (isCallValid)
+        {
+            context->rasterPos4s(x, y, z, w);
+        }
+        ANGLE_CAPTURE(RasterPos4s, isCallValid, context, x, y, z, w);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY RasterPos4sv(const GLshort *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLRasterPos4sv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateRasterPos4sv(context, v));
+        if (isCallValid)
+        {
+            context->rasterPos4sv(v);
+        }
+        ANGLE_CAPTURE(RasterPos4sv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ReadBuffer(GLenum src)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLReadBuffer, "context = %d, src = %s", CID(context),
+          GLenumToString(GLenumGroup::ReadBufferMode, src));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateReadBuffer(context, src));
+        if (isCallValid)
+        {
+            context->readBuffer(src);
+        }
+        ANGLE_CAPTURE(ReadBuffer, isCallValid, context, src);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ReadPixels(GLint x,
+                            GLint y,
+                            GLsizei width,
+                            GLsizei height,
+                            GLenum format,
+                            GLenum type,
+                            void *pixels)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLReadPixels,
+          "context = %d, x = %d, y = %d, width = %d, height = %d, format = %s, type = %s, pixels = "
+          "0x%016" PRIxPTR "",
+          CID(context), x, y, width, height, GLenumToString(GLenumGroup::PixelFormat, format),
+          GLenumToString(GLenumGroup::PixelType, type), (uintptr_t)pixels);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateReadPixels(context, x, y, width, height, format, type, pixels));
+        if (isCallValid)
+        {
+            context->readPixels(x, y, width, height, format, type, pixels);
+        }
+        ANGLE_CAPTURE(ReadPixels, isCallValid, context, x, y, width, height, format, type, pixels);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Rectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLRectd, "context = %d, x1 = %f, y1 = %f, x2 = %f, y2 = %f", CID(context), x1,
+          y1, x2, y2);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateRectd(context, x1, y1, x2, y2));
+        if (isCallValid)
+        {
+            context->rectd(x1, y1, x2, y2);
+        }
+        ANGLE_CAPTURE(Rectd, isCallValid, context, x1, y1, x2, y2);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Rectdv(const GLdouble *v1, const GLdouble *v2)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLRectdv, "context = %d, v1 = 0x%016" PRIxPTR ", v2 = 0x%016" PRIxPTR "",
+          CID(context), (uintptr_t)v1, (uintptr_t)v2);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateRectdv(context, v1, v2));
+        if (isCallValid)
+        {
+            context->rectdv(v1, v2);
+        }
+        ANGLE_CAPTURE(Rectdv, isCallValid, context, v1, v2);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Rectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLRectf, "context = %d, x1 = %f, y1 = %f, x2 = %f, y2 = %f", CID(context), x1,
+          y1, x2, y2);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateRectf(context, x1, y1, x2, y2));
+        if (isCallValid)
+        {
+            context->rectf(x1, y1, x2, y2);
+        }
+        ANGLE_CAPTURE(Rectf, isCallValid, context, x1, y1, x2, y2);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Rectfv(const GLfloat *v1, const GLfloat *v2)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLRectfv, "context = %d, v1 = 0x%016" PRIxPTR ", v2 = 0x%016" PRIxPTR "",
+          CID(context), (uintptr_t)v1, (uintptr_t)v2);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateRectfv(context, v1, v2));
+        if (isCallValid)
+        {
+            context->rectfv(v1, v2);
+        }
+        ANGLE_CAPTURE(Rectfv, isCallValid, context, v1, v2);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Recti(GLint x1, GLint y1, GLint x2, GLint y2)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLRecti, "context = %d, x1 = %d, y1 = %d, x2 = %d, y2 = %d", CID(context), x1,
+          y1, x2, y2);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateRecti(context, x1, y1, x2, y2));
+        if (isCallValid)
+        {
+            context->recti(x1, y1, x2, y2);
+        }
+        ANGLE_CAPTURE(Recti, isCallValid, context, x1, y1, x2, y2);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Rectiv(const GLint *v1, const GLint *v2)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLRectiv, "context = %d, v1 = 0x%016" PRIxPTR ", v2 = 0x%016" PRIxPTR "",
+          CID(context), (uintptr_t)v1, (uintptr_t)v2);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateRectiv(context, v1, v2));
+        if (isCallValid)
+        {
+            context->rectiv(v1, v2);
+        }
+        ANGLE_CAPTURE(Rectiv, isCallValid, context, v1, v2);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Rects(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLRects, "context = %d, x1 = %d, y1 = %d, x2 = %d, y2 = %d", CID(context), x1,
+          y1, x2, y2);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateRects(context, x1, y1, x2, y2));
+        if (isCallValid)
+        {
+            context->rects(x1, y1, x2, y2);
+        }
+        ANGLE_CAPTURE(Rects, isCallValid, context, x1, y1, x2, y2);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Rectsv(const GLshort *v1, const GLshort *v2)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLRectsv, "context = %d, v1 = 0x%016" PRIxPTR ", v2 = 0x%016" PRIxPTR "",
+          CID(context), (uintptr_t)v1, (uintptr_t)v2);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateRectsv(context, v1, v2));
+        if (isCallValid)
+        {
+            context->rectsv(v1, v2);
+        }
+        ANGLE_CAPTURE(Rectsv, isCallValid, context, v1, v2);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+GLint GL_APIENTRY RenderMode(GLenum mode)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLRenderMode, "context = %d, mode = %s", CID(context),
+          GLenumToString(GLenumGroup::RenderingMode, mode));
+
+    GLint returnValue;
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateRenderMode(context, mode));
+        if (isCallValid)
+        {
+            returnValue = context->renderMode(mode);
+        }
+        else
+        {
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLRenderMode, GLint>();
+        }
+        ANGLE_CAPTURE(RenderMode, isCallValid, context, mode, returnValue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLRenderMode, GLint>();
+    }
+    return returnValue;
+}
+
+void GL_APIENTRY Rotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLRotated, "context = %d, angle = %f, x = %f, y = %f, z = %f", CID(context),
+          angle, x, y, z);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateRotated(context, angle, x, y, z));
+        if (isCallValid)
+        {
+            context->rotated(angle, x, y, z);
+        }
+        ANGLE_CAPTURE(Rotated, isCallValid, context, angle, x, y, z);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Rotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLRotatef, "context = %d, angle = %f, x = %f, y = %f, z = %f", CID(context),
+          angle, x, y, z);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateRotatef(context, angle, x, y, z));
+        if (isCallValid)
+        {
+            context->rotatef(angle, x, y, z);
+        }
+        ANGLE_CAPTURE(Rotatef, isCallValid, context, angle, x, y, z);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Scaled(GLdouble x, GLdouble y, GLdouble z)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLScaled, "context = %d, x = %f, y = %f, z = %f", CID(context), x, y, z);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateScaled(context, x, y, z));
+        if (isCallValid)
+        {
+            context->scaled(x, y, z);
+        }
+        ANGLE_CAPTURE(Scaled, isCallValid, context, x, y, z);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Scalef(GLfloat x, GLfloat y, GLfloat z)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLScalef, "context = %d, x = %f, y = %f, z = %f", CID(context), x, y, z);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateScalef(context, x, y, z));
+        if (isCallValid)
+        {
+            context->scalef(x, y, z);
+        }
+        ANGLE_CAPTURE(Scalef, isCallValid, context, x, y, z);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Scissor(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLScissor, "context = %d, x = %d, y = %d, width = %d, height = %d", CID(context),
+          x, y, width, height);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateScissor(context, x, y, width, height));
+        if (isCallValid)
+        {
+            context->scissor(x, y, width, height);
+        }
+        ANGLE_CAPTURE(Scissor, isCallValid, context, x, y, width, height);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY SelectBuffer(GLsizei size, GLuint *buffer)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLSelectBuffer, "context = %d, size = %d, buffer = 0x%016" PRIxPTR "",
+          CID(context), size, (uintptr_t)buffer);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateSelectBuffer(context, size, buffer));
+        if (isCallValid)
+        {
+            context->selectBuffer(size, buffer);
+        }
+        ANGLE_CAPTURE(SelectBuffer, isCallValid, context, size, buffer);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ShadeModel(GLenum mode)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLShadeModel, "context = %d, mode = %s", CID(context),
+          GLenumToString(GLenumGroup::ShadingModel, mode));
+
+    if (context)
+    {
+        ShadingModel modePacked                               = PackParam<ShadingModel>(mode);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateShadeModel(context, modePacked));
+        if (isCallValid)
+        {
+            context->shadeModel(modePacked);
+        }
+        ANGLE_CAPTURE(ShadeModel, isCallValid, context, modePacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY StencilFunc(GLenum func, GLint ref, GLuint mask)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLStencilFunc, "context = %d, func = %s, ref = %d, mask = %u", CID(context),
+          GLenumToString(GLenumGroup::StencilFunction, func), ref, mask);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateStencilFunc(context, func, ref, mask));
+        if (isCallValid)
+        {
+            context->stencilFunc(func, ref, mask);
+        }
+        ANGLE_CAPTURE(StencilFunc, isCallValid, context, func, ref, mask);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY StencilMask(GLuint mask)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLStencilMask, "context = %d, mask = %u", CID(context), mask);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateStencilMask(context, mask));
+        if (isCallValid)
+        {
+            context->stencilMask(mask);
+        }
+        ANGLE_CAPTURE(StencilMask, isCallValid, context, mask);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY StencilOp(GLenum fail, GLenum zfail, GLenum zpass)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLStencilOp, "context = %d, fail = %s, zfail = %s, zpass = %s", CID(context),
+          GLenumToString(GLenumGroup::StencilOp, fail),
+          GLenumToString(GLenumGroup::StencilOp, zfail),
+          GLenumToString(GLenumGroup::StencilOp, zpass));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateStencilOp(context, fail, zfail, zpass));
+        if (isCallValid)
+        {
+            context->stencilOp(fail, zfail, zpass);
+        }
+        ANGLE_CAPTURE(StencilOp, isCallValid, context, fail, zfail, zpass);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoord1d(GLdouble s)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoord1d, "context = %d, s = %f", CID(context), s);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateTexCoord1d(context, s));
+        if (isCallValid)
+        {
+            context->texCoord1d(s);
+        }
+        ANGLE_CAPTURE(TexCoord1d, isCallValid, context, s);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoord1dv(const GLdouble *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoord1dv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateTexCoord1dv(context, v));
+        if (isCallValid)
+        {
+            context->texCoord1dv(v);
+        }
+        ANGLE_CAPTURE(TexCoord1dv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoord1f(GLfloat s)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoord1f, "context = %d, s = %f", CID(context), s);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateTexCoord1f(context, s));
+        if (isCallValid)
+        {
+            context->texCoord1f(s);
+        }
+        ANGLE_CAPTURE(TexCoord1f, isCallValid, context, s);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoord1fv(const GLfloat *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoord1fv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateTexCoord1fv(context, v));
+        if (isCallValid)
+        {
+            context->texCoord1fv(v);
+        }
+        ANGLE_CAPTURE(TexCoord1fv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoord1i(GLint s)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoord1i, "context = %d, s = %d", CID(context), s);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateTexCoord1i(context, s));
+        if (isCallValid)
+        {
+            context->texCoord1i(s);
+        }
+        ANGLE_CAPTURE(TexCoord1i, isCallValid, context, s);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoord1iv(const GLint *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoord1iv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateTexCoord1iv(context, v));
+        if (isCallValid)
+        {
+            context->texCoord1iv(v);
+        }
+        ANGLE_CAPTURE(TexCoord1iv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoord1s(GLshort s)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoord1s, "context = %d, s = %d", CID(context), s);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateTexCoord1s(context, s));
+        if (isCallValid)
+        {
+            context->texCoord1s(s);
+        }
+        ANGLE_CAPTURE(TexCoord1s, isCallValid, context, s);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoord1sv(const GLshort *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoord1sv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateTexCoord1sv(context, v));
+        if (isCallValid)
+        {
+            context->texCoord1sv(v);
+        }
+        ANGLE_CAPTURE(TexCoord1sv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoord2d(GLdouble s, GLdouble t)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoord2d, "context = %d, s = %f, t = %f", CID(context), s, t);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateTexCoord2d(context, s, t));
+        if (isCallValid)
+        {
+            context->texCoord2d(s, t);
+        }
+        ANGLE_CAPTURE(TexCoord2d, isCallValid, context, s, t);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoord2dv(const GLdouble *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoord2dv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateTexCoord2dv(context, v));
+        if (isCallValid)
+        {
+            context->texCoord2dv(v);
+        }
+        ANGLE_CAPTURE(TexCoord2dv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoord2f(GLfloat s, GLfloat t)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoord2f, "context = %d, s = %f, t = %f", CID(context), s, t);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateTexCoord2f(context, s, t));
+        if (isCallValid)
+        {
+            context->texCoord2f(s, t);
+        }
+        ANGLE_CAPTURE(TexCoord2f, isCallValid, context, s, t);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoord2fv(const GLfloat *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoord2fv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateTexCoord2fv(context, v));
+        if (isCallValid)
+        {
+            context->texCoord2fv(v);
+        }
+        ANGLE_CAPTURE(TexCoord2fv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoord2i(GLint s, GLint t)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoord2i, "context = %d, s = %d, t = %d", CID(context), s, t);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateTexCoord2i(context, s, t));
+        if (isCallValid)
+        {
+            context->texCoord2i(s, t);
+        }
+        ANGLE_CAPTURE(TexCoord2i, isCallValid, context, s, t);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoord2iv(const GLint *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoord2iv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateTexCoord2iv(context, v));
+        if (isCallValid)
+        {
+            context->texCoord2iv(v);
+        }
+        ANGLE_CAPTURE(TexCoord2iv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoord2s(GLshort s, GLshort t)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoord2s, "context = %d, s = %d, t = %d", CID(context), s, t);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateTexCoord2s(context, s, t));
+        if (isCallValid)
+        {
+            context->texCoord2s(s, t);
+        }
+        ANGLE_CAPTURE(TexCoord2s, isCallValid, context, s, t);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoord2sv(const GLshort *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoord2sv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateTexCoord2sv(context, v));
+        if (isCallValid)
+        {
+            context->texCoord2sv(v);
+        }
+        ANGLE_CAPTURE(TexCoord2sv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoord3d(GLdouble s, GLdouble t, GLdouble r)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoord3d, "context = %d, s = %f, t = %f, r = %f", CID(context), s, t, r);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateTexCoord3d(context, s, t, r));
+        if (isCallValid)
+        {
+            context->texCoord3d(s, t, r);
+        }
+        ANGLE_CAPTURE(TexCoord3d, isCallValid, context, s, t, r);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoord3dv(const GLdouble *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoord3dv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateTexCoord3dv(context, v));
+        if (isCallValid)
+        {
+            context->texCoord3dv(v);
+        }
+        ANGLE_CAPTURE(TexCoord3dv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoord3f(GLfloat s, GLfloat t, GLfloat r)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoord3f, "context = %d, s = %f, t = %f, r = %f", CID(context), s, t, r);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateTexCoord3f(context, s, t, r));
+        if (isCallValid)
+        {
+            context->texCoord3f(s, t, r);
+        }
+        ANGLE_CAPTURE(TexCoord3f, isCallValid, context, s, t, r);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoord3fv(const GLfloat *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoord3fv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateTexCoord3fv(context, v));
+        if (isCallValid)
+        {
+            context->texCoord3fv(v);
+        }
+        ANGLE_CAPTURE(TexCoord3fv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoord3i(GLint s, GLint t, GLint r)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoord3i, "context = %d, s = %d, t = %d, r = %d", CID(context), s, t, r);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateTexCoord3i(context, s, t, r));
+        if (isCallValid)
+        {
+            context->texCoord3i(s, t, r);
+        }
+        ANGLE_CAPTURE(TexCoord3i, isCallValid, context, s, t, r);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoord3iv(const GLint *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoord3iv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateTexCoord3iv(context, v));
+        if (isCallValid)
+        {
+            context->texCoord3iv(v);
+        }
+        ANGLE_CAPTURE(TexCoord3iv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoord3s(GLshort s, GLshort t, GLshort r)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoord3s, "context = %d, s = %d, t = %d, r = %d", CID(context), s, t, r);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateTexCoord3s(context, s, t, r));
+        if (isCallValid)
+        {
+            context->texCoord3s(s, t, r);
+        }
+        ANGLE_CAPTURE(TexCoord3s, isCallValid, context, s, t, r);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoord3sv(const GLshort *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoord3sv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateTexCoord3sv(context, v));
+        if (isCallValid)
+        {
+            context->texCoord3sv(v);
+        }
+        ANGLE_CAPTURE(TexCoord3sv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoord4d, "context = %d, s = %f, t = %f, r = %f, q = %f", CID(context), s, t,
+          r, q);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateTexCoord4d(context, s, t, r, q));
+        if (isCallValid)
+        {
+            context->texCoord4d(s, t, r, q);
+        }
+        ANGLE_CAPTURE(TexCoord4d, isCallValid, context, s, t, r, q);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoord4dv(const GLdouble *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoord4dv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateTexCoord4dv(context, v));
+        if (isCallValid)
+        {
+            context->texCoord4dv(v);
+        }
+        ANGLE_CAPTURE(TexCoord4dv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoord4f, "context = %d, s = %f, t = %f, r = %f, q = %f", CID(context), s, t,
+          r, q);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateTexCoord4f(context, s, t, r, q));
+        if (isCallValid)
+        {
+            context->texCoord4f(s, t, r, q);
+        }
+        ANGLE_CAPTURE(TexCoord4f, isCallValid, context, s, t, r, q);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoord4fv(const GLfloat *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoord4fv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateTexCoord4fv(context, v));
+        if (isCallValid)
+        {
+            context->texCoord4fv(v);
+        }
+        ANGLE_CAPTURE(TexCoord4fv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoord4i(GLint s, GLint t, GLint r, GLint q)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoord4i, "context = %d, s = %d, t = %d, r = %d, q = %d", CID(context), s, t,
+          r, q);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateTexCoord4i(context, s, t, r, q));
+        if (isCallValid)
+        {
+            context->texCoord4i(s, t, r, q);
+        }
+        ANGLE_CAPTURE(TexCoord4i, isCallValid, context, s, t, r, q);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoord4iv(const GLint *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoord4iv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateTexCoord4iv(context, v));
+        if (isCallValid)
+        {
+            context->texCoord4iv(v);
+        }
+        ANGLE_CAPTURE(TexCoord4iv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoord4s, "context = %d, s = %d, t = %d, r = %d, q = %d", CID(context), s, t,
+          r, q);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateTexCoord4s(context, s, t, r, q));
+        if (isCallValid)
+        {
+            context->texCoord4s(s, t, r, q);
+        }
+        ANGLE_CAPTURE(TexCoord4s, isCallValid, context, s, t, r, q);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoord4sv(const GLshort *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoord4sv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateTexCoord4sv(context, v));
+        if (isCallValid)
+        {
+            context->texCoord4sv(v);
+        }
+        ANGLE_CAPTURE(TexCoord4sv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexEnvf(GLenum target, GLenum pname, GLfloat param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexEnvf, "context = %d, target = %s, pname = %s, param = %f", CID(context),
+          GLenumToString(GLenumGroup::TextureEnvTarget, target),
+          GLenumToString(GLenumGroup::TextureEnvParameter, pname), param);
+
+    if (context)
+    {
+        TextureEnvTarget targetPacked   = PackParam<TextureEnvTarget>(target);
+        TextureEnvParameter pnamePacked = PackParam<TextureEnvParameter>(pname);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateTexEnvf(context, targetPacked, pnamePacked, param));
+        if (isCallValid)
+        {
+            context->texEnvf(targetPacked, pnamePacked, param);
+        }
+        ANGLE_CAPTURE(TexEnvf, isCallValid, context, targetPacked, pnamePacked, param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexEnvfv, "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureEnvTarget, target),
+          GLenumToString(GLenumGroup::TextureEnvParameter, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        TextureEnvTarget targetPacked   = PackParam<TextureEnvTarget>(target);
+        TextureEnvParameter pnamePacked = PackParam<TextureEnvParameter>(pname);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateTexEnvfv(context, targetPacked, pnamePacked, params));
+        if (isCallValid)
+        {
+            context->texEnvfv(targetPacked, pnamePacked, params);
+        }
+        ANGLE_CAPTURE(TexEnvfv, isCallValid, context, targetPacked, pnamePacked, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexEnvi(GLenum target, GLenum pname, GLint param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexEnvi, "context = %d, target = %s, pname = %s, param = %d", CID(context),
+          GLenumToString(GLenumGroup::TextureEnvTarget, target),
+          GLenumToString(GLenumGroup::TextureEnvParameter, pname), param);
+
+    if (context)
+    {
+        TextureEnvTarget targetPacked   = PackParam<TextureEnvTarget>(target);
+        TextureEnvParameter pnamePacked = PackParam<TextureEnvParameter>(pname);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateTexEnvi(context, targetPacked, pnamePacked, param));
+        if (isCallValid)
+        {
+            context->texEnvi(targetPacked, pnamePacked, param);
+        }
+        ANGLE_CAPTURE(TexEnvi, isCallValid, context, targetPacked, pnamePacked, param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexEnviv(GLenum target, GLenum pname, const GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexEnviv, "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureEnvTarget, target),
+          GLenumToString(GLenumGroup::TextureEnvParameter, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        TextureEnvTarget targetPacked   = PackParam<TextureEnvTarget>(target);
+        TextureEnvParameter pnamePacked = PackParam<TextureEnvParameter>(pname);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateTexEnviv(context, targetPacked, pnamePacked, params));
+        if (isCallValid)
+        {
+            context->texEnviv(targetPacked, pnamePacked, params);
+        }
+        ANGLE_CAPTURE(TexEnviv, isCallValid, context, targetPacked, pnamePacked, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexGend(GLenum coord, GLenum pname, GLdouble param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexGend, "context = %d, coord = %s, pname = %s, param = %f", CID(context),
+          GLenumToString(GLenumGroup::TextureCoordName, coord),
+          GLenumToString(GLenumGroup::TextureGenParameter, pname), param);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateTexGend(context, coord, pname, param));
+        if (isCallValid)
+        {
+            context->texGend(coord, pname, param);
+        }
+        ANGLE_CAPTURE(TexGend, isCallValid, context, coord, pname, param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexGendv(GLenum coord, GLenum pname, const GLdouble *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexGendv, "context = %d, coord = %s, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureCoordName, coord),
+          GLenumToString(GLenumGroup::TextureGenParameter, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateTexGendv(context, coord, pname, params));
+        if (isCallValid)
+        {
+            context->texGendv(coord, pname, params);
+        }
+        ANGLE_CAPTURE(TexGendv, isCallValid, context, coord, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexGenf(GLenum coord, GLenum pname, GLfloat param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexGenf, "context = %d, coord = %s, pname = %s, param = %f", CID(context),
+          GLenumToString(GLenumGroup::TextureCoordName, coord),
+          GLenumToString(GLenumGroup::TextureGenParameter, pname), param);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateTexGenf(context, coord, pname, param));
+        if (isCallValid)
+        {
+            context->texGenf(coord, pname, param);
+        }
+        ANGLE_CAPTURE(TexGenf, isCallValid, context, coord, pname, param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexGenfv(GLenum coord, GLenum pname, const GLfloat *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexGenfv, "context = %d, coord = %s, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureCoordName, coord),
+          GLenumToString(GLenumGroup::TextureGenParameter, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateTexGenfv(context, coord, pname, params));
+        if (isCallValid)
+        {
+            context->texGenfv(coord, pname, params);
+        }
+        ANGLE_CAPTURE(TexGenfv, isCallValid, context, coord, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexGeni(GLenum coord, GLenum pname, GLint param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexGeni, "context = %d, coord = %s, pname = %s, param = %d", CID(context),
+          GLenumToString(GLenumGroup::TextureCoordName, coord),
+          GLenumToString(GLenumGroup::TextureGenParameter, pname), param);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateTexGeni(context, coord, pname, param));
+        if (isCallValid)
+        {
+            context->texGeni(coord, pname, param);
+        }
+        ANGLE_CAPTURE(TexGeni, isCallValid, context, coord, pname, param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexGeniv(GLenum coord, GLenum pname, const GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexGeniv, "context = %d, coord = %s, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureCoordName, coord),
+          GLenumToString(GLenumGroup::TextureGenParameter, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateTexGeniv(context, coord, pname, params));
+        if (isCallValid)
+        {
+            context->texGeniv(coord, pname, params);
+        }
+        ANGLE_CAPTURE(TexGeniv, isCallValid, context, coord, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexImage1D(GLenum target,
+                            GLint level,
+                            GLint internalformat,
+                            GLsizei width,
+                            GLint border,
+                            GLenum format,
+                            GLenum type,
+                            const void *pixels)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexImage1D,
+          "context = %d, target = %s, level = %d, internalformat = %d, width = %d, border = %d, "
+          "format = %s, type = %s, pixels = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, internalformat,
+          width, border, GLenumToString(GLenumGroup::PixelFormat, format),
+          GLenumToString(GLenumGroup::PixelType, type), (uintptr_t)pixels);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateTexImage1D(context, target, level, internalformat,
+                                                             width, border, format, type, pixels));
+        if (isCallValid)
+        {
+            context->texImage1D(target, level, internalformat, width, border, format, type, pixels);
+        }
+        ANGLE_CAPTURE(TexImage1D, isCallValid, context, target, level, internalformat, width,
+                      border, format, type, pixels);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexImage2D(GLenum target,
+                            GLint level,
+                            GLint internalformat,
+                            GLsizei width,
+                            GLsizei height,
+                            GLint border,
+                            GLenum format,
+                            GLenum type,
+                            const void *pixels)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexImage2D,
+          "context = %d, target = %s, level = %d, internalformat = %d, width = %d, height = %d, "
+          "border = %d, format = %s, type = %s, pixels = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, internalformat,
+          width, height, border, GLenumToString(GLenumGroup::PixelFormat, format),
+          GLenumToString(GLenumGroup::PixelType, type), (uintptr_t)pixels);
+
+    if (context)
+    {
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateTexImage2D(context, targetPacked, level, internalformat, width,
+                                               height, border, format, type, pixels));
+        if (isCallValid)
+        {
+            context->texImage2D(targetPacked, level, internalformat, width, height, border, format,
+                                type, pixels);
+        }
+        ANGLE_CAPTURE(TexImage2D, isCallValid, context, targetPacked, level, internalformat, width,
+                      height, border, format, type, pixels);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexParameterf(GLenum target, GLenum pname, GLfloat param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexParameterf, "context = %d, target = %s, pname = %s, param = %f",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target),
+          GLenumToString(GLenumGroup::TextureParameterName, pname), param);
+
+    if (context)
+    {
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateTexParameterf(context, targetPacked, pname, param));
+        if (isCallValid)
+        {
+            context->texParameterf(targetPacked, pname, param);
+        }
+        ANGLE_CAPTURE(TexParameterf, isCallValid, context, targetPacked, pname, param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexParameterfv,
+          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::TextureTarget, target),
+          GLenumToString(GLenumGroup::TextureParameterName, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateTexParameterfv(context, targetPacked, pname, params));
+        if (isCallValid)
+        {
+            context->texParameterfv(targetPacked, pname, params);
+        }
+        ANGLE_CAPTURE(TexParameterfv, isCallValid, context, targetPacked, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexParameteri(GLenum target, GLenum pname, GLint param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexParameteri, "context = %d, target = %s, pname = %s, param = %d",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target),
+          GLenumToString(GLenumGroup::TextureParameterName, pname), param);
+
+    if (context)
+    {
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateTexParameteri(context, targetPacked, pname, param));
+        if (isCallValid)
+        {
+            context->texParameteri(targetPacked, pname, param);
+        }
+        ANGLE_CAPTURE(TexParameteri, isCallValid, context, targetPacked, pname, param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexParameteriv,
+          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::TextureTarget, target),
+          GLenumToString(GLenumGroup::TextureParameterName, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateTexParameteriv(context, targetPacked, pname, params));
+        if (isCallValid)
+        {
+            context->texParameteriv(targetPacked, pname, params);
+        }
+        ANGLE_CAPTURE(TexParameteriv, isCallValid, context, targetPacked, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Translated(GLdouble x, GLdouble y, GLdouble z)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTranslated, "context = %d, x = %f, y = %f, z = %f", CID(context), x, y, z);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateTranslated(context, x, y, z));
+        if (isCallValid)
+        {
+            context->translated(x, y, z);
+        }
+        ANGLE_CAPTURE(Translated, isCallValid, context, x, y, z);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Translatef(GLfloat x, GLfloat y, GLfloat z)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTranslatef, "context = %d, x = %f, y = %f, z = %f", CID(context), x, y, z);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateTranslatef(context, x, y, z));
+        if (isCallValid)
+        {
+            context->translatef(x, y, z);
+        }
+        ANGLE_CAPTURE(Translatef, isCallValid, context, x, y, z);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Vertex2d(GLdouble x, GLdouble y)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertex2d, "context = %d, x = %f, y = %f", CID(context), x, y);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateVertex2d(context, x, y));
+        if (isCallValid)
+        {
+            context->vertex2d(x, y);
+        }
+        ANGLE_CAPTURE(Vertex2d, isCallValid, context, x, y);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Vertex2dv(const GLdouble *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertex2dv, "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateVertex2dv(context, v));
+        if (isCallValid)
+        {
+            context->vertex2dv(v);
+        }
+        ANGLE_CAPTURE(Vertex2dv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Vertex2f(GLfloat x, GLfloat y)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertex2f, "context = %d, x = %f, y = %f", CID(context), x, y);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateVertex2f(context, x, y));
+        if (isCallValid)
+        {
+            context->vertex2f(x, y);
+        }
+        ANGLE_CAPTURE(Vertex2f, isCallValid, context, x, y);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Vertex2fv(const GLfloat *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertex2fv, "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateVertex2fv(context, v));
+        if (isCallValid)
+        {
+            context->vertex2fv(v);
+        }
+        ANGLE_CAPTURE(Vertex2fv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Vertex2i(GLint x, GLint y)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertex2i, "context = %d, x = %d, y = %d", CID(context), x, y);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateVertex2i(context, x, y));
+        if (isCallValid)
+        {
+            context->vertex2i(x, y);
+        }
+        ANGLE_CAPTURE(Vertex2i, isCallValid, context, x, y);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Vertex2iv(const GLint *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertex2iv, "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateVertex2iv(context, v));
+        if (isCallValid)
+        {
+            context->vertex2iv(v);
+        }
+        ANGLE_CAPTURE(Vertex2iv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Vertex2s(GLshort x, GLshort y)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertex2s, "context = %d, x = %d, y = %d", CID(context), x, y);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateVertex2s(context, x, y));
+        if (isCallValid)
+        {
+            context->vertex2s(x, y);
+        }
+        ANGLE_CAPTURE(Vertex2s, isCallValid, context, x, y);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Vertex2sv(const GLshort *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertex2sv, "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateVertex2sv(context, v));
+        if (isCallValid)
+        {
+            context->vertex2sv(v);
+        }
+        ANGLE_CAPTURE(Vertex2sv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Vertex3d(GLdouble x, GLdouble y, GLdouble z)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertex3d, "context = %d, x = %f, y = %f, z = %f", CID(context), x, y, z);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateVertex3d(context, x, y, z));
+        if (isCallValid)
+        {
+            context->vertex3d(x, y, z);
+        }
+        ANGLE_CAPTURE(Vertex3d, isCallValid, context, x, y, z);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Vertex3dv(const GLdouble *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertex3dv, "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateVertex3dv(context, v));
+        if (isCallValid)
+        {
+            context->vertex3dv(v);
+        }
+        ANGLE_CAPTURE(Vertex3dv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Vertex3f(GLfloat x, GLfloat y, GLfloat z)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertex3f, "context = %d, x = %f, y = %f, z = %f", CID(context), x, y, z);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateVertex3f(context, x, y, z));
+        if (isCallValid)
+        {
+            context->vertex3f(x, y, z);
+        }
+        ANGLE_CAPTURE(Vertex3f, isCallValid, context, x, y, z);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Vertex3fv(const GLfloat *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertex3fv, "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateVertex3fv(context, v));
+        if (isCallValid)
+        {
+            context->vertex3fv(v);
+        }
+        ANGLE_CAPTURE(Vertex3fv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Vertex3i(GLint x, GLint y, GLint z)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertex3i, "context = %d, x = %d, y = %d, z = %d", CID(context), x, y, z);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateVertex3i(context, x, y, z));
+        if (isCallValid)
+        {
+            context->vertex3i(x, y, z);
+        }
+        ANGLE_CAPTURE(Vertex3i, isCallValid, context, x, y, z);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Vertex3iv(const GLint *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertex3iv, "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateVertex3iv(context, v));
+        if (isCallValid)
+        {
+            context->vertex3iv(v);
+        }
+        ANGLE_CAPTURE(Vertex3iv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Vertex3s(GLshort x, GLshort y, GLshort z)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertex3s, "context = %d, x = %d, y = %d, z = %d", CID(context), x, y, z);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateVertex3s(context, x, y, z));
+        if (isCallValid)
+        {
+            context->vertex3s(x, y, z);
+        }
+        ANGLE_CAPTURE(Vertex3s, isCallValid, context, x, y, z);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Vertex3sv(const GLshort *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertex3sv, "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateVertex3sv(context, v));
+        if (isCallValid)
+        {
+            context->vertex3sv(v);
+        }
+        ANGLE_CAPTURE(Vertex3sv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Vertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertex4d, "context = %d, x = %f, y = %f, z = %f, w = %f", CID(context), x, y,
+          z, w);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateVertex4d(context, x, y, z, w));
+        if (isCallValid)
+        {
+            context->vertex4d(x, y, z, w);
+        }
+        ANGLE_CAPTURE(Vertex4d, isCallValid, context, x, y, z, w);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Vertex4dv(const GLdouble *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertex4dv, "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateVertex4dv(context, v));
+        if (isCallValid)
+        {
+            context->vertex4dv(v);
+        }
+        ANGLE_CAPTURE(Vertex4dv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Vertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertex4f, "context = %d, x = %f, y = %f, z = %f, w = %f", CID(context), x, y,
+          z, w);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateVertex4f(context, x, y, z, w));
+        if (isCallValid)
+        {
+            context->vertex4f(x, y, z, w);
+        }
+        ANGLE_CAPTURE(Vertex4f, isCallValid, context, x, y, z, w);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Vertex4fv(const GLfloat *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertex4fv, "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateVertex4fv(context, v));
+        if (isCallValid)
+        {
+            context->vertex4fv(v);
+        }
+        ANGLE_CAPTURE(Vertex4fv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Vertex4i(GLint x, GLint y, GLint z, GLint w)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertex4i, "context = %d, x = %d, y = %d, z = %d, w = %d", CID(context), x, y,
+          z, w);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateVertex4i(context, x, y, z, w));
+        if (isCallValid)
+        {
+            context->vertex4i(x, y, z, w);
+        }
+        ANGLE_CAPTURE(Vertex4i, isCallValid, context, x, y, z, w);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Vertex4iv(const GLint *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertex4iv, "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateVertex4iv(context, v));
+        if (isCallValid)
+        {
+            context->vertex4iv(v);
+        }
+        ANGLE_CAPTURE(Vertex4iv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Vertex4s(GLshort x, GLshort y, GLshort z, GLshort w)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertex4s, "context = %d, x = %d, y = %d, z = %d, w = %d", CID(context), x, y,
+          z, w);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateVertex4s(context, x, y, z, w));
+        if (isCallValid)
+        {
+            context->vertex4s(x, y, z, w);
+        }
+        ANGLE_CAPTURE(Vertex4s, isCallValid, context, x, y, z, w);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Vertex4sv(const GLshort *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertex4sv, "context = %d, v = 0x%016" PRIxPTR "", CID(context), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateVertex4sv(context, v));
+        if (isCallValid)
+        {
+            context->vertex4sv(v);
+        }
+        ANGLE_CAPTURE(Vertex4sv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Viewport(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLViewport, "context = %d, x = %d, y = %d, width = %d, height = %d",
+          CID(context), x, y, width, height);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateViewport(context, x, y, width, height));
+        if (isCallValid)
+        {
+            context->viewport(x, y, width, height);
+        }
+        ANGLE_CAPTURE(Viewport, isCallValid, context, x, y, width, height);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+// GL 1.1
+GLboolean GL_APIENTRY AreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLAreTexturesResident,
+          "context = %d, n = %d, textures = 0x%016" PRIxPTR ", residences = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)textures, (uintptr_t)residences);
+
+    GLboolean returnValue;
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateAreTexturesResident(context, n, textures, residences));
+        if (isCallValid)
+        {
+            returnValue = context->areTexturesResident(n, textures, residences);
+        }
+        else
+        {
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLAreTexturesResident, GLboolean>();
+        }
+        ANGLE_CAPTURE(AreTexturesResident, isCallValid, context, n, textures, residences,
+                      returnValue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLAreTexturesResident, GLboolean>();
+    }
+    return returnValue;
+}
+
+void GL_APIENTRY ArrayElement(GLint i)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLArrayElement, "context = %d, i = %d", CID(context), i);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateArrayElement(context, i));
+        if (isCallValid)
+        {
+            context->arrayElement(i);
+        }
+        ANGLE_CAPTURE(ArrayElement, isCallValid, context, i);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY BindTexture(GLenum target, GLuint texture)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLBindTexture, "context = %d, target = %s, texture = %u", CID(context),
+          GLenumToString(GLenumGroup::TextureTarget, target), texture);
+
+    if (context)
+    {
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateBindTexture(context, targetPacked, texturePacked));
+        if (isCallValid)
+        {
+            context->bindTexture(targetPacked, texturePacked);
+        }
+        ANGLE_CAPTURE(BindTexture, isCallValid, context, targetPacked, texturePacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ColorPointer(GLint size, GLenum type, GLsizei stride, const void *pointer)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColorPointer,
+          "context = %d, size = %d, type = %s, stride = %d, pointer = 0x%016" PRIxPTR "",
+          CID(context), size, GLenumToString(GLenumGroup::ColorPointerType, type), stride,
+          (uintptr_t)pointer);
+
+    if (context)
+    {
+        VertexAttribType typePacked                           = PackParam<VertexAttribType>(type);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateColorPointer(context, size, typePacked, stride, pointer));
+        if (isCallValid)
+        {
+            context->colorPointer(size, typePacked, stride, pointer);
+        }
+        ANGLE_CAPTURE(ColorPointer, isCallValid, context, size, typePacked, stride, pointer);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY CopyTexImage1D(GLenum target,
+                                GLint level,
+                                GLenum internalformat,
+                                GLint x,
+                                GLint y,
+                                GLsizei width,
+                                GLint border)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLCopyTexImage1D,
+          "context = %d, target = %s, level = %d, internalformat = %s, x = %d, y = %d, width = %d, "
+          "border = %d",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level,
+          GLenumToString(GLenumGroup::InternalFormat, internalformat), x, y, width, border);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateCopyTexImage1D(context, target, level, internalformat, x, y, width, border));
+        if (isCallValid)
+        {
+            context->copyTexImage1D(target, level, internalformat, x, y, width, border);
+        }
+        ANGLE_CAPTURE(CopyTexImage1D, isCallValid, context, target, level, internalformat, x, y,
+                      width, border);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY CopyTexImage2D(GLenum target,
+                                GLint level,
+                                GLenum internalformat,
+                                GLint x,
+                                GLint y,
+                                GLsizei width,
+                                GLsizei height,
+                                GLint border)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLCopyTexImage2D,
+          "context = %d, target = %s, level = %d, internalformat = %s, x = %d, y = %d, width = %d, "
+          "height = %d, border = %d",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level,
+          GLenumToString(GLenumGroup::InternalFormat, internalformat), x, y, width, height, border);
+
+    if (context)
+    {
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateCopyTexImage2D(context, targetPacked, level, internalformat, x,
+                                                   y, width, height, border));
+        if (isCallValid)
+        {
+            context->copyTexImage2D(targetPacked, level, internalformat, x, y, width, height,
+                                    border);
+        }
+        ANGLE_CAPTURE(CopyTexImage2D, isCallValid, context, targetPacked, level, internalformat, x,
+                      y, width, height, border);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY
+CopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLCopyTexSubImage1D,
+          "context = %d, target = %s, level = %d, xoffset = %d, x = %d, y = %d, width = %d",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, xoffset, x, y,
+          width);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateCopyTexSubImage1D(context, target, level, xoffset, x, y, width));
+        if (isCallValid)
+        {
+            context->copyTexSubImage1D(target, level, xoffset, x, y, width);
+        }
+        ANGLE_CAPTURE(CopyTexSubImage1D, isCallValid, context, target, level, xoffset, x, y, width);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY CopyTexSubImage2D(GLenum target,
+                                   GLint level,
+                                   GLint xoffset,
+                                   GLint yoffset,
+                                   GLint x,
+                                   GLint y,
+                                   GLsizei width,
+                                   GLsizei height)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLCopyTexSubImage2D,
+          "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, x = %d, y = %d, "
+          "width = %d, height = %d",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, xoffset, yoffset,
+          x, y, width, height);
+
+    if (context)
+    {
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateCopyTexSubImage2D(context, targetPacked, level, xoffset,
+                                                      yoffset, x, y, width, height));
+        if (isCallValid)
+        {
+            context->copyTexSubImage2D(targetPacked, level, xoffset, yoffset, x, y, width, height);
+        }
+        ANGLE_CAPTURE(CopyTexSubImage2D, isCallValid, context, targetPacked, level, xoffset,
+                      yoffset, x, y, width, height);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DeleteTextures(GLsizei n, const GLuint *textures)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDeleteTextures, "context = %d, n = %d, textures = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)textures);
+
+    if (context)
+    {
+        const TextureID *texturesPacked = PackParam<const TextureID *>(textures);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateDeleteTextures(context, n, texturesPacked));
+        if (isCallValid)
+        {
+            context->deleteTextures(n, texturesPacked);
+        }
+        ANGLE_CAPTURE(DeleteTextures, isCallValid, context, n, texturesPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DisableClientState(GLenum array)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDisableClientState, "context = %d, array = %s", CID(context),
+          GLenumToString(GLenumGroup::EnableCap, array));
+
+    if (context)
+    {
+        ClientVertexArrayType arrayPacked = PackParam<ClientVertexArrayType>(array);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateDisableClientState(context, arrayPacked));
+        if (isCallValid)
+        {
+            context->disableClientState(arrayPacked);
+        }
+        ANGLE_CAPTURE(DisableClientState, isCallValid, context, arrayPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DrawArrays(GLenum mode, GLint first, GLsizei count)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDrawArrays, "context = %d, mode = %s, first = %d, count = %d", CID(context),
+          GLenumToString(GLenumGroup::PrimitiveType, mode), first, count);
+
+    if (context)
+    {
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateDrawArrays(context, modePacked, first, count));
+        if (isCallValid)
+        {
+            context->drawArrays(modePacked, first, count);
+        }
+        ANGLE_CAPTURE(DrawArrays, isCallValid, context, modePacked, first, count);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DrawElements(GLenum mode, GLsizei count, GLenum type, const void *indices)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDrawElements,
+          "context = %d, mode = %s, count = %d, type = %s, indices = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), count,
+          GLenumToString(GLenumGroup::DrawElementsType, type), (uintptr_t)indices);
+
+    if (context)
+    {
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateDrawElements(context, modePacked, count, typePacked, indices));
+        if (isCallValid)
+        {
+            context->drawElements(modePacked, count, typePacked, indices);
+        }
+        ANGLE_CAPTURE(DrawElements, isCallValid, context, modePacked, count, typePacked, indices);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY EdgeFlagPointer(GLsizei stride, const void *pointer)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLEdgeFlagPointer, "context = %d, stride = %d, pointer = 0x%016" PRIxPTR "",
+          CID(context), stride, (uintptr_t)pointer);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateEdgeFlagPointer(context, stride, pointer));
+        if (isCallValid)
+        {
+            context->edgeFlagPointer(stride, pointer);
+        }
+        ANGLE_CAPTURE(EdgeFlagPointer, isCallValid, context, stride, pointer);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY EnableClientState(GLenum array)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLEnableClientState, "context = %d, array = %s", CID(context),
+          GLenumToString(GLenumGroup::EnableCap, array));
+
+    if (context)
+    {
+        ClientVertexArrayType arrayPacked = PackParam<ClientVertexArrayType>(array);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateEnableClientState(context, arrayPacked));
+        if (isCallValid)
+        {
+            context->enableClientState(arrayPacked);
+        }
+        ANGLE_CAPTURE(EnableClientState, isCallValid, context, arrayPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GenTextures(GLsizei n, GLuint *textures)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGenTextures, "context = %d, n = %d, textures = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)textures);
+
+    if (context)
+    {
+        TextureID *texturesPacked                             = PackParam<TextureID *>(textures);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGenTextures(context, n, texturesPacked));
+        if (isCallValid)
+        {
+            context->genTextures(n, texturesPacked);
+        }
+        ANGLE_CAPTURE(GenTextures, isCallValid, context, n, texturesPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetPointerv(GLenum pname, void **params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetPointerv, "context = %d, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::GetPointervPName, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGetPointerv(context, pname, params));
+        if (isCallValid)
+        {
+            context->getPointerv(pname, params);
+        }
+        ANGLE_CAPTURE(GetPointerv, isCallValid, context, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY IndexPointer(GLenum type, GLsizei stride, const void *pointer)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLIndexPointer,
+          "context = %d, type = %s, stride = %d, pointer = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::IndexPointerType, type), stride, (uintptr_t)pointer);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateIndexPointer(context, type, stride, pointer));
+        if (isCallValid)
+        {
+            context->indexPointer(type, stride, pointer);
+        }
+        ANGLE_CAPTURE(IndexPointer, isCallValid, context, type, stride, pointer);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Indexub(GLubyte c)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLIndexub, "context = %d, c = %d", CID(context), c);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateIndexub(context, c));
+        if (isCallValid)
+        {
+            context->indexub(c);
+        }
+        ANGLE_CAPTURE(Indexub, isCallValid, context, c);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Indexubv(const GLubyte *c)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLIndexubv, "context = %d, c = 0x%016" PRIxPTR "", CID(context), (uintptr_t)c);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateIndexubv(context, c));
+        if (isCallValid)
+        {
+            context->indexubv(c);
+        }
+        ANGLE_CAPTURE(Indexubv, isCallValid, context, c);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY InterleavedArrays(GLenum format, GLsizei stride, const void *pointer)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLInterleavedArrays,
+          "context = %d, format = %s, stride = %d, pointer = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::InterleavedArrayFormat, format), stride, (uintptr_t)pointer);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateInterleavedArrays(context, format, stride, pointer));
+        if (isCallValid)
+        {
+            context->interleavedArrays(format, stride, pointer);
+        }
+        ANGLE_CAPTURE(InterleavedArrays, isCallValid, context, format, stride, pointer);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+GLboolean GL_APIENTRY IsTexture(GLuint texture)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLIsTexture, "context = %d, texture = %u", CID(context), texture);
+
+    GLboolean returnValue;
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateIsTexture(context, texturePacked));
+        if (isCallValid)
+        {
+            returnValue = context->isTexture(texturePacked);
+        }
+        else
+        {
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsTexture, GLboolean>();
+        }
+        ANGLE_CAPTURE(IsTexture, isCallValid, context, texturePacked, returnValue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsTexture, GLboolean>();
+    }
+    return returnValue;
+}
+
+void GL_APIENTRY NormalPointer(GLenum type, GLsizei stride, const void *pointer)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLNormalPointer,
+          "context = %d, type = %s, stride = %d, pointer = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::NormalPointerType, type), stride, (uintptr_t)pointer);
+
+    if (context)
+    {
+        VertexAttribType typePacked                           = PackParam<VertexAttribType>(type);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateNormalPointer(context, typePacked, stride, pointer));
+        if (isCallValid)
+        {
+            context->normalPointer(typePacked, stride, pointer);
+        }
+        ANGLE_CAPTURE(NormalPointer, isCallValid, context, typePacked, stride, pointer);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY PolygonOffset(GLfloat factor, GLfloat units)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLPolygonOffset, "context = %d, factor = %f, units = %f", CID(context), factor,
+          units);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidatePolygonOffset(context, factor, units));
+        if (isCallValid)
+        {
+            context->polygonOffset(factor, units);
+        }
+        ANGLE_CAPTURE(PolygonOffset, isCallValid, context, factor, units);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY PopClientAttrib()
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLPopClientAttrib, "context = %d", CID(context));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidatePopClientAttrib(context));
+        if (isCallValid)
+        {
+            context->popClientAttrib();
+        }
+        ANGLE_CAPTURE(PopClientAttrib, isCallValid, context);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY PrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLPrioritizeTextures,
+          "context = %d, n = %d, textures = 0x%016" PRIxPTR ", priorities = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)textures, (uintptr_t)priorities);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidatePrioritizeTextures(context, n, textures, priorities));
+        if (isCallValid)
+        {
+            context->prioritizeTextures(n, textures, priorities);
+        }
+        ANGLE_CAPTURE(PrioritizeTextures, isCallValid, context, n, textures, priorities);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY PushClientAttrib(GLbitfield mask)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLPushClientAttrib, "context = %d, mask = %s", CID(context),
+          GLbitfieldToString(GLenumGroup::ClientAttribMask, mask).c_str());
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidatePushClientAttrib(context, mask));
+        if (isCallValid)
+        {
+            context->pushClientAttrib(mask);
+        }
+        ANGLE_CAPTURE(PushClientAttrib, isCallValid, context, mask);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoordPointer(GLint size, GLenum type, GLsizei stride, const void *pointer)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoordPointer,
+          "context = %d, size = %d, type = %s, stride = %d, pointer = 0x%016" PRIxPTR "",
+          CID(context), size, GLenumToString(GLenumGroup::TexCoordPointerType, type), stride,
+          (uintptr_t)pointer);
+
+    if (context)
+    {
+        VertexAttribType typePacked                           = PackParam<VertexAttribType>(type);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateTexCoordPointer(context, size, typePacked, stride, pointer));
+        if (isCallValid)
+        {
+            context->texCoordPointer(size, typePacked, stride, pointer);
+        }
+        ANGLE_CAPTURE(TexCoordPointer, isCallValid, context, size, typePacked, stride, pointer);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexSubImage1D(GLenum target,
+                               GLint level,
+                               GLint xoffset,
+                               GLsizei width,
+                               GLenum format,
+                               GLenum type,
+                               const void *pixels)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexSubImage1D,
+          "context = %d, target = %s, level = %d, xoffset = %d, width = %d, format = %s, type = "
+          "%s, pixels = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, xoffset, width,
+          GLenumToString(GLenumGroup::PixelFormat, format),
+          GLenumToString(GLenumGroup::PixelType, type), (uintptr_t)pixels);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateTexSubImage1D(context, target, level, xoffset, width, format, type, pixels));
+        if (isCallValid)
+        {
+            context->texSubImage1D(target, level, xoffset, width, format, type, pixels);
+        }
+        ANGLE_CAPTURE(TexSubImage1D, isCallValid, context, target, level, xoffset, width, format,
+                      type, pixels);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexSubImage2D(GLenum target,
+                               GLint level,
+                               GLint xoffset,
+                               GLint yoffset,
+                               GLsizei width,
+                               GLsizei height,
+                               GLenum format,
+                               GLenum type,
+                               const void *pixels)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexSubImage2D,
+          "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, width = %d, height = "
+          "%d, format = %s, type = %s, pixels = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, xoffset, yoffset,
+          width, height, GLenumToString(GLenumGroup::PixelFormat, format),
+          GLenumToString(GLenumGroup::PixelType, type), (uintptr_t)pixels);
+
+    if (context)
+    {
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateTexSubImage2D(context, targetPacked, level, xoffset, yoffset,
+                                                  width, height, format, type, pixels));
+        if (isCallValid)
+        {
+            context->texSubImage2D(targetPacked, level, xoffset, yoffset, width, height, format,
+                                   type, pixels);
+        }
+        ANGLE_CAPTURE(TexSubImage2D, isCallValid, context, targetPacked, level, xoffset, yoffset,
+                      width, height, format, type, pixels);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexPointer(GLint size, GLenum type, GLsizei stride, const void *pointer)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexPointer,
+          "context = %d, size = %d, type = %s, stride = %d, pointer = 0x%016" PRIxPTR "",
+          CID(context), size, GLenumToString(GLenumGroup::VertexPointerType, type), stride,
+          (uintptr_t)pointer);
+
+    if (context)
+    {
+        VertexAttribType typePacked                           = PackParam<VertexAttribType>(type);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateVertexPointer(context, size, typePacked, stride, pointer));
+        if (isCallValid)
+        {
+            context->vertexPointer(size, typePacked, stride, pointer);
+        }
+        ANGLE_CAPTURE(VertexPointer, isCallValid, context, size, typePacked, stride, pointer);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+// GL 1.2
+void GL_APIENTRY CopyTexSubImage3D(GLenum target,
+                                   GLint level,
+                                   GLint xoffset,
+                                   GLint yoffset,
+                                   GLint zoffset,
+                                   GLint x,
+                                   GLint y,
+                                   GLsizei width,
+                                   GLsizei height)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLCopyTexSubImage3D,
+          "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, x = "
+          "%d, y = %d, width = %d, height = %d",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, xoffset, yoffset,
+          zoffset, x, y, width, height);
+
+    if (context)
+    {
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateCopyTexSubImage3D(context, targetPacked, level, xoffset,
+                                                      yoffset, zoffset, x, y, width, height));
+        if (isCallValid)
+        {
+            context->copyTexSubImage3D(targetPacked, level, xoffset, yoffset, zoffset, x, y, width,
+                                       height);
+        }
+        ANGLE_CAPTURE(CopyTexSubImage3D, isCallValid, context, targetPacked, level, xoffset,
+                      yoffset, zoffset, x, y, width, height);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DrawRangeElements(GLenum mode,
+                                   GLuint start,
+                                   GLuint end,
+                                   GLsizei count,
+                                   GLenum type,
+                                   const void *indices)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDrawRangeElements,
+          "context = %d, mode = %s, start = %u, end = %u, count = %d, type = %s, indices = "
+          "0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), start, end, count,
+          GLenumToString(GLenumGroup::DrawElementsType, type), (uintptr_t)indices);
+
+    if (context)
+    {
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateDrawRangeElements(context, modePacked, start, end,
+                                                                    count, typePacked, indices));
+        if (isCallValid)
+        {
+            context->drawRangeElements(modePacked, start, end, count, typePacked, indices);
+        }
+        ANGLE_CAPTURE(DrawRangeElements, isCallValid, context, modePacked, start, end, count,
+                      typePacked, indices);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexImage3D(GLenum target,
+                            GLint level,
+                            GLint internalformat,
+                            GLsizei width,
+                            GLsizei height,
+                            GLsizei depth,
+                            GLint border,
+                            GLenum format,
+                            GLenum type,
+                            const void *pixels)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexImage3D,
+          "context = %d, target = %s, level = %d, internalformat = %d, width = %d, height = %d, "
+          "depth = %d, border = %d, format = %s, type = %s, pixels = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, internalformat,
+          width, height, depth, border, GLenumToString(GLenumGroup::PixelFormat, format),
+          GLenumToString(GLenumGroup::PixelType, type), (uintptr_t)pixels);
+
+    if (context)
+    {
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateTexImage3D(context, targetPacked, level, internalformat, width,
+                                               height, depth, border, format, type, pixels));
+        if (isCallValid)
+        {
+            context->texImage3D(targetPacked, level, internalformat, width, height, depth, border,
+                                format, type, pixels);
+        }
+        ANGLE_CAPTURE(TexImage3D, isCallValid, context, targetPacked, level, internalformat, width,
+                      height, depth, border, format, type, pixels);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexSubImage3D(GLenum target,
+                               GLint level,
+                               GLint xoffset,
+                               GLint yoffset,
+                               GLint zoffset,
+                               GLsizei width,
+                               GLsizei height,
+                               GLsizei depth,
+                               GLenum format,
+                               GLenum type,
+                               const void *pixels)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexSubImage3D,
+          "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, width "
+          "= %d, height = %d, depth = %d, format = %s, type = %s, pixels = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, xoffset, yoffset,
+          zoffset, width, height, depth, GLenumToString(GLenumGroup::PixelFormat, format),
+          GLenumToString(GLenumGroup::PixelType, type), (uintptr_t)pixels);
+
+    if (context)
+    {
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateTexSubImage3D(context, targetPacked, level, xoffset, yoffset, zoffset, width,
+                                   height, depth, format, type, pixels));
+        if (isCallValid)
+        {
+            context->texSubImage3D(targetPacked, level, xoffset, yoffset, zoffset, width, height,
+                                   depth, format, type, pixels);
+        }
+        ANGLE_CAPTURE(TexSubImage3D, isCallValid, context, targetPacked, level, xoffset, yoffset,
+                      zoffset, width, height, depth, format, type, pixels);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+// GL 1.3
+void GL_APIENTRY ActiveTexture(GLenum texture)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLActiveTexture, "context = %d, texture = %s", CID(context),
+          GLenumToString(GLenumGroup::TextureUnit, texture));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateActiveTexture(context, texture));
+        if (isCallValid)
+        {
+            context->activeTexture(texture);
+        }
+        ANGLE_CAPTURE(ActiveTexture, isCallValid, context, texture);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ClientActiveTexture(GLenum texture)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLClientActiveTexture, "context = %d, texture = %s", CID(context),
+          GLenumToString(GLenumGroup::TextureUnit, texture));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateClientActiveTexture(context, texture));
+        if (isCallValid)
+        {
+            context->clientActiveTexture(texture);
+        }
+        ANGLE_CAPTURE(ClientActiveTexture, isCallValid, context, texture);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY CompressedTexImage1D(GLenum target,
+                                      GLint level,
+                                      GLenum internalformat,
+                                      GLsizei width,
+                                      GLint border,
+                                      GLsizei imageSize,
+                                      const void *data)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLCompressedTexImage1D,
+          "context = %d, target = %s, level = %d, internalformat = %s, width = %d, border = %d, "
+          "imageSize = %d, data = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level,
+          GLenumToString(GLenumGroup::InternalFormat, internalformat), width, border, imageSize,
+          (uintptr_t)data);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateCompressedTexImage1D(context, target, level, internalformat,
+                                                         width, border, imageSize, data));
+        if (isCallValid)
+        {
+            context->compressedTexImage1D(target, level, internalformat, width, border, imageSize,
+                                          data);
+        }
+        ANGLE_CAPTURE(CompressedTexImage1D, isCallValid, context, target, level, internalformat,
+                      width, border, imageSize, data);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY CompressedTexImage2D(GLenum target,
+                                      GLint level,
+                                      GLenum internalformat,
+                                      GLsizei width,
+                                      GLsizei height,
+                                      GLint border,
+                                      GLsizei imageSize,
+                                      const void *data)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLCompressedTexImage2D,
+          "context = %d, target = %s, level = %d, internalformat = %s, width = %d, height = %d, "
+          "border = %d, imageSize = %d, data = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level,
+          GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height, border,
+          imageSize, (uintptr_t)data);
+
+    if (context)
+    {
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateCompressedTexImage2D(context, targetPacked, level, internalformat, width,
+                                          height, border, imageSize, data));
+        if (isCallValid)
+        {
+            context->compressedTexImage2D(targetPacked, level, internalformat, width, height,
+                                          border, imageSize, data);
+        }
+        ANGLE_CAPTURE(CompressedTexImage2D, isCallValid, context, targetPacked, level,
+                      internalformat, width, height, border, imageSize, data);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY CompressedTexImage3D(GLenum target,
+                                      GLint level,
+                                      GLenum internalformat,
+                                      GLsizei width,
+                                      GLsizei height,
+                                      GLsizei depth,
+                                      GLint border,
+                                      GLsizei imageSize,
+                                      const void *data)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLCompressedTexImage3D,
+          "context = %d, target = %s, level = %d, internalformat = %s, width = %d, height = %d, "
+          "depth = %d, border = %d, imageSize = %d, data = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level,
+          GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height, depth, border,
+          imageSize, (uintptr_t)data);
+
+    if (context)
+    {
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateCompressedTexImage3D(context, targetPacked, level, internalformat, width,
+                                          height, depth, border, imageSize, data));
+        if (isCallValid)
+        {
+            context->compressedTexImage3D(targetPacked, level, internalformat, width, height, depth,
+                                          border, imageSize, data);
+        }
+        ANGLE_CAPTURE(CompressedTexImage3D, isCallValid, context, targetPacked, level,
+                      internalformat, width, height, depth, border, imageSize, data);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY CompressedTexSubImage1D(GLenum target,
+                                         GLint level,
+                                         GLint xoffset,
+                                         GLsizei width,
+                                         GLenum format,
+                                         GLsizei imageSize,
+                                         const void *data)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLCompressedTexSubImage1D,
+          "context = %d, target = %s, level = %d, xoffset = %d, width = %d, format = %s, imageSize "
+          "= %d, data = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, xoffset, width,
+          GLenumToString(GLenumGroup::PixelFormat, format), imageSize, (uintptr_t)data);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateCompressedTexSubImage1D(context, target, level, xoffset, width,
+                                                            format, imageSize, data));
+        if (isCallValid)
+        {
+            context->compressedTexSubImage1D(target, level, xoffset, width, format, imageSize,
+                                             data);
+        }
+        ANGLE_CAPTURE(CompressedTexSubImage1D, isCallValid, context, target, level, xoffset, width,
+                      format, imageSize, data);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY CompressedTexSubImage2D(GLenum target,
+                                         GLint level,
+                                         GLint xoffset,
+                                         GLint yoffset,
+                                         GLsizei width,
+                                         GLsizei height,
+                                         GLenum format,
+                                         GLsizei imageSize,
+                                         const void *data)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLCompressedTexSubImage2D,
+          "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, width = %d, height = "
+          "%d, format = %s, imageSize = %d, data = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, xoffset, yoffset,
+          width, height, GLenumToString(GLenumGroup::PixelFormat, format), imageSize,
+          (uintptr_t)data);
+
+    if (context)
+    {
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateCompressedTexSubImage2D(context, targetPacked, level, xoffset, yoffset, width,
+                                             height, format, imageSize, data));
+        if (isCallValid)
+        {
+            context->compressedTexSubImage2D(targetPacked, level, xoffset, yoffset, width, height,
+                                             format, imageSize, data);
+        }
+        ANGLE_CAPTURE(CompressedTexSubImage2D, isCallValid, context, targetPacked, level, xoffset,
+                      yoffset, width, height, format, imageSize, data);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY CompressedTexSubImage3D(GLenum target,
+                                         GLint level,
+                                         GLint xoffset,
+                                         GLint yoffset,
+                                         GLint zoffset,
+                                         GLsizei width,
+                                         GLsizei height,
+                                         GLsizei depth,
+                                         GLenum format,
+                                         GLsizei imageSize,
+                                         const void *data)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLCompressedTexSubImage3D,
+          "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, width "
+          "= %d, height = %d, depth = %d, format = %s, imageSize = %d, data = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, xoffset, yoffset,
+          zoffset, width, height, depth, GLenumToString(GLenumGroup::PixelFormat, format),
+          imageSize, (uintptr_t)data);
+
+    if (context)
+    {
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateCompressedTexSubImage3D(context, targetPacked, level, xoffset,
+                                                            yoffset, zoffset, width, height, depth,
+                                                            format, imageSize, data));
+        if (isCallValid)
+        {
+            context->compressedTexSubImage3D(targetPacked, level, xoffset, yoffset, zoffset, width,
+                                             height, depth, format, imageSize, data);
+        }
+        ANGLE_CAPTURE(CompressedTexSubImage3D, isCallValid, context, targetPacked, level, xoffset,
+                      yoffset, zoffset, width, height, depth, format, imageSize, data);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetCompressedTexImage(GLenum target, GLint level, void *img)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetCompressedTexImage,
+          "context = %d, target = %s, level = %d, img = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::TextureTarget, target), level, (uintptr_t)img);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetCompressedTexImage(context, target, level, img));
+        if (isCallValid)
+        {
+            context->getCompressedTexImage(target, level, img);
+        }
+        ANGLE_CAPTURE(GetCompressedTexImage, isCallValid, context, target, level, img);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY LoadTransposeMatrixd(const GLdouble *m)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLLoadTransposeMatrixd, "context = %d, m = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)m);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateLoadTransposeMatrixd(context, m));
+        if (isCallValid)
+        {
+            context->loadTransposeMatrixd(m);
+        }
+        ANGLE_CAPTURE(LoadTransposeMatrixd, isCallValid, context, m);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY LoadTransposeMatrixf(const GLfloat *m)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLLoadTransposeMatrixf, "context = %d, m = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)m);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateLoadTransposeMatrixf(context, m));
+        if (isCallValid)
+        {
+            context->loadTransposeMatrixf(m);
+        }
+        ANGLE_CAPTURE(LoadTransposeMatrixf, isCallValid, context, m);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultTransposeMatrixd(const GLdouble *m)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultTransposeMatrixd, "context = %d, m = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)m);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateMultTransposeMatrixd(context, m));
+        if (isCallValid)
+        {
+            context->multTransposeMatrixd(m);
+        }
+        ANGLE_CAPTURE(MultTransposeMatrixd, isCallValid, context, m);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultTransposeMatrixf(const GLfloat *m)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultTransposeMatrixf, "context = %d, m = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)m);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateMultTransposeMatrixf(context, m));
+        if (isCallValid)
+        {
+            context->multTransposeMatrixf(m);
+        }
+        ANGLE_CAPTURE(MultTransposeMatrixf, isCallValid, context, m);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiTexCoord1d(GLenum target, GLdouble s)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoord1d, "context = %d, target = %s, s = %f", CID(context),
+          GLenumToString(GLenumGroup::TextureUnit, target), s);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMultiTexCoord1d(context, target, s));
+        if (isCallValid)
+        {
+            context->multiTexCoord1d(target, s);
+        }
+        ANGLE_CAPTURE(MultiTexCoord1d, isCallValid, context, target, s);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiTexCoord1dv(GLenum target, const GLdouble *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoord1dv, "context = %d, target = %s, v = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureUnit, target), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMultiTexCoord1dv(context, target, v));
+        if (isCallValid)
+        {
+            context->multiTexCoord1dv(target, v);
+        }
+        ANGLE_CAPTURE(MultiTexCoord1dv, isCallValid, context, target, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiTexCoord1f(GLenum target, GLfloat s)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoord1f, "context = %d, target = %s, s = %f", CID(context),
+          GLenumToString(GLenumGroup::TextureUnit, target), s);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMultiTexCoord1f(context, target, s));
+        if (isCallValid)
+        {
+            context->multiTexCoord1f(target, s);
+        }
+        ANGLE_CAPTURE(MultiTexCoord1f, isCallValid, context, target, s);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiTexCoord1fv(GLenum target, const GLfloat *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoord1fv, "context = %d, target = %s, v = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureUnit, target), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMultiTexCoord1fv(context, target, v));
+        if (isCallValid)
+        {
+            context->multiTexCoord1fv(target, v);
+        }
+        ANGLE_CAPTURE(MultiTexCoord1fv, isCallValid, context, target, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiTexCoord1i(GLenum target, GLint s)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoord1i, "context = %d, target = %s, s = %d", CID(context),
+          GLenumToString(GLenumGroup::TextureUnit, target), s);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMultiTexCoord1i(context, target, s));
+        if (isCallValid)
+        {
+            context->multiTexCoord1i(target, s);
+        }
+        ANGLE_CAPTURE(MultiTexCoord1i, isCallValid, context, target, s);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiTexCoord1iv(GLenum target, const GLint *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoord1iv, "context = %d, target = %s, v = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureUnit, target), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMultiTexCoord1iv(context, target, v));
+        if (isCallValid)
+        {
+            context->multiTexCoord1iv(target, v);
+        }
+        ANGLE_CAPTURE(MultiTexCoord1iv, isCallValid, context, target, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiTexCoord1s(GLenum target, GLshort s)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoord1s, "context = %d, target = %s, s = %d", CID(context),
+          GLenumToString(GLenumGroup::TextureUnit, target), s);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMultiTexCoord1s(context, target, s));
+        if (isCallValid)
+        {
+            context->multiTexCoord1s(target, s);
+        }
+        ANGLE_CAPTURE(MultiTexCoord1s, isCallValid, context, target, s);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiTexCoord1sv(GLenum target, const GLshort *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoord1sv, "context = %d, target = %s, v = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureUnit, target), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMultiTexCoord1sv(context, target, v));
+        if (isCallValid)
+        {
+            context->multiTexCoord1sv(target, v);
+        }
+        ANGLE_CAPTURE(MultiTexCoord1sv, isCallValid, context, target, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiTexCoord2d(GLenum target, GLdouble s, GLdouble t)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoord2d, "context = %d, target = %s, s = %f, t = %f", CID(context),
+          GLenumToString(GLenumGroup::TextureUnit, target), s, t);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMultiTexCoord2d(context, target, s, t));
+        if (isCallValid)
+        {
+            context->multiTexCoord2d(target, s, t);
+        }
+        ANGLE_CAPTURE(MultiTexCoord2d, isCallValid, context, target, s, t);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiTexCoord2dv(GLenum target, const GLdouble *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoord2dv, "context = %d, target = %s, v = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureUnit, target), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMultiTexCoord2dv(context, target, v));
+        if (isCallValid)
+        {
+            context->multiTexCoord2dv(target, v);
+        }
+        ANGLE_CAPTURE(MultiTexCoord2dv, isCallValid, context, target, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiTexCoord2f(GLenum target, GLfloat s, GLfloat t)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoord2f, "context = %d, target = %s, s = %f, t = %f", CID(context),
+          GLenumToString(GLenumGroup::TextureUnit, target), s, t);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMultiTexCoord2f(context, target, s, t));
+        if (isCallValid)
+        {
+            context->multiTexCoord2f(target, s, t);
+        }
+        ANGLE_CAPTURE(MultiTexCoord2f, isCallValid, context, target, s, t);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiTexCoord2fv(GLenum target, const GLfloat *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoord2fv, "context = %d, target = %s, v = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureUnit, target), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMultiTexCoord2fv(context, target, v));
+        if (isCallValid)
+        {
+            context->multiTexCoord2fv(target, v);
+        }
+        ANGLE_CAPTURE(MultiTexCoord2fv, isCallValid, context, target, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiTexCoord2i(GLenum target, GLint s, GLint t)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoord2i, "context = %d, target = %s, s = %d, t = %d", CID(context),
+          GLenumToString(GLenumGroup::TextureUnit, target), s, t);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMultiTexCoord2i(context, target, s, t));
+        if (isCallValid)
+        {
+            context->multiTexCoord2i(target, s, t);
+        }
+        ANGLE_CAPTURE(MultiTexCoord2i, isCallValid, context, target, s, t);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiTexCoord2iv(GLenum target, const GLint *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoord2iv, "context = %d, target = %s, v = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureUnit, target), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMultiTexCoord2iv(context, target, v));
+        if (isCallValid)
+        {
+            context->multiTexCoord2iv(target, v);
+        }
+        ANGLE_CAPTURE(MultiTexCoord2iv, isCallValid, context, target, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiTexCoord2s(GLenum target, GLshort s, GLshort t)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoord2s, "context = %d, target = %s, s = %d, t = %d", CID(context),
+          GLenumToString(GLenumGroup::TextureUnit, target), s, t);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMultiTexCoord2s(context, target, s, t));
+        if (isCallValid)
+        {
+            context->multiTexCoord2s(target, s, t);
+        }
+        ANGLE_CAPTURE(MultiTexCoord2s, isCallValid, context, target, s, t);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiTexCoord2sv(GLenum target, const GLshort *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoord2sv, "context = %d, target = %s, v = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureUnit, target), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMultiTexCoord2sv(context, target, v));
+        if (isCallValid)
+        {
+            context->multiTexCoord2sv(target, v);
+        }
+        ANGLE_CAPTURE(MultiTexCoord2sv, isCallValid, context, target, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoord3d, "context = %d, target = %s, s = %f, t = %f, r = %f",
+          CID(context), GLenumToString(GLenumGroup::TextureUnit, target), s, t, r);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMultiTexCoord3d(context, target, s, t, r));
+        if (isCallValid)
+        {
+            context->multiTexCoord3d(target, s, t, r);
+        }
+        ANGLE_CAPTURE(MultiTexCoord3d, isCallValid, context, target, s, t, r);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiTexCoord3dv(GLenum target, const GLdouble *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoord3dv, "context = %d, target = %s, v = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureUnit, target), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMultiTexCoord3dv(context, target, v));
+        if (isCallValid)
+        {
+            context->multiTexCoord3dv(target, v);
+        }
+        ANGLE_CAPTURE(MultiTexCoord3dv, isCallValid, context, target, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoord3f, "context = %d, target = %s, s = %f, t = %f, r = %f",
+          CID(context), GLenumToString(GLenumGroup::TextureUnit, target), s, t, r);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMultiTexCoord3f(context, target, s, t, r));
+        if (isCallValid)
+        {
+            context->multiTexCoord3f(target, s, t, r);
+        }
+        ANGLE_CAPTURE(MultiTexCoord3f, isCallValid, context, target, s, t, r);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiTexCoord3fv(GLenum target, const GLfloat *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoord3fv, "context = %d, target = %s, v = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureUnit, target), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMultiTexCoord3fv(context, target, v));
+        if (isCallValid)
+        {
+            context->multiTexCoord3fv(target, v);
+        }
+        ANGLE_CAPTURE(MultiTexCoord3fv, isCallValid, context, target, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoord3i, "context = %d, target = %s, s = %d, t = %d, r = %d",
+          CID(context), GLenumToString(GLenumGroup::TextureUnit, target), s, t, r);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMultiTexCoord3i(context, target, s, t, r));
+        if (isCallValid)
+        {
+            context->multiTexCoord3i(target, s, t, r);
+        }
+        ANGLE_CAPTURE(MultiTexCoord3i, isCallValid, context, target, s, t, r);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiTexCoord3iv(GLenum target, const GLint *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoord3iv, "context = %d, target = %s, v = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureUnit, target), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMultiTexCoord3iv(context, target, v));
+        if (isCallValid)
+        {
+            context->multiTexCoord3iv(target, v);
+        }
+        ANGLE_CAPTURE(MultiTexCoord3iv, isCallValid, context, target, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoord3s, "context = %d, target = %s, s = %d, t = %d, r = %d",
+          CID(context), GLenumToString(GLenumGroup::TextureUnit, target), s, t, r);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMultiTexCoord3s(context, target, s, t, r));
+        if (isCallValid)
+        {
+            context->multiTexCoord3s(target, s, t, r);
+        }
+        ANGLE_CAPTURE(MultiTexCoord3s, isCallValid, context, target, s, t, r);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiTexCoord3sv(GLenum target, const GLshort *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoord3sv, "context = %d, target = %s, v = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureUnit, target), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMultiTexCoord3sv(context, target, v));
+        if (isCallValid)
+        {
+            context->multiTexCoord3sv(target, v);
+        }
+        ANGLE_CAPTURE(MultiTexCoord3sv, isCallValid, context, target, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoord4d, "context = %d, target = %s, s = %f, t = %f, r = %f, q = %f",
+          CID(context), GLenumToString(GLenumGroup::TextureUnit, target), s, t, r, q);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMultiTexCoord4d(context, target, s, t, r, q));
+        if (isCallValid)
+        {
+            context->multiTexCoord4d(target, s, t, r, q);
+        }
+        ANGLE_CAPTURE(MultiTexCoord4d, isCallValid, context, target, s, t, r, q);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiTexCoord4dv(GLenum target, const GLdouble *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoord4dv, "context = %d, target = %s, v = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureUnit, target), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMultiTexCoord4dv(context, target, v));
+        if (isCallValid)
+        {
+            context->multiTexCoord4dv(target, v);
+        }
+        ANGLE_CAPTURE(MultiTexCoord4dv, isCallValid, context, target, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoord4f, "context = %d, target = %s, s = %f, t = %f, r = %f, q = %f",
+          CID(context), GLenumToString(GLenumGroup::TextureUnit, target), s, t, r, q);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMultiTexCoord4f(context, target, s, t, r, q));
+        if (isCallValid)
+        {
+            context->multiTexCoord4f(target, s, t, r, q);
+        }
+        ANGLE_CAPTURE(MultiTexCoord4f, isCallValid, context, target, s, t, r, q);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiTexCoord4fv(GLenum target, const GLfloat *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoord4fv, "context = %d, target = %s, v = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureUnit, target), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMultiTexCoord4fv(context, target, v));
+        if (isCallValid)
+        {
+            context->multiTexCoord4fv(target, v);
+        }
+        ANGLE_CAPTURE(MultiTexCoord4fv, isCallValid, context, target, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoord4i, "context = %d, target = %s, s = %d, t = %d, r = %d, q = %d",
+          CID(context), GLenumToString(GLenumGroup::TextureUnit, target), s, t, r, q);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMultiTexCoord4i(context, target, s, t, r, q));
+        if (isCallValid)
+        {
+            context->multiTexCoord4i(target, s, t, r, q);
+        }
+        ANGLE_CAPTURE(MultiTexCoord4i, isCallValid, context, target, s, t, r, q);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiTexCoord4iv(GLenum target, const GLint *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoord4iv, "context = %d, target = %s, v = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureUnit, target), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMultiTexCoord4iv(context, target, v));
+        if (isCallValid)
+        {
+            context->multiTexCoord4iv(target, v);
+        }
+        ANGLE_CAPTURE(MultiTexCoord4iv, isCallValid, context, target, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoord4s, "context = %d, target = %s, s = %d, t = %d, r = %d, q = %d",
+          CID(context), GLenumToString(GLenumGroup::TextureUnit, target), s, t, r, q);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMultiTexCoord4s(context, target, s, t, r, q));
+        if (isCallValid)
+        {
+            context->multiTexCoord4s(target, s, t, r, q);
+        }
+        ANGLE_CAPTURE(MultiTexCoord4s, isCallValid, context, target, s, t, r, q);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiTexCoord4sv(GLenum target, const GLshort *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoord4sv, "context = %d, target = %s, v = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureUnit, target), (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMultiTexCoord4sv(context, target, v));
+        if (isCallValid)
+        {
+            context->multiTexCoord4sv(target, v);
+        }
+        ANGLE_CAPTURE(MultiTexCoord4sv, isCallValid, context, target, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY SampleCoverage(GLfloat value, GLboolean invert)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLSampleCoverage, "context = %d, value = %f, invert = %s", CID(context), value,
+          GLbooleanToString(invert));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateSampleCoverage(context, value, invert));
+        if (isCallValid)
+        {
+            context->sampleCoverage(value, invert);
+        }
+        ANGLE_CAPTURE(SampleCoverage, isCallValid, context, value, invert);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+// GL 1.4
+void GL_APIENTRY BlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLBlendColor, "context = %d, red = %f, green = %f, blue = %f, alpha = %f",
+          CID(context), red, green, blue, alpha);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateBlendColor(context, red, green, blue, alpha));
+        if (isCallValid)
+        {
+            context->blendColor(red, green, blue, alpha);
+        }
+        ANGLE_CAPTURE(BlendColor, isCallValid, context, red, green, blue, alpha);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY BlendEquation(GLenum mode)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLBlendEquation, "context = %d, mode = %s", CID(context),
+          GLenumToString(GLenumGroup::BlendEquationModeEXT, mode));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateBlendEquation(context, mode));
+        if (isCallValid)
+        {
+            context->blendEquation(mode);
+        }
+        ANGLE_CAPTURE(BlendEquation, isCallValid, context, mode);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY BlendFuncSeparate(GLenum sfactorRGB,
+                                   GLenum dfactorRGB,
+                                   GLenum sfactorAlpha,
+                                   GLenum dfactorAlpha)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLBlendFuncSeparate,
+          "context = %d, sfactorRGB = %s, dfactorRGB = %s, sfactorAlpha = %s, dfactorAlpha = %s",
+          CID(context), GLenumToString(GLenumGroup::BlendingFactor, sfactorRGB),
+          GLenumToString(GLenumGroup::BlendingFactor, dfactorRGB),
+          GLenumToString(GLenumGroup::BlendingFactor, sfactorAlpha),
+          GLenumToString(GLenumGroup::BlendingFactor, dfactorAlpha));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateBlendFuncSeparate(context, sfactorRGB, dfactorRGB,
+                                                                    sfactorAlpha, dfactorAlpha));
+        if (isCallValid)
+        {
+            context->blendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
+        }
+        ANGLE_CAPTURE(BlendFuncSeparate, isCallValid, context, sfactorRGB, dfactorRGB, sfactorAlpha,
+                      dfactorAlpha);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY FogCoordPointer(GLenum type, GLsizei stride, const void *pointer)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLFogCoordPointer,
+          "context = %d, type = %s, stride = %d, pointer = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::FogPointerTypeEXT, type), stride, (uintptr_t)pointer);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateFogCoordPointer(context, type, stride, pointer));
+        if (isCallValid)
+        {
+            context->fogCoordPointer(type, stride, pointer);
+        }
+        ANGLE_CAPTURE(FogCoordPointer, isCallValid, context, type, stride, pointer);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY FogCoordd(GLdouble coord)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLFogCoordd, "context = %d, coord = %f", CID(context), coord);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateFogCoordd(context, coord));
+        if (isCallValid)
+        {
+            context->fogCoordd(coord);
+        }
+        ANGLE_CAPTURE(FogCoordd, isCallValid, context, coord);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY FogCoorddv(const GLdouble *coord)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLFogCoorddv, "context = %d, coord = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)coord);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateFogCoorddv(context, coord));
+        if (isCallValid)
+        {
+            context->fogCoorddv(coord);
+        }
+        ANGLE_CAPTURE(FogCoorddv, isCallValid, context, coord);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY FogCoordf(GLfloat coord)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLFogCoordf, "context = %d, coord = %f", CID(context), coord);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateFogCoordf(context, coord));
+        if (isCallValid)
+        {
+            context->fogCoordf(coord);
+        }
+        ANGLE_CAPTURE(FogCoordf, isCallValid, context, coord);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY FogCoordfv(const GLfloat *coord)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLFogCoordfv, "context = %d, coord = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)coord);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateFogCoordfv(context, coord));
+        if (isCallValid)
+        {
+            context->fogCoordfv(coord);
+        }
+        ANGLE_CAPTURE(FogCoordfv, isCallValid, context, coord);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiDrawArrays(GLenum mode,
+                                 const GLint *first,
+                                 const GLsizei *count,
+                                 GLsizei drawcount)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiDrawArrays,
+          "context = %d, mode = %s, first = 0x%016" PRIxPTR ", count = 0x%016" PRIxPTR
+          ", drawcount = %d",
+          CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), (uintptr_t)first,
+          (uintptr_t)count, drawcount);
+
+    if (context)
+    {
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateMultiDrawArrays(context, modePacked, first, count, drawcount));
+        if (isCallValid)
+        {
+            context->multiDrawArrays(modePacked, first, count, drawcount);
+        }
+        ANGLE_CAPTURE(MultiDrawArrays, isCallValid, context, modePacked, first, count, drawcount);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiDrawElements(GLenum mode,
+                                   const GLsizei *count,
+                                   GLenum type,
+                                   const void *const *indices,
+                                   GLsizei drawcount)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiDrawElements,
+          "context = %d, mode = %s, count = 0x%016" PRIxPTR ", type = %s, indices = 0x%016" PRIxPTR
+          ", drawcount = %d",
+          CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), (uintptr_t)count,
+          GLenumToString(GLenumGroup::DrawElementsType, type), (uintptr_t)indices, drawcount);
+
+    if (context)
+    {
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateMultiDrawElements(context, modePacked, count, typePacked, indices, drawcount));
+        if (isCallValid)
+        {
+            context->multiDrawElements(modePacked, count, typePacked, indices, drawcount);
+        }
+        ANGLE_CAPTURE(MultiDrawElements, isCallValid, context, modePacked, count, typePacked,
+                      indices, drawcount);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY PointParameterf(GLenum pname, GLfloat param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLPointParameterf, "context = %d, pname = %s, param = %f", CID(context),
+          GLenumToString(GLenumGroup::DefaultGroup, pname), param);
+
+    if (context)
+    {
+        PointParameter pnamePacked                            = PackParam<PointParameter>(pname);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidatePointParameterf(context, pnamePacked, param));
+        if (isCallValid)
+        {
+            context->pointParameterf(pnamePacked, param);
+        }
+        ANGLE_CAPTURE(PointParameterf, isCallValid, context, pnamePacked, param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY PointParameterfv(GLenum pname, const GLfloat *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLPointParameterfv, "context = %d, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        PointParameter pnamePacked                            = PackParam<PointParameter>(pname);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidatePointParameterfv(context, pnamePacked, params));
+        if (isCallValid)
+        {
+            context->pointParameterfv(pnamePacked, params);
+        }
+        ANGLE_CAPTURE(PointParameterfv, isCallValid, context, pnamePacked, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY PointParameteri(GLenum pname, GLint param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLPointParameteri, "context = %d, pname = %s, param = %d", CID(context),
+          GLenumToString(GLenumGroup::DefaultGroup, pname), param);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidatePointParameteri(context, pname, param));
+        if (isCallValid)
+        {
+            context->pointParameteri(pname, param);
+        }
+        ANGLE_CAPTURE(PointParameteri, isCallValid, context, pname, param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY PointParameteriv(GLenum pname, const GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLPointParameteriv, "context = %d, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidatePointParameteriv(context, pname, params));
+        if (isCallValid)
+        {
+            context->pointParameteriv(pname, params);
+        }
+        ANGLE_CAPTURE(PointParameteriv, isCallValid, context, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY SecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLSecondaryColor3b, "context = %d, red = %d, green = %d, blue = %d",
+          CID(context), red, green, blue);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateSecondaryColor3b(context, red, green, blue));
+        if (isCallValid)
+        {
+            context->secondaryColor3b(red, green, blue);
+        }
+        ANGLE_CAPTURE(SecondaryColor3b, isCallValid, context, red, green, blue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY SecondaryColor3bv(const GLbyte *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLSecondaryColor3bv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateSecondaryColor3bv(context, v));
+        if (isCallValid)
+        {
+            context->secondaryColor3bv(v);
+        }
+        ANGLE_CAPTURE(SecondaryColor3bv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY SecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLSecondaryColor3d, "context = %d, red = %f, green = %f, blue = %f",
+          CID(context), red, green, blue);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateSecondaryColor3d(context, red, green, blue));
+        if (isCallValid)
+        {
+            context->secondaryColor3d(red, green, blue);
+        }
+        ANGLE_CAPTURE(SecondaryColor3d, isCallValid, context, red, green, blue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY SecondaryColor3dv(const GLdouble *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLSecondaryColor3dv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateSecondaryColor3dv(context, v));
+        if (isCallValid)
+        {
+            context->secondaryColor3dv(v);
+        }
+        ANGLE_CAPTURE(SecondaryColor3dv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY SecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLSecondaryColor3f, "context = %d, red = %f, green = %f, blue = %f",
+          CID(context), red, green, blue);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateSecondaryColor3f(context, red, green, blue));
+        if (isCallValid)
+        {
+            context->secondaryColor3f(red, green, blue);
+        }
+        ANGLE_CAPTURE(SecondaryColor3f, isCallValid, context, red, green, blue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY SecondaryColor3fv(const GLfloat *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLSecondaryColor3fv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateSecondaryColor3fv(context, v));
+        if (isCallValid)
+        {
+            context->secondaryColor3fv(v);
+        }
+        ANGLE_CAPTURE(SecondaryColor3fv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY SecondaryColor3i(GLint red, GLint green, GLint blue)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLSecondaryColor3i, "context = %d, red = %d, green = %d, blue = %d",
+          CID(context), red, green, blue);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateSecondaryColor3i(context, red, green, blue));
+        if (isCallValid)
+        {
+            context->secondaryColor3i(red, green, blue);
+        }
+        ANGLE_CAPTURE(SecondaryColor3i, isCallValid, context, red, green, blue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY SecondaryColor3iv(const GLint *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLSecondaryColor3iv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateSecondaryColor3iv(context, v));
+        if (isCallValid)
+        {
+            context->secondaryColor3iv(v);
+        }
+        ANGLE_CAPTURE(SecondaryColor3iv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY SecondaryColor3s(GLshort red, GLshort green, GLshort blue)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLSecondaryColor3s, "context = %d, red = %d, green = %d, blue = %d",
+          CID(context), red, green, blue);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateSecondaryColor3s(context, red, green, blue));
+        if (isCallValid)
+        {
+            context->secondaryColor3s(red, green, blue);
+        }
+        ANGLE_CAPTURE(SecondaryColor3s, isCallValid, context, red, green, blue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY SecondaryColor3sv(const GLshort *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLSecondaryColor3sv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateSecondaryColor3sv(context, v));
+        if (isCallValid)
+        {
+            context->secondaryColor3sv(v);
+        }
+        ANGLE_CAPTURE(SecondaryColor3sv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY SecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLSecondaryColor3ub, "context = %d, red = %d, green = %d, blue = %d",
+          CID(context), red, green, blue);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateSecondaryColor3ub(context, red, green, blue));
+        if (isCallValid)
+        {
+            context->secondaryColor3ub(red, green, blue);
+        }
+        ANGLE_CAPTURE(SecondaryColor3ub, isCallValid, context, red, green, blue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY SecondaryColor3ubv(const GLubyte *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLSecondaryColor3ubv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateSecondaryColor3ubv(context, v));
+        if (isCallValid)
+        {
+            context->secondaryColor3ubv(v);
+        }
+        ANGLE_CAPTURE(SecondaryColor3ubv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY SecondaryColor3ui(GLuint red, GLuint green, GLuint blue)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLSecondaryColor3ui, "context = %d, red = %u, green = %u, blue = %u",
+          CID(context), red, green, blue);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateSecondaryColor3ui(context, red, green, blue));
+        if (isCallValid)
+        {
+            context->secondaryColor3ui(red, green, blue);
+        }
+        ANGLE_CAPTURE(SecondaryColor3ui, isCallValid, context, red, green, blue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY SecondaryColor3uiv(const GLuint *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLSecondaryColor3uiv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateSecondaryColor3uiv(context, v));
+        if (isCallValid)
+        {
+            context->secondaryColor3uiv(v);
+        }
+        ANGLE_CAPTURE(SecondaryColor3uiv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY SecondaryColor3us(GLushort red, GLushort green, GLushort blue)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLSecondaryColor3us, "context = %d, red = %u, green = %u, blue = %u",
+          CID(context), red, green, blue);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateSecondaryColor3us(context, red, green, blue));
+        if (isCallValid)
+        {
+            context->secondaryColor3us(red, green, blue);
+        }
+        ANGLE_CAPTURE(SecondaryColor3us, isCallValid, context, red, green, blue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY SecondaryColor3usv(const GLushort *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLSecondaryColor3usv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateSecondaryColor3usv(context, v));
+        if (isCallValid)
+        {
+            context->secondaryColor3usv(v);
+        }
+        ANGLE_CAPTURE(SecondaryColor3usv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY SecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const void *pointer)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLSecondaryColorPointer,
+          "context = %d, size = %d, type = %s, stride = %d, pointer = 0x%016" PRIxPTR "",
+          CID(context), size, GLenumToString(GLenumGroup::ColorPointerType, type), stride,
+          (uintptr_t)pointer);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateSecondaryColorPointer(context, size, type, stride, pointer));
+        if (isCallValid)
+        {
+            context->secondaryColorPointer(size, type, stride, pointer);
+        }
+        ANGLE_CAPTURE(SecondaryColorPointer, isCallValid, context, size, type, stride, pointer);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY WindowPos2d(GLdouble x, GLdouble y)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLWindowPos2d, "context = %d, x = %f, y = %f", CID(context), x, y);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateWindowPos2d(context, x, y));
+        if (isCallValid)
+        {
+            context->windowPos2d(x, y);
+        }
+        ANGLE_CAPTURE(WindowPos2d, isCallValid, context, x, y);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY WindowPos2dv(const GLdouble *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLWindowPos2dv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateWindowPos2dv(context, v));
+        if (isCallValid)
+        {
+            context->windowPos2dv(v);
+        }
+        ANGLE_CAPTURE(WindowPos2dv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY WindowPos2f(GLfloat x, GLfloat y)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLWindowPos2f, "context = %d, x = %f, y = %f", CID(context), x, y);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateWindowPos2f(context, x, y));
+        if (isCallValid)
+        {
+            context->windowPos2f(x, y);
+        }
+        ANGLE_CAPTURE(WindowPos2f, isCallValid, context, x, y);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY WindowPos2fv(const GLfloat *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLWindowPos2fv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateWindowPos2fv(context, v));
+        if (isCallValid)
+        {
+            context->windowPos2fv(v);
+        }
+        ANGLE_CAPTURE(WindowPos2fv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY WindowPos2i(GLint x, GLint y)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLWindowPos2i, "context = %d, x = %d, y = %d", CID(context), x, y);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateWindowPos2i(context, x, y));
+        if (isCallValid)
+        {
+            context->windowPos2i(x, y);
+        }
+        ANGLE_CAPTURE(WindowPos2i, isCallValid, context, x, y);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY WindowPos2iv(const GLint *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLWindowPos2iv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateWindowPos2iv(context, v));
+        if (isCallValid)
+        {
+            context->windowPos2iv(v);
+        }
+        ANGLE_CAPTURE(WindowPos2iv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY WindowPos2s(GLshort x, GLshort y)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLWindowPos2s, "context = %d, x = %d, y = %d", CID(context), x, y);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateWindowPos2s(context, x, y));
+        if (isCallValid)
+        {
+            context->windowPos2s(x, y);
+        }
+        ANGLE_CAPTURE(WindowPos2s, isCallValid, context, x, y);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY WindowPos2sv(const GLshort *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLWindowPos2sv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateWindowPos2sv(context, v));
+        if (isCallValid)
+        {
+            context->windowPos2sv(v);
+        }
+        ANGLE_CAPTURE(WindowPos2sv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY WindowPos3d(GLdouble x, GLdouble y, GLdouble z)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLWindowPos3d, "context = %d, x = %f, y = %f, z = %f", CID(context), x, y, z);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateWindowPos3d(context, x, y, z));
+        if (isCallValid)
+        {
+            context->windowPos3d(x, y, z);
+        }
+        ANGLE_CAPTURE(WindowPos3d, isCallValid, context, x, y, z);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY WindowPos3dv(const GLdouble *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLWindowPos3dv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateWindowPos3dv(context, v));
+        if (isCallValid)
+        {
+            context->windowPos3dv(v);
+        }
+        ANGLE_CAPTURE(WindowPos3dv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY WindowPos3f(GLfloat x, GLfloat y, GLfloat z)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLWindowPos3f, "context = %d, x = %f, y = %f, z = %f", CID(context), x, y, z);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateWindowPos3f(context, x, y, z));
+        if (isCallValid)
+        {
+            context->windowPos3f(x, y, z);
+        }
+        ANGLE_CAPTURE(WindowPos3f, isCallValid, context, x, y, z);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY WindowPos3fv(const GLfloat *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLWindowPos3fv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateWindowPos3fv(context, v));
+        if (isCallValid)
+        {
+            context->windowPos3fv(v);
+        }
+        ANGLE_CAPTURE(WindowPos3fv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY WindowPos3i(GLint x, GLint y, GLint z)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLWindowPos3i, "context = %d, x = %d, y = %d, z = %d", CID(context), x, y, z);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateWindowPos3i(context, x, y, z));
+        if (isCallValid)
+        {
+            context->windowPos3i(x, y, z);
+        }
+        ANGLE_CAPTURE(WindowPos3i, isCallValid, context, x, y, z);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY WindowPos3iv(const GLint *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLWindowPos3iv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateWindowPos3iv(context, v));
+        if (isCallValid)
+        {
+            context->windowPos3iv(v);
+        }
+        ANGLE_CAPTURE(WindowPos3iv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY WindowPos3s(GLshort x, GLshort y, GLshort z)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLWindowPos3s, "context = %d, x = %d, y = %d, z = %d", CID(context), x, y, z);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateWindowPos3s(context, x, y, z));
+        if (isCallValid)
+        {
+            context->windowPos3s(x, y, z);
+        }
+        ANGLE_CAPTURE(WindowPos3s, isCallValid, context, x, y, z);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY WindowPos3sv(const GLshort *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLWindowPos3sv, "context = %d, v = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateWindowPos3sv(context, v));
+        if (isCallValid)
+        {
+            context->windowPos3sv(v);
+        }
+        ANGLE_CAPTURE(WindowPos3sv, isCallValid, context, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+// GL 1.5
+void GL_APIENTRY BeginQuery(GLenum target, GLuint id)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLBeginQuery, "context = %d, target = %s, id = %u", CID(context),
+          GLenumToString(GLenumGroup::QueryTarget, target), id);
+
+    if (context)
+    {
+        QueryType targetPacked                                = PackParam<QueryType>(target);
+        QueryID idPacked                                      = PackParam<QueryID>(id);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateBeginQuery(context, targetPacked, idPacked));
+        if (isCallValid)
+        {
+            context->beginQuery(targetPacked, idPacked);
+        }
+        ANGLE_CAPTURE(BeginQuery, isCallValid, context, targetPacked, idPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY BindBuffer(GLenum target, GLuint buffer)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLBindBuffer, "context = %d, target = %s, buffer = %u", CID(context),
+          GLenumToString(GLenumGroup::BufferTargetARB, target), buffer);
+
+    if (context)
+    {
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateBindBuffer(context, targetPacked, bufferPacked));
+        if (isCallValid)
+        {
+            context->bindBuffer(targetPacked, bufferPacked);
+        }
+        ANGLE_CAPTURE(BindBuffer, isCallValid, context, targetPacked, bufferPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY BufferData(GLenum target, GLsizeiptr size, const void *data, GLenum usage)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLBufferData,
+          "context = %d, target = %s, size = %llu, data = 0x%016" PRIxPTR ", usage = %s",
+          CID(context), GLenumToString(GLenumGroup::BufferTargetARB, target),
+          static_cast<unsigned long long>(size), (uintptr_t)data,
+          GLenumToString(GLenumGroup::BufferUsageARB, usage));
+
+    if (context)
+    {
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
+        BufferUsage usagePacked                               = PackParam<BufferUsage>(usage);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateBufferData(context, targetPacked, size, data, usagePacked));
+        if (isCallValid)
+        {
+            context->bufferData(targetPacked, size, data, usagePacked);
+        }
+        ANGLE_CAPTURE(BufferData, isCallValid, context, targetPacked, size, data, usagePacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY BufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void *data)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLBufferSubData,
+          "context = %d, target = %s, offset = %llu, size = %llu, data = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::BufferTargetARB, target),
+          static_cast<unsigned long long>(offset), static_cast<unsigned long long>(size),
+          (uintptr_t)data);
+
+    if (context)
+    {
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateBufferSubData(context, targetPacked, offset, size, data));
+        if (isCallValid)
+        {
+            context->bufferSubData(targetPacked, offset, size, data);
+        }
+        ANGLE_CAPTURE(BufferSubData, isCallValid, context, targetPacked, offset, size, data);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DeleteBuffers(GLsizei n, const GLuint *buffers)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDeleteBuffers, "context = %d, n = %d, buffers = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)buffers);
+
+    if (context)
+    {
+        const BufferID *buffersPacked = PackParam<const BufferID *>(buffers);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateDeleteBuffers(context, n, buffersPacked));
+        if (isCallValid)
+        {
+            context->deleteBuffers(n, buffersPacked);
+        }
+        ANGLE_CAPTURE(DeleteBuffers, isCallValid, context, n, buffersPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DeleteQueries(GLsizei n, const GLuint *ids)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDeleteQueries, "context = %d, n = %d, ids = 0x%016" PRIxPTR "", CID(context),
+          n, (uintptr_t)ids);
+
+    if (context)
+    {
+        const QueryID *idsPacked                              = PackParam<const QueryID *>(ids);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateDeleteQueries(context, n, idsPacked));
+        if (isCallValid)
+        {
+            context->deleteQueries(n, idsPacked);
+        }
+        ANGLE_CAPTURE(DeleteQueries, isCallValid, context, n, idsPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY EndQuery(GLenum target)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLEndQuery, "context = %d, target = %s", CID(context),
+          GLenumToString(GLenumGroup::QueryTarget, target));
+
+    if (context)
+    {
+        QueryType targetPacked                                = PackParam<QueryType>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateEndQuery(context, targetPacked));
+        if (isCallValid)
+        {
+            context->endQuery(targetPacked);
+        }
+        ANGLE_CAPTURE(EndQuery, isCallValid, context, targetPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GenBuffers(GLsizei n, GLuint *buffers)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGenBuffers, "context = %d, n = %d, buffers = 0x%016" PRIxPTR "", CID(context),
+          n, (uintptr_t)buffers);
+
+    if (context)
+    {
+        BufferID *buffersPacked                               = PackParam<BufferID *>(buffers);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGenBuffers(context, n, buffersPacked));
+        if (isCallValid)
+        {
+            context->genBuffers(n, buffersPacked);
+        }
+        ANGLE_CAPTURE(GenBuffers, isCallValid, context, n, buffersPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GenQueries(GLsizei n, GLuint *ids)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGenQueries, "context = %d, n = %d, ids = 0x%016" PRIxPTR "", CID(context), n,
+          (uintptr_t)ids);
+
+    if (context)
+    {
+        QueryID *idsPacked                                    = PackParam<QueryID *>(ids);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateGenQueries(context, n, idsPacked));
+        if (isCallValid)
+        {
+            context->genQueries(n, idsPacked);
+        }
+        ANGLE_CAPTURE(GenQueries, isCallValid, context, n, idsPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetBufferParameteriv,
+          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::BufferTargetARB, target),
+          GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetBufferParameteriv(context, targetPacked, pname, params));
+        if (isCallValid)
+        {
+            context->getBufferParameteriv(targetPacked, pname, params);
+        }
+        ANGLE_CAPTURE(GetBufferParameteriv, isCallValid, context, targetPacked, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetBufferPointerv(GLenum target, GLenum pname, void **params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetBufferPointerv,
+          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::BufferTargetARB, target),
+          GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetBufferPointerv(context, targetPacked, pname, params));
+        if (isCallValid)
+        {
+            context->getBufferPointerv(targetPacked, pname, params);
+        }
+        ANGLE_CAPTURE(GetBufferPointerv, isCallValid, context, targetPacked, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, void *data)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetBufferSubData,
+          "context = %d, target = %s, offset = %llu, size = %llu, data = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::BufferTargetARB, target),
+          static_cast<unsigned long long>(offset), static_cast<unsigned long long>(size),
+          (uintptr_t)data);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetBufferSubData(context, target, offset, size, data));
+        if (isCallValid)
+        {
+            context->getBufferSubData(target, offset, size, data);
+        }
+        ANGLE_CAPTURE(GetBufferSubData, isCallValid, context, target, offset, size, data);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
+{
+    Context *context = GetGlobalContext();
+    EVENT(context, GLGetQueryObjectiv,
+          "context = %d, id = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), id,
+          GLenumToString(GLenumGroup::QueryObjectParameterName, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        QueryID idPacked                                      = PackParam<QueryID>(id);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetQueryObjectiv(context, idPacked, pname, params));
+        if (isCallValid)
+        {
+            context->getQueryObjectiv(idPacked, pname, params);
+        }
+        ANGLE_CAPTURE(GetQueryObjectiv, isCallValid, context, idPacked, pname, params);
+    }
+    else
+    {}
+}
+
+void GL_APIENTRY GetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetQueryObjectuiv,
+          "context = %d, id = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), id,
+          GLenumToString(GLenumGroup::QueryObjectParameterName, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        QueryID idPacked                                      = PackParam<QueryID>(id);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetQueryObjectuiv(context, idPacked, pname, params));
+        if (isCallValid)
+        {
+            context->getQueryObjectuiv(idPacked, pname, params);
+        }
+        ANGLE_CAPTURE(GetQueryObjectuiv, isCallValid, context, idPacked, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetQueryiv(GLenum target, GLenum pname, GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetQueryiv,
+          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::QueryTarget, target),
+          GLenumToString(GLenumGroup::QueryParameterName, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        QueryType targetPacked                                = PackParam<QueryType>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGetQueryiv(context, targetPacked, pname, params));
+        if (isCallValid)
+        {
+            context->getQueryiv(targetPacked, pname, params);
+        }
+        ANGLE_CAPTURE(GetQueryiv, isCallValid, context, targetPacked, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+GLboolean GL_APIENTRY IsBuffer(GLuint buffer)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLIsBuffer, "context = %d, buffer = %u", CID(context), buffer);
+
+    GLboolean returnValue;
+    if (context)
+    {
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateIsBuffer(context, bufferPacked));
+        if (isCallValid)
+        {
+            returnValue = context->isBuffer(bufferPacked);
+        }
+        else
+        {
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsBuffer, GLboolean>();
+        }
+        ANGLE_CAPTURE(IsBuffer, isCallValid, context, bufferPacked, returnValue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsBuffer, GLboolean>();
+    }
+    return returnValue;
+}
+
+GLboolean GL_APIENTRY IsQuery(GLuint id)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLIsQuery, "context = %d, id = %u", CID(context), id);
+
+    GLboolean returnValue;
+    if (context)
+    {
+        QueryID idPacked                                      = PackParam<QueryID>(id);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateIsQuery(context, idPacked));
+        if (isCallValid)
+        {
+            returnValue = context->isQuery(idPacked);
+        }
+        else
+        {
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsQuery, GLboolean>();
+        }
+        ANGLE_CAPTURE(IsQuery, isCallValid, context, idPacked, returnValue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsQuery, GLboolean>();
+    }
+    return returnValue;
+}
+
+void *GL_APIENTRY MapBuffer(GLenum target, GLenum access)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMapBuffer, "context = %d, target = %s, access = %s", CID(context),
+          GLenumToString(GLenumGroup::BufferTargetARB, target),
+          GLenumToString(GLenumGroup::BufferAccessARB, access));
+
+    void *returnValue;
+    if (context)
+    {
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMapBuffer(context, targetPacked, access));
+        if (isCallValid)
+        {
+            returnValue = context->mapBuffer(targetPacked, access);
+        }
+        else
+        {
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLMapBuffer, void *>();
+        }
+        ANGLE_CAPTURE(MapBuffer, isCallValid, context, targetPacked, access, returnValue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLMapBuffer, void *>();
+    }
+    return returnValue;
+}
+
+GLboolean GL_APIENTRY UnmapBuffer(GLenum target)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLUnmapBuffer, "context = %d, target = %s", CID(context),
+          GLenumToString(GLenumGroup::BufferTargetARB, target));
+
+    GLboolean returnValue;
+    if (context)
+    {
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateUnmapBuffer(context, targetPacked));
+        if (isCallValid)
+        {
+            returnValue = context->unmapBuffer(targetPacked);
+        }
+        else
+        {
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLUnmapBuffer, GLboolean>();
+        }
+        ANGLE_CAPTURE(UnmapBuffer, isCallValid, context, targetPacked, returnValue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLUnmapBuffer, GLboolean>();
+    }
+    return returnValue;
+}
+}  // namespace gl
diff --git a/src/libGL/entry_points_gl_1_autogen.h b/src/libGL/entry_points_gl_1_autogen.h
new file mode 100644
index 0000000..8623d53
--- /dev/null
+++ b/src/libGL/entry_points_gl_1_autogen.h
@@ -0,0 +1,705 @@
+// GENERATED FILE - DO NOT EDIT.
+// Generated by generate_entry_points.py using data from gl.xml.
+//
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// entry_points_gl_1_autogen.h:
+//   Defines the Desktop GL 1.x entry points.
+
+#ifndef LIBGL_ENTRY_POINTS_GL_1_AUTOGEN_H_
+#define LIBGL_ENTRY_POINTS_GL_1_AUTOGEN_H_
+
+#include <export.h>
+#include "angle_gl.h"
+
+namespace gl
+{
+
+// GL 1.0
+ANGLE_EXPORT void GL_APIENTRY Accum(GLenum op, GLfloat value);
+ANGLE_EXPORT void GL_APIENTRY AlphaFunc(GLenum func, GLfloat ref);
+ANGLE_EXPORT void GL_APIENTRY Begin(GLenum mode);
+ANGLE_EXPORT void GL_APIENTRY Bitmap(GLsizei width,
+                                     GLsizei height,
+                                     GLfloat xorig,
+                                     GLfloat yorig,
+                                     GLfloat xmove,
+                                     GLfloat ymove,
+                                     const GLubyte *bitmap);
+ANGLE_EXPORT void GL_APIENTRY BlendFunc(GLenum sfactor, GLenum dfactor);
+ANGLE_EXPORT void GL_APIENTRY CallList(GLuint list);
+ANGLE_EXPORT void GL_APIENTRY CallLists(GLsizei n, GLenum type, const void *lists);
+ANGLE_EXPORT void GL_APIENTRY Clear(GLbitfield mask);
+ANGLE_EXPORT void GL_APIENTRY ClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ANGLE_EXPORT void GL_APIENTRY ClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ANGLE_EXPORT void GL_APIENTRY ClearDepth(GLdouble depth);
+ANGLE_EXPORT void GL_APIENTRY ClearIndex(GLfloat c);
+ANGLE_EXPORT void GL_APIENTRY ClearStencil(GLint s);
+ANGLE_EXPORT void GL_APIENTRY ClipPlane(GLenum plane, const GLdouble *equation);
+ANGLE_EXPORT void GL_APIENTRY Color3b(GLbyte red, GLbyte green, GLbyte blue);
+ANGLE_EXPORT void GL_APIENTRY Color3bv(const GLbyte *v);
+ANGLE_EXPORT void GL_APIENTRY Color3d(GLdouble red, GLdouble green, GLdouble blue);
+ANGLE_EXPORT void GL_APIENTRY Color3dv(const GLdouble *v);
+ANGLE_EXPORT void GL_APIENTRY Color3f(GLfloat red, GLfloat green, GLfloat blue);
+ANGLE_EXPORT void GL_APIENTRY Color3fv(const GLfloat *v);
+ANGLE_EXPORT void GL_APIENTRY Color3i(GLint red, GLint green, GLint blue);
+ANGLE_EXPORT void GL_APIENTRY Color3iv(const GLint *v);
+ANGLE_EXPORT void GL_APIENTRY Color3s(GLshort red, GLshort green, GLshort blue);
+ANGLE_EXPORT void GL_APIENTRY Color3sv(const GLshort *v);
+ANGLE_EXPORT void GL_APIENTRY Color3ub(GLubyte red, GLubyte green, GLubyte blue);
+ANGLE_EXPORT void GL_APIENTRY Color3ubv(const GLubyte *v);
+ANGLE_EXPORT void GL_APIENTRY Color3ui(GLuint red, GLuint green, GLuint blue);
+ANGLE_EXPORT void GL_APIENTRY Color3uiv(const GLuint *v);
+ANGLE_EXPORT void GL_APIENTRY Color3us(GLushort red, GLushort green, GLushort blue);
+ANGLE_EXPORT void GL_APIENTRY Color3usv(const GLushort *v);
+ANGLE_EXPORT void GL_APIENTRY Color4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
+ANGLE_EXPORT void GL_APIENTRY Color4bv(const GLbyte *v);
+ANGLE_EXPORT void GL_APIENTRY Color4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
+ANGLE_EXPORT void GL_APIENTRY Color4dv(const GLdouble *v);
+ANGLE_EXPORT void GL_APIENTRY Color4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ANGLE_EXPORT void GL_APIENTRY Color4fv(const GLfloat *v);
+ANGLE_EXPORT void GL_APIENTRY Color4i(GLint red, GLint green, GLint blue, GLint alpha);
+ANGLE_EXPORT void GL_APIENTRY Color4iv(const GLint *v);
+ANGLE_EXPORT void GL_APIENTRY Color4s(GLshort red, GLshort green, GLshort blue, GLshort alpha);
+ANGLE_EXPORT void GL_APIENTRY Color4sv(const GLshort *v);
+ANGLE_EXPORT void GL_APIENTRY Color4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
+ANGLE_EXPORT void GL_APIENTRY Color4ubv(const GLubyte *v);
+ANGLE_EXPORT void GL_APIENTRY Color4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha);
+ANGLE_EXPORT void GL_APIENTRY Color4uiv(const GLuint *v);
+ANGLE_EXPORT void GL_APIENTRY Color4us(GLushort red, GLushort green, GLushort blue, GLushort alpha);
+ANGLE_EXPORT void GL_APIENTRY Color4usv(const GLushort *v);
+ANGLE_EXPORT void GL_APIENTRY ColorMask(GLboolean red,
+                                        GLboolean green,
+                                        GLboolean blue,
+                                        GLboolean alpha);
+ANGLE_EXPORT void GL_APIENTRY ColorMaterial(GLenum face, GLenum mode);
+ANGLE_EXPORT void GL_APIENTRY
+CopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
+ANGLE_EXPORT void GL_APIENTRY CullFace(GLenum mode);
+ANGLE_EXPORT void GL_APIENTRY DeleteLists(GLuint list, GLsizei range);
+ANGLE_EXPORT void GL_APIENTRY DepthFunc(GLenum func);
+ANGLE_EXPORT void GL_APIENTRY DepthMask(GLboolean flag);
+ANGLE_EXPORT void GL_APIENTRY DepthRange(GLdouble n, GLdouble f);
+ANGLE_EXPORT void GL_APIENTRY Disable(GLenum cap);
+ANGLE_EXPORT void GL_APIENTRY DrawBuffer(GLenum buf);
+ANGLE_EXPORT void GL_APIENTRY
+DrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
+ANGLE_EXPORT void GL_APIENTRY EdgeFlag(GLboolean flag);
+ANGLE_EXPORT void GL_APIENTRY EdgeFlagv(const GLboolean *flag);
+ANGLE_EXPORT void GL_APIENTRY Enable(GLenum cap);
+ANGLE_EXPORT void GL_APIENTRY End();
+ANGLE_EXPORT void GL_APIENTRY EndList();
+ANGLE_EXPORT void GL_APIENTRY EvalCoord1d(GLdouble u);
+ANGLE_EXPORT void GL_APIENTRY EvalCoord1dv(const GLdouble *u);
+ANGLE_EXPORT void GL_APIENTRY EvalCoord1f(GLfloat u);
+ANGLE_EXPORT void GL_APIENTRY EvalCoord1fv(const GLfloat *u);
+ANGLE_EXPORT void GL_APIENTRY EvalCoord2d(GLdouble u, GLdouble v);
+ANGLE_EXPORT void GL_APIENTRY EvalCoord2dv(const GLdouble *u);
+ANGLE_EXPORT void GL_APIENTRY EvalCoord2f(GLfloat u, GLfloat v);
+ANGLE_EXPORT void GL_APIENTRY EvalCoord2fv(const GLfloat *u);
+ANGLE_EXPORT void GL_APIENTRY EvalMesh1(GLenum mode, GLint i1, GLint i2);
+ANGLE_EXPORT void GL_APIENTRY EvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
+ANGLE_EXPORT void GL_APIENTRY EvalPoint1(GLint i);
+ANGLE_EXPORT void GL_APIENTRY EvalPoint2(GLint i, GLint j);
+ANGLE_EXPORT void GL_APIENTRY FeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer);
+ANGLE_EXPORT void GL_APIENTRY Finish();
+ANGLE_EXPORT void GL_APIENTRY Flush();
+ANGLE_EXPORT void GL_APIENTRY Fogf(GLenum pname, GLfloat param);
+ANGLE_EXPORT void GL_APIENTRY Fogfv(GLenum pname, const GLfloat *params);
+ANGLE_EXPORT void GL_APIENTRY Fogi(GLenum pname, GLint param);
+ANGLE_EXPORT void GL_APIENTRY Fogiv(GLenum pname, const GLint *params);
+ANGLE_EXPORT void GL_APIENTRY FrontFace(GLenum mode);
+ANGLE_EXPORT void GL_APIENTRY Frustum(GLdouble left,
+                                      GLdouble right,
+                                      GLdouble bottom,
+                                      GLdouble top,
+                                      GLdouble zNear,
+                                      GLdouble zFar);
+ANGLE_EXPORT GLuint GL_APIENTRY GenLists(GLsizei range);
+ANGLE_EXPORT void GL_APIENTRY GetBooleanv(GLenum pname, GLboolean *data);
+ANGLE_EXPORT void GL_APIENTRY GetClipPlane(GLenum plane, GLdouble *equation);
+ANGLE_EXPORT void GL_APIENTRY GetDoublev(GLenum pname, GLdouble *data);
+ANGLE_EXPORT GLenum GL_APIENTRY GetError();
+ANGLE_EXPORT void GL_APIENTRY GetFloatv(GLenum pname, GLfloat *data);
+ANGLE_EXPORT void GL_APIENTRY GetIntegerv(GLenum pname, GLint *data);
+ANGLE_EXPORT void GL_APIENTRY GetLightfv(GLenum light, GLenum pname, GLfloat *params);
+ANGLE_EXPORT void GL_APIENTRY GetLightiv(GLenum light, GLenum pname, GLint *params);
+ANGLE_EXPORT void GL_APIENTRY GetMapdv(GLenum target, GLenum query, GLdouble *v);
+ANGLE_EXPORT void GL_APIENTRY GetMapfv(GLenum target, GLenum query, GLfloat *v);
+ANGLE_EXPORT void GL_APIENTRY GetMapiv(GLenum target, GLenum query, GLint *v);
+ANGLE_EXPORT void GL_APIENTRY GetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
+ANGLE_EXPORT void GL_APIENTRY GetMaterialiv(GLenum face, GLenum pname, GLint *params);
+ANGLE_EXPORT void GL_APIENTRY GetPixelMapfv(GLenum map, GLfloat *values);
+ANGLE_EXPORT void GL_APIENTRY GetPixelMapuiv(GLenum map, GLuint *values);
+ANGLE_EXPORT void GL_APIENTRY GetPixelMapusv(GLenum map, GLushort *values);
+ANGLE_EXPORT void GL_APIENTRY GetPolygonStipple(GLubyte *mask);
+ANGLE_EXPORT const GLubyte *GL_APIENTRY GetString(GLenum name);
+ANGLE_EXPORT void GL_APIENTRY GetTexEnvfv(GLenum target, GLenum pname, GLfloat *params);
+ANGLE_EXPORT void GL_APIENTRY GetTexEnviv(GLenum target, GLenum pname, GLint *params);
+ANGLE_EXPORT void GL_APIENTRY GetTexGendv(GLenum coord, GLenum pname, GLdouble *params);
+ANGLE_EXPORT void GL_APIENTRY GetTexGenfv(GLenum coord, GLenum pname, GLfloat *params);
+ANGLE_EXPORT void GL_APIENTRY GetTexGeniv(GLenum coord, GLenum pname, GLint *params);
+ANGLE_EXPORT void GL_APIENTRY
+GetTexImage(GLenum target, GLint level, GLenum format, GLenum type, void *pixels);
+ANGLE_EXPORT void GL_APIENTRY GetTexLevelParameterfv(GLenum target,
+                                                     GLint level,
+                                                     GLenum pname,
+                                                     GLfloat *params);
+ANGLE_EXPORT void GL_APIENTRY GetTexLevelParameteriv(GLenum target,
+                                                     GLint level,
+                                                     GLenum pname,
+                                                     GLint *params);
+ANGLE_EXPORT void GL_APIENTRY GetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ANGLE_EXPORT void GL_APIENTRY GetTexParameteriv(GLenum target, GLenum pname, GLint *params);
+ANGLE_EXPORT void GL_APIENTRY Hint(GLenum target, GLenum mode);
+ANGLE_EXPORT void GL_APIENTRY IndexMask(GLuint mask);
+ANGLE_EXPORT void GL_APIENTRY Indexd(GLdouble c);
+ANGLE_EXPORT void GL_APIENTRY Indexdv(const GLdouble *c);
+ANGLE_EXPORT void GL_APIENTRY Indexf(GLfloat c);
+ANGLE_EXPORT void GL_APIENTRY Indexfv(const GLfloat *c);
+ANGLE_EXPORT void GL_APIENTRY Indexi(GLint c);
+ANGLE_EXPORT void GL_APIENTRY Indexiv(const GLint *c);
+ANGLE_EXPORT void GL_APIENTRY Indexs(GLshort c);
+ANGLE_EXPORT void GL_APIENTRY Indexsv(const GLshort *c);
+ANGLE_EXPORT void GL_APIENTRY InitNames();
+ANGLE_EXPORT GLboolean GL_APIENTRY IsEnabled(GLenum cap);
+ANGLE_EXPORT GLboolean GL_APIENTRY IsList(GLuint list);
+ANGLE_EXPORT void GL_APIENTRY LightModelf(GLenum pname, GLfloat param);
+ANGLE_EXPORT void GL_APIENTRY LightModelfv(GLenum pname, const GLfloat *params);
+ANGLE_EXPORT void GL_APIENTRY LightModeli(GLenum pname, GLint param);
+ANGLE_EXPORT void GL_APIENTRY LightModeliv(GLenum pname, const GLint *params);
+ANGLE_EXPORT void GL_APIENTRY Lightf(GLenum light, GLenum pname, GLfloat param);
+ANGLE_EXPORT void GL_APIENTRY Lightfv(GLenum light, GLenum pname, const GLfloat *params);
+ANGLE_EXPORT void GL_APIENTRY Lighti(GLenum light, GLenum pname, GLint param);
+ANGLE_EXPORT void GL_APIENTRY Lightiv(GLenum light, GLenum pname, const GLint *params);
+ANGLE_EXPORT void GL_APIENTRY LineStipple(GLint factor, GLushort pattern);
+ANGLE_EXPORT void GL_APIENTRY LineWidth(GLfloat width);
+ANGLE_EXPORT void GL_APIENTRY ListBase(GLuint base);
+ANGLE_EXPORT void GL_APIENTRY LoadIdentity();
+ANGLE_EXPORT void GL_APIENTRY LoadMatrixd(const GLdouble *m);
+ANGLE_EXPORT void GL_APIENTRY LoadMatrixf(const GLfloat *m);
+ANGLE_EXPORT void GL_APIENTRY LoadName(GLuint name);
+ANGLE_EXPORT void GL_APIENTRY LogicOp(GLenum opcode);
+ANGLE_EXPORT void GL_APIENTRY
+Map1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
+ANGLE_EXPORT void GL_APIENTRY
+Map1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
+ANGLE_EXPORT void GL_APIENTRY Map2d(GLenum target,
+                                    GLdouble u1,
+                                    GLdouble u2,
+                                    GLint ustride,
+                                    GLint uorder,
+                                    GLdouble v1,
+                                    GLdouble v2,
+                                    GLint vstride,
+                                    GLint vorder,
+                                    const GLdouble *points);
+ANGLE_EXPORT void GL_APIENTRY Map2f(GLenum target,
+                                    GLfloat u1,
+                                    GLfloat u2,
+                                    GLint ustride,
+                                    GLint uorder,
+                                    GLfloat v1,
+                                    GLfloat v2,
+                                    GLint vstride,
+                                    GLint vorder,
+                                    const GLfloat *points);
+ANGLE_EXPORT void GL_APIENTRY MapGrid1d(GLint un, GLdouble u1, GLdouble u2);
+ANGLE_EXPORT void GL_APIENTRY MapGrid1f(GLint un, GLfloat u1, GLfloat u2);
+ANGLE_EXPORT void GL_APIENTRY
+MapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
+ANGLE_EXPORT void GL_APIENTRY
+MapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
+ANGLE_EXPORT void GL_APIENTRY Materialf(GLenum face, GLenum pname, GLfloat param);
+ANGLE_EXPORT void GL_APIENTRY Materialfv(GLenum face, GLenum pname, const GLfloat *params);
+ANGLE_EXPORT void GL_APIENTRY Materiali(GLenum face, GLenum pname, GLint param);
+ANGLE_EXPORT void GL_APIENTRY Materialiv(GLenum face, GLenum pname, const GLint *params);
+ANGLE_EXPORT void GL_APIENTRY MatrixMode(GLenum mode);
+ANGLE_EXPORT void GL_APIENTRY MultMatrixd(const GLdouble *m);
+ANGLE_EXPORT void GL_APIENTRY MultMatrixf(const GLfloat *m);
+ANGLE_EXPORT void GL_APIENTRY NewList(GLuint list, GLenum mode);
+ANGLE_EXPORT void GL_APIENTRY Normal3b(GLbyte nx, GLbyte ny, GLbyte nz);
+ANGLE_EXPORT void GL_APIENTRY Normal3bv(const GLbyte *v);
+ANGLE_EXPORT void GL_APIENTRY Normal3d(GLdouble nx, GLdouble ny, GLdouble nz);
+ANGLE_EXPORT void GL_APIENTRY Normal3dv(const GLdouble *v);
+ANGLE_EXPORT void GL_APIENTRY Normal3f(GLfloat nx, GLfloat ny, GLfloat nz);
+ANGLE_EXPORT void GL_APIENTRY Normal3fv(const GLfloat *v);
+ANGLE_EXPORT void GL_APIENTRY Normal3i(GLint nx, GLint ny, GLint nz);
+ANGLE_EXPORT void GL_APIENTRY Normal3iv(const GLint *v);
+ANGLE_EXPORT void GL_APIENTRY Normal3s(GLshort nx, GLshort ny, GLshort nz);
+ANGLE_EXPORT void GL_APIENTRY Normal3sv(const GLshort *v);
+ANGLE_EXPORT void GL_APIENTRY
+Ortho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+ANGLE_EXPORT void GL_APIENTRY PassThrough(GLfloat token);
+ANGLE_EXPORT void GL_APIENTRY PixelMapfv(GLenum map, GLsizei mapsize, const GLfloat *values);
+ANGLE_EXPORT void GL_APIENTRY PixelMapuiv(GLenum map, GLsizei mapsize, const GLuint *values);
+ANGLE_EXPORT void GL_APIENTRY PixelMapusv(GLenum map, GLsizei mapsize, const GLushort *values);
+ANGLE_EXPORT void GL_APIENTRY PixelStoref(GLenum pname, GLfloat param);
+ANGLE_EXPORT void GL_APIENTRY PixelStorei(GLenum pname, GLint param);
+ANGLE_EXPORT void GL_APIENTRY PixelTransferf(GLenum pname, GLfloat param);
+ANGLE_EXPORT void GL_APIENTRY PixelTransferi(GLenum pname, GLint param);
+ANGLE_EXPORT void GL_APIENTRY PixelZoom(GLfloat xfactor, GLfloat yfactor);
+ANGLE_EXPORT void GL_APIENTRY PointSize(GLfloat size);
+ANGLE_EXPORT void GL_APIENTRY PolygonMode(GLenum face, GLenum mode);
+ANGLE_EXPORT void GL_APIENTRY PolygonStipple(const GLubyte *mask);
+ANGLE_EXPORT void GL_APIENTRY PopAttrib();
+ANGLE_EXPORT void GL_APIENTRY PopMatrix();
+ANGLE_EXPORT void GL_APIENTRY PopName();
+ANGLE_EXPORT void GL_APIENTRY PushAttrib(GLbitfield mask);
+ANGLE_EXPORT void GL_APIENTRY PushMatrix();
+ANGLE_EXPORT void GL_APIENTRY PushName(GLuint name);
+ANGLE_EXPORT void GL_APIENTRY RasterPos2d(GLdouble x, GLdouble y);
+ANGLE_EXPORT void GL_APIENTRY RasterPos2dv(const GLdouble *v);
+ANGLE_EXPORT void GL_APIENTRY RasterPos2f(GLfloat x, GLfloat y);
+ANGLE_EXPORT void GL_APIENTRY RasterPos2fv(const GLfloat *v);
+ANGLE_EXPORT void GL_APIENTRY RasterPos2i(GLint x, GLint y);
+ANGLE_EXPORT void GL_APIENTRY RasterPos2iv(const GLint *v);
+ANGLE_EXPORT void GL_APIENTRY RasterPos2s(GLshort x, GLshort y);
+ANGLE_EXPORT void GL_APIENTRY RasterPos2sv(const GLshort *v);
+ANGLE_EXPORT void GL_APIENTRY RasterPos3d(GLdouble x, GLdouble y, GLdouble z);
+ANGLE_EXPORT void GL_APIENTRY RasterPos3dv(const GLdouble *v);
+ANGLE_EXPORT void GL_APIENTRY RasterPos3f(GLfloat x, GLfloat y, GLfloat z);
+ANGLE_EXPORT void GL_APIENTRY RasterPos3fv(const GLfloat *v);
+ANGLE_EXPORT void GL_APIENTRY RasterPos3i(GLint x, GLint y, GLint z);
+ANGLE_EXPORT void GL_APIENTRY RasterPos3iv(const GLint *v);
+ANGLE_EXPORT void GL_APIENTRY RasterPos3s(GLshort x, GLshort y, GLshort z);
+ANGLE_EXPORT void GL_APIENTRY RasterPos3sv(const GLshort *v);
+ANGLE_EXPORT void GL_APIENTRY RasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ANGLE_EXPORT void GL_APIENTRY RasterPos4dv(const GLdouble *v);
+ANGLE_EXPORT void GL_APIENTRY RasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ANGLE_EXPORT void GL_APIENTRY RasterPos4fv(const GLfloat *v);
+ANGLE_EXPORT void GL_APIENTRY RasterPos4i(GLint x, GLint y, GLint z, GLint w);
+ANGLE_EXPORT void GL_APIENTRY RasterPos4iv(const GLint *v);
+ANGLE_EXPORT void GL_APIENTRY RasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w);
+ANGLE_EXPORT void GL_APIENTRY RasterPos4sv(const GLshort *v);
+ANGLE_EXPORT void GL_APIENTRY ReadBuffer(GLenum src);
+ANGLE_EXPORT void GL_APIENTRY ReadPixels(GLint x,
+                                         GLint y,
+                                         GLsizei width,
+                                         GLsizei height,
+                                         GLenum format,
+                                         GLenum type,
+                                         void *pixels);
+ANGLE_EXPORT void GL_APIENTRY Rectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
+ANGLE_EXPORT void GL_APIENTRY Rectdv(const GLdouble *v1, const GLdouble *v2);
+ANGLE_EXPORT void GL_APIENTRY Rectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
+ANGLE_EXPORT void GL_APIENTRY Rectfv(const GLfloat *v1, const GLfloat *v2);
+ANGLE_EXPORT void GL_APIENTRY Recti(GLint x1, GLint y1, GLint x2, GLint y2);
+ANGLE_EXPORT void GL_APIENTRY Rectiv(const GLint *v1, const GLint *v2);
+ANGLE_EXPORT void GL_APIENTRY Rects(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
+ANGLE_EXPORT void GL_APIENTRY Rectsv(const GLshort *v1, const GLshort *v2);
+ANGLE_EXPORT GLint GL_APIENTRY RenderMode(GLenum mode);
+ANGLE_EXPORT void GL_APIENTRY Rotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
+ANGLE_EXPORT void GL_APIENTRY Rotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
+ANGLE_EXPORT void GL_APIENTRY Scaled(GLdouble x, GLdouble y, GLdouble z);
+ANGLE_EXPORT void GL_APIENTRY Scalef(GLfloat x, GLfloat y, GLfloat z);
+ANGLE_EXPORT void GL_APIENTRY Scissor(GLint x, GLint y, GLsizei width, GLsizei height);
+ANGLE_EXPORT void GL_APIENTRY SelectBuffer(GLsizei size, GLuint *buffer);
+ANGLE_EXPORT void GL_APIENTRY ShadeModel(GLenum mode);
+ANGLE_EXPORT void GL_APIENTRY StencilFunc(GLenum func, GLint ref, GLuint mask);
+ANGLE_EXPORT void GL_APIENTRY StencilMask(GLuint mask);
+ANGLE_EXPORT void GL_APIENTRY StencilOp(GLenum fail, GLenum zfail, GLenum zpass);
+ANGLE_EXPORT void GL_APIENTRY TexCoord1d(GLdouble s);
+ANGLE_EXPORT void GL_APIENTRY TexCoord1dv(const GLdouble *v);
+ANGLE_EXPORT void GL_APIENTRY TexCoord1f(GLfloat s);
+ANGLE_EXPORT void GL_APIENTRY TexCoord1fv(const GLfloat *v);
+ANGLE_EXPORT void GL_APIENTRY TexCoord1i(GLint s);
+ANGLE_EXPORT void GL_APIENTRY TexCoord1iv(const GLint *v);
+ANGLE_EXPORT void GL_APIENTRY TexCoord1s(GLshort s);
+ANGLE_EXPORT void GL_APIENTRY TexCoord1sv(const GLshort *v);
+ANGLE_EXPORT void GL_APIENTRY TexCoord2d(GLdouble s, GLdouble t);
+ANGLE_EXPORT void GL_APIENTRY TexCoord2dv(const GLdouble *v);
+ANGLE_EXPORT void GL_APIENTRY TexCoord2f(GLfloat s, GLfloat t);
+ANGLE_EXPORT void GL_APIENTRY TexCoord2fv(const GLfloat *v);
+ANGLE_EXPORT void GL_APIENTRY TexCoord2i(GLint s, GLint t);
+ANGLE_EXPORT void GL_APIENTRY TexCoord2iv(const GLint *v);
+ANGLE_EXPORT void GL_APIENTRY TexCoord2s(GLshort s, GLshort t);
+ANGLE_EXPORT void GL_APIENTRY TexCoord2sv(const GLshort *v);
+ANGLE_EXPORT void GL_APIENTRY TexCoord3d(GLdouble s, GLdouble t, GLdouble r);
+ANGLE_EXPORT void GL_APIENTRY TexCoord3dv(const GLdouble *v);
+ANGLE_EXPORT void GL_APIENTRY TexCoord3f(GLfloat s, GLfloat t, GLfloat r);
+ANGLE_EXPORT void GL_APIENTRY TexCoord3fv(const GLfloat *v);
+ANGLE_EXPORT void GL_APIENTRY TexCoord3i(GLint s, GLint t, GLint r);
+ANGLE_EXPORT void GL_APIENTRY TexCoord3iv(const GLint *v);
+ANGLE_EXPORT void GL_APIENTRY TexCoord3s(GLshort s, GLshort t, GLshort r);
+ANGLE_EXPORT void GL_APIENTRY TexCoord3sv(const GLshort *v);
+ANGLE_EXPORT void GL_APIENTRY TexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+ANGLE_EXPORT void GL_APIENTRY TexCoord4dv(const GLdouble *v);
+ANGLE_EXPORT void GL_APIENTRY TexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+ANGLE_EXPORT void GL_APIENTRY TexCoord4fv(const GLfloat *v);
+ANGLE_EXPORT void GL_APIENTRY TexCoord4i(GLint s, GLint t, GLint r, GLint q);
+ANGLE_EXPORT void GL_APIENTRY TexCoord4iv(const GLint *v);
+ANGLE_EXPORT void GL_APIENTRY TexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q);
+ANGLE_EXPORT void GL_APIENTRY TexCoord4sv(const GLshort *v);
+ANGLE_EXPORT void GL_APIENTRY TexEnvf(GLenum target, GLenum pname, GLfloat param);
+ANGLE_EXPORT void GL_APIENTRY TexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
+ANGLE_EXPORT void GL_APIENTRY TexEnvi(GLenum target, GLenum pname, GLint param);
+ANGLE_EXPORT void GL_APIENTRY TexEnviv(GLenum target, GLenum pname, const GLint *params);
+ANGLE_EXPORT void GL_APIENTRY TexGend(GLenum coord, GLenum pname, GLdouble param);
+ANGLE_EXPORT void GL_APIENTRY TexGendv(GLenum coord, GLenum pname, const GLdouble *params);
+ANGLE_EXPORT void GL_APIENTRY TexGenf(GLenum coord, GLenum pname, GLfloat param);
+ANGLE_EXPORT void GL_APIENTRY TexGenfv(GLenum coord, GLenum pname, const GLfloat *params);
+ANGLE_EXPORT void GL_APIENTRY TexGeni(GLenum coord, GLenum pname, GLint param);
+ANGLE_EXPORT void GL_APIENTRY TexGeniv(GLenum coord, GLenum pname, const GLint *params);
+ANGLE_EXPORT void GL_APIENTRY TexImage1D(GLenum target,
+                                         GLint level,
+                                         GLint internalformat,
+                                         GLsizei width,
+                                         GLint border,
+                                         GLenum format,
+                                         GLenum type,
+                                         const void *pixels);
+ANGLE_EXPORT void GL_APIENTRY TexImage2D(GLenum target,
+                                         GLint level,
+                                         GLint internalformat,
+                                         GLsizei width,
+                                         GLsizei height,
+                                         GLint border,
+                                         GLenum format,
+                                         GLenum type,
+                                         const void *pixels);
+ANGLE_EXPORT void GL_APIENTRY TexParameterf(GLenum target, GLenum pname, GLfloat param);
+ANGLE_EXPORT void GL_APIENTRY TexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ANGLE_EXPORT void GL_APIENTRY TexParameteri(GLenum target, GLenum pname, GLint param);
+ANGLE_EXPORT void GL_APIENTRY TexParameteriv(GLenum target, GLenum pname, const GLint *params);
+ANGLE_EXPORT void GL_APIENTRY Translated(GLdouble x, GLdouble y, GLdouble z);
+ANGLE_EXPORT void GL_APIENTRY Translatef(GLfloat x, GLfloat y, GLfloat z);
+ANGLE_EXPORT void GL_APIENTRY Vertex2d(GLdouble x, GLdouble y);
+ANGLE_EXPORT void GL_APIENTRY Vertex2dv(const GLdouble *v);
+ANGLE_EXPORT void GL_APIENTRY Vertex2f(GLfloat x, GLfloat y);
+ANGLE_EXPORT void GL_APIENTRY Vertex2fv(const GLfloat *v);
+ANGLE_EXPORT void GL_APIENTRY Vertex2i(GLint x, GLint y);
+ANGLE_EXPORT void GL_APIENTRY Vertex2iv(const GLint *v);
+ANGLE_EXPORT void GL_APIENTRY Vertex2s(GLshort x, GLshort y);
+ANGLE_EXPORT void GL_APIENTRY Vertex2sv(const GLshort *v);
+ANGLE_EXPORT void GL_APIENTRY Vertex3d(GLdouble x, GLdouble y, GLdouble z);
+ANGLE_EXPORT void GL_APIENTRY Vertex3dv(const GLdouble *v);
+ANGLE_EXPORT void GL_APIENTRY Vertex3f(GLfloat x, GLfloat y, GLfloat z);
+ANGLE_EXPORT void GL_APIENTRY Vertex3fv(const GLfloat *v);
+ANGLE_EXPORT void GL_APIENTRY Vertex3i(GLint x, GLint y, GLint z);
+ANGLE_EXPORT void GL_APIENTRY Vertex3iv(const GLint *v);
+ANGLE_EXPORT void GL_APIENTRY Vertex3s(GLshort x, GLshort y, GLshort z);
+ANGLE_EXPORT void GL_APIENTRY Vertex3sv(const GLshort *v);
+ANGLE_EXPORT void GL_APIENTRY Vertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ANGLE_EXPORT void GL_APIENTRY Vertex4dv(const GLdouble *v);
+ANGLE_EXPORT void GL_APIENTRY Vertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ANGLE_EXPORT void GL_APIENTRY Vertex4fv(const GLfloat *v);
+ANGLE_EXPORT void GL_APIENTRY Vertex4i(GLint x, GLint y, GLint z, GLint w);
+ANGLE_EXPORT void GL_APIENTRY Vertex4iv(const GLint *v);
+ANGLE_EXPORT void GL_APIENTRY Vertex4s(GLshort x, GLshort y, GLshort z, GLshort w);
+ANGLE_EXPORT void GL_APIENTRY Vertex4sv(const GLshort *v);
+ANGLE_EXPORT void GL_APIENTRY Viewport(GLint x, GLint y, GLsizei width, GLsizei height);
+
+// GL 1.1
+ANGLE_EXPORT GLboolean GL_APIENTRY AreTexturesResident(GLsizei n,
+                                                       const GLuint *textures,
+                                                       GLboolean *residences);
+ANGLE_EXPORT void GL_APIENTRY ArrayElement(GLint i);
+ANGLE_EXPORT void GL_APIENTRY BindTexture(GLenum target, GLuint texture);
+ANGLE_EXPORT void GL_APIENTRY ColorPointer(GLint size,
+                                           GLenum type,
+                                           GLsizei stride,
+                                           const void *pointer);
+ANGLE_EXPORT void GL_APIENTRY CopyTexImage1D(GLenum target,
+                                             GLint level,
+                                             GLenum internalformat,
+                                             GLint x,
+                                             GLint y,
+                                             GLsizei width,
+                                             GLint border);
+ANGLE_EXPORT void GL_APIENTRY CopyTexImage2D(GLenum target,
+                                             GLint level,
+                                             GLenum internalformat,
+                                             GLint x,
+                                             GLint y,
+                                             GLsizei width,
+                                             GLsizei height,
+                                             GLint border);
+ANGLE_EXPORT void GL_APIENTRY
+CopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+ANGLE_EXPORT void GL_APIENTRY CopyTexSubImage2D(GLenum target,
+                                                GLint level,
+                                                GLint xoffset,
+                                                GLint yoffset,
+                                                GLint x,
+                                                GLint y,
+                                                GLsizei width,
+                                                GLsizei height);
+ANGLE_EXPORT void GL_APIENTRY DeleteTextures(GLsizei n, const GLuint *textures);
+ANGLE_EXPORT void GL_APIENTRY DisableClientState(GLenum array);
+ANGLE_EXPORT void GL_APIENTRY DrawArrays(GLenum mode, GLint first, GLsizei count);
+ANGLE_EXPORT void GL_APIENTRY DrawElements(GLenum mode,
+                                           GLsizei count,
+                                           GLenum type,
+                                           const void *indices);
+ANGLE_EXPORT void GL_APIENTRY EdgeFlagPointer(GLsizei stride, const void *pointer);
+ANGLE_EXPORT void GL_APIENTRY EnableClientState(GLenum array);
+ANGLE_EXPORT void GL_APIENTRY GenTextures(GLsizei n, GLuint *textures);
+ANGLE_EXPORT void GL_APIENTRY GetPointerv(GLenum pname, void **params);
+ANGLE_EXPORT void GL_APIENTRY IndexPointer(GLenum type, GLsizei stride, const void *pointer);
+ANGLE_EXPORT void GL_APIENTRY Indexub(GLubyte c);
+ANGLE_EXPORT void GL_APIENTRY Indexubv(const GLubyte *c);
+ANGLE_EXPORT void GL_APIENTRY InterleavedArrays(GLenum format, GLsizei stride, const void *pointer);
+ANGLE_EXPORT GLboolean GL_APIENTRY IsTexture(GLuint texture);
+ANGLE_EXPORT void GL_APIENTRY NormalPointer(GLenum type, GLsizei stride, const void *pointer);
+ANGLE_EXPORT void GL_APIENTRY PolygonOffset(GLfloat factor, GLfloat units);
+ANGLE_EXPORT void GL_APIENTRY PopClientAttrib();
+ANGLE_EXPORT void GL_APIENTRY PrioritizeTextures(GLsizei n,
+                                                 const GLuint *textures,
+                                                 const GLfloat *priorities);
+ANGLE_EXPORT void GL_APIENTRY PushClientAttrib(GLbitfield mask);
+ANGLE_EXPORT void GL_APIENTRY TexCoordPointer(GLint size,
+                                              GLenum type,
+                                              GLsizei stride,
+                                              const void *pointer);
+ANGLE_EXPORT void GL_APIENTRY TexSubImage1D(GLenum target,
+                                            GLint level,
+                                            GLint xoffset,
+                                            GLsizei width,
+                                            GLenum format,
+                                            GLenum type,
+                                            const void *pixels);
+ANGLE_EXPORT void GL_APIENTRY TexSubImage2D(GLenum target,
+                                            GLint level,
+                                            GLint xoffset,
+                                            GLint yoffset,
+                                            GLsizei width,
+                                            GLsizei height,
+                                            GLenum format,
+                                            GLenum type,
+                                            const void *pixels);
+ANGLE_EXPORT void GL_APIENTRY VertexPointer(GLint size,
+                                            GLenum type,
+                                            GLsizei stride,
+                                            const void *pointer);
+
+// GL 1.2
+ANGLE_EXPORT void GL_APIENTRY CopyTexSubImage3D(GLenum target,
+                                                GLint level,
+                                                GLint xoffset,
+                                                GLint yoffset,
+                                                GLint zoffset,
+                                                GLint x,
+                                                GLint y,
+                                                GLsizei width,
+                                                GLsizei height);
+ANGLE_EXPORT void GL_APIENTRY DrawRangeElements(GLenum mode,
+                                                GLuint start,
+                                                GLuint end,
+                                                GLsizei count,
+                                                GLenum type,
+                                                const void *indices);
+ANGLE_EXPORT void GL_APIENTRY TexImage3D(GLenum target,
+                                         GLint level,
+                                         GLint internalformat,
+                                         GLsizei width,
+                                         GLsizei height,
+                                         GLsizei depth,
+                                         GLint border,
+                                         GLenum format,
+                                         GLenum type,
+                                         const void *pixels);
+ANGLE_EXPORT void GL_APIENTRY TexSubImage3D(GLenum target,
+                                            GLint level,
+                                            GLint xoffset,
+                                            GLint yoffset,
+                                            GLint zoffset,
+                                            GLsizei width,
+                                            GLsizei height,
+                                            GLsizei depth,
+                                            GLenum format,
+                                            GLenum type,
+                                            const void *pixels);
+
+// GL 1.3
+ANGLE_EXPORT void GL_APIENTRY ActiveTexture(GLenum texture);
+ANGLE_EXPORT void GL_APIENTRY ClientActiveTexture(GLenum texture);
+ANGLE_EXPORT void GL_APIENTRY CompressedTexImage1D(GLenum target,
+                                                   GLint level,
+                                                   GLenum internalformat,
+                                                   GLsizei width,
+                                                   GLint border,
+                                                   GLsizei imageSize,
+                                                   const void *data);
+ANGLE_EXPORT void GL_APIENTRY CompressedTexImage2D(GLenum target,
+                                                   GLint level,
+                                                   GLenum internalformat,
+                                                   GLsizei width,
+                                                   GLsizei height,
+                                                   GLint border,
+                                                   GLsizei imageSize,
+                                                   const void *data);
+ANGLE_EXPORT void GL_APIENTRY CompressedTexImage3D(GLenum target,
+                                                   GLint level,
+                                                   GLenum internalformat,
+                                                   GLsizei width,
+                                                   GLsizei height,
+                                                   GLsizei depth,
+                                                   GLint border,
+                                                   GLsizei imageSize,
+                                                   const void *data);
+ANGLE_EXPORT void GL_APIENTRY CompressedTexSubImage1D(GLenum target,
+                                                      GLint level,
+                                                      GLint xoffset,
+                                                      GLsizei width,
+                                                      GLenum format,
+                                                      GLsizei imageSize,
+                                                      const void *data);
+ANGLE_EXPORT void GL_APIENTRY CompressedTexSubImage2D(GLenum target,
+                                                      GLint level,
+                                                      GLint xoffset,
+                                                      GLint yoffset,
+                                                      GLsizei width,
+                                                      GLsizei height,
+                                                      GLenum format,
+                                                      GLsizei imageSize,
+                                                      const void *data);
+ANGLE_EXPORT void GL_APIENTRY CompressedTexSubImage3D(GLenum target,
+                                                      GLint level,
+                                                      GLint xoffset,
+                                                      GLint yoffset,
+                                                      GLint zoffset,
+                                                      GLsizei width,
+                                                      GLsizei height,
+                                                      GLsizei depth,
+                                                      GLenum format,
+                                                      GLsizei imageSize,
+                                                      const void *data);
+ANGLE_EXPORT void GL_APIENTRY GetCompressedTexImage(GLenum target, GLint level, void *img);
+ANGLE_EXPORT void GL_APIENTRY LoadTransposeMatrixd(const GLdouble *m);
+ANGLE_EXPORT void GL_APIENTRY LoadTransposeMatrixf(const GLfloat *m);
+ANGLE_EXPORT void GL_APIENTRY MultTransposeMatrixd(const GLdouble *m);
+ANGLE_EXPORT void GL_APIENTRY MultTransposeMatrixf(const GLfloat *m);
+ANGLE_EXPORT void GL_APIENTRY MultiTexCoord1d(GLenum target, GLdouble s);
+ANGLE_EXPORT void GL_APIENTRY MultiTexCoord1dv(GLenum target, const GLdouble *v);
+ANGLE_EXPORT void GL_APIENTRY MultiTexCoord1f(GLenum target, GLfloat s);
+ANGLE_EXPORT void GL_APIENTRY MultiTexCoord1fv(GLenum target, const GLfloat *v);
+ANGLE_EXPORT void GL_APIENTRY MultiTexCoord1i(GLenum target, GLint s);
+ANGLE_EXPORT void GL_APIENTRY MultiTexCoord1iv(GLenum target, const GLint *v);
+ANGLE_EXPORT void GL_APIENTRY MultiTexCoord1s(GLenum target, GLshort s);
+ANGLE_EXPORT void GL_APIENTRY MultiTexCoord1sv(GLenum target, const GLshort *v);
+ANGLE_EXPORT void GL_APIENTRY MultiTexCoord2d(GLenum target, GLdouble s, GLdouble t);
+ANGLE_EXPORT void GL_APIENTRY MultiTexCoord2dv(GLenum target, const GLdouble *v);
+ANGLE_EXPORT void GL_APIENTRY MultiTexCoord2f(GLenum target, GLfloat s, GLfloat t);
+ANGLE_EXPORT void GL_APIENTRY MultiTexCoord2fv(GLenum target, const GLfloat *v);
+ANGLE_EXPORT void GL_APIENTRY MultiTexCoord2i(GLenum target, GLint s, GLint t);
+ANGLE_EXPORT void GL_APIENTRY MultiTexCoord2iv(GLenum target, const GLint *v);
+ANGLE_EXPORT void GL_APIENTRY MultiTexCoord2s(GLenum target, GLshort s, GLshort t);
+ANGLE_EXPORT void GL_APIENTRY MultiTexCoord2sv(GLenum target, const GLshort *v);
+ANGLE_EXPORT void GL_APIENTRY MultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r);
+ANGLE_EXPORT void GL_APIENTRY MultiTexCoord3dv(GLenum target, const GLdouble *v);
+ANGLE_EXPORT void GL_APIENTRY MultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r);
+ANGLE_EXPORT void GL_APIENTRY MultiTexCoord3fv(GLenum target, const GLfloat *v);
+ANGLE_EXPORT void GL_APIENTRY MultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r);
+ANGLE_EXPORT void GL_APIENTRY MultiTexCoord3iv(GLenum target, const GLint *v);
+ANGLE_EXPORT void GL_APIENTRY MultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r);
+ANGLE_EXPORT void GL_APIENTRY MultiTexCoord3sv(GLenum target, const GLshort *v);
+ANGLE_EXPORT void GL_APIENTRY
+MultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+ANGLE_EXPORT void GL_APIENTRY MultiTexCoord4dv(GLenum target, const GLdouble *v);
+ANGLE_EXPORT void GL_APIENTRY
+MultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+ANGLE_EXPORT void GL_APIENTRY MultiTexCoord4fv(GLenum target, const GLfloat *v);
+ANGLE_EXPORT void GL_APIENTRY MultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q);
+ANGLE_EXPORT void GL_APIENTRY MultiTexCoord4iv(GLenum target, const GLint *v);
+ANGLE_EXPORT void GL_APIENTRY
+MultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
+ANGLE_EXPORT void GL_APIENTRY MultiTexCoord4sv(GLenum target, const GLshort *v);
+ANGLE_EXPORT void GL_APIENTRY SampleCoverage(GLfloat value, GLboolean invert);
+
+// GL 1.4
+ANGLE_EXPORT void GL_APIENTRY BlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ANGLE_EXPORT void GL_APIENTRY BlendEquation(GLenum mode);
+ANGLE_EXPORT void GL_APIENTRY BlendFuncSeparate(GLenum sfactorRGB,
+                                                GLenum dfactorRGB,
+                                                GLenum sfactorAlpha,
+                                                GLenum dfactorAlpha);
+ANGLE_EXPORT void GL_APIENTRY FogCoordPointer(GLenum type, GLsizei stride, const void *pointer);
+ANGLE_EXPORT void GL_APIENTRY FogCoordd(GLdouble coord);
+ANGLE_EXPORT void GL_APIENTRY FogCoorddv(const GLdouble *coord);
+ANGLE_EXPORT void GL_APIENTRY FogCoordf(GLfloat coord);
+ANGLE_EXPORT void GL_APIENTRY FogCoordfv(const GLfloat *coord);
+ANGLE_EXPORT void GL_APIENTRY MultiDrawArrays(GLenum mode,
+                                              const GLint *first,
+                                              const GLsizei *count,
+                                              GLsizei drawcount);
+ANGLE_EXPORT void GL_APIENTRY MultiDrawElements(GLenum mode,
+                                                const GLsizei *count,
+                                                GLenum type,
+                                                const void *const *indices,
+                                                GLsizei drawcount);
+ANGLE_EXPORT void GL_APIENTRY PointParameterf(GLenum pname, GLfloat param);
+ANGLE_EXPORT void GL_APIENTRY PointParameterfv(GLenum pname, const GLfloat *params);
+ANGLE_EXPORT void GL_APIENTRY PointParameteri(GLenum pname, GLint param);
+ANGLE_EXPORT void GL_APIENTRY PointParameteriv(GLenum pname, const GLint *params);
+ANGLE_EXPORT void GL_APIENTRY SecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue);
+ANGLE_EXPORT void GL_APIENTRY SecondaryColor3bv(const GLbyte *v);
+ANGLE_EXPORT void GL_APIENTRY SecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue);
+ANGLE_EXPORT void GL_APIENTRY SecondaryColor3dv(const GLdouble *v);
+ANGLE_EXPORT void GL_APIENTRY SecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue);
+ANGLE_EXPORT void GL_APIENTRY SecondaryColor3fv(const GLfloat *v);
+ANGLE_EXPORT void GL_APIENTRY SecondaryColor3i(GLint red, GLint green, GLint blue);
+ANGLE_EXPORT void GL_APIENTRY SecondaryColor3iv(const GLint *v);
+ANGLE_EXPORT void GL_APIENTRY SecondaryColor3s(GLshort red, GLshort green, GLshort blue);
+ANGLE_EXPORT void GL_APIENTRY SecondaryColor3sv(const GLshort *v);
+ANGLE_EXPORT void GL_APIENTRY SecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue);
+ANGLE_EXPORT void GL_APIENTRY SecondaryColor3ubv(const GLubyte *v);
+ANGLE_EXPORT void GL_APIENTRY SecondaryColor3ui(GLuint red, GLuint green, GLuint blue);
+ANGLE_EXPORT void GL_APIENTRY SecondaryColor3uiv(const GLuint *v);
+ANGLE_EXPORT void GL_APIENTRY SecondaryColor3us(GLushort red, GLushort green, GLushort blue);
+ANGLE_EXPORT void GL_APIENTRY SecondaryColor3usv(const GLushort *v);
+ANGLE_EXPORT void GL_APIENTRY SecondaryColorPointer(GLint size,
+                                                    GLenum type,
+                                                    GLsizei stride,
+                                                    const void *pointer);
+ANGLE_EXPORT void GL_APIENTRY WindowPos2d(GLdouble x, GLdouble y);
+ANGLE_EXPORT void GL_APIENTRY WindowPos2dv(const GLdouble *v);
+ANGLE_EXPORT void GL_APIENTRY WindowPos2f(GLfloat x, GLfloat y);
+ANGLE_EXPORT void GL_APIENTRY WindowPos2fv(const GLfloat *v);
+ANGLE_EXPORT void GL_APIENTRY WindowPos2i(GLint x, GLint y);
+ANGLE_EXPORT void GL_APIENTRY WindowPos2iv(const GLint *v);
+ANGLE_EXPORT void GL_APIENTRY WindowPos2s(GLshort x, GLshort y);
+ANGLE_EXPORT void GL_APIENTRY WindowPos2sv(const GLshort *v);
+ANGLE_EXPORT void GL_APIENTRY WindowPos3d(GLdouble x, GLdouble y, GLdouble z);
+ANGLE_EXPORT void GL_APIENTRY WindowPos3dv(const GLdouble *v);
+ANGLE_EXPORT void GL_APIENTRY WindowPos3f(GLfloat x, GLfloat y, GLfloat z);
+ANGLE_EXPORT void GL_APIENTRY WindowPos3fv(const GLfloat *v);
+ANGLE_EXPORT void GL_APIENTRY WindowPos3i(GLint x, GLint y, GLint z);
+ANGLE_EXPORT void GL_APIENTRY WindowPos3iv(const GLint *v);
+ANGLE_EXPORT void GL_APIENTRY WindowPos3s(GLshort x, GLshort y, GLshort z);
+ANGLE_EXPORT void GL_APIENTRY WindowPos3sv(const GLshort *v);
+
+// GL 1.5
+ANGLE_EXPORT void GL_APIENTRY BeginQuery(GLenum target, GLuint id);
+ANGLE_EXPORT void GL_APIENTRY BindBuffer(GLenum target, GLuint buffer);
+ANGLE_EXPORT void GL_APIENTRY BufferData(GLenum target,
+                                         GLsizeiptr size,
+                                         const void *data,
+                                         GLenum usage);
+ANGLE_EXPORT void GL_APIENTRY BufferSubData(GLenum target,
+                                            GLintptr offset,
+                                            GLsizeiptr size,
+                                            const void *data);
+ANGLE_EXPORT void GL_APIENTRY DeleteBuffers(GLsizei n, const GLuint *buffers);
+ANGLE_EXPORT void GL_APIENTRY DeleteQueries(GLsizei n, const GLuint *ids);
+ANGLE_EXPORT void GL_APIENTRY EndQuery(GLenum target);
+ANGLE_EXPORT void GL_APIENTRY GenBuffers(GLsizei n, GLuint *buffers);
+ANGLE_EXPORT void GL_APIENTRY GenQueries(GLsizei n, GLuint *ids);
+ANGLE_EXPORT void GL_APIENTRY GetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ANGLE_EXPORT void GL_APIENTRY GetBufferPointerv(GLenum target, GLenum pname, void **params);
+ANGLE_EXPORT void GL_APIENTRY GetBufferSubData(GLenum target,
+                                               GLintptr offset,
+                                               GLsizeiptr size,
+                                               void *data);
+ANGLE_EXPORT void GL_APIENTRY GetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
+ANGLE_EXPORT void GL_APIENTRY GetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
+ANGLE_EXPORT void GL_APIENTRY GetQueryiv(GLenum target, GLenum pname, GLint *params);
+ANGLE_EXPORT GLboolean GL_APIENTRY IsBuffer(GLuint buffer);
+ANGLE_EXPORT GLboolean GL_APIENTRY IsQuery(GLuint id);
+ANGLE_EXPORT void *GL_APIENTRY MapBuffer(GLenum target, GLenum access);
+ANGLE_EXPORT GLboolean GL_APIENTRY UnmapBuffer(GLenum target);
+}  // namespace gl
+
+#endif  // LIBGL_ENTRY_POINTS_GL_1_AUTOGEN_H_
diff --git a/src/libGL/entry_points_gl_2_1_autogen.cpp b/src/libGL/entry_points_gl_2_1_autogen.cpp
deleted file mode 100644
index 430b749..0000000
--- a/src/libGL/entry_points_gl_2_1_autogen.cpp
+++ /dev/null
@@ -1,209 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// entry_points_gl_2_1_autogen.cpp:
-//   Defines the GL 2.1 entry points.
-
-#include "libGL/entry_points_gl_2_1_autogen.h"
-
-#include "libANGLE/Context.h"
-#include "libANGLE/Context.inl.h"
-#include "libANGLE/entry_points_utils.h"
-#include "libANGLE/gl_enum_utils.h"
-#include "libANGLE/validationEGL.h"
-#include "libANGLE/validationES.h"
-#include "libANGLE/validationES1.h"
-#include "libANGLE/validationES2.h"
-#include "libANGLE/validationES3.h"
-#include "libANGLE/validationES31.h"
-#include "libANGLE/validationES32.h"
-#include "libANGLE/validationESEXT.h"
-#include "libANGLE/validationGL21_autogen.h"
-#include "libGLESv2/global_state.h"
-
-namespace gl
-{
-void GL_APIENTRY UniformMatrix2x3fv(GLint location,
-                                    GLsizei count,
-                                    GLboolean transpose,
-                                    const GLfloat *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::UniformMatrix2x3fv, "glUniformMatrix2x3fv",
-          "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
-          CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
-
-    if (context)
-    {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateUniformMatrix2x3fv(context, locationPacked, count, transpose, value));
-        if (isCallValid)
-        {
-            context->uniformMatrix2x3fv(locationPacked, count, transpose, value);
-        }
-        ANGLE_CAPTURE(UniformMatrix2x3fv, isCallValid, context, locationPacked, count, transpose,
-                      value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY UniformMatrix2x4fv(GLint location,
-                                    GLsizei count,
-                                    GLboolean transpose,
-                                    const GLfloat *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::UniformMatrix2x4fv, "glUniformMatrix2x4fv",
-          "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
-          CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
-
-    if (context)
-    {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateUniformMatrix2x4fv(context, locationPacked, count, transpose, value));
-        if (isCallValid)
-        {
-            context->uniformMatrix2x4fv(locationPacked, count, transpose, value);
-        }
-        ANGLE_CAPTURE(UniformMatrix2x4fv, isCallValid, context, locationPacked, count, transpose,
-                      value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY UniformMatrix3x2fv(GLint location,
-                                    GLsizei count,
-                                    GLboolean transpose,
-                                    const GLfloat *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::UniformMatrix3x2fv, "glUniformMatrix3x2fv",
-          "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
-          CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
-
-    if (context)
-    {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateUniformMatrix3x2fv(context, locationPacked, count, transpose, value));
-        if (isCallValid)
-        {
-            context->uniformMatrix3x2fv(locationPacked, count, transpose, value);
-        }
-        ANGLE_CAPTURE(UniformMatrix3x2fv, isCallValid, context, locationPacked, count, transpose,
-                      value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY UniformMatrix3x4fv(GLint location,
-                                    GLsizei count,
-                                    GLboolean transpose,
-                                    const GLfloat *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::UniformMatrix3x4fv, "glUniformMatrix3x4fv",
-          "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
-          CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
-
-    if (context)
-    {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateUniformMatrix3x4fv(context, locationPacked, count, transpose, value));
-        if (isCallValid)
-        {
-            context->uniformMatrix3x4fv(locationPacked, count, transpose, value);
-        }
-        ANGLE_CAPTURE(UniformMatrix3x4fv, isCallValid, context, locationPacked, count, transpose,
-                      value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY UniformMatrix4x2fv(GLint location,
-                                    GLsizei count,
-                                    GLboolean transpose,
-                                    const GLfloat *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::UniformMatrix4x2fv, "glUniformMatrix4x2fv",
-          "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
-          CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
-
-    if (context)
-    {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateUniformMatrix4x2fv(context, locationPacked, count, transpose, value));
-        if (isCallValid)
-        {
-            context->uniformMatrix4x2fv(locationPacked, count, transpose, value);
-        }
-        ANGLE_CAPTURE(UniformMatrix4x2fv, isCallValid, context, locationPacked, count, transpose,
-                      value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY UniformMatrix4x3fv(GLint location,
-                                    GLsizei count,
-                                    GLboolean transpose,
-                                    const GLfloat *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::UniformMatrix4x3fv, "glUniformMatrix4x3fv",
-          "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
-          CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
-
-    if (context)
-    {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateUniformMatrix4x3fv(context, locationPacked, count, transpose, value));
-        if (isCallValid)
-        {
-            context->uniformMatrix4x3fv(locationPacked, count, transpose, value);
-        }
-        ANGLE_CAPTURE(UniformMatrix4x3fv, isCallValid, context, locationPacked, count, transpose,
-                      value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-}  // namespace gl
diff --git a/src/libGL/entry_points_gl_2_1_autogen.h b/src/libGL/entry_points_gl_2_1_autogen.h
deleted file mode 100644
index bbad834..0000000
--- a/src/libGL/entry_points_gl_2_1_autogen.h
+++ /dev/null
@@ -1,45 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// entry_points_gl_2_1_autogen.h:
-//   Defines the GL 2.1 entry points.
-
-#ifndef LIBGL_ENTRY_POINTS_GL_2_1_AUTOGEN_H_
-#define LIBGL_ENTRY_POINTS_GL_2_1_AUTOGEN_H_
-
-#include <export.h>
-#include "angle_gl.h"
-
-namespace gl
-{
-ANGLE_EXPORT void GL_APIENTRY UniformMatrix2x3fv(GLint location,
-                                                 GLsizei count,
-                                                 GLboolean transpose,
-                                                 const GLfloat *value);
-ANGLE_EXPORT void GL_APIENTRY UniformMatrix2x4fv(GLint location,
-                                                 GLsizei count,
-                                                 GLboolean transpose,
-                                                 const GLfloat *value);
-ANGLE_EXPORT void GL_APIENTRY UniformMatrix3x2fv(GLint location,
-                                                 GLsizei count,
-                                                 GLboolean transpose,
-                                                 const GLfloat *value);
-ANGLE_EXPORT void GL_APIENTRY UniformMatrix3x4fv(GLint location,
-                                                 GLsizei count,
-                                                 GLboolean transpose,
-                                                 const GLfloat *value);
-ANGLE_EXPORT void GL_APIENTRY UniformMatrix4x2fv(GLint location,
-                                                 GLsizei count,
-                                                 GLboolean transpose,
-                                                 const GLfloat *value);
-ANGLE_EXPORT void GL_APIENTRY UniformMatrix4x3fv(GLint location,
-                                                 GLsizei count,
-                                                 GLboolean transpose,
-                                                 const GLfloat *value);
-}  // namespace gl
-
-#endif  // LIBGL_ENTRY_POINTS_GL_2_1_AUTOGEN_H_
diff --git a/src/libGL/entry_points_gl_2_0_autogen.cpp b/src/libGL/entry_points_gl_2_autogen.cpp
similarity index 77%
rename from src/libGL/entry_points_gl_2_0_autogen.cpp
rename to src/libGL/entry_points_gl_2_autogen.cpp
index 7903dc1..199fb93 100644
--- a/src/libGL/entry_points_gl_2_0_autogen.cpp
+++ b/src/libGL/entry_points_gl_2_autogen.cpp
@@ -5,10 +5,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// entry_points_gl_2_0_autogen.cpp:
-//   Defines the GL 2.0 entry points.
+// entry_points_gl_2_autogen.cpp:
+//   Defines the Desktop GL 2.x entry points.
 
-#include "libGL/entry_points_gl_2_0_autogen.h"
+#include "libGL/entry_points_gl_2_autogen.h"
 
 #include "libANGLE/Context.h"
 #include "libANGLE/Context.inl.h"
@@ -27,16 +27,18 @@
 
 namespace gl
 {
+
+// GL 2.0
 void GL_APIENTRY AttachShader(GLuint program, GLuint shader)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::AttachShader, "glAttachShader",
-          "context = %d, program = %u, shader = %u", CID(context), program, shader);
+    EVENT(context, GLAttachShader, "context = %d, program = %u, shader = %u", CID(context), program,
+          shader);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        ShaderProgramID shaderPacked                          = FromGL<ShaderProgramID>(shader);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
+        ShaderProgramID shaderPacked                          = PackParam<ShaderProgramID>(shader);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateAttachShader(context, programPacked, shaderPacked));
@@ -55,13 +57,13 @@
 void GL_APIENTRY BindAttribLocation(GLuint program, GLuint index, const GLchar *name)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindAttribLocation, "glBindAttribLocation",
+    EVENT(context, GLBindAttribLocation,
           "context = %d, program = %u, index = %u, name = 0x%016" PRIxPTR "", CID(context), program,
           index, (uintptr_t)name);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateBindAttribLocation(context, programPacked, index, name));
@@ -80,9 +82,8 @@
 void GL_APIENTRY BlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BlendEquationSeparate, "glBlendEquationSeparate",
-          "context = %d, modeRGB = %s, modeAlpha = %s", CID(context),
-          GLenumToString(GLenumGroup::BlendEquationModeEXT, modeRGB),
+    EVENT(context, GLBlendEquationSeparate, "context = %d, modeRGB = %s, modeAlpha = %s",
+          CID(context), GLenumToString(GLenumGroup::BlendEquationModeEXT, modeRGB),
           GLenumToString(GLenumGroup::BlendEquationModeEXT, modeAlpha));
 
     if (context)
@@ -105,12 +106,11 @@
 void GL_APIENTRY CompileShader(GLuint shader)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CompileShader, "glCompileShader", "context = %d, shader = %u",
-          CID(context), shader);
+    EVENT(context, GLCompileShader, "context = %d, shader = %u", CID(context), shader);
 
     if (context)
     {
-        ShaderProgramID shaderPacked                          = FromGL<ShaderProgramID>(shader);
+        ShaderProgramID shaderPacked                          = PackParam<ShaderProgramID>(shader);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateCompileShader(context, shaderPacked));
@@ -129,7 +129,7 @@
 GLuint GL_APIENTRY CreateProgram()
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CreateProgram, "glCreateProgram", "context = %d", CID(context));
+    EVENT(context, GLCreateProgram, "context = %d", CID(context));
 
     GLuint returnValue;
     if (context)
@@ -142,14 +142,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::CreateProgram, GLuint>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLCreateProgram, GLuint>();
         }
         ANGLE_CAPTURE(CreateProgram, isCallValid, context, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::CreateProgram, GLuint>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLCreateProgram, GLuint>();
     }
     return returnValue;
 }
@@ -157,13 +157,13 @@
 GLuint GL_APIENTRY CreateShader(GLenum type)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CreateShader, "glCreateShader", "context = %d, type = %s",
-          CID(context), GLenumToString(GLenumGroup::ShaderType, type));
+    EVENT(context, GLCreateShader, "context = %d, type = %s", CID(context),
+          GLenumToString(GLenumGroup::ShaderType, type));
 
     GLuint returnValue;
     if (context)
     {
-        ShaderType typePacked                                 = FromGL<ShaderType>(type);
+        ShaderType typePacked                                 = PackParam<ShaderType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateCreateShader(context, typePacked));
         if (isCallValid)
@@ -172,14 +172,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::CreateShader, GLuint>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLCreateShader, GLuint>();
         }
         ANGLE_CAPTURE(CreateShader, isCallValid, context, typePacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::CreateShader, GLuint>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLCreateShader, GLuint>();
     }
     return returnValue;
 }
@@ -187,12 +187,11 @@
 void GL_APIENTRY DeleteProgram(GLuint program)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DeleteProgram, "glDeleteProgram", "context = %d, program = %u",
-          CID(context), program);
+    EVENT(context, GLDeleteProgram, "context = %d, program = %u", CID(context), program);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateDeleteProgram(context, programPacked));
@@ -211,12 +210,11 @@
 void GL_APIENTRY DeleteShader(GLuint shader)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DeleteShader, "glDeleteShader", "context = %d, shader = %u",
-          CID(context), shader);
+    EVENT(context, GLDeleteShader, "context = %d, shader = %u", CID(context), shader);
 
     if (context)
     {
-        ShaderProgramID shaderPacked                          = FromGL<ShaderProgramID>(shader);
+        ShaderProgramID shaderPacked                          = PackParam<ShaderProgramID>(shader);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateDeleteShader(context, shaderPacked));
@@ -235,13 +233,13 @@
 void GL_APIENTRY DetachShader(GLuint program, GLuint shader)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DetachShader, "glDetachShader",
-          "context = %d, program = %u, shader = %u", CID(context), program, shader);
+    EVENT(context, GLDetachShader, "context = %d, program = %u, shader = %u", CID(context), program,
+          shader);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        ShaderProgramID shaderPacked                          = FromGL<ShaderProgramID>(shader);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
+        ShaderProgramID shaderPacked                          = PackParam<ShaderProgramID>(shader);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateDetachShader(context, programPacked, shaderPacked));
@@ -260,8 +258,7 @@
 void GL_APIENTRY DisableVertexAttribArray(GLuint index)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DisableVertexAttribArray, "glDisableVertexAttribArray",
-          "context = %d, index = %u", CID(context), index);
+    EVENT(context, GLDisableVertexAttribArray, "context = %d, index = %u", CID(context), index);
 
     if (context)
     {
@@ -283,8 +280,8 @@
 void GL_APIENTRY DrawBuffers(GLsizei n, const GLenum *bufs)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawBuffers, "glDrawBuffers",
-          "context = %d, n = %d, bufs = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)bufs);
+    EVENT(context, GLDrawBuffers, "context = %d, n = %d, bufs = 0x%016" PRIxPTR "", CID(context), n,
+          (uintptr_t)bufs);
 
     if (context)
     {
@@ -305,8 +302,7 @@
 void GL_APIENTRY EnableVertexAttribArray(GLuint index)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::EnableVertexAttribArray, "glEnableVertexAttribArray",
-          "context = %d, index = %u", CID(context), index);
+    EVENT(context, GLEnableVertexAttribArray, "context = %d, index = %u", CID(context), index);
 
     if (context)
     {
@@ -334,7 +330,7 @@
                                  GLchar *name)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetActiveAttrib, "glGetActiveAttrib",
+    EVENT(context, GLGetActiveAttrib,
           "context = %d, program = %u, index = %u, bufSize = %d, length = 0x%016" PRIxPTR
           ", size = 0x%016" PRIxPTR ", type = 0x%016" PRIxPTR ", name = 0x%016" PRIxPTR "",
           CID(context), program, index, bufSize, (uintptr_t)length, (uintptr_t)size,
@@ -342,7 +338,7 @@
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetActiveAttrib(context, programPacked, index, bufSize, length,
@@ -369,7 +365,7 @@
                                   GLchar *name)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetActiveUniform, "glGetActiveUniform",
+    EVENT(context, GLGetActiveUniform,
           "context = %d, program = %u, index = %u, bufSize = %d, length = 0x%016" PRIxPTR
           ", size = 0x%016" PRIxPTR ", type = 0x%016" PRIxPTR ", name = 0x%016" PRIxPTR "",
           CID(context), program, index, bufSize, (uintptr_t)length, (uintptr_t)size,
@@ -377,7 +373,7 @@
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetActiveUniform(context, programPacked, index, bufSize, length,
@@ -401,15 +397,15 @@
                                     GLuint *shaders)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetAttachedShaders, "glGetAttachedShaders",
+    EVENT(context, GLGetAttachedShaders,
           "context = %d, program = %u, maxCount = %d, count = 0x%016" PRIxPTR
           ", shaders = 0x%016" PRIxPTR "",
           CID(context), program, maxCount, (uintptr_t)count, (uintptr_t)shaders);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        ShaderProgramID *shadersPacked                        = FromGL<ShaderProgramID *>(shaders);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        ShaderProgramID *shadersPacked = PackParam<ShaderProgramID *>(shaders);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -430,14 +426,13 @@
 GLint GL_APIENTRY GetAttribLocation(GLuint program, const GLchar *name)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetAttribLocation, "glGetAttribLocation",
-          "context = %d, program = %u, name = 0x%016" PRIxPTR "", CID(context), program,
-          (uintptr_t)name);
+    EVENT(context, GLGetAttribLocation, "context = %d, program = %u, name = 0x%016" PRIxPTR "",
+          CID(context), program, (uintptr_t)name);
 
     GLint returnValue;
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGetAttribLocation(context, programPacked, name));
@@ -447,14 +442,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetAttribLocation, GLint>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetAttribLocation, GLint>();
         }
         ANGLE_CAPTURE(GetAttribLocation, isCallValid, context, programPacked, name, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::GetAttribLocation, GLint>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetAttribLocation, GLint>();
     }
     return returnValue;
 }
@@ -465,14 +460,14 @@
                                    GLchar *infoLog)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetProgramInfoLog, "glGetProgramInfoLog",
+    EVENT(context, GLGetProgramInfoLog,
           "context = %d, program = %u, bufSize = %d, length = 0x%016" PRIxPTR
           ", infoLog = 0x%016" PRIxPTR "",
           CID(context), program, bufSize, (uintptr_t)length, (uintptr_t)infoLog);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -493,13 +488,13 @@
 void GL_APIENTRY GetProgramiv(GLuint program, GLenum pname, GLint *params)
 {
     Context *context = GetGlobalContext();
-    EVENT(context, gl::EntryPoint::GetProgramiv, "glGetProgramiv",
+    EVENT(context, GLGetProgramiv,
           "context = %d, program = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           program, GLenumToString(GLenumGroup::ProgramPropertyARB, pname), (uintptr_t)params);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetProgramiv(context, programPacked, pname, params));
@@ -516,14 +511,14 @@
 void GL_APIENTRY GetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetShaderInfoLog, "glGetShaderInfoLog",
+    EVENT(context, GLGetShaderInfoLog,
           "context = %d, shader = %u, bufSize = %d, length = 0x%016" PRIxPTR
           ", infoLog = 0x%016" PRIxPTR "",
           CID(context), shader, bufSize, (uintptr_t)length, (uintptr_t)infoLog);
 
     if (context)
     {
-        ShaderProgramID shaderPacked                          = FromGL<ShaderProgramID>(shader);
+        ShaderProgramID shaderPacked                          = PackParam<ShaderProgramID>(shader);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -544,14 +539,14 @@
 void GL_APIENTRY GetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetShaderSource, "glGetShaderSource",
+    EVENT(context, GLGetShaderSource,
           "context = %d, shader = %u, bufSize = %d, length = 0x%016" PRIxPTR
           ", source = 0x%016" PRIxPTR "",
           CID(context), shader, bufSize, (uintptr_t)length, (uintptr_t)source);
 
     if (context)
     {
-        ShaderProgramID shaderPacked                          = FromGL<ShaderProgramID>(shader);
+        ShaderProgramID shaderPacked                          = PackParam<ShaderProgramID>(shader);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -571,13 +566,13 @@
 void GL_APIENTRY GetShaderiv(GLuint shader, GLenum pname, GLint *params)
 {
     Context *context = GetGlobalContext();
-    EVENT(context, gl::EntryPoint::GetShaderiv, "glGetShaderiv",
+    EVENT(context, GLGetShaderiv,
           "context = %d, shader = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), shader,
           GLenumToString(GLenumGroup::ShaderParameterName, pname), (uintptr_t)params);
 
     if (context)
     {
-        ShaderProgramID shaderPacked                          = FromGL<ShaderProgramID>(shader);
+        ShaderProgramID shaderPacked                          = PackParam<ShaderProgramID>(shader);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetShaderiv(context, shaderPacked, pname, params));
@@ -594,14 +589,13 @@
 GLint GL_APIENTRY GetUniformLocation(GLuint program, const GLchar *name)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetUniformLocation, "glGetUniformLocation",
-          "context = %d, program = %u, name = 0x%016" PRIxPTR "", CID(context), program,
-          (uintptr_t)name);
+    EVENT(context, GLGetUniformLocation, "context = %d, program = %u, name = 0x%016" PRIxPTR "",
+          CID(context), program, (uintptr_t)name);
 
     GLint returnValue;
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGetUniformLocation(context, programPacked, name));
@@ -611,14 +605,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetUniformLocation, GLint>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetUniformLocation, GLint>();
         }
         ANGLE_CAPTURE(GetUniformLocation, isCallValid, context, programPacked, name, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::GetUniformLocation, GLint>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetUniformLocation, GLint>();
     }
     return returnValue;
 }
@@ -626,14 +620,14 @@
 void GL_APIENTRY GetUniformfv(GLuint program, GLint location, GLfloat *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetUniformfv, "glGetUniformfv",
+    EVENT(context, GLGetUniformfv,
           "context = %d, program = %u, location = %d, params = 0x%016" PRIxPTR "", CID(context),
           program, location, (uintptr_t)params);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetUniformfv(context, programPacked, locationPacked, params));
@@ -652,14 +646,14 @@
 void GL_APIENTRY GetUniformiv(GLuint program, GLint location, GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetUniformiv, "glGetUniformiv",
+    EVENT(context, GLGetUniformiv,
           "context = %d, program = %u, location = %d, params = 0x%016" PRIxPTR "", CID(context),
           program, location, (uintptr_t)params);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetUniformiv(context, programPacked, locationPacked, params));
@@ -678,7 +672,7 @@
 void GL_APIENTRY GetVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetVertexAttribPointerv, "glGetVertexAttribPointerv",
+    EVENT(context, GLGetVertexAttribPointerv,
           "context = %d, index = %u, pname = %s, pointer = 0x%016" PRIxPTR "", CID(context), index,
           GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)pointer);
 
@@ -702,7 +696,7 @@
 void GL_APIENTRY GetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetVertexAttribdv, "glGetVertexAttribdv",
+    EVENT(context, GLGetVertexAttribdv,
           "context = %d, index = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), index,
           GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
 
@@ -726,7 +720,7 @@
 void GL_APIENTRY GetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetVertexAttribfv, "glGetVertexAttribfv",
+    EVENT(context, GLGetVertexAttribfv,
           "context = %d, index = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), index,
           GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
 
@@ -750,7 +744,7 @@
 void GL_APIENTRY GetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetVertexAttribiv, "glGetVertexAttribiv",
+    EVENT(context, GLGetVertexAttribiv,
           "context = %d, index = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), index,
           GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
 
@@ -774,13 +768,12 @@
 GLboolean GL_APIENTRY IsProgram(GLuint program)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IsProgram, "glIsProgram", "context = %d, program = %u",
-          CID(context), program);
+    EVENT(context, GLIsProgram, "context = %d, program = %u", CID(context), program);
 
     GLboolean returnValue;
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateIsProgram(context, programPacked));
         if (isCallValid)
@@ -789,14 +782,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsProgram, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsProgram, GLboolean>();
         }
         ANGLE_CAPTURE(IsProgram, isCallValid, context, programPacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::IsProgram, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsProgram, GLboolean>();
     }
     return returnValue;
 }
@@ -804,13 +797,12 @@
 GLboolean GL_APIENTRY IsShader(GLuint shader)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IsShader, "glIsShader", "context = %d, shader = %u",
-          CID(context), shader);
+    EVENT(context, GLIsShader, "context = %d, shader = %u", CID(context), shader);
 
     GLboolean returnValue;
     if (context)
     {
-        ShaderProgramID shaderPacked                          = FromGL<ShaderProgramID>(shader);
+        ShaderProgramID shaderPacked                          = PackParam<ShaderProgramID>(shader);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateIsShader(context, shaderPacked));
         if (isCallValid)
@@ -819,14 +811,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsShader, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsShader, GLboolean>();
         }
         ANGLE_CAPTURE(IsShader, isCallValid, context, shaderPacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::IsShader, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsShader, GLboolean>();
     }
     return returnValue;
 }
@@ -834,12 +826,11 @@
 void GL_APIENTRY LinkProgram(GLuint program)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::LinkProgram, "glLinkProgram", "context = %d, program = %u",
-          CID(context), program);
+    EVENT(context, GLLinkProgram, "context = %d, program = %u", CID(context), program);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateLinkProgram(context, programPacked));
@@ -861,14 +852,14 @@
                               const GLint *length)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ShaderSource, "glShaderSource",
+    EVENT(context, GLShaderSource,
           "context = %d, shader = %u, count = %d, string = 0x%016" PRIxPTR
           ", length = 0x%016" PRIxPTR "",
           CID(context), shader, count, (uintptr_t)string, (uintptr_t)length);
 
     if (context)
     {
-        ShaderProgramID shaderPacked                          = FromGL<ShaderProgramID>(shader);
+        ShaderProgramID shaderPacked                          = PackParam<ShaderProgramID>(shader);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateShaderSource(context, shaderPacked, count, string, length));
@@ -887,9 +878,8 @@
 void GL_APIENTRY StencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::StencilFuncSeparate, "glStencilFuncSeparate",
-          "context = %d, face = %s, func = %s, ref = %d, mask = %u", CID(context),
-          GLenumToString(GLenumGroup::StencilFaceDirection, face),
+    EVENT(context, GLStencilFuncSeparate, "context = %d, face = %s, func = %s, ref = %d, mask = %u",
+          CID(context), GLenumToString(GLenumGroup::StencilFaceDirection, face),
           GLenumToString(GLenumGroup::StencilFunction, func), ref, mask);
 
     if (context)
@@ -912,8 +902,7 @@
 void GL_APIENTRY StencilMaskSeparate(GLenum face, GLuint mask)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::StencilMaskSeparate, "glStencilMaskSeparate",
-          "context = %d, face = %s, mask = %u", CID(context),
+    EVENT(context, GLStencilMaskSeparate, "context = %d, face = %s, mask = %u", CID(context),
           GLenumToString(GLenumGroup::StencilFaceDirection, face), mask);
 
     if (context)
@@ -936,7 +925,7 @@
 void GL_APIENTRY StencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::StencilOpSeparate, "glStencilOpSeparate",
+    EVENT(context, GLStencilOpSeparate,
           "context = %d, face = %s, sfail = %s, dpfail = %s, dppass = %s", CID(context),
           GLenumToString(GLenumGroup::StencilFaceDirection, face),
           GLenumToString(GLenumGroup::StencilOp, sfail),
@@ -963,12 +952,11 @@
 void GL_APIENTRY Uniform1f(GLint location, GLfloat v0)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform1f, "glUniform1f", "context = %d, location = %d, v0 = %f",
-          CID(context), location, v0);
+    EVENT(context, GLUniform1f, "context = %d, location = %d, v0 = %f", CID(context), location, v0);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateUniform1f(context, locationPacked, v0));
@@ -987,13 +975,13 @@
 void GL_APIENTRY Uniform1fv(GLint location, GLsizei count, const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform1fv, "glUniform1fv",
+    EVENT(context, GLUniform1fv,
           "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
           location, count, (uintptr_t)value);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform1fv(context, locationPacked, count, value));
@@ -1012,12 +1000,11 @@
 void GL_APIENTRY Uniform1i(GLint location, GLint v0)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform1i, "glUniform1i", "context = %d, location = %d, v0 = %d",
-          CID(context), location, v0);
+    EVENT(context, GLUniform1i, "context = %d, location = %d, v0 = %d", CID(context), location, v0);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateUniform1i(context, locationPacked, v0));
@@ -1036,13 +1023,13 @@
 void GL_APIENTRY Uniform1iv(GLint location, GLsizei count, const GLint *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform1iv, "glUniform1iv",
+    EVENT(context, GLUniform1iv,
           "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
           location, count, (uintptr_t)value);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform1iv(context, locationPacked, count, value));
@@ -1061,12 +1048,12 @@
 void GL_APIENTRY Uniform2f(GLint location, GLfloat v0, GLfloat v1)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform2f, "glUniform2f",
-          "context = %d, location = %d, v0 = %f, v1 = %f", CID(context), location, v0, v1);
+    EVENT(context, GLUniform2f, "context = %d, location = %d, v0 = %f, v1 = %f", CID(context),
+          location, v0, v1);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateUniform2f(context, locationPacked, v0, v1));
@@ -1085,13 +1072,13 @@
 void GL_APIENTRY Uniform2fv(GLint location, GLsizei count, const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform2fv, "glUniform2fv",
+    EVENT(context, GLUniform2fv,
           "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
           location, count, (uintptr_t)value);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform2fv(context, locationPacked, count, value));
@@ -1110,12 +1097,12 @@
 void GL_APIENTRY Uniform2i(GLint location, GLint v0, GLint v1)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform2i, "glUniform2i",
-          "context = %d, location = %d, v0 = %d, v1 = %d", CID(context), location, v0, v1);
+    EVENT(context, GLUniform2i, "context = %d, location = %d, v0 = %d, v1 = %d", CID(context),
+          location, v0, v1);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateUniform2i(context, locationPacked, v0, v1));
@@ -1134,13 +1121,13 @@
 void GL_APIENTRY Uniform2iv(GLint location, GLsizei count, const GLint *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform2iv, "glUniform2iv",
+    EVENT(context, GLUniform2iv,
           "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
           location, count, (uintptr_t)value);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform2iv(context, locationPacked, count, value));
@@ -1159,13 +1146,12 @@
 void GL_APIENTRY Uniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform3f, "glUniform3f",
-          "context = %d, location = %d, v0 = %f, v1 = %f, v2 = %f", CID(context), location, v0, v1,
-          v2);
+    EVENT(context, GLUniform3f, "context = %d, location = %d, v0 = %f, v1 = %f, v2 = %f",
+          CID(context), location, v0, v1, v2);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateUniform3f(context, locationPacked, v0, v1, v2));
@@ -1184,13 +1170,13 @@
 void GL_APIENTRY Uniform3fv(GLint location, GLsizei count, const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform3fv, "glUniform3fv",
+    EVENT(context, GLUniform3fv,
           "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
           location, count, (uintptr_t)value);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform3fv(context, locationPacked, count, value));
@@ -1209,13 +1195,12 @@
 void GL_APIENTRY Uniform3i(GLint location, GLint v0, GLint v1, GLint v2)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform3i, "glUniform3i",
-          "context = %d, location = %d, v0 = %d, v1 = %d, v2 = %d", CID(context), location, v0, v1,
-          v2);
+    EVENT(context, GLUniform3i, "context = %d, location = %d, v0 = %d, v1 = %d, v2 = %d",
+          CID(context), location, v0, v1, v2);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateUniform3i(context, locationPacked, v0, v1, v2));
@@ -1234,13 +1219,13 @@
 void GL_APIENTRY Uniform3iv(GLint location, GLsizei count, const GLint *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform3iv, "glUniform3iv",
+    EVENT(context, GLUniform3iv,
           "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
           location, count, (uintptr_t)value);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform3iv(context, locationPacked, count, value));
@@ -1259,13 +1244,12 @@
 void GL_APIENTRY Uniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform4f, "glUniform4f",
-          "context = %d, location = %d, v0 = %f, v1 = %f, v2 = %f, v3 = %f", CID(context), location,
-          v0, v1, v2, v3);
+    EVENT(context, GLUniform4f, "context = %d, location = %d, v0 = %f, v1 = %f, v2 = %f, v3 = %f",
+          CID(context), location, v0, v1, v2, v3);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform4f(context, locationPacked, v0, v1, v2, v3));
@@ -1284,13 +1268,13 @@
 void GL_APIENTRY Uniform4fv(GLint location, GLsizei count, const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform4fv, "glUniform4fv",
+    EVENT(context, GLUniform4fv,
           "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
           location, count, (uintptr_t)value);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform4fv(context, locationPacked, count, value));
@@ -1309,13 +1293,12 @@
 void GL_APIENTRY Uniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform4i, "glUniform4i",
-          "context = %d, location = %d, v0 = %d, v1 = %d, v2 = %d, v3 = %d", CID(context), location,
-          v0, v1, v2, v3);
+    EVENT(context, GLUniform4i, "context = %d, location = %d, v0 = %d, v1 = %d, v2 = %d, v3 = %d",
+          CID(context), location, v0, v1, v2, v3);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform4i(context, locationPacked, v0, v1, v2, v3));
@@ -1334,13 +1317,13 @@
 void GL_APIENTRY Uniform4iv(GLint location, GLsizei count, const GLint *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform4iv, "glUniform4iv",
+    EVENT(context, GLUniform4iv,
           "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
           location, count, (uintptr_t)value);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform4iv(context, locationPacked, count, value));
@@ -1362,13 +1345,13 @@
                                   const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::UniformMatrix2fv, "glUniformMatrix2fv",
+    EVENT(context, GLUniformMatrix2fv,
           "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
           CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -1392,13 +1375,13 @@
                                   const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::UniformMatrix3fv, "glUniformMatrix3fv",
+    EVENT(context, GLUniformMatrix3fv,
           "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
           CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -1422,13 +1405,13 @@
                                   const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::UniformMatrix4fv, "glUniformMatrix4fv",
+    EVENT(context, GLUniformMatrix4fv,
           "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
           CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -1449,12 +1432,11 @@
 void GL_APIENTRY UseProgram(GLuint program)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::UseProgram, "glUseProgram", "context = %d, program = %u",
-          CID(context), program);
+    EVENT(context, GLUseProgram, "context = %d, program = %u", CID(context), program);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateUseProgram(context, programPacked));
@@ -1473,12 +1455,11 @@
 void GL_APIENTRY ValidateProgram(GLuint program)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ValidateProgram, "glValidateProgram",
-          "context = %d, program = %u", CID(context), program);
+    EVENT(context, GLValidateProgram, "context = %d, program = %u", CID(context), program);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateValidateProgram(context, programPacked));
@@ -1497,8 +1478,7 @@
 void GL_APIENTRY VertexAttrib1d(GLuint index, GLdouble x)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib1d, "glVertexAttrib1d",
-          "context = %d, index = %u, x = %f", CID(context), index, x);
+    EVENT(context, GLVertexAttrib1d, "context = %d, index = %u, x = %f", CID(context), index, x);
 
     if (context)
     {
@@ -1519,8 +1499,8 @@
 void GL_APIENTRY VertexAttrib1dv(GLuint index, const GLdouble *v)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib1dv, "glVertexAttrib1dv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
+    EVENT(context, GLVertexAttrib1dv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
 
     if (context)
     {
@@ -1542,8 +1522,7 @@
 void GL_APIENTRY VertexAttrib1f(GLuint index, GLfloat x)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib1f, "glVertexAttrib1f",
-          "context = %d, index = %u, x = %f", CID(context), index, x);
+    EVENT(context, GLVertexAttrib1f, "context = %d, index = %u, x = %f", CID(context), index, x);
 
     if (context)
     {
@@ -1564,8 +1543,8 @@
 void GL_APIENTRY VertexAttrib1fv(GLuint index, const GLfloat *v)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib1fv, "glVertexAttrib1fv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
+    EVENT(context, GLVertexAttrib1fv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
 
     if (context)
     {
@@ -1587,8 +1566,7 @@
 void GL_APIENTRY VertexAttrib1s(GLuint index, GLshort x)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib1s, "glVertexAttrib1s",
-          "context = %d, index = %u, x = %d", CID(context), index, x);
+    EVENT(context, GLVertexAttrib1s, "context = %d, index = %u, x = %d", CID(context), index, x);
 
     if (context)
     {
@@ -1609,8 +1587,8 @@
 void GL_APIENTRY VertexAttrib1sv(GLuint index, const GLshort *v)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib1sv, "glVertexAttrib1sv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
+    EVENT(context, GLVertexAttrib1sv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
 
     if (context)
     {
@@ -1632,8 +1610,8 @@
 void GL_APIENTRY VertexAttrib2d(GLuint index, GLdouble x, GLdouble y)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib2d, "glVertexAttrib2d",
-          "context = %d, index = %u, x = %f, y = %f", CID(context), index, x, y);
+    EVENT(context, GLVertexAttrib2d, "context = %d, index = %u, x = %f, y = %f", CID(context),
+          index, x, y);
 
     if (context)
     {
@@ -1655,8 +1633,8 @@
 void GL_APIENTRY VertexAttrib2dv(GLuint index, const GLdouble *v)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib2dv, "glVertexAttrib2dv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
+    EVENT(context, GLVertexAttrib2dv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
 
     if (context)
     {
@@ -1678,8 +1656,8 @@
 void GL_APIENTRY VertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib2f, "glVertexAttrib2f",
-          "context = %d, index = %u, x = %f, y = %f", CID(context), index, x, y);
+    EVENT(context, GLVertexAttrib2f, "context = %d, index = %u, x = %f, y = %f", CID(context),
+          index, x, y);
 
     if (context)
     {
@@ -1701,8 +1679,8 @@
 void GL_APIENTRY VertexAttrib2fv(GLuint index, const GLfloat *v)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib2fv, "glVertexAttrib2fv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
+    EVENT(context, GLVertexAttrib2fv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
 
     if (context)
     {
@@ -1724,8 +1702,8 @@
 void GL_APIENTRY VertexAttrib2s(GLuint index, GLshort x, GLshort y)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib2s, "glVertexAttrib2s",
-          "context = %d, index = %u, x = %d, y = %d", CID(context), index, x, y);
+    EVENT(context, GLVertexAttrib2s, "context = %d, index = %u, x = %d, y = %d", CID(context),
+          index, x, y);
 
     if (context)
     {
@@ -1747,8 +1725,8 @@
 void GL_APIENTRY VertexAttrib2sv(GLuint index, const GLshort *v)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib2sv, "glVertexAttrib2sv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
+    EVENT(context, GLVertexAttrib2sv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
 
     if (context)
     {
@@ -1770,8 +1748,8 @@
 void GL_APIENTRY VertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib3d, "glVertexAttrib3d",
-          "context = %d, index = %u, x = %f, y = %f, z = %f", CID(context), index, x, y, z);
+    EVENT(context, GLVertexAttrib3d, "context = %d, index = %u, x = %f, y = %f, z = %f",
+          CID(context), index, x, y, z);
 
     if (context)
     {
@@ -1793,8 +1771,8 @@
 void GL_APIENTRY VertexAttrib3dv(GLuint index, const GLdouble *v)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib3dv, "glVertexAttrib3dv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
+    EVENT(context, GLVertexAttrib3dv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
 
     if (context)
     {
@@ -1816,8 +1794,8 @@
 void GL_APIENTRY VertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib3f, "glVertexAttrib3f",
-          "context = %d, index = %u, x = %f, y = %f, z = %f", CID(context), index, x, y, z);
+    EVENT(context, GLVertexAttrib3f, "context = %d, index = %u, x = %f, y = %f, z = %f",
+          CID(context), index, x, y, z);
 
     if (context)
     {
@@ -1839,8 +1817,8 @@
 void GL_APIENTRY VertexAttrib3fv(GLuint index, const GLfloat *v)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib3fv, "glVertexAttrib3fv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
+    EVENT(context, GLVertexAttrib3fv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
 
     if (context)
     {
@@ -1862,8 +1840,8 @@
 void GL_APIENTRY VertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib3s, "glVertexAttrib3s",
-          "context = %d, index = %u, x = %d, y = %d, z = %d", CID(context), index, x, y, z);
+    EVENT(context, GLVertexAttrib3s, "context = %d, index = %u, x = %d, y = %d, z = %d",
+          CID(context), index, x, y, z);
 
     if (context)
     {
@@ -1885,8 +1863,8 @@
 void GL_APIENTRY VertexAttrib3sv(GLuint index, const GLshort *v)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib3sv, "glVertexAttrib3sv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
+    EVENT(context, GLVertexAttrib3sv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
 
     if (context)
     {
@@ -1908,8 +1886,8 @@
 void GL_APIENTRY VertexAttrib4Nbv(GLuint index, const GLbyte *v)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib4Nbv, "glVertexAttrib4Nbv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
+    EVENT(context, GLVertexAttrib4Nbv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
 
     if (context)
     {
@@ -1931,8 +1909,8 @@
 void GL_APIENTRY VertexAttrib4Niv(GLuint index, const GLint *v)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib4Niv, "glVertexAttrib4Niv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
+    EVENT(context, GLVertexAttrib4Niv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
 
     if (context)
     {
@@ -1954,8 +1932,8 @@
 void GL_APIENTRY VertexAttrib4Nsv(GLuint index, const GLshort *v)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib4Nsv, "glVertexAttrib4Nsv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
+    EVENT(context, GLVertexAttrib4Nsv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
 
     if (context)
     {
@@ -1977,9 +1955,8 @@
 void GL_APIENTRY VertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib4Nub, "glVertexAttrib4Nub",
-          "context = %d, index = %u, x = %d, y = %d, z = %d, w = %d", CID(context), index, x, y, z,
-          w);
+    EVENT(context, GLVertexAttrib4Nub, "context = %d, index = %u, x = %d, y = %d, z = %d, w = %d",
+          CID(context), index, x, y, z, w);
 
     if (context)
     {
@@ -2001,8 +1978,8 @@
 void GL_APIENTRY VertexAttrib4Nubv(GLuint index, const GLubyte *v)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib4Nubv, "glVertexAttrib4Nubv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
+    EVENT(context, GLVertexAttrib4Nubv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
 
     if (context)
     {
@@ -2024,8 +2001,8 @@
 void GL_APIENTRY VertexAttrib4Nuiv(GLuint index, const GLuint *v)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib4Nuiv, "glVertexAttrib4Nuiv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
+    EVENT(context, GLVertexAttrib4Nuiv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
 
     if (context)
     {
@@ -2047,8 +2024,8 @@
 void GL_APIENTRY VertexAttrib4Nusv(GLuint index, const GLushort *v)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib4Nusv, "glVertexAttrib4Nusv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
+    EVENT(context, GLVertexAttrib4Nusv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
 
     if (context)
     {
@@ -2070,8 +2047,8 @@
 void GL_APIENTRY VertexAttrib4bv(GLuint index, const GLbyte *v)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib4bv, "glVertexAttrib4bv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
+    EVENT(context, GLVertexAttrib4bv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
 
     if (context)
     {
@@ -2093,9 +2070,8 @@
 void GL_APIENTRY VertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib4d, "glVertexAttrib4d",
-          "context = %d, index = %u, x = %f, y = %f, z = %f, w = %f", CID(context), index, x, y, z,
-          w);
+    EVENT(context, GLVertexAttrib4d, "context = %d, index = %u, x = %f, y = %f, z = %f, w = %f",
+          CID(context), index, x, y, z, w);
 
     if (context)
     {
@@ -2117,8 +2093,8 @@
 void GL_APIENTRY VertexAttrib4dv(GLuint index, const GLdouble *v)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib4dv, "glVertexAttrib4dv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
+    EVENT(context, GLVertexAttrib4dv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
 
     if (context)
     {
@@ -2140,9 +2116,8 @@
 void GL_APIENTRY VertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib4f, "glVertexAttrib4f",
-          "context = %d, index = %u, x = %f, y = %f, z = %f, w = %f", CID(context), index, x, y, z,
-          w);
+    EVENT(context, GLVertexAttrib4f, "context = %d, index = %u, x = %f, y = %f, z = %f, w = %f",
+          CID(context), index, x, y, z, w);
 
     if (context)
     {
@@ -2164,8 +2139,8 @@
 void GL_APIENTRY VertexAttrib4fv(GLuint index, const GLfloat *v)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib4fv, "glVertexAttrib4fv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
+    EVENT(context, GLVertexAttrib4fv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
 
     if (context)
     {
@@ -2187,8 +2162,8 @@
 void GL_APIENTRY VertexAttrib4iv(GLuint index, const GLint *v)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib4iv, "glVertexAttrib4iv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
+    EVENT(context, GLVertexAttrib4iv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
 
     if (context)
     {
@@ -2210,9 +2185,8 @@
 void GL_APIENTRY VertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib4s, "glVertexAttrib4s",
-          "context = %d, index = %u, x = %d, y = %d, z = %d, w = %d", CID(context), index, x, y, z,
-          w);
+    EVENT(context, GLVertexAttrib4s, "context = %d, index = %u, x = %d, y = %d, z = %d, w = %d",
+          CID(context), index, x, y, z, w);
 
     if (context)
     {
@@ -2234,8 +2208,8 @@
 void GL_APIENTRY VertexAttrib4sv(GLuint index, const GLshort *v)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib4sv, "glVertexAttrib4sv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
+    EVENT(context, GLVertexAttrib4sv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
 
     if (context)
     {
@@ -2257,8 +2231,8 @@
 void GL_APIENTRY VertexAttrib4ubv(GLuint index, const GLubyte *v)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib4ubv, "glVertexAttrib4ubv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
+    EVENT(context, GLVertexAttrib4ubv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
 
     if (context)
     {
@@ -2280,8 +2254,8 @@
 void GL_APIENTRY VertexAttrib4uiv(GLuint index, const GLuint *v)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib4uiv, "glVertexAttrib4uiv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
+    EVENT(context, GLVertexAttrib4uiv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
 
     if (context)
     {
@@ -2303,8 +2277,8 @@
 void GL_APIENTRY VertexAttrib4usv(GLuint index, const GLushort *v)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib4usv, "glVertexAttrib4usv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
+    EVENT(context, GLVertexAttrib4usv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
 
     if (context)
     {
@@ -2331,7 +2305,7 @@
                                      const void *pointer)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribPointer, "glVertexAttribPointer",
+    EVENT(context, GLVertexAttribPointer,
           "context = %d, index = %u, size = %d, type = %s, normalized = %s, stride = %d, pointer = "
           "0x%016" PRIxPTR "",
           CID(context), index, size, GLenumToString(GLenumGroup::VertexAttribPointerType, type),
@@ -2339,7 +2313,7 @@
 
     if (context)
     {
-        VertexAttribType typePacked                           = FromGL<VertexAttribType>(type);
+        VertexAttribType typePacked                           = PackParam<VertexAttribType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateVertexAttribPointer(context, index, size, typePacked,
@@ -2356,4 +2330,185 @@
         GenerateContextLostErrorOnCurrentGlobalContext();
     }
 }
+
+// GL 2.1
+void GL_APIENTRY UniformMatrix2x3fv(GLint location,
+                                    GLsizei count,
+                                    GLboolean transpose,
+                                    const GLfloat *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLUniformMatrix2x3fv,
+          "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
+          CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
+
+    if (context)
+    {
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateUniformMatrix2x3fv(context, locationPacked, count, transpose, value));
+        if (isCallValid)
+        {
+            context->uniformMatrix2x3fv(locationPacked, count, transpose, value);
+        }
+        ANGLE_CAPTURE(UniformMatrix2x3fv, isCallValid, context, locationPacked, count, transpose,
+                      value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY UniformMatrix2x4fv(GLint location,
+                                    GLsizei count,
+                                    GLboolean transpose,
+                                    const GLfloat *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLUniformMatrix2x4fv,
+          "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
+          CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
+
+    if (context)
+    {
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateUniformMatrix2x4fv(context, locationPacked, count, transpose, value));
+        if (isCallValid)
+        {
+            context->uniformMatrix2x4fv(locationPacked, count, transpose, value);
+        }
+        ANGLE_CAPTURE(UniformMatrix2x4fv, isCallValid, context, locationPacked, count, transpose,
+                      value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY UniformMatrix3x2fv(GLint location,
+                                    GLsizei count,
+                                    GLboolean transpose,
+                                    const GLfloat *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLUniformMatrix3x2fv,
+          "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
+          CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
+
+    if (context)
+    {
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateUniformMatrix3x2fv(context, locationPacked, count, transpose, value));
+        if (isCallValid)
+        {
+            context->uniformMatrix3x2fv(locationPacked, count, transpose, value);
+        }
+        ANGLE_CAPTURE(UniformMatrix3x2fv, isCallValid, context, locationPacked, count, transpose,
+                      value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY UniformMatrix3x4fv(GLint location,
+                                    GLsizei count,
+                                    GLboolean transpose,
+                                    const GLfloat *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLUniformMatrix3x4fv,
+          "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
+          CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
+
+    if (context)
+    {
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateUniformMatrix3x4fv(context, locationPacked, count, transpose, value));
+        if (isCallValid)
+        {
+            context->uniformMatrix3x4fv(locationPacked, count, transpose, value);
+        }
+        ANGLE_CAPTURE(UniformMatrix3x4fv, isCallValid, context, locationPacked, count, transpose,
+                      value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY UniformMatrix4x2fv(GLint location,
+                                    GLsizei count,
+                                    GLboolean transpose,
+                                    const GLfloat *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLUniformMatrix4x2fv,
+          "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
+          CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
+
+    if (context)
+    {
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateUniformMatrix4x2fv(context, locationPacked, count, transpose, value));
+        if (isCallValid)
+        {
+            context->uniformMatrix4x2fv(locationPacked, count, transpose, value);
+        }
+        ANGLE_CAPTURE(UniformMatrix4x2fv, isCallValid, context, locationPacked, count, transpose,
+                      value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY UniformMatrix4x3fv(GLint location,
+                                    GLsizei count,
+                                    GLboolean transpose,
+                                    const GLfloat *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLUniformMatrix4x3fv,
+          "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
+          CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
+
+    if (context)
+    {
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateUniformMatrix4x3fv(context, locationPacked, count, transpose, value));
+        if (isCallValid)
+        {
+            context->uniformMatrix4x3fv(locationPacked, count, transpose, value);
+        }
+        ANGLE_CAPTURE(UniformMatrix4x3fv, isCallValid, context, locationPacked, count, transpose,
+                      value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
 }  // namespace gl
diff --git a/src/libGL/entry_points_gl_2_0_autogen.h b/src/libGL/entry_points_gl_2_autogen.h
similarity index 84%
rename from src/libGL/entry_points_gl_2_0_autogen.h
rename to src/libGL/entry_points_gl_2_autogen.h
index 0972162..24d45be 100644
--- a/src/libGL/entry_points_gl_2_0_autogen.h
+++ b/src/libGL/entry_points_gl_2_autogen.h
@@ -5,17 +5,19 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// entry_points_gl_2_0_autogen.h:
-//   Defines the GL 2.0 entry points.
+// entry_points_gl_2_autogen.h:
+//   Defines the Desktop GL 2.x entry points.
 
-#ifndef LIBGL_ENTRY_POINTS_GL_2_0_AUTOGEN_H_
-#define LIBGL_ENTRY_POINTS_GL_2_0_AUTOGEN_H_
+#ifndef LIBGL_ENTRY_POINTS_GL_2_AUTOGEN_H_
+#define LIBGL_ENTRY_POINTS_GL_2_AUTOGEN_H_
 
 #include <export.h>
 #include "angle_gl.h"
 
 namespace gl
 {
+
+// GL 2.0
 ANGLE_EXPORT void GL_APIENTRY AttachShader(GLuint program, GLuint shader);
 ANGLE_EXPORT void GL_APIENTRY BindAttribLocation(GLuint program, GLuint index, const GLchar *name);
 ANGLE_EXPORT void GL_APIENTRY BlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
@@ -158,6 +160,32 @@
                                                   GLboolean normalized,
                                                   GLsizei stride,
                                                   const void *pointer);
+
+// GL 2.1
+ANGLE_EXPORT void GL_APIENTRY UniformMatrix2x3fv(GLint location,
+                                                 GLsizei count,
+                                                 GLboolean transpose,
+                                                 const GLfloat *value);
+ANGLE_EXPORT void GL_APIENTRY UniformMatrix2x4fv(GLint location,
+                                                 GLsizei count,
+                                                 GLboolean transpose,
+                                                 const GLfloat *value);
+ANGLE_EXPORT void GL_APIENTRY UniformMatrix3x2fv(GLint location,
+                                                 GLsizei count,
+                                                 GLboolean transpose,
+                                                 const GLfloat *value);
+ANGLE_EXPORT void GL_APIENTRY UniformMatrix3x4fv(GLint location,
+                                                 GLsizei count,
+                                                 GLboolean transpose,
+                                                 const GLfloat *value);
+ANGLE_EXPORT void GL_APIENTRY UniformMatrix4x2fv(GLint location,
+                                                 GLsizei count,
+                                                 GLboolean transpose,
+                                                 const GLfloat *value);
+ANGLE_EXPORT void GL_APIENTRY UniformMatrix4x3fv(GLint location,
+                                                 GLsizei count,
+                                                 GLboolean transpose,
+                                                 const GLfloat *value);
 }  // namespace gl
 
-#endif  // LIBGL_ENTRY_POINTS_GL_2_0_AUTOGEN_H_
+#endif  // LIBGL_ENTRY_POINTS_GL_2_AUTOGEN_H_
diff --git a/src/libGL/entry_points_gl_3_0_autogen.cpp b/src/libGL/entry_points_gl_3_0_autogen.cpp
deleted file mode 100644
index 83c982c..0000000
--- a/src/libGL/entry_points_gl_3_0_autogen.cpp
+++ /dev/null
@@ -1,2232 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// entry_points_gl_3_0_autogen.cpp:
-//   Defines the GL 3.0 entry points.
-
-#include "libGL/entry_points_gl_3_0_autogen.h"
-
-#include "libANGLE/Context.h"
-#include "libANGLE/Context.inl.h"
-#include "libANGLE/entry_points_utils.h"
-#include "libANGLE/gl_enum_utils.h"
-#include "libANGLE/validationEGL.h"
-#include "libANGLE/validationES.h"
-#include "libANGLE/validationES1.h"
-#include "libANGLE/validationES2.h"
-#include "libANGLE/validationES3.h"
-#include "libANGLE/validationES31.h"
-#include "libANGLE/validationES32.h"
-#include "libANGLE/validationESEXT.h"
-#include "libANGLE/validationGL3_autogen.h"
-#include "libGLESv2/global_state.h"
-
-namespace gl
-{
-void GL_APIENTRY BeginConditionalRender(GLuint id, GLenum mode)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BeginConditionalRender, "glBeginConditionalRender",
-          "context = %d, id = %u, mode = %s", CID(context), id,
-          GLenumToString(GLenumGroup::TypeEnum, mode));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateBeginConditionalRender(context, id, mode));
-        if (isCallValid)
-        {
-            context->beginConditionalRender(id, mode);
-        }
-        ANGLE_CAPTURE(BeginConditionalRender, isCallValid, context, id, mode);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY BeginTransformFeedback(GLenum primitiveMode)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BeginTransformFeedback, "glBeginTransformFeedback",
-          "context = %d, primitiveMode = %s", CID(context),
-          GLenumToString(GLenumGroup::PrimitiveType, primitiveMode));
-
-    if (context)
-    {
-        PrimitiveMode primitiveModePacked = FromGL<PrimitiveMode>(primitiveMode);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateBeginTransformFeedback(context, primitiveModePacked));
-        if (isCallValid)
-        {
-            context->beginTransformFeedback(primitiveModePacked);
-        }
-        ANGLE_CAPTURE(BeginTransformFeedback, isCallValid, context, primitiveModePacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY BindBufferBase(GLenum target, GLuint index, GLuint buffer)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindBufferBase, "glBindBufferBase",
-          "context = %d, target = %s, index = %u, buffer = %u", CID(context),
-          GLenumToString(GLenumGroup::BufferTargetARB, target), index, buffer);
-
-    if (context)
-    {
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateBindBufferBase(context, targetPacked, index, bufferPacked));
-        if (isCallValid)
-        {
-            context->bindBufferBase(targetPacked, index, bufferPacked);
-        }
-        ANGLE_CAPTURE(BindBufferBase, isCallValid, context, targetPacked, index, bufferPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY
-BindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindBufferRange, "glBindBufferRange",
-          "context = %d, target = %s, index = %u, buffer = %u, offset = %llu, size = %llu",
-          CID(context), GLenumToString(GLenumGroup::BufferTargetARB, target), index, buffer,
-          static_cast<unsigned long long>(offset), static_cast<unsigned long long>(size));
-
-    if (context)
-    {
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateBindBufferRange(context, targetPacked, index, bufferPacked, offset, size));
-        if (isCallValid)
-        {
-            context->bindBufferRange(targetPacked, index, bufferPacked, offset, size);
-        }
-        ANGLE_CAPTURE(BindBufferRange, isCallValid, context, targetPacked, index, bufferPacked,
-                      offset, size);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY BindFragDataLocation(GLuint program, GLuint color, const GLchar *name)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindFragDataLocation, "glBindFragDataLocation",
-          "context = %d, program = %u, color = %u, name = 0x%016" PRIxPTR "", CID(context), program,
-          color, (uintptr_t)name);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateBindFragDataLocation(context, programPacked, color, name));
-        if (isCallValid)
-        {
-            context->bindFragDataLocation(programPacked, color, name);
-        }
-        ANGLE_CAPTURE(BindFragDataLocation, isCallValid, context, programPacked, color, name);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY BindFramebuffer(GLenum target, GLuint framebuffer)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindFramebuffer, "glBindFramebuffer",
-          "context = %d, target = %s, framebuffer = %u", CID(context),
-          GLenumToString(GLenumGroup::FramebufferTarget, target), framebuffer);
-
-    if (context)
-    {
-        FramebufferID framebufferPacked                       = FromGL<FramebufferID>(framebuffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateBindFramebuffer(context, target, framebufferPacked));
-        if (isCallValid)
-        {
-            context->bindFramebuffer(target, framebufferPacked);
-        }
-        ANGLE_CAPTURE(BindFramebuffer, isCallValid, context, target, framebufferPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY BindRenderbuffer(GLenum target, GLuint renderbuffer)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindRenderbuffer, "glBindRenderbuffer",
-          "context = %d, target = %s, renderbuffer = %u", CID(context),
-          GLenumToString(GLenumGroup::RenderbufferTarget, target), renderbuffer);
-
-    if (context)
-    {
-        RenderbufferID renderbufferPacked = FromGL<RenderbufferID>(renderbuffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateBindRenderbuffer(context, target, renderbufferPacked));
-        if (isCallValid)
-        {
-            context->bindRenderbuffer(target, renderbufferPacked);
-        }
-        ANGLE_CAPTURE(BindRenderbuffer, isCallValid, context, target, renderbufferPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY BindVertexArray(GLuint array)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindVertexArray, "glBindVertexArray", "context = %d, array = %u",
-          CID(context), array);
-
-    if (context)
-    {
-        VertexArrayID arrayPacked                             = FromGL<VertexArrayID>(array);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateBindVertexArray(context, arrayPacked));
-        if (isCallValid)
-        {
-            context->bindVertexArray(arrayPacked);
-        }
-        ANGLE_CAPTURE(BindVertexArray, isCallValid, context, arrayPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY BlitFramebuffer(GLint srcX0,
-                                 GLint srcY0,
-                                 GLint srcX1,
-                                 GLint srcY1,
-                                 GLint dstX0,
-                                 GLint dstY0,
-                                 GLint dstX1,
-                                 GLint dstY1,
-                                 GLbitfield mask,
-                                 GLenum filter)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BlitFramebuffer, "glBlitFramebuffer",
-          "context = %d, srcX0 = %d, srcY0 = %d, srcX1 = %d, srcY1 = %d, dstX0 = %d, dstY0 = %d, "
-          "dstX1 = %d, dstY1 = %d, mask = %s, filter = %s",
-          CID(context), srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
-          GLbitfieldToString(GLenumGroup::ClearBufferMask, mask).c_str(),
-          GLenumToString(GLenumGroup::BlitFramebufferFilter, filter));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateBlitFramebuffer(context, srcX0, srcY0, srcX1, srcY1, dstX0,
-                                                    dstY0, dstX1, dstY1, mask, filter));
-        if (isCallValid)
-        {
-            context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask,
-                                     filter);
-        }
-        ANGLE_CAPTURE(BlitFramebuffer, isCallValid, context, srcX0, srcY0, srcX1, srcY1, dstX0,
-                      dstY0, dstX1, dstY1, mask, filter);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-GLenum GL_APIENTRY CheckFramebufferStatus(GLenum target)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CheckFramebufferStatus, "glCheckFramebufferStatus",
-          "context = %d, target = %s", CID(context),
-          GLenumToString(GLenumGroup::FramebufferTarget, target));
-
-    GLenum returnValue;
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateCheckFramebufferStatus(context, target));
-        if (isCallValid)
-        {
-            returnValue = context->checkFramebufferStatus(target);
-        }
-        else
-        {
-            returnValue = GetDefaultReturnValue<EntryPoint::CheckFramebufferStatus, GLenum>();
-        }
-        ANGLE_CAPTURE(CheckFramebufferStatus, isCallValid, context, target, returnValue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::CheckFramebufferStatus, GLenum>();
-    }
-    return returnValue;
-}
-
-void GL_APIENTRY ClampColor(GLenum target, GLenum clamp)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ClampColor, "glClampColor",
-          "context = %d, target = %s, clamp = %s", CID(context),
-          GLenumToString(GLenumGroup::DefaultGroup, target),
-          GLenumToString(GLenumGroup::DefaultGroup, clamp));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateClampColor(context, target, clamp));
-        if (isCallValid)
-        {
-            context->clampColor(target, clamp);
-        }
-        ANGLE_CAPTURE(ClampColor, isCallValid, context, target, clamp);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ClearBufferfi, "glClearBufferfi",
-          "context = %d, buffer = %s, drawbuffer = %d, depth = %f, stencil = %d", CID(context),
-          GLenumToString(GLenumGroup::Buffer, buffer), drawbuffer, depth, stencil);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateClearBufferfi(context, buffer, drawbuffer, depth, stencil));
-        if (isCallValid)
-        {
-            context->clearBufferfi(buffer, drawbuffer, depth, stencil);
-        }
-        ANGLE_CAPTURE(ClearBufferfi, isCallValid, context, buffer, drawbuffer, depth, stencil);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ClearBufferfv, "glClearBufferfv",
-          "context = %d, buffer = %s, drawbuffer = %d, value = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::Buffer, buffer), drawbuffer, (uintptr_t)value);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateClearBufferfv(context, buffer, drawbuffer, value));
-        if (isCallValid)
-        {
-            context->clearBufferfv(buffer, drawbuffer, value);
-        }
-        ANGLE_CAPTURE(ClearBufferfv, isCallValid, context, buffer, drawbuffer, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ClearBufferiv, "glClearBufferiv",
-          "context = %d, buffer = %s, drawbuffer = %d, value = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::Buffer, buffer), drawbuffer, (uintptr_t)value);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateClearBufferiv(context, buffer, drawbuffer, value));
-        if (isCallValid)
-        {
-            context->clearBufferiv(buffer, drawbuffer, value);
-        }
-        ANGLE_CAPTURE(ClearBufferiv, isCallValid, context, buffer, drawbuffer, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ClearBufferuiv, "glClearBufferuiv",
-          "context = %d, buffer = %s, drawbuffer = %d, value = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::Buffer, buffer), drawbuffer, (uintptr_t)value);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateClearBufferuiv(context, buffer, drawbuffer, value));
-        if (isCallValid)
-        {
-            context->clearBufferuiv(buffer, drawbuffer, value);
-        }
-        ANGLE_CAPTURE(ClearBufferuiv, isCallValid, context, buffer, drawbuffer, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ColorMaski, "glColorMaski",
-          "context = %d, index = %u, r = %s, g = %s, b = %s, a = %s", CID(context), index,
-          GLbooleanToString(r), GLbooleanToString(g), GLbooleanToString(b), GLbooleanToString(a));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateColorMaski(context, index, r, g, b, a));
-        if (isCallValid)
-        {
-            context->colorMaski(index, r, g, b, a);
-        }
-        ANGLE_CAPTURE(ColorMaski, isCallValid, context, index, r, g, b, a);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DeleteFramebuffers, "glDeleteFramebuffers",
-          "context = %d, n = %d, framebuffers = 0x%016" PRIxPTR "", CID(context), n,
-          (uintptr_t)framebuffers);
-
-    if (context)
-    {
-        const FramebufferID *framebuffersPacked = FromGL<const FramebufferID *>(framebuffers);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateDeleteFramebuffers(context, n, framebuffersPacked));
-        if (isCallValid)
-        {
-            context->deleteFramebuffers(n, framebuffersPacked);
-        }
-        ANGLE_CAPTURE(DeleteFramebuffers, isCallValid, context, n, framebuffersPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DeleteRenderbuffers, "glDeleteRenderbuffers",
-          "context = %d, n = %d, renderbuffers = 0x%016" PRIxPTR "", CID(context), n,
-          (uintptr_t)renderbuffers);
-
-    if (context)
-    {
-        const RenderbufferID *renderbuffersPacked = FromGL<const RenderbufferID *>(renderbuffers);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateDeleteRenderbuffers(context, n, renderbuffersPacked));
-        if (isCallValid)
-        {
-            context->deleteRenderbuffers(n, renderbuffersPacked);
-        }
-        ANGLE_CAPTURE(DeleteRenderbuffers, isCallValid, context, n, renderbuffersPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DeleteVertexArrays(GLsizei n, const GLuint *arrays)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DeleteVertexArrays, "glDeleteVertexArrays",
-          "context = %d, n = %d, arrays = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)arrays);
-
-    if (context)
-    {
-        const VertexArrayID *arraysPacked = FromGL<const VertexArrayID *>(arrays);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateDeleteVertexArrays(context, n, arraysPacked));
-        if (isCallValid)
-        {
-            context->deleteVertexArrays(n, arraysPacked);
-        }
-        ANGLE_CAPTURE(DeleteVertexArrays, isCallValid, context, n, arraysPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Disablei(GLenum target, GLuint index)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Disablei, "glDisablei", "context = %d, target = %s, index = %u",
-          CID(context), GLenumToString(GLenumGroup::EnableCap, target), index);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateDisablei(context, target, index));
-        if (isCallValid)
-        {
-            context->disablei(target, index);
-        }
-        ANGLE_CAPTURE(Disablei, isCallValid, context, target, index);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Enablei(GLenum target, GLuint index)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Enablei, "glEnablei", "context = %d, target = %s, index = %u",
-          CID(context), GLenumToString(GLenumGroup::EnableCap, target), index);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateEnablei(context, target, index));
-        if (isCallValid)
-        {
-            context->enablei(target, index);
-        }
-        ANGLE_CAPTURE(Enablei, isCallValid, context, target, index);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY EndConditionalRender()
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::EndConditionalRender, "glEndConditionalRender", "context = %d",
-          CID(context));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateEndConditionalRender(context));
-        if (isCallValid)
-        {
-            context->endConditionalRender();
-        }
-        ANGLE_CAPTURE(EndConditionalRender, isCallValid, context);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY EndTransformFeedback()
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::EndTransformFeedback, "glEndTransformFeedback", "context = %d",
-          CID(context));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateEndTransformFeedback(context));
-        if (isCallValid)
-        {
-            context->endTransformFeedback();
-        }
-        ANGLE_CAPTURE(EndTransformFeedback, isCallValid, context);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY FlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::FlushMappedBufferRange, "glFlushMappedBufferRange",
-          "context = %d, target = %s, offset = %llu, length = %llu", CID(context),
-          GLenumToString(GLenumGroup::BufferTargetARB, target),
-          static_cast<unsigned long long>(offset), static_cast<unsigned long long>(length));
-
-    if (context)
-    {
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateFlushMappedBufferRange(context, targetPacked, offset, length));
-        if (isCallValid)
-        {
-            context->flushMappedBufferRange(targetPacked, offset, length);
-        }
-        ANGLE_CAPTURE(FlushMappedBufferRange, isCallValid, context, targetPacked, offset, length);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY FramebufferRenderbuffer(GLenum target,
-                                         GLenum attachment,
-                                         GLenum renderbuffertarget,
-                                         GLuint renderbuffer)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::FramebufferRenderbuffer, "glFramebufferRenderbuffer",
-          "context = %d, target = %s, attachment = %s, renderbuffertarget = %s, renderbuffer = %u",
-          CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target),
-          GLenumToString(GLenumGroup::FramebufferAttachment, attachment),
-          GLenumToString(GLenumGroup::RenderbufferTarget, renderbuffertarget), renderbuffer);
-
-    if (context)
-    {
-        RenderbufferID renderbufferPacked = FromGL<RenderbufferID>(renderbuffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateFramebufferRenderbuffer(context, target, attachment, renderbuffertarget,
-                                             renderbufferPacked));
-        if (isCallValid)
-        {
-            context->framebufferRenderbuffer(target, attachment, renderbuffertarget,
-                                             renderbufferPacked);
-        }
-        ANGLE_CAPTURE(FramebufferRenderbuffer, isCallValid, context, target, attachment,
-                      renderbuffertarget, renderbufferPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY FramebufferTexture1D(GLenum target,
-                                      GLenum attachment,
-                                      GLenum textarget,
-                                      GLuint texture,
-                                      GLint level)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::FramebufferTexture1D, "glFramebufferTexture1D",
-          "context = %d, target = %s, attachment = %s, textarget = %s, texture = %u, level = %d",
-          CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target),
-          GLenumToString(GLenumGroup::FramebufferAttachment, attachment),
-          GLenumToString(GLenumGroup::TextureTarget, textarget), texture, level);
-
-    if (context)
-    {
-        TextureTarget textargetPacked                         = FromGL<TextureTarget>(textarget);
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateFramebufferTexture1D(context, target, attachment,
-                                                         textargetPacked, texturePacked, level));
-        if (isCallValid)
-        {
-            context->framebufferTexture1D(target, attachment, textargetPacked, texturePacked,
-                                          level);
-        }
-        ANGLE_CAPTURE(FramebufferTexture1D, isCallValid, context, target, attachment,
-                      textargetPacked, texturePacked, level);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY FramebufferTexture2D(GLenum target,
-                                      GLenum attachment,
-                                      GLenum textarget,
-                                      GLuint texture,
-                                      GLint level)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::FramebufferTexture2D, "glFramebufferTexture2D",
-          "context = %d, target = %s, attachment = %s, textarget = %s, texture = %u, level = %d",
-          CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target),
-          GLenumToString(GLenumGroup::FramebufferAttachment, attachment),
-          GLenumToString(GLenumGroup::TextureTarget, textarget), texture, level);
-
-    if (context)
-    {
-        TextureTarget textargetPacked                         = FromGL<TextureTarget>(textarget);
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateFramebufferTexture2D(context, target, attachment,
-                                                         textargetPacked, texturePacked, level));
-        if (isCallValid)
-        {
-            context->framebufferTexture2D(target, attachment, textargetPacked, texturePacked,
-                                          level);
-        }
-        ANGLE_CAPTURE(FramebufferTexture2D, isCallValid, context, target, attachment,
-                      textargetPacked, texturePacked, level);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY FramebufferTexture3D(GLenum target,
-                                      GLenum attachment,
-                                      GLenum textarget,
-                                      GLuint texture,
-                                      GLint level,
-                                      GLint zoffset)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::FramebufferTexture3D, "glFramebufferTexture3D",
-          "context = %d, target = %s, attachment = %s, textarget = %s, texture = %u, level = %d, "
-          "zoffset = %d",
-          CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target),
-          GLenumToString(GLenumGroup::FramebufferAttachment, attachment),
-          GLenumToString(GLenumGroup::TextureTarget, textarget), texture, level, zoffset);
-
-    if (context)
-    {
-        TextureTarget textargetPacked                         = FromGL<TextureTarget>(textarget);
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateFramebufferTexture3D(context, target, attachment, textargetPacked,
-                                          texturePacked, level, zoffset));
-        if (isCallValid)
-        {
-            context->framebufferTexture3D(target, attachment, textargetPacked, texturePacked, level,
-                                          zoffset);
-        }
-        ANGLE_CAPTURE(FramebufferTexture3D, isCallValid, context, target, attachment,
-                      textargetPacked, texturePacked, level, zoffset);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY
-FramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::FramebufferTextureLayer, "glFramebufferTextureLayer",
-          "context = %d, target = %s, attachment = %s, texture = %u, level = %d, layer = %d",
-          CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target),
-          GLenumToString(GLenumGroup::FramebufferAttachment, attachment), texture, level, layer);
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateFramebufferTextureLayer(context, target, attachment,
-                                                            texturePacked, level, layer));
-        if (isCallValid)
-        {
-            context->framebufferTextureLayer(target, attachment, texturePacked, level, layer);
-        }
-        ANGLE_CAPTURE(FramebufferTextureLayer, isCallValid, context, target, attachment,
-                      texturePacked, level, layer);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GenFramebuffers(GLsizei n, GLuint *framebuffers)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GenFramebuffers, "glGenFramebuffers",
-          "context = %d, n = %d, framebuffers = 0x%016" PRIxPTR "", CID(context), n,
-          (uintptr_t)framebuffers);
-
-    if (context)
-    {
-        FramebufferID *framebuffersPacked = FromGL<FramebufferID *>(framebuffers);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGenFramebuffers(context, n, framebuffersPacked));
-        if (isCallValid)
-        {
-            context->genFramebuffers(n, framebuffersPacked);
-        }
-        ANGLE_CAPTURE(GenFramebuffers, isCallValid, context, n, framebuffersPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GenRenderbuffers(GLsizei n, GLuint *renderbuffers)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GenRenderbuffers, "glGenRenderbuffers",
-          "context = %d, n = %d, renderbuffers = 0x%016" PRIxPTR "", CID(context), n,
-          (uintptr_t)renderbuffers);
-
-    if (context)
-    {
-        RenderbufferID *renderbuffersPacked = FromGL<RenderbufferID *>(renderbuffers);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGenRenderbuffers(context, n, renderbuffersPacked));
-        if (isCallValid)
-        {
-            context->genRenderbuffers(n, renderbuffersPacked);
-        }
-        ANGLE_CAPTURE(GenRenderbuffers, isCallValid, context, n, renderbuffersPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GenVertexArrays(GLsizei n, GLuint *arrays)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GenVertexArrays, "glGenVertexArrays",
-          "context = %d, n = %d, arrays = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)arrays);
-
-    if (context)
-    {
-        VertexArrayID *arraysPacked                           = FromGL<VertexArrayID *>(arrays);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGenVertexArrays(context, n, arraysPacked));
-        if (isCallValid)
-        {
-            context->genVertexArrays(n, arraysPacked);
-        }
-        ANGLE_CAPTURE(GenVertexArrays, isCallValid, context, n, arraysPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GenerateMipmap(GLenum target)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GenerateMipmap, "glGenerateMipmap", "context = %d, target = %s",
-          CID(context), GLenumToString(GLenumGroup::TextureTarget, target));
-
-    if (context)
-    {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGenerateMipmap(context, targetPacked));
-        if (isCallValid)
-        {
-            context->generateMipmap(targetPacked);
-        }
-        ANGLE_CAPTURE(GenerateMipmap, isCallValid, context, targetPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetBooleani_v(GLenum target, GLuint index, GLboolean *data)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetBooleani_v, "glGetBooleani_v",
-          "context = %d, target = %s, index = %u, data = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::BufferTargetARB, target), index, (uintptr_t)data);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetBooleani_v(context, target, index, data));
-        if (isCallValid)
-        {
-            context->getBooleani_v(target, index, data);
-        }
-        ANGLE_CAPTURE(GetBooleani_v, isCallValid, context, target, index, data);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-GLint GL_APIENTRY GetFragDataLocation(GLuint program, const GLchar *name)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetFragDataLocation, "glGetFragDataLocation",
-          "context = %d, program = %u, name = 0x%016" PRIxPTR "", CID(context), program,
-          (uintptr_t)name);
-
-    GLint returnValue;
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetFragDataLocation(context, programPacked, name));
-        if (isCallValid)
-        {
-            returnValue = context->getFragDataLocation(programPacked, name);
-        }
-        else
-        {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetFragDataLocation, GLint>();
-        }
-        ANGLE_CAPTURE(GetFragDataLocation, isCallValid, context, programPacked, name, returnValue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::GetFragDataLocation, GLint>();
-    }
-    return returnValue;
-}
-
-void GL_APIENTRY GetFramebufferAttachmentParameteriv(GLenum target,
-                                                     GLenum attachment,
-                                                     GLenum pname,
-                                                     GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetFramebufferAttachmentParameteriv,
-          "glGetFramebufferAttachmentParameteriv",
-          "context = %d, target = %s, attachment = %s, pname = %s, params = 0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target),
-          GLenumToString(GLenumGroup::FramebufferAttachment, attachment),
-          GLenumToString(GLenumGroup::FramebufferAttachmentParameterName, pname),
-          (uintptr_t)params);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetFramebufferAttachmentParameteriv(
-                                              context, target, attachment, pname, params));
-        if (isCallValid)
-        {
-            context->getFramebufferAttachmentParameteriv(target, attachment, pname, params);
-        }
-        ANGLE_CAPTURE(GetFramebufferAttachmentParameteriv, isCallValid, context, target, attachment,
-                      pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetIntegeri_v(GLenum target, GLuint index, GLint *data)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetIntegeri_v, "glGetIntegeri_v",
-          "context = %d, target = %s, index = %u, data = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TypeEnum, target), index, (uintptr_t)data);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetIntegeri_v(context, target, index, data));
-        if (isCallValid)
-        {
-            context->getIntegeri_v(target, index, data);
-        }
-        ANGLE_CAPTURE(GetIntegeri_v, isCallValid, context, target, index, data);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetRenderbufferParameteriv, "glGetRenderbufferParameteriv",
-          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::RenderbufferTarget, target),
-          GLenumToString(GLenumGroup::RenderbufferParameterName, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetRenderbufferParameteriv(context, target, pname, params));
-        if (isCallValid)
-        {
-            context->getRenderbufferParameteriv(target, pname, params);
-        }
-        ANGLE_CAPTURE(GetRenderbufferParameteriv, isCallValid, context, target, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-const GLubyte *GL_APIENTRY GetStringi(GLenum name, GLuint index)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetStringi, "glGetStringi",
-          "context = %d, name = %s, index = %u", CID(context),
-          GLenumToString(GLenumGroup::StringName, name), index);
-
-    const GLubyte *returnValue;
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateGetStringi(context, name, index));
-        if (isCallValid)
-        {
-            returnValue = context->getStringi(name, index);
-        }
-        else
-        {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetStringi, const GLubyte *>();
-        }
-        ANGLE_CAPTURE(GetStringi, isCallValid, context, name, index, returnValue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::GetStringi, const GLubyte *>();
-    }
-    return returnValue;
-}
-
-void GL_APIENTRY GetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTexParameterIiv, "glGetTexParameterIiv",
-          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureTarget, target),
-          GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetTexParameterIiv(context, targetPacked, pname, params));
-        if (isCallValid)
-        {
-            context->getTexParameterIiv(targetPacked, pname, params);
-        }
-        ANGLE_CAPTURE(GetTexParameterIiv, isCallValid, context, targetPacked, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTexParameterIuiv, "glGetTexParameterIuiv",
-          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureTarget, target),
-          GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetTexParameterIuiv(context, targetPacked, pname, params));
-        if (isCallValid)
-        {
-            context->getTexParameterIuiv(targetPacked, pname, params);
-        }
-        ANGLE_CAPTURE(GetTexParameterIuiv, isCallValid, context, targetPacked, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetTransformFeedbackVarying(GLuint program,
-                                             GLuint index,
-                                             GLsizei bufSize,
-                                             GLsizei *length,
-                                             GLsizei *size,
-                                             GLenum *type,
-                                             GLchar *name)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTransformFeedbackVarying, "glGetTransformFeedbackVarying",
-          "context = %d, program = %u, index = %u, bufSize = %d, length = 0x%016" PRIxPTR
-          ", size = 0x%016" PRIxPTR ", type = 0x%016" PRIxPTR ", name = 0x%016" PRIxPTR "",
-          CID(context), program, index, bufSize, (uintptr_t)length, (uintptr_t)size,
-          (uintptr_t)type, (uintptr_t)name);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetTransformFeedbackVarying(context, programPacked, index,
-                                                                bufSize, length, size, type, name));
-        if (isCallValid)
-        {
-            context->getTransformFeedbackVarying(programPacked, index, bufSize, length, size, type,
-                                                 name);
-        }
-        ANGLE_CAPTURE(GetTransformFeedbackVarying, isCallValid, context, programPacked, index,
-                      bufSize, length, size, type, name);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetUniformuiv(GLuint program, GLint location, GLuint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetUniformuiv, "glGetUniformuiv",
-          "context = %d, program = %u, location = %d, params = 0x%016" PRIxPTR "", CID(context),
-          program, location, (uintptr_t)params);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetUniformuiv(context, programPacked, locationPacked, params));
-        if (isCallValid)
-        {
-            context->getUniformuiv(programPacked, locationPacked, params);
-        }
-        ANGLE_CAPTURE(GetUniformuiv, isCallValid, context, programPacked, locationPacked, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetVertexAttribIiv, "glGetVertexAttribIiv",
-          "context = %d, index = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), index,
-          GLenumToString(GLenumGroup::VertexAttribEnum, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetVertexAttribIiv(context, index, pname, params));
-        if (isCallValid)
-        {
-            context->getVertexAttribIiv(index, pname, params);
-        }
-        ANGLE_CAPTURE(GetVertexAttribIiv, isCallValid, context, index, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetVertexAttribIuiv, "glGetVertexAttribIuiv",
-          "context = %d, index = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), index,
-          GLenumToString(GLenumGroup::VertexAttribEnum, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetVertexAttribIuiv(context, index, pname, params));
-        if (isCallValid)
-        {
-            context->getVertexAttribIuiv(index, pname, params);
-        }
-        ANGLE_CAPTURE(GetVertexAttribIuiv, isCallValid, context, index, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-GLboolean GL_APIENTRY IsEnabledi(GLenum target, GLuint index)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IsEnabledi, "glIsEnabledi",
-          "context = %d, target = %s, index = %u", CID(context),
-          GLenumToString(GLenumGroup::EnableCap, target), index);
-
-    GLboolean returnValue;
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateIsEnabledi(context, target, index));
-        if (isCallValid)
-        {
-            returnValue = context->isEnabledi(target, index);
-        }
-        else
-        {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsEnabledi, GLboolean>();
-        }
-        ANGLE_CAPTURE(IsEnabledi, isCallValid, context, target, index, returnValue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::IsEnabledi, GLboolean>();
-    }
-    return returnValue;
-}
-
-GLboolean GL_APIENTRY IsFramebuffer(GLuint framebuffer)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IsFramebuffer, "glIsFramebuffer",
-          "context = %d, framebuffer = %u", CID(context), framebuffer);
-
-    GLboolean returnValue;
-    if (context)
-    {
-        FramebufferID framebufferPacked                       = FromGL<FramebufferID>(framebuffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateIsFramebuffer(context, framebufferPacked));
-        if (isCallValid)
-        {
-            returnValue = context->isFramebuffer(framebufferPacked);
-        }
-        else
-        {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsFramebuffer, GLboolean>();
-        }
-        ANGLE_CAPTURE(IsFramebuffer, isCallValid, context, framebufferPacked, returnValue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::IsFramebuffer, GLboolean>();
-    }
-    return returnValue;
-}
-
-GLboolean GL_APIENTRY IsRenderbuffer(GLuint renderbuffer)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IsRenderbuffer, "glIsRenderbuffer",
-          "context = %d, renderbuffer = %u", CID(context), renderbuffer);
-
-    GLboolean returnValue;
-    if (context)
-    {
-        RenderbufferID renderbufferPacked = FromGL<RenderbufferID>(renderbuffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateIsRenderbuffer(context, renderbufferPacked));
-        if (isCallValid)
-        {
-            returnValue = context->isRenderbuffer(renderbufferPacked);
-        }
-        else
-        {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsRenderbuffer, GLboolean>();
-        }
-        ANGLE_CAPTURE(IsRenderbuffer, isCallValid, context, renderbufferPacked, returnValue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::IsRenderbuffer, GLboolean>();
-    }
-    return returnValue;
-}
-
-GLboolean GL_APIENTRY IsVertexArray(GLuint array)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IsVertexArray, "glIsVertexArray", "context = %d, array = %u",
-          CID(context), array);
-
-    GLboolean returnValue;
-    if (context)
-    {
-        VertexArrayID arrayPacked                             = FromGL<VertexArrayID>(array);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateIsVertexArray(context, arrayPacked));
-        if (isCallValid)
-        {
-            returnValue = context->isVertexArray(arrayPacked);
-        }
-        else
-        {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsVertexArray, GLboolean>();
-        }
-        ANGLE_CAPTURE(IsVertexArray, isCallValid, context, arrayPacked, returnValue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::IsVertexArray, GLboolean>();
-    }
-    return returnValue;
-}
-
-void *GL_APIENTRY MapBufferRange(GLenum target,
-                                 GLintptr offset,
-                                 GLsizeiptr length,
-                                 GLbitfield access)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MapBufferRange, "glMapBufferRange",
-          "context = %d, target = %s, offset = %llu, length = %llu, access = %s", CID(context),
-          GLenumToString(GLenumGroup::BufferTargetARB, target),
-          static_cast<unsigned long long>(offset), static_cast<unsigned long long>(length),
-          GLbitfieldToString(GLenumGroup::BufferAccessMask, access).c_str());
-
-    void *returnValue;
-    if (context)
-    {
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateMapBufferRange(context, targetPacked, offset, length, access));
-        if (isCallValid)
-        {
-            returnValue = context->mapBufferRange(targetPacked, offset, length, access);
-        }
-        else
-        {
-            returnValue = GetDefaultReturnValue<EntryPoint::MapBufferRange, void *>();
-        }
-        ANGLE_CAPTURE(MapBufferRange, isCallValid, context, targetPacked, offset, length, access,
-                      returnValue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::MapBufferRange, void *>();
-    }
-    return returnValue;
-}
-
-void GL_APIENTRY RenderbufferStorage(GLenum target,
-                                     GLenum internalformat,
-                                     GLsizei width,
-                                     GLsizei height)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::RenderbufferStorage, "glRenderbufferStorage",
-          "context = %d, target = %s, internalformat = %s, width = %d, height = %d", CID(context),
-          GLenumToString(GLenumGroup::RenderbufferTarget, target),
-          GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateRenderbufferStorage(context, target, internalformat, width, height));
-        if (isCallValid)
-        {
-            context->renderbufferStorage(target, internalformat, width, height);
-        }
-        ANGLE_CAPTURE(RenderbufferStorage, isCallValid, context, target, internalformat, width,
-                      height);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY RenderbufferStorageMultisample(GLenum target,
-                                                GLsizei samples,
-                                                GLenum internalformat,
-                                                GLsizei width,
-                                                GLsizei height)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::RenderbufferStorageMultisample,
-          "glRenderbufferStorageMultisample",
-          "context = %d, target = %s, samples = %d, internalformat = %s, width = %d, height = %d",
-          CID(context), GLenumToString(GLenumGroup::RenderbufferTarget, target), samples,
-          GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateRenderbufferStorageMultisample(context, target, samples,
-                                                                   internalformat, width, height));
-        if (isCallValid)
-        {
-            context->renderbufferStorageMultisample(target, samples, internalformat, width, height);
-        }
-        ANGLE_CAPTURE(RenderbufferStorageMultisample, isCallValid, context, target, samples,
-                      internalformat, width, height);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexParameterIiv(GLenum target, GLenum pname, const GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexParameterIiv, "glTexParameterIiv",
-          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureTarget, target),
-          GLenumToString(GLenumGroup::TextureParameterName, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateTexParameterIiv(context, targetPacked, pname, params));
-        if (isCallValid)
-        {
-            context->texParameterIiv(targetPacked, pname, params);
-        }
-        ANGLE_CAPTURE(TexParameterIiv, isCallValid, context, targetPacked, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexParameterIuiv, "glTexParameterIuiv",
-          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureTarget, target),
-          GLenumToString(GLenumGroup::TextureParameterName, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateTexParameterIuiv(context, targetPacked, pname, params));
-        if (isCallValid)
-        {
-            context->texParameterIuiv(targetPacked, pname, params);
-        }
-        ANGLE_CAPTURE(TexParameterIuiv, isCallValid, context, targetPacked, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TransformFeedbackVaryings(GLuint program,
-                                           GLsizei count,
-                                           const GLchar *const *varyings,
-                                           GLenum bufferMode)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TransformFeedbackVaryings, "glTransformFeedbackVaryings",
-          "context = %d, program = %u, count = %d, varyings = 0x%016" PRIxPTR ", bufferMode = %s",
-          CID(context), program, count, (uintptr_t)varyings,
-          GLenumToString(GLenumGroup::DefaultGroup, bufferMode));
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateTransformFeedbackVaryings(
-                                              context, programPacked, count, varyings, bufferMode));
-        if (isCallValid)
-        {
-            context->transformFeedbackVaryings(programPacked, count, varyings, bufferMode);
-        }
-        ANGLE_CAPTURE(TransformFeedbackVaryings, isCallValid, context, programPacked, count,
-                      varyings, bufferMode);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Uniform1ui(GLint location, GLuint v0)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform1ui, "glUniform1ui",
-          "context = %d, location = %d, v0 = %u", CID(context), location, v0);
-
-    if (context)
-    {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateUniform1ui(context, locationPacked, v0));
-        if (isCallValid)
-        {
-            context->uniform1ui(locationPacked, v0);
-        }
-        ANGLE_CAPTURE(Uniform1ui, isCallValid, context, locationPacked, v0);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Uniform1uiv(GLint location, GLsizei count, const GLuint *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform1uiv, "glUniform1uiv",
-          "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
-          location, count, (uintptr_t)value);
-
-    if (context)
-    {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateUniform1uiv(context, locationPacked, count, value));
-        if (isCallValid)
-        {
-            context->uniform1uiv(locationPacked, count, value);
-        }
-        ANGLE_CAPTURE(Uniform1uiv, isCallValid, context, locationPacked, count, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Uniform2ui(GLint location, GLuint v0, GLuint v1)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform2ui, "glUniform2ui",
-          "context = %d, location = %d, v0 = %u, v1 = %u", CID(context), location, v0, v1);
-
-    if (context)
-    {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateUniform2ui(context, locationPacked, v0, v1));
-        if (isCallValid)
-        {
-            context->uniform2ui(locationPacked, v0, v1);
-        }
-        ANGLE_CAPTURE(Uniform2ui, isCallValid, context, locationPacked, v0, v1);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Uniform2uiv(GLint location, GLsizei count, const GLuint *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform2uiv, "glUniform2uiv",
-          "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
-          location, count, (uintptr_t)value);
-
-    if (context)
-    {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateUniform2uiv(context, locationPacked, count, value));
-        if (isCallValid)
-        {
-            context->uniform2uiv(locationPacked, count, value);
-        }
-        ANGLE_CAPTURE(Uniform2uiv, isCallValid, context, locationPacked, count, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform3ui, "glUniform3ui",
-          "context = %d, location = %d, v0 = %u, v1 = %u, v2 = %u", CID(context), location, v0, v1,
-          v2);
-
-    if (context)
-    {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateUniform3ui(context, locationPacked, v0, v1, v2));
-        if (isCallValid)
-        {
-            context->uniform3ui(locationPacked, v0, v1, v2);
-        }
-        ANGLE_CAPTURE(Uniform3ui, isCallValid, context, locationPacked, v0, v1, v2);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Uniform3uiv(GLint location, GLsizei count, const GLuint *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform3uiv, "glUniform3uiv",
-          "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
-          location, count, (uintptr_t)value);
-
-    if (context)
-    {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateUniform3uiv(context, locationPacked, count, value));
-        if (isCallValid)
-        {
-            context->uniform3uiv(locationPacked, count, value);
-        }
-        ANGLE_CAPTURE(Uniform3uiv, isCallValid, context, locationPacked, count, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform4ui, "glUniform4ui",
-          "context = %d, location = %d, v0 = %u, v1 = %u, v2 = %u, v3 = %u", CID(context), location,
-          v0, v1, v2, v3);
-
-    if (context)
-    {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateUniform4ui(context, locationPacked, v0, v1, v2, v3));
-        if (isCallValid)
-        {
-            context->uniform4ui(locationPacked, v0, v1, v2, v3);
-        }
-        ANGLE_CAPTURE(Uniform4ui, isCallValid, context, locationPacked, v0, v1, v2, v3);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Uniform4uiv(GLint location, GLsizei count, const GLuint *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform4uiv, "glUniform4uiv",
-          "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
-          location, count, (uintptr_t)value);
-
-    if (context)
-    {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateUniform4uiv(context, locationPacked, count, value));
-        if (isCallValid)
-        {
-            context->uniform4uiv(locationPacked, count, value);
-        }
-        ANGLE_CAPTURE(Uniform4uiv, isCallValid, context, locationPacked, count, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribI1i(GLuint index, GLint x)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribI1i, "glVertexAttribI1i",
-          "context = %d, index = %u, x = %d", CID(context), index, x);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateVertexAttribI1i(context, index, x));
-        if (isCallValid)
-        {
-            context->vertexAttribI1i(index, x);
-        }
-        ANGLE_CAPTURE(VertexAttribI1i, isCallValid, context, index, x);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribI1iv(GLuint index, const GLint *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribI1iv, "glVertexAttribI1iv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateVertexAttribI1iv(context, index, v));
-        if (isCallValid)
-        {
-            context->vertexAttribI1iv(index, v);
-        }
-        ANGLE_CAPTURE(VertexAttribI1iv, isCallValid, context, index, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribI1ui(GLuint index, GLuint x)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribI1ui, "glVertexAttribI1ui",
-          "context = %d, index = %u, x = %u", CID(context), index, x);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateVertexAttribI1ui(context, index, x));
-        if (isCallValid)
-        {
-            context->vertexAttribI1ui(index, x);
-        }
-        ANGLE_CAPTURE(VertexAttribI1ui, isCallValid, context, index, x);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribI1uiv(GLuint index, const GLuint *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribI1uiv, "glVertexAttribI1uiv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateVertexAttribI1uiv(context, index, v));
-        if (isCallValid)
-        {
-            context->vertexAttribI1uiv(index, v);
-        }
-        ANGLE_CAPTURE(VertexAttribI1uiv, isCallValid, context, index, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribI2i(GLuint index, GLint x, GLint y)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribI2i, "glVertexAttribI2i",
-          "context = %d, index = %u, x = %d, y = %d", CID(context), index, x, y);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateVertexAttribI2i(context, index, x, y));
-        if (isCallValid)
-        {
-            context->vertexAttribI2i(index, x, y);
-        }
-        ANGLE_CAPTURE(VertexAttribI2i, isCallValid, context, index, x, y);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribI2iv(GLuint index, const GLint *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribI2iv, "glVertexAttribI2iv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateVertexAttribI2iv(context, index, v));
-        if (isCallValid)
-        {
-            context->vertexAttribI2iv(index, v);
-        }
-        ANGLE_CAPTURE(VertexAttribI2iv, isCallValid, context, index, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribI2ui(GLuint index, GLuint x, GLuint y)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribI2ui, "glVertexAttribI2ui",
-          "context = %d, index = %u, x = %u, y = %u", CID(context), index, x, y);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateVertexAttribI2ui(context, index, x, y));
-        if (isCallValid)
-        {
-            context->vertexAttribI2ui(index, x, y);
-        }
-        ANGLE_CAPTURE(VertexAttribI2ui, isCallValid, context, index, x, y);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribI2uiv(GLuint index, const GLuint *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribI2uiv, "glVertexAttribI2uiv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateVertexAttribI2uiv(context, index, v));
-        if (isCallValid)
-        {
-            context->vertexAttribI2uiv(index, v);
-        }
-        ANGLE_CAPTURE(VertexAttribI2uiv, isCallValid, context, index, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribI3i(GLuint index, GLint x, GLint y, GLint z)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribI3i, "glVertexAttribI3i",
-          "context = %d, index = %u, x = %d, y = %d, z = %d", CID(context), index, x, y, z);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateVertexAttribI3i(context, index, x, y, z));
-        if (isCallValid)
-        {
-            context->vertexAttribI3i(index, x, y, z);
-        }
-        ANGLE_CAPTURE(VertexAttribI3i, isCallValid, context, index, x, y, z);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribI3iv(GLuint index, const GLint *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribI3iv, "glVertexAttribI3iv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateVertexAttribI3iv(context, index, v));
-        if (isCallValid)
-        {
-            context->vertexAttribI3iv(index, v);
-        }
-        ANGLE_CAPTURE(VertexAttribI3iv, isCallValid, context, index, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribI3ui, "glVertexAttribI3ui",
-          "context = %d, index = %u, x = %u, y = %u, z = %u", CID(context), index, x, y, z);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateVertexAttribI3ui(context, index, x, y, z));
-        if (isCallValid)
-        {
-            context->vertexAttribI3ui(index, x, y, z);
-        }
-        ANGLE_CAPTURE(VertexAttribI3ui, isCallValid, context, index, x, y, z);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribI3uiv(GLuint index, const GLuint *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribI3uiv, "glVertexAttribI3uiv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateVertexAttribI3uiv(context, index, v));
-        if (isCallValid)
-        {
-            context->vertexAttribI3uiv(index, v);
-        }
-        ANGLE_CAPTURE(VertexAttribI3uiv, isCallValid, context, index, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribI4bv(GLuint index, const GLbyte *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribI4bv, "glVertexAttribI4bv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateVertexAttribI4bv(context, index, v));
-        if (isCallValid)
-        {
-            context->vertexAttribI4bv(index, v);
-        }
-        ANGLE_CAPTURE(VertexAttribI4bv, isCallValid, context, index, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribI4i, "glVertexAttribI4i",
-          "context = %d, index = %u, x = %d, y = %d, z = %d, w = %d", CID(context), index, x, y, z,
-          w);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateVertexAttribI4i(context, index, x, y, z, w));
-        if (isCallValid)
-        {
-            context->vertexAttribI4i(index, x, y, z, w);
-        }
-        ANGLE_CAPTURE(VertexAttribI4i, isCallValid, context, index, x, y, z, w);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribI4iv(GLuint index, const GLint *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribI4iv, "glVertexAttribI4iv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateVertexAttribI4iv(context, index, v));
-        if (isCallValid)
-        {
-            context->vertexAttribI4iv(index, v);
-        }
-        ANGLE_CAPTURE(VertexAttribI4iv, isCallValid, context, index, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribI4sv(GLuint index, const GLshort *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribI4sv, "glVertexAttribI4sv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateVertexAttribI4sv(context, index, v));
-        if (isCallValid)
-        {
-            context->vertexAttribI4sv(index, v);
-        }
-        ANGLE_CAPTURE(VertexAttribI4sv, isCallValid, context, index, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribI4ubv(GLuint index, const GLubyte *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribI4ubv, "glVertexAttribI4ubv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateVertexAttribI4ubv(context, index, v));
-        if (isCallValid)
-        {
-            context->vertexAttribI4ubv(index, v);
-        }
-        ANGLE_CAPTURE(VertexAttribI4ubv, isCallValid, context, index, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribI4ui, "glVertexAttribI4ui",
-          "context = %d, index = %u, x = %u, y = %u, z = %u, w = %u", CID(context), index, x, y, z,
-          w);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateVertexAttribI4ui(context, index, x, y, z, w));
-        if (isCallValid)
-        {
-            context->vertexAttribI4ui(index, x, y, z, w);
-        }
-        ANGLE_CAPTURE(VertexAttribI4ui, isCallValid, context, index, x, y, z, w);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribI4uiv(GLuint index, const GLuint *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribI4uiv, "glVertexAttribI4uiv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateVertexAttribI4uiv(context, index, v));
-        if (isCallValid)
-        {
-            context->vertexAttribI4uiv(index, v);
-        }
-        ANGLE_CAPTURE(VertexAttribI4uiv, isCallValid, context, index, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribI4usv(GLuint index, const GLushort *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribI4usv, "glVertexAttribI4usv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateVertexAttribI4usv(context, index, v));
-        if (isCallValid)
-        {
-            context->vertexAttribI4usv(index, v);
-        }
-        ANGLE_CAPTURE(VertexAttribI4usv, isCallValid, context, index, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY
-VertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribIPointer, "glVertexAttribIPointer",
-          "context = %d, index = %u, size = %d, type = %s, stride = %d, pointer = 0x%016" PRIxPTR
-          "",
-          CID(context), index, size, GLenumToString(GLenumGroup::VertexAttribPointerType, type),
-          stride, (uintptr_t)pointer);
-
-    if (context)
-    {
-        VertexAttribType typePacked                           = FromGL<VertexAttribType>(type);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateVertexAttribIPointer(context, index, size, typePacked, stride, pointer));
-        if (isCallValid)
-        {
-            context->vertexAttribIPointer(index, size, typePacked, stride, pointer);
-        }
-        ANGLE_CAPTURE(VertexAttribIPointer, isCallValid, context, index, size, typePacked, stride,
-                      pointer);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-}  // namespace gl
diff --git a/src/libGL/entry_points_gl_3_0_autogen.h b/src/libGL/entry_points_gl_3_0_autogen.h
deleted file mode 100644
index eadb2a7..0000000
--- a/src/libGL/entry_points_gl_3_0_autogen.h
+++ /dev/null
@@ -1,167 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// entry_points_gl_3_0_autogen.h:
-//   Defines the GL 3.0 entry points.
-
-#ifndef LIBGL_ENTRY_POINTS_GL_3_0_AUTOGEN_H_
-#define LIBGL_ENTRY_POINTS_GL_3_0_AUTOGEN_H_
-
-#include <export.h>
-#include "angle_gl.h"
-
-namespace gl
-{
-ANGLE_EXPORT void GL_APIENTRY BeginConditionalRender(GLuint id, GLenum mode);
-ANGLE_EXPORT void GL_APIENTRY BeginTransformFeedback(GLenum primitiveMode);
-ANGLE_EXPORT void GL_APIENTRY BindBufferBase(GLenum target, GLuint index, GLuint buffer);
-ANGLE_EXPORT void GL_APIENTRY
-BindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
-ANGLE_EXPORT void GL_APIENTRY BindFragDataLocation(GLuint program,
-                                                   GLuint color,
-                                                   const GLchar *name);
-ANGLE_EXPORT void GL_APIENTRY BindFramebuffer(GLenum target, GLuint framebuffer);
-ANGLE_EXPORT void GL_APIENTRY BindRenderbuffer(GLenum target, GLuint renderbuffer);
-ANGLE_EXPORT void GL_APIENTRY BindVertexArray(GLuint array);
-ANGLE_EXPORT void GL_APIENTRY BlitFramebuffer(GLint srcX0,
-                                              GLint srcY0,
-                                              GLint srcX1,
-                                              GLint srcY1,
-                                              GLint dstX0,
-                                              GLint dstY0,
-                                              GLint dstX1,
-                                              GLint dstY1,
-                                              GLbitfield mask,
-                                              GLenum filter);
-ANGLE_EXPORT GLenum GL_APIENTRY CheckFramebufferStatus(GLenum target);
-ANGLE_EXPORT void GL_APIENTRY ClampColor(GLenum target, GLenum clamp);
-ANGLE_EXPORT void GL_APIENTRY ClearBufferfi(GLenum buffer,
-                                            GLint drawbuffer,
-                                            GLfloat depth,
-                                            GLint stencil);
-ANGLE_EXPORT void GL_APIENTRY ClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value);
-ANGLE_EXPORT void GL_APIENTRY ClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value);
-ANGLE_EXPORT void GL_APIENTRY ClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value);
-ANGLE_EXPORT void GL_APIENTRY
-ColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
-ANGLE_EXPORT void GL_APIENTRY DeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
-ANGLE_EXPORT void GL_APIENTRY DeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
-ANGLE_EXPORT void GL_APIENTRY DeleteVertexArrays(GLsizei n, const GLuint *arrays);
-ANGLE_EXPORT void GL_APIENTRY Disablei(GLenum target, GLuint index);
-ANGLE_EXPORT void GL_APIENTRY Enablei(GLenum target, GLuint index);
-ANGLE_EXPORT void GL_APIENTRY EndConditionalRender();
-ANGLE_EXPORT void GL_APIENTRY EndTransformFeedback();
-ANGLE_EXPORT void GL_APIENTRY FlushMappedBufferRange(GLenum target,
-                                                     GLintptr offset,
-                                                     GLsizeiptr length);
-ANGLE_EXPORT void GL_APIENTRY FramebufferRenderbuffer(GLenum target,
-                                                      GLenum attachment,
-                                                      GLenum renderbuffertarget,
-                                                      GLuint renderbuffer);
-ANGLE_EXPORT void GL_APIENTRY FramebufferTexture1D(GLenum target,
-                                                   GLenum attachment,
-                                                   GLenum textarget,
-                                                   GLuint texture,
-                                                   GLint level);
-ANGLE_EXPORT void GL_APIENTRY FramebufferTexture2D(GLenum target,
-                                                   GLenum attachment,
-                                                   GLenum textarget,
-                                                   GLuint texture,
-                                                   GLint level);
-ANGLE_EXPORT void GL_APIENTRY FramebufferTexture3D(GLenum target,
-                                                   GLenum attachment,
-                                                   GLenum textarget,
-                                                   GLuint texture,
-                                                   GLint level,
-                                                   GLint zoffset);
-ANGLE_EXPORT void GL_APIENTRY
-FramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
-ANGLE_EXPORT void GL_APIENTRY GenFramebuffers(GLsizei n, GLuint *framebuffers);
-ANGLE_EXPORT void GL_APIENTRY GenRenderbuffers(GLsizei n, GLuint *renderbuffers);
-ANGLE_EXPORT void GL_APIENTRY GenVertexArrays(GLsizei n, GLuint *arrays);
-ANGLE_EXPORT void GL_APIENTRY GenerateMipmap(GLenum target);
-ANGLE_EXPORT void GL_APIENTRY GetBooleani_v(GLenum target, GLuint index, GLboolean *data);
-ANGLE_EXPORT GLint GL_APIENTRY GetFragDataLocation(GLuint program, const GLchar *name);
-ANGLE_EXPORT void GL_APIENTRY GetFramebufferAttachmentParameteriv(GLenum target,
-                                                                  GLenum attachment,
-                                                                  GLenum pname,
-                                                                  GLint *params);
-ANGLE_EXPORT void GL_APIENTRY GetIntegeri_v(GLenum target, GLuint index, GLint *data);
-ANGLE_EXPORT void GL_APIENTRY GetRenderbufferParameteriv(GLenum target,
-                                                         GLenum pname,
-                                                         GLint *params);
-ANGLE_EXPORT const GLubyte *GL_APIENTRY GetStringi(GLenum name, GLuint index);
-ANGLE_EXPORT void GL_APIENTRY GetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
-ANGLE_EXPORT void GL_APIENTRY GetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
-ANGLE_EXPORT void GL_APIENTRY GetTransformFeedbackVarying(GLuint program,
-                                                          GLuint index,
-                                                          GLsizei bufSize,
-                                                          GLsizei *length,
-                                                          GLsizei *size,
-                                                          GLenum *type,
-                                                          GLchar *name);
-ANGLE_EXPORT void GL_APIENTRY GetUniformuiv(GLuint program, GLint location, GLuint *params);
-ANGLE_EXPORT void GL_APIENTRY GetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
-ANGLE_EXPORT void GL_APIENTRY GetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
-ANGLE_EXPORT GLboolean GL_APIENTRY IsEnabledi(GLenum target, GLuint index);
-ANGLE_EXPORT GLboolean GL_APIENTRY IsFramebuffer(GLuint framebuffer);
-ANGLE_EXPORT GLboolean GL_APIENTRY IsRenderbuffer(GLuint renderbuffer);
-ANGLE_EXPORT GLboolean GL_APIENTRY IsVertexArray(GLuint array);
-ANGLE_EXPORT void *GL_APIENTRY MapBufferRange(GLenum target,
-                                              GLintptr offset,
-                                              GLsizeiptr length,
-                                              GLbitfield access);
-ANGLE_EXPORT void GL_APIENTRY RenderbufferStorage(GLenum target,
-                                                  GLenum internalformat,
-                                                  GLsizei width,
-                                                  GLsizei height);
-ANGLE_EXPORT void GL_APIENTRY RenderbufferStorageMultisample(GLenum target,
-                                                             GLsizei samples,
-                                                             GLenum internalformat,
-                                                             GLsizei width,
-                                                             GLsizei height);
-ANGLE_EXPORT void GL_APIENTRY TexParameterIiv(GLenum target, GLenum pname, const GLint *params);
-ANGLE_EXPORT void GL_APIENTRY TexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
-ANGLE_EXPORT void GL_APIENTRY TransformFeedbackVaryings(GLuint program,
-                                                        GLsizei count,
-                                                        const GLchar *const *varyings,
-                                                        GLenum bufferMode);
-ANGLE_EXPORT void GL_APIENTRY Uniform1ui(GLint location, GLuint v0);
-ANGLE_EXPORT void GL_APIENTRY Uniform1uiv(GLint location, GLsizei count, const GLuint *value);
-ANGLE_EXPORT void GL_APIENTRY Uniform2ui(GLint location, GLuint v0, GLuint v1);
-ANGLE_EXPORT void GL_APIENTRY Uniform2uiv(GLint location, GLsizei count, const GLuint *value);
-ANGLE_EXPORT void GL_APIENTRY Uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
-ANGLE_EXPORT void GL_APIENTRY Uniform3uiv(GLint location, GLsizei count, const GLuint *value);
-ANGLE_EXPORT void GL_APIENTRY
-Uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
-ANGLE_EXPORT void GL_APIENTRY Uniform4uiv(GLint location, GLsizei count, const GLuint *value);
-ANGLE_EXPORT void GL_APIENTRY VertexAttribI1i(GLuint index, GLint x);
-ANGLE_EXPORT void GL_APIENTRY VertexAttribI1iv(GLuint index, const GLint *v);
-ANGLE_EXPORT void GL_APIENTRY VertexAttribI1ui(GLuint index, GLuint x);
-ANGLE_EXPORT void GL_APIENTRY VertexAttribI1uiv(GLuint index, const GLuint *v);
-ANGLE_EXPORT void GL_APIENTRY VertexAttribI2i(GLuint index, GLint x, GLint y);
-ANGLE_EXPORT void GL_APIENTRY VertexAttribI2iv(GLuint index, const GLint *v);
-ANGLE_EXPORT void GL_APIENTRY VertexAttribI2ui(GLuint index, GLuint x, GLuint y);
-ANGLE_EXPORT void GL_APIENTRY VertexAttribI2uiv(GLuint index, const GLuint *v);
-ANGLE_EXPORT void GL_APIENTRY VertexAttribI3i(GLuint index, GLint x, GLint y, GLint z);
-ANGLE_EXPORT void GL_APIENTRY VertexAttribI3iv(GLuint index, const GLint *v);
-ANGLE_EXPORT void GL_APIENTRY VertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z);
-ANGLE_EXPORT void GL_APIENTRY VertexAttribI3uiv(GLuint index, const GLuint *v);
-ANGLE_EXPORT void GL_APIENTRY VertexAttribI4bv(GLuint index, const GLbyte *v);
-ANGLE_EXPORT void GL_APIENTRY VertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w);
-ANGLE_EXPORT void GL_APIENTRY VertexAttribI4iv(GLuint index, const GLint *v);
-ANGLE_EXPORT void GL_APIENTRY VertexAttribI4sv(GLuint index, const GLshort *v);
-ANGLE_EXPORT void GL_APIENTRY VertexAttribI4ubv(GLuint index, const GLubyte *v);
-ANGLE_EXPORT void GL_APIENTRY
-VertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
-ANGLE_EXPORT void GL_APIENTRY VertexAttribI4uiv(GLuint index, const GLuint *v);
-ANGLE_EXPORT void GL_APIENTRY VertexAttribI4usv(GLuint index, const GLushort *v);
-ANGLE_EXPORT void GL_APIENTRY
-VertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
-}  // namespace gl
-
-#endif  // LIBGL_ENTRY_POINTS_GL_3_0_AUTOGEN_H_
diff --git a/src/libGL/entry_points_gl_3_1_autogen.cpp b/src/libGL/entry_points_gl_3_1_autogen.cpp
deleted file mode 100644
index b9babf0..0000000
--- a/src/libGL/entry_points_gl_3_1_autogen.cpp
+++ /dev/null
@@ -1,405 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// entry_points_gl_3_1_autogen.cpp:
-//   Defines the GL 3.1 entry points.
-
-#include "libGL/entry_points_gl_3_1_autogen.h"
-
-#include "libANGLE/Context.h"
-#include "libANGLE/Context.inl.h"
-#include "libANGLE/entry_points_utils.h"
-#include "libANGLE/gl_enum_utils.h"
-#include "libANGLE/validationEGL.h"
-#include "libANGLE/validationES.h"
-#include "libANGLE/validationES1.h"
-#include "libANGLE/validationES2.h"
-#include "libANGLE/validationES3.h"
-#include "libANGLE/validationES31.h"
-#include "libANGLE/validationES32.h"
-#include "libANGLE/validationESEXT.h"
-#include "libANGLE/validationGL31_autogen.h"
-#include "libGLESv2/global_state.h"
-
-namespace gl
-{
-void GL_APIENTRY CopyBufferSubData(GLenum readTarget,
-                                   GLenum writeTarget,
-                                   GLintptr readOffset,
-                                   GLintptr writeOffset,
-                                   GLsizeiptr size)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CopyBufferSubData, "glCopyBufferSubData",
-          "context = %d, readTarget = %s, writeTarget = %s, readOffset = %llu, writeOffset = %llu, "
-          "size = %llu",
-          CID(context), GLenumToString(GLenumGroup::CopyBufferSubDataTarget, readTarget),
-          GLenumToString(GLenumGroup::CopyBufferSubDataTarget, writeTarget),
-          static_cast<unsigned long long>(readOffset), static_cast<unsigned long long>(writeOffset),
-          static_cast<unsigned long long>(size));
-
-    if (context)
-    {
-        BufferBinding readTargetPacked                        = FromGL<BufferBinding>(readTarget);
-        BufferBinding writeTargetPacked                       = FromGL<BufferBinding>(writeTarget);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateCopyBufferSubData(context, readTargetPacked, writeTargetPacked,
-                                                      readOffset, writeOffset, size));
-        if (isCallValid)
-        {
-            context->copyBufferSubData(readTargetPacked, writeTargetPacked, readOffset, writeOffset,
-                                       size);
-        }
-        ANGLE_CAPTURE(CopyBufferSubData, isCallValid, context, readTargetPacked, writeTargetPacked,
-                      readOffset, writeOffset, size);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawArraysInstanced, "glDrawArraysInstanced",
-          "context = %d, mode = %s, first = %d, count = %d, instancecount = %d", CID(context),
-          GLenumToString(GLenumGroup::PrimitiveType, mode), first, count, instancecount);
-
-    if (context)
-    {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateDrawArraysInstanced(context, modePacked, first, count, instancecount));
-        if (isCallValid)
-        {
-            context->drawArraysInstanced(modePacked, first, count, instancecount);
-        }
-        ANGLE_CAPTURE(DrawArraysInstanced, isCallValid, context, modePacked, first, count,
-                      instancecount);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DrawElementsInstanced(GLenum mode,
-                                       GLsizei count,
-                                       GLenum type,
-                                       const void *indices,
-                                       GLsizei instancecount)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawElementsInstanced, "glDrawElementsInstanced",
-          "context = %d, mode = %s, count = %d, type = %s, indices = 0x%016" PRIxPTR
-          ", instancecount = %d",
-          CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), count,
-          GLenumToString(GLenumGroup::DrawElementsType, type), (uintptr_t)indices, instancecount);
-
-    if (context)
-    {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateDrawElementsInstanced(context, modePacked, count, typePacked,
-                                                          indices, instancecount));
-        if (isCallValid)
-        {
-            context->drawElementsInstanced(modePacked, count, typePacked, indices, instancecount);
-        }
-        ANGLE_CAPTURE(DrawElementsInstanced, isCallValid, context, modePacked, count, typePacked,
-                      indices, instancecount);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetActiveUniformBlockName(GLuint program,
-                                           GLuint uniformBlockIndex,
-                                           GLsizei bufSize,
-                                           GLsizei *length,
-                                           GLchar *uniformBlockName)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(
-        context, gl::EntryPoint::GetActiveUniformBlockName, "glGetActiveUniformBlockName",
-        "context = %d, program = %u, uniformBlockIndex = %u, bufSize = %d, length = 0x%016" PRIxPTR
-        ", uniformBlockName = 0x%016" PRIxPTR "",
-        CID(context), program, uniformBlockIndex, bufSize, (uintptr_t)length,
-        (uintptr_t)uniformBlockName);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetActiveUniformBlockName(context, programPacked, uniformBlockIndex, bufSize,
-                                               length, uniformBlockName));
-        if (isCallValid)
-        {
-            context->getActiveUniformBlockName(programPacked, uniformBlockIndex, bufSize, length,
-                                               uniformBlockName);
-        }
-        ANGLE_CAPTURE(GetActiveUniformBlockName, isCallValid, context, programPacked,
-                      uniformBlockIndex, bufSize, length, uniformBlockName);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetActiveUniformBlockiv(GLuint program,
-                                         GLuint uniformBlockIndex,
-                                         GLenum pname,
-                                         GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetActiveUniformBlockiv, "glGetActiveUniformBlockiv",
-          "context = %d, program = %u, uniformBlockIndex = %u, pname = %s, params = 0x%016" PRIxPTR
-          "",
-          CID(context), program, uniformBlockIndex,
-          GLenumToString(GLenumGroup::UniformBlockPName, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetActiveUniformBlockiv(context, programPacked,
-                                                            uniformBlockIndex, pname, params));
-        if (isCallValid)
-        {
-            context->getActiveUniformBlockiv(programPacked, uniformBlockIndex, pname, params);
-        }
-        ANGLE_CAPTURE(GetActiveUniformBlockiv, isCallValid, context, programPacked,
-                      uniformBlockIndex, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetActiveUniformName(GLuint program,
-                                      GLuint uniformIndex,
-                                      GLsizei bufSize,
-                                      GLsizei *length,
-                                      GLchar *uniformName)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetActiveUniformName, "glGetActiveUniformName",
-          "context = %d, program = %u, uniformIndex = %u, bufSize = %d, length = 0x%016" PRIxPTR
-          ", uniformName = 0x%016" PRIxPTR "",
-          CID(context), program, uniformIndex, bufSize, (uintptr_t)length, (uintptr_t)uniformName);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetActiveUniformName(context, programPacked, uniformIndex,
-                                                         bufSize, length, uniformName));
-        if (isCallValid)
-        {
-            context->getActiveUniformName(programPacked, uniformIndex, bufSize, length,
-                                          uniformName);
-        }
-        ANGLE_CAPTURE(GetActiveUniformName, isCallValid, context, programPacked, uniformIndex,
-                      bufSize, length, uniformName);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetActiveUniformsiv(GLuint program,
-                                     GLsizei uniformCount,
-                                     const GLuint *uniformIndices,
-                                     GLenum pname,
-                                     GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetActiveUniformsiv, "glGetActiveUniformsiv",
-          "context = %d, program = %u, uniformCount = %d, uniformIndices = 0x%016" PRIxPTR
-          ", pname = %s, params = 0x%016" PRIxPTR "",
-          CID(context), program, uniformCount, (uintptr_t)uniformIndices,
-          GLenumToString(GLenumGroup::UniformPName, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetActiveUniformsiv(context, programPacked, uniformCount,
-                                                        uniformIndices, pname, params));
-        if (isCallValid)
-        {
-            context->getActiveUniformsiv(programPacked, uniformCount, uniformIndices, pname,
-                                         params);
-        }
-        ANGLE_CAPTURE(GetActiveUniformsiv, isCallValid, context, programPacked, uniformCount,
-                      uniformIndices, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-GLuint GL_APIENTRY GetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetUniformBlockIndex, "glGetUniformBlockIndex",
-          "context = %d, program = %u, uniformBlockName = 0x%016" PRIxPTR "", CID(context), program,
-          (uintptr_t)uniformBlockName);
-
-    GLuint returnValue;
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetUniformBlockIndex(context, programPacked, uniformBlockName));
-        if (isCallValid)
-        {
-            returnValue = context->getUniformBlockIndex(programPacked, uniformBlockName);
-        }
-        else
-        {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetUniformBlockIndex, GLuint>();
-        }
-        ANGLE_CAPTURE(GetUniformBlockIndex, isCallValid, context, programPacked, uniformBlockName,
-                      returnValue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::GetUniformBlockIndex, GLuint>();
-    }
-    return returnValue;
-}
-
-void GL_APIENTRY GetUniformIndices(GLuint program,
-                                   GLsizei uniformCount,
-                                   const GLchar *const *uniformNames,
-                                   GLuint *uniformIndices)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetUniformIndices, "glGetUniformIndices",
-          "context = %d, program = %u, uniformCount = %d, uniformNames = 0x%016" PRIxPTR
-          ", uniformIndices = 0x%016" PRIxPTR "",
-          CID(context), program, uniformCount, (uintptr_t)uniformNames, (uintptr_t)uniformIndices);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetUniformIndices(context, programPacked, uniformCount,
-                                                      uniformNames, uniformIndices));
-        if (isCallValid)
-        {
-            context->getUniformIndices(programPacked, uniformCount, uniformNames, uniformIndices);
-        }
-        ANGLE_CAPTURE(GetUniformIndices, isCallValid, context, programPacked, uniformCount,
-                      uniformNames, uniformIndices);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY PrimitiveRestartIndex(GLuint index)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PrimitiveRestartIndex, "glPrimitiveRestartIndex",
-          "context = %d, index = %u", CID(context), index);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidatePrimitiveRestartIndex(context, index));
-        if (isCallValid)
-        {
-            context->primitiveRestartIndex(index);
-        }
-        ANGLE_CAPTURE(PrimitiveRestartIndex, isCallValid, context, index);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexBuffer, "glTexBuffer",
-          "context = %d, target = %s, internalformat = %s, buffer = %u", CID(context),
-          GLenumToString(GLenumGroup::TextureTarget, target),
-          GLenumToString(GLenumGroup::InternalFormat, internalformat), buffer);
-
-    if (context)
-    {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateTexBuffer(context, targetPacked, internalformat, bufferPacked));
-        if (isCallValid)
-        {
-            context->texBuffer(targetPacked, internalformat, bufferPacked);
-        }
-        ANGLE_CAPTURE(TexBuffer, isCallValid, context, targetPacked, internalformat, bufferPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY UniformBlockBinding(GLuint program,
-                                     GLuint uniformBlockIndex,
-                                     GLuint uniformBlockBinding)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::UniformBlockBinding, "glUniformBlockBinding",
-          "context = %d, program = %u, uniformBlockIndex = %u, uniformBlockBinding = %u",
-          CID(context), program, uniformBlockIndex, uniformBlockBinding);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateUniformBlockBinding(context, programPacked, uniformBlockIndex,
-                                                        uniformBlockBinding));
-        if (isCallValid)
-        {
-            context->uniformBlockBinding(programPacked, uniformBlockIndex, uniformBlockBinding);
-        }
-        ANGLE_CAPTURE(UniformBlockBinding, isCallValid, context, programPacked, uniformBlockIndex,
-                      uniformBlockBinding);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-}  // namespace gl
diff --git a/src/libGL/entry_points_gl_3_1_autogen.h b/src/libGL/entry_points_gl_3_1_autogen.h
deleted file mode 100644
index a986549..0000000
--- a/src/libGL/entry_points_gl_3_1_autogen.h
+++ /dev/null
@@ -1,65 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// entry_points_gl_3_1_autogen.h:
-//   Defines the GL 3.1 entry points.
-
-#ifndef LIBGL_ENTRY_POINTS_GL_3_1_AUTOGEN_H_
-#define LIBGL_ENTRY_POINTS_GL_3_1_AUTOGEN_H_
-
-#include <export.h>
-#include "angle_gl.h"
-
-namespace gl
-{
-ANGLE_EXPORT void GL_APIENTRY CopyBufferSubData(GLenum readTarget,
-                                                GLenum writeTarget,
-                                                GLintptr readOffset,
-                                                GLintptr writeOffset,
-                                                GLsizeiptr size);
-ANGLE_EXPORT void GL_APIENTRY DrawArraysInstanced(GLenum mode,
-                                                  GLint first,
-                                                  GLsizei count,
-                                                  GLsizei instancecount);
-ANGLE_EXPORT void GL_APIENTRY DrawElementsInstanced(GLenum mode,
-                                                    GLsizei count,
-                                                    GLenum type,
-                                                    const void *indices,
-                                                    GLsizei instancecount);
-ANGLE_EXPORT void GL_APIENTRY GetActiveUniformBlockName(GLuint program,
-                                                        GLuint uniformBlockIndex,
-                                                        GLsizei bufSize,
-                                                        GLsizei *length,
-                                                        GLchar *uniformBlockName);
-ANGLE_EXPORT void GL_APIENTRY GetActiveUniformBlockiv(GLuint program,
-                                                      GLuint uniformBlockIndex,
-                                                      GLenum pname,
-                                                      GLint *params);
-ANGLE_EXPORT void GL_APIENTRY GetActiveUniformName(GLuint program,
-                                                   GLuint uniformIndex,
-                                                   GLsizei bufSize,
-                                                   GLsizei *length,
-                                                   GLchar *uniformName);
-ANGLE_EXPORT void GL_APIENTRY GetActiveUniformsiv(GLuint program,
-                                                  GLsizei uniformCount,
-                                                  const GLuint *uniformIndices,
-                                                  GLenum pname,
-                                                  GLint *params);
-ANGLE_EXPORT GLuint GL_APIENTRY GetUniformBlockIndex(GLuint program,
-                                                     const GLchar *uniformBlockName);
-ANGLE_EXPORT void GL_APIENTRY GetUniformIndices(GLuint program,
-                                                GLsizei uniformCount,
-                                                const GLchar *const *uniformNames,
-                                                GLuint *uniformIndices);
-ANGLE_EXPORT void GL_APIENTRY PrimitiveRestartIndex(GLuint index);
-ANGLE_EXPORT void GL_APIENTRY TexBuffer(GLenum target, GLenum internalformat, GLuint buffer);
-ANGLE_EXPORT void GL_APIENTRY UniformBlockBinding(GLuint program,
-                                                  GLuint uniformBlockIndex,
-                                                  GLuint uniformBlockBinding);
-}  // namespace gl
-
-#endif  // LIBGL_ENTRY_POINTS_GL_3_1_AUTOGEN_H_
diff --git a/src/libGL/entry_points_gl_3_2_autogen.cpp b/src/libGL/entry_points_gl_3_2_autogen.cpp
deleted file mode 100644
index de580cb..0000000
--- a/src/libGL/entry_points_gl_3_2_autogen.cpp
+++ /dev/null
@@ -1,586 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// entry_points_gl_3_2_autogen.cpp:
-//   Defines the GL 3.2 entry points.
-
-#include "libGL/entry_points_gl_3_2_autogen.h"
-
-#include "libANGLE/Context.h"
-#include "libANGLE/Context.inl.h"
-#include "libANGLE/entry_points_utils.h"
-#include "libANGLE/gl_enum_utils.h"
-#include "libANGLE/validationEGL.h"
-#include "libANGLE/validationES.h"
-#include "libANGLE/validationES1.h"
-#include "libANGLE/validationES2.h"
-#include "libANGLE/validationES3.h"
-#include "libANGLE/validationES31.h"
-#include "libANGLE/validationES32.h"
-#include "libANGLE/validationESEXT.h"
-#include "libANGLE/validationGL32_autogen.h"
-#include "libGLESv2/global_state.h"
-
-namespace gl
-{
-GLenum GL_APIENTRY ClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ClientWaitSync, "glClientWaitSync",
-          "context = %d, sync = 0x%016" PRIxPTR ", flags = %s, timeout = %llu", CID(context),
-          (uintptr_t)sync, GLbitfieldToString(GLenumGroup::SyncObjectMask, flags).c_str(),
-          static_cast<unsigned long long>(timeout));
-
-    GLenum returnValue;
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateClientWaitSync(context, sync, flags, timeout));
-        if (isCallValid)
-        {
-            returnValue = context->clientWaitSync(sync, flags, timeout);
-        }
-        else
-        {
-            returnValue = GetDefaultReturnValue<EntryPoint::ClientWaitSync, GLenum>();
-        }
-        ANGLE_CAPTURE(ClientWaitSync, isCallValid, context, sync, flags, timeout, returnValue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::ClientWaitSync, GLenum>();
-    }
-    return returnValue;
-}
-
-void GL_APIENTRY DeleteSync(GLsync sync)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DeleteSync, "glDeleteSync",
-          "context = %d, sync = 0x%016" PRIxPTR "", CID(context), (uintptr_t)sync);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateDeleteSync(context, sync));
-        if (isCallValid)
-        {
-            context->deleteSync(sync);
-        }
-        ANGLE_CAPTURE(DeleteSync, isCallValid, context, sync);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DrawElementsBaseVertex(GLenum mode,
-                                        GLsizei count,
-                                        GLenum type,
-                                        const void *indices,
-                                        GLint basevertex)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawElementsBaseVertex, "glDrawElementsBaseVertex",
-          "context = %d, mode = %s, count = %d, type = %s, indices = 0x%016" PRIxPTR
-          ", basevertex = %d",
-          CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), count,
-          GLenumToString(GLenumGroup::DrawElementsType, type), (uintptr_t)indices, basevertex);
-
-    if (context)
-    {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateDrawElementsBaseVertex(context, modePacked, count, typePacked,
-                                                           indices, basevertex));
-        if (isCallValid)
-        {
-            context->drawElementsBaseVertex(modePacked, count, typePacked, indices, basevertex);
-        }
-        ANGLE_CAPTURE(DrawElementsBaseVertex, isCallValid, context, modePacked, count, typePacked,
-                      indices, basevertex);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DrawElementsInstancedBaseVertex(GLenum mode,
-                                                 GLsizei count,
-                                                 GLenum type,
-                                                 const void *indices,
-                                                 GLsizei instancecount,
-                                                 GLint basevertex)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawElementsInstancedBaseVertex,
-          "glDrawElementsInstancedBaseVertex",
-          "context = %d, mode = %s, count = %d, type = %s, indices = 0x%016" PRIxPTR
-          ", instancecount = %d, basevertex = %d",
-          CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), count,
-          GLenumToString(GLenumGroup::DrawElementsType, type), (uintptr_t)indices, instancecount,
-          basevertex);
-
-    if (context)
-    {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateDrawElementsInstancedBaseVertex(
-                                                             context, modePacked, count, typePacked,
-                                                             indices, instancecount, basevertex));
-        if (isCallValid)
-        {
-            context->drawElementsInstancedBaseVertex(modePacked, count, typePacked, indices,
-                                                     instancecount, basevertex);
-        }
-        ANGLE_CAPTURE(DrawElementsInstancedBaseVertex, isCallValid, context, modePacked, count,
-                      typePacked, indices, instancecount, basevertex);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DrawRangeElementsBaseVertex(GLenum mode,
-                                             GLuint start,
-                                             GLuint end,
-                                             GLsizei count,
-                                             GLenum type,
-                                             const void *indices,
-                                             GLint basevertex)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawRangeElementsBaseVertex, "glDrawRangeElementsBaseVertex",
-          "context = %d, mode = %s, start = %u, end = %u, count = %d, type = %s, indices = "
-          "0x%016" PRIxPTR ", basevertex = %d",
-          CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), start, end, count,
-          GLenumToString(GLenumGroup::DrawElementsType, type), (uintptr_t)indices, basevertex);
-
-    if (context)
-    {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateDrawRangeElementsBaseVertex(
-                                                             context, modePacked, start, end, count,
-                                                             typePacked, indices, basevertex));
-        if (isCallValid)
-        {
-            context->drawRangeElementsBaseVertex(modePacked, start, end, count, typePacked, indices,
-                                                 basevertex);
-        }
-        ANGLE_CAPTURE(DrawRangeElementsBaseVertex, isCallValid, context, modePacked, start, end,
-                      count, typePacked, indices, basevertex);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-GLsync GL_APIENTRY FenceSync(GLenum condition, GLbitfield flags)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::FenceSync, "glFenceSync",
-          "context = %d, condition = %s, flags = %s", CID(context),
-          GLenumToString(GLenumGroup::SyncCondition, condition),
-          GLbitfieldToString(GLenumGroup::DefaultGroup, flags).c_str());
-
-    GLsync returnValue;
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateFenceSync(context, condition, flags));
-        if (isCallValid)
-        {
-            returnValue = context->fenceSync(condition, flags);
-        }
-        else
-        {
-            returnValue = GetDefaultReturnValue<EntryPoint::FenceSync, GLsync>();
-        }
-        ANGLE_CAPTURE(FenceSync, isCallValid, context, condition, flags, returnValue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::FenceSync, GLsync>();
-    }
-    return returnValue;
-}
-
-void GL_APIENTRY FramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::FramebufferTexture, "glFramebufferTexture",
-          "context = %d, target = %s, attachment = %s, texture = %u, level = %d", CID(context),
-          GLenumToString(GLenumGroup::FramebufferTarget, target),
-          GLenumToString(GLenumGroup::FramebufferAttachment, attachment), texture, level);
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateFramebufferTexture(context, target, attachment, texturePacked, level));
-        if (isCallValid)
-        {
-            context->framebufferTexture(target, attachment, texturePacked, level);
-        }
-        ANGLE_CAPTURE(FramebufferTexture, isCallValid, context, target, attachment, texturePacked,
-                      level);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetBufferParameteri64v, "glGetBufferParameteri64v",
-          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::BufferTargetARB, target),
-          GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetBufferParameteri64v(context, targetPacked, pname, params));
-        if (isCallValid)
-        {
-            context->getBufferParameteri64v(targetPacked, pname, params);
-        }
-        ANGLE_CAPTURE(GetBufferParameteri64v, isCallValid, context, targetPacked, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetInteger64i_v(GLenum target, GLuint index, GLint64 *data)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetInteger64i_v, "glGetInteger64i_v",
-          "context = %d, target = %s, index = %u, data = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TypeEnum, target), index, (uintptr_t)data);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetInteger64i_v(context, target, index, data));
-        if (isCallValid)
-        {
-            context->getInteger64i_v(target, index, data);
-        }
-        ANGLE_CAPTURE(GetInteger64i_v, isCallValid, context, target, index, data);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetInteger64v(GLenum pname, GLint64 *data)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetInteger64v, "glGetInteger64v",
-          "context = %d, pname = %s, data = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::GetPName, pname), (uintptr_t)data);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetInteger64v(context, pname, data));
-        if (isCallValid)
-        {
-            context->getInteger64v(pname, data);
-        }
-        ANGLE_CAPTURE(GetInteger64v, isCallValid, context, pname, data);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetMultisamplefv, "glGetMultisamplefv",
-          "context = %d, pname = %s, index = %u, val = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::DefaultGroup, pname), index, (uintptr_t)val);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetMultisamplefv(context, pname, index, val));
-        if (isCallValid)
-        {
-            context->getMultisamplefv(pname, index, val);
-        }
-        ANGLE_CAPTURE(GetMultisamplefv, isCallValid, context, pname, index, val);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY
-GetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
-{
-    Context *context = GetGlobalContext();
-    EVENT(context, gl::EntryPoint::GetSynciv, "glGetSynciv",
-          "context = %d, sync = 0x%016" PRIxPTR
-          ", pname = %s, bufSize = %d, length = 0x%016" PRIxPTR ", values = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)sync, GLenumToString(GLenumGroup::SyncParameterName, pname),
-          bufSize, (uintptr_t)length, (uintptr_t)values);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetSynciv(context, sync, pname, bufSize, length, values));
-        if (isCallValid)
-        {
-            context->getSynciv(sync, pname, bufSize, length, values);
-        }
-        ANGLE_CAPTURE(GetSynciv, isCallValid, context, sync, pname, bufSize, length, values);
-    }
-    else
-    {}
-}
-
-GLboolean GL_APIENTRY IsSync(GLsync sync)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IsSync, "glIsSync", "context = %d, sync = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)sync);
-
-    GLboolean returnValue;
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateIsSync(context, sync));
-        if (isCallValid)
-        {
-            returnValue = context->isSync(sync);
-        }
-        else
-        {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsSync, GLboolean>();
-        }
-        ANGLE_CAPTURE(IsSync, isCallValid, context, sync, returnValue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::IsSync, GLboolean>();
-    }
-    return returnValue;
-}
-
-void GL_APIENTRY MultiDrawElementsBaseVertex(GLenum mode,
-                                             const GLsizei *count,
-                                             GLenum type,
-                                             const void *const *indices,
-                                             GLsizei drawcount,
-                                             const GLint *basevertex)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiDrawElementsBaseVertex, "glMultiDrawElementsBaseVertex",
-          "context = %d, mode = %s, count = 0x%016" PRIxPTR ", type = %s, indices = 0x%016" PRIxPTR
-          ", drawcount = %d, basevertex = 0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), (uintptr_t)count,
-          GLenumToString(GLenumGroup::DrawElementsType, type), (uintptr_t)indices, drawcount,
-          (uintptr_t)basevertex);
-
-    if (context)
-    {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateMultiDrawElementsBaseVertex(
-                                                             context, modePacked, count, typePacked,
-                                                             indices, drawcount, basevertex));
-        if (isCallValid)
-        {
-            context->multiDrawElementsBaseVertex(modePacked, count, typePacked, indices, drawcount,
-                                                 basevertex);
-        }
-        ANGLE_CAPTURE(MultiDrawElementsBaseVertex, isCallValid, context, modePacked, count,
-                      typePacked, indices, drawcount, basevertex);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProvokingVertex(GLenum mode)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProvokingVertex, "glProvokingVertex", "context = %d, mode = %s",
-          CID(context), GLenumToString(GLenumGroup::VertexProvokingMode, mode));
-
-    if (context)
-    {
-        ProvokingVertexConvention modePacked = FromGL<ProvokingVertexConvention>(mode);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateProvokingVertex(context, modePacked));
-        if (isCallValid)
-        {
-            context->provokingVertex(modePacked);
-        }
-        ANGLE_CAPTURE(ProvokingVertex, isCallValid, context, modePacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY SampleMaski(GLuint maskNumber, GLbitfield mask)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SampleMaski, "glSampleMaski",
-          "context = %d, maskNumber = %u, mask = %s", CID(context), maskNumber,
-          GLbitfieldToString(GLenumGroup::DefaultGroup, mask).c_str());
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateSampleMaski(context, maskNumber, mask));
-        if (isCallValid)
-        {
-            context->sampleMaski(maskNumber, mask);
-        }
-        ANGLE_CAPTURE(SampleMaski, isCallValid, context, maskNumber, mask);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexImage2DMultisample(GLenum target,
-                                       GLsizei samples,
-                                       GLenum internalformat,
-                                       GLsizei width,
-                                       GLsizei height,
-                                       GLboolean fixedsamplelocations)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexImage2DMultisample, "glTexImage2DMultisample",
-          "context = %d, target = %s, samples = %d, internalformat = %s, width = %d, height = %d, "
-          "fixedsamplelocations = %s",
-          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), samples,
-          GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height,
-          GLbooleanToString(fixedsamplelocations));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateTexImage2DMultisample(context, target, samples, internalformat,
-                                                          width, height, fixedsamplelocations));
-        if (isCallValid)
-        {
-            context->texImage2DMultisample(target, samples, internalformat, width, height,
-                                           fixedsamplelocations);
-        }
-        ANGLE_CAPTURE(TexImage2DMultisample, isCallValid, context, target, samples, internalformat,
-                      width, height, fixedsamplelocations);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexImage3DMultisample(GLenum target,
-                                       GLsizei samples,
-                                       GLenum internalformat,
-                                       GLsizei width,
-                                       GLsizei height,
-                                       GLsizei depth,
-                                       GLboolean fixedsamplelocations)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexImage3DMultisample, "glTexImage3DMultisample",
-          "context = %d, target = %s, samples = %d, internalformat = %s, width = %d, height = %d, "
-          "depth = %d, fixedsamplelocations = %s",
-          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), samples,
-          GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height, depth,
-          GLbooleanToString(fixedsamplelocations));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateTexImage3DMultisample(context, target, samples, internalformat, width, height,
-                                           depth, fixedsamplelocations));
-        if (isCallValid)
-        {
-            context->texImage3DMultisample(target, samples, internalformat, width, height, depth,
-                                           fixedsamplelocations);
-        }
-        ANGLE_CAPTURE(TexImage3DMultisample, isCallValid, context, target, samples, internalformat,
-                      width, height, depth, fixedsamplelocations);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY WaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::WaitSync, "glWaitSync",
-          "context = %d, sync = 0x%016" PRIxPTR ", flags = %s, timeout = %llu", CID(context),
-          (uintptr_t)sync, GLbitfieldToString(GLenumGroup::DefaultGroup, flags).c_str(),
-          static_cast<unsigned long long>(timeout));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateWaitSync(context, sync, flags, timeout));
-        if (isCallValid)
-        {
-            context->waitSync(sync, flags, timeout);
-        }
-        ANGLE_CAPTURE(WaitSync, isCallValid, context, sync, flags, timeout);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-}  // namespace gl
diff --git a/src/libGL/entry_points_gl_3_2_autogen.h b/src/libGL/entry_points_gl_3_2_autogen.h
deleted file mode 100644
index c64a1da..0000000
--- a/src/libGL/entry_points_gl_3_2_autogen.h
+++ /dev/null
@@ -1,75 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// entry_points_gl_3_2_autogen.h:
-//   Defines the GL 3.2 entry points.
-
-#ifndef LIBGL_ENTRY_POINTS_GL_3_2_AUTOGEN_H_
-#define LIBGL_ENTRY_POINTS_GL_3_2_AUTOGEN_H_
-
-#include <export.h>
-#include "angle_gl.h"
-
-namespace gl
-{
-ANGLE_EXPORT GLenum GL_APIENTRY ClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
-ANGLE_EXPORT void GL_APIENTRY DeleteSync(GLsync sync);
-ANGLE_EXPORT void GL_APIENTRY DrawElementsBaseVertex(GLenum mode,
-                                                     GLsizei count,
-                                                     GLenum type,
-                                                     const void *indices,
-                                                     GLint basevertex);
-ANGLE_EXPORT void GL_APIENTRY DrawElementsInstancedBaseVertex(GLenum mode,
-                                                              GLsizei count,
-                                                              GLenum type,
-                                                              const void *indices,
-                                                              GLsizei instancecount,
-                                                              GLint basevertex);
-ANGLE_EXPORT void GL_APIENTRY DrawRangeElementsBaseVertex(GLenum mode,
-                                                          GLuint start,
-                                                          GLuint end,
-                                                          GLsizei count,
-                                                          GLenum type,
-                                                          const void *indices,
-                                                          GLint basevertex);
-ANGLE_EXPORT GLsync GL_APIENTRY FenceSync(GLenum condition, GLbitfield flags);
-ANGLE_EXPORT void GL_APIENTRY FramebufferTexture(GLenum target,
-                                                 GLenum attachment,
-                                                 GLuint texture,
-                                                 GLint level);
-ANGLE_EXPORT void GL_APIENTRY GetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params);
-ANGLE_EXPORT void GL_APIENTRY GetInteger64i_v(GLenum target, GLuint index, GLint64 *data);
-ANGLE_EXPORT void GL_APIENTRY GetInteger64v(GLenum pname, GLint64 *data);
-ANGLE_EXPORT void GL_APIENTRY GetMultisamplefv(GLenum pname, GLuint index, GLfloat *val);
-ANGLE_EXPORT void GL_APIENTRY
-GetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
-ANGLE_EXPORT GLboolean GL_APIENTRY IsSync(GLsync sync);
-ANGLE_EXPORT void GL_APIENTRY MultiDrawElementsBaseVertex(GLenum mode,
-                                                          const GLsizei *count,
-                                                          GLenum type,
-                                                          const void *const *indices,
-                                                          GLsizei drawcount,
-                                                          const GLint *basevertex);
-ANGLE_EXPORT void GL_APIENTRY ProvokingVertex(GLenum mode);
-ANGLE_EXPORT void GL_APIENTRY SampleMaski(GLuint maskNumber, GLbitfield mask);
-ANGLE_EXPORT void GL_APIENTRY TexImage2DMultisample(GLenum target,
-                                                    GLsizei samples,
-                                                    GLenum internalformat,
-                                                    GLsizei width,
-                                                    GLsizei height,
-                                                    GLboolean fixedsamplelocations);
-ANGLE_EXPORT void GL_APIENTRY TexImage3DMultisample(GLenum target,
-                                                    GLsizei samples,
-                                                    GLenum internalformat,
-                                                    GLsizei width,
-                                                    GLsizei height,
-                                                    GLsizei depth,
-                                                    GLboolean fixedsamplelocations);
-ANGLE_EXPORT void GL_APIENTRY WaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
-}  // namespace gl
-
-#endif  // LIBGL_ENTRY_POINTS_GL_3_2_AUTOGEN_H_
diff --git a/src/libGL/entry_points_gl_3_3_autogen.cpp b/src/libGL/entry_points_gl_3_3_autogen.cpp
deleted file mode 100644
index b89be5f..0000000
--- a/src/libGL/entry_points_gl_3_3_autogen.cpp
+++ /dev/null
@@ -1,1469 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// entry_points_gl_3_3_autogen.cpp:
-//   Defines the GL 3.3 entry points.
-
-#include "libGL/entry_points_gl_3_3_autogen.h"
-
-#include "libANGLE/Context.h"
-#include "libANGLE/Context.inl.h"
-#include "libANGLE/entry_points_utils.h"
-#include "libANGLE/gl_enum_utils.h"
-#include "libANGLE/validationEGL.h"
-#include "libANGLE/validationES.h"
-#include "libANGLE/validationES1.h"
-#include "libANGLE/validationES2.h"
-#include "libANGLE/validationES3.h"
-#include "libANGLE/validationES31.h"
-#include "libANGLE/validationES32.h"
-#include "libANGLE/validationESEXT.h"
-#include "libANGLE/validationGL33_autogen.h"
-#include "libGLESv2/global_state.h"
-
-namespace gl
-{
-void GL_APIENTRY BindFragDataLocationIndexed(GLuint program,
-                                             GLuint colorNumber,
-                                             GLuint index,
-                                             const GLchar *name)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindFragDataLocationIndexed, "glBindFragDataLocationIndexed",
-          "context = %d, program = %u, colorNumber = %u, index = %u, name = 0x%016" PRIxPTR "",
-          CID(context), program, colorNumber, index, (uintptr_t)name);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateBindFragDataLocationIndexed(context, programPacked, colorNumber, index, name));
-        if (isCallValid)
-        {
-            context->bindFragDataLocationIndexed(programPacked, colorNumber, index, name);
-        }
-        ANGLE_CAPTURE(BindFragDataLocationIndexed, isCallValid, context, programPacked, colorNumber,
-                      index, name);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY BindSampler(GLuint unit, GLuint sampler)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindSampler, "glBindSampler",
-          "context = %d, unit = %u, sampler = %u", CID(context), unit, sampler);
-
-    if (context)
-    {
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateBindSampler(context, unit, samplerPacked));
-        if (isCallValid)
-        {
-            context->bindSampler(unit, samplerPacked);
-        }
-        ANGLE_CAPTURE(BindSampler, isCallValid, context, unit, samplerPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ColorP3ui(GLenum type, GLuint color)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ColorP3ui, "glColorP3ui", "context = %d, type = %s, color = %u",
-          CID(context), GLenumToString(GLenumGroup::ColorPointerType, type), color);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateColorP3ui(context, type, color));
-        if (isCallValid)
-        {
-            context->colorP3ui(type, color);
-        }
-        ANGLE_CAPTURE(ColorP3ui, isCallValid, context, type, color);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ColorP3uiv(GLenum type, const GLuint *color)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ColorP3uiv, "glColorP3uiv",
-          "context = %d, type = %s, color = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::ColorPointerType, type), (uintptr_t)color);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateColorP3uiv(context, type, color));
-        if (isCallValid)
-        {
-            context->colorP3uiv(type, color);
-        }
-        ANGLE_CAPTURE(ColorP3uiv, isCallValid, context, type, color);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ColorP4ui(GLenum type, GLuint color)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ColorP4ui, "glColorP4ui", "context = %d, type = %s, color = %u",
-          CID(context), GLenumToString(GLenumGroup::ColorPointerType, type), color);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateColorP4ui(context, type, color));
-        if (isCallValid)
-        {
-            context->colorP4ui(type, color);
-        }
-        ANGLE_CAPTURE(ColorP4ui, isCallValid, context, type, color);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ColorP4uiv(GLenum type, const GLuint *color)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ColorP4uiv, "glColorP4uiv",
-          "context = %d, type = %s, color = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::ColorPointerType, type), (uintptr_t)color);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateColorP4uiv(context, type, color));
-        if (isCallValid)
-        {
-            context->colorP4uiv(type, color);
-        }
-        ANGLE_CAPTURE(ColorP4uiv, isCallValid, context, type, color);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DeleteSamplers(GLsizei count, const GLuint *samplers)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DeleteSamplers, "glDeleteSamplers",
-          "context = %d, count = %d, samplers = 0x%016" PRIxPTR "", CID(context), count,
-          (uintptr_t)samplers);
-
-    if (context)
-    {
-        const SamplerID *samplersPacked                       = FromGL<const SamplerID *>(samplers);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateDeleteSamplers(context, count, samplersPacked));
-        if (isCallValid)
-        {
-            context->deleteSamplers(count, samplersPacked);
-        }
-        ANGLE_CAPTURE(DeleteSamplers, isCallValid, context, count, samplersPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GenSamplers(GLsizei count, GLuint *samplers)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GenSamplers, "glGenSamplers",
-          "context = %d, count = %d, samplers = 0x%016" PRIxPTR "", CID(context), count,
-          (uintptr_t)samplers);
-
-    if (context)
-    {
-        SamplerID *samplersPacked                             = FromGL<SamplerID *>(samplers);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGenSamplers(context, count, samplersPacked));
-        if (isCallValid)
-        {
-            context->genSamplers(count, samplersPacked);
-        }
-        ANGLE_CAPTURE(GenSamplers, isCallValid, context, count, samplersPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-GLint GL_APIENTRY GetFragDataIndex(GLuint program, const GLchar *name)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetFragDataIndex, "glGetFragDataIndex",
-          "context = %d, program = %u, name = 0x%016" PRIxPTR "", CID(context), program,
-          (uintptr_t)name);
-
-    GLint returnValue;
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetFragDataIndex(context, programPacked, name));
-        if (isCallValid)
-        {
-            returnValue = context->getFragDataIndex(programPacked, name);
-        }
-        else
-        {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetFragDataIndex, GLint>();
-        }
-        ANGLE_CAPTURE(GetFragDataIndex, isCallValid, context, programPacked, name, returnValue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::GetFragDataIndex, GLint>();
-    }
-    return returnValue;
-}
-
-void GL_APIENTRY GetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
-{
-    Context *context = GetGlobalContext();
-    EVENT(context, gl::EntryPoint::GetQueryObjecti64v, "glGetQueryObjecti64v",
-          "context = %d, id = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), id,
-          GLenumToString(GLenumGroup::QueryObjectParameterName, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        QueryID idPacked                                      = FromGL<QueryID>(id);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetQueryObjecti64v(context, idPacked, pname, params));
-        if (isCallValid)
-        {
-            context->getQueryObjecti64v(idPacked, pname, params);
-        }
-        ANGLE_CAPTURE(GetQueryObjecti64v, isCallValid, context, idPacked, pname, params);
-    }
-    else
-    {}
-}
-
-void GL_APIENTRY GetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetQueryObjectui64v, "glGetQueryObjectui64v",
-          "context = %d, id = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), id,
-          GLenumToString(GLenumGroup::QueryObjectParameterName, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        QueryID idPacked                                      = FromGL<QueryID>(id);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetQueryObjectui64v(context, idPacked, pname, params));
-        if (isCallValid)
-        {
-            context->getQueryObjectui64v(idPacked, pname, params);
-        }
-        ANGLE_CAPTURE(GetQueryObjectui64v, isCallValid, context, idPacked, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetSamplerParameterIiv, "glGetSamplerParameterIiv",
-          "context = %d, sampler = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetSamplerParameterIiv(context, samplerPacked, pname, params));
-        if (isCallValid)
-        {
-            context->getSamplerParameterIiv(samplerPacked, pname, params);
-        }
-        ANGLE_CAPTURE(GetSamplerParameterIiv, isCallValid, context, samplerPacked, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetSamplerParameterIuiv, "glGetSamplerParameterIuiv",
-          "context = %d, sampler = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetSamplerParameterIuiv(context, samplerPacked, pname, params));
-        if (isCallValid)
-        {
-            context->getSamplerParameterIuiv(samplerPacked, pname, params);
-        }
-        ANGLE_CAPTURE(GetSamplerParameterIuiv, isCallValid, context, samplerPacked, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetSamplerParameterfv, "glGetSamplerParameterfv",
-          "context = %d, sampler = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetSamplerParameterfv(context, samplerPacked, pname, params));
-        if (isCallValid)
-        {
-            context->getSamplerParameterfv(samplerPacked, pname, params);
-        }
-        ANGLE_CAPTURE(GetSamplerParameterfv, isCallValid, context, samplerPacked, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetSamplerParameteriv, "glGetSamplerParameteriv",
-          "context = %d, sampler = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetSamplerParameteriv(context, samplerPacked, pname, params));
-        if (isCallValid)
-        {
-            context->getSamplerParameteriv(samplerPacked, pname, params);
-        }
-        ANGLE_CAPTURE(GetSamplerParameteriv, isCallValid, context, samplerPacked, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-GLboolean GL_APIENTRY IsSampler(GLuint sampler)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IsSampler, "glIsSampler", "context = %d, sampler = %u",
-          CID(context), sampler);
-
-    GLboolean returnValue;
-    if (context)
-    {
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateIsSampler(context, samplerPacked));
-        if (isCallValid)
-        {
-            returnValue = context->isSampler(samplerPacked);
-        }
-        else
-        {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsSampler, GLboolean>();
-        }
-        ANGLE_CAPTURE(IsSampler, isCallValid, context, samplerPacked, returnValue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::IsSampler, GLboolean>();
-    }
-    return returnValue;
-}
-
-void GL_APIENTRY MultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoordP1ui, "glMultiTexCoordP1ui",
-          "context = %d, texture = %s, type = %s, coords = %u", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, texture),
-          GLenumToString(GLenumGroup::TexCoordPointerType, type), coords);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateMultiTexCoordP1ui(context, texture, type, coords));
-        if (isCallValid)
-        {
-            context->multiTexCoordP1ui(texture, type, coords);
-        }
-        ANGLE_CAPTURE(MultiTexCoordP1ui, isCallValid, context, texture, type, coords);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoordP1uiv, "glMultiTexCoordP1uiv",
-          "context = %d, texture = %s, type = %s, coords = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, texture),
-          GLenumToString(GLenumGroup::TexCoordPointerType, type), (uintptr_t)coords);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateMultiTexCoordP1uiv(context, texture, type, coords));
-        if (isCallValid)
-        {
-            context->multiTexCoordP1uiv(texture, type, coords);
-        }
-        ANGLE_CAPTURE(MultiTexCoordP1uiv, isCallValid, context, texture, type, coords);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoordP2ui, "glMultiTexCoordP2ui",
-          "context = %d, texture = %s, type = %s, coords = %u", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, texture),
-          GLenumToString(GLenumGroup::TexCoordPointerType, type), coords);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateMultiTexCoordP2ui(context, texture, type, coords));
-        if (isCallValid)
-        {
-            context->multiTexCoordP2ui(texture, type, coords);
-        }
-        ANGLE_CAPTURE(MultiTexCoordP2ui, isCallValid, context, texture, type, coords);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoordP2uiv, "glMultiTexCoordP2uiv",
-          "context = %d, texture = %s, type = %s, coords = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, texture),
-          GLenumToString(GLenumGroup::TexCoordPointerType, type), (uintptr_t)coords);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateMultiTexCoordP2uiv(context, texture, type, coords));
-        if (isCallValid)
-        {
-            context->multiTexCoordP2uiv(texture, type, coords);
-        }
-        ANGLE_CAPTURE(MultiTexCoordP2uiv, isCallValid, context, texture, type, coords);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoordP3ui, "glMultiTexCoordP3ui",
-          "context = %d, texture = %s, type = %s, coords = %u", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, texture),
-          GLenumToString(GLenumGroup::TexCoordPointerType, type), coords);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateMultiTexCoordP3ui(context, texture, type, coords));
-        if (isCallValid)
-        {
-            context->multiTexCoordP3ui(texture, type, coords);
-        }
-        ANGLE_CAPTURE(MultiTexCoordP3ui, isCallValid, context, texture, type, coords);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoordP3uiv, "glMultiTexCoordP3uiv",
-          "context = %d, texture = %s, type = %s, coords = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, texture),
-          GLenumToString(GLenumGroup::TexCoordPointerType, type), (uintptr_t)coords);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateMultiTexCoordP3uiv(context, texture, type, coords));
-        if (isCallValid)
-        {
-            context->multiTexCoordP3uiv(texture, type, coords);
-        }
-        ANGLE_CAPTURE(MultiTexCoordP3uiv, isCallValid, context, texture, type, coords);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoordP4ui, "glMultiTexCoordP4ui",
-          "context = %d, texture = %s, type = %s, coords = %u", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, texture),
-          GLenumToString(GLenumGroup::TexCoordPointerType, type), coords);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateMultiTexCoordP4ui(context, texture, type, coords));
-        if (isCallValid)
-        {
-            context->multiTexCoordP4ui(texture, type, coords);
-        }
-        ANGLE_CAPTURE(MultiTexCoordP4ui, isCallValid, context, texture, type, coords);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoordP4uiv, "glMultiTexCoordP4uiv",
-          "context = %d, texture = %s, type = %s, coords = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, texture),
-          GLenumToString(GLenumGroup::TexCoordPointerType, type), (uintptr_t)coords);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateMultiTexCoordP4uiv(context, texture, type, coords));
-        if (isCallValid)
-        {
-            context->multiTexCoordP4uiv(texture, type, coords);
-        }
-        ANGLE_CAPTURE(MultiTexCoordP4uiv, isCallValid, context, texture, type, coords);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY NormalP3ui(GLenum type, GLuint coords)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::NormalP3ui, "glNormalP3ui",
-          "context = %d, type = %s, coords = %u", CID(context),
-          GLenumToString(GLenumGroup::NormalPointerType, type), coords);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateNormalP3ui(context, type, coords));
-        if (isCallValid)
-        {
-            context->normalP3ui(type, coords);
-        }
-        ANGLE_CAPTURE(NormalP3ui, isCallValid, context, type, coords);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY NormalP3uiv(GLenum type, const GLuint *coords)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::NormalP3uiv, "glNormalP3uiv",
-          "context = %d, type = %s, coords = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::NormalPointerType, type), (uintptr_t)coords);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateNormalP3uiv(context, type, coords));
-        if (isCallValid)
-        {
-            context->normalP3uiv(type, coords);
-        }
-        ANGLE_CAPTURE(NormalP3uiv, isCallValid, context, type, coords);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY QueryCounter(GLuint id, GLenum target)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::QueryCounter, "glQueryCounter",
-          "context = %d, id = %u, target = %s", CID(context), id,
-          GLenumToString(GLenumGroup::QueryTarget, target));
-
-    if (context)
-    {
-        QueryID idPacked                                      = FromGL<QueryID>(id);
-        QueryType targetPacked                                = FromGL<QueryType>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateQueryCounter(context, idPacked, targetPacked));
-        if (isCallValid)
-        {
-            context->queryCounter(idPacked, targetPacked);
-        }
-        ANGLE_CAPTURE(QueryCounter, isCallValid, context, idPacked, targetPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY SamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SamplerParameterIiv, "glSamplerParameterIiv",
-          "context = %d, sampler = %u, pname = %s, param = 0x%016" PRIxPTR "", CID(context),
-          sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)param);
-
-    if (context)
-    {
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateSamplerParameterIiv(context, samplerPacked, pname, param));
-        if (isCallValid)
-        {
-            context->samplerParameterIiv(samplerPacked, pname, param);
-        }
-        ANGLE_CAPTURE(SamplerParameterIiv, isCallValid, context, samplerPacked, pname, param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY SamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SamplerParameterIuiv, "glSamplerParameterIuiv",
-          "context = %d, sampler = %u, pname = %s, param = 0x%016" PRIxPTR "", CID(context),
-          sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)param);
-
-    if (context)
-    {
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateSamplerParameterIuiv(context, samplerPacked, pname, param));
-        if (isCallValid)
-        {
-            context->samplerParameterIuiv(samplerPacked, pname, param);
-        }
-        ANGLE_CAPTURE(SamplerParameterIuiv, isCallValid, context, samplerPacked, pname, param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY SamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SamplerParameterf, "glSamplerParameterf",
-          "context = %d, sampler = %u, pname = %s, param = %f", CID(context), sampler,
-          GLenumToString(GLenumGroup::SamplerParameterName, pname), param);
-
-    if (context)
-    {
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateSamplerParameterf(context, samplerPacked, pname, param));
-        if (isCallValid)
-        {
-            context->samplerParameterf(samplerPacked, pname, param);
-        }
-        ANGLE_CAPTURE(SamplerParameterf, isCallValid, context, samplerPacked, pname, param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY SamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SamplerParameterfv, "glSamplerParameterfv",
-          "context = %d, sampler = %u, pname = %s, param = 0x%016" PRIxPTR "", CID(context),
-          sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)param);
-
-    if (context)
-    {
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateSamplerParameterfv(context, samplerPacked, pname, param));
-        if (isCallValid)
-        {
-            context->samplerParameterfv(samplerPacked, pname, param);
-        }
-        ANGLE_CAPTURE(SamplerParameterfv, isCallValid, context, samplerPacked, pname, param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY SamplerParameteri(GLuint sampler, GLenum pname, GLint param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SamplerParameteri, "glSamplerParameteri",
-          "context = %d, sampler = %u, pname = %s, param = %d", CID(context), sampler,
-          GLenumToString(GLenumGroup::SamplerParameterName, pname), param);
-
-    if (context)
-    {
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateSamplerParameteri(context, samplerPacked, pname, param));
-        if (isCallValid)
-        {
-            context->samplerParameteri(samplerPacked, pname, param);
-        }
-        ANGLE_CAPTURE(SamplerParameteri, isCallValid, context, samplerPacked, pname, param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY SamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SamplerParameteriv, "glSamplerParameteriv",
-          "context = %d, sampler = %u, pname = %s, param = 0x%016" PRIxPTR "", CID(context),
-          sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)param);
-
-    if (context)
-    {
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateSamplerParameteriv(context, samplerPacked, pname, param));
-        if (isCallValid)
-        {
-            context->samplerParameteriv(samplerPacked, pname, param);
-        }
-        ANGLE_CAPTURE(SamplerParameteriv, isCallValid, context, samplerPacked, pname, param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY SecondaryColorP3ui(GLenum type, GLuint color)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SecondaryColorP3ui, "glSecondaryColorP3ui",
-          "context = %d, type = %s, color = %u", CID(context),
-          GLenumToString(GLenumGroup::ColorPointerType, type), color);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateSecondaryColorP3ui(context, type, color));
-        if (isCallValid)
-        {
-            context->secondaryColorP3ui(type, color);
-        }
-        ANGLE_CAPTURE(SecondaryColorP3ui, isCallValid, context, type, color);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY SecondaryColorP3uiv(GLenum type, const GLuint *color)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SecondaryColorP3uiv, "glSecondaryColorP3uiv",
-          "context = %d, type = %s, color = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::ColorPointerType, type), (uintptr_t)color);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateSecondaryColorP3uiv(context, type, color));
-        if (isCallValid)
-        {
-            context->secondaryColorP3uiv(type, color);
-        }
-        ANGLE_CAPTURE(SecondaryColorP3uiv, isCallValid, context, type, color);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoordP1ui(GLenum type, GLuint coords)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoordP1ui, "glTexCoordP1ui",
-          "context = %d, type = %s, coords = %u", CID(context),
-          GLenumToString(GLenumGroup::TexCoordPointerType, type), coords);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateTexCoordP1ui(context, type, coords));
-        if (isCallValid)
-        {
-            context->texCoordP1ui(type, coords);
-        }
-        ANGLE_CAPTURE(TexCoordP1ui, isCallValid, context, type, coords);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoordP1uiv(GLenum type, const GLuint *coords)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoordP1uiv, "glTexCoordP1uiv",
-          "context = %d, type = %s, coords = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TexCoordPointerType, type), (uintptr_t)coords);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateTexCoordP1uiv(context, type, coords));
-        if (isCallValid)
-        {
-            context->texCoordP1uiv(type, coords);
-        }
-        ANGLE_CAPTURE(TexCoordP1uiv, isCallValid, context, type, coords);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoordP2ui(GLenum type, GLuint coords)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoordP2ui, "glTexCoordP2ui",
-          "context = %d, type = %s, coords = %u", CID(context),
-          GLenumToString(GLenumGroup::TexCoordPointerType, type), coords);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateTexCoordP2ui(context, type, coords));
-        if (isCallValid)
-        {
-            context->texCoordP2ui(type, coords);
-        }
-        ANGLE_CAPTURE(TexCoordP2ui, isCallValid, context, type, coords);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoordP2uiv(GLenum type, const GLuint *coords)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoordP2uiv, "glTexCoordP2uiv",
-          "context = %d, type = %s, coords = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TexCoordPointerType, type), (uintptr_t)coords);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateTexCoordP2uiv(context, type, coords));
-        if (isCallValid)
-        {
-            context->texCoordP2uiv(type, coords);
-        }
-        ANGLE_CAPTURE(TexCoordP2uiv, isCallValid, context, type, coords);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoordP3ui(GLenum type, GLuint coords)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoordP3ui, "glTexCoordP3ui",
-          "context = %d, type = %s, coords = %u", CID(context),
-          GLenumToString(GLenumGroup::TexCoordPointerType, type), coords);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateTexCoordP3ui(context, type, coords));
-        if (isCallValid)
-        {
-            context->texCoordP3ui(type, coords);
-        }
-        ANGLE_CAPTURE(TexCoordP3ui, isCallValid, context, type, coords);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoordP3uiv(GLenum type, const GLuint *coords)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoordP3uiv, "glTexCoordP3uiv",
-          "context = %d, type = %s, coords = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TexCoordPointerType, type), (uintptr_t)coords);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateTexCoordP3uiv(context, type, coords));
-        if (isCallValid)
-        {
-            context->texCoordP3uiv(type, coords);
-        }
-        ANGLE_CAPTURE(TexCoordP3uiv, isCallValid, context, type, coords);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoordP4ui(GLenum type, GLuint coords)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoordP4ui, "glTexCoordP4ui",
-          "context = %d, type = %s, coords = %u", CID(context),
-          GLenumToString(GLenumGroup::TexCoordPointerType, type), coords);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateTexCoordP4ui(context, type, coords));
-        if (isCallValid)
-        {
-            context->texCoordP4ui(type, coords);
-        }
-        ANGLE_CAPTURE(TexCoordP4ui, isCallValid, context, type, coords);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexCoordP4uiv(GLenum type, const GLuint *coords)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoordP4uiv, "glTexCoordP4uiv",
-          "context = %d, type = %s, coords = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TexCoordPointerType, type), (uintptr_t)coords);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateTexCoordP4uiv(context, type, coords));
-        if (isCallValid)
-        {
-            context->texCoordP4uiv(type, coords);
-        }
-        ANGLE_CAPTURE(TexCoordP4uiv, isCallValid, context, type, coords);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribDivisor(GLuint index, GLuint divisor)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribDivisor, "glVertexAttribDivisor",
-          "context = %d, index = %u, divisor = %u", CID(context), index, divisor);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateVertexAttribDivisor(context, index, divisor));
-        if (isCallValid)
-        {
-            context->vertexAttribDivisor(index, divisor);
-        }
-        ANGLE_CAPTURE(VertexAttribDivisor, isCallValid, context, index, divisor);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribP1ui, "glVertexAttribP1ui",
-          "context = %d, index = %u, type = %s, normalized = %s, value = %u", CID(context), index,
-          GLenumToString(GLenumGroup::VertexAttribPointerType, type), GLbooleanToString(normalized),
-          value);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateVertexAttribP1ui(context, index, type, normalized, value));
-        if (isCallValid)
-        {
-            context->vertexAttribP1ui(index, type, normalized, value);
-        }
-        ANGLE_CAPTURE(VertexAttribP1ui, isCallValid, context, index, type, normalized, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribP1uiv(GLuint index,
-                                   GLenum type,
-                                   GLboolean normalized,
-                                   const GLuint *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribP1uiv, "glVertexAttribP1uiv",
-          "context = %d, index = %u, type = %s, normalized = %s, value = 0x%016" PRIxPTR "",
-          CID(context), index, GLenumToString(GLenumGroup::VertexAttribPointerType, type),
-          GLbooleanToString(normalized), (uintptr_t)value);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateVertexAttribP1uiv(context, index, type, normalized, value));
-        if (isCallValid)
-        {
-            context->vertexAttribP1uiv(index, type, normalized, value);
-        }
-        ANGLE_CAPTURE(VertexAttribP1uiv, isCallValid, context, index, type, normalized, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribP2ui, "glVertexAttribP2ui",
-          "context = %d, index = %u, type = %s, normalized = %s, value = %u", CID(context), index,
-          GLenumToString(GLenumGroup::VertexAttribPointerType, type), GLbooleanToString(normalized),
-          value);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateVertexAttribP2ui(context, index, type, normalized, value));
-        if (isCallValid)
-        {
-            context->vertexAttribP2ui(index, type, normalized, value);
-        }
-        ANGLE_CAPTURE(VertexAttribP2ui, isCallValid, context, index, type, normalized, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribP2uiv(GLuint index,
-                                   GLenum type,
-                                   GLboolean normalized,
-                                   const GLuint *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribP2uiv, "glVertexAttribP2uiv",
-          "context = %d, index = %u, type = %s, normalized = %s, value = 0x%016" PRIxPTR "",
-          CID(context), index, GLenumToString(GLenumGroup::VertexAttribPointerType, type),
-          GLbooleanToString(normalized), (uintptr_t)value);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateVertexAttribP2uiv(context, index, type, normalized, value));
-        if (isCallValid)
-        {
-            context->vertexAttribP2uiv(index, type, normalized, value);
-        }
-        ANGLE_CAPTURE(VertexAttribP2uiv, isCallValid, context, index, type, normalized, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribP3ui, "glVertexAttribP3ui",
-          "context = %d, index = %u, type = %s, normalized = %s, value = %u", CID(context), index,
-          GLenumToString(GLenumGroup::VertexAttribPointerType, type), GLbooleanToString(normalized),
-          value);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateVertexAttribP3ui(context, index, type, normalized, value));
-        if (isCallValid)
-        {
-            context->vertexAttribP3ui(index, type, normalized, value);
-        }
-        ANGLE_CAPTURE(VertexAttribP3ui, isCallValid, context, index, type, normalized, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribP3uiv(GLuint index,
-                                   GLenum type,
-                                   GLboolean normalized,
-                                   const GLuint *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribP3uiv, "glVertexAttribP3uiv",
-          "context = %d, index = %u, type = %s, normalized = %s, value = 0x%016" PRIxPTR "",
-          CID(context), index, GLenumToString(GLenumGroup::VertexAttribPointerType, type),
-          GLbooleanToString(normalized), (uintptr_t)value);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateVertexAttribP3uiv(context, index, type, normalized, value));
-        if (isCallValid)
-        {
-            context->vertexAttribP3uiv(index, type, normalized, value);
-        }
-        ANGLE_CAPTURE(VertexAttribP3uiv, isCallValid, context, index, type, normalized, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribP4ui, "glVertexAttribP4ui",
-          "context = %d, index = %u, type = %s, normalized = %s, value = %u", CID(context), index,
-          GLenumToString(GLenumGroup::VertexAttribPointerType, type), GLbooleanToString(normalized),
-          value);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateVertexAttribP4ui(context, index, type, normalized, value));
-        if (isCallValid)
-        {
-            context->vertexAttribP4ui(index, type, normalized, value);
-        }
-        ANGLE_CAPTURE(VertexAttribP4ui, isCallValid, context, index, type, normalized, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribP4uiv(GLuint index,
-                                   GLenum type,
-                                   GLboolean normalized,
-                                   const GLuint *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribP4uiv, "glVertexAttribP4uiv",
-          "context = %d, index = %u, type = %s, normalized = %s, value = 0x%016" PRIxPTR "",
-          CID(context), index, GLenumToString(GLenumGroup::VertexAttribPointerType, type),
-          GLbooleanToString(normalized), (uintptr_t)value);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateVertexAttribP4uiv(context, index, type, normalized, value));
-        if (isCallValid)
-        {
-            context->vertexAttribP4uiv(index, type, normalized, value);
-        }
-        ANGLE_CAPTURE(VertexAttribP4uiv, isCallValid, context, index, type, normalized, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexP2ui(GLenum type, GLuint value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexP2ui, "glVertexP2ui",
-          "context = %d, type = %s, value = %u", CID(context),
-          GLenumToString(GLenumGroup::VertexPointerType, type), value);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateVertexP2ui(context, type, value));
-        if (isCallValid)
-        {
-            context->vertexP2ui(type, value);
-        }
-        ANGLE_CAPTURE(VertexP2ui, isCallValid, context, type, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexP2uiv(GLenum type, const GLuint *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexP2uiv, "glVertexP2uiv",
-          "context = %d, type = %s, value = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::VertexPointerType, type), (uintptr_t)value);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateVertexP2uiv(context, type, value));
-        if (isCallValid)
-        {
-            context->vertexP2uiv(type, value);
-        }
-        ANGLE_CAPTURE(VertexP2uiv, isCallValid, context, type, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexP3ui(GLenum type, GLuint value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexP3ui, "glVertexP3ui",
-          "context = %d, type = %s, value = %u", CID(context),
-          GLenumToString(GLenumGroup::VertexPointerType, type), value);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateVertexP3ui(context, type, value));
-        if (isCallValid)
-        {
-            context->vertexP3ui(type, value);
-        }
-        ANGLE_CAPTURE(VertexP3ui, isCallValid, context, type, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexP3uiv(GLenum type, const GLuint *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexP3uiv, "glVertexP3uiv",
-          "context = %d, type = %s, value = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::VertexPointerType, type), (uintptr_t)value);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateVertexP3uiv(context, type, value));
-        if (isCallValid)
-        {
-            context->vertexP3uiv(type, value);
-        }
-        ANGLE_CAPTURE(VertexP3uiv, isCallValid, context, type, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexP4ui(GLenum type, GLuint value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexP4ui, "glVertexP4ui",
-          "context = %d, type = %s, value = %u", CID(context),
-          GLenumToString(GLenumGroup::VertexPointerType, type), value);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateVertexP4ui(context, type, value));
-        if (isCallValid)
-        {
-            context->vertexP4ui(type, value);
-        }
-        ANGLE_CAPTURE(VertexP4ui, isCallValid, context, type, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexP4uiv(GLenum type, const GLuint *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexP4uiv, "glVertexP4uiv",
-          "context = %d, type = %s, value = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::VertexPointerType, type), (uintptr_t)value);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateVertexP4uiv(context, type, value));
-        if (isCallValid)
-        {
-            context->vertexP4uiv(type, value);
-        }
-        ANGLE_CAPTURE(VertexP4uiv, isCallValid, context, type, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-}  // namespace gl
diff --git a/src/libGL/entry_points_gl_3_3_autogen.h b/src/libGL/entry_points_gl_3_3_autogen.h
deleted file mode 100644
index 4e44566..0000000
--- a/src/libGL/entry_points_gl_3_3_autogen.h
+++ /dev/null
@@ -1,110 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// entry_points_gl_3_3_autogen.h:
-//   Defines the GL 3.3 entry points.
-
-#ifndef LIBGL_ENTRY_POINTS_GL_3_3_AUTOGEN_H_
-#define LIBGL_ENTRY_POINTS_GL_3_3_AUTOGEN_H_
-
-#include <export.h>
-#include "angle_gl.h"
-
-namespace gl
-{
-ANGLE_EXPORT void GL_APIENTRY BindFragDataLocationIndexed(GLuint program,
-                                                          GLuint colorNumber,
-                                                          GLuint index,
-                                                          const GLchar *name);
-ANGLE_EXPORT void GL_APIENTRY BindSampler(GLuint unit, GLuint sampler);
-ANGLE_EXPORT void GL_APIENTRY ColorP3ui(GLenum type, GLuint color);
-ANGLE_EXPORT void GL_APIENTRY ColorP3uiv(GLenum type, const GLuint *color);
-ANGLE_EXPORT void GL_APIENTRY ColorP4ui(GLenum type, GLuint color);
-ANGLE_EXPORT void GL_APIENTRY ColorP4uiv(GLenum type, const GLuint *color);
-ANGLE_EXPORT void GL_APIENTRY DeleteSamplers(GLsizei count, const GLuint *samplers);
-ANGLE_EXPORT void GL_APIENTRY GenSamplers(GLsizei count, GLuint *samplers);
-ANGLE_EXPORT GLint GL_APIENTRY GetFragDataIndex(GLuint program, const GLchar *name);
-ANGLE_EXPORT void GL_APIENTRY GetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params);
-ANGLE_EXPORT void GL_APIENTRY GetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params);
-ANGLE_EXPORT void GL_APIENTRY GetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params);
-ANGLE_EXPORT void GL_APIENTRY GetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params);
-ANGLE_EXPORT void GL_APIENTRY GetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params);
-ANGLE_EXPORT void GL_APIENTRY GetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params);
-ANGLE_EXPORT GLboolean GL_APIENTRY IsSampler(GLuint sampler);
-ANGLE_EXPORT void GL_APIENTRY MultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords);
-ANGLE_EXPORT void GL_APIENTRY MultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords);
-ANGLE_EXPORT void GL_APIENTRY MultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords);
-ANGLE_EXPORT void GL_APIENTRY MultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords);
-ANGLE_EXPORT void GL_APIENTRY MultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords);
-ANGLE_EXPORT void GL_APIENTRY MultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords);
-ANGLE_EXPORT void GL_APIENTRY MultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords);
-ANGLE_EXPORT void GL_APIENTRY MultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords);
-ANGLE_EXPORT void GL_APIENTRY NormalP3ui(GLenum type, GLuint coords);
-ANGLE_EXPORT void GL_APIENTRY NormalP3uiv(GLenum type, const GLuint *coords);
-ANGLE_EXPORT void GL_APIENTRY QueryCounter(GLuint id, GLenum target);
-ANGLE_EXPORT void GL_APIENTRY SamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param);
-ANGLE_EXPORT void GL_APIENTRY SamplerParameterIuiv(GLuint sampler,
-                                                   GLenum pname,
-                                                   const GLuint *param);
-ANGLE_EXPORT void GL_APIENTRY SamplerParameterf(GLuint sampler, GLenum pname, GLfloat param);
-ANGLE_EXPORT void GL_APIENTRY SamplerParameterfv(GLuint sampler,
-                                                 GLenum pname,
-                                                 const GLfloat *param);
-ANGLE_EXPORT void GL_APIENTRY SamplerParameteri(GLuint sampler, GLenum pname, GLint param);
-ANGLE_EXPORT void GL_APIENTRY SamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param);
-ANGLE_EXPORT void GL_APIENTRY SecondaryColorP3ui(GLenum type, GLuint color);
-ANGLE_EXPORT void GL_APIENTRY SecondaryColorP3uiv(GLenum type, const GLuint *color);
-ANGLE_EXPORT void GL_APIENTRY TexCoordP1ui(GLenum type, GLuint coords);
-ANGLE_EXPORT void GL_APIENTRY TexCoordP1uiv(GLenum type, const GLuint *coords);
-ANGLE_EXPORT void GL_APIENTRY TexCoordP2ui(GLenum type, GLuint coords);
-ANGLE_EXPORT void GL_APIENTRY TexCoordP2uiv(GLenum type, const GLuint *coords);
-ANGLE_EXPORT void GL_APIENTRY TexCoordP3ui(GLenum type, GLuint coords);
-ANGLE_EXPORT void GL_APIENTRY TexCoordP3uiv(GLenum type, const GLuint *coords);
-ANGLE_EXPORT void GL_APIENTRY TexCoordP4ui(GLenum type, GLuint coords);
-ANGLE_EXPORT void GL_APIENTRY TexCoordP4uiv(GLenum type, const GLuint *coords);
-ANGLE_EXPORT void GL_APIENTRY VertexAttribDivisor(GLuint index, GLuint divisor);
-ANGLE_EXPORT void GL_APIENTRY VertexAttribP1ui(GLuint index,
-                                               GLenum type,
-                                               GLboolean normalized,
-                                               GLuint value);
-ANGLE_EXPORT void GL_APIENTRY VertexAttribP1uiv(GLuint index,
-                                                GLenum type,
-                                                GLboolean normalized,
-                                                const GLuint *value);
-ANGLE_EXPORT void GL_APIENTRY VertexAttribP2ui(GLuint index,
-                                               GLenum type,
-                                               GLboolean normalized,
-                                               GLuint value);
-ANGLE_EXPORT void GL_APIENTRY VertexAttribP2uiv(GLuint index,
-                                                GLenum type,
-                                                GLboolean normalized,
-                                                const GLuint *value);
-ANGLE_EXPORT void GL_APIENTRY VertexAttribP3ui(GLuint index,
-                                               GLenum type,
-                                               GLboolean normalized,
-                                               GLuint value);
-ANGLE_EXPORT void GL_APIENTRY VertexAttribP3uiv(GLuint index,
-                                                GLenum type,
-                                                GLboolean normalized,
-                                                const GLuint *value);
-ANGLE_EXPORT void GL_APIENTRY VertexAttribP4ui(GLuint index,
-                                               GLenum type,
-                                               GLboolean normalized,
-                                               GLuint value);
-ANGLE_EXPORT void GL_APIENTRY VertexAttribP4uiv(GLuint index,
-                                                GLenum type,
-                                                GLboolean normalized,
-                                                const GLuint *value);
-ANGLE_EXPORT void GL_APIENTRY VertexP2ui(GLenum type, GLuint value);
-ANGLE_EXPORT void GL_APIENTRY VertexP2uiv(GLenum type, const GLuint *value);
-ANGLE_EXPORT void GL_APIENTRY VertexP3ui(GLenum type, GLuint value);
-ANGLE_EXPORT void GL_APIENTRY VertexP3uiv(GLenum type, const GLuint *value);
-ANGLE_EXPORT void GL_APIENTRY VertexP4ui(GLenum type, GLuint value);
-ANGLE_EXPORT void GL_APIENTRY VertexP4uiv(GLenum type, const GLuint *value);
-}  // namespace gl
-
-#endif  // LIBGL_ENTRY_POINTS_GL_3_3_AUTOGEN_H_
diff --git a/src/libGL/entry_points_gl_3_autogen.cpp b/src/libGL/entry_points_gl_3_autogen.cpp
new file mode 100644
index 0000000..2773afa
--- /dev/null
+++ b/src/libGL/entry_points_gl_3_autogen.cpp
@@ -0,0 +1,4548 @@
+// GENERATED FILE - DO NOT EDIT.
+// Generated by generate_entry_points.py using data from gl.xml.
+//
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// entry_points_gl_3_autogen.cpp:
+//   Defines the Desktop GL 3.x entry points.
+
+#include "libGL/entry_points_gl_3_autogen.h"
+
+#include "libANGLE/Context.h"
+#include "libANGLE/Context.inl.h"
+#include "libANGLE/entry_points_utils.h"
+#include "libANGLE/gl_enum_utils.h"
+#include "libANGLE/validationEGL.h"
+#include "libANGLE/validationES.h"
+#include "libANGLE/validationES1.h"
+#include "libANGLE/validationES2.h"
+#include "libANGLE/validationES3.h"
+#include "libANGLE/validationES31.h"
+#include "libANGLE/validationES32.h"
+#include "libANGLE/validationESEXT.h"
+#include "libANGLE/validationGL3_autogen.h"
+#include "libGLESv2/global_state.h"
+
+namespace gl
+{
+
+// GL 3.0
+void GL_APIENTRY BeginConditionalRender(GLuint id, GLenum mode)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLBeginConditionalRender, "context = %d, id = %u, mode = %s", CID(context), id,
+          GLenumToString(GLenumGroup::TypeEnum, mode));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateBeginConditionalRender(context, id, mode));
+        if (isCallValid)
+        {
+            context->beginConditionalRender(id, mode);
+        }
+        ANGLE_CAPTURE(BeginConditionalRender, isCallValid, context, id, mode);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY BeginTransformFeedback(GLenum primitiveMode)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLBeginTransformFeedback, "context = %d, primitiveMode = %s", CID(context),
+          GLenumToString(GLenumGroup::PrimitiveType, primitiveMode));
+
+    if (context)
+    {
+        PrimitiveMode primitiveModePacked = PackParam<PrimitiveMode>(primitiveMode);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateBeginTransformFeedback(context, primitiveModePacked));
+        if (isCallValid)
+        {
+            context->beginTransformFeedback(primitiveModePacked);
+        }
+        ANGLE_CAPTURE(BeginTransformFeedback, isCallValid, context, primitiveModePacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY BindBufferBase(GLenum target, GLuint index, GLuint buffer)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLBindBufferBase, "context = %d, target = %s, index = %u, buffer = %u",
+          CID(context), GLenumToString(GLenumGroup::BufferTargetARB, target), index, buffer);
+
+    if (context)
+    {
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateBindBufferBase(context, targetPacked, index, bufferPacked));
+        if (isCallValid)
+        {
+            context->bindBufferBase(targetPacked, index, bufferPacked);
+        }
+        ANGLE_CAPTURE(BindBufferBase, isCallValid, context, targetPacked, index, bufferPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY
+BindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLBindBufferRange,
+          "context = %d, target = %s, index = %u, buffer = %u, offset = %llu, size = %llu",
+          CID(context), GLenumToString(GLenumGroup::BufferTargetARB, target), index, buffer,
+          static_cast<unsigned long long>(offset), static_cast<unsigned long long>(size));
+
+    if (context)
+    {
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateBindBufferRange(context, targetPacked, index, bufferPacked, offset, size));
+        if (isCallValid)
+        {
+            context->bindBufferRange(targetPacked, index, bufferPacked, offset, size);
+        }
+        ANGLE_CAPTURE(BindBufferRange, isCallValid, context, targetPacked, index, bufferPacked,
+                      offset, size);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY BindFragDataLocation(GLuint program, GLuint color, const GLchar *name)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLBindFragDataLocation,
+          "context = %d, program = %u, color = %u, name = 0x%016" PRIxPTR "", CID(context), program,
+          color, (uintptr_t)name);
+
+    if (context)
+    {
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateBindFragDataLocation(context, programPacked, color, name));
+        if (isCallValid)
+        {
+            context->bindFragDataLocation(programPacked, color, name);
+        }
+        ANGLE_CAPTURE(BindFragDataLocation, isCallValid, context, programPacked, color, name);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY BindFramebuffer(GLenum target, GLuint framebuffer)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLBindFramebuffer, "context = %d, target = %s, framebuffer = %u", CID(context),
+          GLenumToString(GLenumGroup::FramebufferTarget, target), framebuffer);
+
+    if (context)
+    {
+        FramebufferID framebufferPacked = PackParam<FramebufferID>(framebuffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateBindFramebuffer(context, target, framebufferPacked));
+        if (isCallValid)
+        {
+            context->bindFramebuffer(target, framebufferPacked);
+        }
+        ANGLE_CAPTURE(BindFramebuffer, isCallValid, context, target, framebufferPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY BindRenderbuffer(GLenum target, GLuint renderbuffer)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLBindRenderbuffer, "context = %d, target = %s, renderbuffer = %u", CID(context),
+          GLenumToString(GLenumGroup::RenderbufferTarget, target), renderbuffer);
+
+    if (context)
+    {
+        RenderbufferID renderbufferPacked = PackParam<RenderbufferID>(renderbuffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateBindRenderbuffer(context, target, renderbufferPacked));
+        if (isCallValid)
+        {
+            context->bindRenderbuffer(target, renderbufferPacked);
+        }
+        ANGLE_CAPTURE(BindRenderbuffer, isCallValid, context, target, renderbufferPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY BindVertexArray(GLuint array)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLBindVertexArray, "context = %d, array = %u", CID(context), array);
+
+    if (context)
+    {
+        VertexArrayID arrayPacked                             = PackParam<VertexArrayID>(array);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateBindVertexArray(context, arrayPacked));
+        if (isCallValid)
+        {
+            context->bindVertexArray(arrayPacked);
+        }
+        ANGLE_CAPTURE(BindVertexArray, isCallValid, context, arrayPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY BlitFramebuffer(GLint srcX0,
+                                 GLint srcY0,
+                                 GLint srcX1,
+                                 GLint srcY1,
+                                 GLint dstX0,
+                                 GLint dstY0,
+                                 GLint dstX1,
+                                 GLint dstY1,
+                                 GLbitfield mask,
+                                 GLenum filter)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLBlitFramebuffer,
+          "context = %d, srcX0 = %d, srcY0 = %d, srcX1 = %d, srcY1 = %d, dstX0 = %d, dstY0 = %d, "
+          "dstX1 = %d, dstY1 = %d, mask = %s, filter = %s",
+          CID(context), srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
+          GLbitfieldToString(GLenumGroup::ClearBufferMask, mask).c_str(),
+          GLenumToString(GLenumGroup::BlitFramebufferFilter, filter));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateBlitFramebuffer(context, srcX0, srcY0, srcX1, srcY1, dstX0,
+                                                    dstY0, dstX1, dstY1, mask, filter));
+        if (isCallValid)
+        {
+            context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask,
+                                     filter);
+        }
+        ANGLE_CAPTURE(BlitFramebuffer, isCallValid, context, srcX0, srcY0, srcX1, srcY1, dstX0,
+                      dstY0, dstX1, dstY1, mask, filter);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+GLenum GL_APIENTRY CheckFramebufferStatus(GLenum target)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLCheckFramebufferStatus, "context = %d, target = %s", CID(context),
+          GLenumToString(GLenumGroup::FramebufferTarget, target));
+
+    GLenum returnValue;
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateCheckFramebufferStatus(context, target));
+        if (isCallValid)
+        {
+            returnValue = context->checkFramebufferStatus(target);
+        }
+        else
+        {
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLCheckFramebufferStatus, GLenum>();
+        }
+        ANGLE_CAPTURE(CheckFramebufferStatus, isCallValid, context, target, returnValue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLCheckFramebufferStatus, GLenum>();
+    }
+    return returnValue;
+}
+
+void GL_APIENTRY ClampColor(GLenum target, GLenum clamp)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLClampColor, "context = %d, target = %s, clamp = %s", CID(context),
+          GLenumToString(GLenumGroup::DefaultGroup, target),
+          GLenumToString(GLenumGroup::DefaultGroup, clamp));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateClampColor(context, target, clamp));
+        if (isCallValid)
+        {
+            context->clampColor(target, clamp);
+        }
+        ANGLE_CAPTURE(ClampColor, isCallValid, context, target, clamp);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLClearBufferfi,
+          "context = %d, buffer = %s, drawbuffer = %d, depth = %f, stencil = %d", CID(context),
+          GLenumToString(GLenumGroup::Buffer, buffer), drawbuffer, depth, stencil);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateClearBufferfi(context, buffer, drawbuffer, depth, stencil));
+        if (isCallValid)
+        {
+            context->clearBufferfi(buffer, drawbuffer, depth, stencil);
+        }
+        ANGLE_CAPTURE(ClearBufferfi, isCallValid, context, buffer, drawbuffer, depth, stencil);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLClearBufferfv,
+          "context = %d, buffer = %s, drawbuffer = %d, value = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::Buffer, buffer), drawbuffer, (uintptr_t)value);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateClearBufferfv(context, buffer, drawbuffer, value));
+        if (isCallValid)
+        {
+            context->clearBufferfv(buffer, drawbuffer, value);
+        }
+        ANGLE_CAPTURE(ClearBufferfv, isCallValid, context, buffer, drawbuffer, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLClearBufferiv,
+          "context = %d, buffer = %s, drawbuffer = %d, value = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::Buffer, buffer), drawbuffer, (uintptr_t)value);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateClearBufferiv(context, buffer, drawbuffer, value));
+        if (isCallValid)
+        {
+            context->clearBufferiv(buffer, drawbuffer, value);
+        }
+        ANGLE_CAPTURE(ClearBufferiv, isCallValid, context, buffer, drawbuffer, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLClearBufferuiv,
+          "context = %d, buffer = %s, drawbuffer = %d, value = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::Buffer, buffer), drawbuffer, (uintptr_t)value);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateClearBufferuiv(context, buffer, drawbuffer, value));
+        if (isCallValid)
+        {
+            context->clearBufferuiv(buffer, drawbuffer, value);
+        }
+        ANGLE_CAPTURE(ClearBufferuiv, isCallValid, context, buffer, drawbuffer, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColorMaski, "context = %d, index = %u, r = %s, g = %s, b = %s, a = %s",
+          CID(context), index, GLbooleanToString(r), GLbooleanToString(g), GLbooleanToString(b),
+          GLbooleanToString(a));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateColorMaski(context, index, r, g, b, a));
+        if (isCallValid)
+        {
+            context->colorMaski(index, r, g, b, a);
+        }
+        ANGLE_CAPTURE(ColorMaski, isCallValid, context, index, r, g, b, a);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDeleteFramebuffers, "context = %d, n = %d, framebuffers = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)framebuffers);
+
+    if (context)
+    {
+        const FramebufferID *framebuffersPacked = PackParam<const FramebufferID *>(framebuffers);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateDeleteFramebuffers(context, n, framebuffersPacked));
+        if (isCallValid)
+        {
+            context->deleteFramebuffers(n, framebuffersPacked);
+        }
+        ANGLE_CAPTURE(DeleteFramebuffers, isCallValid, context, n, framebuffersPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDeleteRenderbuffers, "context = %d, n = %d, renderbuffers = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)renderbuffers);
+
+    if (context)
+    {
+        const RenderbufferID *renderbuffersPacked =
+            PackParam<const RenderbufferID *>(renderbuffers);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateDeleteRenderbuffers(context, n, renderbuffersPacked));
+        if (isCallValid)
+        {
+            context->deleteRenderbuffers(n, renderbuffersPacked);
+        }
+        ANGLE_CAPTURE(DeleteRenderbuffers, isCallValid, context, n, renderbuffersPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DeleteVertexArrays(GLsizei n, const GLuint *arrays)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDeleteVertexArrays, "context = %d, n = %d, arrays = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)arrays);
+
+    if (context)
+    {
+        const VertexArrayID *arraysPacked = PackParam<const VertexArrayID *>(arrays);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateDeleteVertexArrays(context, n, arraysPacked));
+        if (isCallValid)
+        {
+            context->deleteVertexArrays(n, arraysPacked);
+        }
+        ANGLE_CAPTURE(DeleteVertexArrays, isCallValid, context, n, arraysPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Disablei(GLenum target, GLuint index)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDisablei, "context = %d, target = %s, index = %u", CID(context),
+          GLenumToString(GLenumGroup::EnableCap, target), index);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateDisablei(context, target, index));
+        if (isCallValid)
+        {
+            context->disablei(target, index);
+        }
+        ANGLE_CAPTURE(Disablei, isCallValid, context, target, index);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Enablei(GLenum target, GLuint index)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLEnablei, "context = %d, target = %s, index = %u", CID(context),
+          GLenumToString(GLenumGroup::EnableCap, target), index);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateEnablei(context, target, index));
+        if (isCallValid)
+        {
+            context->enablei(target, index);
+        }
+        ANGLE_CAPTURE(Enablei, isCallValid, context, target, index);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY EndConditionalRender()
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLEndConditionalRender, "context = %d", CID(context));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateEndConditionalRender(context));
+        if (isCallValid)
+        {
+            context->endConditionalRender();
+        }
+        ANGLE_CAPTURE(EndConditionalRender, isCallValid, context);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY EndTransformFeedback()
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLEndTransformFeedback, "context = %d", CID(context));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateEndTransformFeedback(context));
+        if (isCallValid)
+        {
+            context->endTransformFeedback();
+        }
+        ANGLE_CAPTURE(EndTransformFeedback, isCallValid, context);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY FlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLFlushMappedBufferRange,
+          "context = %d, target = %s, offset = %llu, length = %llu", CID(context),
+          GLenumToString(GLenumGroup::BufferTargetARB, target),
+          static_cast<unsigned long long>(offset), static_cast<unsigned long long>(length));
+
+    if (context)
+    {
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateFlushMappedBufferRange(context, targetPacked, offset, length));
+        if (isCallValid)
+        {
+            context->flushMappedBufferRange(targetPacked, offset, length);
+        }
+        ANGLE_CAPTURE(FlushMappedBufferRange, isCallValid, context, targetPacked, offset, length);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY FramebufferRenderbuffer(GLenum target,
+                                         GLenum attachment,
+                                         GLenum renderbuffertarget,
+                                         GLuint renderbuffer)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLFramebufferRenderbuffer,
+          "context = %d, target = %s, attachment = %s, renderbuffertarget = %s, renderbuffer = %u",
+          CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target),
+          GLenumToString(GLenumGroup::FramebufferAttachment, attachment),
+          GLenumToString(GLenumGroup::RenderbufferTarget, renderbuffertarget), renderbuffer);
+
+    if (context)
+    {
+        RenderbufferID renderbufferPacked = PackParam<RenderbufferID>(renderbuffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateFramebufferRenderbuffer(context, target, attachment, renderbuffertarget,
+                                             renderbufferPacked));
+        if (isCallValid)
+        {
+            context->framebufferRenderbuffer(target, attachment, renderbuffertarget,
+                                             renderbufferPacked);
+        }
+        ANGLE_CAPTURE(FramebufferRenderbuffer, isCallValid, context, target, attachment,
+                      renderbuffertarget, renderbufferPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY FramebufferTexture1D(GLenum target,
+                                      GLenum attachment,
+                                      GLenum textarget,
+                                      GLuint texture,
+                                      GLint level)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLFramebufferTexture1D,
+          "context = %d, target = %s, attachment = %s, textarget = %s, texture = %u, level = %d",
+          CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target),
+          GLenumToString(GLenumGroup::FramebufferAttachment, attachment),
+          GLenumToString(GLenumGroup::TextureTarget, textarget), texture, level);
+
+    if (context)
+    {
+        TextureTarget textargetPacked                         = PackParam<TextureTarget>(textarget);
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateFramebufferTexture1D(context, target, attachment,
+                                                         textargetPacked, texturePacked, level));
+        if (isCallValid)
+        {
+            context->framebufferTexture1D(target, attachment, textargetPacked, texturePacked,
+                                          level);
+        }
+        ANGLE_CAPTURE(FramebufferTexture1D, isCallValid, context, target, attachment,
+                      textargetPacked, texturePacked, level);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY FramebufferTexture2D(GLenum target,
+                                      GLenum attachment,
+                                      GLenum textarget,
+                                      GLuint texture,
+                                      GLint level)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLFramebufferTexture2D,
+          "context = %d, target = %s, attachment = %s, textarget = %s, texture = %u, level = %d",
+          CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target),
+          GLenumToString(GLenumGroup::FramebufferAttachment, attachment),
+          GLenumToString(GLenumGroup::TextureTarget, textarget), texture, level);
+
+    if (context)
+    {
+        TextureTarget textargetPacked                         = PackParam<TextureTarget>(textarget);
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateFramebufferTexture2D(context, target, attachment,
+                                                         textargetPacked, texturePacked, level));
+        if (isCallValid)
+        {
+            context->framebufferTexture2D(target, attachment, textargetPacked, texturePacked,
+                                          level);
+        }
+        ANGLE_CAPTURE(FramebufferTexture2D, isCallValid, context, target, attachment,
+                      textargetPacked, texturePacked, level);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY FramebufferTexture3D(GLenum target,
+                                      GLenum attachment,
+                                      GLenum textarget,
+                                      GLuint texture,
+                                      GLint level,
+                                      GLint zoffset)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLFramebufferTexture3D,
+          "context = %d, target = %s, attachment = %s, textarget = %s, texture = %u, level = %d, "
+          "zoffset = %d",
+          CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target),
+          GLenumToString(GLenumGroup::FramebufferAttachment, attachment),
+          GLenumToString(GLenumGroup::TextureTarget, textarget), texture, level, zoffset);
+
+    if (context)
+    {
+        TextureTarget textargetPacked                         = PackParam<TextureTarget>(textarget);
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateFramebufferTexture3D(context, target, attachment, textargetPacked,
+                                          texturePacked, level, zoffset));
+        if (isCallValid)
+        {
+            context->framebufferTexture3D(target, attachment, textargetPacked, texturePacked, level,
+                                          zoffset);
+        }
+        ANGLE_CAPTURE(FramebufferTexture3D, isCallValid, context, target, attachment,
+                      textargetPacked, texturePacked, level, zoffset);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY
+FramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLFramebufferTextureLayer,
+          "context = %d, target = %s, attachment = %s, texture = %u, level = %d, layer = %d",
+          CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target),
+          GLenumToString(GLenumGroup::FramebufferAttachment, attachment), texture, level, layer);
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateFramebufferTextureLayer(context, target, attachment,
+                                                            texturePacked, level, layer));
+        if (isCallValid)
+        {
+            context->framebufferTextureLayer(target, attachment, texturePacked, level, layer);
+        }
+        ANGLE_CAPTURE(FramebufferTextureLayer, isCallValid, context, target, attachment,
+                      texturePacked, level, layer);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GenFramebuffers(GLsizei n, GLuint *framebuffers)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGenFramebuffers, "context = %d, n = %d, framebuffers = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)framebuffers);
+
+    if (context)
+    {
+        FramebufferID *framebuffersPacked = PackParam<FramebufferID *>(framebuffers);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGenFramebuffers(context, n, framebuffersPacked));
+        if (isCallValid)
+        {
+            context->genFramebuffers(n, framebuffersPacked);
+        }
+        ANGLE_CAPTURE(GenFramebuffers, isCallValid, context, n, framebuffersPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GenRenderbuffers(GLsizei n, GLuint *renderbuffers)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGenRenderbuffers, "context = %d, n = %d, renderbuffers = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)renderbuffers);
+
+    if (context)
+    {
+        RenderbufferID *renderbuffersPacked = PackParam<RenderbufferID *>(renderbuffers);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGenRenderbuffers(context, n, renderbuffersPacked));
+        if (isCallValid)
+        {
+            context->genRenderbuffers(n, renderbuffersPacked);
+        }
+        ANGLE_CAPTURE(GenRenderbuffers, isCallValid, context, n, renderbuffersPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GenVertexArrays(GLsizei n, GLuint *arrays)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGenVertexArrays, "context = %d, n = %d, arrays = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)arrays);
+
+    if (context)
+    {
+        VertexArrayID *arraysPacked                           = PackParam<VertexArrayID *>(arrays);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGenVertexArrays(context, n, arraysPacked));
+        if (isCallValid)
+        {
+            context->genVertexArrays(n, arraysPacked);
+        }
+        ANGLE_CAPTURE(GenVertexArrays, isCallValid, context, n, arraysPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GenerateMipmap(GLenum target)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGenerateMipmap, "context = %d, target = %s", CID(context),
+          GLenumToString(GLenumGroup::TextureTarget, target));
+
+    if (context)
+    {
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGenerateMipmap(context, targetPacked));
+        if (isCallValid)
+        {
+            context->generateMipmap(targetPacked);
+        }
+        ANGLE_CAPTURE(GenerateMipmap, isCallValid, context, targetPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetBooleani_v(GLenum target, GLuint index, GLboolean *data)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetBooleani_v,
+          "context = %d, target = %s, index = %u, data = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::BufferTargetARB, target), index, (uintptr_t)data);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGetBooleani_v(context, target, index, data));
+        if (isCallValid)
+        {
+            context->getBooleani_v(target, index, data);
+        }
+        ANGLE_CAPTURE(GetBooleani_v, isCallValid, context, target, index, data);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+GLint GL_APIENTRY GetFragDataLocation(GLuint program, const GLchar *name)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetFragDataLocation, "context = %d, program = %u, name = 0x%016" PRIxPTR "",
+          CID(context), program, (uintptr_t)name);
+
+    GLint returnValue;
+    if (context)
+    {
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetFragDataLocation(context, programPacked, name));
+        if (isCallValid)
+        {
+            returnValue = context->getFragDataLocation(programPacked, name);
+        }
+        else
+        {
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetFragDataLocation, GLint>();
+        }
+        ANGLE_CAPTURE(GetFragDataLocation, isCallValid, context, programPacked, name, returnValue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetFragDataLocation, GLint>();
+    }
+    return returnValue;
+}
+
+void GL_APIENTRY GetFramebufferAttachmentParameteriv(GLenum target,
+                                                     GLenum attachment,
+                                                     GLenum pname,
+                                                     GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetFramebufferAttachmentParameteriv,
+          "context = %d, target = %s, attachment = %s, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target),
+          GLenumToString(GLenumGroup::FramebufferAttachment, attachment),
+          GLenumToString(GLenumGroup::FramebufferAttachmentParameterName, pname),
+          (uintptr_t)params);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGetFramebufferAttachmentParameteriv(
+                                              context, target, attachment, pname, params));
+        if (isCallValid)
+        {
+            context->getFramebufferAttachmentParameteriv(target, attachment, pname, params);
+        }
+        ANGLE_CAPTURE(GetFramebufferAttachmentParameteriv, isCallValid, context, target, attachment,
+                      pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetIntegeri_v(GLenum target, GLuint index, GLint *data)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetIntegeri_v,
+          "context = %d, target = %s, index = %u, data = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::TypeEnum, target), index, (uintptr_t)data);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGetIntegeri_v(context, target, index, data));
+        if (isCallValid)
+        {
+            context->getIntegeri_v(target, index, data);
+        }
+        ANGLE_CAPTURE(GetIntegeri_v, isCallValid, context, target, index, data);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetRenderbufferParameteriv,
+          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::RenderbufferTarget, target),
+          GLenumToString(GLenumGroup::RenderbufferParameterName, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetRenderbufferParameteriv(context, target, pname, params));
+        if (isCallValid)
+        {
+            context->getRenderbufferParameteriv(target, pname, params);
+        }
+        ANGLE_CAPTURE(GetRenderbufferParameteriv, isCallValid, context, target, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+const GLubyte *GL_APIENTRY GetStringi(GLenum name, GLuint index)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetStringi, "context = %d, name = %s, index = %u", CID(context),
+          GLenumToString(GLenumGroup::StringName, name), index);
+
+    const GLubyte *returnValue;
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateGetStringi(context, name, index));
+        if (isCallValid)
+        {
+            returnValue = context->getStringi(name, index);
+        }
+        else
+        {
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetStringi, const GLubyte *>();
+        }
+        ANGLE_CAPTURE(GetStringi, isCallValid, context, name, index, returnValue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetStringi, const GLubyte *>();
+    }
+    return returnValue;
+}
+
+void GL_APIENTRY GetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetTexParameterIiv,
+          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::TextureTarget, target),
+          GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetTexParameterIiv(context, targetPacked, pname, params));
+        if (isCallValid)
+        {
+            context->getTexParameterIiv(targetPacked, pname, params);
+        }
+        ANGLE_CAPTURE(GetTexParameterIiv, isCallValid, context, targetPacked, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetTexParameterIuiv,
+          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::TextureTarget, target),
+          GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetTexParameterIuiv(context, targetPacked, pname, params));
+        if (isCallValid)
+        {
+            context->getTexParameterIuiv(targetPacked, pname, params);
+        }
+        ANGLE_CAPTURE(GetTexParameterIuiv, isCallValid, context, targetPacked, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetTransformFeedbackVarying(GLuint program,
+                                             GLuint index,
+                                             GLsizei bufSize,
+                                             GLsizei *length,
+                                             GLsizei *size,
+                                             GLenum *type,
+                                             GLchar *name)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetTransformFeedbackVarying,
+          "context = %d, program = %u, index = %u, bufSize = %d, length = 0x%016" PRIxPTR
+          ", size = 0x%016" PRIxPTR ", type = 0x%016" PRIxPTR ", name = 0x%016" PRIxPTR "",
+          CID(context), program, index, bufSize, (uintptr_t)length, (uintptr_t)size,
+          (uintptr_t)type, (uintptr_t)name);
+
+    if (context)
+    {
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetTransformFeedbackVarying(context, programPacked, index,
+                                                                bufSize, length, size, type, name));
+        if (isCallValid)
+        {
+            context->getTransformFeedbackVarying(programPacked, index, bufSize, length, size, type,
+                                                 name);
+        }
+        ANGLE_CAPTURE(GetTransformFeedbackVarying, isCallValid, context, programPacked, index,
+                      bufSize, length, size, type, name);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetUniformuiv(GLuint program, GLint location, GLuint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetUniformuiv,
+          "context = %d, program = %u, location = %d, params = 0x%016" PRIxPTR "", CID(context),
+          program, location, (uintptr_t)params);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetUniformuiv(context, programPacked, locationPacked, params));
+        if (isCallValid)
+        {
+            context->getUniformuiv(programPacked, locationPacked, params);
+        }
+        ANGLE_CAPTURE(GetUniformuiv, isCallValid, context, programPacked, locationPacked, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetVertexAttribIiv,
+          "context = %d, index = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), index,
+          GLenumToString(GLenumGroup::VertexAttribEnum, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetVertexAttribIiv(context, index, pname, params));
+        if (isCallValid)
+        {
+            context->getVertexAttribIiv(index, pname, params);
+        }
+        ANGLE_CAPTURE(GetVertexAttribIiv, isCallValid, context, index, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetVertexAttribIuiv,
+          "context = %d, index = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), index,
+          GLenumToString(GLenumGroup::VertexAttribEnum, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetVertexAttribIuiv(context, index, pname, params));
+        if (isCallValid)
+        {
+            context->getVertexAttribIuiv(index, pname, params);
+        }
+        ANGLE_CAPTURE(GetVertexAttribIuiv, isCallValid, context, index, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+GLboolean GL_APIENTRY IsEnabledi(GLenum target, GLuint index)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLIsEnabledi, "context = %d, target = %s, index = %u", CID(context),
+          GLenumToString(GLenumGroup::EnableCap, target), index);
+
+    GLboolean returnValue;
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateIsEnabledi(context, target, index));
+        if (isCallValid)
+        {
+            returnValue = context->isEnabledi(target, index);
+        }
+        else
+        {
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsEnabledi, GLboolean>();
+        }
+        ANGLE_CAPTURE(IsEnabledi, isCallValid, context, target, index, returnValue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsEnabledi, GLboolean>();
+    }
+    return returnValue;
+}
+
+GLboolean GL_APIENTRY IsFramebuffer(GLuint framebuffer)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLIsFramebuffer, "context = %d, framebuffer = %u", CID(context), framebuffer);
+
+    GLboolean returnValue;
+    if (context)
+    {
+        FramebufferID framebufferPacked = PackParam<FramebufferID>(framebuffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateIsFramebuffer(context, framebufferPacked));
+        if (isCallValid)
+        {
+            returnValue = context->isFramebuffer(framebufferPacked);
+        }
+        else
+        {
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsFramebuffer, GLboolean>();
+        }
+        ANGLE_CAPTURE(IsFramebuffer, isCallValid, context, framebufferPacked, returnValue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsFramebuffer, GLboolean>();
+    }
+    return returnValue;
+}
+
+GLboolean GL_APIENTRY IsRenderbuffer(GLuint renderbuffer)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLIsRenderbuffer, "context = %d, renderbuffer = %u", CID(context), renderbuffer);
+
+    GLboolean returnValue;
+    if (context)
+    {
+        RenderbufferID renderbufferPacked = PackParam<RenderbufferID>(renderbuffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateIsRenderbuffer(context, renderbufferPacked));
+        if (isCallValid)
+        {
+            returnValue = context->isRenderbuffer(renderbufferPacked);
+        }
+        else
+        {
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsRenderbuffer, GLboolean>();
+        }
+        ANGLE_CAPTURE(IsRenderbuffer, isCallValid, context, renderbufferPacked, returnValue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsRenderbuffer, GLboolean>();
+    }
+    return returnValue;
+}
+
+GLboolean GL_APIENTRY IsVertexArray(GLuint array)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLIsVertexArray, "context = %d, array = %u", CID(context), array);
+
+    GLboolean returnValue;
+    if (context)
+    {
+        VertexArrayID arrayPacked                             = PackParam<VertexArrayID>(array);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateIsVertexArray(context, arrayPacked));
+        if (isCallValid)
+        {
+            returnValue = context->isVertexArray(arrayPacked);
+        }
+        else
+        {
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsVertexArray, GLboolean>();
+        }
+        ANGLE_CAPTURE(IsVertexArray, isCallValid, context, arrayPacked, returnValue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsVertexArray, GLboolean>();
+    }
+    return returnValue;
+}
+
+void *GL_APIENTRY MapBufferRange(GLenum target,
+                                 GLintptr offset,
+                                 GLsizeiptr length,
+                                 GLbitfield access)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMapBufferRange,
+          "context = %d, target = %s, offset = %llu, length = %llu, access = %s", CID(context),
+          GLenumToString(GLenumGroup::BufferTargetARB, target),
+          static_cast<unsigned long long>(offset), static_cast<unsigned long long>(length),
+          GLbitfieldToString(GLenumGroup::BufferAccessMask, access).c_str());
+
+    void *returnValue;
+    if (context)
+    {
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateMapBufferRange(context, targetPacked, offset, length, access));
+        if (isCallValid)
+        {
+            returnValue = context->mapBufferRange(targetPacked, offset, length, access);
+        }
+        else
+        {
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLMapBufferRange, void *>();
+        }
+        ANGLE_CAPTURE(MapBufferRange, isCallValid, context, targetPacked, offset, length, access,
+                      returnValue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLMapBufferRange, void *>();
+    }
+    return returnValue;
+}
+
+void GL_APIENTRY RenderbufferStorage(GLenum target,
+                                     GLenum internalformat,
+                                     GLsizei width,
+                                     GLsizei height)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLRenderbufferStorage,
+          "context = %d, target = %s, internalformat = %s, width = %d, height = %d", CID(context),
+          GLenumToString(GLenumGroup::RenderbufferTarget, target),
+          GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateRenderbufferStorage(context, target, internalformat, width, height));
+        if (isCallValid)
+        {
+            context->renderbufferStorage(target, internalformat, width, height);
+        }
+        ANGLE_CAPTURE(RenderbufferStorage, isCallValid, context, target, internalformat, width,
+                      height);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY RenderbufferStorageMultisample(GLenum target,
+                                                GLsizei samples,
+                                                GLenum internalformat,
+                                                GLsizei width,
+                                                GLsizei height)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLRenderbufferStorageMultisample,
+          "context = %d, target = %s, samples = %d, internalformat = %s, width = %d, height = %d",
+          CID(context), GLenumToString(GLenumGroup::RenderbufferTarget, target), samples,
+          GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateRenderbufferStorageMultisample(context, target, samples,
+                                                                   internalformat, width, height));
+        if (isCallValid)
+        {
+            context->renderbufferStorageMultisample(target, samples, internalformat, width, height);
+        }
+        ANGLE_CAPTURE(RenderbufferStorageMultisample, isCallValid, context, target, samples,
+                      internalformat, width, height);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexParameterIiv(GLenum target, GLenum pname, const GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexParameterIiv,
+          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::TextureTarget, target),
+          GLenumToString(GLenumGroup::TextureParameterName, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateTexParameterIiv(context, targetPacked, pname, params));
+        if (isCallValid)
+        {
+            context->texParameterIiv(targetPacked, pname, params);
+        }
+        ANGLE_CAPTURE(TexParameterIiv, isCallValid, context, targetPacked, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexParameterIuiv,
+          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::TextureTarget, target),
+          GLenumToString(GLenumGroup::TextureParameterName, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateTexParameterIuiv(context, targetPacked, pname, params));
+        if (isCallValid)
+        {
+            context->texParameterIuiv(targetPacked, pname, params);
+        }
+        ANGLE_CAPTURE(TexParameterIuiv, isCallValid, context, targetPacked, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TransformFeedbackVaryings(GLuint program,
+                                           GLsizei count,
+                                           const GLchar *const *varyings,
+                                           GLenum bufferMode)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTransformFeedbackVaryings,
+          "context = %d, program = %u, count = %d, varyings = 0x%016" PRIxPTR ", bufferMode = %s",
+          CID(context), program, count, (uintptr_t)varyings,
+          GLenumToString(GLenumGroup::DefaultGroup, bufferMode));
+
+    if (context)
+    {
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateTransformFeedbackVaryings(
+                                              context, programPacked, count, varyings, bufferMode));
+        if (isCallValid)
+        {
+            context->transformFeedbackVaryings(programPacked, count, varyings, bufferMode);
+        }
+        ANGLE_CAPTURE(TransformFeedbackVaryings, isCallValid, context, programPacked, count,
+                      varyings, bufferMode);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Uniform1ui(GLint location, GLuint v0)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLUniform1ui, "context = %d, location = %d, v0 = %u", CID(context), location,
+          v0);
+
+    if (context)
+    {
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateUniform1ui(context, locationPacked, v0));
+        if (isCallValid)
+        {
+            context->uniform1ui(locationPacked, v0);
+        }
+        ANGLE_CAPTURE(Uniform1ui, isCallValid, context, locationPacked, v0);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Uniform1uiv(GLint location, GLsizei count, const GLuint *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLUniform1uiv,
+          "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
+          location, count, (uintptr_t)value);
+
+    if (context)
+    {
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateUniform1uiv(context, locationPacked, count, value));
+        if (isCallValid)
+        {
+            context->uniform1uiv(locationPacked, count, value);
+        }
+        ANGLE_CAPTURE(Uniform1uiv, isCallValid, context, locationPacked, count, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Uniform2ui(GLint location, GLuint v0, GLuint v1)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLUniform2ui, "context = %d, location = %d, v0 = %u, v1 = %u", CID(context),
+          location, v0, v1);
+
+    if (context)
+    {
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateUniform2ui(context, locationPacked, v0, v1));
+        if (isCallValid)
+        {
+            context->uniform2ui(locationPacked, v0, v1);
+        }
+        ANGLE_CAPTURE(Uniform2ui, isCallValid, context, locationPacked, v0, v1);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Uniform2uiv(GLint location, GLsizei count, const GLuint *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLUniform2uiv,
+          "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
+          location, count, (uintptr_t)value);
+
+    if (context)
+    {
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateUniform2uiv(context, locationPacked, count, value));
+        if (isCallValid)
+        {
+            context->uniform2uiv(locationPacked, count, value);
+        }
+        ANGLE_CAPTURE(Uniform2uiv, isCallValid, context, locationPacked, count, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLUniform3ui, "context = %d, location = %d, v0 = %u, v1 = %u, v2 = %u",
+          CID(context), location, v0, v1, v2);
+
+    if (context)
+    {
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateUniform3ui(context, locationPacked, v0, v1, v2));
+        if (isCallValid)
+        {
+            context->uniform3ui(locationPacked, v0, v1, v2);
+        }
+        ANGLE_CAPTURE(Uniform3ui, isCallValid, context, locationPacked, v0, v1, v2);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Uniform3uiv(GLint location, GLsizei count, const GLuint *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLUniform3uiv,
+          "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
+          location, count, (uintptr_t)value);
+
+    if (context)
+    {
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateUniform3uiv(context, locationPacked, count, value));
+        if (isCallValid)
+        {
+            context->uniform3uiv(locationPacked, count, value);
+        }
+        ANGLE_CAPTURE(Uniform3uiv, isCallValid, context, locationPacked, count, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLUniform4ui, "context = %d, location = %d, v0 = %u, v1 = %u, v2 = %u, v3 = %u",
+          CID(context), location, v0, v1, v2, v3);
+
+    if (context)
+    {
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateUniform4ui(context, locationPacked, v0, v1, v2, v3));
+        if (isCallValid)
+        {
+            context->uniform4ui(locationPacked, v0, v1, v2, v3);
+        }
+        ANGLE_CAPTURE(Uniform4ui, isCallValid, context, locationPacked, v0, v1, v2, v3);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Uniform4uiv(GLint location, GLsizei count, const GLuint *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLUniform4uiv,
+          "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
+          location, count, (uintptr_t)value);
+
+    if (context)
+    {
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateUniform4uiv(context, locationPacked, count, value));
+        if (isCallValid)
+        {
+            context->uniform4uiv(locationPacked, count, value);
+        }
+        ANGLE_CAPTURE(Uniform4uiv, isCallValid, context, locationPacked, count, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribI1i(GLuint index, GLint x)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribI1i, "context = %d, index = %u, x = %d", CID(context), index, x);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateVertexAttribI1i(context, index, x));
+        if (isCallValid)
+        {
+            context->vertexAttribI1i(index, x);
+        }
+        ANGLE_CAPTURE(VertexAttribI1i, isCallValid, context, index, x);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribI1iv(GLuint index, const GLint *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribI1iv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateVertexAttribI1iv(context, index, v));
+        if (isCallValid)
+        {
+            context->vertexAttribI1iv(index, v);
+        }
+        ANGLE_CAPTURE(VertexAttribI1iv, isCallValid, context, index, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribI1ui(GLuint index, GLuint x)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribI1ui, "context = %d, index = %u, x = %u", CID(context), index, x);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateVertexAttribI1ui(context, index, x));
+        if (isCallValid)
+        {
+            context->vertexAttribI1ui(index, x);
+        }
+        ANGLE_CAPTURE(VertexAttribI1ui, isCallValid, context, index, x);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribI1uiv(GLuint index, const GLuint *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribI1uiv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateVertexAttribI1uiv(context, index, v));
+        if (isCallValid)
+        {
+            context->vertexAttribI1uiv(index, v);
+        }
+        ANGLE_CAPTURE(VertexAttribI1uiv, isCallValid, context, index, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribI2i(GLuint index, GLint x, GLint y)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribI2i, "context = %d, index = %u, x = %d, y = %d", CID(context),
+          index, x, y);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateVertexAttribI2i(context, index, x, y));
+        if (isCallValid)
+        {
+            context->vertexAttribI2i(index, x, y);
+        }
+        ANGLE_CAPTURE(VertexAttribI2i, isCallValid, context, index, x, y);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribI2iv(GLuint index, const GLint *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribI2iv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateVertexAttribI2iv(context, index, v));
+        if (isCallValid)
+        {
+            context->vertexAttribI2iv(index, v);
+        }
+        ANGLE_CAPTURE(VertexAttribI2iv, isCallValid, context, index, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribI2ui(GLuint index, GLuint x, GLuint y)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribI2ui, "context = %d, index = %u, x = %u, y = %u", CID(context),
+          index, x, y);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateVertexAttribI2ui(context, index, x, y));
+        if (isCallValid)
+        {
+            context->vertexAttribI2ui(index, x, y);
+        }
+        ANGLE_CAPTURE(VertexAttribI2ui, isCallValid, context, index, x, y);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribI2uiv(GLuint index, const GLuint *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribI2uiv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateVertexAttribI2uiv(context, index, v));
+        if (isCallValid)
+        {
+            context->vertexAttribI2uiv(index, v);
+        }
+        ANGLE_CAPTURE(VertexAttribI2uiv, isCallValid, context, index, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribI3i(GLuint index, GLint x, GLint y, GLint z)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribI3i, "context = %d, index = %u, x = %d, y = %d, z = %d",
+          CID(context), index, x, y, z);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateVertexAttribI3i(context, index, x, y, z));
+        if (isCallValid)
+        {
+            context->vertexAttribI3i(index, x, y, z);
+        }
+        ANGLE_CAPTURE(VertexAttribI3i, isCallValid, context, index, x, y, z);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribI3iv(GLuint index, const GLint *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribI3iv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateVertexAttribI3iv(context, index, v));
+        if (isCallValid)
+        {
+            context->vertexAttribI3iv(index, v);
+        }
+        ANGLE_CAPTURE(VertexAttribI3iv, isCallValid, context, index, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribI3ui, "context = %d, index = %u, x = %u, y = %u, z = %u",
+          CID(context), index, x, y, z);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateVertexAttribI3ui(context, index, x, y, z));
+        if (isCallValid)
+        {
+            context->vertexAttribI3ui(index, x, y, z);
+        }
+        ANGLE_CAPTURE(VertexAttribI3ui, isCallValid, context, index, x, y, z);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribI3uiv(GLuint index, const GLuint *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribI3uiv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateVertexAttribI3uiv(context, index, v));
+        if (isCallValid)
+        {
+            context->vertexAttribI3uiv(index, v);
+        }
+        ANGLE_CAPTURE(VertexAttribI3uiv, isCallValid, context, index, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribI4bv(GLuint index, const GLbyte *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribI4bv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateVertexAttribI4bv(context, index, v));
+        if (isCallValid)
+        {
+            context->vertexAttribI4bv(index, v);
+        }
+        ANGLE_CAPTURE(VertexAttribI4bv, isCallValid, context, index, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribI4i, "context = %d, index = %u, x = %d, y = %d, z = %d, w = %d",
+          CID(context), index, x, y, z, w);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateVertexAttribI4i(context, index, x, y, z, w));
+        if (isCallValid)
+        {
+            context->vertexAttribI4i(index, x, y, z, w);
+        }
+        ANGLE_CAPTURE(VertexAttribI4i, isCallValid, context, index, x, y, z, w);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribI4iv(GLuint index, const GLint *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribI4iv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateVertexAttribI4iv(context, index, v));
+        if (isCallValid)
+        {
+            context->vertexAttribI4iv(index, v);
+        }
+        ANGLE_CAPTURE(VertexAttribI4iv, isCallValid, context, index, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribI4sv(GLuint index, const GLshort *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribI4sv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateVertexAttribI4sv(context, index, v));
+        if (isCallValid)
+        {
+            context->vertexAttribI4sv(index, v);
+        }
+        ANGLE_CAPTURE(VertexAttribI4sv, isCallValid, context, index, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribI4ubv(GLuint index, const GLubyte *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribI4ubv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateVertexAttribI4ubv(context, index, v));
+        if (isCallValid)
+        {
+            context->vertexAttribI4ubv(index, v);
+        }
+        ANGLE_CAPTURE(VertexAttribI4ubv, isCallValid, context, index, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribI4ui, "context = %d, index = %u, x = %u, y = %u, z = %u, w = %u",
+          CID(context), index, x, y, z, w);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateVertexAttribI4ui(context, index, x, y, z, w));
+        if (isCallValid)
+        {
+            context->vertexAttribI4ui(index, x, y, z, w);
+        }
+        ANGLE_CAPTURE(VertexAttribI4ui, isCallValid, context, index, x, y, z, w);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribI4uiv(GLuint index, const GLuint *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribI4uiv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateVertexAttribI4uiv(context, index, v));
+        if (isCallValid)
+        {
+            context->vertexAttribI4uiv(index, v);
+        }
+        ANGLE_CAPTURE(VertexAttribI4uiv, isCallValid, context, index, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribI4usv(GLuint index, const GLushort *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribI4usv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateVertexAttribI4usv(context, index, v));
+        if (isCallValid)
+        {
+            context->vertexAttribI4usv(index, v);
+        }
+        ANGLE_CAPTURE(VertexAttribI4usv, isCallValid, context, index, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY
+VertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribIPointer,
+          "context = %d, index = %u, size = %d, type = %s, stride = %d, pointer = 0x%016" PRIxPTR
+          "",
+          CID(context), index, size, GLenumToString(GLenumGroup::VertexAttribPointerType, type),
+          stride, (uintptr_t)pointer);
+
+    if (context)
+    {
+        VertexAttribType typePacked                           = PackParam<VertexAttribType>(type);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateVertexAttribIPointer(context, index, size, typePacked, stride, pointer));
+        if (isCallValid)
+        {
+            context->vertexAttribIPointer(index, size, typePacked, stride, pointer);
+        }
+        ANGLE_CAPTURE(VertexAttribIPointer, isCallValid, context, index, size, typePacked, stride,
+                      pointer);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+// GL 3.1
+void GL_APIENTRY CopyBufferSubData(GLenum readTarget,
+                                   GLenum writeTarget,
+                                   GLintptr readOffset,
+                                   GLintptr writeOffset,
+                                   GLsizeiptr size)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLCopyBufferSubData,
+          "context = %d, readTarget = %s, writeTarget = %s, readOffset = %llu, writeOffset = %llu, "
+          "size = %llu",
+          CID(context), GLenumToString(GLenumGroup::CopyBufferSubDataTarget, readTarget),
+          GLenumToString(GLenumGroup::CopyBufferSubDataTarget, writeTarget),
+          static_cast<unsigned long long>(readOffset), static_cast<unsigned long long>(writeOffset),
+          static_cast<unsigned long long>(size));
+
+    if (context)
+    {
+        BufferBinding readTargetPacked  = PackParam<BufferBinding>(readTarget);
+        BufferBinding writeTargetPacked = PackParam<BufferBinding>(writeTarget);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateCopyBufferSubData(context, readTargetPacked, writeTargetPacked,
+                                                      readOffset, writeOffset, size));
+        if (isCallValid)
+        {
+            context->copyBufferSubData(readTargetPacked, writeTargetPacked, readOffset, writeOffset,
+                                       size);
+        }
+        ANGLE_CAPTURE(CopyBufferSubData, isCallValid, context, readTargetPacked, writeTargetPacked,
+                      readOffset, writeOffset, size);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDrawArraysInstanced,
+          "context = %d, mode = %s, first = %d, count = %d, instancecount = %d", CID(context),
+          GLenumToString(GLenumGroup::PrimitiveType, mode), first, count, instancecount);
+
+    if (context)
+    {
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateDrawArraysInstanced(context, modePacked, first, count, instancecount));
+        if (isCallValid)
+        {
+            context->drawArraysInstanced(modePacked, first, count, instancecount);
+        }
+        ANGLE_CAPTURE(DrawArraysInstanced, isCallValid, context, modePacked, first, count,
+                      instancecount);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DrawElementsInstanced(GLenum mode,
+                                       GLsizei count,
+                                       GLenum type,
+                                       const void *indices,
+                                       GLsizei instancecount)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDrawElementsInstanced,
+          "context = %d, mode = %s, count = %d, type = %s, indices = 0x%016" PRIxPTR
+          ", instancecount = %d",
+          CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), count,
+          GLenumToString(GLenumGroup::DrawElementsType, type), (uintptr_t)indices, instancecount);
+
+    if (context)
+    {
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateDrawElementsInstanced(context, modePacked, count, typePacked,
+                                                          indices, instancecount));
+        if (isCallValid)
+        {
+            context->drawElementsInstanced(modePacked, count, typePacked, indices, instancecount);
+        }
+        ANGLE_CAPTURE(DrawElementsInstanced, isCallValid, context, modePacked, count, typePacked,
+                      indices, instancecount);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetActiveUniformBlockName(GLuint program,
+                                           GLuint uniformBlockIndex,
+                                           GLsizei bufSize,
+                                           GLsizei *length,
+                                           GLchar *uniformBlockName)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(
+        context, GLGetActiveUniformBlockName,
+        "context = %d, program = %u, uniformBlockIndex = %u, bufSize = %d, length = 0x%016" PRIxPTR
+        ", uniformBlockName = 0x%016" PRIxPTR "",
+        CID(context), program, uniformBlockIndex, bufSize, (uintptr_t)length,
+        (uintptr_t)uniformBlockName);
+
+    if (context)
+    {
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetActiveUniformBlockName(context, programPacked, uniformBlockIndex, bufSize,
+                                               length, uniformBlockName));
+        if (isCallValid)
+        {
+            context->getActiveUniformBlockName(programPacked, uniformBlockIndex, bufSize, length,
+                                               uniformBlockName);
+        }
+        ANGLE_CAPTURE(GetActiveUniformBlockName, isCallValid, context, programPacked,
+                      uniformBlockIndex, bufSize, length, uniformBlockName);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetActiveUniformBlockiv(GLuint program,
+                                         GLuint uniformBlockIndex,
+                                         GLenum pname,
+                                         GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetActiveUniformBlockiv,
+          "context = %d, program = %u, uniformBlockIndex = %u, pname = %s, params = 0x%016" PRIxPTR
+          "",
+          CID(context), program, uniformBlockIndex,
+          GLenumToString(GLenumGroup::UniformBlockPName, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetActiveUniformBlockiv(context, programPacked,
+                                                            uniformBlockIndex, pname, params));
+        if (isCallValid)
+        {
+            context->getActiveUniformBlockiv(programPacked, uniformBlockIndex, pname, params);
+        }
+        ANGLE_CAPTURE(GetActiveUniformBlockiv, isCallValid, context, programPacked,
+                      uniformBlockIndex, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetActiveUniformName(GLuint program,
+                                      GLuint uniformIndex,
+                                      GLsizei bufSize,
+                                      GLsizei *length,
+                                      GLchar *uniformName)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetActiveUniformName,
+          "context = %d, program = %u, uniformIndex = %u, bufSize = %d, length = 0x%016" PRIxPTR
+          ", uniformName = 0x%016" PRIxPTR "",
+          CID(context), program, uniformIndex, bufSize, (uintptr_t)length, (uintptr_t)uniformName);
+
+    if (context)
+    {
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetActiveUniformName(context, programPacked, uniformIndex,
+                                                         bufSize, length, uniformName));
+        if (isCallValid)
+        {
+            context->getActiveUniformName(programPacked, uniformIndex, bufSize, length,
+                                          uniformName);
+        }
+        ANGLE_CAPTURE(GetActiveUniformName, isCallValid, context, programPacked, uniformIndex,
+                      bufSize, length, uniformName);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetActiveUniformsiv(GLuint program,
+                                     GLsizei uniformCount,
+                                     const GLuint *uniformIndices,
+                                     GLenum pname,
+                                     GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetActiveUniformsiv,
+          "context = %d, program = %u, uniformCount = %d, uniformIndices = 0x%016" PRIxPTR
+          ", pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), program, uniformCount, (uintptr_t)uniformIndices,
+          GLenumToString(GLenumGroup::UniformPName, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetActiveUniformsiv(context, programPacked, uniformCount,
+                                                        uniformIndices, pname, params));
+        if (isCallValid)
+        {
+            context->getActiveUniformsiv(programPacked, uniformCount, uniformIndices, pname,
+                                         params);
+        }
+        ANGLE_CAPTURE(GetActiveUniformsiv, isCallValid, context, programPacked, uniformCount,
+                      uniformIndices, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+GLuint GL_APIENTRY GetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetUniformBlockIndex,
+          "context = %d, program = %u, uniformBlockName = 0x%016" PRIxPTR "", CID(context), program,
+          (uintptr_t)uniformBlockName);
+
+    GLuint returnValue;
+    if (context)
+    {
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetUniformBlockIndex(context, programPacked, uniformBlockName));
+        if (isCallValid)
+        {
+            returnValue = context->getUniformBlockIndex(programPacked, uniformBlockName);
+        }
+        else
+        {
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLGetUniformBlockIndex, GLuint>();
+        }
+        ANGLE_CAPTURE(GetUniformBlockIndex, isCallValid, context, programPacked, uniformBlockName,
+                      returnValue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetUniformBlockIndex, GLuint>();
+    }
+    return returnValue;
+}
+
+void GL_APIENTRY GetUniformIndices(GLuint program,
+                                   GLsizei uniformCount,
+                                   const GLchar *const *uniformNames,
+                                   GLuint *uniformIndices)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetUniformIndices,
+          "context = %d, program = %u, uniformCount = %d, uniformNames = 0x%016" PRIxPTR
+          ", uniformIndices = 0x%016" PRIxPTR "",
+          CID(context), program, uniformCount, (uintptr_t)uniformNames, (uintptr_t)uniformIndices);
+
+    if (context)
+    {
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetUniformIndices(context, programPacked, uniformCount,
+                                                      uniformNames, uniformIndices));
+        if (isCallValid)
+        {
+            context->getUniformIndices(programPacked, uniformCount, uniformNames, uniformIndices);
+        }
+        ANGLE_CAPTURE(GetUniformIndices, isCallValid, context, programPacked, uniformCount,
+                      uniformNames, uniformIndices);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY PrimitiveRestartIndex(GLuint index)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLPrimitiveRestartIndex, "context = %d, index = %u", CID(context), index);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidatePrimitiveRestartIndex(context, index));
+        if (isCallValid)
+        {
+            context->primitiveRestartIndex(index);
+        }
+        ANGLE_CAPTURE(PrimitiveRestartIndex, isCallValid, context, index);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexBuffer, "context = %d, target = %s, internalformat = %s, buffer = %u",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target),
+          GLenumToString(GLenumGroup::InternalFormat, internalformat), buffer);
+
+    if (context)
+    {
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateTexBuffer(context, targetPacked, internalformat, bufferPacked));
+        if (isCallValid)
+        {
+            context->texBuffer(targetPacked, internalformat, bufferPacked);
+        }
+        ANGLE_CAPTURE(TexBuffer, isCallValid, context, targetPacked, internalformat, bufferPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY UniformBlockBinding(GLuint program,
+                                     GLuint uniformBlockIndex,
+                                     GLuint uniformBlockBinding)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLUniformBlockBinding,
+          "context = %d, program = %u, uniformBlockIndex = %u, uniformBlockBinding = %u",
+          CID(context), program, uniformBlockIndex, uniformBlockBinding);
+
+    if (context)
+    {
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateUniformBlockBinding(context, programPacked, uniformBlockIndex,
+                                                        uniformBlockBinding));
+        if (isCallValid)
+        {
+            context->uniformBlockBinding(programPacked, uniformBlockIndex, uniformBlockBinding);
+        }
+        ANGLE_CAPTURE(UniformBlockBinding, isCallValid, context, programPacked, uniformBlockIndex,
+                      uniformBlockBinding);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+// GL 3.2
+GLenum GL_APIENTRY ClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLClientWaitSync,
+          "context = %d, sync = 0x%016" PRIxPTR ", flags = %s, timeout = %llu", CID(context),
+          (uintptr_t)sync, GLbitfieldToString(GLenumGroup::SyncObjectMask, flags).c_str(),
+          static_cast<unsigned long long>(timeout));
+
+    GLenum returnValue;
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateClientWaitSync(context, sync, flags, timeout));
+        if (isCallValid)
+        {
+            returnValue = context->clientWaitSync(sync, flags, timeout);
+        }
+        else
+        {
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLClientWaitSync, GLenum>();
+        }
+        ANGLE_CAPTURE(ClientWaitSync, isCallValid, context, sync, flags, timeout, returnValue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLClientWaitSync, GLenum>();
+    }
+    return returnValue;
+}
+
+void GL_APIENTRY DeleteSync(GLsync sync)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDeleteSync, "context = %d, sync = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)sync);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateDeleteSync(context, sync));
+        if (isCallValid)
+        {
+            context->deleteSync(sync);
+        }
+        ANGLE_CAPTURE(DeleteSync, isCallValid, context, sync);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DrawElementsBaseVertex(GLenum mode,
+                                        GLsizei count,
+                                        GLenum type,
+                                        const void *indices,
+                                        GLint basevertex)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDrawElementsBaseVertex,
+          "context = %d, mode = %s, count = %d, type = %s, indices = 0x%016" PRIxPTR
+          ", basevertex = %d",
+          CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), count,
+          GLenumToString(GLenumGroup::DrawElementsType, type), (uintptr_t)indices, basevertex);
+
+    if (context)
+    {
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateDrawElementsBaseVertex(context, modePacked, count, typePacked,
+                                                           indices, basevertex));
+        if (isCallValid)
+        {
+            context->drawElementsBaseVertex(modePacked, count, typePacked, indices, basevertex);
+        }
+        ANGLE_CAPTURE(DrawElementsBaseVertex, isCallValid, context, modePacked, count, typePacked,
+                      indices, basevertex);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DrawElementsInstancedBaseVertex(GLenum mode,
+                                                 GLsizei count,
+                                                 GLenum type,
+                                                 const void *indices,
+                                                 GLsizei instancecount,
+                                                 GLint basevertex)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDrawElementsInstancedBaseVertex,
+          "context = %d, mode = %s, count = %d, type = %s, indices = 0x%016" PRIxPTR
+          ", instancecount = %d, basevertex = %d",
+          CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), count,
+          GLenumToString(GLenumGroup::DrawElementsType, type), (uintptr_t)indices, instancecount,
+          basevertex);
+
+    if (context)
+    {
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateDrawElementsInstancedBaseVertex(
+                                                             context, modePacked, count, typePacked,
+                                                             indices, instancecount, basevertex));
+        if (isCallValid)
+        {
+            context->drawElementsInstancedBaseVertex(modePacked, count, typePacked, indices,
+                                                     instancecount, basevertex);
+        }
+        ANGLE_CAPTURE(DrawElementsInstancedBaseVertex, isCallValid, context, modePacked, count,
+                      typePacked, indices, instancecount, basevertex);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DrawRangeElementsBaseVertex(GLenum mode,
+                                             GLuint start,
+                                             GLuint end,
+                                             GLsizei count,
+                                             GLenum type,
+                                             const void *indices,
+                                             GLint basevertex)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDrawRangeElementsBaseVertex,
+          "context = %d, mode = %s, start = %u, end = %u, count = %d, type = %s, indices = "
+          "0x%016" PRIxPTR ", basevertex = %d",
+          CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), start, end, count,
+          GLenumToString(GLenumGroup::DrawElementsType, type), (uintptr_t)indices, basevertex);
+
+    if (context)
+    {
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateDrawRangeElementsBaseVertex(
+                                                             context, modePacked, start, end, count,
+                                                             typePacked, indices, basevertex));
+        if (isCallValid)
+        {
+            context->drawRangeElementsBaseVertex(modePacked, start, end, count, typePacked, indices,
+                                                 basevertex);
+        }
+        ANGLE_CAPTURE(DrawRangeElementsBaseVertex, isCallValid, context, modePacked, start, end,
+                      count, typePacked, indices, basevertex);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+GLsync GL_APIENTRY FenceSync(GLenum condition, GLbitfield flags)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLFenceSync, "context = %d, condition = %s, flags = %s", CID(context),
+          GLenumToString(GLenumGroup::SyncCondition, condition),
+          GLbitfieldToString(GLenumGroup::DefaultGroup, flags).c_str());
+
+    GLsync returnValue;
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateFenceSync(context, condition, flags));
+        if (isCallValid)
+        {
+            returnValue = context->fenceSync(condition, flags);
+        }
+        else
+        {
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLFenceSync, GLsync>();
+        }
+        ANGLE_CAPTURE(FenceSync, isCallValid, context, condition, flags, returnValue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLFenceSync, GLsync>();
+    }
+    return returnValue;
+}
+
+void GL_APIENTRY FramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLFramebufferTexture,
+          "context = %d, target = %s, attachment = %s, texture = %u, level = %d", CID(context),
+          GLenumToString(GLenumGroup::FramebufferTarget, target),
+          GLenumToString(GLenumGroup::FramebufferAttachment, attachment), texture, level);
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateFramebufferTexture(context, target, attachment, texturePacked, level));
+        if (isCallValid)
+        {
+            context->framebufferTexture(target, attachment, texturePacked, level);
+        }
+        ANGLE_CAPTURE(FramebufferTexture, isCallValid, context, target, attachment, texturePacked,
+                      level);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetBufferParameteri64v,
+          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::BufferTargetARB, target),
+          GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetBufferParameteri64v(context, targetPacked, pname, params));
+        if (isCallValid)
+        {
+            context->getBufferParameteri64v(targetPacked, pname, params);
+        }
+        ANGLE_CAPTURE(GetBufferParameteri64v, isCallValid, context, targetPacked, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetInteger64i_v(GLenum target, GLuint index, GLint64 *data)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetInteger64i_v,
+          "context = %d, target = %s, index = %u, data = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::TypeEnum, target), index, (uintptr_t)data);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGetInteger64i_v(context, target, index, data));
+        if (isCallValid)
+        {
+            context->getInteger64i_v(target, index, data);
+        }
+        ANGLE_CAPTURE(GetInteger64i_v, isCallValid, context, target, index, data);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetInteger64v(GLenum pname, GLint64 *data)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetInteger64v, "context = %d, pname = %s, data = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::GetPName, pname), (uintptr_t)data);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGetInteger64v(context, pname, data));
+        if (isCallValid)
+        {
+            context->getInteger64v(pname, data);
+        }
+        ANGLE_CAPTURE(GetInteger64v, isCallValid, context, pname, data);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetMultisamplefv,
+          "context = %d, pname = %s, index = %u, val = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::DefaultGroup, pname), index, (uintptr_t)val);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGetMultisamplefv(context, pname, index, val));
+        if (isCallValid)
+        {
+            context->getMultisamplefv(pname, index, val);
+        }
+        ANGLE_CAPTURE(GetMultisamplefv, isCallValid, context, pname, index, val);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY
+GetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
+{
+    Context *context = GetGlobalContext();
+    EVENT(context, GLGetSynciv,
+          "context = %d, sync = 0x%016" PRIxPTR
+          ", pname = %s, bufSize = %d, length = 0x%016" PRIxPTR ", values = 0x%016" PRIxPTR "",
+          CID(context), (uintptr_t)sync, GLenumToString(GLenumGroup::SyncParameterName, pname),
+          bufSize, (uintptr_t)length, (uintptr_t)values);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetSynciv(context, sync, pname, bufSize, length, values));
+        if (isCallValid)
+        {
+            context->getSynciv(sync, pname, bufSize, length, values);
+        }
+        ANGLE_CAPTURE(GetSynciv, isCallValid, context, sync, pname, bufSize, length, values);
+    }
+    else
+    {}
+}
+
+GLboolean GL_APIENTRY IsSync(GLsync sync)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLIsSync, "context = %d, sync = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)sync);
+
+    GLboolean returnValue;
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateIsSync(context, sync));
+        if (isCallValid)
+        {
+            returnValue = context->isSync(sync);
+        }
+        else
+        {
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsSync, GLboolean>();
+        }
+        ANGLE_CAPTURE(IsSync, isCallValid, context, sync, returnValue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsSync, GLboolean>();
+    }
+    return returnValue;
+}
+
+void GL_APIENTRY MultiDrawElementsBaseVertex(GLenum mode,
+                                             const GLsizei *count,
+                                             GLenum type,
+                                             const void *const *indices,
+                                             GLsizei drawcount,
+                                             const GLint *basevertex)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiDrawElementsBaseVertex,
+          "context = %d, mode = %s, count = 0x%016" PRIxPTR ", type = %s, indices = 0x%016" PRIxPTR
+          ", drawcount = %d, basevertex = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), (uintptr_t)count,
+          GLenumToString(GLenumGroup::DrawElementsType, type), (uintptr_t)indices, drawcount,
+          (uintptr_t)basevertex);
+
+    if (context)
+    {
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateMultiDrawElementsBaseVertex(
+                                                             context, modePacked, count, typePacked,
+                                                             indices, drawcount, basevertex));
+        if (isCallValid)
+        {
+            context->multiDrawElementsBaseVertex(modePacked, count, typePacked, indices, drawcount,
+                                                 basevertex);
+        }
+        ANGLE_CAPTURE(MultiDrawElementsBaseVertex, isCallValid, context, modePacked, count,
+                      typePacked, indices, drawcount, basevertex);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProvokingVertex(GLenum mode)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProvokingVertex, "context = %d, mode = %s", CID(context),
+          GLenumToString(GLenumGroup::VertexProvokingMode, mode));
+
+    if (context)
+    {
+        ProvokingVertexConvention modePacked = PackParam<ProvokingVertexConvention>(mode);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateProvokingVertex(context, modePacked));
+        if (isCallValid)
+        {
+            context->provokingVertex(modePacked);
+        }
+        ANGLE_CAPTURE(ProvokingVertex, isCallValid, context, modePacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY SampleMaski(GLuint maskNumber, GLbitfield mask)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLSampleMaski, "context = %d, maskNumber = %u, mask = %s", CID(context),
+          maskNumber, GLbitfieldToString(GLenumGroup::DefaultGroup, mask).c_str());
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateSampleMaski(context, maskNumber, mask));
+        if (isCallValid)
+        {
+            context->sampleMaski(maskNumber, mask);
+        }
+        ANGLE_CAPTURE(SampleMaski, isCallValid, context, maskNumber, mask);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexImage2DMultisample(GLenum target,
+                                       GLsizei samples,
+                                       GLenum internalformat,
+                                       GLsizei width,
+                                       GLsizei height,
+                                       GLboolean fixedsamplelocations)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexImage2DMultisample,
+          "context = %d, target = %s, samples = %d, internalformat = %s, width = %d, height = %d, "
+          "fixedsamplelocations = %s",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), samples,
+          GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height,
+          GLbooleanToString(fixedsamplelocations));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateTexImage2DMultisample(context, target, samples, internalformat,
+                                                          width, height, fixedsamplelocations));
+        if (isCallValid)
+        {
+            context->texImage2DMultisample(target, samples, internalformat, width, height,
+                                           fixedsamplelocations);
+        }
+        ANGLE_CAPTURE(TexImage2DMultisample, isCallValid, context, target, samples, internalformat,
+                      width, height, fixedsamplelocations);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexImage3DMultisample(GLenum target,
+                                       GLsizei samples,
+                                       GLenum internalformat,
+                                       GLsizei width,
+                                       GLsizei height,
+                                       GLsizei depth,
+                                       GLboolean fixedsamplelocations)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexImage3DMultisample,
+          "context = %d, target = %s, samples = %d, internalformat = %s, width = %d, height = %d, "
+          "depth = %d, fixedsamplelocations = %s",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), samples,
+          GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height, depth,
+          GLbooleanToString(fixedsamplelocations));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateTexImage3DMultisample(context, target, samples, internalformat, width, height,
+                                           depth, fixedsamplelocations));
+        if (isCallValid)
+        {
+            context->texImage3DMultisample(target, samples, internalformat, width, height, depth,
+                                           fixedsamplelocations);
+        }
+        ANGLE_CAPTURE(TexImage3DMultisample, isCallValid, context, target, samples, internalformat,
+                      width, height, depth, fixedsamplelocations);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY WaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLWaitSync, "context = %d, sync = 0x%016" PRIxPTR ", flags = %s, timeout = %llu",
+          CID(context), (uintptr_t)sync,
+          GLbitfieldToString(GLenumGroup::DefaultGroup, flags).c_str(),
+          static_cast<unsigned long long>(timeout));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateWaitSync(context, sync, flags, timeout));
+        if (isCallValid)
+        {
+            context->waitSync(sync, flags, timeout);
+        }
+        ANGLE_CAPTURE(WaitSync, isCallValid, context, sync, flags, timeout);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+// GL 3.3
+void GL_APIENTRY BindFragDataLocationIndexed(GLuint program,
+                                             GLuint colorNumber,
+                                             GLuint index,
+                                             const GLchar *name)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLBindFragDataLocationIndexed,
+          "context = %d, program = %u, colorNumber = %u, index = %u, name = 0x%016" PRIxPTR "",
+          CID(context), program, colorNumber, index, (uintptr_t)name);
+
+    if (context)
+    {
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateBindFragDataLocationIndexed(context, programPacked, colorNumber, index, name));
+        if (isCallValid)
+        {
+            context->bindFragDataLocationIndexed(programPacked, colorNumber, index, name);
+        }
+        ANGLE_CAPTURE(BindFragDataLocationIndexed, isCallValid, context, programPacked, colorNumber,
+                      index, name);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY BindSampler(GLuint unit, GLuint sampler)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLBindSampler, "context = %d, unit = %u, sampler = %u", CID(context), unit,
+          sampler);
+
+    if (context)
+    {
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateBindSampler(context, unit, samplerPacked));
+        if (isCallValid)
+        {
+            context->bindSampler(unit, samplerPacked);
+        }
+        ANGLE_CAPTURE(BindSampler, isCallValid, context, unit, samplerPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ColorP3ui(GLenum type, GLuint color)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColorP3ui, "context = %d, type = %s, color = %u", CID(context),
+          GLenumToString(GLenumGroup::ColorPointerType, type), color);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateColorP3ui(context, type, color));
+        if (isCallValid)
+        {
+            context->colorP3ui(type, color);
+        }
+        ANGLE_CAPTURE(ColorP3ui, isCallValid, context, type, color);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ColorP3uiv(GLenum type, const GLuint *color)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColorP3uiv, "context = %d, type = %s, color = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::ColorPointerType, type), (uintptr_t)color);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateColorP3uiv(context, type, color));
+        if (isCallValid)
+        {
+            context->colorP3uiv(type, color);
+        }
+        ANGLE_CAPTURE(ColorP3uiv, isCallValid, context, type, color);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ColorP4ui(GLenum type, GLuint color)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColorP4ui, "context = %d, type = %s, color = %u", CID(context),
+          GLenumToString(GLenumGroup::ColorPointerType, type), color);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateColorP4ui(context, type, color));
+        if (isCallValid)
+        {
+            context->colorP4ui(type, color);
+        }
+        ANGLE_CAPTURE(ColorP4ui, isCallValid, context, type, color);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ColorP4uiv(GLenum type, const GLuint *color)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLColorP4uiv, "context = %d, type = %s, color = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::ColorPointerType, type), (uintptr_t)color);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateColorP4uiv(context, type, color));
+        if (isCallValid)
+        {
+            context->colorP4uiv(type, color);
+        }
+        ANGLE_CAPTURE(ColorP4uiv, isCallValid, context, type, color);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DeleteSamplers(GLsizei count, const GLuint *samplers)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDeleteSamplers, "context = %d, count = %d, samplers = 0x%016" PRIxPTR "",
+          CID(context), count, (uintptr_t)samplers);
+
+    if (context)
+    {
+        const SamplerID *samplersPacked = PackParam<const SamplerID *>(samplers);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateDeleteSamplers(context, count, samplersPacked));
+        if (isCallValid)
+        {
+            context->deleteSamplers(count, samplersPacked);
+        }
+        ANGLE_CAPTURE(DeleteSamplers, isCallValid, context, count, samplersPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GenSamplers(GLsizei count, GLuint *samplers)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGenSamplers, "context = %d, count = %d, samplers = 0x%016" PRIxPTR "",
+          CID(context), count, (uintptr_t)samplers);
+
+    if (context)
+    {
+        SamplerID *samplersPacked                             = PackParam<SamplerID *>(samplers);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGenSamplers(context, count, samplersPacked));
+        if (isCallValid)
+        {
+            context->genSamplers(count, samplersPacked);
+        }
+        ANGLE_CAPTURE(GenSamplers, isCallValid, context, count, samplersPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+GLint GL_APIENTRY GetFragDataIndex(GLuint program, const GLchar *name)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetFragDataIndex, "context = %d, program = %u, name = 0x%016" PRIxPTR "",
+          CID(context), program, (uintptr_t)name);
+
+    GLint returnValue;
+    if (context)
+    {
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGetFragDataIndex(context, programPacked, name));
+        if (isCallValid)
+        {
+            returnValue = context->getFragDataIndex(programPacked, name);
+        }
+        else
+        {
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetFragDataIndex, GLint>();
+        }
+        ANGLE_CAPTURE(GetFragDataIndex, isCallValid, context, programPacked, name, returnValue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetFragDataIndex, GLint>();
+    }
+    return returnValue;
+}
+
+void GL_APIENTRY GetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
+{
+    Context *context = GetGlobalContext();
+    EVENT(context, GLGetQueryObjecti64v,
+          "context = %d, id = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), id,
+          GLenumToString(GLenumGroup::QueryObjectParameterName, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        QueryID idPacked                                      = PackParam<QueryID>(id);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetQueryObjecti64v(context, idPacked, pname, params));
+        if (isCallValid)
+        {
+            context->getQueryObjecti64v(idPacked, pname, params);
+        }
+        ANGLE_CAPTURE(GetQueryObjecti64v, isCallValid, context, idPacked, pname, params);
+    }
+    else
+    {}
+}
+
+void GL_APIENTRY GetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetQueryObjectui64v,
+          "context = %d, id = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), id,
+          GLenumToString(GLenumGroup::QueryObjectParameterName, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        QueryID idPacked                                      = PackParam<QueryID>(id);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetQueryObjectui64v(context, idPacked, pname, params));
+        if (isCallValid)
+        {
+            context->getQueryObjectui64v(idPacked, pname, params);
+        }
+        ANGLE_CAPTURE(GetQueryObjectui64v, isCallValid, context, idPacked, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetSamplerParameterIiv,
+          "context = %d, sampler = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
+          sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetSamplerParameterIiv(context, samplerPacked, pname, params));
+        if (isCallValid)
+        {
+            context->getSamplerParameterIiv(samplerPacked, pname, params);
+        }
+        ANGLE_CAPTURE(GetSamplerParameterIiv, isCallValid, context, samplerPacked, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetSamplerParameterIuiv,
+          "context = %d, sampler = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
+          sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetSamplerParameterIuiv(context, samplerPacked, pname, params));
+        if (isCallValid)
+        {
+            context->getSamplerParameterIuiv(samplerPacked, pname, params);
+        }
+        ANGLE_CAPTURE(GetSamplerParameterIuiv, isCallValid, context, samplerPacked, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetSamplerParameterfv,
+          "context = %d, sampler = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
+          sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetSamplerParameterfv(context, samplerPacked, pname, params));
+        if (isCallValid)
+        {
+            context->getSamplerParameterfv(samplerPacked, pname, params);
+        }
+        ANGLE_CAPTURE(GetSamplerParameterfv, isCallValid, context, samplerPacked, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetSamplerParameteriv,
+          "context = %d, sampler = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
+          sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetSamplerParameteriv(context, samplerPacked, pname, params));
+        if (isCallValid)
+        {
+            context->getSamplerParameteriv(samplerPacked, pname, params);
+        }
+        ANGLE_CAPTURE(GetSamplerParameteriv, isCallValid, context, samplerPacked, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+GLboolean GL_APIENTRY IsSampler(GLuint sampler)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLIsSampler, "context = %d, sampler = %u", CID(context), sampler);
+
+    GLboolean returnValue;
+    if (context)
+    {
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateIsSampler(context, samplerPacked));
+        if (isCallValid)
+        {
+            returnValue = context->isSampler(samplerPacked);
+        }
+        else
+        {
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsSampler, GLboolean>();
+        }
+        ANGLE_CAPTURE(IsSampler, isCallValid, context, samplerPacked, returnValue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsSampler, GLboolean>();
+    }
+    return returnValue;
+}
+
+void GL_APIENTRY MultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoordP1ui, "context = %d, texture = %s, type = %s, coords = %u",
+          CID(context), GLenumToString(GLenumGroup::TextureUnit, texture),
+          GLenumToString(GLenumGroup::TexCoordPointerType, type), coords);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateMultiTexCoordP1ui(context, texture, type, coords));
+        if (isCallValid)
+        {
+            context->multiTexCoordP1ui(texture, type, coords);
+        }
+        ANGLE_CAPTURE(MultiTexCoordP1ui, isCallValid, context, texture, type, coords);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoordP1uiv,
+          "context = %d, texture = %s, type = %s, coords = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::TextureUnit, texture),
+          GLenumToString(GLenumGroup::TexCoordPointerType, type), (uintptr_t)coords);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateMultiTexCoordP1uiv(context, texture, type, coords));
+        if (isCallValid)
+        {
+            context->multiTexCoordP1uiv(texture, type, coords);
+        }
+        ANGLE_CAPTURE(MultiTexCoordP1uiv, isCallValid, context, texture, type, coords);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoordP2ui, "context = %d, texture = %s, type = %s, coords = %u",
+          CID(context), GLenumToString(GLenumGroup::TextureUnit, texture),
+          GLenumToString(GLenumGroup::TexCoordPointerType, type), coords);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateMultiTexCoordP2ui(context, texture, type, coords));
+        if (isCallValid)
+        {
+            context->multiTexCoordP2ui(texture, type, coords);
+        }
+        ANGLE_CAPTURE(MultiTexCoordP2ui, isCallValid, context, texture, type, coords);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoordP2uiv,
+          "context = %d, texture = %s, type = %s, coords = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::TextureUnit, texture),
+          GLenumToString(GLenumGroup::TexCoordPointerType, type), (uintptr_t)coords);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateMultiTexCoordP2uiv(context, texture, type, coords));
+        if (isCallValid)
+        {
+            context->multiTexCoordP2uiv(texture, type, coords);
+        }
+        ANGLE_CAPTURE(MultiTexCoordP2uiv, isCallValid, context, texture, type, coords);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoordP3ui, "context = %d, texture = %s, type = %s, coords = %u",
+          CID(context), GLenumToString(GLenumGroup::TextureUnit, texture),
+          GLenumToString(GLenumGroup::TexCoordPointerType, type), coords);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateMultiTexCoordP3ui(context, texture, type, coords));
+        if (isCallValid)
+        {
+            context->multiTexCoordP3ui(texture, type, coords);
+        }
+        ANGLE_CAPTURE(MultiTexCoordP3ui, isCallValid, context, texture, type, coords);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoordP3uiv,
+          "context = %d, texture = %s, type = %s, coords = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::TextureUnit, texture),
+          GLenumToString(GLenumGroup::TexCoordPointerType, type), (uintptr_t)coords);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateMultiTexCoordP3uiv(context, texture, type, coords));
+        if (isCallValid)
+        {
+            context->multiTexCoordP3uiv(texture, type, coords);
+        }
+        ANGLE_CAPTURE(MultiTexCoordP3uiv, isCallValid, context, texture, type, coords);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoordP4ui, "context = %d, texture = %s, type = %s, coords = %u",
+          CID(context), GLenumToString(GLenumGroup::TextureUnit, texture),
+          GLenumToString(GLenumGroup::TexCoordPointerType, type), coords);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateMultiTexCoordP4ui(context, texture, type, coords));
+        if (isCallValid)
+        {
+            context->multiTexCoordP4ui(texture, type, coords);
+        }
+        ANGLE_CAPTURE(MultiTexCoordP4ui, isCallValid, context, texture, type, coords);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiTexCoordP4uiv,
+          "context = %d, texture = %s, type = %s, coords = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::TextureUnit, texture),
+          GLenumToString(GLenumGroup::TexCoordPointerType, type), (uintptr_t)coords);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateMultiTexCoordP4uiv(context, texture, type, coords));
+        if (isCallValid)
+        {
+            context->multiTexCoordP4uiv(texture, type, coords);
+        }
+        ANGLE_CAPTURE(MultiTexCoordP4uiv, isCallValid, context, texture, type, coords);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY NormalP3ui(GLenum type, GLuint coords)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLNormalP3ui, "context = %d, type = %s, coords = %u", CID(context),
+          GLenumToString(GLenumGroup::NormalPointerType, type), coords);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateNormalP3ui(context, type, coords));
+        if (isCallValid)
+        {
+            context->normalP3ui(type, coords);
+        }
+        ANGLE_CAPTURE(NormalP3ui, isCallValid, context, type, coords);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY NormalP3uiv(GLenum type, const GLuint *coords)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLNormalP3uiv, "context = %d, type = %s, coords = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::NormalPointerType, type), (uintptr_t)coords);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateNormalP3uiv(context, type, coords));
+        if (isCallValid)
+        {
+            context->normalP3uiv(type, coords);
+        }
+        ANGLE_CAPTURE(NormalP3uiv, isCallValid, context, type, coords);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY QueryCounter(GLuint id, GLenum target)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLQueryCounter, "context = %d, id = %u, target = %s", CID(context), id,
+          GLenumToString(GLenumGroup::QueryTarget, target));
+
+    if (context)
+    {
+        QueryID idPacked                                      = PackParam<QueryID>(id);
+        QueryType targetPacked                                = PackParam<QueryType>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateQueryCounter(context, idPacked, targetPacked));
+        if (isCallValid)
+        {
+            context->queryCounter(idPacked, targetPacked);
+        }
+        ANGLE_CAPTURE(QueryCounter, isCallValid, context, idPacked, targetPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY SamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLSamplerParameterIiv,
+          "context = %d, sampler = %u, pname = %s, param = 0x%016" PRIxPTR "", CID(context),
+          sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)param);
+
+    if (context)
+    {
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateSamplerParameterIiv(context, samplerPacked, pname, param));
+        if (isCallValid)
+        {
+            context->samplerParameterIiv(samplerPacked, pname, param);
+        }
+        ANGLE_CAPTURE(SamplerParameterIiv, isCallValid, context, samplerPacked, pname, param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY SamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLSamplerParameterIuiv,
+          "context = %d, sampler = %u, pname = %s, param = 0x%016" PRIxPTR "", CID(context),
+          sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)param);
+
+    if (context)
+    {
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateSamplerParameterIuiv(context, samplerPacked, pname, param));
+        if (isCallValid)
+        {
+            context->samplerParameterIuiv(samplerPacked, pname, param);
+        }
+        ANGLE_CAPTURE(SamplerParameterIuiv, isCallValid, context, samplerPacked, pname, param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY SamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLSamplerParameterf, "context = %d, sampler = %u, pname = %s, param = %f",
+          CID(context), sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), param);
+
+    if (context)
+    {
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateSamplerParameterf(context, samplerPacked, pname, param));
+        if (isCallValid)
+        {
+            context->samplerParameterf(samplerPacked, pname, param);
+        }
+        ANGLE_CAPTURE(SamplerParameterf, isCallValid, context, samplerPacked, pname, param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY SamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLSamplerParameterfv,
+          "context = %d, sampler = %u, pname = %s, param = 0x%016" PRIxPTR "", CID(context),
+          sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)param);
+
+    if (context)
+    {
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateSamplerParameterfv(context, samplerPacked, pname, param));
+        if (isCallValid)
+        {
+            context->samplerParameterfv(samplerPacked, pname, param);
+        }
+        ANGLE_CAPTURE(SamplerParameterfv, isCallValid, context, samplerPacked, pname, param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY SamplerParameteri(GLuint sampler, GLenum pname, GLint param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLSamplerParameteri, "context = %d, sampler = %u, pname = %s, param = %d",
+          CID(context), sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), param);
+
+    if (context)
+    {
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateSamplerParameteri(context, samplerPacked, pname, param));
+        if (isCallValid)
+        {
+            context->samplerParameteri(samplerPacked, pname, param);
+        }
+        ANGLE_CAPTURE(SamplerParameteri, isCallValid, context, samplerPacked, pname, param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY SamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLSamplerParameteriv,
+          "context = %d, sampler = %u, pname = %s, param = 0x%016" PRIxPTR "", CID(context),
+          sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)param);
+
+    if (context)
+    {
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateSamplerParameteriv(context, samplerPacked, pname, param));
+        if (isCallValid)
+        {
+            context->samplerParameteriv(samplerPacked, pname, param);
+        }
+        ANGLE_CAPTURE(SamplerParameteriv, isCallValid, context, samplerPacked, pname, param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY SecondaryColorP3ui(GLenum type, GLuint color)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLSecondaryColorP3ui, "context = %d, type = %s, color = %u", CID(context),
+          GLenumToString(GLenumGroup::ColorPointerType, type), color);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateSecondaryColorP3ui(context, type, color));
+        if (isCallValid)
+        {
+            context->secondaryColorP3ui(type, color);
+        }
+        ANGLE_CAPTURE(SecondaryColorP3ui, isCallValid, context, type, color);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY SecondaryColorP3uiv(GLenum type, const GLuint *color)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLSecondaryColorP3uiv, "context = %d, type = %s, color = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::ColorPointerType, type), (uintptr_t)color);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateSecondaryColorP3uiv(context, type, color));
+        if (isCallValid)
+        {
+            context->secondaryColorP3uiv(type, color);
+        }
+        ANGLE_CAPTURE(SecondaryColorP3uiv, isCallValid, context, type, color);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoordP1ui(GLenum type, GLuint coords)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoordP1ui, "context = %d, type = %s, coords = %u", CID(context),
+          GLenumToString(GLenumGroup::TexCoordPointerType, type), coords);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateTexCoordP1ui(context, type, coords));
+        if (isCallValid)
+        {
+            context->texCoordP1ui(type, coords);
+        }
+        ANGLE_CAPTURE(TexCoordP1ui, isCallValid, context, type, coords);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoordP1uiv(GLenum type, const GLuint *coords)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoordP1uiv, "context = %d, type = %s, coords = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TexCoordPointerType, type), (uintptr_t)coords);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateTexCoordP1uiv(context, type, coords));
+        if (isCallValid)
+        {
+            context->texCoordP1uiv(type, coords);
+        }
+        ANGLE_CAPTURE(TexCoordP1uiv, isCallValid, context, type, coords);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoordP2ui(GLenum type, GLuint coords)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoordP2ui, "context = %d, type = %s, coords = %u", CID(context),
+          GLenumToString(GLenumGroup::TexCoordPointerType, type), coords);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateTexCoordP2ui(context, type, coords));
+        if (isCallValid)
+        {
+            context->texCoordP2ui(type, coords);
+        }
+        ANGLE_CAPTURE(TexCoordP2ui, isCallValid, context, type, coords);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoordP2uiv(GLenum type, const GLuint *coords)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoordP2uiv, "context = %d, type = %s, coords = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TexCoordPointerType, type), (uintptr_t)coords);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateTexCoordP2uiv(context, type, coords));
+        if (isCallValid)
+        {
+            context->texCoordP2uiv(type, coords);
+        }
+        ANGLE_CAPTURE(TexCoordP2uiv, isCallValid, context, type, coords);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoordP3ui(GLenum type, GLuint coords)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoordP3ui, "context = %d, type = %s, coords = %u", CID(context),
+          GLenumToString(GLenumGroup::TexCoordPointerType, type), coords);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateTexCoordP3ui(context, type, coords));
+        if (isCallValid)
+        {
+            context->texCoordP3ui(type, coords);
+        }
+        ANGLE_CAPTURE(TexCoordP3ui, isCallValid, context, type, coords);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoordP3uiv(GLenum type, const GLuint *coords)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoordP3uiv, "context = %d, type = %s, coords = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TexCoordPointerType, type), (uintptr_t)coords);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateTexCoordP3uiv(context, type, coords));
+        if (isCallValid)
+        {
+            context->texCoordP3uiv(type, coords);
+        }
+        ANGLE_CAPTURE(TexCoordP3uiv, isCallValid, context, type, coords);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoordP4ui(GLenum type, GLuint coords)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoordP4ui, "context = %d, type = %s, coords = %u", CID(context),
+          GLenumToString(GLenumGroup::TexCoordPointerType, type), coords);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateTexCoordP4ui(context, type, coords));
+        if (isCallValid)
+        {
+            context->texCoordP4ui(type, coords);
+        }
+        ANGLE_CAPTURE(TexCoordP4ui, isCallValid, context, type, coords);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexCoordP4uiv(GLenum type, const GLuint *coords)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexCoordP4uiv, "context = %d, type = %s, coords = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TexCoordPointerType, type), (uintptr_t)coords);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateTexCoordP4uiv(context, type, coords));
+        if (isCallValid)
+        {
+            context->texCoordP4uiv(type, coords);
+        }
+        ANGLE_CAPTURE(TexCoordP4uiv, isCallValid, context, type, coords);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribDivisor(GLuint index, GLuint divisor)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribDivisor, "context = %d, index = %u, divisor = %u", CID(context),
+          index, divisor);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateVertexAttribDivisor(context, index, divisor));
+        if (isCallValid)
+        {
+            context->vertexAttribDivisor(index, divisor);
+        }
+        ANGLE_CAPTURE(VertexAttribDivisor, isCallValid, context, index, divisor);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribP1ui,
+          "context = %d, index = %u, type = %s, normalized = %s, value = %u", CID(context), index,
+          GLenumToString(GLenumGroup::VertexAttribPointerType, type), GLbooleanToString(normalized),
+          value);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateVertexAttribP1ui(context, index, type, normalized, value));
+        if (isCallValid)
+        {
+            context->vertexAttribP1ui(index, type, normalized, value);
+        }
+        ANGLE_CAPTURE(VertexAttribP1ui, isCallValid, context, index, type, normalized, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribP1uiv(GLuint index,
+                                   GLenum type,
+                                   GLboolean normalized,
+                                   const GLuint *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribP1uiv,
+          "context = %d, index = %u, type = %s, normalized = %s, value = 0x%016" PRIxPTR "",
+          CID(context), index, GLenumToString(GLenumGroup::VertexAttribPointerType, type),
+          GLbooleanToString(normalized), (uintptr_t)value);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateVertexAttribP1uiv(context, index, type, normalized, value));
+        if (isCallValid)
+        {
+            context->vertexAttribP1uiv(index, type, normalized, value);
+        }
+        ANGLE_CAPTURE(VertexAttribP1uiv, isCallValid, context, index, type, normalized, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribP2ui,
+          "context = %d, index = %u, type = %s, normalized = %s, value = %u", CID(context), index,
+          GLenumToString(GLenumGroup::VertexAttribPointerType, type), GLbooleanToString(normalized),
+          value);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateVertexAttribP2ui(context, index, type, normalized, value));
+        if (isCallValid)
+        {
+            context->vertexAttribP2ui(index, type, normalized, value);
+        }
+        ANGLE_CAPTURE(VertexAttribP2ui, isCallValid, context, index, type, normalized, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribP2uiv(GLuint index,
+                                   GLenum type,
+                                   GLboolean normalized,
+                                   const GLuint *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribP2uiv,
+          "context = %d, index = %u, type = %s, normalized = %s, value = 0x%016" PRIxPTR "",
+          CID(context), index, GLenumToString(GLenumGroup::VertexAttribPointerType, type),
+          GLbooleanToString(normalized), (uintptr_t)value);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateVertexAttribP2uiv(context, index, type, normalized, value));
+        if (isCallValid)
+        {
+            context->vertexAttribP2uiv(index, type, normalized, value);
+        }
+        ANGLE_CAPTURE(VertexAttribP2uiv, isCallValid, context, index, type, normalized, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribP3ui,
+          "context = %d, index = %u, type = %s, normalized = %s, value = %u", CID(context), index,
+          GLenumToString(GLenumGroup::VertexAttribPointerType, type), GLbooleanToString(normalized),
+          value);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateVertexAttribP3ui(context, index, type, normalized, value));
+        if (isCallValid)
+        {
+            context->vertexAttribP3ui(index, type, normalized, value);
+        }
+        ANGLE_CAPTURE(VertexAttribP3ui, isCallValid, context, index, type, normalized, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribP3uiv(GLuint index,
+                                   GLenum type,
+                                   GLboolean normalized,
+                                   const GLuint *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribP3uiv,
+          "context = %d, index = %u, type = %s, normalized = %s, value = 0x%016" PRIxPTR "",
+          CID(context), index, GLenumToString(GLenumGroup::VertexAttribPointerType, type),
+          GLbooleanToString(normalized), (uintptr_t)value);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateVertexAttribP3uiv(context, index, type, normalized, value));
+        if (isCallValid)
+        {
+            context->vertexAttribP3uiv(index, type, normalized, value);
+        }
+        ANGLE_CAPTURE(VertexAttribP3uiv, isCallValid, context, index, type, normalized, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribP4ui,
+          "context = %d, index = %u, type = %s, normalized = %s, value = %u", CID(context), index,
+          GLenumToString(GLenumGroup::VertexAttribPointerType, type), GLbooleanToString(normalized),
+          value);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateVertexAttribP4ui(context, index, type, normalized, value));
+        if (isCallValid)
+        {
+            context->vertexAttribP4ui(index, type, normalized, value);
+        }
+        ANGLE_CAPTURE(VertexAttribP4ui, isCallValid, context, index, type, normalized, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribP4uiv(GLuint index,
+                                   GLenum type,
+                                   GLboolean normalized,
+                                   const GLuint *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribP4uiv,
+          "context = %d, index = %u, type = %s, normalized = %s, value = 0x%016" PRIxPTR "",
+          CID(context), index, GLenumToString(GLenumGroup::VertexAttribPointerType, type),
+          GLbooleanToString(normalized), (uintptr_t)value);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateVertexAttribP4uiv(context, index, type, normalized, value));
+        if (isCallValid)
+        {
+            context->vertexAttribP4uiv(index, type, normalized, value);
+        }
+        ANGLE_CAPTURE(VertexAttribP4uiv, isCallValid, context, index, type, normalized, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexP2ui(GLenum type, GLuint value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexP2ui, "context = %d, type = %s, value = %u", CID(context),
+          GLenumToString(GLenumGroup::VertexPointerType, type), value);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateVertexP2ui(context, type, value));
+        if (isCallValid)
+        {
+            context->vertexP2ui(type, value);
+        }
+        ANGLE_CAPTURE(VertexP2ui, isCallValid, context, type, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexP2uiv(GLenum type, const GLuint *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexP2uiv, "context = %d, type = %s, value = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::VertexPointerType, type), (uintptr_t)value);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateVertexP2uiv(context, type, value));
+        if (isCallValid)
+        {
+            context->vertexP2uiv(type, value);
+        }
+        ANGLE_CAPTURE(VertexP2uiv, isCallValid, context, type, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexP3ui(GLenum type, GLuint value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexP3ui, "context = %d, type = %s, value = %u", CID(context),
+          GLenumToString(GLenumGroup::VertexPointerType, type), value);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateVertexP3ui(context, type, value));
+        if (isCallValid)
+        {
+            context->vertexP3ui(type, value);
+        }
+        ANGLE_CAPTURE(VertexP3ui, isCallValid, context, type, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexP3uiv(GLenum type, const GLuint *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexP3uiv, "context = %d, type = %s, value = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::VertexPointerType, type), (uintptr_t)value);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateVertexP3uiv(context, type, value));
+        if (isCallValid)
+        {
+            context->vertexP3uiv(type, value);
+        }
+        ANGLE_CAPTURE(VertexP3uiv, isCallValid, context, type, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexP4ui(GLenum type, GLuint value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexP4ui, "context = %d, type = %s, value = %u", CID(context),
+          GLenumToString(GLenumGroup::VertexPointerType, type), value);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateVertexP4ui(context, type, value));
+        if (isCallValid)
+        {
+            context->vertexP4ui(type, value);
+        }
+        ANGLE_CAPTURE(VertexP4ui, isCallValid, context, type, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexP4uiv(GLenum type, const GLuint *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexP4uiv, "context = %d, type = %s, value = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::VertexPointerType, type), (uintptr_t)value);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateVertexP4uiv(context, type, value));
+        if (isCallValid)
+        {
+            context->vertexP4uiv(type, value);
+        }
+        ANGLE_CAPTURE(VertexP4uiv, isCallValid, context, type, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+}  // namespace gl
diff --git a/src/libGL/entry_points_gl_3_autogen.h b/src/libGL/entry_points_gl_3_autogen.h
new file mode 100644
index 0000000..8227a92
--- /dev/null
+++ b/src/libGL/entry_points_gl_3_autogen.h
@@ -0,0 +1,362 @@
+// GENERATED FILE - DO NOT EDIT.
+// Generated by generate_entry_points.py using data from gl.xml.
+//
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// entry_points_gl_3_autogen.h:
+//   Defines the Desktop GL 3.x entry points.
+
+#ifndef LIBGL_ENTRY_POINTS_GL_3_AUTOGEN_H_
+#define LIBGL_ENTRY_POINTS_GL_3_AUTOGEN_H_
+
+#include <export.h>
+#include "angle_gl.h"
+
+namespace gl
+{
+
+// GL 3.0
+ANGLE_EXPORT void GL_APIENTRY BeginConditionalRender(GLuint id, GLenum mode);
+ANGLE_EXPORT void GL_APIENTRY BeginTransformFeedback(GLenum primitiveMode);
+ANGLE_EXPORT void GL_APIENTRY BindBufferBase(GLenum target, GLuint index, GLuint buffer);
+ANGLE_EXPORT void GL_APIENTRY
+BindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+ANGLE_EXPORT void GL_APIENTRY BindFragDataLocation(GLuint program,
+                                                   GLuint color,
+                                                   const GLchar *name);
+ANGLE_EXPORT void GL_APIENTRY BindFramebuffer(GLenum target, GLuint framebuffer);
+ANGLE_EXPORT void GL_APIENTRY BindRenderbuffer(GLenum target, GLuint renderbuffer);
+ANGLE_EXPORT void GL_APIENTRY BindVertexArray(GLuint array);
+ANGLE_EXPORT void GL_APIENTRY BlitFramebuffer(GLint srcX0,
+                                              GLint srcY0,
+                                              GLint srcX1,
+                                              GLint srcY1,
+                                              GLint dstX0,
+                                              GLint dstY0,
+                                              GLint dstX1,
+                                              GLint dstY1,
+                                              GLbitfield mask,
+                                              GLenum filter);
+ANGLE_EXPORT GLenum GL_APIENTRY CheckFramebufferStatus(GLenum target);
+ANGLE_EXPORT void GL_APIENTRY ClampColor(GLenum target, GLenum clamp);
+ANGLE_EXPORT void GL_APIENTRY ClearBufferfi(GLenum buffer,
+                                            GLint drawbuffer,
+                                            GLfloat depth,
+                                            GLint stencil);
+ANGLE_EXPORT void GL_APIENTRY ClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value);
+ANGLE_EXPORT void GL_APIENTRY ClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value);
+ANGLE_EXPORT void GL_APIENTRY ClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value);
+ANGLE_EXPORT void GL_APIENTRY
+ColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+ANGLE_EXPORT void GL_APIENTRY DeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
+ANGLE_EXPORT void GL_APIENTRY DeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
+ANGLE_EXPORT void GL_APIENTRY DeleteVertexArrays(GLsizei n, const GLuint *arrays);
+ANGLE_EXPORT void GL_APIENTRY Disablei(GLenum target, GLuint index);
+ANGLE_EXPORT void GL_APIENTRY Enablei(GLenum target, GLuint index);
+ANGLE_EXPORT void GL_APIENTRY EndConditionalRender();
+ANGLE_EXPORT void GL_APIENTRY EndTransformFeedback();
+ANGLE_EXPORT void GL_APIENTRY FlushMappedBufferRange(GLenum target,
+                                                     GLintptr offset,
+                                                     GLsizeiptr length);
+ANGLE_EXPORT void GL_APIENTRY FramebufferRenderbuffer(GLenum target,
+                                                      GLenum attachment,
+                                                      GLenum renderbuffertarget,
+                                                      GLuint renderbuffer);
+ANGLE_EXPORT void GL_APIENTRY FramebufferTexture1D(GLenum target,
+                                                   GLenum attachment,
+                                                   GLenum textarget,
+                                                   GLuint texture,
+                                                   GLint level);
+ANGLE_EXPORT void GL_APIENTRY FramebufferTexture2D(GLenum target,
+                                                   GLenum attachment,
+                                                   GLenum textarget,
+                                                   GLuint texture,
+                                                   GLint level);
+ANGLE_EXPORT void GL_APIENTRY FramebufferTexture3D(GLenum target,
+                                                   GLenum attachment,
+                                                   GLenum textarget,
+                                                   GLuint texture,
+                                                   GLint level,
+                                                   GLint zoffset);
+ANGLE_EXPORT void GL_APIENTRY
+FramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+ANGLE_EXPORT void GL_APIENTRY GenFramebuffers(GLsizei n, GLuint *framebuffers);
+ANGLE_EXPORT void GL_APIENTRY GenRenderbuffers(GLsizei n, GLuint *renderbuffers);
+ANGLE_EXPORT void GL_APIENTRY GenVertexArrays(GLsizei n, GLuint *arrays);
+ANGLE_EXPORT void GL_APIENTRY GenerateMipmap(GLenum target);
+ANGLE_EXPORT void GL_APIENTRY GetBooleani_v(GLenum target, GLuint index, GLboolean *data);
+ANGLE_EXPORT GLint GL_APIENTRY GetFragDataLocation(GLuint program, const GLchar *name);
+ANGLE_EXPORT void GL_APIENTRY GetFramebufferAttachmentParameteriv(GLenum target,
+                                                                  GLenum attachment,
+                                                                  GLenum pname,
+                                                                  GLint *params);
+ANGLE_EXPORT void GL_APIENTRY GetIntegeri_v(GLenum target, GLuint index, GLint *data);
+ANGLE_EXPORT void GL_APIENTRY GetRenderbufferParameteriv(GLenum target,
+                                                         GLenum pname,
+                                                         GLint *params);
+ANGLE_EXPORT const GLubyte *GL_APIENTRY GetStringi(GLenum name, GLuint index);
+ANGLE_EXPORT void GL_APIENTRY GetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
+ANGLE_EXPORT void GL_APIENTRY GetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
+ANGLE_EXPORT void GL_APIENTRY GetTransformFeedbackVarying(GLuint program,
+                                                          GLuint index,
+                                                          GLsizei bufSize,
+                                                          GLsizei *length,
+                                                          GLsizei *size,
+                                                          GLenum *type,
+                                                          GLchar *name);
+ANGLE_EXPORT void GL_APIENTRY GetUniformuiv(GLuint program, GLint location, GLuint *params);
+ANGLE_EXPORT void GL_APIENTRY GetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
+ANGLE_EXPORT void GL_APIENTRY GetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
+ANGLE_EXPORT GLboolean GL_APIENTRY IsEnabledi(GLenum target, GLuint index);
+ANGLE_EXPORT GLboolean GL_APIENTRY IsFramebuffer(GLuint framebuffer);
+ANGLE_EXPORT GLboolean GL_APIENTRY IsRenderbuffer(GLuint renderbuffer);
+ANGLE_EXPORT GLboolean GL_APIENTRY IsVertexArray(GLuint array);
+ANGLE_EXPORT void *GL_APIENTRY MapBufferRange(GLenum target,
+                                              GLintptr offset,
+                                              GLsizeiptr length,
+                                              GLbitfield access);
+ANGLE_EXPORT void GL_APIENTRY RenderbufferStorage(GLenum target,
+                                                  GLenum internalformat,
+                                                  GLsizei width,
+                                                  GLsizei height);
+ANGLE_EXPORT void GL_APIENTRY RenderbufferStorageMultisample(GLenum target,
+                                                             GLsizei samples,
+                                                             GLenum internalformat,
+                                                             GLsizei width,
+                                                             GLsizei height);
+ANGLE_EXPORT void GL_APIENTRY TexParameterIiv(GLenum target, GLenum pname, const GLint *params);
+ANGLE_EXPORT void GL_APIENTRY TexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
+ANGLE_EXPORT void GL_APIENTRY TransformFeedbackVaryings(GLuint program,
+                                                        GLsizei count,
+                                                        const GLchar *const *varyings,
+                                                        GLenum bufferMode);
+ANGLE_EXPORT void GL_APIENTRY Uniform1ui(GLint location, GLuint v0);
+ANGLE_EXPORT void GL_APIENTRY Uniform1uiv(GLint location, GLsizei count, const GLuint *value);
+ANGLE_EXPORT void GL_APIENTRY Uniform2ui(GLint location, GLuint v0, GLuint v1);
+ANGLE_EXPORT void GL_APIENTRY Uniform2uiv(GLint location, GLsizei count, const GLuint *value);
+ANGLE_EXPORT void GL_APIENTRY Uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
+ANGLE_EXPORT void GL_APIENTRY Uniform3uiv(GLint location, GLsizei count, const GLuint *value);
+ANGLE_EXPORT void GL_APIENTRY
+Uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+ANGLE_EXPORT void GL_APIENTRY Uniform4uiv(GLint location, GLsizei count, const GLuint *value);
+ANGLE_EXPORT void GL_APIENTRY VertexAttribI1i(GLuint index, GLint x);
+ANGLE_EXPORT void GL_APIENTRY VertexAttribI1iv(GLuint index, const GLint *v);
+ANGLE_EXPORT void GL_APIENTRY VertexAttribI1ui(GLuint index, GLuint x);
+ANGLE_EXPORT void GL_APIENTRY VertexAttribI1uiv(GLuint index, const GLuint *v);
+ANGLE_EXPORT void GL_APIENTRY VertexAttribI2i(GLuint index, GLint x, GLint y);
+ANGLE_EXPORT void GL_APIENTRY VertexAttribI2iv(GLuint index, const GLint *v);
+ANGLE_EXPORT void GL_APIENTRY VertexAttribI2ui(GLuint index, GLuint x, GLuint y);
+ANGLE_EXPORT void GL_APIENTRY VertexAttribI2uiv(GLuint index, const GLuint *v);
+ANGLE_EXPORT void GL_APIENTRY VertexAttribI3i(GLuint index, GLint x, GLint y, GLint z);
+ANGLE_EXPORT void GL_APIENTRY VertexAttribI3iv(GLuint index, const GLint *v);
+ANGLE_EXPORT void GL_APIENTRY VertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z);
+ANGLE_EXPORT void GL_APIENTRY VertexAttribI3uiv(GLuint index, const GLuint *v);
+ANGLE_EXPORT void GL_APIENTRY VertexAttribI4bv(GLuint index, const GLbyte *v);
+ANGLE_EXPORT void GL_APIENTRY VertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w);
+ANGLE_EXPORT void GL_APIENTRY VertexAttribI4iv(GLuint index, const GLint *v);
+ANGLE_EXPORT void GL_APIENTRY VertexAttribI4sv(GLuint index, const GLshort *v);
+ANGLE_EXPORT void GL_APIENTRY VertexAttribI4ubv(GLuint index, const GLubyte *v);
+ANGLE_EXPORT void GL_APIENTRY
+VertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+ANGLE_EXPORT void GL_APIENTRY VertexAttribI4uiv(GLuint index, const GLuint *v);
+ANGLE_EXPORT void GL_APIENTRY VertexAttribI4usv(GLuint index, const GLushort *v);
+ANGLE_EXPORT void GL_APIENTRY
+VertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
+
+// GL 3.1
+ANGLE_EXPORT void GL_APIENTRY CopyBufferSubData(GLenum readTarget,
+                                                GLenum writeTarget,
+                                                GLintptr readOffset,
+                                                GLintptr writeOffset,
+                                                GLsizeiptr size);
+ANGLE_EXPORT void GL_APIENTRY DrawArraysInstanced(GLenum mode,
+                                                  GLint first,
+                                                  GLsizei count,
+                                                  GLsizei instancecount);
+ANGLE_EXPORT void GL_APIENTRY DrawElementsInstanced(GLenum mode,
+                                                    GLsizei count,
+                                                    GLenum type,
+                                                    const void *indices,
+                                                    GLsizei instancecount);
+ANGLE_EXPORT void GL_APIENTRY GetActiveUniformBlockName(GLuint program,
+                                                        GLuint uniformBlockIndex,
+                                                        GLsizei bufSize,
+                                                        GLsizei *length,
+                                                        GLchar *uniformBlockName);
+ANGLE_EXPORT void GL_APIENTRY GetActiveUniformBlockiv(GLuint program,
+                                                      GLuint uniformBlockIndex,
+                                                      GLenum pname,
+                                                      GLint *params);
+ANGLE_EXPORT void GL_APIENTRY GetActiveUniformName(GLuint program,
+                                                   GLuint uniformIndex,
+                                                   GLsizei bufSize,
+                                                   GLsizei *length,
+                                                   GLchar *uniformName);
+ANGLE_EXPORT void GL_APIENTRY GetActiveUniformsiv(GLuint program,
+                                                  GLsizei uniformCount,
+                                                  const GLuint *uniformIndices,
+                                                  GLenum pname,
+                                                  GLint *params);
+ANGLE_EXPORT GLuint GL_APIENTRY GetUniformBlockIndex(GLuint program,
+                                                     const GLchar *uniformBlockName);
+ANGLE_EXPORT void GL_APIENTRY GetUniformIndices(GLuint program,
+                                                GLsizei uniformCount,
+                                                const GLchar *const *uniformNames,
+                                                GLuint *uniformIndices);
+ANGLE_EXPORT void GL_APIENTRY PrimitiveRestartIndex(GLuint index);
+ANGLE_EXPORT void GL_APIENTRY TexBuffer(GLenum target, GLenum internalformat, GLuint buffer);
+ANGLE_EXPORT void GL_APIENTRY UniformBlockBinding(GLuint program,
+                                                  GLuint uniformBlockIndex,
+                                                  GLuint uniformBlockBinding);
+
+// GL 3.2
+ANGLE_EXPORT GLenum GL_APIENTRY ClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
+ANGLE_EXPORT void GL_APIENTRY DeleteSync(GLsync sync);
+ANGLE_EXPORT void GL_APIENTRY DrawElementsBaseVertex(GLenum mode,
+                                                     GLsizei count,
+                                                     GLenum type,
+                                                     const void *indices,
+                                                     GLint basevertex);
+ANGLE_EXPORT void GL_APIENTRY DrawElementsInstancedBaseVertex(GLenum mode,
+                                                              GLsizei count,
+                                                              GLenum type,
+                                                              const void *indices,
+                                                              GLsizei instancecount,
+                                                              GLint basevertex);
+ANGLE_EXPORT void GL_APIENTRY DrawRangeElementsBaseVertex(GLenum mode,
+                                                          GLuint start,
+                                                          GLuint end,
+                                                          GLsizei count,
+                                                          GLenum type,
+                                                          const void *indices,
+                                                          GLint basevertex);
+ANGLE_EXPORT GLsync GL_APIENTRY FenceSync(GLenum condition, GLbitfield flags);
+ANGLE_EXPORT void GL_APIENTRY FramebufferTexture(GLenum target,
+                                                 GLenum attachment,
+                                                 GLuint texture,
+                                                 GLint level);
+ANGLE_EXPORT void GL_APIENTRY GetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params);
+ANGLE_EXPORT void GL_APIENTRY GetInteger64i_v(GLenum target, GLuint index, GLint64 *data);
+ANGLE_EXPORT void GL_APIENTRY GetInteger64v(GLenum pname, GLint64 *data);
+ANGLE_EXPORT void GL_APIENTRY GetMultisamplefv(GLenum pname, GLuint index, GLfloat *val);
+ANGLE_EXPORT void GL_APIENTRY
+GetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+ANGLE_EXPORT GLboolean GL_APIENTRY IsSync(GLsync sync);
+ANGLE_EXPORT void GL_APIENTRY MultiDrawElementsBaseVertex(GLenum mode,
+                                                          const GLsizei *count,
+                                                          GLenum type,
+                                                          const void *const *indices,
+                                                          GLsizei drawcount,
+                                                          const GLint *basevertex);
+ANGLE_EXPORT void GL_APIENTRY ProvokingVertex(GLenum mode);
+ANGLE_EXPORT void GL_APIENTRY SampleMaski(GLuint maskNumber, GLbitfield mask);
+ANGLE_EXPORT void GL_APIENTRY TexImage2DMultisample(GLenum target,
+                                                    GLsizei samples,
+                                                    GLenum internalformat,
+                                                    GLsizei width,
+                                                    GLsizei height,
+                                                    GLboolean fixedsamplelocations);
+ANGLE_EXPORT void GL_APIENTRY TexImage3DMultisample(GLenum target,
+                                                    GLsizei samples,
+                                                    GLenum internalformat,
+                                                    GLsizei width,
+                                                    GLsizei height,
+                                                    GLsizei depth,
+                                                    GLboolean fixedsamplelocations);
+ANGLE_EXPORT void GL_APIENTRY WaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
+
+// GL 3.3
+ANGLE_EXPORT void GL_APIENTRY BindFragDataLocationIndexed(GLuint program,
+                                                          GLuint colorNumber,
+                                                          GLuint index,
+                                                          const GLchar *name);
+ANGLE_EXPORT void GL_APIENTRY BindSampler(GLuint unit, GLuint sampler);
+ANGLE_EXPORT void GL_APIENTRY ColorP3ui(GLenum type, GLuint color);
+ANGLE_EXPORT void GL_APIENTRY ColorP3uiv(GLenum type, const GLuint *color);
+ANGLE_EXPORT void GL_APIENTRY ColorP4ui(GLenum type, GLuint color);
+ANGLE_EXPORT void GL_APIENTRY ColorP4uiv(GLenum type, const GLuint *color);
+ANGLE_EXPORT void GL_APIENTRY DeleteSamplers(GLsizei count, const GLuint *samplers);
+ANGLE_EXPORT void GL_APIENTRY GenSamplers(GLsizei count, GLuint *samplers);
+ANGLE_EXPORT GLint GL_APIENTRY GetFragDataIndex(GLuint program, const GLchar *name);
+ANGLE_EXPORT void GL_APIENTRY GetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params);
+ANGLE_EXPORT void GL_APIENTRY GetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params);
+ANGLE_EXPORT void GL_APIENTRY GetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params);
+ANGLE_EXPORT void GL_APIENTRY GetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params);
+ANGLE_EXPORT void GL_APIENTRY GetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params);
+ANGLE_EXPORT void GL_APIENTRY GetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params);
+ANGLE_EXPORT GLboolean GL_APIENTRY IsSampler(GLuint sampler);
+ANGLE_EXPORT void GL_APIENTRY MultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords);
+ANGLE_EXPORT void GL_APIENTRY MultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords);
+ANGLE_EXPORT void GL_APIENTRY MultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords);
+ANGLE_EXPORT void GL_APIENTRY MultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords);
+ANGLE_EXPORT void GL_APIENTRY MultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords);
+ANGLE_EXPORT void GL_APIENTRY MultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords);
+ANGLE_EXPORT void GL_APIENTRY MultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords);
+ANGLE_EXPORT void GL_APIENTRY MultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords);
+ANGLE_EXPORT void GL_APIENTRY NormalP3ui(GLenum type, GLuint coords);
+ANGLE_EXPORT void GL_APIENTRY NormalP3uiv(GLenum type, const GLuint *coords);
+ANGLE_EXPORT void GL_APIENTRY QueryCounter(GLuint id, GLenum target);
+ANGLE_EXPORT void GL_APIENTRY SamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param);
+ANGLE_EXPORT void GL_APIENTRY SamplerParameterIuiv(GLuint sampler,
+                                                   GLenum pname,
+                                                   const GLuint *param);
+ANGLE_EXPORT void GL_APIENTRY SamplerParameterf(GLuint sampler, GLenum pname, GLfloat param);
+ANGLE_EXPORT void GL_APIENTRY SamplerParameterfv(GLuint sampler,
+                                                 GLenum pname,
+                                                 const GLfloat *param);
+ANGLE_EXPORT void GL_APIENTRY SamplerParameteri(GLuint sampler, GLenum pname, GLint param);
+ANGLE_EXPORT void GL_APIENTRY SamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param);
+ANGLE_EXPORT void GL_APIENTRY SecondaryColorP3ui(GLenum type, GLuint color);
+ANGLE_EXPORT void GL_APIENTRY SecondaryColorP3uiv(GLenum type, const GLuint *color);
+ANGLE_EXPORT void GL_APIENTRY TexCoordP1ui(GLenum type, GLuint coords);
+ANGLE_EXPORT void GL_APIENTRY TexCoordP1uiv(GLenum type, const GLuint *coords);
+ANGLE_EXPORT void GL_APIENTRY TexCoordP2ui(GLenum type, GLuint coords);
+ANGLE_EXPORT void GL_APIENTRY TexCoordP2uiv(GLenum type, const GLuint *coords);
+ANGLE_EXPORT void GL_APIENTRY TexCoordP3ui(GLenum type, GLuint coords);
+ANGLE_EXPORT void GL_APIENTRY TexCoordP3uiv(GLenum type, const GLuint *coords);
+ANGLE_EXPORT void GL_APIENTRY TexCoordP4ui(GLenum type, GLuint coords);
+ANGLE_EXPORT void GL_APIENTRY TexCoordP4uiv(GLenum type, const GLuint *coords);
+ANGLE_EXPORT void GL_APIENTRY VertexAttribDivisor(GLuint index, GLuint divisor);
+ANGLE_EXPORT void GL_APIENTRY VertexAttribP1ui(GLuint index,
+                                               GLenum type,
+                                               GLboolean normalized,
+                                               GLuint value);
+ANGLE_EXPORT void GL_APIENTRY VertexAttribP1uiv(GLuint index,
+                                                GLenum type,
+                                                GLboolean normalized,
+                                                const GLuint *value);
+ANGLE_EXPORT void GL_APIENTRY VertexAttribP2ui(GLuint index,
+                                               GLenum type,
+                                               GLboolean normalized,
+                                               GLuint value);
+ANGLE_EXPORT void GL_APIENTRY VertexAttribP2uiv(GLuint index,
+                                                GLenum type,
+                                                GLboolean normalized,
+                                                const GLuint *value);
+ANGLE_EXPORT void GL_APIENTRY VertexAttribP3ui(GLuint index,
+                                               GLenum type,
+                                               GLboolean normalized,
+                                               GLuint value);
+ANGLE_EXPORT void GL_APIENTRY VertexAttribP3uiv(GLuint index,
+                                                GLenum type,
+                                                GLboolean normalized,
+                                                const GLuint *value);
+ANGLE_EXPORT void GL_APIENTRY VertexAttribP4ui(GLuint index,
+                                               GLenum type,
+                                               GLboolean normalized,
+                                               GLuint value);
+ANGLE_EXPORT void GL_APIENTRY VertexAttribP4uiv(GLuint index,
+                                                GLenum type,
+                                                GLboolean normalized,
+                                                const GLuint *value);
+ANGLE_EXPORT void GL_APIENTRY VertexP2ui(GLenum type, GLuint value);
+ANGLE_EXPORT void GL_APIENTRY VertexP2uiv(GLenum type, const GLuint *value);
+ANGLE_EXPORT void GL_APIENTRY VertexP3ui(GLenum type, GLuint value);
+ANGLE_EXPORT void GL_APIENTRY VertexP3uiv(GLenum type, const GLuint *value);
+ANGLE_EXPORT void GL_APIENTRY VertexP4ui(GLenum type, GLuint value);
+ANGLE_EXPORT void GL_APIENTRY VertexP4uiv(GLenum type, const GLuint *value);
+}  // namespace gl
+
+#endif  // LIBGL_ENTRY_POINTS_GL_3_AUTOGEN_H_
diff --git a/src/libGL/entry_points_gl_4_0_autogen.cpp b/src/libGL/entry_points_gl_4_0_autogen.cpp
deleted file mode 100644
index d0843f6..0000000
--- a/src/libGL/entry_points_gl_4_0_autogen.cpp
+++ /dev/null
@@ -1,1270 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// entry_points_gl_4_0_autogen.cpp:
-//   Defines the GL 4.0 entry points.
-
-#include "libGL/entry_points_gl_4_0_autogen.h"
-
-#include "libANGLE/Context.h"
-#include "libANGLE/Context.inl.h"
-#include "libANGLE/entry_points_utils.h"
-#include "libANGLE/gl_enum_utils.h"
-#include "libANGLE/validationEGL.h"
-#include "libANGLE/validationES.h"
-#include "libANGLE/validationES1.h"
-#include "libANGLE/validationES2.h"
-#include "libANGLE/validationES3.h"
-#include "libANGLE/validationES31.h"
-#include "libANGLE/validationES32.h"
-#include "libANGLE/validationESEXT.h"
-#include "libANGLE/validationGL4_autogen.h"
-#include "libGLESv2/global_state.h"
-
-namespace gl
-{
-void GL_APIENTRY BeginQueryIndexed(GLenum target, GLuint index, GLuint id)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BeginQueryIndexed, "glBeginQueryIndexed",
-          "context = %d, target = %s, index = %u, id = %u", CID(context),
-          GLenumToString(GLenumGroup::QueryTarget, target), index, id);
-
-    if (context)
-    {
-        QueryID idPacked                                      = FromGL<QueryID>(id);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateBeginQueryIndexed(context, target, index, idPacked));
-        if (isCallValid)
-        {
-            context->beginQueryIndexed(target, index, idPacked);
-        }
-        ANGLE_CAPTURE(BeginQueryIndexed, isCallValid, context, target, index, idPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY BindTransformFeedback(GLenum target, GLuint id)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindTransformFeedback, "glBindTransformFeedback",
-          "context = %d, target = %s, id = %u", CID(context),
-          GLenumToString(GLenumGroup::BindTransformFeedbackTarget, target), id);
-
-    if (context)
-    {
-        TransformFeedbackID idPacked                          = FromGL<TransformFeedbackID>(id);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateBindTransformFeedback(context, target, idPacked));
-        if (isCallValid)
-        {
-            context->bindTransformFeedback(target, idPacked);
-        }
-        ANGLE_CAPTURE(BindTransformFeedback, isCallValid, context, target, idPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY BlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BlendEquationSeparatei, "glBlendEquationSeparatei",
-          "context = %d, buf = %u, modeRGB = %s, modeAlpha = %s", CID(context), buf,
-          GLenumToString(GLenumGroup::BlendEquationModeEXT, modeRGB),
-          GLenumToString(GLenumGroup::BlendEquationModeEXT, modeAlpha));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateBlendEquationSeparatei(context, buf, modeRGB, modeAlpha));
-        if (isCallValid)
-        {
-            context->blendEquationSeparatei(buf, modeRGB, modeAlpha);
-        }
-        ANGLE_CAPTURE(BlendEquationSeparatei, isCallValid, context, buf, modeRGB, modeAlpha);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY BlendEquationi(GLuint buf, GLenum mode)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BlendEquationi, "glBlendEquationi",
-          "context = %d, buf = %u, mode = %s", CID(context), buf,
-          GLenumToString(GLenumGroup::BlendEquationModeEXT, mode));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateBlendEquationi(context, buf, mode));
-        if (isCallValid)
-        {
-            context->blendEquationi(buf, mode);
-        }
-        ANGLE_CAPTURE(BlendEquationi, isCallValid, context, buf, mode);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY
-BlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BlendFuncSeparatei, "glBlendFuncSeparatei",
-          "context = %d, buf = %u, srcRGB = %s, dstRGB = %s, srcAlpha = %s, dstAlpha = %s",
-          CID(context), buf, GLenumToString(GLenumGroup::BlendingFactor, srcRGB),
-          GLenumToString(GLenumGroup::BlendingFactor, dstRGB),
-          GLenumToString(GLenumGroup::BlendingFactor, srcAlpha),
-          GLenumToString(GLenumGroup::BlendingFactor, dstAlpha));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateBlendFuncSeparatei(context, buf, srcRGB, dstRGB, srcAlpha, dstAlpha));
-        if (isCallValid)
-        {
-            context->blendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
-        }
-        ANGLE_CAPTURE(BlendFuncSeparatei, isCallValid, context, buf, srcRGB, dstRGB, srcAlpha,
-                      dstAlpha);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY BlendFunci(GLuint buf, GLenum src, GLenum dst)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BlendFunci, "glBlendFunci",
-          "context = %d, buf = %u, src = %s, dst = %s", CID(context), buf,
-          GLenumToString(GLenumGroup::BlendingFactor, src),
-          GLenumToString(GLenumGroup::BlendingFactor, dst));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateBlendFunci(context, buf, src, dst));
-        if (isCallValid)
-        {
-            context->blendFunci(buf, src, dst);
-        }
-        ANGLE_CAPTURE(BlendFunci, isCallValid, context, buf, src, dst);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DeleteTransformFeedbacks(GLsizei n, const GLuint *ids)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DeleteTransformFeedbacks, "glDeleteTransformFeedbacks",
-          "context = %d, n = %d, ids = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)ids);
-
-    if (context)
-    {
-        const TransformFeedbackID *idsPacked = FromGL<const TransformFeedbackID *>(ids);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateDeleteTransformFeedbacks(context, n, idsPacked));
-        if (isCallValid)
-        {
-            context->deleteTransformFeedbacks(n, idsPacked);
-        }
-        ANGLE_CAPTURE(DeleteTransformFeedbacks, isCallValid, context, n, idsPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DrawArraysIndirect(GLenum mode, const void *indirect)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawArraysIndirect, "glDrawArraysIndirect",
-          "context = %d, mode = %s, indirect = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::PrimitiveType, mode), (uintptr_t)indirect);
-
-    if (context)
-    {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateDrawArraysIndirect(context, modePacked, indirect));
-        if (isCallValid)
-        {
-            context->drawArraysIndirect(modePacked, indirect);
-        }
-        ANGLE_CAPTURE(DrawArraysIndirect, isCallValid, context, modePacked, indirect);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DrawElementsIndirect(GLenum mode, GLenum type, const void *indirect)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawElementsIndirect, "glDrawElementsIndirect",
-          "context = %d, mode = %s, type = %s, indirect = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::PrimitiveType, mode),
-          GLenumToString(GLenumGroup::DrawElementsType, type), (uintptr_t)indirect);
-
-    if (context)
-    {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateDrawElementsIndirect(context, modePacked, typePacked, indirect));
-        if (isCallValid)
-        {
-            context->drawElementsIndirect(modePacked, typePacked, indirect);
-        }
-        ANGLE_CAPTURE(DrawElementsIndirect, isCallValid, context, modePacked, typePacked, indirect);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DrawTransformFeedback(GLenum mode, GLuint id)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawTransformFeedback, "glDrawTransformFeedback",
-          "context = %d, mode = %s, id = %u", CID(context),
-          GLenumToString(GLenumGroup::PrimitiveType, mode), id);
-
-    if (context)
-    {
-        TransformFeedbackID idPacked                          = FromGL<TransformFeedbackID>(id);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateDrawTransformFeedback(context, mode, idPacked));
-        if (isCallValid)
-        {
-            context->drawTransformFeedback(mode, idPacked);
-        }
-        ANGLE_CAPTURE(DrawTransformFeedback, isCallValid, context, mode, idPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawTransformFeedbackStream, "glDrawTransformFeedbackStream",
-          "context = %d, mode = %s, id = %u, stream = %u", CID(context),
-          GLenumToString(GLenumGroup::PrimitiveType, mode), id, stream);
-
-    if (context)
-    {
-        TransformFeedbackID idPacked                          = FromGL<TransformFeedbackID>(id);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateDrawTransformFeedbackStream(context, mode, idPacked, stream));
-        if (isCallValid)
-        {
-            context->drawTransformFeedbackStream(mode, idPacked, stream);
-        }
-        ANGLE_CAPTURE(DrawTransformFeedbackStream, isCallValid, context, mode, idPacked, stream);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY EndQueryIndexed(GLenum target, GLuint index)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::EndQueryIndexed, "glEndQueryIndexed",
-          "context = %d, target = %s, index = %u", CID(context),
-          GLenumToString(GLenumGroup::QueryTarget, target), index);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateEndQueryIndexed(context, target, index));
-        if (isCallValid)
-        {
-            context->endQueryIndexed(target, index);
-        }
-        ANGLE_CAPTURE(EndQueryIndexed, isCallValid, context, target, index);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GenTransformFeedbacks(GLsizei n, GLuint *ids)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GenTransformFeedbacks, "glGenTransformFeedbacks",
-          "context = %d, n = %d, ids = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)ids);
-
-    if (context)
-    {
-        TransformFeedbackID *idsPacked                        = FromGL<TransformFeedbackID *>(ids);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGenTransformFeedbacks(context, n, idsPacked));
-        if (isCallValid)
-        {
-            context->genTransformFeedbacks(n, idsPacked);
-        }
-        ANGLE_CAPTURE(GenTransformFeedbacks, isCallValid, context, n, idsPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetActiveSubroutineName(GLuint program,
-                                         GLenum shadertype,
-                                         GLuint index,
-                                         GLsizei bufsize,
-                                         GLsizei *length,
-                                         GLchar *name)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetActiveSubroutineName, "glGetActiveSubroutineName",
-          "context = %d, program = %u, shadertype = %s, index = %u, bufsize = %d, length = "
-          "0x%016" PRIxPTR ", name = 0x%016" PRIxPTR "",
-          CID(context), program, GLenumToString(GLenumGroup::ShaderType, shadertype), index,
-          bufsize, (uintptr_t)length, (uintptr_t)name);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetActiveSubroutineName(context, programPacked, shadertype,
-                                                            index, bufsize, length, name));
-        if (isCallValid)
-        {
-            context->getActiveSubroutineName(programPacked, shadertype, index, bufsize, length,
-                                             name);
-        }
-        ANGLE_CAPTURE(GetActiveSubroutineName, isCallValid, context, programPacked, shadertype,
-                      index, bufsize, length, name);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetActiveSubroutineUniformName(GLuint program,
-                                                GLenum shadertype,
-                                                GLuint index,
-                                                GLsizei bufsize,
-                                                GLsizei *length,
-                                                GLchar *name)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetActiveSubroutineUniformName,
-          "glGetActiveSubroutineUniformName",
-          "context = %d, program = %u, shadertype = %s, index = %u, bufsize = %d, length = "
-          "0x%016" PRIxPTR ", name = 0x%016" PRIxPTR "",
-          CID(context), program, GLenumToString(GLenumGroup::ShaderType, shadertype), index,
-          bufsize, (uintptr_t)length, (uintptr_t)name);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetActiveSubroutineUniformName(
-                                context, programPacked, shadertype, index, bufsize, length, name));
-        if (isCallValid)
-        {
-            context->getActiveSubroutineUniformName(programPacked, shadertype, index, bufsize,
-                                                    length, name);
-        }
-        ANGLE_CAPTURE(GetActiveSubroutineUniformName, isCallValid, context, programPacked,
-                      shadertype, index, bufsize, length, name);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetActiveSubroutineUniformiv(GLuint program,
-                                              GLenum shadertype,
-                                              GLuint index,
-                                              GLenum pname,
-                                              GLint *values)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetActiveSubroutineUniformiv, "glGetActiveSubroutineUniformiv",
-          "context = %d, program = %u, shadertype = %s, index = %u, pname = %s, values = "
-          "0x%016" PRIxPTR "",
-          CID(context), program, GLenumToString(GLenumGroup::ShaderType, shadertype), index,
-          GLenumToString(GLenumGroup::SubroutineParameterName, pname), (uintptr_t)values);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetActiveSubroutineUniformiv(context, programPacked, shadertype,
-                                                                 index, pname, values));
-        if (isCallValid)
-        {
-            context->getActiveSubroutineUniformiv(programPacked, shadertype, index, pname, values);
-        }
-        ANGLE_CAPTURE(GetActiveSubroutineUniformiv, isCallValid, context, programPacked, shadertype,
-                      index, pname, values);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetProgramStageiv, "glGetProgramStageiv",
-          "context = %d, program = %u, shadertype = %s, pname = %s, values = 0x%016" PRIxPTR "",
-          CID(context), program, GLenumToString(GLenumGroup::ShaderType, shadertype),
-          GLenumToString(GLenumGroup::ProgramStagePName, pname), (uintptr_t)values);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetProgramStageiv(context, programPacked, shadertype, pname, values));
-        if (isCallValid)
-        {
-            context->getProgramStageiv(programPacked, shadertype, pname, values);
-        }
-        ANGLE_CAPTURE(GetProgramStageiv, isCallValid, context, programPacked, shadertype, pname,
-                      values);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetQueryIndexediv, "glGetQueryIndexediv",
-          "context = %d, target = %s, index = %u, pname = %s, params = 0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::DefaultGroup, target), index,
-          GLenumToString(GLenumGroup::QueryParameterName, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetQueryIndexediv(context, target, index, pname, params));
-        if (isCallValid)
-        {
-            context->getQueryIndexediv(target, index, pname, params);
-        }
-        ANGLE_CAPTURE(GetQueryIndexediv, isCallValid, context, target, index, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-GLuint GL_APIENTRY GetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetSubroutineIndex, "glGetSubroutineIndex",
-          "context = %d, program = %u, shadertype = %s, name = 0x%016" PRIxPTR "", CID(context),
-          program, GLenumToString(GLenumGroup::ShaderType, shadertype), (uintptr_t)name);
-
-    GLuint returnValue;
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetSubroutineIndex(context, programPacked, shadertype, name));
-        if (isCallValid)
-        {
-            returnValue = context->getSubroutineIndex(programPacked, shadertype, name);
-        }
-        else
-        {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetSubroutineIndex, GLuint>();
-        }
-        ANGLE_CAPTURE(GetSubroutineIndex, isCallValid, context, programPacked, shadertype, name,
-                      returnValue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::GetSubroutineIndex, GLuint>();
-    }
-    return returnValue;
-}
-
-GLint GL_APIENTRY GetSubroutineUniformLocation(GLuint program,
-                                               GLenum shadertype,
-                                               const GLchar *name)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetSubroutineUniformLocation, "glGetSubroutineUniformLocation",
-          "context = %d, program = %u, shadertype = %s, name = 0x%016" PRIxPTR "", CID(context),
-          program, GLenumToString(GLenumGroup::ShaderType, shadertype), (uintptr_t)name);
-
-    GLint returnValue;
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetSubroutineUniformLocation(context, programPacked, shadertype, name));
-        if (isCallValid)
-        {
-            returnValue = context->getSubroutineUniformLocation(programPacked, shadertype, name);
-        }
-        else
-        {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetSubroutineUniformLocation, GLint>();
-        }
-        ANGLE_CAPTURE(GetSubroutineUniformLocation, isCallValid, context, programPacked, shadertype,
-                      name, returnValue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::GetSubroutineUniformLocation, GLint>();
-    }
-    return returnValue;
-}
-
-void GL_APIENTRY GetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetUniformSubroutineuiv, "glGetUniformSubroutineuiv",
-          "context = %d, shadertype = %s, location = %d, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::ShaderType, shadertype), location, (uintptr_t)params);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetUniformSubroutineuiv(context, shadertype, location, params));
-        if (isCallValid)
-        {
-            context->getUniformSubroutineuiv(shadertype, location, params);
-        }
-        ANGLE_CAPTURE(GetUniformSubroutineuiv, isCallValid, context, shadertype, location, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetUniformdv(GLuint program, GLint location, GLdouble *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetUniformdv, "glGetUniformdv",
-          "context = %d, program = %u, location = %d, params = 0x%016" PRIxPTR "", CID(context),
-          program, location, (uintptr_t)params);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetUniformdv(context, programPacked, locationPacked, params));
-        if (isCallValid)
-        {
-            context->getUniformdv(programPacked, locationPacked, params);
-        }
-        ANGLE_CAPTURE(GetUniformdv, isCallValid, context, programPacked, locationPacked, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-GLboolean GL_APIENTRY IsTransformFeedback(GLuint id)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IsTransformFeedback, "glIsTransformFeedback",
-          "context = %d, id = %u", CID(context), id);
-
-    GLboolean returnValue;
-    if (context)
-    {
-        TransformFeedbackID idPacked                          = FromGL<TransformFeedbackID>(id);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateIsTransformFeedback(context, idPacked));
-        if (isCallValid)
-        {
-            returnValue = context->isTransformFeedback(idPacked);
-        }
-        else
-        {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsTransformFeedback, GLboolean>();
-        }
-        ANGLE_CAPTURE(IsTransformFeedback, isCallValid, context, idPacked, returnValue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::IsTransformFeedback, GLboolean>();
-    }
-    return returnValue;
-}
-
-void GL_APIENTRY MinSampleShading(GLfloat value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MinSampleShading, "glMinSampleShading",
-          "context = %d, value = %f", CID(context), value);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateMinSampleShading(context, value));
-        if (isCallValid)
-        {
-            context->minSampleShading(value);
-        }
-        ANGLE_CAPTURE(MinSampleShading, isCallValid, context, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY PatchParameterfv(GLenum pname, const GLfloat *values)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PatchParameterfv, "glPatchParameterfv",
-          "context = %d, pname = %s, values = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::PatchParameterName, pname), (uintptr_t)values);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidatePatchParameterfv(context, pname, values));
-        if (isCallValid)
-        {
-            context->patchParameterfv(pname, values);
-        }
-        ANGLE_CAPTURE(PatchParameterfv, isCallValid, context, pname, values);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY PatchParameteri(GLenum pname, GLint value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PatchParameteri, "glPatchParameteri",
-          "context = %d, pname = %s, value = %d", CID(context),
-          GLenumToString(GLenumGroup::PatchParameterName, pname), value);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidatePatchParameteri(context, pname, value));
-        if (isCallValid)
-        {
-            context->patchParameteri(pname, value);
-        }
-        ANGLE_CAPTURE(PatchParameteri, isCallValid, context, pname, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY PauseTransformFeedback()
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PauseTransformFeedback, "glPauseTransformFeedback",
-          "context = %d", CID(context));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidatePauseTransformFeedback(context));
-        if (isCallValid)
-        {
-            context->pauseTransformFeedback();
-        }
-        ANGLE_CAPTURE(PauseTransformFeedback, isCallValid, context);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ResumeTransformFeedback()
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ResumeTransformFeedback, "glResumeTransformFeedback",
-          "context = %d", CID(context));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateResumeTransformFeedback(context));
-        if (isCallValid)
-        {
-            context->resumeTransformFeedback();
-        }
-        ANGLE_CAPTURE(ResumeTransformFeedback, isCallValid, context);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Uniform1d(GLint location, GLdouble x)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform1d, "glUniform1d", "context = %d, location = %d, x = %f",
-          CID(context), location, x);
-
-    if (context)
-    {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateUniform1d(context, locationPacked, x));
-        if (isCallValid)
-        {
-            context->uniform1d(locationPacked, x);
-        }
-        ANGLE_CAPTURE(Uniform1d, isCallValid, context, locationPacked, x);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Uniform1dv(GLint location, GLsizei count, const GLdouble *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform1dv, "glUniform1dv",
-          "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
-          location, count, (uintptr_t)value);
-
-    if (context)
-    {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateUniform1dv(context, locationPacked, count, value));
-        if (isCallValid)
-        {
-            context->uniform1dv(locationPacked, count, value);
-        }
-        ANGLE_CAPTURE(Uniform1dv, isCallValid, context, locationPacked, count, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Uniform2d(GLint location, GLdouble x, GLdouble y)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform2d, "glUniform2d",
-          "context = %d, location = %d, x = %f, y = %f", CID(context), location, x, y);
-
-    if (context)
-    {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateUniform2d(context, locationPacked, x, y));
-        if (isCallValid)
-        {
-            context->uniform2d(locationPacked, x, y);
-        }
-        ANGLE_CAPTURE(Uniform2d, isCallValid, context, locationPacked, x, y);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Uniform2dv(GLint location, GLsizei count, const GLdouble *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform2dv, "glUniform2dv",
-          "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
-          location, count, (uintptr_t)value);
-
-    if (context)
-    {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateUniform2dv(context, locationPacked, count, value));
-        if (isCallValid)
-        {
-            context->uniform2dv(locationPacked, count, value);
-        }
-        ANGLE_CAPTURE(Uniform2dv, isCallValid, context, locationPacked, count, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Uniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform3d, "glUniform3d",
-          "context = %d, location = %d, x = %f, y = %f, z = %f", CID(context), location, x, y, z);
-
-    if (context)
-    {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateUniform3d(context, locationPacked, x, y, z));
-        if (isCallValid)
-        {
-            context->uniform3d(locationPacked, x, y, z);
-        }
-        ANGLE_CAPTURE(Uniform3d, isCallValid, context, locationPacked, x, y, z);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Uniform3dv(GLint location, GLsizei count, const GLdouble *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform3dv, "glUniform3dv",
-          "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
-          location, count, (uintptr_t)value);
-
-    if (context)
-    {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateUniform3dv(context, locationPacked, count, value));
-        if (isCallValid)
-        {
-            context->uniform3dv(locationPacked, count, value);
-        }
-        ANGLE_CAPTURE(Uniform3dv, isCallValid, context, locationPacked, count, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Uniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform4d, "glUniform4d",
-          "context = %d, location = %d, x = %f, y = %f, z = %f, w = %f", CID(context), location, x,
-          y, z, w);
-
-    if (context)
-    {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateUniform4d(context, locationPacked, x, y, z, w));
-        if (isCallValid)
-        {
-            context->uniform4d(locationPacked, x, y, z, w);
-        }
-        ANGLE_CAPTURE(Uniform4d, isCallValid, context, locationPacked, x, y, z, w);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY Uniform4dv(GLint location, GLsizei count, const GLdouble *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform4dv, "glUniform4dv",
-          "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
-          location, count, (uintptr_t)value);
-
-    if (context)
-    {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateUniform4dv(context, locationPacked, count, value));
-        if (isCallValid)
-        {
-            context->uniform4dv(locationPacked, count, value);
-        }
-        ANGLE_CAPTURE(Uniform4dv, isCallValid, context, locationPacked, count, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY UniformMatrix2dv(GLint location,
-                                  GLsizei count,
-                                  GLboolean transpose,
-                                  const GLdouble *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::UniformMatrix2dv, "glUniformMatrix2dv",
-          "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
-          CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
-
-    if (context)
-    {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateUniformMatrix2dv(context, locationPacked, count, transpose, value));
-        if (isCallValid)
-        {
-            context->uniformMatrix2dv(locationPacked, count, transpose, value);
-        }
-        ANGLE_CAPTURE(UniformMatrix2dv, isCallValid, context, locationPacked, count, transpose,
-                      value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY UniformMatrix2x3dv(GLint location,
-                                    GLsizei count,
-                                    GLboolean transpose,
-                                    const GLdouble *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::UniformMatrix2x3dv, "glUniformMatrix2x3dv",
-          "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
-          CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
-
-    if (context)
-    {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateUniformMatrix2x3dv(context, locationPacked, count, transpose, value));
-        if (isCallValid)
-        {
-            context->uniformMatrix2x3dv(locationPacked, count, transpose, value);
-        }
-        ANGLE_CAPTURE(UniformMatrix2x3dv, isCallValid, context, locationPacked, count, transpose,
-                      value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY UniformMatrix2x4dv(GLint location,
-                                    GLsizei count,
-                                    GLboolean transpose,
-                                    const GLdouble *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::UniformMatrix2x4dv, "glUniformMatrix2x4dv",
-          "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
-          CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
-
-    if (context)
-    {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateUniformMatrix2x4dv(context, locationPacked, count, transpose, value));
-        if (isCallValid)
-        {
-            context->uniformMatrix2x4dv(locationPacked, count, transpose, value);
-        }
-        ANGLE_CAPTURE(UniformMatrix2x4dv, isCallValid, context, locationPacked, count, transpose,
-                      value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY UniformMatrix3dv(GLint location,
-                                  GLsizei count,
-                                  GLboolean transpose,
-                                  const GLdouble *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::UniformMatrix3dv, "glUniformMatrix3dv",
-          "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
-          CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
-
-    if (context)
-    {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateUniformMatrix3dv(context, locationPacked, count, transpose, value));
-        if (isCallValid)
-        {
-            context->uniformMatrix3dv(locationPacked, count, transpose, value);
-        }
-        ANGLE_CAPTURE(UniformMatrix3dv, isCallValid, context, locationPacked, count, transpose,
-                      value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY UniformMatrix3x2dv(GLint location,
-                                    GLsizei count,
-                                    GLboolean transpose,
-                                    const GLdouble *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::UniformMatrix3x2dv, "glUniformMatrix3x2dv",
-          "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
-          CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
-
-    if (context)
-    {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateUniformMatrix3x2dv(context, locationPacked, count, transpose, value));
-        if (isCallValid)
-        {
-            context->uniformMatrix3x2dv(locationPacked, count, transpose, value);
-        }
-        ANGLE_CAPTURE(UniformMatrix3x2dv, isCallValid, context, locationPacked, count, transpose,
-                      value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY UniformMatrix3x4dv(GLint location,
-                                    GLsizei count,
-                                    GLboolean transpose,
-                                    const GLdouble *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::UniformMatrix3x4dv, "glUniformMatrix3x4dv",
-          "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
-          CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
-
-    if (context)
-    {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateUniformMatrix3x4dv(context, locationPacked, count, transpose, value));
-        if (isCallValid)
-        {
-            context->uniformMatrix3x4dv(locationPacked, count, transpose, value);
-        }
-        ANGLE_CAPTURE(UniformMatrix3x4dv, isCallValid, context, locationPacked, count, transpose,
-                      value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY UniformMatrix4dv(GLint location,
-                                  GLsizei count,
-                                  GLboolean transpose,
-                                  const GLdouble *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::UniformMatrix4dv, "glUniformMatrix4dv",
-          "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
-          CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
-
-    if (context)
-    {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateUniformMatrix4dv(context, locationPacked, count, transpose, value));
-        if (isCallValid)
-        {
-            context->uniformMatrix4dv(locationPacked, count, transpose, value);
-        }
-        ANGLE_CAPTURE(UniformMatrix4dv, isCallValid, context, locationPacked, count, transpose,
-                      value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY UniformMatrix4x2dv(GLint location,
-                                    GLsizei count,
-                                    GLboolean transpose,
-                                    const GLdouble *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::UniformMatrix4x2dv, "glUniformMatrix4x2dv",
-          "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
-          CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
-
-    if (context)
-    {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateUniformMatrix4x2dv(context, locationPacked, count, transpose, value));
-        if (isCallValid)
-        {
-            context->uniformMatrix4x2dv(locationPacked, count, transpose, value);
-        }
-        ANGLE_CAPTURE(UniformMatrix4x2dv, isCallValid, context, locationPacked, count, transpose,
-                      value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY UniformMatrix4x3dv(GLint location,
-                                    GLsizei count,
-                                    GLboolean transpose,
-                                    const GLdouble *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::UniformMatrix4x3dv, "glUniformMatrix4x3dv",
-          "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
-          CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
-
-    if (context)
-    {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateUniformMatrix4x3dv(context, locationPacked, count, transpose, value));
-        if (isCallValid)
-        {
-            context->uniformMatrix4x3dv(locationPacked, count, transpose, value);
-        }
-        ANGLE_CAPTURE(UniformMatrix4x3dv, isCallValid, context, locationPacked, count, transpose,
-                      value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY UniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::UniformSubroutinesuiv, "glUniformSubroutinesuiv",
-          "context = %d, shadertype = %s, count = %d, indices = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::ShaderType, shadertype), count, (uintptr_t)indices);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateUniformSubroutinesuiv(context, shadertype, count, indices));
-        if (isCallValid)
-        {
-            context->uniformSubroutinesuiv(shadertype, count, indices);
-        }
-        ANGLE_CAPTURE(UniformSubroutinesuiv, isCallValid, context, shadertype, count, indices);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-}  // namespace gl
diff --git a/src/libGL/entry_points_gl_4_0_autogen.h b/src/libGL/entry_points_gl_4_0_autogen.h
deleted file mode 100644
index 009cbfc..0000000
--- a/src/libGL/entry_points_gl_4_0_autogen.h
+++ /dev/null
@@ -1,124 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// entry_points_gl_4_0_autogen.h:
-//   Defines the GL 4.0 entry points.
-
-#ifndef LIBGL_ENTRY_POINTS_GL_4_0_AUTOGEN_H_
-#define LIBGL_ENTRY_POINTS_GL_4_0_AUTOGEN_H_
-
-#include <export.h>
-#include "angle_gl.h"
-
-namespace gl
-{
-ANGLE_EXPORT void GL_APIENTRY BeginQueryIndexed(GLenum target, GLuint index, GLuint id);
-ANGLE_EXPORT void GL_APIENTRY BindTransformFeedback(GLenum target, GLuint id);
-ANGLE_EXPORT void GL_APIENTRY BlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha);
-ANGLE_EXPORT void GL_APIENTRY BlendEquationi(GLuint buf, GLenum mode);
-ANGLE_EXPORT void GL_APIENTRY
-BlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
-ANGLE_EXPORT void GL_APIENTRY BlendFunci(GLuint buf, GLenum src, GLenum dst);
-ANGLE_EXPORT void GL_APIENTRY DeleteTransformFeedbacks(GLsizei n, const GLuint *ids);
-ANGLE_EXPORT void GL_APIENTRY DrawArraysIndirect(GLenum mode, const void *indirect);
-ANGLE_EXPORT void GL_APIENTRY DrawElementsIndirect(GLenum mode, GLenum type, const void *indirect);
-ANGLE_EXPORT void GL_APIENTRY DrawTransformFeedback(GLenum mode, GLuint id);
-ANGLE_EXPORT void GL_APIENTRY DrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream);
-ANGLE_EXPORT void GL_APIENTRY EndQueryIndexed(GLenum target, GLuint index);
-ANGLE_EXPORT void GL_APIENTRY GenTransformFeedbacks(GLsizei n, GLuint *ids);
-ANGLE_EXPORT void GL_APIENTRY GetActiveSubroutineName(GLuint program,
-                                                      GLenum shadertype,
-                                                      GLuint index,
-                                                      GLsizei bufsize,
-                                                      GLsizei *length,
-                                                      GLchar *name);
-ANGLE_EXPORT void GL_APIENTRY GetActiveSubroutineUniformName(GLuint program,
-                                                             GLenum shadertype,
-                                                             GLuint index,
-                                                             GLsizei bufsize,
-                                                             GLsizei *length,
-                                                             GLchar *name);
-ANGLE_EXPORT void GL_APIENTRY GetActiveSubroutineUniformiv(GLuint program,
-                                                           GLenum shadertype,
-                                                           GLuint index,
-                                                           GLenum pname,
-                                                           GLint *values);
-ANGLE_EXPORT void GL_APIENTRY GetProgramStageiv(GLuint program,
-                                                GLenum shadertype,
-                                                GLenum pname,
-                                                GLint *values);
-ANGLE_EXPORT void GL_APIENTRY GetQueryIndexediv(GLenum target,
-                                                GLuint index,
-                                                GLenum pname,
-                                                GLint *params);
-ANGLE_EXPORT GLuint GL_APIENTRY GetSubroutineIndex(GLuint program,
-                                                   GLenum shadertype,
-                                                   const GLchar *name);
-ANGLE_EXPORT GLint GL_APIENTRY GetSubroutineUniformLocation(GLuint program,
-                                                            GLenum shadertype,
-                                                            const GLchar *name);
-ANGLE_EXPORT void GL_APIENTRY GetUniformSubroutineuiv(GLenum shadertype,
-                                                      GLint location,
-                                                      GLuint *params);
-ANGLE_EXPORT void GL_APIENTRY GetUniformdv(GLuint program, GLint location, GLdouble *params);
-ANGLE_EXPORT GLboolean GL_APIENTRY IsTransformFeedback(GLuint id);
-ANGLE_EXPORT void GL_APIENTRY MinSampleShading(GLfloat value);
-ANGLE_EXPORT void GL_APIENTRY PatchParameterfv(GLenum pname, const GLfloat *values);
-ANGLE_EXPORT void GL_APIENTRY PatchParameteri(GLenum pname, GLint value);
-ANGLE_EXPORT void GL_APIENTRY PauseTransformFeedback();
-ANGLE_EXPORT void GL_APIENTRY ResumeTransformFeedback();
-ANGLE_EXPORT void GL_APIENTRY Uniform1d(GLint location, GLdouble x);
-ANGLE_EXPORT void GL_APIENTRY Uniform1dv(GLint location, GLsizei count, const GLdouble *value);
-ANGLE_EXPORT void GL_APIENTRY Uniform2d(GLint location, GLdouble x, GLdouble y);
-ANGLE_EXPORT void GL_APIENTRY Uniform2dv(GLint location, GLsizei count, const GLdouble *value);
-ANGLE_EXPORT void GL_APIENTRY Uniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z);
-ANGLE_EXPORT void GL_APIENTRY Uniform3dv(GLint location, GLsizei count, const GLdouble *value);
-ANGLE_EXPORT void GL_APIENTRY
-Uniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
-ANGLE_EXPORT void GL_APIENTRY Uniform4dv(GLint location, GLsizei count, const GLdouble *value);
-ANGLE_EXPORT void GL_APIENTRY UniformMatrix2dv(GLint location,
-                                               GLsizei count,
-                                               GLboolean transpose,
-                                               const GLdouble *value);
-ANGLE_EXPORT void GL_APIENTRY UniformMatrix2x3dv(GLint location,
-                                                 GLsizei count,
-                                                 GLboolean transpose,
-                                                 const GLdouble *value);
-ANGLE_EXPORT void GL_APIENTRY UniformMatrix2x4dv(GLint location,
-                                                 GLsizei count,
-                                                 GLboolean transpose,
-                                                 const GLdouble *value);
-ANGLE_EXPORT void GL_APIENTRY UniformMatrix3dv(GLint location,
-                                               GLsizei count,
-                                               GLboolean transpose,
-                                               const GLdouble *value);
-ANGLE_EXPORT void GL_APIENTRY UniformMatrix3x2dv(GLint location,
-                                                 GLsizei count,
-                                                 GLboolean transpose,
-                                                 const GLdouble *value);
-ANGLE_EXPORT void GL_APIENTRY UniformMatrix3x4dv(GLint location,
-                                                 GLsizei count,
-                                                 GLboolean transpose,
-                                                 const GLdouble *value);
-ANGLE_EXPORT void GL_APIENTRY UniformMatrix4dv(GLint location,
-                                               GLsizei count,
-                                               GLboolean transpose,
-                                               const GLdouble *value);
-ANGLE_EXPORT void GL_APIENTRY UniformMatrix4x2dv(GLint location,
-                                                 GLsizei count,
-                                                 GLboolean transpose,
-                                                 const GLdouble *value);
-ANGLE_EXPORT void GL_APIENTRY UniformMatrix4x3dv(GLint location,
-                                                 GLsizei count,
-                                                 GLboolean transpose,
-                                                 const GLdouble *value);
-ANGLE_EXPORT void GL_APIENTRY UniformSubroutinesuiv(GLenum shadertype,
-                                                    GLsizei count,
-                                                    const GLuint *indices);
-}  // namespace gl
-
-#endif  // LIBGL_ENTRY_POINTS_GL_4_0_AUTOGEN_H_
diff --git a/src/libGL/entry_points_gl_4_1_autogen.cpp b/src/libGL/entry_points_gl_4_1_autogen.cpp
deleted file mode 100644
index e2637a8..0000000
--- a/src/libGL/entry_points_gl_4_1_autogen.cpp
+++ /dev/null
@@ -1,2550 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// entry_points_gl_4_1_autogen.cpp:
-//   Defines the GL 4.1 entry points.
-
-#include "libGL/entry_points_gl_4_1_autogen.h"
-
-#include "libANGLE/Context.h"
-#include "libANGLE/Context.inl.h"
-#include "libANGLE/entry_points_utils.h"
-#include "libANGLE/gl_enum_utils.h"
-#include "libANGLE/validationEGL.h"
-#include "libANGLE/validationES.h"
-#include "libANGLE/validationES1.h"
-#include "libANGLE/validationES2.h"
-#include "libANGLE/validationES3.h"
-#include "libANGLE/validationES31.h"
-#include "libANGLE/validationES32.h"
-#include "libANGLE/validationESEXT.h"
-#include "libANGLE/validationGL41_autogen.h"
-#include "libGLESv2/global_state.h"
-
-namespace gl
-{
-void GL_APIENTRY ActiveShaderProgram(GLuint pipeline, GLuint program)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ActiveShaderProgram, "glActiveShaderProgram",
-          "context = %d, pipeline = %u, program = %u", CID(context), pipeline, program);
-
-    if (context)
-    {
-        ProgramPipelineID pipelinePacked                      = FromGL<ProgramPipelineID>(pipeline);
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateActiveShaderProgram(context, pipelinePacked, programPacked));
-        if (isCallValid)
-        {
-            context->activeShaderProgram(pipelinePacked, programPacked);
-        }
-        ANGLE_CAPTURE(ActiveShaderProgram, isCallValid, context, pipelinePacked, programPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY BindProgramPipeline(GLuint pipeline)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindProgramPipeline, "glBindProgramPipeline",
-          "context = %d, pipeline = %u", CID(context), pipeline);
-
-    if (context)
-    {
-        ProgramPipelineID pipelinePacked                      = FromGL<ProgramPipelineID>(pipeline);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateBindProgramPipeline(context, pipelinePacked));
-        if (isCallValid)
-        {
-            context->bindProgramPipeline(pipelinePacked);
-        }
-        ANGLE_CAPTURE(BindProgramPipeline, isCallValid, context, pipelinePacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ClearDepthf(GLfloat d)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ClearDepthf, "glClearDepthf", "context = %d, d = %f",
-          CID(context), d);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateClearDepthf(context, d));
-        if (isCallValid)
-        {
-            context->clearDepthf(d);
-        }
-        ANGLE_CAPTURE(ClearDepthf, isCallValid, context, d);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-GLuint GL_APIENTRY CreateShaderProgramv(GLenum type, GLsizei count, const GLchar *const *strings)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CreateShaderProgramv, "glCreateShaderProgramv",
-          "context = %d, type = %s, count = %d, strings = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::ShaderType, type), count, (uintptr_t)strings);
-
-    GLuint returnValue;
-    if (context)
-    {
-        ShaderType typePacked                                 = FromGL<ShaderType>(type);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateCreateShaderProgramv(context, typePacked, count, strings));
-        if (isCallValid)
-        {
-            returnValue = context->createShaderProgramv(typePacked, count, strings);
-        }
-        else
-        {
-            returnValue = GetDefaultReturnValue<EntryPoint::CreateShaderProgramv, GLuint>();
-        }
-        ANGLE_CAPTURE(CreateShaderProgramv, isCallValid, context, typePacked, count, strings,
-                      returnValue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::CreateShaderProgramv, GLuint>();
-    }
-    return returnValue;
-}
-
-void GL_APIENTRY DeleteProgramPipelines(GLsizei n, const GLuint *pipelines)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DeleteProgramPipelines, "glDeleteProgramPipelines",
-          "context = %d, n = %d, pipelines = 0x%016" PRIxPTR "", CID(context), n,
-          (uintptr_t)pipelines);
-
-    if (context)
-    {
-        const ProgramPipelineID *pipelinesPacked = FromGL<const ProgramPipelineID *>(pipelines);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateDeleteProgramPipelines(context, n, pipelinesPacked));
-        if (isCallValid)
-        {
-            context->deleteProgramPipelines(n, pipelinesPacked);
-        }
-        ANGLE_CAPTURE(DeleteProgramPipelines, isCallValid, context, n, pipelinesPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DepthRangeArrayv, "glDepthRangeArrayv",
-          "context = %d, first = %u, count = %d, v = 0x%016" PRIxPTR "", CID(context), first, count,
-          (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateDepthRangeArrayv(context, first, count, v));
-        if (isCallValid)
-        {
-            context->depthRangeArrayv(first, count, v);
-        }
-        ANGLE_CAPTURE(DepthRangeArrayv, isCallValid, context, first, count, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DepthRangeIndexed(GLuint index, GLdouble n, GLdouble f)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DepthRangeIndexed, "glDepthRangeIndexed",
-          "context = %d, index = %u, n = %f, f = %f", CID(context), index, n, f);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateDepthRangeIndexed(context, index, n, f));
-        if (isCallValid)
-        {
-            context->depthRangeIndexed(index, n, f);
-        }
-        ANGLE_CAPTURE(DepthRangeIndexed, isCallValid, context, index, n, f);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DepthRangef(GLfloat n, GLfloat f)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DepthRangef, "glDepthRangef", "context = %d, n = %f, f = %f",
-          CID(context), n, f);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateDepthRangef(context, n, f));
-        if (isCallValid)
-        {
-            context->depthRangef(n, f);
-        }
-        ANGLE_CAPTURE(DepthRangef, isCallValid, context, n, f);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GenProgramPipelines(GLsizei n, GLuint *pipelines)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GenProgramPipelines, "glGenProgramPipelines",
-          "context = %d, n = %d, pipelines = 0x%016" PRIxPTR "", CID(context), n,
-          (uintptr_t)pipelines);
-
-    if (context)
-    {
-        ProgramPipelineID *pipelinesPacked = FromGL<ProgramPipelineID *>(pipelines);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGenProgramPipelines(context, n, pipelinesPacked));
-        if (isCallValid)
-        {
-            context->genProgramPipelines(n, pipelinesPacked);
-        }
-        ANGLE_CAPTURE(GenProgramPipelines, isCallValid, context, n, pipelinesPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetDoublei_v(GLenum target, GLuint index, GLdouble *data)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetDoublei_v, "glGetDoublei_v",
-          "context = %d, target = %s, index = %u, data = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TypeEnum, target), index, (uintptr_t)data);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetDoublei_v(context, target, index, data));
-        if (isCallValid)
-        {
-            context->getDoublei_v(target, index, data);
-        }
-        ANGLE_CAPTURE(GetDoublei_v, isCallValid, context, target, index, data);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetFloati_v(GLenum target, GLuint index, GLfloat *data)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetFloati_v, "glGetFloati_v",
-          "context = %d, target = %s, index = %u, data = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TypeEnum, target), index, (uintptr_t)data);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetFloati_v(context, target, index, data));
-        if (isCallValid)
-        {
-            context->getFloati_v(target, index, data);
-        }
-        ANGLE_CAPTURE(GetFloati_v, isCallValid, context, target, index, data);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetProgramBinary(GLuint program,
-                                  GLsizei bufSize,
-                                  GLsizei *length,
-                                  GLenum *binaryFormat,
-                                  void *binary)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetProgramBinary, "glGetProgramBinary",
-          "context = %d, program = %u, bufSize = %d, length = 0x%016" PRIxPTR
-          ", binaryFormat = 0x%016" PRIxPTR ", binary = 0x%016" PRIxPTR "",
-          CID(context), program, bufSize, (uintptr_t)length, (uintptr_t)binaryFormat,
-          (uintptr_t)binary);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetProgramBinary(context, programPacked, bufSize,
-                                                                   length, binaryFormat, binary));
-        if (isCallValid)
-        {
-            context->getProgramBinary(programPacked, bufSize, length, binaryFormat, binary);
-        }
-        ANGLE_CAPTURE(GetProgramBinary, isCallValid, context, programPacked, bufSize, length,
-                      binaryFormat, binary);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetProgramPipelineInfoLog(GLuint pipeline,
-                                           GLsizei bufSize,
-                                           GLsizei *length,
-                                           GLchar *infoLog)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetProgramPipelineInfoLog, "glGetProgramPipelineInfoLog",
-          "context = %d, pipeline = %u, bufSize = %d, length = 0x%016" PRIxPTR
-          ", infoLog = 0x%016" PRIxPTR "",
-          CID(context), pipeline, bufSize, (uintptr_t)length, (uintptr_t)infoLog);
-
-    if (context)
-    {
-        ProgramPipelineID pipelinePacked                      = FromGL<ProgramPipelineID>(pipeline);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetProgramPipelineInfoLog(context, pipelinePacked, bufSize, length, infoLog));
-        if (isCallValid)
-        {
-            context->getProgramPipelineInfoLog(pipelinePacked, bufSize, length, infoLog);
-        }
-        ANGLE_CAPTURE(GetProgramPipelineInfoLog, isCallValid, context, pipelinePacked, bufSize,
-                      length, infoLog);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetProgramPipelineiv, "glGetProgramPipelineiv",
-          "context = %d, pipeline = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          pipeline, GLenumToString(GLenumGroup::PipelineParameterName, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        ProgramPipelineID pipelinePacked                      = FromGL<ProgramPipelineID>(pipeline);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetProgramPipelineiv(context, pipelinePacked, pname, params));
-        if (isCallValid)
-        {
-            context->getProgramPipelineiv(pipelinePacked, pname, params);
-        }
-        ANGLE_CAPTURE(GetProgramPipelineiv, isCallValid, context, pipelinePacked, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetShaderPrecisionFormat(GLenum shadertype,
-                                          GLenum precisiontype,
-                                          GLint *range,
-                                          GLint *precision)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetShaderPrecisionFormat, "glGetShaderPrecisionFormat",
-          "context = %d, shadertype = %s, precisiontype = %s, range = 0x%016" PRIxPTR
-          ", precision = 0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::ShaderType, shadertype),
-          GLenumToString(GLenumGroup::PrecisionType, precisiontype), (uintptr_t)range,
-          (uintptr_t)precision);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetShaderPrecisionFormat(context, shadertype, precisiontype,
-                                                             range, precision));
-        if (isCallValid)
-        {
-            context->getShaderPrecisionFormat(shadertype, precisiontype, range, precision);
-        }
-        ANGLE_CAPTURE(GetShaderPrecisionFormat, isCallValid, context, shadertype, precisiontype,
-                      range, precision);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetVertexAttribLdv, "glGetVertexAttribLdv",
-          "context = %d, index = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), index,
-          GLenumToString(GLenumGroup::VertexAttribEnum, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetVertexAttribLdv(context, index, pname, params));
-        if (isCallValid)
-        {
-            context->getVertexAttribLdv(index, pname, params);
-        }
-        ANGLE_CAPTURE(GetVertexAttribLdv, isCallValid, context, index, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-GLboolean GL_APIENTRY IsProgramPipeline(GLuint pipeline)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IsProgramPipeline, "glIsProgramPipeline",
-          "context = %d, pipeline = %u", CID(context), pipeline);
-
-    GLboolean returnValue;
-    if (context)
-    {
-        ProgramPipelineID pipelinePacked                      = FromGL<ProgramPipelineID>(pipeline);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateIsProgramPipeline(context, pipelinePacked));
-        if (isCallValid)
-        {
-            returnValue = context->isProgramPipeline(pipelinePacked);
-        }
-        else
-        {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsProgramPipeline, GLboolean>();
-        }
-        ANGLE_CAPTURE(IsProgramPipeline, isCallValid, context, pipelinePacked, returnValue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::IsProgramPipeline, GLboolean>();
-    }
-    return returnValue;
-}
-
-void GL_APIENTRY ProgramBinary(GLuint program,
-                               GLenum binaryFormat,
-                               const void *binary,
-                               GLsizei length)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramBinary, "glProgramBinary",
-          "context = %d, program = %u, binaryFormat = %s, binary = 0x%016" PRIxPTR ", length = %d",
-          CID(context), program, GLenumToString(GLenumGroup::DefaultGroup, binaryFormat),
-          (uintptr_t)binary, length);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramBinary(context, programPacked, binaryFormat, binary, length));
-        if (isCallValid)
-        {
-            context->programBinary(programPacked, binaryFormat, binary, length);
-        }
-        ANGLE_CAPTURE(ProgramBinary, isCallValid, context, programPacked, binaryFormat, binary,
-                      length);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramParameteri(GLuint program, GLenum pname, GLint value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramParameteri, "glProgramParameteri",
-          "context = %d, program = %u, pname = %s, value = %d", CID(context), program,
-          GLenumToString(GLenumGroup::ProgramParameterPName, pname), value);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateProgramParameteri(context, programPacked, pname, value));
-        if (isCallValid)
-        {
-            context->programParameteri(programPacked, pname, value);
-        }
-        ANGLE_CAPTURE(ProgramParameteri, isCallValid, context, programPacked, pname, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniform1d(GLuint program, GLint location, GLdouble v0)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform1d, "glProgramUniform1d",
-          "context = %d, program = %u, location = %d, v0 = %f", CID(context), program, location,
-          v0);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateProgramUniform1d(context, programPacked, locationPacked, v0));
-        if (isCallValid)
-        {
-            context->programUniform1d(programPacked, locationPacked, v0);
-        }
-        ANGLE_CAPTURE(ProgramUniform1d, isCallValid, context, programPacked, locationPacked, v0);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniform1dv(GLuint program,
-                                   GLint location,
-                                   GLsizei count,
-                                   const GLdouble *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform1dv, "glProgramUniform1dv",
-          "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
-          CID(context), program, location, count, (uintptr_t)value);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniform1dv(context, programPacked, locationPacked, count, value));
-        if (isCallValid)
-        {
-            context->programUniform1dv(programPacked, locationPacked, count, value);
-        }
-        ANGLE_CAPTURE(ProgramUniform1dv, isCallValid, context, programPacked, locationPacked, count,
-                      value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniform1f(GLuint program, GLint location, GLfloat v0)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform1f, "glProgramUniform1f",
-          "context = %d, program = %u, location = %d, v0 = %f", CID(context), program, location,
-          v0);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateProgramUniform1f(context, programPacked, locationPacked, v0));
-        if (isCallValid)
-        {
-            context->programUniform1f(programPacked, locationPacked, v0);
-        }
-        ANGLE_CAPTURE(ProgramUniform1f, isCallValid, context, programPacked, locationPacked, v0);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniform1fv(GLuint program,
-                                   GLint location,
-                                   GLsizei count,
-                                   const GLfloat *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform1fv, "glProgramUniform1fv",
-          "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
-          CID(context), program, location, count, (uintptr_t)value);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniform1fv(context, programPacked, locationPacked, count, value));
-        if (isCallValid)
-        {
-            context->programUniform1fv(programPacked, locationPacked, count, value);
-        }
-        ANGLE_CAPTURE(ProgramUniform1fv, isCallValid, context, programPacked, locationPacked, count,
-                      value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniform1i(GLuint program, GLint location, GLint v0)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform1i, "glProgramUniform1i",
-          "context = %d, program = %u, location = %d, v0 = %d", CID(context), program, location,
-          v0);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateProgramUniform1i(context, programPacked, locationPacked, v0));
-        if (isCallValid)
-        {
-            context->programUniform1i(programPacked, locationPacked, v0);
-        }
-        ANGLE_CAPTURE(ProgramUniform1i, isCallValid, context, programPacked, locationPacked, v0);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniform1iv(GLuint program,
-                                   GLint location,
-                                   GLsizei count,
-                                   const GLint *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform1iv, "glProgramUniform1iv",
-          "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
-          CID(context), program, location, count, (uintptr_t)value);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniform1iv(context, programPacked, locationPacked, count, value));
-        if (isCallValid)
-        {
-            context->programUniform1iv(programPacked, locationPacked, count, value);
-        }
-        ANGLE_CAPTURE(ProgramUniform1iv, isCallValid, context, programPacked, locationPacked, count,
-                      value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniform1ui(GLuint program, GLint location, GLuint v0)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform1ui, "glProgramUniform1ui",
-          "context = %d, program = %u, location = %d, v0 = %u", CID(context), program, location,
-          v0);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateProgramUniform1ui(context, programPacked, locationPacked, v0));
-        if (isCallValid)
-        {
-            context->programUniform1ui(programPacked, locationPacked, v0);
-        }
-        ANGLE_CAPTURE(ProgramUniform1ui, isCallValid, context, programPacked, locationPacked, v0);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniform1uiv(GLuint program,
-                                    GLint location,
-                                    GLsizei count,
-                                    const GLuint *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform1uiv, "glProgramUniform1uiv",
-          "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
-          CID(context), program, location, count, (uintptr_t)value);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniform1uiv(context, programPacked, locationPacked, count, value));
-        if (isCallValid)
-        {
-            context->programUniform1uiv(programPacked, locationPacked, count, value);
-        }
-        ANGLE_CAPTURE(ProgramUniform1uiv, isCallValid, context, programPacked, locationPacked,
-                      count, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform2d, "glProgramUniform2d",
-          "context = %d, program = %u, location = %d, v0 = %f, v1 = %f", CID(context), program,
-          location, v0, v1);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniform2d(context, programPacked, locationPacked, v0, v1));
-        if (isCallValid)
-        {
-            context->programUniform2d(programPacked, locationPacked, v0, v1);
-        }
-        ANGLE_CAPTURE(ProgramUniform2d, isCallValid, context, programPacked, locationPacked, v0,
-                      v1);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniform2dv(GLuint program,
-                                   GLint location,
-                                   GLsizei count,
-                                   const GLdouble *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform2dv, "glProgramUniform2dv",
-          "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
-          CID(context), program, location, count, (uintptr_t)value);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniform2dv(context, programPacked, locationPacked, count, value));
-        if (isCallValid)
-        {
-            context->programUniform2dv(programPacked, locationPacked, count, value);
-        }
-        ANGLE_CAPTURE(ProgramUniform2dv, isCallValid, context, programPacked, locationPacked, count,
-                      value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform2f, "glProgramUniform2f",
-          "context = %d, program = %u, location = %d, v0 = %f, v1 = %f", CID(context), program,
-          location, v0, v1);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniform2f(context, programPacked, locationPacked, v0, v1));
-        if (isCallValid)
-        {
-            context->programUniform2f(programPacked, locationPacked, v0, v1);
-        }
-        ANGLE_CAPTURE(ProgramUniform2f, isCallValid, context, programPacked, locationPacked, v0,
-                      v1);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniform2fv(GLuint program,
-                                   GLint location,
-                                   GLsizei count,
-                                   const GLfloat *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform2fv, "glProgramUniform2fv",
-          "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
-          CID(context), program, location, count, (uintptr_t)value);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniform2fv(context, programPacked, locationPacked, count, value));
-        if (isCallValid)
-        {
-            context->programUniform2fv(programPacked, locationPacked, count, value);
-        }
-        ANGLE_CAPTURE(ProgramUniform2fv, isCallValid, context, programPacked, locationPacked, count,
-                      value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform2i, "glProgramUniform2i",
-          "context = %d, program = %u, location = %d, v0 = %d, v1 = %d", CID(context), program,
-          location, v0, v1);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniform2i(context, programPacked, locationPacked, v0, v1));
-        if (isCallValid)
-        {
-            context->programUniform2i(programPacked, locationPacked, v0, v1);
-        }
-        ANGLE_CAPTURE(ProgramUniform2i, isCallValid, context, programPacked, locationPacked, v0,
-                      v1);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniform2iv(GLuint program,
-                                   GLint location,
-                                   GLsizei count,
-                                   const GLint *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform2iv, "glProgramUniform2iv",
-          "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
-          CID(context), program, location, count, (uintptr_t)value);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniform2iv(context, programPacked, locationPacked, count, value));
-        if (isCallValid)
-        {
-            context->programUniform2iv(programPacked, locationPacked, count, value);
-        }
-        ANGLE_CAPTURE(ProgramUniform2iv, isCallValid, context, programPacked, locationPacked, count,
-                      value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform2ui, "glProgramUniform2ui",
-          "context = %d, program = %u, location = %d, v0 = %u, v1 = %u", CID(context), program,
-          location, v0, v1);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniform2ui(context, programPacked, locationPacked, v0, v1));
-        if (isCallValid)
-        {
-            context->programUniform2ui(programPacked, locationPacked, v0, v1);
-        }
-        ANGLE_CAPTURE(ProgramUniform2ui, isCallValid, context, programPacked, locationPacked, v0,
-                      v1);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniform2uiv(GLuint program,
-                                    GLint location,
-                                    GLsizei count,
-                                    const GLuint *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform2uiv, "glProgramUniform2uiv",
-          "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
-          CID(context), program, location, count, (uintptr_t)value);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniform2uiv(context, programPacked, locationPacked, count, value));
-        if (isCallValid)
-        {
-            context->programUniform2uiv(programPacked, locationPacked, count, value);
-        }
-        ANGLE_CAPTURE(ProgramUniform2uiv, isCallValid, context, programPacked, locationPacked,
-                      count, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY
-ProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform3d, "glProgramUniform3d",
-          "context = %d, program = %u, location = %d, v0 = %f, v1 = %f, v2 = %f", CID(context),
-          program, location, v0, v1, v2);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniform3d(context, programPacked, locationPacked, v0, v1, v2));
-        if (isCallValid)
-        {
-            context->programUniform3d(programPacked, locationPacked, v0, v1, v2);
-        }
-        ANGLE_CAPTURE(ProgramUniform3d, isCallValid, context, programPacked, locationPacked, v0, v1,
-                      v2);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniform3dv(GLuint program,
-                                   GLint location,
-                                   GLsizei count,
-                                   const GLdouble *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform3dv, "glProgramUniform3dv",
-          "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
-          CID(context), program, location, count, (uintptr_t)value);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniform3dv(context, programPacked, locationPacked, count, value));
-        if (isCallValid)
-        {
-            context->programUniform3dv(programPacked, locationPacked, count, value);
-        }
-        ANGLE_CAPTURE(ProgramUniform3dv, isCallValid, context, programPacked, locationPacked, count,
-                      value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY
-ProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform3f, "glProgramUniform3f",
-          "context = %d, program = %u, location = %d, v0 = %f, v1 = %f, v2 = %f", CID(context),
-          program, location, v0, v1, v2);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniform3f(context, programPacked, locationPacked, v0, v1, v2));
-        if (isCallValid)
-        {
-            context->programUniform3f(programPacked, locationPacked, v0, v1, v2);
-        }
-        ANGLE_CAPTURE(ProgramUniform3f, isCallValid, context, programPacked, locationPacked, v0, v1,
-                      v2);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniform3fv(GLuint program,
-                                   GLint location,
-                                   GLsizei count,
-                                   const GLfloat *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform3fv, "glProgramUniform3fv",
-          "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
-          CID(context), program, location, count, (uintptr_t)value);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniform3fv(context, programPacked, locationPacked, count, value));
-        if (isCallValid)
-        {
-            context->programUniform3fv(programPacked, locationPacked, count, value);
-        }
-        ANGLE_CAPTURE(ProgramUniform3fv, isCallValid, context, programPacked, locationPacked, count,
-                      value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform3i, "glProgramUniform3i",
-          "context = %d, program = %u, location = %d, v0 = %d, v1 = %d, v2 = %d", CID(context),
-          program, location, v0, v1, v2);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniform3i(context, programPacked, locationPacked, v0, v1, v2));
-        if (isCallValid)
-        {
-            context->programUniform3i(programPacked, locationPacked, v0, v1, v2);
-        }
-        ANGLE_CAPTURE(ProgramUniform3i, isCallValid, context, programPacked, locationPacked, v0, v1,
-                      v2);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniform3iv(GLuint program,
-                                   GLint location,
-                                   GLsizei count,
-                                   const GLint *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform3iv, "glProgramUniform3iv",
-          "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
-          CID(context), program, location, count, (uintptr_t)value);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniform3iv(context, programPacked, locationPacked, count, value));
-        if (isCallValid)
-        {
-            context->programUniform3iv(programPacked, locationPacked, count, value);
-        }
-        ANGLE_CAPTURE(ProgramUniform3iv, isCallValid, context, programPacked, locationPacked, count,
-                      value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform3ui, "glProgramUniform3ui",
-          "context = %d, program = %u, location = %d, v0 = %u, v1 = %u, v2 = %u", CID(context),
-          program, location, v0, v1, v2);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniform3ui(context, programPacked, locationPacked, v0, v1, v2));
-        if (isCallValid)
-        {
-            context->programUniform3ui(programPacked, locationPacked, v0, v1, v2);
-        }
-        ANGLE_CAPTURE(ProgramUniform3ui, isCallValid, context, programPacked, locationPacked, v0,
-                      v1, v2);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniform3uiv(GLuint program,
-                                    GLint location,
-                                    GLsizei count,
-                                    const GLuint *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform3uiv, "glProgramUniform3uiv",
-          "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
-          CID(context), program, location, count, (uintptr_t)value);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniform3uiv(context, programPacked, locationPacked, count, value));
-        if (isCallValid)
-        {
-            context->programUniform3uiv(programPacked, locationPacked, count, value);
-        }
-        ANGLE_CAPTURE(ProgramUniform3uiv, isCallValid, context, programPacked, locationPacked,
-                      count, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY
-ProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform4d, "glProgramUniform4d",
-          "context = %d, program = %u, location = %d, v0 = %f, v1 = %f, v2 = %f, v3 = %f",
-          CID(context), program, location, v0, v1, v2, v3);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniform4d(context, programPacked, locationPacked, v0, v1, v2, v3));
-        if (isCallValid)
-        {
-            context->programUniform4d(programPacked, locationPacked, v0, v1, v2, v3);
-        }
-        ANGLE_CAPTURE(ProgramUniform4d, isCallValid, context, programPacked, locationPacked, v0, v1,
-                      v2, v3);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniform4dv(GLuint program,
-                                   GLint location,
-                                   GLsizei count,
-                                   const GLdouble *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform4dv, "glProgramUniform4dv",
-          "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
-          CID(context), program, location, count, (uintptr_t)value);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniform4dv(context, programPacked, locationPacked, count, value));
-        if (isCallValid)
-        {
-            context->programUniform4dv(programPacked, locationPacked, count, value);
-        }
-        ANGLE_CAPTURE(ProgramUniform4dv, isCallValid, context, programPacked, locationPacked, count,
-                      value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY
-ProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform4f, "glProgramUniform4f",
-          "context = %d, program = %u, location = %d, v0 = %f, v1 = %f, v2 = %f, v3 = %f",
-          CID(context), program, location, v0, v1, v2, v3);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniform4f(context, programPacked, locationPacked, v0, v1, v2, v3));
-        if (isCallValid)
-        {
-            context->programUniform4f(programPacked, locationPacked, v0, v1, v2, v3);
-        }
-        ANGLE_CAPTURE(ProgramUniform4f, isCallValid, context, programPacked, locationPacked, v0, v1,
-                      v2, v3);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniform4fv(GLuint program,
-                                   GLint location,
-                                   GLsizei count,
-                                   const GLfloat *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform4fv, "glProgramUniform4fv",
-          "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
-          CID(context), program, location, count, (uintptr_t)value);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniform4fv(context, programPacked, locationPacked, count, value));
-        if (isCallValid)
-        {
-            context->programUniform4fv(programPacked, locationPacked, count, value);
-        }
-        ANGLE_CAPTURE(ProgramUniform4fv, isCallValid, context, programPacked, locationPacked, count,
-                      value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY
-ProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform4i, "glProgramUniform4i",
-          "context = %d, program = %u, location = %d, v0 = %d, v1 = %d, v2 = %d, v3 = %d",
-          CID(context), program, location, v0, v1, v2, v3);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniform4i(context, programPacked, locationPacked, v0, v1, v2, v3));
-        if (isCallValid)
-        {
-            context->programUniform4i(programPacked, locationPacked, v0, v1, v2, v3);
-        }
-        ANGLE_CAPTURE(ProgramUniform4i, isCallValid, context, programPacked, locationPacked, v0, v1,
-                      v2, v3);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniform4iv(GLuint program,
-                                   GLint location,
-                                   GLsizei count,
-                                   const GLint *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform4iv, "glProgramUniform4iv",
-          "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
-          CID(context), program, location, count, (uintptr_t)value);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniform4iv(context, programPacked, locationPacked, count, value));
-        if (isCallValid)
-        {
-            context->programUniform4iv(programPacked, locationPacked, count, value);
-        }
-        ANGLE_CAPTURE(ProgramUniform4iv, isCallValid, context, programPacked, locationPacked, count,
-                      value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY
-ProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform4ui, "glProgramUniform4ui",
-          "context = %d, program = %u, location = %d, v0 = %u, v1 = %u, v2 = %u, v3 = %u",
-          CID(context), program, location, v0, v1, v2, v3);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniform4ui(context, programPacked, locationPacked, v0, v1, v2, v3));
-        if (isCallValid)
-        {
-            context->programUniform4ui(programPacked, locationPacked, v0, v1, v2, v3);
-        }
-        ANGLE_CAPTURE(ProgramUniform4ui, isCallValid, context, programPacked, locationPacked, v0,
-                      v1, v2, v3);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniform4uiv(GLuint program,
-                                    GLint location,
-                                    GLsizei count,
-                                    const GLuint *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform4uiv, "glProgramUniform4uiv",
-          "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
-          CID(context), program, location, count, (uintptr_t)value);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateProgramUniform4uiv(context, programPacked, locationPacked, count, value));
-        if (isCallValid)
-        {
-            context->programUniform4uiv(programPacked, locationPacked, count, value);
-        }
-        ANGLE_CAPTURE(ProgramUniform4uiv, isCallValid, context, programPacked, locationPacked,
-                      count, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniformMatrix2dv(GLuint program,
-                                         GLint location,
-                                         GLsizei count,
-                                         GLboolean transpose,
-                                         const GLdouble *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix2dv, "glProgramUniformMatrix2dv",
-          "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
-          "0x%016" PRIxPTR "",
-          CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateProgramUniformMatrix2dv(context, programPacked, locationPacked,
-                                                            count, transpose, value));
-        if (isCallValid)
-        {
-            context->programUniformMatrix2dv(programPacked, locationPacked, count, transpose,
-                                             value);
-        }
-        ANGLE_CAPTURE(ProgramUniformMatrix2dv, isCallValid, context, programPacked, locationPacked,
-                      count, transpose, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniformMatrix2fv(GLuint program,
-                                         GLint location,
-                                         GLsizei count,
-                                         GLboolean transpose,
-                                         const GLfloat *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix2fv, "glProgramUniformMatrix2fv",
-          "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
-          "0x%016" PRIxPTR "",
-          CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateProgramUniformMatrix2fv(context, programPacked, locationPacked,
-                                                            count, transpose, value));
-        if (isCallValid)
-        {
-            context->programUniformMatrix2fv(programPacked, locationPacked, count, transpose,
-                                             value);
-        }
-        ANGLE_CAPTURE(ProgramUniformMatrix2fv, isCallValid, context, programPacked, locationPacked,
-                      count, transpose, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniformMatrix2x3dv(GLuint program,
-                                           GLint location,
-                                           GLsizei count,
-                                           GLboolean transpose,
-                                           const GLdouble *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix2x3dv, "glProgramUniformMatrix2x3dv",
-          "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
-          "0x%016" PRIxPTR "",
-          CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateProgramUniformMatrix2x3dv(
-                                context, programPacked, locationPacked, count, transpose, value));
-        if (isCallValid)
-        {
-            context->programUniformMatrix2x3dv(programPacked, locationPacked, count, transpose,
-                                               value);
-        }
-        ANGLE_CAPTURE(ProgramUniformMatrix2x3dv, isCallValid, context, programPacked,
-                      locationPacked, count, transpose, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniformMatrix2x3fv(GLuint program,
-                                           GLint location,
-                                           GLsizei count,
-                                           GLboolean transpose,
-                                           const GLfloat *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix2x3fv, "glProgramUniformMatrix2x3fv",
-          "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
-          "0x%016" PRIxPTR "",
-          CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateProgramUniformMatrix2x3fv(
-                                context, programPacked, locationPacked, count, transpose, value));
-        if (isCallValid)
-        {
-            context->programUniformMatrix2x3fv(programPacked, locationPacked, count, transpose,
-                                               value);
-        }
-        ANGLE_CAPTURE(ProgramUniformMatrix2x3fv, isCallValid, context, programPacked,
-                      locationPacked, count, transpose, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniformMatrix2x4dv(GLuint program,
-                                           GLint location,
-                                           GLsizei count,
-                                           GLboolean transpose,
-                                           const GLdouble *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix2x4dv, "glProgramUniformMatrix2x4dv",
-          "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
-          "0x%016" PRIxPTR "",
-          CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateProgramUniformMatrix2x4dv(
-                                context, programPacked, locationPacked, count, transpose, value));
-        if (isCallValid)
-        {
-            context->programUniformMatrix2x4dv(programPacked, locationPacked, count, transpose,
-                                               value);
-        }
-        ANGLE_CAPTURE(ProgramUniformMatrix2x4dv, isCallValid, context, programPacked,
-                      locationPacked, count, transpose, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniformMatrix2x4fv(GLuint program,
-                                           GLint location,
-                                           GLsizei count,
-                                           GLboolean transpose,
-                                           const GLfloat *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix2x4fv, "glProgramUniformMatrix2x4fv",
-          "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
-          "0x%016" PRIxPTR "",
-          CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateProgramUniformMatrix2x4fv(
-                                context, programPacked, locationPacked, count, transpose, value));
-        if (isCallValid)
-        {
-            context->programUniformMatrix2x4fv(programPacked, locationPacked, count, transpose,
-                                               value);
-        }
-        ANGLE_CAPTURE(ProgramUniformMatrix2x4fv, isCallValid, context, programPacked,
-                      locationPacked, count, transpose, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniformMatrix3dv(GLuint program,
-                                         GLint location,
-                                         GLsizei count,
-                                         GLboolean transpose,
-                                         const GLdouble *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix3dv, "glProgramUniformMatrix3dv",
-          "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
-          "0x%016" PRIxPTR "",
-          CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateProgramUniformMatrix3dv(context, programPacked, locationPacked,
-                                                            count, transpose, value));
-        if (isCallValid)
-        {
-            context->programUniformMatrix3dv(programPacked, locationPacked, count, transpose,
-                                             value);
-        }
-        ANGLE_CAPTURE(ProgramUniformMatrix3dv, isCallValid, context, programPacked, locationPacked,
-                      count, transpose, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniformMatrix3fv(GLuint program,
-                                         GLint location,
-                                         GLsizei count,
-                                         GLboolean transpose,
-                                         const GLfloat *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix3fv, "glProgramUniformMatrix3fv",
-          "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
-          "0x%016" PRIxPTR "",
-          CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateProgramUniformMatrix3fv(context, programPacked, locationPacked,
-                                                            count, transpose, value));
-        if (isCallValid)
-        {
-            context->programUniformMatrix3fv(programPacked, locationPacked, count, transpose,
-                                             value);
-        }
-        ANGLE_CAPTURE(ProgramUniformMatrix3fv, isCallValid, context, programPacked, locationPacked,
-                      count, transpose, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniformMatrix3x2dv(GLuint program,
-                                           GLint location,
-                                           GLsizei count,
-                                           GLboolean transpose,
-                                           const GLdouble *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix3x2dv, "glProgramUniformMatrix3x2dv",
-          "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
-          "0x%016" PRIxPTR "",
-          CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateProgramUniformMatrix3x2dv(
-                                context, programPacked, locationPacked, count, transpose, value));
-        if (isCallValid)
-        {
-            context->programUniformMatrix3x2dv(programPacked, locationPacked, count, transpose,
-                                               value);
-        }
-        ANGLE_CAPTURE(ProgramUniformMatrix3x2dv, isCallValid, context, programPacked,
-                      locationPacked, count, transpose, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniformMatrix3x2fv(GLuint program,
-                                           GLint location,
-                                           GLsizei count,
-                                           GLboolean transpose,
-                                           const GLfloat *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix3x2fv, "glProgramUniformMatrix3x2fv",
-          "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
-          "0x%016" PRIxPTR "",
-          CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateProgramUniformMatrix3x2fv(
-                                context, programPacked, locationPacked, count, transpose, value));
-        if (isCallValid)
-        {
-            context->programUniformMatrix3x2fv(programPacked, locationPacked, count, transpose,
-                                               value);
-        }
-        ANGLE_CAPTURE(ProgramUniformMatrix3x2fv, isCallValid, context, programPacked,
-                      locationPacked, count, transpose, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniformMatrix3x4dv(GLuint program,
-                                           GLint location,
-                                           GLsizei count,
-                                           GLboolean transpose,
-                                           const GLdouble *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix3x4dv, "glProgramUniformMatrix3x4dv",
-          "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
-          "0x%016" PRIxPTR "",
-          CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateProgramUniformMatrix3x4dv(
-                                context, programPacked, locationPacked, count, transpose, value));
-        if (isCallValid)
-        {
-            context->programUniformMatrix3x4dv(programPacked, locationPacked, count, transpose,
-                                               value);
-        }
-        ANGLE_CAPTURE(ProgramUniformMatrix3x4dv, isCallValid, context, programPacked,
-                      locationPacked, count, transpose, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniformMatrix3x4fv(GLuint program,
-                                           GLint location,
-                                           GLsizei count,
-                                           GLboolean transpose,
-                                           const GLfloat *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix3x4fv, "glProgramUniformMatrix3x4fv",
-          "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
-          "0x%016" PRIxPTR "",
-          CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateProgramUniformMatrix3x4fv(
-                                context, programPacked, locationPacked, count, transpose, value));
-        if (isCallValid)
-        {
-            context->programUniformMatrix3x4fv(programPacked, locationPacked, count, transpose,
-                                               value);
-        }
-        ANGLE_CAPTURE(ProgramUniformMatrix3x4fv, isCallValid, context, programPacked,
-                      locationPacked, count, transpose, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniformMatrix4dv(GLuint program,
-                                         GLint location,
-                                         GLsizei count,
-                                         GLboolean transpose,
-                                         const GLdouble *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix4dv, "glProgramUniformMatrix4dv",
-          "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
-          "0x%016" PRIxPTR "",
-          CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateProgramUniformMatrix4dv(context, programPacked, locationPacked,
-                                                            count, transpose, value));
-        if (isCallValid)
-        {
-            context->programUniformMatrix4dv(programPacked, locationPacked, count, transpose,
-                                             value);
-        }
-        ANGLE_CAPTURE(ProgramUniformMatrix4dv, isCallValid, context, programPacked, locationPacked,
-                      count, transpose, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniformMatrix4fv(GLuint program,
-                                         GLint location,
-                                         GLsizei count,
-                                         GLboolean transpose,
-                                         const GLfloat *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix4fv, "glProgramUniformMatrix4fv",
-          "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
-          "0x%016" PRIxPTR "",
-          CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateProgramUniformMatrix4fv(context, programPacked, locationPacked,
-                                                            count, transpose, value));
-        if (isCallValid)
-        {
-            context->programUniformMatrix4fv(programPacked, locationPacked, count, transpose,
-                                             value);
-        }
-        ANGLE_CAPTURE(ProgramUniformMatrix4fv, isCallValid, context, programPacked, locationPacked,
-                      count, transpose, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniformMatrix4x2dv(GLuint program,
-                                           GLint location,
-                                           GLsizei count,
-                                           GLboolean transpose,
-                                           const GLdouble *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix4x2dv, "glProgramUniformMatrix4x2dv",
-          "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
-          "0x%016" PRIxPTR "",
-          CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateProgramUniformMatrix4x2dv(
-                                context, programPacked, locationPacked, count, transpose, value));
-        if (isCallValid)
-        {
-            context->programUniformMatrix4x2dv(programPacked, locationPacked, count, transpose,
-                                               value);
-        }
-        ANGLE_CAPTURE(ProgramUniformMatrix4x2dv, isCallValid, context, programPacked,
-                      locationPacked, count, transpose, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniformMatrix4x2fv(GLuint program,
-                                           GLint location,
-                                           GLsizei count,
-                                           GLboolean transpose,
-                                           const GLfloat *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix4x2fv, "glProgramUniformMatrix4x2fv",
-          "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
-          "0x%016" PRIxPTR "",
-          CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateProgramUniformMatrix4x2fv(
-                                context, programPacked, locationPacked, count, transpose, value));
-        if (isCallValid)
-        {
-            context->programUniformMatrix4x2fv(programPacked, locationPacked, count, transpose,
-                                               value);
-        }
-        ANGLE_CAPTURE(ProgramUniformMatrix4x2fv, isCallValid, context, programPacked,
-                      locationPacked, count, transpose, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniformMatrix4x3dv(GLuint program,
-                                           GLint location,
-                                           GLsizei count,
-                                           GLboolean transpose,
-                                           const GLdouble *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix4x3dv, "glProgramUniformMatrix4x3dv",
-          "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
-          "0x%016" PRIxPTR "",
-          CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateProgramUniformMatrix4x3dv(
-                                context, programPacked, locationPacked, count, transpose, value));
-        if (isCallValid)
-        {
-            context->programUniformMatrix4x3dv(programPacked, locationPacked, count, transpose,
-                                               value);
-        }
-        ANGLE_CAPTURE(ProgramUniformMatrix4x3dv, isCallValid, context, programPacked,
-                      locationPacked, count, transpose, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ProgramUniformMatrix4x3fv(GLuint program,
-                                           GLint location,
-                                           GLsizei count,
-                                           GLboolean transpose,
-                                           const GLfloat *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix4x3fv, "glProgramUniformMatrix4x3fv",
-          "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
-          "0x%016" PRIxPTR "",
-          CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateProgramUniformMatrix4x3fv(
-                                context, programPacked, locationPacked, count, transpose, value));
-        if (isCallValid)
-        {
-            context->programUniformMatrix4x3fv(programPacked, locationPacked, count, transpose,
-                                               value);
-        }
-        ANGLE_CAPTURE(ProgramUniformMatrix4x3fv, isCallValid, context, programPacked,
-                      locationPacked, count, transpose, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ReleaseShaderCompiler()
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ReleaseShaderCompiler, "glReleaseShaderCompiler", "context = %d",
-          CID(context));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateReleaseShaderCompiler(context));
-        if (isCallValid)
-        {
-            context->releaseShaderCompiler();
-        }
-        ANGLE_CAPTURE(ReleaseShaderCompiler, isCallValid, context);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ScissorArrayv(GLuint first, GLsizei count, const GLint *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ScissorArrayv, "glScissorArrayv",
-          "context = %d, first = %u, count = %d, v = 0x%016" PRIxPTR "", CID(context), first, count,
-          (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateScissorArrayv(context, first, count, v));
-        if (isCallValid)
-        {
-            context->scissorArrayv(first, count, v);
-        }
-        ANGLE_CAPTURE(ScissorArrayv, isCallValid, context, first, count, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY
-ScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ScissorIndexed, "glScissorIndexed",
-          "context = %d, index = %u, left = %d, bottom = %d, width = %d, height = %d", CID(context),
-          index, left, bottom, width, height);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateScissorIndexed(context, index, left, bottom, width, height));
-        if (isCallValid)
-        {
-            context->scissorIndexed(index, left, bottom, width, height);
-        }
-        ANGLE_CAPTURE(ScissorIndexed, isCallValid, context, index, left, bottom, width, height);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ScissorIndexedv(GLuint index, const GLint *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ScissorIndexedv, "glScissorIndexedv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateScissorIndexedv(context, index, v));
-        if (isCallValid)
-        {
-            context->scissorIndexedv(index, v);
-        }
-        ANGLE_CAPTURE(ScissorIndexedv, isCallValid, context, index, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ShaderBinary(GLsizei count,
-                              const GLuint *shaders,
-                              GLenum binaryformat,
-                              const void *binary,
-                              GLsizei length)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ShaderBinary, "glShaderBinary",
-          "context = %d, count = %d, shaders = 0x%016" PRIxPTR
-          ", binaryformat = %s, binary = 0x%016" PRIxPTR ", length = %d",
-          CID(context), count, (uintptr_t)shaders,
-          GLenumToString(GLenumGroup::DefaultGroup, binaryformat), (uintptr_t)binary, length);
-
-    if (context)
-    {
-        const ShaderProgramID *shadersPacked = FromGL<const ShaderProgramID *>(shaders);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateShaderBinary(context, count, shadersPacked, binaryformat, binary, length));
-        if (isCallValid)
-        {
-            context->shaderBinary(count, shadersPacked, binaryformat, binary, length);
-        }
-        ANGLE_CAPTURE(ShaderBinary, isCallValid, context, count, shadersPacked, binaryformat,
-                      binary, length);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY UseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::UseProgramStages, "glUseProgramStages",
-          "context = %d, pipeline = %u, stages = %s, program = %u", CID(context), pipeline,
-          GLbitfieldToString(GLenumGroup::UseProgramStageMask, stages).c_str(), program);
-
-    if (context)
-    {
-        ProgramPipelineID pipelinePacked                      = FromGL<ProgramPipelineID>(pipeline);
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateUseProgramStages(context, pipelinePacked, stages, programPacked));
-        if (isCallValid)
-        {
-            context->useProgramStages(pipelinePacked, stages, programPacked);
-        }
-        ANGLE_CAPTURE(UseProgramStages, isCallValid, context, pipelinePacked, stages,
-                      programPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ValidateProgramPipeline(GLuint pipeline)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ValidateProgramPipeline, "glValidateProgramPipeline",
-          "context = %d, pipeline = %u", CID(context), pipeline);
-
-    if (context)
-    {
-        ProgramPipelineID pipelinePacked                      = FromGL<ProgramPipelineID>(pipeline);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateValidateProgramPipeline(context, pipelinePacked));
-        if (isCallValid)
-        {
-            context->validateProgramPipeline(pipelinePacked);
-        }
-        ANGLE_CAPTURE(ValidateProgramPipeline, isCallValid, context, pipelinePacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribL1d(GLuint index, GLdouble x)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribL1d, "glVertexAttribL1d",
-          "context = %d, index = %u, x = %f", CID(context), index, x);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateVertexAttribL1d(context, index, x));
-        if (isCallValid)
-        {
-            context->vertexAttribL1d(index, x);
-        }
-        ANGLE_CAPTURE(VertexAttribL1d, isCallValid, context, index, x);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribL1dv(GLuint index, const GLdouble *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribL1dv, "glVertexAttribL1dv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateVertexAttribL1dv(context, index, v));
-        if (isCallValid)
-        {
-            context->vertexAttribL1dv(index, v);
-        }
-        ANGLE_CAPTURE(VertexAttribL1dv, isCallValid, context, index, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribL2d(GLuint index, GLdouble x, GLdouble y)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribL2d, "glVertexAttribL2d",
-          "context = %d, index = %u, x = %f, y = %f", CID(context), index, x, y);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateVertexAttribL2d(context, index, x, y));
-        if (isCallValid)
-        {
-            context->vertexAttribL2d(index, x, y);
-        }
-        ANGLE_CAPTURE(VertexAttribL2d, isCallValid, context, index, x, y);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribL2dv(GLuint index, const GLdouble *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribL2dv, "glVertexAttribL2dv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateVertexAttribL2dv(context, index, v));
-        if (isCallValid)
-        {
-            context->vertexAttribL2dv(index, v);
-        }
-        ANGLE_CAPTURE(VertexAttribL2dv, isCallValid, context, index, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribL3d, "glVertexAttribL3d",
-          "context = %d, index = %u, x = %f, y = %f, z = %f", CID(context), index, x, y, z);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateVertexAttribL3d(context, index, x, y, z));
-        if (isCallValid)
-        {
-            context->vertexAttribL3d(index, x, y, z);
-        }
-        ANGLE_CAPTURE(VertexAttribL3d, isCallValid, context, index, x, y, z);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribL3dv(GLuint index, const GLdouble *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribL3dv, "glVertexAttribL3dv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateVertexAttribL3dv(context, index, v));
-        if (isCallValid)
-        {
-            context->vertexAttribL3dv(index, v);
-        }
-        ANGLE_CAPTURE(VertexAttribL3dv, isCallValid, context, index, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribL4d, "glVertexAttribL4d",
-          "context = %d, index = %u, x = %f, y = %f, z = %f, w = %f", CID(context), index, x, y, z,
-          w);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateVertexAttribL4d(context, index, x, y, z, w));
-        if (isCallValid)
-        {
-            context->vertexAttribL4d(index, x, y, z, w);
-        }
-        ANGLE_CAPTURE(VertexAttribL4d, isCallValid, context, index, x, y, z, w);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribL4dv(GLuint index, const GLdouble *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribL4dv, "glVertexAttribL4dv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateVertexAttribL4dv(context, index, v));
-        if (isCallValid)
-        {
-            context->vertexAttribL4dv(index, v);
-        }
-        ANGLE_CAPTURE(VertexAttribL4dv, isCallValid, context, index, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY
-VertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribLPointer, "glVertexAttribLPointer",
-          "context = %d, index = %u, size = %d, type = %s, stride = %d, pointer = 0x%016" PRIxPTR
-          "",
-          CID(context), index, size, GLenumToString(GLenumGroup::VertexAttribPointerType, type),
-          stride, (uintptr_t)pointer);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateVertexAttribLPointer(context, index, size, type, stride, pointer));
-        if (isCallValid)
-        {
-            context->vertexAttribLPointer(index, size, type, stride, pointer);
-        }
-        ANGLE_CAPTURE(VertexAttribLPointer, isCallValid, context, index, size, type, stride,
-                      pointer);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ViewportArrayv(GLuint first, GLsizei count, const GLfloat *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ViewportArrayv, "glViewportArrayv",
-          "context = %d, first = %u, count = %d, v = 0x%016" PRIxPTR "", CID(context), first, count,
-          (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateViewportArrayv(context, first, count, v));
-        if (isCallValid)
-        {
-            context->viewportArrayv(first, count, v);
-        }
-        ANGLE_CAPTURE(ViewportArrayv, isCallValid, context, first, count, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ViewportIndexedf, "glViewportIndexedf",
-          "context = %d, index = %u, x = %f, y = %f, w = %f, h = %f", CID(context), index, x, y, w,
-          h);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateViewportIndexedf(context, index, x, y, w, h));
-        if (isCallValid)
-        {
-            context->viewportIndexedf(index, x, y, w, h);
-        }
-        ANGLE_CAPTURE(ViewportIndexedf, isCallValid, context, index, x, y, w, h);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ViewportIndexedfv(GLuint index, const GLfloat *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ViewportIndexedfv, "glViewportIndexedfv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateViewportIndexedfv(context, index, v));
-        if (isCallValid)
-        {
-            context->viewportIndexedfv(index, v);
-        }
-        ANGLE_CAPTURE(ViewportIndexedfv, isCallValid, context, index, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-}  // namespace gl
diff --git a/src/libGL/entry_points_gl_4_1_autogen.h b/src/libGL/entry_points_gl_4_1_autogen.h
deleted file mode 100644
index b4f77e0..0000000
--- a/src/libGL/entry_points_gl_4_1_autogen.h
+++ /dev/null
@@ -1,273 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// entry_points_gl_4_1_autogen.h:
-//   Defines the GL 4.1 entry points.
-
-#ifndef LIBGL_ENTRY_POINTS_GL_4_1_AUTOGEN_H_
-#define LIBGL_ENTRY_POINTS_GL_4_1_AUTOGEN_H_
-
-#include <export.h>
-#include "angle_gl.h"
-
-namespace gl
-{
-ANGLE_EXPORT void GL_APIENTRY ActiveShaderProgram(GLuint pipeline, GLuint program);
-ANGLE_EXPORT void GL_APIENTRY BindProgramPipeline(GLuint pipeline);
-ANGLE_EXPORT void GL_APIENTRY ClearDepthf(GLfloat d);
-ANGLE_EXPORT GLuint GL_APIENTRY CreateShaderProgramv(GLenum type,
-                                                     GLsizei count,
-                                                     const GLchar *const *strings);
-ANGLE_EXPORT void GL_APIENTRY DeleteProgramPipelines(GLsizei n, const GLuint *pipelines);
-ANGLE_EXPORT void GL_APIENTRY DepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v);
-ANGLE_EXPORT void GL_APIENTRY DepthRangeIndexed(GLuint index, GLdouble n, GLdouble f);
-ANGLE_EXPORT void GL_APIENTRY DepthRangef(GLfloat n, GLfloat f);
-ANGLE_EXPORT void GL_APIENTRY GenProgramPipelines(GLsizei n, GLuint *pipelines);
-ANGLE_EXPORT void GL_APIENTRY GetDoublei_v(GLenum target, GLuint index, GLdouble *data);
-ANGLE_EXPORT void GL_APIENTRY GetFloati_v(GLenum target, GLuint index, GLfloat *data);
-ANGLE_EXPORT void GL_APIENTRY GetProgramBinary(GLuint program,
-                                               GLsizei bufSize,
-                                               GLsizei *length,
-                                               GLenum *binaryFormat,
-                                               void *binary);
-ANGLE_EXPORT void GL_APIENTRY GetProgramPipelineInfoLog(GLuint pipeline,
-                                                        GLsizei bufSize,
-                                                        GLsizei *length,
-                                                        GLchar *infoLog);
-ANGLE_EXPORT void GL_APIENTRY GetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params);
-ANGLE_EXPORT void GL_APIENTRY GetShaderPrecisionFormat(GLenum shadertype,
-                                                       GLenum precisiontype,
-                                                       GLint *range,
-                                                       GLint *precision);
-ANGLE_EXPORT void GL_APIENTRY GetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params);
-ANGLE_EXPORT GLboolean GL_APIENTRY IsProgramPipeline(GLuint pipeline);
-ANGLE_EXPORT void GL_APIENTRY ProgramBinary(GLuint program,
-                                            GLenum binaryFormat,
-                                            const void *binary,
-                                            GLsizei length);
-ANGLE_EXPORT void GL_APIENTRY ProgramParameteri(GLuint program, GLenum pname, GLint value);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniform1d(GLuint program, GLint location, GLdouble v0);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniform1dv(GLuint program,
-                                                GLint location,
-                                                GLsizei count,
-                                                const GLdouble *value);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniform1f(GLuint program, GLint location, GLfloat v0);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniform1fv(GLuint program,
-                                                GLint location,
-                                                GLsizei count,
-                                                const GLfloat *value);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniform1i(GLuint program, GLint location, GLint v0);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniform1iv(GLuint program,
-                                                GLint location,
-                                                GLsizei count,
-                                                const GLint *value);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniform1ui(GLuint program, GLint location, GLuint v0);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniform1uiv(GLuint program,
-                                                 GLint location,
-                                                 GLsizei count,
-                                                 const GLuint *value);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniform2d(GLuint program,
-                                               GLint location,
-                                               GLdouble v0,
-                                               GLdouble v1);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniform2dv(GLuint program,
-                                                GLint location,
-                                                GLsizei count,
-                                                const GLdouble *value);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniform2f(GLuint program,
-                                               GLint location,
-                                               GLfloat v0,
-                                               GLfloat v1);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniform2fv(GLuint program,
-                                                GLint location,
-                                                GLsizei count,
-                                                const GLfloat *value);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniform2iv(GLuint program,
-                                                GLint location,
-                                                GLsizei count,
-                                                const GLint *value);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniform2ui(GLuint program,
-                                                GLint location,
-                                                GLuint v0,
-                                                GLuint v1);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniform2uiv(GLuint program,
-                                                 GLint location,
-                                                 GLsizei count,
-                                                 const GLuint *value);
-ANGLE_EXPORT void GL_APIENTRY
-ProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniform3dv(GLuint program,
-                                                GLint location,
-                                                GLsizei count,
-                                                const GLdouble *value);
-ANGLE_EXPORT void GL_APIENTRY
-ProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniform3fv(GLuint program,
-                                                GLint location,
-                                                GLsizei count,
-                                                const GLfloat *value);
-ANGLE_EXPORT void GL_APIENTRY
-ProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniform3iv(GLuint program,
-                                                GLint location,
-                                                GLsizei count,
-                                                const GLint *value);
-ANGLE_EXPORT void GL_APIENTRY
-ProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniform3uiv(GLuint program,
-                                                 GLint location,
-                                                 GLsizei count,
-                                                 const GLuint *value);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniform4d(GLuint program,
-                                               GLint location,
-                                               GLdouble v0,
-                                               GLdouble v1,
-                                               GLdouble v2,
-                                               GLdouble v3);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniform4dv(GLuint program,
-                                                GLint location,
-                                                GLsizei count,
-                                                const GLdouble *value);
-ANGLE_EXPORT void GL_APIENTRY
-ProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniform4fv(GLuint program,
-                                                GLint location,
-                                                GLsizei count,
-                                                const GLfloat *value);
-ANGLE_EXPORT void GL_APIENTRY
-ProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniform4iv(GLuint program,
-                                                GLint location,
-                                                GLsizei count,
-                                                const GLint *value);
-ANGLE_EXPORT void GL_APIENTRY
-ProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniform4uiv(GLuint program,
-                                                 GLint location,
-                                                 GLsizei count,
-                                                 const GLuint *value);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniformMatrix2dv(GLuint program,
-                                                      GLint location,
-                                                      GLsizei count,
-                                                      GLboolean transpose,
-                                                      const GLdouble *value);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniformMatrix2fv(GLuint program,
-                                                      GLint location,
-                                                      GLsizei count,
-                                                      GLboolean transpose,
-                                                      const GLfloat *value);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniformMatrix2x3dv(GLuint program,
-                                                        GLint location,
-                                                        GLsizei count,
-                                                        GLboolean transpose,
-                                                        const GLdouble *value);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniformMatrix2x3fv(GLuint program,
-                                                        GLint location,
-                                                        GLsizei count,
-                                                        GLboolean transpose,
-                                                        const GLfloat *value);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniformMatrix2x4dv(GLuint program,
-                                                        GLint location,
-                                                        GLsizei count,
-                                                        GLboolean transpose,
-                                                        const GLdouble *value);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniformMatrix2x4fv(GLuint program,
-                                                        GLint location,
-                                                        GLsizei count,
-                                                        GLboolean transpose,
-                                                        const GLfloat *value);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniformMatrix3dv(GLuint program,
-                                                      GLint location,
-                                                      GLsizei count,
-                                                      GLboolean transpose,
-                                                      const GLdouble *value);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniformMatrix3fv(GLuint program,
-                                                      GLint location,
-                                                      GLsizei count,
-                                                      GLboolean transpose,
-                                                      const GLfloat *value);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniformMatrix3x2dv(GLuint program,
-                                                        GLint location,
-                                                        GLsizei count,
-                                                        GLboolean transpose,
-                                                        const GLdouble *value);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniformMatrix3x2fv(GLuint program,
-                                                        GLint location,
-                                                        GLsizei count,
-                                                        GLboolean transpose,
-                                                        const GLfloat *value);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniformMatrix3x4dv(GLuint program,
-                                                        GLint location,
-                                                        GLsizei count,
-                                                        GLboolean transpose,
-                                                        const GLdouble *value);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniformMatrix3x4fv(GLuint program,
-                                                        GLint location,
-                                                        GLsizei count,
-                                                        GLboolean transpose,
-                                                        const GLfloat *value);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniformMatrix4dv(GLuint program,
-                                                      GLint location,
-                                                      GLsizei count,
-                                                      GLboolean transpose,
-                                                      const GLdouble *value);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniformMatrix4fv(GLuint program,
-                                                      GLint location,
-                                                      GLsizei count,
-                                                      GLboolean transpose,
-                                                      const GLfloat *value);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniformMatrix4x2dv(GLuint program,
-                                                        GLint location,
-                                                        GLsizei count,
-                                                        GLboolean transpose,
-                                                        const GLdouble *value);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniformMatrix4x2fv(GLuint program,
-                                                        GLint location,
-                                                        GLsizei count,
-                                                        GLboolean transpose,
-                                                        const GLfloat *value);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniformMatrix4x3dv(GLuint program,
-                                                        GLint location,
-                                                        GLsizei count,
-                                                        GLboolean transpose,
-                                                        const GLdouble *value);
-ANGLE_EXPORT void GL_APIENTRY ProgramUniformMatrix4x3fv(GLuint program,
-                                                        GLint location,
-                                                        GLsizei count,
-                                                        GLboolean transpose,
-                                                        const GLfloat *value);
-ANGLE_EXPORT void GL_APIENTRY ReleaseShaderCompiler();
-ANGLE_EXPORT void GL_APIENTRY ScissorArrayv(GLuint first, GLsizei count, const GLint *v);
-ANGLE_EXPORT void GL_APIENTRY
-ScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);
-ANGLE_EXPORT void GL_APIENTRY ScissorIndexedv(GLuint index, const GLint *v);
-ANGLE_EXPORT void GL_APIENTRY ShaderBinary(GLsizei count,
-                                           const GLuint *shaders,
-                                           GLenum binaryformat,
-                                           const void *binary,
-                                           GLsizei length);
-ANGLE_EXPORT void GL_APIENTRY UseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program);
-ANGLE_EXPORT void GL_APIENTRY ValidateProgramPipeline(GLuint pipeline);
-ANGLE_EXPORT void GL_APIENTRY VertexAttribL1d(GLuint index, GLdouble x);
-ANGLE_EXPORT void GL_APIENTRY VertexAttribL1dv(GLuint index, const GLdouble *v);
-ANGLE_EXPORT void GL_APIENTRY VertexAttribL2d(GLuint index, GLdouble x, GLdouble y);
-ANGLE_EXPORT void GL_APIENTRY VertexAttribL2dv(GLuint index, const GLdouble *v);
-ANGLE_EXPORT void GL_APIENTRY VertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
-ANGLE_EXPORT void GL_APIENTRY VertexAttribL3dv(GLuint index, const GLdouble *v);
-ANGLE_EXPORT void GL_APIENTRY
-VertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
-ANGLE_EXPORT void GL_APIENTRY VertexAttribL4dv(GLuint index, const GLdouble *v);
-ANGLE_EXPORT void GL_APIENTRY
-VertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
-ANGLE_EXPORT void GL_APIENTRY ViewportArrayv(GLuint first, GLsizei count, const GLfloat *v);
-ANGLE_EXPORT void GL_APIENTRY
-ViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
-ANGLE_EXPORT void GL_APIENTRY ViewportIndexedfv(GLuint index, const GLfloat *v);
-}  // namespace gl
-
-#endif  // LIBGL_ENTRY_POINTS_GL_4_1_AUTOGEN_H_
diff --git a/src/libGL/entry_points_gl_4_2_autogen.cpp b/src/libGL/entry_points_gl_4_2_autogen.cpp
deleted file mode 100644
index cf0b89c..0000000
--- a/src/libGL/entry_points_gl_4_2_autogen.cpp
+++ /dev/null
@@ -1,409 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// entry_points_gl_4_2_autogen.cpp:
-//   Defines the GL 4.2 entry points.
-
-#include "libGL/entry_points_gl_4_2_autogen.h"
-
-#include "libANGLE/Context.h"
-#include "libANGLE/Context.inl.h"
-#include "libANGLE/entry_points_utils.h"
-#include "libANGLE/gl_enum_utils.h"
-#include "libANGLE/validationEGL.h"
-#include "libANGLE/validationES.h"
-#include "libANGLE/validationES1.h"
-#include "libANGLE/validationES2.h"
-#include "libANGLE/validationES3.h"
-#include "libANGLE/validationES31.h"
-#include "libANGLE/validationES32.h"
-#include "libANGLE/validationESEXT.h"
-#include "libANGLE/validationGL42_autogen.h"
-#include "libGLESv2/global_state.h"
-
-namespace gl
-{
-void GL_APIENTRY BindImageTexture(GLuint unit,
-                                  GLuint texture,
-                                  GLint level,
-                                  GLboolean layered,
-                                  GLint layer,
-                                  GLenum access,
-                                  GLenum format)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindImageTexture, "glBindImageTexture",
-          "context = %d, unit = %u, texture = %u, level = %d, layered = %s, layer = %d, access = "
-          "%s, format = %s",
-          CID(context), unit, texture, level, GLbooleanToString(layered), layer,
-          GLenumToString(GLenumGroup::BufferAccessARB, access),
-          GLenumToString(GLenumGroup::InternalFormat, format));
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateBindImageTexture(context, unit, texturePacked, level, layered,
-                                                     layer, access, format));
-        if (isCallValid)
-        {
-            context->bindImageTexture(unit, texturePacked, level, layered, layer, access, format);
-        }
-        ANGLE_CAPTURE(BindImageTexture, isCallValid, context, unit, texturePacked, level, layered,
-                      layer, access, format);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DrawArraysInstancedBaseInstance(GLenum mode,
-                                                 GLint first,
-                                                 GLsizei count,
-                                                 GLsizei instancecount,
-                                                 GLuint baseinstance)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawArraysInstancedBaseInstance,
-          "glDrawArraysInstancedBaseInstance",
-          "context = %d, mode = %s, first = %d, count = %d, instancecount = %d, baseinstance = %u",
-          CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), first, count,
-          instancecount, baseinstance);
-
-    if (context)
-    {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateDrawArraysInstancedBaseInstance(
-                                context, modePacked, first, count, instancecount, baseinstance));
-        if (isCallValid)
-        {
-            context->drawArraysInstancedBaseInstance(modePacked, first, count, instancecount,
-                                                     baseinstance);
-        }
-        ANGLE_CAPTURE(DrawArraysInstancedBaseInstance, isCallValid, context, modePacked, first,
-                      count, instancecount, baseinstance);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DrawElementsInstancedBaseInstance(GLenum mode,
-                                                   GLsizei count,
-                                                   GLenum type,
-                                                   const void *indices,
-                                                   GLsizei instancecount,
-                                                   GLuint baseinstance)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawElementsInstancedBaseInstance,
-          "glDrawElementsInstancedBaseInstance",
-          "context = %d, mode = %s, count = %d, type = %s, indices = 0x%016" PRIxPTR
-          ", instancecount = %d, baseinstance = %u",
-          CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), count,
-          GLenumToString(GLenumGroup::PrimitiveType, type), (uintptr_t)indices, instancecount,
-          baseinstance);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateDrawElementsInstancedBaseInstance(
-                                context, mode, count, type, indices, instancecount, baseinstance));
-        if (isCallValid)
-        {
-            context->drawElementsInstancedBaseInstance(mode, count, type, indices, instancecount,
-                                                       baseinstance);
-        }
-        ANGLE_CAPTURE(DrawElementsInstancedBaseInstance, isCallValid, context, mode, count, type,
-                      indices, instancecount, baseinstance);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DrawElementsInstancedBaseVertexBaseInstance(GLenum mode,
-                                                             GLsizei count,
-                                                             GLenum type,
-                                                             const void *indices,
-                                                             GLsizei instancecount,
-                                                             GLint basevertex,
-                                                             GLuint baseinstance)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawElementsInstancedBaseVertexBaseInstance,
-          "glDrawElementsInstancedBaseVertexBaseInstance",
-          "context = %d, mode = %s, count = %d, type = %s, indices = 0x%016" PRIxPTR
-          ", instancecount = %d, basevertex = %d, baseinstance = %u",
-          CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), count,
-          GLenumToString(GLenumGroup::PrimitiveType, type), (uintptr_t)indices, instancecount,
-          basevertex, baseinstance);
-
-    if (context)
-    {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateDrawElementsInstancedBaseVertexBaseInstance(
-                                              context, modePacked, count, typePacked, indices,
-                                              instancecount, basevertex, baseinstance));
-        if (isCallValid)
-        {
-            context->drawElementsInstancedBaseVertexBaseInstance(
-                modePacked, count, typePacked, indices, instancecount, basevertex, baseinstance);
-        }
-        ANGLE_CAPTURE(DrawElementsInstancedBaseVertexBaseInstance, isCallValid, context, modePacked,
-                      count, typePacked, indices, instancecount, basevertex, baseinstance);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DrawTransformFeedbackInstanced(GLenum mode, GLuint id, GLsizei instancecount)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawTransformFeedbackInstanced,
-          "glDrawTransformFeedbackInstanced",
-          "context = %d, mode = %s, id = %u, instancecount = %d", CID(context),
-          GLenumToString(GLenumGroup::PrimitiveType, mode), id, instancecount);
-
-    if (context)
-    {
-        TransformFeedbackID idPacked                          = FromGL<TransformFeedbackID>(id);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateDrawTransformFeedbackInstanced(context, mode, idPacked, instancecount));
-        if (isCallValid)
-        {
-            context->drawTransformFeedbackInstanced(mode, idPacked, instancecount);
-        }
-        ANGLE_CAPTURE(DrawTransformFeedbackInstanced, isCallValid, context, mode, idPacked,
-                      instancecount);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DrawTransformFeedbackStreamInstanced(GLenum mode,
-                                                      GLuint id,
-                                                      GLuint stream,
-                                                      GLsizei instancecount)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawTransformFeedbackStreamInstanced,
-          "glDrawTransformFeedbackStreamInstanced",
-          "context = %d, mode = %s, id = %u, stream = %u, instancecount = %d", CID(context),
-          GLenumToString(GLenumGroup::PrimitiveType, mode), id, stream, instancecount);
-
-    if (context)
-    {
-        TransformFeedbackID idPacked                          = FromGL<TransformFeedbackID>(id);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateDrawTransformFeedbackStreamInstanced(
-                                              context, mode, idPacked, stream, instancecount));
-        if (isCallValid)
-        {
-            context->drawTransformFeedbackStreamInstanced(mode, idPacked, stream, instancecount);
-        }
-        ANGLE_CAPTURE(DrawTransformFeedbackStreamInstanced, isCallValid, context, mode, idPacked,
-                      stream, instancecount);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetActiveAtomicCounterBufferiv(GLuint program,
-                                                GLuint bufferIndex,
-                                                GLenum pname,
-                                                GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetActiveAtomicCounterBufferiv,
-          "glGetActiveAtomicCounterBufferiv",
-          "context = %d, program = %u, bufferIndex = %u, pname = %s, params = 0x%016" PRIxPTR "",
-          CID(context), program, bufferIndex,
-          GLenumToString(GLenumGroup::AtomicCounterBufferPName, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetActiveAtomicCounterBufferiv(
-                                              context, programPacked, bufferIndex, pname, params));
-        if (isCallValid)
-        {
-            context->getActiveAtomicCounterBufferiv(programPacked, bufferIndex, pname, params);
-        }
-        ANGLE_CAPTURE(GetActiveAtomicCounterBufferiv, isCallValid, context, programPacked,
-                      bufferIndex, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetInternalformativ(GLenum target,
-                                     GLenum internalformat,
-                                     GLenum pname,
-                                     GLsizei bufSize,
-                                     GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetInternalformativ, "glGetInternalformativ",
-          "context = %d, target = %s, internalformat = %s, pname = %s, bufSize = %d, params = "
-          "0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::TextureTarget, target),
-          GLenumToString(GLenumGroup::InternalFormat, internalformat),
-          GLenumToString(GLenumGroup::InternalFormatPName, pname), bufSize, (uintptr_t)params);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetInternalformativ(context, target, internalformat, pname, bufSize, params));
-        if (isCallValid)
-        {
-            context->getInternalformativ(target, internalformat, pname, bufSize, params);
-        }
-        ANGLE_CAPTURE(GetInternalformativ, isCallValid, context, target, internalformat, pname,
-                      bufSize, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MemoryBarrier(GLbitfield barriers)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MemoryBarrier, "glMemoryBarrier", "context = %d, barriers = %s",
-          CID(context), GLbitfieldToString(GLenumGroup::MemoryBarrierMask, barriers).c_str());
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateMemoryBarrier(context, barriers));
-        if (isCallValid)
-        {
-            context->memoryBarrier(barriers);
-        }
-        ANGLE_CAPTURE(MemoryBarrier, isCallValid, context, barriers);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexStorage1D, "glTexStorage1D",
-          "context = %d, target = %s, levels = %d, internalformat = %s, width = %d", CID(context),
-          GLenumToString(GLenumGroup::TextureTarget, target), levels,
-          GLenumToString(GLenumGroup::InternalFormat, internalformat), width);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateTexStorage1D(context, target, levels, internalformat, width));
-        if (isCallValid)
-        {
-            context->texStorage1D(target, levels, internalformat, width);
-        }
-        ANGLE_CAPTURE(TexStorage1D, isCallValid, context, target, levels, internalformat, width);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY
-TexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexStorage2D, "glTexStorage2D",
-          "context = %d, target = %s, levels = %d, internalformat = %s, width = %d, height = %d",
-          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), levels,
-          GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height);
-
-    if (context)
-    {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateTexStorage2D(context, targetPacked, levels, internalformat, width, height));
-        if (isCallValid)
-        {
-            context->texStorage2D(targetPacked, levels, internalformat, width, height);
-        }
-        ANGLE_CAPTURE(TexStorage2D, isCallValid, context, targetPacked, levels, internalformat,
-                      width, height);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexStorage3D(GLenum target,
-                              GLsizei levels,
-                              GLenum internalformat,
-                              GLsizei width,
-                              GLsizei height,
-                              GLsizei depth)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexStorage3D, "glTexStorage3D",
-          "context = %d, target = %s, levels = %d, internalformat = %s, width = %d, height = %d, "
-          "depth = %d",
-          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), levels,
-          GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height, depth);
-
-    if (context)
-    {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateTexStorage3D(context, targetPacked, levels, internalformat,
-                                                 width, height, depth));
-        if (isCallValid)
-        {
-            context->texStorage3D(targetPacked, levels, internalformat, width, height, depth);
-        }
-        ANGLE_CAPTURE(TexStorage3D, isCallValid, context, targetPacked, levels, internalformat,
-                      width, height, depth);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-}  // namespace gl
diff --git a/src/libGL/entry_points_gl_4_2_autogen.h b/src/libGL/entry_points_gl_4_2_autogen.h
deleted file mode 100644
index 1c67851..0000000
--- a/src/libGL/entry_points_gl_4_2_autogen.h
+++ /dev/null
@@ -1,75 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// entry_points_gl_4_2_autogen.h:
-//   Defines the GL 4.2 entry points.
-
-#ifndef LIBGL_ENTRY_POINTS_GL_4_2_AUTOGEN_H_
-#define LIBGL_ENTRY_POINTS_GL_4_2_AUTOGEN_H_
-
-#include <export.h>
-#include "angle_gl.h"
-
-namespace gl
-{
-ANGLE_EXPORT void GL_APIENTRY BindImageTexture(GLuint unit,
-                                               GLuint texture,
-                                               GLint level,
-                                               GLboolean layered,
-                                               GLint layer,
-                                               GLenum access,
-                                               GLenum format);
-ANGLE_EXPORT void GL_APIENTRY DrawArraysInstancedBaseInstance(GLenum mode,
-                                                              GLint first,
-                                                              GLsizei count,
-                                                              GLsizei instancecount,
-                                                              GLuint baseinstance);
-ANGLE_EXPORT void GL_APIENTRY DrawElementsInstancedBaseInstance(GLenum mode,
-                                                                GLsizei count,
-                                                                GLenum type,
-                                                                const void *indices,
-                                                                GLsizei instancecount,
-                                                                GLuint baseinstance);
-ANGLE_EXPORT void GL_APIENTRY DrawElementsInstancedBaseVertexBaseInstance(GLenum mode,
-                                                                          GLsizei count,
-                                                                          GLenum type,
-                                                                          const void *indices,
-                                                                          GLsizei instancecount,
-                                                                          GLint basevertex,
-                                                                          GLuint baseinstance);
-ANGLE_EXPORT void GL_APIENTRY DrawTransformFeedbackInstanced(GLenum mode,
-                                                             GLuint id,
-                                                             GLsizei instancecount);
-ANGLE_EXPORT void GL_APIENTRY DrawTransformFeedbackStreamInstanced(GLenum mode,
-                                                                   GLuint id,
-                                                                   GLuint stream,
-                                                                   GLsizei instancecount);
-ANGLE_EXPORT void GL_APIENTRY GetActiveAtomicCounterBufferiv(GLuint program,
-                                                             GLuint bufferIndex,
-                                                             GLenum pname,
-                                                             GLint *params);
-ANGLE_EXPORT void GL_APIENTRY GetInternalformativ(GLenum target,
-                                                  GLenum internalformat,
-                                                  GLenum pname,
-                                                  GLsizei bufSize,
-                                                  GLint *params);
-ANGLE_EXPORT void GL_APIENTRY MemoryBarrier(GLbitfield barriers);
-ANGLE_EXPORT void GL_APIENTRY TexStorage1D(GLenum target,
-                                           GLsizei levels,
-                                           GLenum internalformat,
-                                           GLsizei width);
-ANGLE_EXPORT void GL_APIENTRY
-TexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
-ANGLE_EXPORT void GL_APIENTRY TexStorage3D(GLenum target,
-                                           GLsizei levels,
-                                           GLenum internalformat,
-                                           GLsizei width,
-                                           GLsizei height,
-                                           GLsizei depth);
-}  // namespace gl
-
-#endif  // LIBGL_ENTRY_POINTS_GL_4_2_AUTOGEN_H_
diff --git a/src/libGL/entry_points_gl_4_3_autogen.cpp b/src/libGL/entry_points_gl_4_3_autogen.cpp
deleted file mode 100644
index ef8ff77..0000000
--- a/src/libGL/entry_points_gl_4_3_autogen.cpp
+++ /dev/null
@@ -1,1368 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// entry_points_gl_4_3_autogen.cpp:
-//   Defines the GL 4.3 entry points.
-
-#include "libGL/entry_points_gl_4_3_autogen.h"
-
-#include "libANGLE/Context.h"
-#include "libANGLE/Context.inl.h"
-#include "libANGLE/entry_points_utils.h"
-#include "libANGLE/gl_enum_utils.h"
-#include "libANGLE/validationEGL.h"
-#include "libANGLE/validationES.h"
-#include "libANGLE/validationES1.h"
-#include "libANGLE/validationES2.h"
-#include "libANGLE/validationES3.h"
-#include "libANGLE/validationES31.h"
-#include "libANGLE/validationES32.h"
-#include "libANGLE/validationESEXT.h"
-#include "libANGLE/validationGL43_autogen.h"
-#include "libGLESv2/global_state.h"
-
-namespace gl
-{
-void GL_APIENTRY BindVertexBuffer(GLuint bindingindex,
-                                  GLuint buffer,
-                                  GLintptr offset,
-                                  GLsizei stride)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindVertexBuffer, "glBindVertexBuffer",
-          "context = %d, bindingindex = %u, buffer = %u, offset = %llu, stride = %d", CID(context),
-          bindingindex, buffer, static_cast<unsigned long long>(offset), stride);
-
-    if (context)
-    {
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateBindVertexBuffer(context, bindingindex, bufferPacked, offset, stride));
-        if (isCallValid)
-        {
-            context->bindVertexBuffer(bindingindex, bufferPacked, offset, stride);
-        }
-        ANGLE_CAPTURE(BindVertexBuffer, isCallValid, context, bindingindex, bufferPacked, offset,
-                      stride);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY
-ClearBufferData(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ClearBufferData, "glClearBufferData",
-          "context = %d, target = %s, internalformat = %s, format = %s, type = %s, data = "
-          "0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::BufferStorageTarget, target),
-          GLenumToString(GLenumGroup::InternalFormat, internalformat),
-          GLenumToString(GLenumGroup::PixelFormat, format),
-          GLenumToString(GLenumGroup::PixelType, type), (uintptr_t)data);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateClearBufferData(context, target, internalformat, format, type, data));
-        if (isCallValid)
-        {
-            context->clearBufferData(target, internalformat, format, type, data);
-        }
-        ANGLE_CAPTURE(ClearBufferData, isCallValid, context, target, internalformat, format, type,
-                      data);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ClearBufferSubData(GLenum target,
-                                    GLenum internalformat,
-                                    GLintptr offset,
-                                    GLsizeiptr size,
-                                    GLenum format,
-                                    GLenum type,
-                                    const void *data)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ClearBufferSubData, "glClearBufferSubData",
-          "context = %d, target = %s, internalformat = %s, offset = %llu, size = %llu, format = "
-          "%s, type = %s, data = 0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::DefaultGroup, target),
-          GLenumToString(GLenumGroup::InternalFormat, internalformat),
-          static_cast<unsigned long long>(offset), static_cast<unsigned long long>(size),
-          GLenumToString(GLenumGroup::PixelFormat, format),
-          GLenumToString(GLenumGroup::PixelType, type), (uintptr_t)data);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateClearBufferSubData(context, target, internalformat, offset,
-                                                       size, format, type, data));
-        if (isCallValid)
-        {
-            context->clearBufferSubData(target, internalformat, offset, size, format, type, data);
-        }
-        ANGLE_CAPTURE(ClearBufferSubData, isCallValid, context, target, internalformat, offset,
-                      size, format, type, data);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY CopyImageSubData(GLuint srcName,
-                                  GLenum srcTarget,
-                                  GLint srcLevel,
-                                  GLint srcX,
-                                  GLint srcY,
-                                  GLint srcZ,
-                                  GLuint dstName,
-                                  GLenum dstTarget,
-                                  GLint dstLevel,
-                                  GLint dstX,
-                                  GLint dstY,
-                                  GLint dstZ,
-                                  GLsizei srcWidth,
-                                  GLsizei srcHeight,
-                                  GLsizei srcDepth)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CopyImageSubData, "glCopyImageSubData",
-          "context = %d, srcName = %u, srcTarget = %s, srcLevel = %d, srcX = %d, srcY = %d, srcZ = "
-          "%d, dstName = %u, dstTarget = %s, dstLevel = %d, dstX = %d, dstY = %d, dstZ = %d, "
-          "srcWidth = %d, srcHeight = %d, srcDepth = %d",
-          CID(context), srcName, GLenumToString(GLenumGroup::CopyBufferSubDataTarget, srcTarget),
-          srcLevel, srcX, srcY, srcZ, dstName,
-          GLenumToString(GLenumGroup::CopyBufferSubDataTarget, dstTarget), dstLevel, dstX, dstY,
-          dstZ, srcWidth, srcHeight, srcDepth);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateCopyImageSubData(context, srcName, srcTarget, srcLevel, srcX,
-                                                     srcY, srcZ, dstName, dstTarget, dstLevel, dstX,
-                                                     dstY, dstZ, srcWidth, srcHeight, srcDepth));
-        if (isCallValid)
-        {
-            context->copyImageSubData(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName,
-                                      dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight,
-                                      srcDepth);
-        }
-        ANGLE_CAPTURE(CopyImageSubData, isCallValid, context, srcName, srcTarget, srcLevel, srcX,
-                      srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth,
-                      srcHeight, srcDepth);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DebugMessageCallback(GLDEBUGPROC callback, const void *userParam)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DebugMessageCallback, "glDebugMessageCallback",
-          "context = %d, callback = 0x%016" PRIxPTR ", userParam = 0x%016" PRIxPTR "", CID(context),
-          (uintptr_t)callback, (uintptr_t)userParam);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateDebugMessageCallback(context, callback, userParam));
-        if (isCallValid)
-        {
-            context->debugMessageCallback(callback, userParam);
-        }
-        ANGLE_CAPTURE(DebugMessageCallback, isCallValid, context, callback, userParam);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DebugMessageControl(GLenum source,
-                                     GLenum type,
-                                     GLenum severity,
-                                     GLsizei count,
-                                     const GLuint *ids,
-                                     GLboolean enabled)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DebugMessageControl, "glDebugMessageControl",
-          "context = %d, source = %s, type = %s, severity = %s, count = %d, ids = 0x%016" PRIxPTR
-          ", enabled = %s",
-          CID(context), GLenumToString(GLenumGroup::DebugSource, source),
-          GLenumToString(GLenumGroup::DebugType, type),
-          GLenumToString(GLenumGroup::DebugSeverity, severity), count, (uintptr_t)ids,
-          GLbooleanToString(enabled));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateDebugMessageControl(context, source, type, severity, count, ids, enabled));
-        if (isCallValid)
-        {
-            context->debugMessageControl(source, type, severity, count, ids, enabled);
-        }
-        ANGLE_CAPTURE(DebugMessageControl, isCallValid, context, source, type, severity, count, ids,
-                      enabled);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DebugMessageInsert(GLenum source,
-                                    GLenum type,
-                                    GLuint id,
-                                    GLenum severity,
-                                    GLsizei length,
-                                    const GLchar *buf)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DebugMessageInsert, "glDebugMessageInsert",
-          "context = %d, source = %s, type = %s, id = %u, severity = %s, length = %d, buf = "
-          "0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::DebugSource, source),
-          GLenumToString(GLenumGroup::DebugType, type), id,
-          GLenumToString(GLenumGroup::DebugSeverity, severity), length, (uintptr_t)buf);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateDebugMessageInsert(context, source, type, id, severity, length, buf));
-        if (isCallValid)
-        {
-            context->debugMessageInsert(source, type, id, severity, length, buf);
-        }
-        ANGLE_CAPTURE(DebugMessageInsert, isCallValid, context, source, type, id, severity, length,
-                      buf);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DispatchCompute(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DispatchCompute, "glDispatchCompute",
-          "context = %d, num_groups_x = %u, num_groups_y = %u, num_groups_z = %u", CID(context),
-          num_groups_x, num_groups_y, num_groups_z);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateDispatchCompute(context, num_groups_x, num_groups_y, num_groups_z));
-        if (isCallValid)
-        {
-            context->dispatchCompute(num_groups_x, num_groups_y, num_groups_z);
-        }
-        ANGLE_CAPTURE(DispatchCompute, isCallValid, context, num_groups_x, num_groups_y,
-                      num_groups_z);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DispatchComputeIndirect(GLintptr indirect)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DispatchComputeIndirect, "glDispatchComputeIndirect",
-          "context = %d, indirect = %llu", CID(context), static_cast<unsigned long long>(indirect));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateDispatchComputeIndirect(context, indirect));
-        if (isCallValid)
-        {
-            context->dispatchComputeIndirect(indirect);
-        }
-        ANGLE_CAPTURE(DispatchComputeIndirect, isCallValid, context, indirect);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY FramebufferParameteri(GLenum target, GLenum pname, GLint param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::FramebufferParameteri, "glFramebufferParameteri",
-          "context = %d, target = %s, pname = %s, param = %d", CID(context),
-          GLenumToString(GLenumGroup::FramebufferTarget, target),
-          GLenumToString(GLenumGroup::FramebufferParameterName, pname), param);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateFramebufferParameteri(context, target, pname, param));
-        if (isCallValid)
-        {
-            context->framebufferParameteri(target, pname, param);
-        }
-        ANGLE_CAPTURE(FramebufferParameteri, isCallValid, context, target, pname, param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-GLuint GL_APIENTRY GetDebugMessageLog(GLuint count,
-                                      GLsizei bufSize,
-                                      GLenum *sources,
-                                      GLenum *types,
-                                      GLuint *ids,
-                                      GLenum *severities,
-                                      GLsizei *lengths,
-                                      GLchar *messageLog)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetDebugMessageLog, "glGetDebugMessageLog",
-          "context = %d, count = %u, bufSize = %d, sources = 0x%016" PRIxPTR
-          ", types = 0x%016" PRIxPTR ", ids = 0x%016" PRIxPTR ", severities = 0x%016" PRIxPTR
-          ", lengths = 0x%016" PRIxPTR ", messageLog = 0x%016" PRIxPTR "",
-          CID(context), count, bufSize, (uintptr_t)sources, (uintptr_t)types, (uintptr_t)ids,
-          (uintptr_t)severities, (uintptr_t)lengths, (uintptr_t)messageLog);
-
-    GLuint returnValue;
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetDebugMessageLog(context, count, bufSize, sources, types, ids,
-                                                       severities, lengths, messageLog));
-        if (isCallValid)
-        {
-            returnValue = context->getDebugMessageLog(count, bufSize, sources, types, ids,
-                                                      severities, lengths, messageLog);
-        }
-        else
-        {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetDebugMessageLog, GLuint>();
-        }
-        ANGLE_CAPTURE(GetDebugMessageLog, isCallValid, context, count, bufSize, sources, types, ids,
-                      severities, lengths, messageLog, returnValue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::GetDebugMessageLog, GLuint>();
-    }
-    return returnValue;
-}
-
-void GL_APIENTRY GetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetFramebufferParameteriv, "glGetFramebufferParameteriv",
-          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::FramebufferTarget, target),
-          GLenumToString(GLenumGroup::FramebufferAttachmentParameterName, pname),
-          (uintptr_t)params);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetFramebufferParameteriv(context, target, pname, params));
-        if (isCallValid)
-        {
-            context->getFramebufferParameteriv(target, pname, params);
-        }
-        ANGLE_CAPTURE(GetFramebufferParameteriv, isCallValid, context, target, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetInternalformati64v(GLenum target,
-                                       GLenum internalformat,
-                                       GLenum pname,
-                                       GLsizei bufSize,
-                                       GLint64 *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetInternalformati64v, "glGetInternalformati64v",
-          "context = %d, target = %s, internalformat = %s, pname = %s, bufSize = %d, params = "
-          "0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::TextureTarget, target),
-          GLenumToString(GLenumGroup::InternalFormat, internalformat),
-          GLenumToString(GLenumGroup::InternalFormatPName, pname), bufSize, (uintptr_t)params);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetInternalformati64v(context, target, internalformat, pname,
-                                                          bufSize, params));
-        if (isCallValid)
-        {
-            context->getInternalformati64v(target, internalformat, pname, bufSize, params);
-        }
-        ANGLE_CAPTURE(GetInternalformati64v, isCallValid, context, target, internalformat, pname,
-                      bufSize, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY
-GetObjectLabel(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetObjectLabel, "glGetObjectLabel",
-          "context = %d, identifier = %s, name = %u, bufSize = %d, length = 0x%016" PRIxPTR
-          ", label = 0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::DefaultGroup, identifier), name, bufSize,
-          (uintptr_t)length, (uintptr_t)label);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetObjectLabel(context, identifier, name, bufSize, length, label));
-        if (isCallValid)
-        {
-            context->getObjectLabel(identifier, name, bufSize, length, label);
-        }
-        ANGLE_CAPTURE(GetObjectLabel, isCallValid, context, identifier, name, bufSize, length,
-                      label);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetObjectPtrLabel(const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetObjectPtrLabel, "glGetObjectPtrLabel",
-          "context = %d, ptr = 0x%016" PRIxPTR ", bufSize = %d, length = 0x%016" PRIxPTR
-          ", label = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)ptr, bufSize, (uintptr_t)length, (uintptr_t)label);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetObjectPtrLabel(context, ptr, bufSize, length, label));
-        if (isCallValid)
-        {
-            context->getObjectPtrLabel(ptr, bufSize, length, label);
-        }
-        ANGLE_CAPTURE(GetObjectPtrLabel, isCallValid, context, ptr, bufSize, length, label);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetProgramInterfaceiv(GLuint program,
-                                       GLenum programInterface,
-                                       GLenum pname,
-                                       GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetProgramInterfaceiv, "glGetProgramInterfaceiv",
-          "context = %d, program = %u, programInterface = %s, pname = %s, params = 0x%016" PRIxPTR
-          "",
-          CID(context), program, GLenumToString(GLenumGroup::ProgramInterface, programInterface),
-          GLenumToString(GLenumGroup::ProgramInterfacePName, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetProgramInterfaceiv(context, programPacked, programInterface,
-                                                          pname, params));
-        if (isCallValid)
-        {
-            context->getProgramInterfaceiv(programPacked, programInterface, pname, params);
-        }
-        ANGLE_CAPTURE(GetProgramInterfaceiv, isCallValid, context, programPacked, programInterface,
-                      pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-GLuint GL_APIENTRY GetProgramResourceIndex(GLuint program,
-                                           GLenum programInterface,
-                                           const GLchar *name)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetProgramResourceIndex, "glGetProgramResourceIndex",
-          "context = %d, program = %u, programInterface = %s, name = 0x%016" PRIxPTR "",
-          CID(context), program, GLenumToString(GLenumGroup::ProgramInterface, programInterface),
-          (uintptr_t)name);
-
-    GLuint returnValue;
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetProgramResourceIndex(context, programPacked, programInterface, name));
-        if (isCallValid)
-        {
-            returnValue = context->getProgramResourceIndex(programPacked, programInterface, name);
-        }
-        else
-        {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetProgramResourceIndex, GLuint>();
-        }
-        ANGLE_CAPTURE(GetProgramResourceIndex, isCallValid, context, programPacked,
-                      programInterface, name, returnValue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::GetProgramResourceIndex, GLuint>();
-    }
-    return returnValue;
-}
-
-GLint GL_APIENTRY GetProgramResourceLocation(GLuint program,
-                                             GLenum programInterface,
-                                             const GLchar *name)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetProgramResourceLocation, "glGetProgramResourceLocation",
-          "context = %d, program = %u, programInterface = %s, name = 0x%016" PRIxPTR "",
-          CID(context), program, GLenumToString(GLenumGroup::ProgramInterface, programInterface),
-          (uintptr_t)name);
-
-    GLint returnValue;
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetProgramResourceLocation(context, programPacked, programInterface, name));
-        if (isCallValid)
-        {
-            returnValue =
-                context->getProgramResourceLocation(programPacked, programInterface, name);
-        }
-        else
-        {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetProgramResourceLocation, GLint>();
-        }
-        ANGLE_CAPTURE(GetProgramResourceLocation, isCallValid, context, programPacked,
-                      programInterface, name, returnValue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::GetProgramResourceLocation, GLint>();
-    }
-    return returnValue;
-}
-
-GLint GL_APIENTRY GetProgramResourceLocationIndex(GLuint program,
-                                                  GLenum programInterface,
-                                                  const GLchar *name)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetProgramResourceLocationIndex,
-          "glGetProgramResourceLocationIndex",
-          "context = %d, program = %u, programInterface = %s, name = 0x%016" PRIxPTR "",
-          CID(context), program, GLenumToString(GLenumGroup::ProgramInterface, programInterface),
-          (uintptr_t)name);
-
-    GLint returnValue;
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetProgramResourceLocationIndex(
-                                              context, programPacked, programInterface, name));
-        if (isCallValid)
-        {
-            returnValue =
-                context->getProgramResourceLocationIndex(programPacked, programInterface, name);
-        }
-        else
-        {
-            returnValue =
-                GetDefaultReturnValue<EntryPoint::GetProgramResourceLocationIndex, GLint>();
-        }
-        ANGLE_CAPTURE(GetProgramResourceLocationIndex, isCallValid, context, programPacked,
-                      programInterface, name, returnValue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::GetProgramResourceLocationIndex, GLint>();
-    }
-    return returnValue;
-}
-
-void GL_APIENTRY GetProgramResourceName(GLuint program,
-                                        GLenum programInterface,
-                                        GLuint index,
-                                        GLsizei bufSize,
-                                        GLsizei *length,
-                                        GLchar *name)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetProgramResourceName, "glGetProgramResourceName",
-          "context = %d, program = %u, programInterface = %s, index = %u, bufSize = %d, length = "
-          "0x%016" PRIxPTR ", name = 0x%016" PRIxPTR "",
-          CID(context), program, GLenumToString(GLenumGroup::ProgramInterface, programInterface),
-          index, bufSize, (uintptr_t)length, (uintptr_t)name);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetProgramResourceName(context, programPacked, programInterface,
-                                                           index, bufSize, length, name));
-        if (isCallValid)
-        {
-            context->getProgramResourceName(programPacked, programInterface, index, bufSize, length,
-                                            name);
-        }
-        ANGLE_CAPTURE(GetProgramResourceName, isCallValid, context, programPacked, programInterface,
-                      index, bufSize, length, name);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetProgramResourceiv(GLuint program,
-                                      GLenum programInterface,
-                                      GLuint index,
-                                      GLsizei propCount,
-                                      const GLenum *props,
-                                      GLsizei bufSize,
-                                      GLsizei *length,
-                                      GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetProgramResourceiv, "glGetProgramResourceiv",
-          "context = %d, program = %u, programInterface = %s, index = %u, propCount = %d, props = "
-          "0x%016" PRIxPTR ", bufSize = %d, length = 0x%016" PRIxPTR ", params = 0x%016" PRIxPTR "",
-          CID(context), program, GLenumToString(GLenumGroup::ProgramInterface, programInterface),
-          index, propCount, (uintptr_t)props, bufSize, (uintptr_t)length, (uintptr_t)params);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetProgramResourceiv(context, programPacked, programInterface, index,
-                                          propCount, props, bufSize, length, params));
-        if (isCallValid)
-        {
-            context->getProgramResourceiv(programPacked, programInterface, index, propCount, props,
-                                          bufSize, length, params);
-        }
-        ANGLE_CAPTURE(GetProgramResourceiv, isCallValid, context, programPacked, programInterface,
-                      index, propCount, props, bufSize, length, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY InvalidateBufferData(GLuint buffer)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::InvalidateBufferData, "glInvalidateBufferData",
-          "context = %d, buffer = %u", CID(context), buffer);
-
-    if (context)
-    {
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateInvalidateBufferData(context, bufferPacked));
-        if (isCallValid)
-        {
-            context->invalidateBufferData(bufferPacked);
-        }
-        ANGLE_CAPTURE(InvalidateBufferData, isCallValid, context, bufferPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY InvalidateBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr length)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::InvalidateBufferSubData, "glInvalidateBufferSubData",
-          "context = %d, buffer = %u, offset = %llu, length = %llu", CID(context), buffer,
-          static_cast<unsigned long long>(offset), static_cast<unsigned long long>(length));
-
-    if (context)
-    {
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateInvalidateBufferSubData(context, bufferPacked, offset, length));
-        if (isCallValid)
-        {
-            context->invalidateBufferSubData(bufferPacked, offset, length);
-        }
-        ANGLE_CAPTURE(InvalidateBufferSubData, isCallValid, context, bufferPacked, offset, length);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY InvalidateFramebuffer(GLenum target,
-                                       GLsizei numAttachments,
-                                       const GLenum *attachments)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::InvalidateFramebuffer, "glInvalidateFramebuffer",
-          "context = %d, target = %s, numAttachments = %d, attachments = 0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target), numAttachments,
-          (uintptr_t)attachments);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateInvalidateFramebuffer(context, target, numAttachments, attachments));
-        if (isCallValid)
-        {
-            context->invalidateFramebuffer(target, numAttachments, attachments);
-        }
-        ANGLE_CAPTURE(InvalidateFramebuffer, isCallValid, context, target, numAttachments,
-                      attachments);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY InvalidateSubFramebuffer(GLenum target,
-                                          GLsizei numAttachments,
-                                          const GLenum *attachments,
-                                          GLint x,
-                                          GLint y,
-                                          GLsizei width,
-                                          GLsizei height)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::InvalidateSubFramebuffer, "glInvalidateSubFramebuffer",
-          "context = %d, target = %s, numAttachments = %d, attachments = 0x%016" PRIxPTR
-          ", x = %d, y = %d, width = %d, height = %d",
-          CID(context), GLenumToString(GLenumGroup::DefaultGroup, target), numAttachments,
-          (uintptr_t)attachments, x, y, width, height);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateInvalidateSubFramebuffer(context, target, numAttachments,
-                                                             attachments, x, y, width, height));
-        if (isCallValid)
-        {
-            context->invalidateSubFramebuffer(target, numAttachments, attachments, x, y, width,
-                                              height);
-        }
-        ANGLE_CAPTURE(InvalidateSubFramebuffer, isCallValid, context, target, numAttachments,
-                      attachments, x, y, width, height);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY InvalidateTexImage(GLuint texture, GLint level)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::InvalidateTexImage, "glInvalidateTexImage",
-          "context = %d, texture = %u, level = %d", CID(context), texture, level);
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateInvalidateTexImage(context, texturePacked, level));
-        if (isCallValid)
-        {
-            context->invalidateTexImage(texturePacked, level);
-        }
-        ANGLE_CAPTURE(InvalidateTexImage, isCallValid, context, texturePacked, level);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY InvalidateTexSubImage(GLuint texture,
-                                       GLint level,
-                                       GLint xoffset,
-                                       GLint yoffset,
-                                       GLint zoffset,
-                                       GLsizei width,
-                                       GLsizei height,
-                                       GLsizei depth)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::InvalidateTexSubImage, "glInvalidateTexSubImage",
-          "context = %d, texture = %u, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, width "
-          "= %d, height = %d, depth = %d",
-          CID(context), texture, level, xoffset, yoffset, zoffset, width, height, depth);
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateInvalidateTexSubImage(context, texturePacked, level, xoffset,
-                                                          yoffset, zoffset, width, height, depth));
-        if (isCallValid)
-        {
-            context->invalidateTexSubImage(texturePacked, level, xoffset, yoffset, zoffset, width,
-                                           height, depth);
-        }
-        ANGLE_CAPTURE(InvalidateTexSubImage, isCallValid, context, texturePacked, level, xoffset,
-                      yoffset, zoffset, width, height, depth);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiDrawArraysIndirect(GLenum mode,
-                                         const void *indirect,
-                                         GLsizei drawcount,
-                                         GLsizei stride)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiDrawArraysIndirect, "glMultiDrawArraysIndirect",
-          "context = %d, mode = %s, indirect = 0x%016" PRIxPTR ", drawcount = %d, stride = %d",
-          CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), (uintptr_t)indirect,
-          drawcount, stride);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateMultiDrawArraysIndirect(context, mode, indirect, drawcount, stride));
-        if (isCallValid)
-        {
-            context->multiDrawArraysIndirect(mode, indirect, drawcount, stride);
-        }
-        ANGLE_CAPTURE(MultiDrawArraysIndirect, isCallValid, context, mode, indirect, drawcount,
-                      stride);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiDrawElementsIndirect(GLenum mode,
-                                           GLenum type,
-                                           const void *indirect,
-                                           GLsizei drawcount,
-                                           GLsizei stride)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiDrawElementsIndirect, "glMultiDrawElementsIndirect",
-          "context = %d, mode = %s, type = %s, indirect = 0x%016" PRIxPTR
-          ", drawcount = %d, stride = %d",
-          CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode),
-          GLenumToString(GLenumGroup::DrawElementsType, type), (uintptr_t)indirect, drawcount,
-          stride);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateMultiDrawElementsIndirect(context, mode, type, indirect, drawcount, stride));
-        if (isCallValid)
-        {
-            context->multiDrawElementsIndirect(mode, type, indirect, drawcount, stride);
-        }
-        ANGLE_CAPTURE(MultiDrawElementsIndirect, isCallValid, context, mode, type, indirect,
-                      drawcount, stride);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ObjectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ObjectLabel, "glObjectLabel",
-          "context = %d, identifier = %s, name = %u, length = %d, label = 0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::ObjectIdentifier, identifier), name, length,
-          (uintptr_t)label);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateObjectLabel(context, identifier, name, length, label));
-        if (isCallValid)
-        {
-            context->objectLabel(identifier, name, length, label);
-        }
-        ANGLE_CAPTURE(ObjectLabel, isCallValid, context, identifier, name, length, label);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ObjectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ObjectPtrLabel, "glObjectPtrLabel",
-          "context = %d, ptr = 0x%016" PRIxPTR ", length = %d, label = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)ptr, length, (uintptr_t)label);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateObjectPtrLabel(context, ptr, length, label));
-        if (isCallValid)
-        {
-            context->objectPtrLabel(ptr, length, label);
-        }
-        ANGLE_CAPTURE(ObjectPtrLabel, isCallValid, context, ptr, length, label);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY PopDebugGroup()
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PopDebugGroup, "glPopDebugGroup", "context = %d", CID(context));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidatePopDebugGroup(context));
-        if (isCallValid)
-        {
-            context->popDebugGroup();
-        }
-        ANGLE_CAPTURE(PopDebugGroup, isCallValid, context);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY PushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PushDebugGroup, "glPushDebugGroup",
-          "context = %d, source = %s, id = %u, length = %d, message = 0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::DebugSource, source), id, length,
-          (uintptr_t)message);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidatePushDebugGroup(context, source, id, length, message));
-        if (isCallValid)
-        {
-            context->pushDebugGroup(source, id, length, message);
-        }
-        ANGLE_CAPTURE(PushDebugGroup, isCallValid, context, source, id, length, message);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ShaderStorageBlockBinding(GLuint program,
-                                           GLuint storageBlockIndex,
-                                           GLuint storageBlockBinding)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ShaderStorageBlockBinding, "glShaderStorageBlockBinding",
-          "context = %d, program = %u, storageBlockIndex = %u, storageBlockBinding = %u",
-          CID(context), program, storageBlockIndex, storageBlockBinding);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateShaderStorageBlockBinding(
-                                context, programPacked, storageBlockIndex, storageBlockBinding));
-        if (isCallValid)
-        {
-            context->shaderStorageBlockBinding(programPacked, storageBlockIndex,
-                                               storageBlockBinding);
-        }
-        ANGLE_CAPTURE(ShaderStorageBlockBinding, isCallValid, context, programPacked,
-                      storageBlockIndex, storageBlockBinding);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexBufferRange(GLenum target,
-                                GLenum internalformat,
-                                GLuint buffer,
-                                GLintptr offset,
-                                GLsizeiptr size)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexBufferRange, "glTexBufferRange",
-          "context = %d, target = %s, internalformat = %s, buffer = %u, offset = %llu, size = %llu",
-          CID(context), GLenumToString(GLenumGroup::TextureTarget, target),
-          GLenumToString(GLenumGroup::InternalFormat, internalformat), buffer,
-          static_cast<unsigned long long>(offset), static_cast<unsigned long long>(size));
-
-    if (context)
-    {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateTexBufferRange(context, targetPacked, internalformat,
-                                                   bufferPacked, offset, size));
-        if (isCallValid)
-        {
-            context->texBufferRange(targetPacked, internalformat, bufferPacked, offset, size);
-        }
-        ANGLE_CAPTURE(TexBufferRange, isCallValid, context, targetPacked, internalformat,
-                      bufferPacked, offset, size);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexStorage2DMultisample(GLenum target,
-                                         GLsizei samples,
-                                         GLenum internalformat,
-                                         GLsizei width,
-                                         GLsizei height,
-                                         GLboolean fixedsamplelocations)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexStorage2DMultisample, "glTexStorage2DMultisample",
-          "context = %d, target = %s, samples = %d, internalformat = %s, width = %d, height = %d, "
-          "fixedsamplelocations = %s",
-          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), samples,
-          GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height,
-          GLbooleanToString(fixedsamplelocations));
-
-    if (context)
-    {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateTexStorage2DMultisample(context, targetPacked, samples, internalformat, width,
-                                             height, fixedsamplelocations));
-        if (isCallValid)
-        {
-            context->texStorage2DMultisample(targetPacked, samples, internalformat, width, height,
-                                             fixedsamplelocations);
-        }
-        ANGLE_CAPTURE(TexStorage2DMultisample, isCallValid, context, targetPacked, samples,
-                      internalformat, width, height, fixedsamplelocations);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TexStorage3DMultisample(GLenum target,
-                                         GLsizei samples,
-                                         GLenum internalformat,
-                                         GLsizei width,
-                                         GLsizei height,
-                                         GLsizei depth,
-                                         GLboolean fixedsamplelocations)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexStorage3DMultisample, "glTexStorage3DMultisample",
-          "context = %d, target = %s, samples = %d, internalformat = %s, width = %d, height = %d, "
-          "depth = %d, fixedsamplelocations = %s",
-          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), samples,
-          GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height, depth,
-          GLbooleanToString(fixedsamplelocations));
-
-    if (context)
-    {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateTexStorage3DMultisample(context, targetPacked, samples, internalformat, width,
-                                             height, depth, fixedsamplelocations));
-        if (isCallValid)
-        {
-            context->texStorage3DMultisample(targetPacked, samples, internalformat, width, height,
-                                             depth, fixedsamplelocations);
-        }
-        ANGLE_CAPTURE(TexStorage3DMultisample, isCallValid, context, targetPacked, samples,
-                      internalformat, width, height, depth, fixedsamplelocations);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TextureView(GLuint texture,
-                             GLenum target,
-                             GLuint origtexture,
-                             GLenum internalformat,
-                             GLuint minlevel,
-                             GLuint numlevels,
-                             GLuint minlayer,
-                             GLuint numlayers)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TextureView, "glTextureView",
-          "context = %d, texture = %u, target = %s, origtexture = %u, internalformat = %s, "
-          "minlevel = %u, numlevels = %u, minlayer = %u, numlayers = %u",
-          CID(context), texture, GLenumToString(GLenumGroup::TextureTarget, target), origtexture,
-          GLenumToString(GLenumGroup::InternalFormat, internalformat), minlevel, numlevels,
-          minlayer, numlayers);
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateTextureView(context, texturePacked, target, origtexture, internalformat,
-                                 minlevel, numlevels, minlayer, numlayers));
-        if (isCallValid)
-        {
-            context->textureView(texturePacked, target, origtexture, internalformat, minlevel,
-                                 numlevels, minlayer, numlayers);
-        }
-        ANGLE_CAPTURE(TextureView, isCallValid, context, texturePacked, target, origtexture,
-                      internalformat, minlevel, numlevels, minlayer, numlayers);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribBinding(GLuint attribindex, GLuint bindingindex)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribBinding, "glVertexAttribBinding",
-          "context = %d, attribindex = %u, bindingindex = %u", CID(context), attribindex,
-          bindingindex);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateVertexAttribBinding(context, attribindex, bindingindex));
-        if (isCallValid)
-        {
-            context->vertexAttribBinding(attribindex, bindingindex);
-        }
-        ANGLE_CAPTURE(VertexAttribBinding, isCallValid, context, attribindex, bindingindex);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribFormat(GLuint attribindex,
-                                    GLint size,
-                                    GLenum type,
-                                    GLboolean normalized,
-                                    GLuint relativeoffset)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribFormat, "glVertexAttribFormat",
-          "context = %d, attribindex = %u, size = %d, type = %s, normalized = %s, relativeoffset = "
-          "%u",
-          CID(context), attribindex, size, GLenumToString(GLenumGroup::DefaultGroup, type),
-          GLbooleanToString(normalized), relativeoffset);
-
-    if (context)
-    {
-        VertexAttribType typePacked                           = FromGL<VertexAttribType>(type);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateVertexAttribFormat(context, attribindex, size, typePacked,
-                                                       normalized, relativeoffset));
-        if (isCallValid)
-        {
-            context->vertexAttribFormat(attribindex, size, typePacked, normalized, relativeoffset);
-        }
-        ANGLE_CAPTURE(VertexAttribFormat, isCallValid, context, attribindex, size, typePacked,
-                      normalized, relativeoffset);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribIFormat(GLuint attribindex,
-                                     GLint size,
-                                     GLenum type,
-                                     GLuint relativeoffset)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribIFormat, "glVertexAttribIFormat",
-          "context = %d, attribindex = %u, size = %d, type = %s, relativeoffset = %u", CID(context),
-          attribindex, size, GLenumToString(GLenumGroup::DefaultGroup, type), relativeoffset);
-
-    if (context)
-    {
-        VertexAttribType typePacked                           = FromGL<VertexAttribType>(type);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateVertexAttribIFormat(context, attribindex, size, typePacked, relativeoffset));
-        if (isCallValid)
-        {
-            context->vertexAttribIFormat(attribindex, size, typePacked, relativeoffset);
-        }
-        ANGLE_CAPTURE(VertexAttribIFormat, isCallValid, context, attribindex, size, typePacked,
-                      relativeoffset);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexAttribLFormat(GLuint attribindex,
-                                     GLint size,
-                                     GLenum type,
-                                     GLuint relativeoffset)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribLFormat, "glVertexAttribLFormat",
-          "context = %d, attribindex = %u, size = %d, type = %s, relativeoffset = %u", CID(context),
-          attribindex, size, GLenumToString(GLenumGroup::VertexAttribType, type), relativeoffset);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateVertexAttribLFormat(context, attribindex, size, type, relativeoffset));
-        if (isCallValid)
-        {
-            context->vertexAttribLFormat(attribindex, size, type, relativeoffset);
-        }
-        ANGLE_CAPTURE(VertexAttribLFormat, isCallValid, context, attribindex, size, type,
-                      relativeoffset);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexBindingDivisor(GLuint bindingindex, GLuint divisor)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexBindingDivisor, "glVertexBindingDivisor",
-          "context = %d, bindingindex = %u, divisor = %u", CID(context), bindingindex, divisor);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateVertexBindingDivisor(context, bindingindex, divisor));
-        if (isCallValid)
-        {
-            context->vertexBindingDivisor(bindingindex, divisor);
-        }
-        ANGLE_CAPTURE(VertexBindingDivisor, isCallValid, context, bindingindex, divisor);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-}  // namespace gl
diff --git a/src/libGL/entry_points_gl_4_3_autogen.h b/src/libGL/entry_points_gl_4_3_autogen.h
deleted file mode 100644
index dda0270..0000000
--- a/src/libGL/entry_points_gl_4_3_autogen.h
+++ /dev/null
@@ -1,200 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// entry_points_gl_4_3_autogen.h:
-//   Defines the GL 4.3 entry points.
-
-#ifndef LIBGL_ENTRY_POINTS_GL_4_3_AUTOGEN_H_
-#define LIBGL_ENTRY_POINTS_GL_4_3_AUTOGEN_H_
-
-#include <export.h>
-#include "angle_gl.h"
-
-namespace gl
-{
-ANGLE_EXPORT void GL_APIENTRY BindVertexBuffer(GLuint bindingindex,
-                                               GLuint buffer,
-                                               GLintptr offset,
-                                               GLsizei stride);
-ANGLE_EXPORT void GL_APIENTRY
-ClearBufferData(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data);
-ANGLE_EXPORT void GL_APIENTRY ClearBufferSubData(GLenum target,
-                                                 GLenum internalformat,
-                                                 GLintptr offset,
-                                                 GLsizeiptr size,
-                                                 GLenum format,
-                                                 GLenum type,
-                                                 const void *data);
-ANGLE_EXPORT void GL_APIENTRY CopyImageSubData(GLuint srcName,
-                                               GLenum srcTarget,
-                                               GLint srcLevel,
-                                               GLint srcX,
-                                               GLint srcY,
-                                               GLint srcZ,
-                                               GLuint dstName,
-                                               GLenum dstTarget,
-                                               GLint dstLevel,
-                                               GLint dstX,
-                                               GLint dstY,
-                                               GLint dstZ,
-                                               GLsizei srcWidth,
-                                               GLsizei srcHeight,
-                                               GLsizei srcDepth);
-ANGLE_EXPORT void GL_APIENTRY DebugMessageCallback(GLDEBUGPROC callback, const void *userParam);
-ANGLE_EXPORT void GL_APIENTRY DebugMessageControl(GLenum source,
-                                                  GLenum type,
-                                                  GLenum severity,
-                                                  GLsizei count,
-                                                  const GLuint *ids,
-                                                  GLboolean enabled);
-ANGLE_EXPORT void GL_APIENTRY DebugMessageInsert(GLenum source,
-                                                 GLenum type,
-                                                 GLuint id,
-                                                 GLenum severity,
-                                                 GLsizei length,
-                                                 const GLchar *buf);
-ANGLE_EXPORT void GL_APIENTRY DispatchCompute(GLuint num_groups_x,
-                                              GLuint num_groups_y,
-                                              GLuint num_groups_z);
-ANGLE_EXPORT void GL_APIENTRY DispatchComputeIndirect(GLintptr indirect);
-ANGLE_EXPORT void GL_APIENTRY FramebufferParameteri(GLenum target, GLenum pname, GLint param);
-ANGLE_EXPORT GLuint GL_APIENTRY GetDebugMessageLog(GLuint count,
-                                                   GLsizei bufSize,
-                                                   GLenum *sources,
-                                                   GLenum *types,
-                                                   GLuint *ids,
-                                                   GLenum *severities,
-                                                   GLsizei *lengths,
-                                                   GLchar *messageLog);
-ANGLE_EXPORT void GL_APIENTRY GetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params);
-ANGLE_EXPORT void GL_APIENTRY GetInternalformati64v(GLenum target,
-                                                    GLenum internalformat,
-                                                    GLenum pname,
-                                                    GLsizei bufSize,
-                                                    GLint64 *params);
-ANGLE_EXPORT void GL_APIENTRY
-GetObjectLabel(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
-ANGLE_EXPORT void GL_APIENTRY GetObjectPtrLabel(const void *ptr,
-                                                GLsizei bufSize,
-                                                GLsizei *length,
-                                                GLchar *label);
-ANGLE_EXPORT void GL_APIENTRY GetProgramInterfaceiv(GLuint program,
-                                                    GLenum programInterface,
-                                                    GLenum pname,
-                                                    GLint *params);
-ANGLE_EXPORT GLuint GL_APIENTRY GetProgramResourceIndex(GLuint program,
-                                                        GLenum programInterface,
-                                                        const GLchar *name);
-ANGLE_EXPORT GLint GL_APIENTRY GetProgramResourceLocation(GLuint program,
-                                                          GLenum programInterface,
-                                                          const GLchar *name);
-ANGLE_EXPORT GLint GL_APIENTRY GetProgramResourceLocationIndex(GLuint program,
-                                                               GLenum programInterface,
-                                                               const GLchar *name);
-ANGLE_EXPORT void GL_APIENTRY GetProgramResourceName(GLuint program,
-                                                     GLenum programInterface,
-                                                     GLuint index,
-                                                     GLsizei bufSize,
-                                                     GLsizei *length,
-                                                     GLchar *name);
-ANGLE_EXPORT void GL_APIENTRY GetProgramResourceiv(GLuint program,
-                                                   GLenum programInterface,
-                                                   GLuint index,
-                                                   GLsizei propCount,
-                                                   const GLenum *props,
-                                                   GLsizei bufSize,
-                                                   GLsizei *length,
-                                                   GLint *params);
-ANGLE_EXPORT void GL_APIENTRY InvalidateBufferData(GLuint buffer);
-ANGLE_EXPORT void GL_APIENTRY InvalidateBufferSubData(GLuint buffer,
-                                                      GLintptr offset,
-                                                      GLsizeiptr length);
-ANGLE_EXPORT void GL_APIENTRY InvalidateFramebuffer(GLenum target,
-                                                    GLsizei numAttachments,
-                                                    const GLenum *attachments);
-ANGLE_EXPORT void GL_APIENTRY InvalidateSubFramebuffer(GLenum target,
-                                                       GLsizei numAttachments,
-                                                       const GLenum *attachments,
-                                                       GLint x,
-                                                       GLint y,
-                                                       GLsizei width,
-                                                       GLsizei height);
-ANGLE_EXPORT void GL_APIENTRY InvalidateTexImage(GLuint texture, GLint level);
-ANGLE_EXPORT void GL_APIENTRY InvalidateTexSubImage(GLuint texture,
-                                                    GLint level,
-                                                    GLint xoffset,
-                                                    GLint yoffset,
-                                                    GLint zoffset,
-                                                    GLsizei width,
-                                                    GLsizei height,
-                                                    GLsizei depth);
-ANGLE_EXPORT void GL_APIENTRY MultiDrawArraysIndirect(GLenum mode,
-                                                      const void *indirect,
-                                                      GLsizei drawcount,
-                                                      GLsizei stride);
-ANGLE_EXPORT void GL_APIENTRY MultiDrawElementsIndirect(GLenum mode,
-                                                        GLenum type,
-                                                        const void *indirect,
-                                                        GLsizei drawcount,
-                                                        GLsizei stride);
-ANGLE_EXPORT void GL_APIENTRY ObjectLabel(GLenum identifier,
-                                          GLuint name,
-                                          GLsizei length,
-                                          const GLchar *label);
-ANGLE_EXPORT void GL_APIENTRY ObjectPtrLabel(const void *ptr, GLsizei length, const GLchar *label);
-ANGLE_EXPORT void GL_APIENTRY PopDebugGroup();
-ANGLE_EXPORT void GL_APIENTRY PushDebugGroup(GLenum source,
-                                             GLuint id,
-                                             GLsizei length,
-                                             const GLchar *message);
-ANGLE_EXPORT void GL_APIENTRY ShaderStorageBlockBinding(GLuint program,
-                                                        GLuint storageBlockIndex,
-                                                        GLuint storageBlockBinding);
-ANGLE_EXPORT void GL_APIENTRY TexBufferRange(GLenum target,
-                                             GLenum internalformat,
-                                             GLuint buffer,
-                                             GLintptr offset,
-                                             GLsizeiptr size);
-ANGLE_EXPORT void GL_APIENTRY TexStorage2DMultisample(GLenum target,
-                                                      GLsizei samples,
-                                                      GLenum internalformat,
-                                                      GLsizei width,
-                                                      GLsizei height,
-                                                      GLboolean fixedsamplelocations);
-ANGLE_EXPORT void GL_APIENTRY TexStorage3DMultisample(GLenum target,
-                                                      GLsizei samples,
-                                                      GLenum internalformat,
-                                                      GLsizei width,
-                                                      GLsizei height,
-                                                      GLsizei depth,
-                                                      GLboolean fixedsamplelocations);
-ANGLE_EXPORT void GL_APIENTRY TextureView(GLuint texture,
-                                          GLenum target,
-                                          GLuint origtexture,
-                                          GLenum internalformat,
-                                          GLuint minlevel,
-                                          GLuint numlevels,
-                                          GLuint minlayer,
-                                          GLuint numlayers);
-ANGLE_EXPORT void GL_APIENTRY VertexAttribBinding(GLuint attribindex, GLuint bindingindex);
-ANGLE_EXPORT void GL_APIENTRY VertexAttribFormat(GLuint attribindex,
-                                                 GLint size,
-                                                 GLenum type,
-                                                 GLboolean normalized,
-                                                 GLuint relativeoffset);
-ANGLE_EXPORT void GL_APIENTRY VertexAttribIFormat(GLuint attribindex,
-                                                  GLint size,
-                                                  GLenum type,
-                                                  GLuint relativeoffset);
-ANGLE_EXPORT void GL_APIENTRY VertexAttribLFormat(GLuint attribindex,
-                                                  GLint size,
-                                                  GLenum type,
-                                                  GLuint relativeoffset);
-ANGLE_EXPORT void GL_APIENTRY VertexBindingDivisor(GLuint bindingindex, GLuint divisor);
-}  // namespace gl
-
-#endif  // LIBGL_ENTRY_POINTS_GL_4_3_AUTOGEN_H_
diff --git a/src/libGL/entry_points_gl_4_4_autogen.cpp b/src/libGL/entry_points_gl_4_4_autogen.cpp
deleted file mode 100644
index 6a9a73c..0000000
--- a/src/libGL/entry_points_gl_4_4_autogen.cpp
+++ /dev/null
@@ -1,292 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// entry_points_gl_4_4_autogen.cpp:
-//   Defines the GL 4.4 entry points.
-
-#include "libGL/entry_points_gl_4_4_autogen.h"
-
-#include "libANGLE/Context.h"
-#include "libANGLE/Context.inl.h"
-#include "libANGLE/entry_points_utils.h"
-#include "libANGLE/gl_enum_utils.h"
-#include "libANGLE/validationEGL.h"
-#include "libANGLE/validationES.h"
-#include "libANGLE/validationES1.h"
-#include "libANGLE/validationES2.h"
-#include "libANGLE/validationES3.h"
-#include "libANGLE/validationES31.h"
-#include "libANGLE/validationES32.h"
-#include "libANGLE/validationESEXT.h"
-#include "libANGLE/validationGL44_autogen.h"
-#include "libGLESv2/global_state.h"
-
-namespace gl
-{
-void GL_APIENTRY BindBuffersBase(GLenum target, GLuint first, GLsizei count, const GLuint *buffers)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindBuffersBase, "glBindBuffersBase",
-          "context = %d, target = %s, first = %u, count = %d, buffers = 0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::BufferTargetARB, target), first, count,
-          (uintptr_t)buffers);
-
-    if (context)
-    {
-        const BufferID *buffersPacked                         = FromGL<const BufferID *>(buffers);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateBindBuffersBase(context, target, first, count, buffersPacked));
-        if (isCallValid)
-        {
-            context->bindBuffersBase(target, first, count, buffersPacked);
-        }
-        ANGLE_CAPTURE(BindBuffersBase, isCallValid, context, target, first, count, buffersPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY BindBuffersRange(GLenum target,
-                                  GLuint first,
-                                  GLsizei count,
-                                  const GLuint *buffers,
-                                  const GLintptr *offsets,
-                                  const GLsizeiptr *sizes)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindBuffersRange, "glBindBuffersRange",
-          "context = %d, target = %s, first = %u, count = %d, buffers = 0x%016" PRIxPTR
-          ", offsets = 0x%016" PRIxPTR ", sizes = 0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::BufferTargetARB, target), first, count,
-          (uintptr_t)buffers, (uintptr_t)offsets, (uintptr_t)sizes);
-
-    if (context)
-    {
-        const BufferID *buffersPacked                         = FromGL<const BufferID *>(buffers);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateBindBuffersRange(context, target, first, count,
-                                                                   buffersPacked, offsets, sizes));
-        if (isCallValid)
-        {
-            context->bindBuffersRange(target, first, count, buffersPacked, offsets, sizes);
-        }
-        ANGLE_CAPTURE(BindBuffersRange, isCallValid, context, target, first, count, buffersPacked,
-                      offsets, sizes);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY BindImageTextures(GLuint first, GLsizei count, const GLuint *textures)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindImageTextures, "glBindImageTextures",
-          "context = %d, first = %u, count = %d, textures = 0x%016" PRIxPTR "", CID(context), first,
-          count, (uintptr_t)textures);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateBindImageTextures(context, first, count, textures));
-        if (isCallValid)
-        {
-            context->bindImageTextures(first, count, textures);
-        }
-        ANGLE_CAPTURE(BindImageTextures, isCallValid, context, first, count, textures);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY BindSamplers(GLuint first, GLsizei count, const GLuint *samplers)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindSamplers, "glBindSamplers",
-          "context = %d, first = %u, count = %d, samplers = 0x%016" PRIxPTR "", CID(context), first,
-          count, (uintptr_t)samplers);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateBindSamplers(context, first, count, samplers));
-        if (isCallValid)
-        {
-            context->bindSamplers(first, count, samplers);
-        }
-        ANGLE_CAPTURE(BindSamplers, isCallValid, context, first, count, samplers);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY BindTextures(GLuint first, GLsizei count, const GLuint *textures)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindTextures, "glBindTextures",
-          "context = %d, first = %u, count = %d, textures = 0x%016" PRIxPTR "", CID(context), first,
-          count, (uintptr_t)textures);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateBindTextures(context, first, count, textures));
-        if (isCallValid)
-        {
-            context->bindTextures(first, count, textures);
-        }
-        ANGLE_CAPTURE(BindTextures, isCallValid, context, first, count, textures);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY BindVertexBuffers(GLuint first,
-                                   GLsizei count,
-                                   const GLuint *buffers,
-                                   const GLintptr *offsets,
-                                   const GLsizei *strides)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindVertexBuffers, "glBindVertexBuffers",
-          "context = %d, first = %u, count = %d, buffers = 0x%016" PRIxPTR
-          ", offsets = 0x%016" PRIxPTR ", strides = 0x%016" PRIxPTR "",
-          CID(context), first, count, (uintptr_t)buffers, (uintptr_t)offsets, (uintptr_t)strides);
-
-    if (context)
-    {
-        const BufferID *buffersPacked                         = FromGL<const BufferID *>(buffers);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateBindVertexBuffers(context, first, count, buffersPacked, offsets, strides));
-        if (isCallValid)
-        {
-            context->bindVertexBuffers(first, count, buffersPacked, offsets, strides);
-        }
-        ANGLE_CAPTURE(BindVertexBuffers, isCallValid, context, first, count, buffersPacked, offsets,
-                      strides);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY BufferStorage(GLenum target, GLsizeiptr size, const void *data, GLbitfield flags)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BufferStorage, "glBufferStorage",
-          "context = %d, target = %s, size = %llu, data = 0x%016" PRIxPTR ", flags = %s",
-          CID(context), GLenumToString(GLenumGroup::BufferStorageTarget, target),
-          static_cast<unsigned long long>(size), (uintptr_t)data,
-          GLbitfieldToString(GLenumGroup::MapBufferUsageMask, flags).c_str());
-
-    if (context)
-    {
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateBufferStorage(context, targetPacked, size, data, flags));
-        if (isCallValid)
-        {
-            context->bufferStorage(targetPacked, size, data, flags);
-        }
-        ANGLE_CAPTURE(BufferStorage, isCallValid, context, targetPacked, size, data, flags);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY
-ClearTexImage(GLuint texture, GLint level, GLenum format, GLenum type, const void *data)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ClearTexImage, "glClearTexImage",
-          "context = %d, texture = %u, level = %d, format = %s, type = %s, data = 0x%016" PRIxPTR
-          "",
-          CID(context), texture, level, GLenumToString(GLenumGroup::PixelFormat, format),
-          GLenumToString(GLenumGroup::PixelType, type), (uintptr_t)data);
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateClearTexImage(context, texturePacked, level, format, type, data));
-        if (isCallValid)
-        {
-            context->clearTexImage(texturePacked, level, format, type, data);
-        }
-        ANGLE_CAPTURE(ClearTexImage, isCallValid, context, texturePacked, level, format, type,
-                      data);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ClearTexSubImage(GLuint texture,
-                                  GLint level,
-                                  GLint xoffset,
-                                  GLint yoffset,
-                                  GLint zoffset,
-                                  GLsizei width,
-                                  GLsizei height,
-                                  GLsizei depth,
-                                  GLenum format,
-                                  GLenum type,
-                                  const void *data)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ClearTexSubImage, "glClearTexSubImage",
-          "context = %d, texture = %u, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, width "
-          "= %d, height = %d, depth = %d, format = %s, type = %s, data = 0x%016" PRIxPTR "",
-          CID(context), texture, level, xoffset, yoffset, zoffset, width, height, depth,
-          GLenumToString(GLenumGroup::PixelFormat, format),
-          GLenumToString(GLenumGroup::PixelType, type), (uintptr_t)data);
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateClearTexSubImage(context, texturePacked, level, xoffset, yoffset, zoffset,
-                                      width, height, depth, format, type, data));
-        if (isCallValid)
-        {
-            context->clearTexSubImage(texturePacked, level, xoffset, yoffset, zoffset, width,
-                                      height, depth, format, type, data);
-        }
-        ANGLE_CAPTURE(ClearTexSubImage, isCallValid, context, texturePacked, level, xoffset,
-                      yoffset, zoffset, width, height, depth, format, type, data);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-}  // namespace gl
diff --git a/src/libGL/entry_points_gl_4_4_autogen.h b/src/libGL/entry_points_gl_4_4_autogen.h
deleted file mode 100644
index 4d30776..0000000
--- a/src/libGL/entry_points_gl_4_4_autogen.h
+++ /dev/null
@@ -1,58 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// entry_points_gl_4_4_autogen.h:
-//   Defines the GL 4.4 entry points.
-
-#ifndef LIBGL_ENTRY_POINTS_GL_4_4_AUTOGEN_H_
-#define LIBGL_ENTRY_POINTS_GL_4_4_AUTOGEN_H_
-
-#include <export.h>
-#include "angle_gl.h"
-
-namespace gl
-{
-ANGLE_EXPORT void GL_APIENTRY BindBuffersBase(GLenum target,
-                                              GLuint first,
-                                              GLsizei count,
-                                              const GLuint *buffers);
-ANGLE_EXPORT void GL_APIENTRY BindBuffersRange(GLenum target,
-                                               GLuint first,
-                                               GLsizei count,
-                                               const GLuint *buffers,
-                                               const GLintptr *offsets,
-                                               const GLsizeiptr *sizes);
-ANGLE_EXPORT void GL_APIENTRY BindImageTextures(GLuint first,
-                                                GLsizei count,
-                                                const GLuint *textures);
-ANGLE_EXPORT void GL_APIENTRY BindSamplers(GLuint first, GLsizei count, const GLuint *samplers);
-ANGLE_EXPORT void GL_APIENTRY BindTextures(GLuint first, GLsizei count, const GLuint *textures);
-ANGLE_EXPORT void GL_APIENTRY BindVertexBuffers(GLuint first,
-                                                GLsizei count,
-                                                const GLuint *buffers,
-                                                const GLintptr *offsets,
-                                                const GLsizei *strides);
-ANGLE_EXPORT void GL_APIENTRY BufferStorage(GLenum target,
-                                            GLsizeiptr size,
-                                            const void *data,
-                                            GLbitfield flags);
-ANGLE_EXPORT void GL_APIENTRY
-ClearTexImage(GLuint texture, GLint level, GLenum format, GLenum type, const void *data);
-ANGLE_EXPORT void GL_APIENTRY ClearTexSubImage(GLuint texture,
-                                               GLint level,
-                                               GLint xoffset,
-                                               GLint yoffset,
-                                               GLint zoffset,
-                                               GLsizei width,
-                                               GLsizei height,
-                                               GLsizei depth,
-                                               GLenum format,
-                                               GLenum type,
-                                               const void *data);
-}  // namespace gl
-
-#endif  // LIBGL_ENTRY_POINTS_GL_4_4_AUTOGEN_H_
diff --git a/src/libGL/entry_points_gl_4_5_autogen.cpp b/src/libGL/entry_points_gl_4_5_autogen.cpp
deleted file mode 100644
index 257d5c8..0000000
--- a/src/libGL/entry_points_gl_4_5_autogen.cpp
+++ /dev/null
@@ -1,3627 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// entry_points_gl_4_5_autogen.cpp:
-//   Defines the GL 4.5 entry points.
-
-#include "libGL/entry_points_gl_4_5_autogen.h"
-
-#include "libANGLE/Context.h"
-#include "libANGLE/Context.inl.h"
-#include "libANGLE/entry_points_utils.h"
-#include "libANGLE/gl_enum_utils.h"
-#include "libANGLE/validationEGL.h"
-#include "libANGLE/validationES.h"
-#include "libANGLE/validationES1.h"
-#include "libANGLE/validationES2.h"
-#include "libANGLE/validationES3.h"
-#include "libANGLE/validationES31.h"
-#include "libANGLE/validationES32.h"
-#include "libANGLE/validationESEXT.h"
-#include "libANGLE/validationGL45_autogen.h"
-#include "libGLESv2/global_state.h"
-
-namespace gl
-{
-void GL_APIENTRY BindTextureUnit(GLuint unit, GLuint texture)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindTextureUnit, "glBindTextureUnit",
-          "context = %d, unit = %u, texture = %u", CID(context), unit, texture);
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateBindTextureUnit(context, unit, texturePacked));
-        if (isCallValid)
-        {
-            context->bindTextureUnit(unit, texturePacked);
-        }
-        ANGLE_CAPTURE(BindTextureUnit, isCallValid, context, unit, texturePacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY BlitNamedFramebuffer(GLuint readFramebuffer,
-                                      GLuint drawFramebuffer,
-                                      GLint srcX0,
-                                      GLint srcY0,
-                                      GLint srcX1,
-                                      GLint srcY1,
-                                      GLint dstX0,
-                                      GLint dstY0,
-                                      GLint dstX1,
-                                      GLint dstY1,
-                                      GLbitfield mask,
-                                      GLenum filter)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(
-        context, gl::EntryPoint::BlitNamedFramebuffer, "glBlitNamedFramebuffer",
-        "context = %d, readFramebuffer = %u, drawFramebuffer = %u, srcX0 = %d, srcY0 = %d, srcX1 = "
-        "%d, srcY1 = %d, dstX0 = %d, dstY0 = %d, dstX1 = %d, dstY1 = %d, mask = %s, filter = %s",
-        CID(context), readFramebuffer, drawFramebuffer, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0,
-        dstX1, dstY1, GLbitfieldToString(GLenumGroup::ClearBufferMask, mask).c_str(),
-        GLenumToString(GLenumGroup::BlitFramebufferFilter, filter));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateBlitNamedFramebuffer(context, readFramebuffer, drawFramebuffer, srcX0, srcY0,
-                                          srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter));
-        if (isCallValid)
-        {
-            context->blitNamedFramebuffer(readFramebuffer, drawFramebuffer, srcX0, srcY0, srcX1,
-                                          srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
-        }
-        ANGLE_CAPTURE(BlitNamedFramebuffer, isCallValid, context, readFramebuffer, drawFramebuffer,
-                      srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-GLenum GL_APIENTRY CheckNamedFramebufferStatus(GLuint framebuffer, GLenum target)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CheckNamedFramebufferStatus, "glCheckNamedFramebufferStatus",
-          "context = %d, framebuffer = %u, target = %s", CID(context), framebuffer,
-          GLenumToString(GLenumGroup::FramebufferTarget, target));
-
-    GLenum returnValue;
-    if (context)
-    {
-        FramebufferID framebufferPacked                       = FromGL<FramebufferID>(framebuffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateCheckNamedFramebufferStatus(
-                                                             context, framebufferPacked, target));
-        if (isCallValid)
-        {
-            returnValue = context->checkNamedFramebufferStatus(framebufferPacked, target);
-        }
-        else
-        {
-            returnValue = GetDefaultReturnValue<EntryPoint::CheckNamedFramebufferStatus, GLenum>();
-        }
-        ANGLE_CAPTURE(CheckNamedFramebufferStatus, isCallValid, context, framebufferPacked, target,
-                      returnValue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::CheckNamedFramebufferStatus, GLenum>();
-    }
-    return returnValue;
-}
-
-void GL_APIENTRY ClearNamedBufferData(GLuint buffer,
-                                      GLenum internalformat,
-                                      GLenum format,
-                                      GLenum type,
-                                      const void *data)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ClearNamedBufferData, "glClearNamedBufferData",
-          "context = %d, buffer = %u, internalformat = %s, format = %s, type = %s, data = "
-          "0x%016" PRIxPTR "",
-          CID(context), buffer, GLenumToString(GLenumGroup::InternalFormat, internalformat),
-          GLenumToString(GLenumGroup::PixelFormat, format),
-          GLenumToString(GLenumGroup::PixelType, type), (uintptr_t)data);
-
-    if (context)
-    {
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateClearNamedBufferData(context, bufferPacked, internalformat,
-                                                         format, type, data));
-        if (isCallValid)
-        {
-            context->clearNamedBufferData(bufferPacked, internalformat, format, type, data);
-        }
-        ANGLE_CAPTURE(ClearNamedBufferData, isCallValid, context, bufferPacked, internalformat,
-                      format, type, data);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ClearNamedBufferSubData(GLuint buffer,
-                                         GLenum internalformat,
-                                         GLintptr offset,
-                                         GLsizeiptr size,
-                                         GLenum format,
-                                         GLenum type,
-                                         const void *data)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ClearNamedBufferSubData, "glClearNamedBufferSubData",
-          "context = %d, buffer = %u, internalformat = %s, offset = %llu, size = %llu, format = "
-          "%s, type = %s, data = 0x%016" PRIxPTR "",
-          CID(context), buffer, GLenumToString(GLenumGroup::InternalFormat, internalformat),
-          static_cast<unsigned long long>(offset), static_cast<unsigned long long>(size),
-          GLenumToString(GLenumGroup::PixelFormat, format),
-          GLenumToString(GLenumGroup::PixelType, type), (uintptr_t)data);
-
-    if (context)
-    {
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateClearNamedBufferSubData(context, bufferPacked, internalformat,
-                                                            offset, size, format, type, data));
-        if (isCallValid)
-        {
-            context->clearNamedBufferSubData(bufferPacked, internalformat, offset, size, format,
-                                             type, data);
-        }
-        ANGLE_CAPTURE(ClearNamedBufferSubData, isCallValid, context, bufferPacked, internalformat,
-                      offset, size, format, type, data);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ClearNamedFramebufferfi(GLuint framebuffer,
-                                         GLenum buffer,
-                                         GLint drawbuffer,
-                                         GLfloat depth,
-                                         GLint stencil)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ClearNamedFramebufferfi, "glClearNamedFramebufferfi",
-          "context = %d, framebuffer = %u, buffer = %s, drawbuffer = %d, depth = %f, stencil = %d",
-          CID(context), framebuffer, GLenumToString(GLenumGroup::Buffer, buffer), drawbuffer, depth,
-          stencil);
-
-    if (context)
-    {
-        FramebufferID framebufferPacked                       = FromGL<FramebufferID>(framebuffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateClearNamedFramebufferfi(context, framebufferPacked, buffer,
-                                                            drawbuffer, depth, stencil));
-        if (isCallValid)
-        {
-            context->clearNamedFramebufferfi(framebufferPacked, buffer, drawbuffer, depth, stencil);
-        }
-        ANGLE_CAPTURE(ClearNamedFramebufferfi, isCallValid, context, framebufferPacked, buffer,
-                      drawbuffer, depth, stencil);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ClearNamedFramebufferfv(GLuint framebuffer,
-                                         GLenum buffer,
-                                         GLint drawbuffer,
-                                         const GLfloat *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ClearNamedFramebufferfv, "glClearNamedFramebufferfv",
-          "context = %d, framebuffer = %u, buffer = %s, drawbuffer = %d, value = 0x%016" PRIxPTR "",
-          CID(context), framebuffer, GLenumToString(GLenumGroup::Buffer, buffer), drawbuffer,
-          (uintptr_t)value);
-
-    if (context)
-    {
-        FramebufferID framebufferPacked                       = FromGL<FramebufferID>(framebuffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateClearNamedFramebufferfv(context, framebufferPacked, buffer,
-                                                            drawbuffer, value));
-        if (isCallValid)
-        {
-            context->clearNamedFramebufferfv(framebufferPacked, buffer, drawbuffer, value);
-        }
-        ANGLE_CAPTURE(ClearNamedFramebufferfv, isCallValid, context, framebufferPacked, buffer,
-                      drawbuffer, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ClearNamedFramebufferiv(GLuint framebuffer,
-                                         GLenum buffer,
-                                         GLint drawbuffer,
-                                         const GLint *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ClearNamedFramebufferiv, "glClearNamedFramebufferiv",
-          "context = %d, framebuffer = %u, buffer = %s, drawbuffer = %d, value = 0x%016" PRIxPTR "",
-          CID(context), framebuffer, GLenumToString(GLenumGroup::Buffer, buffer), drawbuffer,
-          (uintptr_t)value);
-
-    if (context)
-    {
-        FramebufferID framebufferPacked                       = FromGL<FramebufferID>(framebuffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateClearNamedFramebufferiv(context, framebufferPacked, buffer,
-                                                            drawbuffer, value));
-        if (isCallValid)
-        {
-            context->clearNamedFramebufferiv(framebufferPacked, buffer, drawbuffer, value);
-        }
-        ANGLE_CAPTURE(ClearNamedFramebufferiv, isCallValid, context, framebufferPacked, buffer,
-                      drawbuffer, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ClearNamedFramebufferuiv(GLuint framebuffer,
-                                          GLenum buffer,
-                                          GLint drawbuffer,
-                                          const GLuint *value)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ClearNamedFramebufferuiv, "glClearNamedFramebufferuiv",
-          "context = %d, framebuffer = %u, buffer = %s, drawbuffer = %d, value = 0x%016" PRIxPTR "",
-          CID(context), framebuffer, GLenumToString(GLenumGroup::Buffer, buffer), drawbuffer,
-          (uintptr_t)value);
-
-    if (context)
-    {
-        FramebufferID framebufferPacked                       = FromGL<FramebufferID>(framebuffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateClearNamedFramebufferuiv(context, framebufferPacked, buffer,
-                                                             drawbuffer, value));
-        if (isCallValid)
-        {
-            context->clearNamedFramebufferuiv(framebufferPacked, buffer, drawbuffer, value);
-        }
-        ANGLE_CAPTURE(ClearNamedFramebufferuiv, isCallValid, context, framebufferPacked, buffer,
-                      drawbuffer, value);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ClipControl(GLenum origin, GLenum depth)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ClipControl, "glClipControl",
-          "context = %d, origin = %s, depth = %s", CID(context),
-          GLenumToString(GLenumGroup::ClipControlOrigin, origin),
-          GLenumToString(GLenumGroup::ClipControlDepth, depth));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateClipControl(context, origin, depth));
-        if (isCallValid)
-        {
-            context->clipControl(origin, depth);
-        }
-        ANGLE_CAPTURE(ClipControl, isCallValid, context, origin, depth);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY CompressedTextureSubImage1D(GLuint texture,
-                                             GLint level,
-                                             GLint xoffset,
-                                             GLsizei width,
-                                             GLenum format,
-                                             GLsizei imageSize,
-                                             const void *data)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CompressedTextureSubImage1D, "glCompressedTextureSubImage1D",
-          "context = %d, texture = %u, level = %d, xoffset = %d, width = %d, format = %s, "
-          "imageSize = %d, data = 0x%016" PRIxPTR "",
-          CID(context), texture, level, xoffset, width,
-          GLenumToString(GLenumGroup::PixelFormat, format), imageSize, (uintptr_t)data);
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateCompressedTextureSubImage1D(
-                                                             context, texturePacked, level, xoffset,
-                                                             width, format, imageSize, data));
-        if (isCallValid)
-        {
-            context->compressedTextureSubImage1D(texturePacked, level, xoffset, width, format,
-                                                 imageSize, data);
-        }
-        ANGLE_CAPTURE(CompressedTextureSubImage1D, isCallValid, context, texturePacked, level,
-                      xoffset, width, format, imageSize, data);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY CompressedTextureSubImage2D(GLuint texture,
-                                             GLint level,
-                                             GLint xoffset,
-                                             GLint yoffset,
-                                             GLsizei width,
-                                             GLsizei height,
-                                             GLenum format,
-                                             GLsizei imageSize,
-                                             const void *data)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CompressedTextureSubImage2D, "glCompressedTextureSubImage2D",
-          "context = %d, texture = %u, level = %d, xoffset = %d, yoffset = %d, width = %d, height "
-          "= %d, format = %s, imageSize = %d, data = 0x%016" PRIxPTR "",
-          CID(context), texture, level, xoffset, yoffset, width, height,
-          GLenumToString(GLenumGroup::PixelFormat, format), imageSize, (uintptr_t)data);
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateCompressedTextureSubImage2D(context, texturePacked, level, xoffset, yoffset,
-                                                 width, height, format, imageSize, data));
-        if (isCallValid)
-        {
-            context->compressedTextureSubImage2D(texturePacked, level, xoffset, yoffset, width,
-                                                 height, format, imageSize, data);
-        }
-        ANGLE_CAPTURE(CompressedTextureSubImage2D, isCallValid, context, texturePacked, level,
-                      xoffset, yoffset, width, height, format, imageSize, data);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY CompressedTextureSubImage3D(GLuint texture,
-                                             GLint level,
-                                             GLint xoffset,
-                                             GLint yoffset,
-                                             GLint zoffset,
-                                             GLsizei width,
-                                             GLsizei height,
-                                             GLsizei depth,
-                                             GLenum format,
-                                             GLsizei imageSize,
-                                             const void *data)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CompressedTextureSubImage3D, "glCompressedTextureSubImage3D",
-          "context = %d, texture = %u, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, width "
-          "= %d, height = %d, depth = %d, format = %s, imageSize = %d, data = 0x%016" PRIxPTR "",
-          CID(context), texture, level, xoffset, yoffset, zoffset, width, height, depth,
-          GLenumToString(GLenumGroup::PixelFormat, format), imageSize, (uintptr_t)data);
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateCompressedTextureSubImage3D(
-                                context, texturePacked, level, xoffset, yoffset, zoffset, width,
-                                height, depth, format, imageSize, data));
-        if (isCallValid)
-        {
-            context->compressedTextureSubImage3D(texturePacked, level, xoffset, yoffset, zoffset,
-                                                 width, height, depth, format, imageSize, data);
-        }
-        ANGLE_CAPTURE(CompressedTextureSubImage3D, isCallValid, context, texturePacked, level,
-                      xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY CopyNamedBufferSubData(GLuint readBuffer,
-                                        GLuint writeBuffer,
-                                        GLintptr readOffset,
-                                        GLintptr writeOffset,
-                                        GLsizeiptr size)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CopyNamedBufferSubData, "glCopyNamedBufferSubData",
-          "context = %d, readBuffer = %u, writeBuffer = %u, readOffset = %llu, writeOffset = %llu, "
-          "size = %llu",
-          CID(context), readBuffer, writeBuffer, static_cast<unsigned long long>(readOffset),
-          static_cast<unsigned long long>(writeOffset), static_cast<unsigned long long>(size));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateCopyNamedBufferSubData(context, readBuffer, writeBuffer,
-                                                           readOffset, writeOffset, size));
-        if (isCallValid)
-        {
-            context->copyNamedBufferSubData(readBuffer, writeBuffer, readOffset, writeOffset, size);
-        }
-        ANGLE_CAPTURE(CopyNamedBufferSubData, isCallValid, context, readBuffer, writeBuffer,
-                      readOffset, writeOffset, size);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY
-CopyTextureSubImage1D(GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CopyTextureSubImage1D, "glCopyTextureSubImage1D",
-          "context = %d, texture = %u, level = %d, xoffset = %d, x = %d, y = %d, width = %d",
-          CID(context), texture, level, xoffset, x, y, width);
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateCopyTextureSubImage1D(context, texturePacked, level, xoffset, x, y, width));
-        if (isCallValid)
-        {
-            context->copyTextureSubImage1D(texturePacked, level, xoffset, x, y, width);
-        }
-        ANGLE_CAPTURE(CopyTextureSubImage1D, isCallValid, context, texturePacked, level, xoffset, x,
-                      y, width);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY CopyTextureSubImage2D(GLuint texture,
-                                       GLint level,
-                                       GLint xoffset,
-                                       GLint yoffset,
-                                       GLint x,
-                                       GLint y,
-                                       GLsizei width,
-                                       GLsizei height)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CopyTextureSubImage2D, "glCopyTextureSubImage2D",
-          "context = %d, texture = %u, level = %d, xoffset = %d, yoffset = %d, x = %d, y = %d, "
-          "width = %d, height = %d",
-          CID(context), texture, level, xoffset, yoffset, x, y, width, height);
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateCopyTextureSubImage2D(context, texturePacked, level, xoffset,
-                                                          yoffset, x, y, width, height));
-        if (isCallValid)
-        {
-            context->copyTextureSubImage2D(texturePacked, level, xoffset, yoffset, x, y, width,
-                                           height);
-        }
-        ANGLE_CAPTURE(CopyTextureSubImage2D, isCallValid, context, texturePacked, level, xoffset,
-                      yoffset, x, y, width, height);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY CopyTextureSubImage3D(GLuint texture,
-                                       GLint level,
-                                       GLint xoffset,
-                                       GLint yoffset,
-                                       GLint zoffset,
-                                       GLint x,
-                                       GLint y,
-                                       GLsizei width,
-                                       GLsizei height)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CopyTextureSubImage3D, "glCopyTextureSubImage3D",
-          "context = %d, texture = %u, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, x = "
-          "%d, y = %d, width = %d, height = %d",
-          CID(context), texture, level, xoffset, yoffset, zoffset, x, y, width, height);
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateCopyTextureSubImage3D(context, texturePacked, level, xoffset,
-                                                          yoffset, zoffset, x, y, width, height));
-        if (isCallValid)
-        {
-            context->copyTextureSubImage3D(texturePacked, level, xoffset, yoffset, zoffset, x, y,
-                                           width, height);
-        }
-        ANGLE_CAPTURE(CopyTextureSubImage3D, isCallValid, context, texturePacked, level, xoffset,
-                      yoffset, zoffset, x, y, width, height);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY CreateBuffers(GLsizei n, GLuint *buffers)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CreateBuffers, "glCreateBuffers",
-          "context = %d, n = %d, buffers = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)buffers);
-
-    if (context)
-    {
-        BufferID *buffersPacked                               = FromGL<BufferID *>(buffers);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateCreateBuffers(context, n, buffersPacked));
-        if (isCallValid)
-        {
-            context->createBuffers(n, buffersPacked);
-        }
-        ANGLE_CAPTURE(CreateBuffers, isCallValid, context, n, buffersPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY CreateFramebuffers(GLsizei n, GLuint *framebuffers)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CreateFramebuffers, "glCreateFramebuffers",
-          "context = %d, n = %d, framebuffers = 0x%016" PRIxPTR "", CID(context), n,
-          (uintptr_t)framebuffers);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateCreateFramebuffers(context, n, framebuffers));
-        if (isCallValid)
-        {
-            context->createFramebuffers(n, framebuffers);
-        }
-        ANGLE_CAPTURE(CreateFramebuffers, isCallValid, context, n, framebuffers);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY CreateProgramPipelines(GLsizei n, GLuint *pipelines)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CreateProgramPipelines, "glCreateProgramPipelines",
-          "context = %d, n = %d, pipelines = 0x%016" PRIxPTR "", CID(context), n,
-          (uintptr_t)pipelines);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateCreateProgramPipelines(context, n, pipelines));
-        if (isCallValid)
-        {
-            context->createProgramPipelines(n, pipelines);
-        }
-        ANGLE_CAPTURE(CreateProgramPipelines, isCallValid, context, n, pipelines);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY CreateQueries(GLenum target, GLsizei n, GLuint *ids)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CreateQueries, "glCreateQueries",
-          "context = %d, target = %s, n = %d, ids = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::QueryTarget, target), n, (uintptr_t)ids);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateCreateQueries(context, target, n, ids));
-        if (isCallValid)
-        {
-            context->createQueries(target, n, ids);
-        }
-        ANGLE_CAPTURE(CreateQueries, isCallValid, context, target, n, ids);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY CreateRenderbuffers(GLsizei n, GLuint *renderbuffers)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CreateRenderbuffers, "glCreateRenderbuffers",
-          "context = %d, n = %d, renderbuffers = 0x%016" PRIxPTR "", CID(context), n,
-          (uintptr_t)renderbuffers);
-
-    if (context)
-    {
-        RenderbufferID *renderbuffersPacked = FromGL<RenderbufferID *>(renderbuffers);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateCreateRenderbuffers(context, n, renderbuffersPacked));
-        if (isCallValid)
-        {
-            context->createRenderbuffers(n, renderbuffersPacked);
-        }
-        ANGLE_CAPTURE(CreateRenderbuffers, isCallValid, context, n, renderbuffersPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY CreateSamplers(GLsizei n, GLuint *samplers)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CreateSamplers, "glCreateSamplers",
-          "context = %d, n = %d, samplers = 0x%016" PRIxPTR "", CID(context), n,
-          (uintptr_t)samplers);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateCreateSamplers(context, n, samplers));
-        if (isCallValid)
-        {
-            context->createSamplers(n, samplers);
-        }
-        ANGLE_CAPTURE(CreateSamplers, isCallValid, context, n, samplers);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY CreateTextures(GLenum target, GLsizei n, GLuint *textures)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CreateTextures, "glCreateTextures",
-          "context = %d, target = %s, n = %d, textures = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureTarget, target), n, (uintptr_t)textures);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateCreateTextures(context, target, n, textures));
-        if (isCallValid)
-        {
-            context->createTextures(target, n, textures);
-        }
-        ANGLE_CAPTURE(CreateTextures, isCallValid, context, target, n, textures);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY CreateTransformFeedbacks(GLsizei n, GLuint *ids)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CreateTransformFeedbacks, "glCreateTransformFeedbacks",
-          "context = %d, n = %d, ids = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)ids);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateCreateTransformFeedbacks(context, n, ids));
-        if (isCallValid)
-        {
-            context->createTransformFeedbacks(n, ids);
-        }
-        ANGLE_CAPTURE(CreateTransformFeedbacks, isCallValid, context, n, ids);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY CreateVertexArrays(GLsizei n, GLuint *arrays)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CreateVertexArrays, "glCreateVertexArrays",
-          "context = %d, n = %d, arrays = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)arrays);
-
-    if (context)
-    {
-        VertexArrayID *arraysPacked                           = FromGL<VertexArrayID *>(arrays);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateCreateVertexArrays(context, n, arraysPacked));
-        if (isCallValid)
-        {
-            context->createVertexArrays(n, arraysPacked);
-        }
-        ANGLE_CAPTURE(CreateVertexArrays, isCallValid, context, n, arraysPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY DisableVertexArrayAttrib(GLuint vaobj, GLuint index)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DisableVertexArrayAttrib, "glDisableVertexArrayAttrib",
-          "context = %d, vaobj = %u, index = %u", CID(context), vaobj, index);
-
-    if (context)
-    {
-        VertexArrayID vaobjPacked                             = FromGL<VertexArrayID>(vaobj);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateDisableVertexArrayAttrib(context, vaobjPacked, index));
-        if (isCallValid)
-        {
-            context->disableVertexArrayAttrib(vaobjPacked, index);
-        }
-        ANGLE_CAPTURE(DisableVertexArrayAttrib, isCallValid, context, vaobjPacked, index);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY EnableVertexArrayAttrib(GLuint vaobj, GLuint index)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::EnableVertexArrayAttrib, "glEnableVertexArrayAttrib",
-          "context = %d, vaobj = %u, index = %u", CID(context), vaobj, index);
-
-    if (context)
-    {
-        VertexArrayID vaobjPacked                             = FromGL<VertexArrayID>(vaobj);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateEnableVertexArrayAttrib(context, vaobjPacked, index));
-        if (isCallValid)
-        {
-            context->enableVertexArrayAttrib(vaobjPacked, index);
-        }
-        ANGLE_CAPTURE(EnableVertexArrayAttrib, isCallValid, context, vaobjPacked, index);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY FlushMappedNamedBufferRange(GLuint buffer, GLintptr offset, GLsizeiptr length)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::FlushMappedNamedBufferRange, "glFlushMappedNamedBufferRange",
-          "context = %d, buffer = %u, offset = %llu, length = %llu", CID(context), buffer,
-          static_cast<unsigned long long>(offset), static_cast<unsigned long long>(length));
-
-    if (context)
-    {
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateFlushMappedNamedBufferRange(context, bufferPacked, offset, length));
-        if (isCallValid)
-        {
-            context->flushMappedNamedBufferRange(bufferPacked, offset, length);
-        }
-        ANGLE_CAPTURE(FlushMappedNamedBufferRange, isCallValid, context, bufferPacked, offset,
-                      length);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GenerateTextureMipmap(GLuint texture)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GenerateTextureMipmap, "glGenerateTextureMipmap",
-          "context = %d, texture = %u", CID(context), texture);
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGenerateTextureMipmap(context, texturePacked));
-        if (isCallValid)
-        {
-            context->generateTextureMipmap(texturePacked);
-        }
-        ANGLE_CAPTURE(GenerateTextureMipmap, isCallValid, context, texturePacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetCompressedTextureImage(GLuint texture,
-                                           GLint level,
-                                           GLsizei bufSize,
-                                           void *pixels)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetCompressedTextureImage, "glGetCompressedTextureImage",
-          "context = %d, texture = %u, level = %d, bufSize = %d, pixels = 0x%016" PRIxPTR "",
-          CID(context), texture, level, bufSize, (uintptr_t)pixels);
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetCompressedTextureImage(context, texturePacked, level, bufSize, pixels));
-        if (isCallValid)
-        {
-            context->getCompressedTextureImage(texturePacked, level, bufSize, pixels);
-        }
-        ANGLE_CAPTURE(GetCompressedTextureImage, isCallValid, context, texturePacked, level,
-                      bufSize, pixels);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetCompressedTextureSubImage(GLuint texture,
-                                              GLint level,
-                                              GLint xoffset,
-                                              GLint yoffset,
-                                              GLint zoffset,
-                                              GLsizei width,
-                                              GLsizei height,
-                                              GLsizei depth,
-                                              GLsizei bufSize,
-                                              void *pixels)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetCompressedTextureSubImage, "glGetCompressedTextureSubImage",
-          "context = %d, texture = %u, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, width "
-          "= %d, height = %d, depth = %d, bufSize = %d, pixels = 0x%016" PRIxPTR "",
-          CID(context), texture, level, xoffset, yoffset, zoffset, width, height, depth, bufSize,
-          (uintptr_t)pixels);
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetCompressedTextureSubImage(context, texturePacked, level, xoffset, yoffset,
-                                                  zoffset, width, height, depth, bufSize, pixels));
-        if (isCallValid)
-        {
-            context->getCompressedTextureSubImage(texturePacked, level, xoffset, yoffset, zoffset,
-                                                  width, height, depth, bufSize, pixels);
-        }
-        ANGLE_CAPTURE(GetCompressedTextureSubImage, isCallValid, context, texturePacked, level,
-                      xoffset, yoffset, zoffset, width, height, depth, bufSize, pixels);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-GLenum GL_APIENTRY GetGraphicsResetStatus()
-{
-    Context *context = GetGlobalContext();
-    EVENT(context, gl::EntryPoint::GetGraphicsResetStatus, "glGetGraphicsResetStatus",
-          "context = %d", CID(context));
-
-    GLenum returnValue;
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateGetGraphicsResetStatus(context));
-        if (isCallValid)
-        {
-            returnValue = context->getGraphicsResetStatus();
-        }
-        else
-        {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetGraphicsResetStatus, GLenum>();
-        }
-        ANGLE_CAPTURE(GetGraphicsResetStatus, isCallValid, context, returnValue);
-    }
-    else
-    {
-
-        returnValue = GetDefaultReturnValue<EntryPoint::GetGraphicsResetStatus, GLenum>();
-    }
-    return returnValue;
-}
-
-void GL_APIENTRY GetNamedBufferParameteri64v(GLuint buffer, GLenum pname, GLint64 *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetNamedBufferParameteri64v, "glGetNamedBufferParameteri64v",
-          "context = %d, buffer = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), buffer,
-          GLenumToString(GLenumGroup::VertexBufferObjectParameter, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateGetNamedBufferParameteri64v(
-                                                             context, bufferPacked, pname, params));
-        if (isCallValid)
-        {
-            context->getNamedBufferParameteri64v(bufferPacked, pname, params);
-        }
-        ANGLE_CAPTURE(GetNamedBufferParameteri64v, isCallValid, context, bufferPacked, pname,
-                      params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetNamedBufferParameteriv(GLuint buffer, GLenum pname, GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetNamedBufferParameteriv, "glGetNamedBufferParameteriv",
-          "context = %d, buffer = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), buffer,
-          GLenumToString(GLenumGroup::VertexBufferObjectParameter, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateGetNamedBufferParameteriv(
-                                                             context, bufferPacked, pname, params));
-        if (isCallValid)
-        {
-            context->getNamedBufferParameteriv(bufferPacked, pname, params);
-        }
-        ANGLE_CAPTURE(GetNamedBufferParameteriv, isCallValid, context, bufferPacked, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetNamedBufferPointerv(GLuint buffer, GLenum pname, void **params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetNamedBufferPointerv, "glGetNamedBufferPointerv",
-          "context = %d, buffer = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), buffer,
-          GLenumToString(GLenumGroup::VertexBufferObjectParameter, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetNamedBufferPointerv(context, bufferPacked, pname, params));
-        if (isCallValid)
-        {
-            context->getNamedBufferPointerv(bufferPacked, pname, params);
-        }
-        ANGLE_CAPTURE(GetNamedBufferPointerv, isCallValid, context, bufferPacked, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetNamedBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr size, void *data)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetNamedBufferSubData, "glGetNamedBufferSubData",
-          "context = %d, buffer = %u, offset = %llu, size = %llu, data = 0x%016" PRIxPTR "",
-          CID(context), buffer, static_cast<unsigned long long>(offset),
-          static_cast<unsigned long long>(size), (uintptr_t)data);
-
-    if (context)
-    {
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetNamedBufferSubData(context, bufferPacked, offset, size, data));
-        if (isCallValid)
-        {
-            context->getNamedBufferSubData(bufferPacked, offset, size, data);
-        }
-        ANGLE_CAPTURE(GetNamedBufferSubData, isCallValid, context, bufferPacked, offset, size,
-                      data);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetNamedFramebufferAttachmentParameteriv(GLuint framebuffer,
-                                                          GLenum attachment,
-                                                          GLenum pname,
-                                                          GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetNamedFramebufferAttachmentParameteriv,
-          "glGetNamedFramebufferAttachmentParameteriv",
-          "context = %d, framebuffer = %u, attachment = %s, pname = %s, params = 0x%016" PRIxPTR "",
-          CID(context), framebuffer, GLenumToString(GLenumGroup::FramebufferAttachment, attachment),
-          GLenumToString(GLenumGroup::FramebufferAttachmentParameterName, pname),
-          (uintptr_t)params);
-
-    if (context)
-    {
-        FramebufferID framebufferPacked                       = FromGL<FramebufferID>(framebuffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetNamedFramebufferAttachmentParameteriv(
-                                context, framebufferPacked, attachment, pname, params));
-        if (isCallValid)
-        {
-            context->getNamedFramebufferAttachmentParameteriv(framebufferPacked, attachment, pname,
-                                                              params);
-        }
-        ANGLE_CAPTURE(GetNamedFramebufferAttachmentParameteriv, isCallValid, context,
-                      framebufferPacked, attachment, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetNamedFramebufferParameteriv(GLuint framebuffer, GLenum pname, GLint *param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(
-        context, gl::EntryPoint::GetNamedFramebufferParameteriv, "glGetNamedFramebufferParameteriv",
-        "context = %d, framebuffer = %u, pname = %s, param = 0x%016" PRIxPTR "", CID(context),
-        framebuffer, GLenumToString(GLenumGroup::GetFramebufferParameter, pname), (uintptr_t)param);
-
-    if (context)
-    {
-        FramebufferID framebufferPacked                       = FromGL<FramebufferID>(framebuffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetNamedFramebufferParameteriv(context, framebufferPacked, pname, param));
-        if (isCallValid)
-        {
-            context->getNamedFramebufferParameteriv(framebufferPacked, pname, param);
-        }
-        ANGLE_CAPTURE(GetNamedFramebufferParameteriv, isCallValid, context, framebufferPacked,
-                      pname, param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetNamedRenderbufferParameteriv(GLuint renderbuffer, GLenum pname, GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetNamedRenderbufferParameteriv,
-          "glGetNamedRenderbufferParameteriv",
-          "context = %d, renderbuffer = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          renderbuffer, GLenumToString(GLenumGroup::RenderbufferParameterName, pname),
-          (uintptr_t)params);
-
-    if (context)
-    {
-        RenderbufferID renderbufferPacked = FromGL<RenderbufferID>(renderbuffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetNamedRenderbufferParameteriv(context, renderbufferPacked, pname, params));
-        if (isCallValid)
-        {
-            context->getNamedRenderbufferParameteriv(renderbufferPacked, pname, params);
-        }
-        ANGLE_CAPTURE(GetNamedRenderbufferParameteriv, isCallValid, context, renderbufferPacked,
-                      pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetQueryBufferObjecti64v(GLuint id, GLuint buffer, GLenum pname, GLintptr offset)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetQueryBufferObjecti64v, "glGetQueryBufferObjecti64v",
-          "context = %d, id = %u, buffer = %u, pname = %s, offset = %llu", CID(context), id, buffer,
-          GLenumToString(GLenumGroup::QueryObjectParameterName, pname),
-          static_cast<unsigned long long>(offset));
-
-    if (context)
-    {
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetQueryBufferObjecti64v(context, id, bufferPacked, pname, offset));
-        if (isCallValid)
-        {
-            context->getQueryBufferObjecti64v(id, bufferPacked, pname, offset);
-        }
-        ANGLE_CAPTURE(GetQueryBufferObjecti64v, isCallValid, context, id, bufferPacked, pname,
-                      offset);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetQueryBufferObjectiv(GLuint id, GLuint buffer, GLenum pname, GLintptr offset)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetQueryBufferObjectiv, "glGetQueryBufferObjectiv",
-          "context = %d, id = %u, buffer = %u, pname = %s, offset = %llu", CID(context), id, buffer,
-          GLenumToString(GLenumGroup::QueryObjectParameterName, pname),
-          static_cast<unsigned long long>(offset));
-
-    if (context)
-    {
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetQueryBufferObjectiv(context, id, bufferPacked, pname, offset));
-        if (isCallValid)
-        {
-            context->getQueryBufferObjectiv(id, bufferPacked, pname, offset);
-        }
-        ANGLE_CAPTURE(GetQueryBufferObjectiv, isCallValid, context, id, bufferPacked, pname,
-                      offset);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetQueryBufferObjectui64v(GLuint id, GLuint buffer, GLenum pname, GLintptr offset)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetQueryBufferObjectui64v, "glGetQueryBufferObjectui64v",
-          "context = %d, id = %u, buffer = %u, pname = %s, offset = %llu", CID(context), id, buffer,
-          GLenumToString(GLenumGroup::QueryObjectParameterName, pname),
-          static_cast<unsigned long long>(offset));
-
-    if (context)
-    {
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetQueryBufferObjectui64v(context, id, bufferPacked, pname, offset));
-        if (isCallValid)
-        {
-            context->getQueryBufferObjectui64v(id, bufferPacked, pname, offset);
-        }
-        ANGLE_CAPTURE(GetQueryBufferObjectui64v, isCallValid, context, id, bufferPacked, pname,
-                      offset);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetQueryBufferObjectuiv(GLuint id, GLuint buffer, GLenum pname, GLintptr offset)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetQueryBufferObjectuiv, "glGetQueryBufferObjectuiv",
-          "context = %d, id = %u, buffer = %u, pname = %s, offset = %llu", CID(context), id, buffer,
-          GLenumToString(GLenumGroup::QueryObjectParameterName, pname),
-          static_cast<unsigned long long>(offset));
-
-    if (context)
-    {
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetQueryBufferObjectuiv(context, id, bufferPacked, pname, offset));
-        if (isCallValid)
-        {
-            context->getQueryBufferObjectuiv(id, bufferPacked, pname, offset);
-        }
-        ANGLE_CAPTURE(GetQueryBufferObjectuiv, isCallValid, context, id, bufferPacked, pname,
-                      offset);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetTextureImage(GLuint texture,
-                                 GLint level,
-                                 GLenum format,
-                                 GLenum type,
-                                 GLsizei bufSize,
-                                 void *pixels)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTextureImage, "glGetTextureImage",
-          "context = %d, texture = %u, level = %d, format = %s, type = %s, bufSize = %d, pixels = "
-          "0x%016" PRIxPTR "",
-          CID(context), texture, level, GLenumToString(GLenumGroup::PixelFormat, format),
-          GLenumToString(GLenumGroup::PixelType, type), bufSize, (uintptr_t)pixels);
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetTextureImage(context, texturePacked, level, format, type, bufSize, pixels));
-        if (isCallValid)
-        {
-            context->getTextureImage(texturePacked, level, format, type, bufSize, pixels);
-        }
-        ANGLE_CAPTURE(GetTextureImage, isCallValid, context, texturePacked, level, format, type,
-                      bufSize, pixels);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetTextureLevelParameterfv(GLuint texture,
-                                            GLint level,
-                                            GLenum pname,
-                                            GLfloat *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTextureLevelParameterfv, "glGetTextureLevelParameterfv",
-          "context = %d, texture = %u, level = %d, pname = %s, params = 0x%016" PRIxPTR "",
-          CID(context), texture, level, GLenumToString(GLenumGroup::GetTextureParameter, pname),
-          (uintptr_t)params);
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetTextureLevelParameterfv(context, texturePacked, level, pname, params));
-        if (isCallValid)
-        {
-            context->getTextureLevelParameterfv(texturePacked, level, pname, params);
-        }
-        ANGLE_CAPTURE(GetTextureLevelParameterfv, isCallValid, context, texturePacked, level, pname,
-                      params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetTextureLevelParameteriv(GLuint texture,
-                                            GLint level,
-                                            GLenum pname,
-                                            GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTextureLevelParameteriv, "glGetTextureLevelParameteriv",
-          "context = %d, texture = %u, level = %d, pname = %s, params = 0x%016" PRIxPTR "",
-          CID(context), texture, level, GLenumToString(GLenumGroup::GetTextureParameter, pname),
-          (uintptr_t)params);
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetTextureLevelParameteriv(context, texturePacked, level, pname, params));
-        if (isCallValid)
-        {
-            context->getTextureLevelParameteriv(texturePacked, level, pname, params);
-        }
-        ANGLE_CAPTURE(GetTextureLevelParameteriv, isCallValid, context, texturePacked, level, pname,
-                      params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetTextureParameterIiv(GLuint texture, GLenum pname, GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTextureParameterIiv, "glGetTextureParameterIiv",
-          "context = %d, texture = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          texture, GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetTextureParameterIiv(context, texturePacked, pname, params));
-        if (isCallValid)
-        {
-            context->getTextureParameterIiv(texturePacked, pname, params);
-        }
-        ANGLE_CAPTURE(GetTextureParameterIiv, isCallValid, context, texturePacked, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetTextureParameterIuiv(GLuint texture, GLenum pname, GLuint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTextureParameterIuiv, "glGetTextureParameterIuiv",
-          "context = %d, texture = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          texture, GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetTextureParameterIuiv(context, texturePacked, pname, params));
-        if (isCallValid)
-        {
-            context->getTextureParameterIuiv(texturePacked, pname, params);
-        }
-        ANGLE_CAPTURE(GetTextureParameterIuiv, isCallValid, context, texturePacked, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetTextureParameterfv(GLuint texture, GLenum pname, GLfloat *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTextureParameterfv, "glGetTextureParameterfv",
-          "context = %d, texture = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          texture, GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetTextureParameterfv(context, texturePacked, pname, params));
-        if (isCallValid)
-        {
-            context->getTextureParameterfv(texturePacked, pname, params);
-        }
-        ANGLE_CAPTURE(GetTextureParameterfv, isCallValid, context, texturePacked, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetTextureParameteriv(GLuint texture, GLenum pname, GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTextureParameteriv, "glGetTextureParameteriv",
-          "context = %d, texture = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          texture, GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetTextureParameteriv(context, texturePacked, pname, params));
-        if (isCallValid)
-        {
-            context->getTextureParameteriv(texturePacked, pname, params);
-        }
-        ANGLE_CAPTURE(GetTextureParameteriv, isCallValid, context, texturePacked, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetTextureSubImage(GLuint texture,
-                                    GLint level,
-                                    GLint xoffset,
-                                    GLint yoffset,
-                                    GLint zoffset,
-                                    GLsizei width,
-                                    GLsizei height,
-                                    GLsizei depth,
-                                    GLenum format,
-                                    GLenum type,
-                                    GLsizei bufSize,
-                                    void *pixels)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(
-        context, gl::EntryPoint::GetTextureSubImage, "glGetTextureSubImage",
-        "context = %d, texture = %u, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, width = "
-        "%d, height = %d, depth = %d, format = %s, type = %s, bufSize = %d, pixels = 0x%016" PRIxPTR
-        "",
-        CID(context), texture, level, xoffset, yoffset, zoffset, width, height, depth,
-        GLenumToString(GLenumGroup::PixelFormat, format),
-        GLenumToString(GLenumGroup::PixelType, type), bufSize, (uintptr_t)pixels);
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetTextureSubImage(context, texturePacked, level, xoffset, yoffset, zoffset,
-                                        width, height, depth, format, type, bufSize, pixels));
-        if (isCallValid)
-        {
-            context->getTextureSubImage(texturePacked, level, xoffset, yoffset, zoffset, width,
-                                        height, depth, format, type, bufSize, pixels);
-        }
-        ANGLE_CAPTURE(GetTextureSubImage, isCallValid, context, texturePacked, level, xoffset,
-                      yoffset, zoffset, width, height, depth, format, type, bufSize, pixels);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetTransformFeedbacki64_v(GLuint xfb, GLenum pname, GLuint index, GLint64 *param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTransformFeedbacki64_v, "glGetTransformFeedbacki64_v",
-          "context = %d, xfb = %u, pname = %s, index = %u, param = 0x%016" PRIxPTR "", CID(context),
-          xfb, GLenumToString(GLenumGroup::TransformFeedbackPName, pname), index, (uintptr_t)param);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetTransformFeedbacki64_v(context, xfb, pname, index, param));
-        if (isCallValid)
-        {
-            context->getTransformFeedbacki64_v(xfb, pname, index, param);
-        }
-        ANGLE_CAPTURE(GetTransformFeedbacki64_v, isCallValid, context, xfb, pname, index, param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetTransformFeedbacki_v(GLuint xfb, GLenum pname, GLuint index, GLint *param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTransformFeedbacki_v, "glGetTransformFeedbacki_v",
-          "context = %d, xfb = %u, pname = %s, index = %u, param = 0x%016" PRIxPTR "", CID(context),
-          xfb, GLenumToString(GLenumGroup::TransformFeedbackPName, pname), index, (uintptr_t)param);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetTransformFeedbacki_v(context, xfb, pname, index, param));
-        if (isCallValid)
-        {
-            context->getTransformFeedbacki_v(xfb, pname, index, param);
-        }
-        ANGLE_CAPTURE(GetTransformFeedbacki_v, isCallValid, context, xfb, pname, index, param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetTransformFeedbackiv(GLuint xfb, GLenum pname, GLint *param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTransformFeedbackiv, "glGetTransformFeedbackiv",
-          "context = %d, xfb = %u, pname = %s, param = 0x%016" PRIxPTR "", CID(context), xfb,
-          GLenumToString(GLenumGroup::TransformFeedbackPName, pname), (uintptr_t)param);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetTransformFeedbackiv(context, xfb, pname, param));
-        if (isCallValid)
-        {
-            context->getTransformFeedbackiv(xfb, pname, param);
-        }
-        ANGLE_CAPTURE(GetTransformFeedbackiv, isCallValid, context, xfb, pname, param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetVertexArrayIndexed64iv(GLuint vaobj, GLuint index, GLenum pname, GLint64 *param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetVertexArrayIndexed64iv, "glGetVertexArrayIndexed64iv",
-          "context = %d, vaobj = %u, index = %u, pname = %s, param = 0x%016" PRIxPTR "",
-          CID(context), vaobj, index, GLenumToString(GLenumGroup::VertexArrayPName, pname),
-          (uintptr_t)param);
-
-    if (context)
-    {
-        VertexArrayID vaobjPacked                             = FromGL<VertexArrayID>(vaobj);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetVertexArrayIndexed64iv(context, vaobjPacked, index, pname, param));
-        if (isCallValid)
-        {
-            context->getVertexArrayIndexed64iv(vaobjPacked, index, pname, param);
-        }
-        ANGLE_CAPTURE(GetVertexArrayIndexed64iv, isCallValid, context, vaobjPacked, index, pname,
-                      param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetVertexArrayIndexediv(GLuint vaobj, GLuint index, GLenum pname, GLint *param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetVertexArrayIndexediv, "glGetVertexArrayIndexediv",
-          "context = %d, vaobj = %u, index = %u, pname = %s, param = 0x%016" PRIxPTR "",
-          CID(context), vaobj, index, GLenumToString(GLenumGroup::VertexArrayPName, pname),
-          (uintptr_t)param);
-
-    if (context)
-    {
-        VertexArrayID vaobjPacked                             = FromGL<VertexArrayID>(vaobj);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetVertexArrayIndexediv(context, vaobjPacked, index, pname, param));
-        if (isCallValid)
-        {
-            context->getVertexArrayIndexediv(vaobjPacked, index, pname, param);
-        }
-        ANGLE_CAPTURE(GetVertexArrayIndexediv, isCallValid, context, vaobjPacked, index, pname,
-                      param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetVertexArrayiv(GLuint vaobj, GLenum pname, GLint *param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetVertexArrayiv, "glGetVertexArrayiv",
-          "context = %d, vaobj = %u, pname = %s, param = 0x%016" PRIxPTR "", CID(context), vaobj,
-          GLenumToString(GLenumGroup::VertexArrayPName, pname), (uintptr_t)param);
-
-    if (context)
-    {
-        VertexArrayID vaobjPacked                             = FromGL<VertexArrayID>(vaobj);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetVertexArrayiv(context, vaobjPacked, pname, param));
-        if (isCallValid)
-        {
-            context->getVertexArrayiv(vaobjPacked, pname, param);
-        }
-        ANGLE_CAPTURE(GetVertexArrayiv, isCallValid, context, vaobjPacked, pname, param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY
-GetnColorTable(GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetnColorTable, "glGetnColorTable",
-          "context = %d, target = %s, format = %s, type = %s, bufSize = %d, table = 0x%016" PRIxPTR
-          "",
-          CID(context), GLenumToString(GLenumGroup::ColorTableTarget, target),
-          GLenumToString(GLenumGroup::PixelFormat, format),
-          GLenumToString(GLenumGroup::PixelType, type), bufSize, (uintptr_t)table);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetnColorTable(context, target, format, type, bufSize, table));
-        if (isCallValid)
-        {
-            context->getnColorTable(target, format, type, bufSize, table);
-        }
-        ANGLE_CAPTURE(GetnColorTable, isCallValid, context, target, format, type, bufSize, table);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetnCompressedTexImage(GLenum target, GLint lod, GLsizei bufSize, void *pixels)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetnCompressedTexImage, "glGetnCompressedTexImage",
-          "context = %d, target = %s, lod = %d, bufSize = %d, pixels = 0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), lod, bufSize,
-          (uintptr_t)pixels);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetnCompressedTexImage(context, target, lod, bufSize, pixels));
-        if (isCallValid)
-        {
-            context->getnCompressedTexImage(target, lod, bufSize, pixels);
-        }
-        ANGLE_CAPTURE(GetnCompressedTexImage, isCallValid, context, target, lod, bufSize, pixels);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY
-GetnConvolutionFilter(GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetnConvolutionFilter, "glGetnConvolutionFilter",
-          "context = %d, target = %s, format = %s, type = %s, bufSize = %d, image = 0x%016" PRIxPTR
-          "",
-          CID(context), GLenumToString(GLenumGroup::ConvolutionTarget, target),
-          GLenumToString(GLenumGroup::PixelFormat, format),
-          GLenumToString(GLenumGroup::PixelType, type), bufSize, (uintptr_t)image);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetnConvolutionFilter(context, target, format, type, bufSize, image));
-        if (isCallValid)
-        {
-            context->getnConvolutionFilter(target, format, type, bufSize, image);
-        }
-        ANGLE_CAPTURE(GetnConvolutionFilter, isCallValid, context, target, format, type, bufSize,
-                      image);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetnHistogram(GLenum target,
-                               GLboolean reset,
-                               GLenum format,
-                               GLenum type,
-                               GLsizei bufSize,
-                               void *values)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetnHistogram, "glGetnHistogram",
-          "context = %d, target = %s, reset = %s, format = %s, type = %s, bufSize = %d, values = "
-          "0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::HistogramTargetEXT, target),
-          GLbooleanToString(reset), GLenumToString(GLenumGroup::PixelFormat, format),
-          GLenumToString(GLenumGroup::PixelType, type), bufSize, (uintptr_t)values);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetnHistogram(context, target, reset, format, type, bufSize, values));
-        if (isCallValid)
-        {
-            context->getnHistogram(target, reset, format, type, bufSize, values);
-        }
-        ANGLE_CAPTURE(GetnHistogram, isCallValid, context, target, reset, format, type, bufSize,
-                      values);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetnMapdv(GLenum target, GLenum query, GLsizei bufSize, GLdouble *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetnMapdv, "glGetnMapdv",
-          "context = %d, target = %s, query = %s, bufSize = %d, v = 0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::MapTarget, target),
-          GLenumToString(GLenumGroup::MapQuery, query), bufSize, (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetnMapdv(context, target, query, bufSize, v));
-        if (isCallValid)
-        {
-            context->getnMapdv(target, query, bufSize, v);
-        }
-        ANGLE_CAPTURE(GetnMapdv, isCallValid, context, target, query, bufSize, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetnMapfv(GLenum target, GLenum query, GLsizei bufSize, GLfloat *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetnMapfv, "glGetnMapfv",
-          "context = %d, target = %s, query = %s, bufSize = %d, v = 0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::MapTarget, target),
-          GLenumToString(GLenumGroup::MapQuery, query), bufSize, (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetnMapfv(context, target, query, bufSize, v));
-        if (isCallValid)
-        {
-            context->getnMapfv(target, query, bufSize, v);
-        }
-        ANGLE_CAPTURE(GetnMapfv, isCallValid, context, target, query, bufSize, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetnMapiv(GLenum target, GLenum query, GLsizei bufSize, GLint *v)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetnMapiv, "glGetnMapiv",
-          "context = %d, target = %s, query = %s, bufSize = %d, v = 0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::MapTarget, target),
-          GLenumToString(GLenumGroup::MapQuery, query), bufSize, (uintptr_t)v);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetnMapiv(context, target, query, bufSize, v));
-        if (isCallValid)
-        {
-            context->getnMapiv(target, query, bufSize, v);
-        }
-        ANGLE_CAPTURE(GetnMapiv, isCallValid, context, target, query, bufSize, v);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetnMinmax(GLenum target,
-                            GLboolean reset,
-                            GLenum format,
-                            GLenum type,
-                            GLsizei bufSize,
-                            void *values)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetnMinmax, "glGetnMinmax",
-          "context = %d, target = %s, reset = %s, format = %s, type = %s, bufSize = %d, values = "
-          "0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::MinmaxTargetEXT, target),
-          GLbooleanToString(reset), GLenumToString(GLenumGroup::PixelFormat, format),
-          GLenumToString(GLenumGroup::PixelType, type), bufSize, (uintptr_t)values);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetnMinmax(context, target, reset, format, type, bufSize, values));
-        if (isCallValid)
-        {
-            context->getnMinmax(target, reset, format, type, bufSize, values);
-        }
-        ANGLE_CAPTURE(GetnMinmax, isCallValid, context, target, reset, format, type, bufSize,
-                      values);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetnPixelMapfv(GLenum map, GLsizei bufSize, GLfloat *values)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetnPixelMapfv, "glGetnPixelMapfv",
-          "context = %d, map = %s, bufSize = %d, values = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::PixelMap, map), bufSize, (uintptr_t)values);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetnPixelMapfv(context, map, bufSize, values));
-        if (isCallValid)
-        {
-            context->getnPixelMapfv(map, bufSize, values);
-        }
-        ANGLE_CAPTURE(GetnPixelMapfv, isCallValid, context, map, bufSize, values);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetnPixelMapuiv(GLenum map, GLsizei bufSize, GLuint *values)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetnPixelMapuiv, "glGetnPixelMapuiv",
-          "context = %d, map = %s, bufSize = %d, values = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::PixelMap, map), bufSize, (uintptr_t)values);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetnPixelMapuiv(context, map, bufSize, values));
-        if (isCallValid)
-        {
-            context->getnPixelMapuiv(map, bufSize, values);
-        }
-        ANGLE_CAPTURE(GetnPixelMapuiv, isCallValid, context, map, bufSize, values);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetnPixelMapusv(GLenum map, GLsizei bufSize, GLushort *values)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetnPixelMapusv, "glGetnPixelMapusv",
-          "context = %d, map = %s, bufSize = %d, values = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::PixelMap, map), bufSize, (uintptr_t)values);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetnPixelMapusv(context, map, bufSize, values));
-        if (isCallValid)
-        {
-            context->getnPixelMapusv(map, bufSize, values);
-        }
-        ANGLE_CAPTURE(GetnPixelMapusv, isCallValid, context, map, bufSize, values);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetnPolygonStipple(GLsizei bufSize, GLubyte *pattern)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetnPolygonStipple, "glGetnPolygonStipple",
-          "context = %d, bufSize = %d, pattern = 0x%016" PRIxPTR "", CID(context), bufSize,
-          (uintptr_t)pattern);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateGetnPolygonStipple(context, bufSize, pattern));
-        if (isCallValid)
-        {
-            context->getnPolygonStipple(bufSize, pattern);
-        }
-        ANGLE_CAPTURE(GetnPolygonStipple, isCallValid, context, bufSize, pattern);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetnSeparableFilter(GLenum target,
-                                     GLenum format,
-                                     GLenum type,
-                                     GLsizei rowBufSize,
-                                     void *row,
-                                     GLsizei columnBufSize,
-                                     void *column,
-                                     void *span)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetnSeparableFilter, "glGetnSeparableFilter",
-          "context = %d, target = %s, format = %s, type = %s, rowBufSize = %d, row = 0x%016" PRIxPTR
-          ", columnBufSize = %d, column = 0x%016" PRIxPTR ", span = 0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::SeparableTargetEXT, target),
-          GLenumToString(GLenumGroup::PixelFormat, format),
-          GLenumToString(GLenumGroup::PixelType, type), rowBufSize, (uintptr_t)row, columnBufSize,
-          (uintptr_t)column, (uintptr_t)span);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateGetnSeparableFilter(context, target, format, type, rowBufSize,
-                                                        row, columnBufSize, column, span));
-        if (isCallValid)
-        {
-            context->getnSeparableFilter(target, format, type, rowBufSize, row, columnBufSize,
-                                         column, span);
-        }
-        ANGLE_CAPTURE(GetnSeparableFilter, isCallValid, context, target, format, type, rowBufSize,
-                      row, columnBufSize, column, span);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY
-GetnTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetnTexImage, "glGetnTexImage",
-          "context = %d, target = %s, level = %d, format = %s, type = %s, bufSize = %d, pixels = "
-          "0x%016" PRIxPTR "",
-          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level,
-          GLenumToString(GLenumGroup::PixelFormat, format),
-          GLenumToString(GLenumGroup::PixelType, type), bufSize, (uintptr_t)pixels);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetnTexImage(context, target, level, format, type, bufSize, pixels));
-        if (isCallValid)
-        {
-            context->getnTexImage(target, level, format, type, bufSize, pixels);
-        }
-        ANGLE_CAPTURE(GetnTexImage, isCallValid, context, target, level, format, type, bufSize,
-                      pixels);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetnUniformdv(GLuint program, GLint location, GLsizei bufSize, GLdouble *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetnUniformdv, "glGetnUniformdv",
-          "context = %d, program = %u, location = %d, bufSize = %d, params = 0x%016" PRIxPTR "",
-          CID(context), program, location, bufSize, (uintptr_t)params);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetnUniformdv(context, programPacked, locationPacked, bufSize, params));
-        if (isCallValid)
-        {
-            context->getnUniformdv(programPacked, locationPacked, bufSize, params);
-        }
-        ANGLE_CAPTURE(GetnUniformdv, isCallValid, context, programPacked, locationPacked, bufSize,
-                      params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetnUniformfv, "glGetnUniformfv",
-          "context = %d, program = %u, location = %d, bufSize = %d, params = 0x%016" PRIxPTR "",
-          CID(context), program, location, bufSize, (uintptr_t)params);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetnUniformfv(context, programPacked, locationPacked, bufSize, params));
-        if (isCallValid)
-        {
-            context->getnUniformfv(programPacked, locationPacked, bufSize, params);
-        }
-        ANGLE_CAPTURE(GetnUniformfv, isCallValid, context, programPacked, locationPacked, bufSize,
-                      params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetnUniformiv, "glGetnUniformiv",
-          "context = %d, program = %u, location = %d, bufSize = %d, params = 0x%016" PRIxPTR "",
-          CID(context), program, location, bufSize, (uintptr_t)params);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetnUniformiv(context, programPacked, locationPacked, bufSize, params));
-        if (isCallValid)
-        {
-            context->getnUniformiv(programPacked, locationPacked, bufSize, params);
-        }
-        ANGLE_CAPTURE(GetnUniformiv, isCallValid, context, programPacked, locationPacked, bufSize,
-                      params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY GetnUniformuiv(GLuint program, GLint location, GLsizei bufSize, GLuint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetnUniformuiv, "glGetnUniformuiv",
-          "context = %d, program = %u, location = %d, bufSize = %d, params = 0x%016" PRIxPTR "",
-          CID(context), program, location, bufSize, (uintptr_t)params);
-
-    if (context)
-    {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateGetnUniformuiv(context, programPacked, locationPacked, bufSize, params));
-        if (isCallValid)
-        {
-            context->getnUniformuiv(programPacked, locationPacked, bufSize, params);
-        }
-        ANGLE_CAPTURE(GetnUniformuiv, isCallValid, context, programPacked, locationPacked, bufSize,
-                      params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY InvalidateNamedFramebufferData(GLuint framebuffer,
-                                                GLsizei numAttachments,
-                                                const GLenum *attachments)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::InvalidateNamedFramebufferData,
-          "glInvalidateNamedFramebufferData",
-          "context = %d, framebuffer = %u, numAttachments = %d, attachments = 0x%016" PRIxPTR "",
-          CID(context), framebuffer, numAttachments, (uintptr_t)attachments);
-
-    if (context)
-    {
-        FramebufferID framebufferPacked                       = FromGL<FramebufferID>(framebuffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateInvalidateNamedFramebufferData(context, framebufferPacked,
-                                                                   numAttachments, attachments));
-        if (isCallValid)
-        {
-            context->invalidateNamedFramebufferData(framebufferPacked, numAttachments, attachments);
-        }
-        ANGLE_CAPTURE(InvalidateNamedFramebufferData, isCallValid, context, framebufferPacked,
-                      numAttachments, attachments);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY InvalidateNamedFramebufferSubData(GLuint framebuffer,
-                                                   GLsizei numAttachments,
-                                                   const GLenum *attachments,
-                                                   GLint x,
-                                                   GLint y,
-                                                   GLsizei width,
-                                                   GLsizei height)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::InvalidateNamedFramebufferSubData,
-          "glInvalidateNamedFramebufferSubData",
-          "context = %d, framebuffer = %u, numAttachments = %d, attachments = 0x%016" PRIxPTR
-          ", x = %d, y = %d, width = %d, height = %d",
-          CID(context), framebuffer, numAttachments, (uintptr_t)attachments, x, y, width, height);
-
-    if (context)
-    {
-        FramebufferID framebufferPacked                       = FromGL<FramebufferID>(framebuffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateInvalidateNamedFramebufferSubData(context, framebufferPacked, numAttachments,
-                                                       attachments, x, y, width, height));
-        if (isCallValid)
-        {
-            context->invalidateNamedFramebufferSubData(framebufferPacked, numAttachments,
-                                                       attachments, x, y, width, height);
-        }
-        ANGLE_CAPTURE(InvalidateNamedFramebufferSubData, isCallValid, context, framebufferPacked,
-                      numAttachments, attachments, x, y, width, height);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void *GL_APIENTRY MapNamedBuffer(GLuint buffer, GLenum access)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MapNamedBuffer, "glMapNamedBuffer",
-          "context = %d, buffer = %u, access = %s", CID(context), buffer,
-          GLenumToString(GLenumGroup::BufferAccessARB, access));
-
-    void *returnValue;
-    if (context)
-    {
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMapNamedBuffer(context, bufferPacked, access));
-        if (isCallValid)
-        {
-            returnValue = context->mapNamedBuffer(bufferPacked, access);
-        }
-        else
-        {
-            returnValue = GetDefaultReturnValue<EntryPoint::MapNamedBuffer, void *>();
-        }
-        ANGLE_CAPTURE(MapNamedBuffer, isCallValid, context, bufferPacked, access, returnValue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::MapNamedBuffer, void *>();
-    }
-    return returnValue;
-}
-
-void *GL_APIENTRY MapNamedBufferRange(GLuint buffer,
-                                      GLintptr offset,
-                                      GLsizeiptr length,
-                                      GLbitfield access)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MapNamedBufferRange, "glMapNamedBufferRange",
-          "context = %d, buffer = %u, offset = %llu, length = %llu, access = %s", CID(context),
-          buffer, static_cast<unsigned long long>(offset), static_cast<unsigned long long>(length),
-          GLbitfieldToString(GLenumGroup::BufferAccessMask, access).c_str());
-
-    void *returnValue;
-    if (context)
-    {
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateMapNamedBufferRange(context, bufferPacked, offset, length, access));
-        if (isCallValid)
-        {
-            returnValue = context->mapNamedBufferRange(bufferPacked, offset, length, access);
-        }
-        else
-        {
-            returnValue = GetDefaultReturnValue<EntryPoint::MapNamedBufferRange, void *>();
-        }
-        ANGLE_CAPTURE(MapNamedBufferRange, isCallValid, context, bufferPacked, offset, length,
-                      access, returnValue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::MapNamedBufferRange, void *>();
-    }
-    return returnValue;
-}
-
-void GL_APIENTRY MemoryBarrierByRegion(GLbitfield barriers)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MemoryBarrierByRegion, "glMemoryBarrierByRegion",
-          "context = %d, barriers = %s", CID(context),
-          GLbitfieldToString(GLenumGroup::MemoryBarrierMask, barriers).c_str());
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateMemoryBarrierByRegion(context, barriers));
-        if (isCallValid)
-        {
-            context->memoryBarrierByRegion(barriers);
-        }
-        ANGLE_CAPTURE(MemoryBarrierByRegion, isCallValid, context, barriers);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY NamedBufferData(GLuint buffer, GLsizeiptr size, const void *data, GLenum usage)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::NamedBufferData, "glNamedBufferData",
-          "context = %d, buffer = %u, size = %llu, data = 0x%016" PRIxPTR ", usage = %s",
-          CID(context), buffer, static_cast<unsigned long long>(size), (uintptr_t)data,
-          GLenumToString(GLenumGroup::VertexBufferObjectUsage, usage));
-
-    if (context)
-    {
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateNamedBufferData(context, bufferPacked, size, data, usage));
-        if (isCallValid)
-        {
-            context->namedBufferData(bufferPacked, size, data, usage);
-        }
-        ANGLE_CAPTURE(NamedBufferData, isCallValid, context, bufferPacked, size, data, usage);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY NamedBufferStorage(GLuint buffer,
-                                    GLsizeiptr size,
-                                    const void *data,
-                                    GLbitfield flags)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::NamedBufferStorage, "glNamedBufferStorage",
-          "context = %d, buffer = %u, size = %llu, data = 0x%016" PRIxPTR ", flags = %s",
-          CID(context), buffer, static_cast<unsigned long long>(size), (uintptr_t)data,
-          GLbitfieldToString(GLenumGroup::MapBufferUsageMask, flags).c_str());
-
-    if (context)
-    {
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateNamedBufferStorage(context, bufferPacked, size, data, flags));
-        if (isCallValid)
-        {
-            context->namedBufferStorage(bufferPacked, size, data, flags);
-        }
-        ANGLE_CAPTURE(NamedBufferStorage, isCallValid, context, bufferPacked, size, data, flags);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY NamedBufferSubData(GLuint buffer,
-                                    GLintptr offset,
-                                    GLsizeiptr size,
-                                    const void *data)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::NamedBufferSubData, "glNamedBufferSubData",
-          "context = %d, buffer = %u, offset = %llu, size = %llu, data = 0x%016" PRIxPTR "",
-          CID(context), buffer, static_cast<unsigned long long>(offset),
-          static_cast<unsigned long long>(size), (uintptr_t)data);
-
-    if (context)
-    {
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateNamedBufferSubData(context, bufferPacked, offset, size, data));
-        if (isCallValid)
-        {
-            context->namedBufferSubData(bufferPacked, offset, size, data);
-        }
-        ANGLE_CAPTURE(NamedBufferSubData, isCallValid, context, bufferPacked, offset, size, data);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY NamedFramebufferDrawBuffer(GLuint framebuffer, GLenum buf)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::NamedFramebufferDrawBuffer, "glNamedFramebufferDrawBuffer",
-          "context = %d, framebuffer = %u, buf = %s", CID(context), framebuffer,
-          GLenumToString(GLenumGroup::ColorBuffer, buf));
-
-    if (context)
-    {
-        FramebufferID framebufferPacked                       = FromGL<FramebufferID>(framebuffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateNamedFramebufferDrawBuffer(context, framebufferPacked, buf));
-        if (isCallValid)
-        {
-            context->namedFramebufferDrawBuffer(framebufferPacked, buf);
-        }
-        ANGLE_CAPTURE(NamedFramebufferDrawBuffer, isCallValid, context, framebufferPacked, buf);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY NamedFramebufferDrawBuffers(GLuint framebuffer, GLsizei n, const GLenum *bufs)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::NamedFramebufferDrawBuffers, "glNamedFramebufferDrawBuffers",
-          "context = %d, framebuffer = %u, n = %d, bufs = 0x%016" PRIxPTR "", CID(context),
-          framebuffer, n, (uintptr_t)bufs);
-
-    if (context)
-    {
-        FramebufferID framebufferPacked                       = FromGL<FramebufferID>(framebuffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateNamedFramebufferDrawBuffers(
-                                                             context, framebufferPacked, n, bufs));
-        if (isCallValid)
-        {
-            context->namedFramebufferDrawBuffers(framebufferPacked, n, bufs);
-        }
-        ANGLE_CAPTURE(NamedFramebufferDrawBuffers, isCallValid, context, framebufferPacked, n,
-                      bufs);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY NamedFramebufferParameteri(GLuint framebuffer, GLenum pname, GLint param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::NamedFramebufferParameteri, "glNamedFramebufferParameteri",
-          "context = %d, framebuffer = %u, pname = %s, param = %d", CID(context), framebuffer,
-          GLenumToString(GLenumGroup::FramebufferParameterName, pname), param);
-
-    if (context)
-    {
-        FramebufferID framebufferPacked                       = FromGL<FramebufferID>(framebuffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateNamedFramebufferParameteri(context, framebufferPacked, pname, param));
-        if (isCallValid)
-        {
-            context->namedFramebufferParameteri(framebufferPacked, pname, param);
-        }
-        ANGLE_CAPTURE(NamedFramebufferParameteri, isCallValid, context, framebufferPacked, pname,
-                      param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY NamedFramebufferReadBuffer(GLuint framebuffer, GLenum src)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::NamedFramebufferReadBuffer, "glNamedFramebufferReadBuffer",
-          "context = %d, framebuffer = %u, src = %s", CID(context), framebuffer,
-          GLenumToString(GLenumGroup::ColorBuffer, src));
-
-    if (context)
-    {
-        FramebufferID framebufferPacked                       = FromGL<FramebufferID>(framebuffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateNamedFramebufferReadBuffer(context, framebufferPacked, src));
-        if (isCallValid)
-        {
-            context->namedFramebufferReadBuffer(framebufferPacked, src);
-        }
-        ANGLE_CAPTURE(NamedFramebufferReadBuffer, isCallValid, context, framebufferPacked, src);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY NamedFramebufferRenderbuffer(GLuint framebuffer,
-                                              GLenum attachment,
-                                              GLenum renderbuffertarget,
-                                              GLuint renderbuffer)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::NamedFramebufferRenderbuffer, "glNamedFramebufferRenderbuffer",
-          "context = %d, framebuffer = %u, attachment = %s, renderbuffertarget = %s, renderbuffer "
-          "= %u",
-          CID(context), framebuffer, GLenumToString(GLenumGroup::FramebufferAttachment, attachment),
-          GLenumToString(GLenumGroup::RenderbufferTarget, renderbuffertarget), renderbuffer);
-
-    if (context)
-    {
-        FramebufferID framebufferPacked   = FromGL<FramebufferID>(framebuffer);
-        RenderbufferID renderbufferPacked = FromGL<RenderbufferID>(renderbuffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateNamedFramebufferRenderbuffer(context, framebufferPacked, attachment,
-                                                  renderbuffertarget, renderbufferPacked));
-        if (isCallValid)
-        {
-            context->namedFramebufferRenderbuffer(framebufferPacked, attachment, renderbuffertarget,
-                                                  renderbufferPacked);
-        }
-        ANGLE_CAPTURE(NamedFramebufferRenderbuffer, isCallValid, context, framebufferPacked,
-                      attachment, renderbuffertarget, renderbufferPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY NamedFramebufferTexture(GLuint framebuffer,
-                                         GLenum attachment,
-                                         GLuint texture,
-                                         GLint level)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::NamedFramebufferTexture, "glNamedFramebufferTexture",
-          "context = %d, framebuffer = %u, attachment = %s, texture = %u, level = %d", CID(context),
-          framebuffer, GLenumToString(GLenumGroup::FramebufferAttachment, attachment), texture,
-          level);
-
-    if (context)
-    {
-        FramebufferID framebufferPacked                       = FromGL<FramebufferID>(framebuffer);
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateNamedFramebufferTexture(context, framebufferPacked, attachment,
-                                                            texturePacked, level));
-        if (isCallValid)
-        {
-            context->namedFramebufferTexture(framebufferPacked, attachment, texturePacked, level);
-        }
-        ANGLE_CAPTURE(NamedFramebufferTexture, isCallValid, context, framebufferPacked, attachment,
-                      texturePacked, level);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY NamedFramebufferTextureLayer(GLuint framebuffer,
-                                              GLenum attachment,
-                                              GLuint texture,
-                                              GLint level,
-                                              GLint layer)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::NamedFramebufferTextureLayer, "glNamedFramebufferTextureLayer",
-          "context = %d, framebuffer = %u, attachment = %s, texture = %u, level = %d, layer = %d",
-          CID(context), framebuffer, GLenumToString(GLenumGroup::FramebufferAttachment, attachment),
-          texture, level, layer);
-
-    if (context)
-    {
-        FramebufferID framebufferPacked                       = FromGL<FramebufferID>(framebuffer);
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateNamedFramebufferTextureLayer(
-                                                             context, framebufferPacked, attachment,
-                                                             texturePacked, level, layer));
-        if (isCallValid)
-        {
-            context->namedFramebufferTextureLayer(framebufferPacked, attachment, texturePacked,
-                                                  level, layer);
-        }
-        ANGLE_CAPTURE(NamedFramebufferTextureLayer, isCallValid, context, framebufferPacked,
-                      attachment, texturePacked, level, layer);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY NamedRenderbufferStorage(GLuint renderbuffer,
-                                          GLenum internalformat,
-                                          GLsizei width,
-                                          GLsizei height)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::NamedRenderbufferStorage, "glNamedRenderbufferStorage",
-          "context = %d, renderbuffer = %u, internalformat = %s, width = %d, height = %d",
-          CID(context), renderbuffer, GLenumToString(GLenumGroup::InternalFormat, internalformat),
-          width, height);
-
-    if (context)
-    {
-        RenderbufferID renderbufferPacked = FromGL<RenderbufferID>(renderbuffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateNamedRenderbufferStorage(context, renderbufferPacked,
-                                                             internalformat, width, height));
-        if (isCallValid)
-        {
-            context->namedRenderbufferStorage(renderbufferPacked, internalformat, width, height);
-        }
-        ANGLE_CAPTURE(NamedRenderbufferStorage, isCallValid, context, renderbufferPacked,
-                      internalformat, width, height);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY NamedRenderbufferStorageMultisample(GLuint renderbuffer,
-                                                     GLsizei samples,
-                                                     GLenum internalformat,
-                                                     GLsizei width,
-                                                     GLsizei height)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::NamedRenderbufferStorageMultisample,
-          "glNamedRenderbufferStorageMultisample",
-          "context = %d, renderbuffer = %u, samples = %d, internalformat = %s, width = %d, height "
-          "= %d",
-          CID(context), renderbuffer, samples,
-          GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height);
-
-    if (context)
-    {
-        RenderbufferID renderbufferPacked = FromGL<RenderbufferID>(renderbuffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateNamedRenderbufferStorageMultisample(context, renderbufferPacked, samples,
-                                                         internalformat, width, height));
-        if (isCallValid)
-        {
-            context->namedRenderbufferStorageMultisample(renderbufferPacked, samples,
-                                                         internalformat, width, height);
-        }
-        ANGLE_CAPTURE(NamedRenderbufferStorageMultisample, isCallValid, context, renderbufferPacked,
-                      samples, internalformat, width, height);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY ReadnPixels(GLint x,
-                             GLint y,
-                             GLsizei width,
-                             GLsizei height,
-                             GLenum format,
-                             GLenum type,
-                             GLsizei bufSize,
-                             void *data)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ReadnPixels, "glReadnPixels",
-          "context = %d, x = %d, y = %d, width = %d, height = %d, format = %s, type = %s, bufSize "
-          "= %d, data = 0x%016" PRIxPTR "",
-          CID(context), x, y, width, height, GLenumToString(GLenumGroup::PixelFormat, format),
-          GLenumToString(GLenumGroup::PixelType, type), bufSize, (uintptr_t)data);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateReadnPixels(context, x, y, width, height, format, type, bufSize, data));
-        if (isCallValid)
-        {
-            context->readnPixels(x, y, width, height, format, type, bufSize, data);
-        }
-        ANGLE_CAPTURE(ReadnPixels, isCallValid, context, x, y, width, height, format, type, bufSize,
-                      data);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TextureBarrier()
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TextureBarrier, "glTextureBarrier", "context = %d",
-          CID(context));
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid = (context->skipValidation() || ValidateTextureBarrier(context));
-        if (isCallValid)
-        {
-            context->textureBarrier();
-        }
-        ANGLE_CAPTURE(TextureBarrier, isCallValid, context);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TextureBuffer(GLuint texture, GLenum internalformat, GLuint buffer)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TextureBuffer, "glTextureBuffer",
-          "context = %d, texture = %u, internalformat = %s, buffer = %u", CID(context), texture,
-          GLenumToString(GLenumGroup::InternalFormat, internalformat), buffer);
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateTextureBuffer(context, texturePacked, internalformat, bufferPacked));
-        if (isCallValid)
-        {
-            context->textureBuffer(texturePacked, internalformat, bufferPacked);
-        }
-        ANGLE_CAPTURE(TextureBuffer, isCallValid, context, texturePacked, internalformat,
-                      bufferPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TextureBufferRange(GLuint texture,
-                                    GLenum internalformat,
-                                    GLuint buffer,
-                                    GLintptr offset,
-                                    GLsizeiptr size)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(
-        context, gl::EntryPoint::TextureBufferRange, "glTextureBufferRange",
-        "context = %d, texture = %u, internalformat = %s, buffer = %u, offset = %llu, size = %llu",
-        CID(context), texture, GLenumToString(GLenumGroup::InternalFormat, internalformat), buffer,
-        static_cast<unsigned long long>(offset), static_cast<unsigned long long>(size));
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateTextureBufferRange(context, texturePacked, internalformat,
-                                                       bufferPacked, offset, size));
-        if (isCallValid)
-        {
-            context->textureBufferRange(texturePacked, internalformat, bufferPacked, offset, size);
-        }
-        ANGLE_CAPTURE(TextureBufferRange, isCallValid, context, texturePacked, internalformat,
-                      bufferPacked, offset, size);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TextureParameterIiv(GLuint texture, GLenum pname, const GLint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TextureParameterIiv, "glTextureParameterIiv",
-          "context = %d, texture = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          texture, GLenumToString(GLenumGroup::TextureParameterName, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateTextureParameterIiv(context, texturePacked, pname, params));
-        if (isCallValid)
-        {
-            context->textureParameterIiv(texturePacked, pname, params);
-        }
-        ANGLE_CAPTURE(TextureParameterIiv, isCallValid, context, texturePacked, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TextureParameterIuiv(GLuint texture, GLenum pname, const GLuint *params)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TextureParameterIuiv, "glTextureParameterIuiv",
-          "context = %d, texture = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          texture, GLenumToString(GLenumGroup::TextureParameterName, pname), (uintptr_t)params);
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateTextureParameterIuiv(context, texturePacked, pname, params));
-        if (isCallValid)
-        {
-            context->textureParameterIuiv(texturePacked, pname, params);
-        }
-        ANGLE_CAPTURE(TextureParameterIuiv, isCallValid, context, texturePacked, pname, params);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TextureParameterf(GLuint texture, GLenum pname, GLfloat param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TextureParameterf, "glTextureParameterf",
-          "context = %d, texture = %u, pname = %s, param = %f", CID(context), texture,
-          GLenumToString(GLenumGroup::TextureParameterName, pname), param);
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateTextureParameterf(context, texturePacked, pname, param));
-        if (isCallValid)
-        {
-            context->textureParameterf(texturePacked, pname, param);
-        }
-        ANGLE_CAPTURE(TextureParameterf, isCallValid, context, texturePacked, pname, param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TextureParameterfv(GLuint texture, GLenum pname, const GLfloat *param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TextureParameterfv, "glTextureParameterfv",
-          "context = %d, texture = %u, pname = %s, param = 0x%016" PRIxPTR "", CID(context),
-          texture, GLenumToString(GLenumGroup::TextureParameterName, pname), (uintptr_t)param);
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateTextureParameterfv(context, texturePacked, pname, param));
-        if (isCallValid)
-        {
-            context->textureParameterfv(texturePacked, pname, param);
-        }
-        ANGLE_CAPTURE(TextureParameterfv, isCallValid, context, texturePacked, pname, param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TextureParameteri(GLuint texture, GLenum pname, GLint param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TextureParameteri, "glTextureParameteri",
-          "context = %d, texture = %u, pname = %s, param = %d", CID(context), texture,
-          GLenumToString(GLenumGroup::TextureParameterName, pname), param);
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateTextureParameteri(context, texturePacked, pname, param));
-        if (isCallValid)
-        {
-            context->textureParameteri(texturePacked, pname, param);
-        }
-        ANGLE_CAPTURE(TextureParameteri, isCallValid, context, texturePacked, pname, param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TextureParameteriv(GLuint texture, GLenum pname, const GLint *param)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TextureParameteriv, "glTextureParameteriv",
-          "context = %d, texture = %u, pname = %s, param = 0x%016" PRIxPTR "", CID(context),
-          texture, GLenumToString(GLenumGroup::TextureParameterName, pname), (uintptr_t)param);
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateTextureParameteriv(context, texturePacked, pname, param));
-        if (isCallValid)
-        {
-            context->textureParameteriv(texturePacked, pname, param);
-        }
-        ANGLE_CAPTURE(TextureParameteriv, isCallValid, context, texturePacked, pname, param);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TextureStorage1D(GLuint texture,
-                                  GLsizei levels,
-                                  GLenum internalformat,
-                                  GLsizei width)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TextureStorage1D, "glTextureStorage1D",
-          "context = %d, texture = %u, levels = %d, internalformat = %s, width = %d", CID(context),
-          texture, levels, GLenumToString(GLenumGroup::InternalFormat, internalformat), width);
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateTextureStorage1D(context, texturePacked, levels, internalformat, width));
-        if (isCallValid)
-        {
-            context->textureStorage1D(texturePacked, levels, internalformat, width);
-        }
-        ANGLE_CAPTURE(TextureStorage1D, isCallValid, context, texturePacked, levels, internalformat,
-                      width);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TextureStorage2D(GLuint texture,
-                                  GLsizei levels,
-                                  GLenum internalformat,
-                                  GLsizei width,
-                                  GLsizei height)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TextureStorage2D, "glTextureStorage2D",
-          "context = %d, texture = %u, levels = %d, internalformat = %s, width = %d, height = %d",
-          CID(context), texture, levels,
-          GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height);
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateTextureStorage2D(context, texturePacked, levels,
-                                                                   internalformat, width, height));
-        if (isCallValid)
-        {
-            context->textureStorage2D(texturePacked, levels, internalformat, width, height);
-        }
-        ANGLE_CAPTURE(TextureStorage2D, isCallValid, context, texturePacked, levels, internalformat,
-                      width, height);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TextureStorage2DMultisample(GLuint texture,
-                                             GLsizei samples,
-                                             GLenum internalformat,
-                                             GLsizei width,
-                                             GLsizei height,
-                                             GLboolean fixedsamplelocations)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TextureStorage2DMultisample, "glTextureStorage2DMultisample",
-          "context = %d, texture = %u, samples = %d, internalformat = %s, width = %d, height = %d, "
-          "fixedsamplelocations = %s",
-          CID(context), texture, samples,
-          GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height,
-          GLbooleanToString(fixedsamplelocations));
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateTextureStorage2DMultisample(context, texturePacked, samples, internalformat,
-                                                 width, height, fixedsamplelocations));
-        if (isCallValid)
-        {
-            context->textureStorage2DMultisample(texturePacked, samples, internalformat, width,
-                                                 height, fixedsamplelocations);
-        }
-        ANGLE_CAPTURE(TextureStorage2DMultisample, isCallValid, context, texturePacked, samples,
-                      internalformat, width, height, fixedsamplelocations);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TextureStorage3D(GLuint texture,
-                                  GLsizei levels,
-                                  GLenum internalformat,
-                                  GLsizei width,
-                                  GLsizei height,
-                                  GLsizei depth)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TextureStorage3D, "glTextureStorage3D",
-          "context = %d, texture = %u, levels = %d, internalformat = %s, width = %d, height = %d, "
-          "depth = %d",
-          CID(context), texture, levels,
-          GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height, depth);
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateTextureStorage3D(context, texturePacked, levels, internalformat,
-                                                     width, height, depth));
-        if (isCallValid)
-        {
-            context->textureStorage3D(texturePacked, levels, internalformat, width, height, depth);
-        }
-        ANGLE_CAPTURE(TextureStorage3D, isCallValid, context, texturePacked, levels, internalformat,
-                      width, height, depth);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TextureStorage3DMultisample(GLuint texture,
-                                             GLsizei samples,
-                                             GLenum internalformat,
-                                             GLsizei width,
-                                             GLsizei height,
-                                             GLsizei depth,
-                                             GLboolean fixedsamplelocations)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TextureStorage3DMultisample, "glTextureStorage3DMultisample",
-          "context = %d, texture = %u, samples = %d, internalformat = %s, width = %d, height = %d, "
-          "depth = %d, fixedsamplelocations = %s",
-          CID(context), texture, samples,
-          GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height, depth,
-          GLbooleanToString(fixedsamplelocations));
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateTextureStorage3DMultisample(context, texturePacked, samples, internalformat,
-                                                 width, height, depth, fixedsamplelocations));
-        if (isCallValid)
-        {
-            context->textureStorage3DMultisample(texturePacked, samples, internalformat, width,
-                                                 height, depth, fixedsamplelocations);
-        }
-        ANGLE_CAPTURE(TextureStorage3DMultisample, isCallValid, context, texturePacked, samples,
-                      internalformat, width, height, depth, fixedsamplelocations);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TextureSubImage1D(GLuint texture,
-                                   GLint level,
-                                   GLint xoffset,
-                                   GLsizei width,
-                                   GLenum format,
-                                   GLenum type,
-                                   const void *pixels)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TextureSubImage1D, "glTextureSubImage1D",
-          "context = %d, texture = %u, level = %d, xoffset = %d, width = %d, format = %s, type = "
-          "%s, pixels = 0x%016" PRIxPTR "",
-          CID(context), texture, level, xoffset, width,
-          GLenumToString(GLenumGroup::PixelFormat, format),
-          GLenumToString(GLenumGroup::PixelType, type), (uintptr_t)pixels);
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateTextureSubImage1D(context, texturePacked, level, xoffset, width,
-                                                      format, type, pixels));
-        if (isCallValid)
-        {
-            context->textureSubImage1D(texturePacked, level, xoffset, width, format, type, pixels);
-        }
-        ANGLE_CAPTURE(TextureSubImage1D, isCallValid, context, texturePacked, level, xoffset, width,
-                      format, type, pixels);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TextureSubImage2D(GLuint texture,
-                                   GLint level,
-                                   GLint xoffset,
-                                   GLint yoffset,
-                                   GLsizei width,
-                                   GLsizei height,
-                                   GLenum format,
-                                   GLenum type,
-                                   const void *pixels)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TextureSubImage2D, "glTextureSubImage2D",
-          "context = %d, texture = %u, level = %d, xoffset = %d, yoffset = %d, width = %d, height "
-          "= %d, format = %s, type = %s, pixels = 0x%016" PRIxPTR "",
-          CID(context), texture, level, xoffset, yoffset, width, height,
-          GLenumToString(GLenumGroup::PixelFormat, format),
-          GLenumToString(GLenumGroup::PixelType, type), (uintptr_t)pixels);
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateTextureSubImage2D(context, texturePacked, level, xoffset, yoffset, width,
-                                       height, format, type, pixels));
-        if (isCallValid)
-        {
-            context->textureSubImage2D(texturePacked, level, xoffset, yoffset, width, height,
-                                       format, type, pixels);
-        }
-        ANGLE_CAPTURE(TextureSubImage2D, isCallValid, context, texturePacked, level, xoffset,
-                      yoffset, width, height, format, type, pixels);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TextureSubImage3D(GLuint texture,
-                                   GLint level,
-                                   GLint xoffset,
-                                   GLint yoffset,
-                                   GLint zoffset,
-                                   GLsizei width,
-                                   GLsizei height,
-                                   GLsizei depth,
-                                   GLenum format,
-                                   GLenum type,
-                                   const void *pixels)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TextureSubImage3D, "glTextureSubImage3D",
-          "context = %d, texture = %u, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, width "
-          "= %d, height = %d, depth = %d, format = %s, type = %s, pixels = 0x%016" PRIxPTR "",
-          CID(context), texture, level, xoffset, yoffset, zoffset, width, height, depth,
-          GLenumToString(GLenumGroup::PixelFormat, format),
-          GLenumToString(GLenumGroup::PixelType, type), (uintptr_t)pixels);
-
-    if (context)
-    {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateTextureSubImage3D(context, texturePacked, level, xoffset, yoffset, zoffset,
-                                       width, height, depth, format, type, pixels));
-        if (isCallValid)
-        {
-            context->textureSubImage3D(texturePacked, level, xoffset, yoffset, zoffset, width,
-                                       height, depth, format, type, pixels);
-        }
-        ANGLE_CAPTURE(TextureSubImage3D, isCallValid, context, texturePacked, level, xoffset,
-                      yoffset, zoffset, width, height, depth, format, type, pixels);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TransformFeedbackBufferBase(GLuint xfb, GLuint index, GLuint buffer)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TransformFeedbackBufferBase, "glTransformFeedbackBufferBase",
-          "context = %d, xfb = %u, index = %u, buffer = %u", CID(context), xfb, index, buffer);
-
-    if (context)
-    {
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateTransformFeedbackBufferBase(context, xfb, index, bufferPacked));
-        if (isCallValid)
-        {
-            context->transformFeedbackBufferBase(xfb, index, bufferPacked);
-        }
-        ANGLE_CAPTURE(TransformFeedbackBufferBase, isCallValid, context, xfb, index, bufferPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY TransformFeedbackBufferRange(GLuint xfb,
-                                              GLuint index,
-                                              GLuint buffer,
-                                              GLintptr offset,
-                                              GLsizeiptr size)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TransformFeedbackBufferRange, "glTransformFeedbackBufferRange",
-          "context = %d, xfb = %u, index = %u, buffer = %u, offset = %llu, size = %llu",
-          CID(context), xfb, index, buffer, static_cast<unsigned long long>(offset),
-          static_cast<unsigned long long>(size));
-
-    if (context)
-    {
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateTransformFeedbackBufferRange(context, xfb, index, bufferPacked, offset, size));
-        if (isCallValid)
-        {
-            context->transformFeedbackBufferRange(xfb, index, bufferPacked, offset, size);
-        }
-        ANGLE_CAPTURE(TransformFeedbackBufferRange, isCallValid, context, xfb, index, bufferPacked,
-                      offset, size);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-GLboolean GL_APIENTRY UnmapNamedBuffer(GLuint buffer)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::UnmapNamedBuffer, "glUnmapNamedBuffer",
-          "context = %d, buffer = %u", CID(context), buffer);
-
-    GLboolean returnValue;
-    if (context)
-    {
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() || ValidateUnmapNamedBuffer(context, bufferPacked));
-        if (isCallValid)
-        {
-            returnValue = context->unmapNamedBuffer(bufferPacked);
-        }
-        else
-        {
-            returnValue = GetDefaultReturnValue<EntryPoint::UnmapNamedBuffer, GLboolean>();
-        }
-        ANGLE_CAPTURE(UnmapNamedBuffer, isCallValid, context, bufferPacked, returnValue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::UnmapNamedBuffer, GLboolean>();
-    }
-    return returnValue;
-}
-
-void GL_APIENTRY VertexArrayAttribBinding(GLuint vaobj, GLuint attribindex, GLuint bindingindex)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexArrayAttribBinding, "glVertexArrayAttribBinding",
-          "context = %d, vaobj = %u, attribindex = %u, bindingindex = %u", CID(context), vaobj,
-          attribindex, bindingindex);
-
-    if (context)
-    {
-        VertexArrayID vaobjPacked                             = FromGL<VertexArrayID>(vaobj);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateVertexArrayAttribBinding(context, vaobjPacked, attribindex, bindingindex));
-        if (isCallValid)
-        {
-            context->vertexArrayAttribBinding(vaobjPacked, attribindex, bindingindex);
-        }
-        ANGLE_CAPTURE(VertexArrayAttribBinding, isCallValid, context, vaobjPacked, attribindex,
-                      bindingindex);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexArrayAttribFormat(GLuint vaobj,
-                                         GLuint attribindex,
-                                         GLint size,
-                                         GLenum type,
-                                         GLboolean normalized,
-                                         GLuint relativeoffset)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexArrayAttribFormat, "glVertexArrayAttribFormat",
-          "context = %d, vaobj = %u, attribindex = %u, size = %d, type = %s, normalized = %s, "
-          "relativeoffset = %u",
-          CID(context), vaobj, attribindex, size,
-          GLenumToString(GLenumGroup::VertexAttribType, type), GLbooleanToString(normalized),
-          relativeoffset);
-
-    if (context)
-    {
-        VertexArrayID vaobjPacked                             = FromGL<VertexArrayID>(vaobj);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateVertexArrayAttribFormat(context, vaobjPacked, attribindex, size,
-                                                            type, normalized, relativeoffset));
-        if (isCallValid)
-        {
-            context->vertexArrayAttribFormat(vaobjPacked, attribindex, size, type, normalized,
-                                             relativeoffset);
-        }
-        ANGLE_CAPTURE(VertexArrayAttribFormat, isCallValid, context, vaobjPacked, attribindex, size,
-                      type, normalized, relativeoffset);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexArrayAttribIFormat(GLuint vaobj,
-                                          GLuint attribindex,
-                                          GLint size,
-                                          GLenum type,
-                                          GLuint relativeoffset)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexArrayAttribIFormat, "glVertexArrayAttribIFormat",
-          "context = %d, vaobj = %u, attribindex = %u, size = %d, type = %s, relativeoffset = %u",
-          CID(context), vaobj, attribindex, size,
-          GLenumToString(GLenumGroup::VertexAttribType, type), relativeoffset);
-
-    if (context)
-    {
-        VertexArrayID vaobjPacked                             = FromGL<VertexArrayID>(vaobj);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateVertexArrayAttribIFormat(context, vaobjPacked, attribindex,
-                                                             size, type, relativeoffset));
-        if (isCallValid)
-        {
-            context->vertexArrayAttribIFormat(vaobjPacked, attribindex, size, type, relativeoffset);
-        }
-        ANGLE_CAPTURE(VertexArrayAttribIFormat, isCallValid, context, vaobjPacked, attribindex,
-                      size, type, relativeoffset);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexArrayAttribLFormat(GLuint vaobj,
-                                          GLuint attribindex,
-                                          GLint size,
-                                          GLenum type,
-                                          GLuint relativeoffset)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexArrayAttribLFormat, "glVertexArrayAttribLFormat",
-          "context = %d, vaobj = %u, attribindex = %u, size = %d, type = %s, relativeoffset = %u",
-          CID(context), vaobj, attribindex, size,
-          GLenumToString(GLenumGroup::VertexAttribType, type), relativeoffset);
-
-    if (context)
-    {
-        VertexArrayID vaobjPacked                             = FromGL<VertexArrayID>(vaobj);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateVertexArrayAttribLFormat(context, vaobjPacked, attribindex,
-                                                             size, type, relativeoffset));
-        if (isCallValid)
-        {
-            context->vertexArrayAttribLFormat(vaobjPacked, attribindex, size, type, relativeoffset);
-        }
-        ANGLE_CAPTURE(VertexArrayAttribLFormat, isCallValid, context, vaobjPacked, attribindex,
-                      size, type, relativeoffset);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexArrayBindingDivisor(GLuint vaobj, GLuint bindingindex, GLuint divisor)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexArrayBindingDivisor, "glVertexArrayBindingDivisor",
-          "context = %d, vaobj = %u, bindingindex = %u, divisor = %u", CID(context), vaobj,
-          bindingindex, divisor);
-
-    if (context)
-    {
-        VertexArrayID vaobjPacked                             = FromGL<VertexArrayID>(vaobj);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateVertexArrayBindingDivisor(context, vaobjPacked, bindingindex, divisor));
-        if (isCallValid)
-        {
-            context->vertexArrayBindingDivisor(vaobjPacked, bindingindex, divisor);
-        }
-        ANGLE_CAPTURE(VertexArrayBindingDivisor, isCallValid, context, vaobjPacked, bindingindex,
-                      divisor);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexArrayElementBuffer(GLuint vaobj, GLuint buffer)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexArrayElementBuffer, "glVertexArrayElementBuffer",
-          "context = %d, vaobj = %u, buffer = %u", CID(context), vaobj, buffer);
-
-    if (context)
-    {
-        VertexArrayID vaobjPacked                             = FromGL<VertexArrayID>(vaobj);
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateVertexArrayElementBuffer(context, vaobjPacked, bufferPacked));
-        if (isCallValid)
-        {
-            context->vertexArrayElementBuffer(vaobjPacked, bufferPacked);
-        }
-        ANGLE_CAPTURE(VertexArrayElementBuffer, isCallValid, context, vaobjPacked, bufferPacked);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexArrayVertexBuffer(GLuint vaobj,
-                                         GLuint bindingindex,
-                                         GLuint buffer,
-                                         GLintptr offset,
-                                         GLsizei stride)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexArrayVertexBuffer, "glVertexArrayVertexBuffer",
-          "context = %d, vaobj = %u, bindingindex = %u, buffer = %u, offset = %llu, stride = %d",
-          CID(context), vaobj, bindingindex, buffer, static_cast<unsigned long long>(offset),
-          stride);
-
-    if (context)
-    {
-        VertexArrayID vaobjPacked                             = FromGL<VertexArrayID>(vaobj);
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateVertexArrayVertexBuffer(context, vaobjPacked, bindingindex,
-                                                            bufferPacked, offset, stride));
-        if (isCallValid)
-        {
-            context->vertexArrayVertexBuffer(vaobjPacked, bindingindex, bufferPacked, offset,
-                                             stride);
-        }
-        ANGLE_CAPTURE(VertexArrayVertexBuffer, isCallValid, context, vaobjPacked, bindingindex,
-                      bufferPacked, offset, stride);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY VertexArrayVertexBuffers(GLuint vaobj,
-                                          GLuint first,
-                                          GLsizei count,
-                                          const GLuint *buffers,
-                                          const GLintptr *offsets,
-                                          const GLsizei *strides)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexArrayVertexBuffers, "glVertexArrayVertexBuffers",
-          "context = %d, vaobj = %u, first = %u, count = %d, buffers = 0x%016" PRIxPTR
-          ", offsets = 0x%016" PRIxPTR ", strides = 0x%016" PRIxPTR "",
-          CID(context), vaobj, first, count, (uintptr_t)buffers, (uintptr_t)offsets,
-          (uintptr_t)strides);
-
-    if (context)
-    {
-        VertexArrayID vaobjPacked                             = FromGL<VertexArrayID>(vaobj);
-        const BufferID *buffersPacked                         = FromGL<const BufferID *>(buffers);
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateVertexArrayVertexBuffers(context, vaobjPacked, first, count,
-                                                             buffersPacked, offsets, strides));
-        if (isCallValid)
-        {
-            context->vertexArrayVertexBuffers(vaobjPacked, first, count, buffersPacked, offsets,
-                                              strides);
-        }
-        ANGLE_CAPTURE(VertexArrayVertexBuffers, isCallValid, context, vaobjPacked, first, count,
-                      buffersPacked, offsets, strides);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-}  // namespace gl
diff --git a/src/libGL/entry_points_gl_4_5_autogen.h b/src/libGL/entry_points_gl_4_5_autogen.h
deleted file mode 100644
index eae604d..0000000
--- a/src/libGL/entry_points_gl_4_5_autogen.h
+++ /dev/null
@@ -1,463 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// entry_points_gl_4_5_autogen.h:
-//   Defines the GL 4.5 entry points.
-
-#ifndef LIBGL_ENTRY_POINTS_GL_4_5_AUTOGEN_H_
-#define LIBGL_ENTRY_POINTS_GL_4_5_AUTOGEN_H_
-
-#include <export.h>
-#include "angle_gl.h"
-
-namespace gl
-{
-ANGLE_EXPORT void GL_APIENTRY BindTextureUnit(GLuint unit, GLuint texture);
-ANGLE_EXPORT void GL_APIENTRY BlitNamedFramebuffer(GLuint readFramebuffer,
-                                                   GLuint drawFramebuffer,
-                                                   GLint srcX0,
-                                                   GLint srcY0,
-                                                   GLint srcX1,
-                                                   GLint srcY1,
-                                                   GLint dstX0,
-                                                   GLint dstY0,
-                                                   GLint dstX1,
-                                                   GLint dstY1,
-                                                   GLbitfield mask,
-                                                   GLenum filter);
-ANGLE_EXPORT GLenum GL_APIENTRY CheckNamedFramebufferStatus(GLuint framebuffer, GLenum target);
-ANGLE_EXPORT void GL_APIENTRY ClearNamedBufferData(GLuint buffer,
-                                                   GLenum internalformat,
-                                                   GLenum format,
-                                                   GLenum type,
-                                                   const void *data);
-ANGLE_EXPORT void GL_APIENTRY ClearNamedBufferSubData(GLuint buffer,
-                                                      GLenum internalformat,
-                                                      GLintptr offset,
-                                                      GLsizeiptr size,
-                                                      GLenum format,
-                                                      GLenum type,
-                                                      const void *data);
-ANGLE_EXPORT void GL_APIENTRY ClearNamedFramebufferfi(GLuint framebuffer,
-                                                      GLenum buffer,
-                                                      GLint drawbuffer,
-                                                      GLfloat depth,
-                                                      GLint stencil);
-ANGLE_EXPORT void GL_APIENTRY ClearNamedFramebufferfv(GLuint framebuffer,
-                                                      GLenum buffer,
-                                                      GLint drawbuffer,
-                                                      const GLfloat *value);
-ANGLE_EXPORT void GL_APIENTRY ClearNamedFramebufferiv(GLuint framebuffer,
-                                                      GLenum buffer,
-                                                      GLint drawbuffer,
-                                                      const GLint *value);
-ANGLE_EXPORT void GL_APIENTRY ClearNamedFramebufferuiv(GLuint framebuffer,
-                                                       GLenum buffer,
-                                                       GLint drawbuffer,
-                                                       const GLuint *value);
-ANGLE_EXPORT void GL_APIENTRY ClipControl(GLenum origin, GLenum depth);
-ANGLE_EXPORT void GL_APIENTRY CompressedTextureSubImage1D(GLuint texture,
-                                                          GLint level,
-                                                          GLint xoffset,
-                                                          GLsizei width,
-                                                          GLenum format,
-                                                          GLsizei imageSize,
-                                                          const void *data);
-ANGLE_EXPORT void GL_APIENTRY CompressedTextureSubImage2D(GLuint texture,
-                                                          GLint level,
-                                                          GLint xoffset,
-                                                          GLint yoffset,
-                                                          GLsizei width,
-                                                          GLsizei height,
-                                                          GLenum format,
-                                                          GLsizei imageSize,
-                                                          const void *data);
-ANGLE_EXPORT void GL_APIENTRY CompressedTextureSubImage3D(GLuint texture,
-                                                          GLint level,
-                                                          GLint xoffset,
-                                                          GLint yoffset,
-                                                          GLint zoffset,
-                                                          GLsizei width,
-                                                          GLsizei height,
-                                                          GLsizei depth,
-                                                          GLenum format,
-                                                          GLsizei imageSize,
-                                                          const void *data);
-ANGLE_EXPORT void GL_APIENTRY CopyNamedBufferSubData(GLuint readBuffer,
-                                                     GLuint writeBuffer,
-                                                     GLintptr readOffset,
-                                                     GLintptr writeOffset,
-                                                     GLsizeiptr size);
-ANGLE_EXPORT void GL_APIENTRY
-CopyTextureSubImage1D(GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
-ANGLE_EXPORT void GL_APIENTRY CopyTextureSubImage2D(GLuint texture,
-                                                    GLint level,
-                                                    GLint xoffset,
-                                                    GLint yoffset,
-                                                    GLint x,
-                                                    GLint y,
-                                                    GLsizei width,
-                                                    GLsizei height);
-ANGLE_EXPORT void GL_APIENTRY CopyTextureSubImage3D(GLuint texture,
-                                                    GLint level,
-                                                    GLint xoffset,
-                                                    GLint yoffset,
-                                                    GLint zoffset,
-                                                    GLint x,
-                                                    GLint y,
-                                                    GLsizei width,
-                                                    GLsizei height);
-ANGLE_EXPORT void GL_APIENTRY CreateBuffers(GLsizei n, GLuint *buffers);
-ANGLE_EXPORT void GL_APIENTRY CreateFramebuffers(GLsizei n, GLuint *framebuffers);
-ANGLE_EXPORT void GL_APIENTRY CreateProgramPipelines(GLsizei n, GLuint *pipelines);
-ANGLE_EXPORT void GL_APIENTRY CreateQueries(GLenum target, GLsizei n, GLuint *ids);
-ANGLE_EXPORT void GL_APIENTRY CreateRenderbuffers(GLsizei n, GLuint *renderbuffers);
-ANGLE_EXPORT void GL_APIENTRY CreateSamplers(GLsizei n, GLuint *samplers);
-ANGLE_EXPORT void GL_APIENTRY CreateTextures(GLenum target, GLsizei n, GLuint *textures);
-ANGLE_EXPORT void GL_APIENTRY CreateTransformFeedbacks(GLsizei n, GLuint *ids);
-ANGLE_EXPORT void GL_APIENTRY CreateVertexArrays(GLsizei n, GLuint *arrays);
-ANGLE_EXPORT void GL_APIENTRY DisableVertexArrayAttrib(GLuint vaobj, GLuint index);
-ANGLE_EXPORT void GL_APIENTRY EnableVertexArrayAttrib(GLuint vaobj, GLuint index);
-ANGLE_EXPORT void GL_APIENTRY FlushMappedNamedBufferRange(GLuint buffer,
-                                                          GLintptr offset,
-                                                          GLsizeiptr length);
-ANGLE_EXPORT void GL_APIENTRY GenerateTextureMipmap(GLuint texture);
-ANGLE_EXPORT void GL_APIENTRY GetCompressedTextureImage(GLuint texture,
-                                                        GLint level,
-                                                        GLsizei bufSize,
-                                                        void *pixels);
-ANGLE_EXPORT void GL_APIENTRY GetCompressedTextureSubImage(GLuint texture,
-                                                           GLint level,
-                                                           GLint xoffset,
-                                                           GLint yoffset,
-                                                           GLint zoffset,
-                                                           GLsizei width,
-                                                           GLsizei height,
-                                                           GLsizei depth,
-                                                           GLsizei bufSize,
-                                                           void *pixels);
-ANGLE_EXPORT GLenum GL_APIENTRY GetGraphicsResetStatus();
-ANGLE_EXPORT void GL_APIENTRY GetNamedBufferParameteri64v(GLuint buffer,
-                                                          GLenum pname,
-                                                          GLint64 *params);
-ANGLE_EXPORT void GL_APIENTRY GetNamedBufferParameteriv(GLuint buffer, GLenum pname, GLint *params);
-ANGLE_EXPORT void GL_APIENTRY GetNamedBufferPointerv(GLuint buffer, GLenum pname, void **params);
-ANGLE_EXPORT void GL_APIENTRY GetNamedBufferSubData(GLuint buffer,
-                                                    GLintptr offset,
-                                                    GLsizeiptr size,
-                                                    void *data);
-ANGLE_EXPORT void GL_APIENTRY GetNamedFramebufferAttachmentParameteriv(GLuint framebuffer,
-                                                                       GLenum attachment,
-                                                                       GLenum pname,
-                                                                       GLint *params);
-ANGLE_EXPORT void GL_APIENTRY GetNamedFramebufferParameteriv(GLuint framebuffer,
-                                                             GLenum pname,
-                                                             GLint *param);
-ANGLE_EXPORT void GL_APIENTRY GetNamedRenderbufferParameteriv(GLuint renderbuffer,
-                                                              GLenum pname,
-                                                              GLint *params);
-ANGLE_EXPORT void GL_APIENTRY GetQueryBufferObjecti64v(GLuint id,
-                                                       GLuint buffer,
-                                                       GLenum pname,
-                                                       GLintptr offset);
-ANGLE_EXPORT void GL_APIENTRY GetQueryBufferObjectiv(GLuint id,
-                                                     GLuint buffer,
-                                                     GLenum pname,
-                                                     GLintptr offset);
-ANGLE_EXPORT void GL_APIENTRY GetQueryBufferObjectui64v(GLuint id,
-                                                        GLuint buffer,
-                                                        GLenum pname,
-                                                        GLintptr offset);
-ANGLE_EXPORT void GL_APIENTRY GetQueryBufferObjectuiv(GLuint id,
-                                                      GLuint buffer,
-                                                      GLenum pname,
-                                                      GLintptr offset);
-ANGLE_EXPORT void GL_APIENTRY GetTextureImage(GLuint texture,
-                                              GLint level,
-                                              GLenum format,
-                                              GLenum type,
-                                              GLsizei bufSize,
-                                              void *pixels);
-ANGLE_EXPORT void GL_APIENTRY GetTextureLevelParameterfv(GLuint texture,
-                                                         GLint level,
-                                                         GLenum pname,
-                                                         GLfloat *params);
-ANGLE_EXPORT void GL_APIENTRY GetTextureLevelParameteriv(GLuint texture,
-                                                         GLint level,
-                                                         GLenum pname,
-                                                         GLint *params);
-ANGLE_EXPORT void GL_APIENTRY GetTextureParameterIiv(GLuint texture, GLenum pname, GLint *params);
-ANGLE_EXPORT void GL_APIENTRY GetTextureParameterIuiv(GLuint texture, GLenum pname, GLuint *params);
-ANGLE_EXPORT void GL_APIENTRY GetTextureParameterfv(GLuint texture, GLenum pname, GLfloat *params);
-ANGLE_EXPORT void GL_APIENTRY GetTextureParameteriv(GLuint texture, GLenum pname, GLint *params);
-ANGLE_EXPORT void GL_APIENTRY GetTextureSubImage(GLuint texture,
-                                                 GLint level,
-                                                 GLint xoffset,
-                                                 GLint yoffset,
-                                                 GLint zoffset,
-                                                 GLsizei width,
-                                                 GLsizei height,
-                                                 GLsizei depth,
-                                                 GLenum format,
-                                                 GLenum type,
-                                                 GLsizei bufSize,
-                                                 void *pixels);
-ANGLE_EXPORT void GL_APIENTRY GetTransformFeedbacki64_v(GLuint xfb,
-                                                        GLenum pname,
-                                                        GLuint index,
-                                                        GLint64 *param);
-ANGLE_EXPORT void GL_APIENTRY GetTransformFeedbacki_v(GLuint xfb,
-                                                      GLenum pname,
-                                                      GLuint index,
-                                                      GLint *param);
-ANGLE_EXPORT void GL_APIENTRY GetTransformFeedbackiv(GLuint xfb, GLenum pname, GLint *param);
-ANGLE_EXPORT void GL_APIENTRY GetVertexArrayIndexed64iv(GLuint vaobj,
-                                                        GLuint index,
-                                                        GLenum pname,
-                                                        GLint64 *param);
-ANGLE_EXPORT void GL_APIENTRY GetVertexArrayIndexediv(GLuint vaobj,
-                                                      GLuint index,
-                                                      GLenum pname,
-                                                      GLint *param);
-ANGLE_EXPORT void GL_APIENTRY GetVertexArrayiv(GLuint vaobj, GLenum pname, GLint *param);
-ANGLE_EXPORT void GL_APIENTRY
-GetnColorTable(GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table);
-ANGLE_EXPORT void GL_APIENTRY GetnCompressedTexImage(GLenum target,
-                                                     GLint lod,
-                                                     GLsizei bufSize,
-                                                     void *pixels);
-ANGLE_EXPORT void GL_APIENTRY
-GetnConvolutionFilter(GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image);
-ANGLE_EXPORT void GL_APIENTRY GetnHistogram(GLenum target,
-                                            GLboolean reset,
-                                            GLenum format,
-                                            GLenum type,
-                                            GLsizei bufSize,
-                                            void *values);
-ANGLE_EXPORT void GL_APIENTRY GetnMapdv(GLenum target, GLenum query, GLsizei bufSize, GLdouble *v);
-ANGLE_EXPORT void GL_APIENTRY GetnMapfv(GLenum target, GLenum query, GLsizei bufSize, GLfloat *v);
-ANGLE_EXPORT void GL_APIENTRY GetnMapiv(GLenum target, GLenum query, GLsizei bufSize, GLint *v);
-ANGLE_EXPORT void GL_APIENTRY GetnMinmax(GLenum target,
-                                         GLboolean reset,
-                                         GLenum format,
-                                         GLenum type,
-                                         GLsizei bufSize,
-                                         void *values);
-ANGLE_EXPORT void GL_APIENTRY GetnPixelMapfv(GLenum map, GLsizei bufSize, GLfloat *values);
-ANGLE_EXPORT void GL_APIENTRY GetnPixelMapuiv(GLenum map, GLsizei bufSize, GLuint *values);
-ANGLE_EXPORT void GL_APIENTRY GetnPixelMapusv(GLenum map, GLsizei bufSize, GLushort *values);
-ANGLE_EXPORT void GL_APIENTRY GetnPolygonStipple(GLsizei bufSize, GLubyte *pattern);
-ANGLE_EXPORT void GL_APIENTRY GetnSeparableFilter(GLenum target,
-                                                  GLenum format,
-                                                  GLenum type,
-                                                  GLsizei rowBufSize,
-                                                  void *row,
-                                                  GLsizei columnBufSize,
-                                                  void *column,
-                                                  void *span);
-ANGLE_EXPORT void GL_APIENTRY
-GetnTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels);
-ANGLE_EXPORT void GL_APIENTRY GetnUniformdv(GLuint program,
-                                            GLint location,
-                                            GLsizei bufSize,
-                                            GLdouble *params);
-ANGLE_EXPORT void GL_APIENTRY GetnUniformfv(GLuint program,
-                                            GLint location,
-                                            GLsizei bufSize,
-                                            GLfloat *params);
-ANGLE_EXPORT void GL_APIENTRY GetnUniformiv(GLuint program,
-                                            GLint location,
-                                            GLsizei bufSize,
-                                            GLint *params);
-ANGLE_EXPORT void GL_APIENTRY GetnUniformuiv(GLuint program,
-                                             GLint location,
-                                             GLsizei bufSize,
-                                             GLuint *params);
-ANGLE_EXPORT void GL_APIENTRY InvalidateNamedFramebufferData(GLuint framebuffer,
-                                                             GLsizei numAttachments,
-                                                             const GLenum *attachments);
-ANGLE_EXPORT void GL_APIENTRY InvalidateNamedFramebufferSubData(GLuint framebuffer,
-                                                                GLsizei numAttachments,
-                                                                const GLenum *attachments,
-                                                                GLint x,
-                                                                GLint y,
-                                                                GLsizei width,
-                                                                GLsizei height);
-ANGLE_EXPORT void *GL_APIENTRY MapNamedBuffer(GLuint buffer, GLenum access);
-ANGLE_EXPORT void *GL_APIENTRY MapNamedBufferRange(GLuint buffer,
-                                                   GLintptr offset,
-                                                   GLsizeiptr length,
-                                                   GLbitfield access);
-ANGLE_EXPORT void GL_APIENTRY MemoryBarrierByRegion(GLbitfield barriers);
-ANGLE_EXPORT void GL_APIENTRY NamedBufferData(GLuint buffer,
-                                              GLsizeiptr size,
-                                              const void *data,
-                                              GLenum usage);
-ANGLE_EXPORT void GL_APIENTRY NamedBufferStorage(GLuint buffer,
-                                                 GLsizeiptr size,
-                                                 const void *data,
-                                                 GLbitfield flags);
-ANGLE_EXPORT void GL_APIENTRY NamedBufferSubData(GLuint buffer,
-                                                 GLintptr offset,
-                                                 GLsizeiptr size,
-                                                 const void *data);
-ANGLE_EXPORT void GL_APIENTRY NamedFramebufferDrawBuffer(GLuint framebuffer, GLenum buf);
-ANGLE_EXPORT void GL_APIENTRY NamedFramebufferDrawBuffers(GLuint framebuffer,
-                                                          GLsizei n,
-                                                          const GLenum *bufs);
-ANGLE_EXPORT void GL_APIENTRY NamedFramebufferParameteri(GLuint framebuffer,
-                                                         GLenum pname,
-                                                         GLint param);
-ANGLE_EXPORT void GL_APIENTRY NamedFramebufferReadBuffer(GLuint framebuffer, GLenum src);
-ANGLE_EXPORT void GL_APIENTRY NamedFramebufferRenderbuffer(GLuint framebuffer,
-                                                           GLenum attachment,
-                                                           GLenum renderbuffertarget,
-                                                           GLuint renderbuffer);
-ANGLE_EXPORT void GL_APIENTRY NamedFramebufferTexture(GLuint framebuffer,
-                                                      GLenum attachment,
-                                                      GLuint texture,
-                                                      GLint level);
-ANGLE_EXPORT void GL_APIENTRY NamedFramebufferTextureLayer(GLuint framebuffer,
-                                                           GLenum attachment,
-                                                           GLuint texture,
-                                                           GLint level,
-                                                           GLint layer);
-ANGLE_EXPORT void GL_APIENTRY NamedRenderbufferStorage(GLuint renderbuffer,
-                                                       GLenum internalformat,
-                                                       GLsizei width,
-                                                       GLsizei height);
-ANGLE_EXPORT void GL_APIENTRY NamedRenderbufferStorageMultisample(GLuint renderbuffer,
-                                                                  GLsizei samples,
-                                                                  GLenum internalformat,
-                                                                  GLsizei width,
-                                                                  GLsizei height);
-ANGLE_EXPORT void GL_APIENTRY ReadnPixels(GLint x,
-                                          GLint y,
-                                          GLsizei width,
-                                          GLsizei height,
-                                          GLenum format,
-                                          GLenum type,
-                                          GLsizei bufSize,
-                                          void *data);
-ANGLE_EXPORT void GL_APIENTRY TextureBarrier();
-ANGLE_EXPORT void GL_APIENTRY TextureBuffer(GLuint texture, GLenum internalformat, GLuint buffer);
-ANGLE_EXPORT void GL_APIENTRY TextureBufferRange(GLuint texture,
-                                                 GLenum internalformat,
-                                                 GLuint buffer,
-                                                 GLintptr offset,
-                                                 GLsizeiptr size);
-ANGLE_EXPORT void GL_APIENTRY TextureParameterIiv(GLuint texture,
-                                                  GLenum pname,
-                                                  const GLint *params);
-ANGLE_EXPORT void GL_APIENTRY TextureParameterIuiv(GLuint texture,
-                                                   GLenum pname,
-                                                   const GLuint *params);
-ANGLE_EXPORT void GL_APIENTRY TextureParameterf(GLuint texture, GLenum pname, GLfloat param);
-ANGLE_EXPORT void GL_APIENTRY TextureParameterfv(GLuint texture,
-                                                 GLenum pname,
-                                                 const GLfloat *param);
-ANGLE_EXPORT void GL_APIENTRY TextureParameteri(GLuint texture, GLenum pname, GLint param);
-ANGLE_EXPORT void GL_APIENTRY TextureParameteriv(GLuint texture, GLenum pname, const GLint *param);
-ANGLE_EXPORT void GL_APIENTRY TextureStorage1D(GLuint texture,
-                                               GLsizei levels,
-                                               GLenum internalformat,
-                                               GLsizei width);
-ANGLE_EXPORT void GL_APIENTRY TextureStorage2D(GLuint texture,
-                                               GLsizei levels,
-                                               GLenum internalformat,
-                                               GLsizei width,
-                                               GLsizei height);
-ANGLE_EXPORT void GL_APIENTRY TextureStorage2DMultisample(GLuint texture,
-                                                          GLsizei samples,
-                                                          GLenum internalformat,
-                                                          GLsizei width,
-                                                          GLsizei height,
-                                                          GLboolean fixedsamplelocations);
-ANGLE_EXPORT void GL_APIENTRY TextureStorage3D(GLuint texture,
-                                               GLsizei levels,
-                                               GLenum internalformat,
-                                               GLsizei width,
-                                               GLsizei height,
-                                               GLsizei depth);
-ANGLE_EXPORT void GL_APIENTRY TextureStorage3DMultisample(GLuint texture,
-                                                          GLsizei samples,
-                                                          GLenum internalformat,
-                                                          GLsizei width,
-                                                          GLsizei height,
-                                                          GLsizei depth,
-                                                          GLboolean fixedsamplelocations);
-ANGLE_EXPORT void GL_APIENTRY TextureSubImage1D(GLuint texture,
-                                                GLint level,
-                                                GLint xoffset,
-                                                GLsizei width,
-                                                GLenum format,
-                                                GLenum type,
-                                                const void *pixels);
-ANGLE_EXPORT void GL_APIENTRY TextureSubImage2D(GLuint texture,
-                                                GLint level,
-                                                GLint xoffset,
-                                                GLint yoffset,
-                                                GLsizei width,
-                                                GLsizei height,
-                                                GLenum format,
-                                                GLenum type,
-                                                const void *pixels);
-ANGLE_EXPORT void GL_APIENTRY TextureSubImage3D(GLuint texture,
-                                                GLint level,
-                                                GLint xoffset,
-                                                GLint yoffset,
-                                                GLint zoffset,
-                                                GLsizei width,
-                                                GLsizei height,
-                                                GLsizei depth,
-                                                GLenum format,
-                                                GLenum type,
-                                                const void *pixels);
-ANGLE_EXPORT void GL_APIENTRY TransformFeedbackBufferBase(GLuint xfb, GLuint index, GLuint buffer);
-ANGLE_EXPORT void GL_APIENTRY TransformFeedbackBufferRange(GLuint xfb,
-                                                           GLuint index,
-                                                           GLuint buffer,
-                                                           GLintptr offset,
-                                                           GLsizeiptr size);
-ANGLE_EXPORT GLboolean GL_APIENTRY UnmapNamedBuffer(GLuint buffer);
-ANGLE_EXPORT void GL_APIENTRY VertexArrayAttribBinding(GLuint vaobj,
-                                                       GLuint attribindex,
-                                                       GLuint bindingindex);
-ANGLE_EXPORT void GL_APIENTRY VertexArrayAttribFormat(GLuint vaobj,
-                                                      GLuint attribindex,
-                                                      GLint size,
-                                                      GLenum type,
-                                                      GLboolean normalized,
-                                                      GLuint relativeoffset);
-ANGLE_EXPORT void GL_APIENTRY VertexArrayAttribIFormat(GLuint vaobj,
-                                                       GLuint attribindex,
-                                                       GLint size,
-                                                       GLenum type,
-                                                       GLuint relativeoffset);
-ANGLE_EXPORT void GL_APIENTRY VertexArrayAttribLFormat(GLuint vaobj,
-                                                       GLuint attribindex,
-                                                       GLint size,
-                                                       GLenum type,
-                                                       GLuint relativeoffset);
-ANGLE_EXPORT void GL_APIENTRY VertexArrayBindingDivisor(GLuint vaobj,
-                                                        GLuint bindingindex,
-                                                        GLuint divisor);
-ANGLE_EXPORT void GL_APIENTRY VertexArrayElementBuffer(GLuint vaobj, GLuint buffer);
-ANGLE_EXPORT void GL_APIENTRY VertexArrayVertexBuffer(GLuint vaobj,
-                                                      GLuint bindingindex,
-                                                      GLuint buffer,
-                                                      GLintptr offset,
-                                                      GLsizei stride);
-ANGLE_EXPORT void GL_APIENTRY VertexArrayVertexBuffers(GLuint vaobj,
-                                                       GLuint first,
-                                                       GLsizei count,
-                                                       const GLuint *buffers,
-                                                       const GLintptr *offsets,
-                                                       const GLsizei *strides);
-}  // namespace gl
-
-#endif  // LIBGL_ENTRY_POINTS_GL_4_5_AUTOGEN_H_
diff --git a/src/libGL/entry_points_gl_4_6_autogen.cpp b/src/libGL/entry_points_gl_4_6_autogen.cpp
deleted file mode 100644
index 042d08c..0000000
--- a/src/libGL/entry_points_gl_4_6_autogen.cpp
+++ /dev/null
@@ -1,155 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// entry_points_gl_4_6_autogen.cpp:
-//   Defines the GL 4.6 entry points.
-
-#include "libGL/entry_points_gl_4_6_autogen.h"
-
-#include "libANGLE/Context.h"
-#include "libANGLE/Context.inl.h"
-#include "libANGLE/entry_points_utils.h"
-#include "libANGLE/gl_enum_utils.h"
-#include "libANGLE/validationEGL.h"
-#include "libANGLE/validationES.h"
-#include "libANGLE/validationES1.h"
-#include "libANGLE/validationES2.h"
-#include "libANGLE/validationES3.h"
-#include "libANGLE/validationES31.h"
-#include "libANGLE/validationES32.h"
-#include "libANGLE/validationESEXT.h"
-#include "libANGLE/validationGL46_autogen.h"
-#include "libGLESv2/global_state.h"
-
-namespace gl
-{
-void GL_APIENTRY MultiDrawArraysIndirectCount(GLenum mode,
-                                              const void *indirect,
-                                              GLintptr drawcount,
-                                              GLsizei maxdrawcount,
-                                              GLsizei stride)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiDrawArraysIndirectCount, "glMultiDrawArraysIndirectCount",
-          "context = %d, mode = %s, indirect = 0x%016" PRIxPTR
-          ", drawcount = %llu, maxdrawcount = %d, stride = %d",
-          CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), (uintptr_t)indirect,
-          static_cast<unsigned long long>(drawcount), maxdrawcount, stride);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateMultiDrawArraysIndirectCount(context, mode, indirect, drawcount,
-                                                                 maxdrawcount, stride));
-        if (isCallValid)
-        {
-            context->multiDrawArraysIndirectCount(mode, indirect, drawcount, maxdrawcount, stride);
-        }
-        ANGLE_CAPTURE(MultiDrawArraysIndirectCount, isCallValid, context, mode, indirect, drawcount,
-                      maxdrawcount, stride);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY MultiDrawElementsIndirectCount(GLenum mode,
-                                                GLenum type,
-                                                const void *indirect,
-                                                GLintptr drawcount,
-                                                GLsizei maxdrawcount,
-                                                GLsizei stride)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiDrawElementsIndirectCount,
-          "glMultiDrawElementsIndirectCount",
-          "context = %d, mode = %s, type = %s, indirect = 0x%016" PRIxPTR
-          ", drawcount = %llu, maxdrawcount = %d, stride = %d",
-          CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode),
-          GLenumToString(GLenumGroup::DefaultGroup, type), (uintptr_t)indirect,
-          static_cast<unsigned long long>(drawcount), maxdrawcount, stride);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidateMultiDrawElementsIndirectCount(
-                                context, mode, type, indirect, drawcount, maxdrawcount, stride));
-        if (isCallValid)
-        {
-            context->multiDrawElementsIndirectCount(mode, type, indirect, drawcount, maxdrawcount,
-                                                    stride);
-        }
-        ANGLE_CAPTURE(MultiDrawElementsIndirectCount, isCallValid, context, mode, type, indirect,
-                      drawcount, maxdrawcount, stride);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY PolygonOffsetClamp(GLfloat factor, GLfloat units, GLfloat clamp)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PolygonOffsetClamp, "glPolygonOffsetClamp",
-          "context = %d, factor = %f, units = %f, clamp = %f", CID(context), factor, units, clamp);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid                                      = (context->skipValidation() ||
-                            ValidatePolygonOffsetClamp(context, factor, units, clamp));
-        if (isCallValid)
-        {
-            context->polygonOffsetClamp(factor, units, clamp);
-        }
-        ANGLE_CAPTURE(PolygonOffsetClamp, isCallValid, context, factor, units, clamp);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-
-void GL_APIENTRY SpecializeShader(GLuint shader,
-                                  const GLchar *pEntryPoint,
-                                  GLuint numSpecializationConstants,
-                                  const GLuint *pConstantIndex,
-                                  const GLuint *pConstantValue)
-{
-    Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SpecializeShader, "glSpecializeShader",
-          "context = %d, shader = %u, pEntryPoint = 0x%016" PRIxPTR
-          ", numSpecializationConstants = %u, pConstantIndex = 0x%016" PRIxPTR
-          ", pConstantValue = 0x%016" PRIxPTR "",
-          CID(context), shader, (uintptr_t)pEntryPoint, numSpecializationConstants,
-          (uintptr_t)pConstantIndex, (uintptr_t)pConstantValue);
-
-    if (context)
-    {
-        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
-        bool isCallValid =
-            (context->skipValidation() ||
-             ValidateSpecializeShader(context, shader, pEntryPoint, numSpecializationConstants,
-                                      pConstantIndex, pConstantValue));
-        if (isCallValid)
-        {
-            context->specializeShader(shader, pEntryPoint, numSpecializationConstants,
-                                      pConstantIndex, pConstantValue);
-        }
-        ANGLE_CAPTURE(SpecializeShader, isCallValid, context, shader, pEntryPoint,
-                      numSpecializationConstants, pConstantIndex, pConstantValue);
-    }
-    else
-    {
-        GenerateContextLostErrorOnCurrentGlobalContext();
-    }
-}
-}  // namespace gl
diff --git a/src/libGL/entry_points_gl_4_6_autogen.h b/src/libGL/entry_points_gl_4_6_autogen.h
deleted file mode 100644
index 209c851..0000000
--- a/src/libGL/entry_points_gl_4_6_autogen.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// entry_points_gl_4_6_autogen.h:
-//   Defines the GL 4.6 entry points.
-
-#ifndef LIBGL_ENTRY_POINTS_GL_4_6_AUTOGEN_H_
-#define LIBGL_ENTRY_POINTS_GL_4_6_AUTOGEN_H_
-
-#include <export.h>
-#include "angle_gl.h"
-
-namespace gl
-{
-ANGLE_EXPORT void GL_APIENTRY MultiDrawArraysIndirectCount(GLenum mode,
-                                                           const void *indirect,
-                                                           GLintptr drawcount,
-                                                           GLsizei maxdrawcount,
-                                                           GLsizei stride);
-ANGLE_EXPORT void GL_APIENTRY MultiDrawElementsIndirectCount(GLenum mode,
-                                                             GLenum type,
-                                                             const void *indirect,
-                                                             GLintptr drawcount,
-                                                             GLsizei maxdrawcount,
-                                                             GLsizei stride);
-ANGLE_EXPORT void GL_APIENTRY PolygonOffsetClamp(GLfloat factor, GLfloat units, GLfloat clamp);
-ANGLE_EXPORT void GL_APIENTRY SpecializeShader(GLuint shader,
-                                               const GLchar *pEntryPoint,
-                                               GLuint numSpecializationConstants,
-                                               const GLuint *pConstantIndex,
-                                               const GLuint *pConstantValue);
-}  // namespace gl
-
-#endif  // LIBGL_ENTRY_POINTS_GL_4_6_AUTOGEN_H_
diff --git a/src/libGL/entry_points_gl_4_autogen.cpp b/src/libGL/entry_points_gl_4_autogen.cpp
new file mode 100644
index 0000000..a45d956
--- /dev/null
+++ b/src/libGL/entry_points_gl_4_autogen.cpp
@@ -0,0 +1,9448 @@
+// GENERATED FILE - DO NOT EDIT.
+// Generated by generate_entry_points.py using data from gl.xml.
+//
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// entry_points_gl_4_autogen.cpp:
+//   Defines the Desktop GL 4.x entry points.
+
+#include "libGL/entry_points_gl_4_autogen.h"
+
+#include "libANGLE/Context.h"
+#include "libANGLE/Context.inl.h"
+#include "libANGLE/entry_points_utils.h"
+#include "libANGLE/gl_enum_utils.h"
+#include "libANGLE/validationEGL.h"
+#include "libANGLE/validationES.h"
+#include "libANGLE/validationES1.h"
+#include "libANGLE/validationES2.h"
+#include "libANGLE/validationES3.h"
+#include "libANGLE/validationES31.h"
+#include "libANGLE/validationES32.h"
+#include "libANGLE/validationESEXT.h"
+#include "libANGLE/validationGL4_autogen.h"
+#include "libGLESv2/global_state.h"
+
+namespace gl
+{
+
+// GL 4.0
+void GL_APIENTRY BeginQueryIndexed(GLenum target, GLuint index, GLuint id)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLBeginQueryIndexed, "context = %d, target = %s, index = %u, id = %u",
+          CID(context), GLenumToString(GLenumGroup::QueryTarget, target), index, id);
+
+    if (context)
+    {
+        QueryID idPacked                                      = PackParam<QueryID>(id);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateBeginQueryIndexed(context, target, index, idPacked));
+        if (isCallValid)
+        {
+            context->beginQueryIndexed(target, index, idPacked);
+        }
+        ANGLE_CAPTURE(BeginQueryIndexed, isCallValid, context, target, index, idPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY BindTransformFeedback(GLenum target, GLuint id)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLBindTransformFeedback, "context = %d, target = %s, id = %u", CID(context),
+          GLenumToString(GLenumGroup::BindTransformFeedbackTarget, target), id);
+
+    if (context)
+    {
+        TransformFeedbackID idPacked                          = PackParam<TransformFeedbackID>(id);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateBindTransformFeedback(context, target, idPacked));
+        if (isCallValid)
+        {
+            context->bindTransformFeedback(target, idPacked);
+        }
+        ANGLE_CAPTURE(BindTransformFeedback, isCallValid, context, target, idPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY BlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLBlendEquationSeparatei, "context = %d, buf = %u, modeRGB = %s, modeAlpha = %s",
+          CID(context), buf, GLenumToString(GLenumGroup::BlendEquationModeEXT, modeRGB),
+          GLenumToString(GLenumGroup::BlendEquationModeEXT, modeAlpha));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateBlendEquationSeparatei(context, buf, modeRGB, modeAlpha));
+        if (isCallValid)
+        {
+            context->blendEquationSeparatei(buf, modeRGB, modeAlpha);
+        }
+        ANGLE_CAPTURE(BlendEquationSeparatei, isCallValid, context, buf, modeRGB, modeAlpha);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY BlendEquationi(GLuint buf, GLenum mode)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLBlendEquationi, "context = %d, buf = %u, mode = %s", CID(context), buf,
+          GLenumToString(GLenumGroup::BlendEquationModeEXT, mode));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateBlendEquationi(context, buf, mode));
+        if (isCallValid)
+        {
+            context->blendEquationi(buf, mode);
+        }
+        ANGLE_CAPTURE(BlendEquationi, isCallValid, context, buf, mode);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY
+BlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLBlendFuncSeparatei,
+          "context = %d, buf = %u, srcRGB = %s, dstRGB = %s, srcAlpha = %s, dstAlpha = %s",
+          CID(context), buf, GLenumToString(GLenumGroup::BlendingFactor, srcRGB),
+          GLenumToString(GLenumGroup::BlendingFactor, dstRGB),
+          GLenumToString(GLenumGroup::BlendingFactor, srcAlpha),
+          GLenumToString(GLenumGroup::BlendingFactor, dstAlpha));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateBlendFuncSeparatei(context, buf, srcRGB, dstRGB, srcAlpha, dstAlpha));
+        if (isCallValid)
+        {
+            context->blendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
+        }
+        ANGLE_CAPTURE(BlendFuncSeparatei, isCallValid, context, buf, srcRGB, dstRGB, srcAlpha,
+                      dstAlpha);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY BlendFunci(GLuint buf, GLenum src, GLenum dst)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLBlendFunci, "context = %d, buf = %u, src = %s, dst = %s", CID(context), buf,
+          GLenumToString(GLenumGroup::BlendingFactor, src),
+          GLenumToString(GLenumGroup::BlendingFactor, dst));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateBlendFunci(context, buf, src, dst));
+        if (isCallValid)
+        {
+            context->blendFunci(buf, src, dst);
+        }
+        ANGLE_CAPTURE(BlendFunci, isCallValid, context, buf, src, dst);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DeleteTransformFeedbacks(GLsizei n, const GLuint *ids)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDeleteTransformFeedbacks, "context = %d, n = %d, ids = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)ids);
+
+    if (context)
+    {
+        const TransformFeedbackID *idsPacked = PackParam<const TransformFeedbackID *>(ids);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateDeleteTransformFeedbacks(context, n, idsPacked));
+        if (isCallValid)
+        {
+            context->deleteTransformFeedbacks(n, idsPacked);
+        }
+        ANGLE_CAPTURE(DeleteTransformFeedbacks, isCallValid, context, n, idsPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DrawArraysIndirect(GLenum mode, const void *indirect)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDrawArraysIndirect, "context = %d, mode = %s, indirect = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), (uintptr_t)indirect);
+
+    if (context)
+    {
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateDrawArraysIndirect(context, modePacked, indirect));
+        if (isCallValid)
+        {
+            context->drawArraysIndirect(modePacked, indirect);
+        }
+        ANGLE_CAPTURE(DrawArraysIndirect, isCallValid, context, modePacked, indirect);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DrawElementsIndirect(GLenum mode, GLenum type, const void *indirect)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDrawElementsIndirect,
+          "context = %d, mode = %s, type = %s, indirect = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::PrimitiveType, mode),
+          GLenumToString(GLenumGroup::DrawElementsType, type), (uintptr_t)indirect);
+
+    if (context)
+    {
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateDrawElementsIndirect(context, modePacked, typePacked, indirect));
+        if (isCallValid)
+        {
+            context->drawElementsIndirect(modePacked, typePacked, indirect);
+        }
+        ANGLE_CAPTURE(DrawElementsIndirect, isCallValid, context, modePacked, typePacked, indirect);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DrawTransformFeedback(GLenum mode, GLuint id)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDrawTransformFeedback, "context = %d, mode = %s, id = %u", CID(context),
+          GLenumToString(GLenumGroup::PrimitiveType, mode), id);
+
+    if (context)
+    {
+        TransformFeedbackID idPacked                          = PackParam<TransformFeedbackID>(id);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateDrawTransformFeedback(context, mode, idPacked));
+        if (isCallValid)
+        {
+            context->drawTransformFeedback(mode, idPacked);
+        }
+        ANGLE_CAPTURE(DrawTransformFeedback, isCallValid, context, mode, idPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDrawTransformFeedbackStream, "context = %d, mode = %s, id = %u, stream = %u",
+          CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), id, stream);
+
+    if (context)
+    {
+        TransformFeedbackID idPacked                          = PackParam<TransformFeedbackID>(id);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateDrawTransformFeedbackStream(context, mode, idPacked, stream));
+        if (isCallValid)
+        {
+            context->drawTransformFeedbackStream(mode, idPacked, stream);
+        }
+        ANGLE_CAPTURE(DrawTransformFeedbackStream, isCallValid, context, mode, idPacked, stream);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY EndQueryIndexed(GLenum target, GLuint index)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLEndQueryIndexed, "context = %d, target = %s, index = %u", CID(context),
+          GLenumToString(GLenumGroup::QueryTarget, target), index);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateEndQueryIndexed(context, target, index));
+        if (isCallValid)
+        {
+            context->endQueryIndexed(target, index);
+        }
+        ANGLE_CAPTURE(EndQueryIndexed, isCallValid, context, target, index);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GenTransformFeedbacks(GLsizei n, GLuint *ids)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGenTransformFeedbacks, "context = %d, n = %d, ids = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)ids);
+
+    if (context)
+    {
+        TransformFeedbackID *idsPacked = PackParam<TransformFeedbackID *>(ids);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGenTransformFeedbacks(context, n, idsPacked));
+        if (isCallValid)
+        {
+            context->genTransformFeedbacks(n, idsPacked);
+        }
+        ANGLE_CAPTURE(GenTransformFeedbacks, isCallValid, context, n, idsPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetActiveSubroutineName(GLuint program,
+                                         GLenum shadertype,
+                                         GLuint index,
+                                         GLsizei bufsize,
+                                         GLsizei *length,
+                                         GLchar *name)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetActiveSubroutineName,
+          "context = %d, program = %u, shadertype = %s, index = %u, bufsize = %d, length = "
+          "0x%016" PRIxPTR ", name = 0x%016" PRIxPTR "",
+          CID(context), program, GLenumToString(GLenumGroup::ShaderType, shadertype), index,
+          bufsize, (uintptr_t)length, (uintptr_t)name);
+
+    if (context)
+    {
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetActiveSubroutineName(context, programPacked, shadertype,
+                                                            index, bufsize, length, name));
+        if (isCallValid)
+        {
+            context->getActiveSubroutineName(programPacked, shadertype, index, bufsize, length,
+                                             name);
+        }
+        ANGLE_CAPTURE(GetActiveSubroutineName, isCallValid, context, programPacked, shadertype,
+                      index, bufsize, length, name);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetActiveSubroutineUniformName(GLuint program,
+                                                GLenum shadertype,
+                                                GLuint index,
+                                                GLsizei bufsize,
+                                                GLsizei *length,
+                                                GLchar *name)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetActiveSubroutineUniformName,
+          "context = %d, program = %u, shadertype = %s, index = %u, bufsize = %d, length = "
+          "0x%016" PRIxPTR ", name = 0x%016" PRIxPTR "",
+          CID(context), program, GLenumToString(GLenumGroup::ShaderType, shadertype), index,
+          bufsize, (uintptr_t)length, (uintptr_t)name);
+
+    if (context)
+    {
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetActiveSubroutineUniformName(
+                                context, programPacked, shadertype, index, bufsize, length, name));
+        if (isCallValid)
+        {
+            context->getActiveSubroutineUniformName(programPacked, shadertype, index, bufsize,
+                                                    length, name);
+        }
+        ANGLE_CAPTURE(GetActiveSubroutineUniformName, isCallValid, context, programPacked,
+                      shadertype, index, bufsize, length, name);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetActiveSubroutineUniformiv(GLuint program,
+                                              GLenum shadertype,
+                                              GLuint index,
+                                              GLenum pname,
+                                              GLint *values)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetActiveSubroutineUniformiv,
+          "context = %d, program = %u, shadertype = %s, index = %u, pname = %s, values = "
+          "0x%016" PRIxPTR "",
+          CID(context), program, GLenumToString(GLenumGroup::ShaderType, shadertype), index,
+          GLenumToString(GLenumGroup::SubroutineParameterName, pname), (uintptr_t)values);
+
+    if (context)
+    {
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetActiveSubroutineUniformiv(context, programPacked, shadertype,
+                                                                 index, pname, values));
+        if (isCallValid)
+        {
+            context->getActiveSubroutineUniformiv(programPacked, shadertype, index, pname, values);
+        }
+        ANGLE_CAPTURE(GetActiveSubroutineUniformiv, isCallValid, context, programPacked, shadertype,
+                      index, pname, values);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetProgramStageiv,
+          "context = %d, program = %u, shadertype = %s, pname = %s, values = 0x%016" PRIxPTR "",
+          CID(context), program, GLenumToString(GLenumGroup::ShaderType, shadertype),
+          GLenumToString(GLenumGroup::ProgramStagePName, pname), (uintptr_t)values);
+
+    if (context)
+    {
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetProgramStageiv(context, programPacked, shadertype, pname, values));
+        if (isCallValid)
+        {
+            context->getProgramStageiv(programPacked, shadertype, pname, values);
+        }
+        ANGLE_CAPTURE(GetProgramStageiv, isCallValid, context, programPacked, shadertype, pname,
+                      values);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetQueryIndexediv,
+          "context = %d, target = %s, index = %u, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::DefaultGroup, target), index,
+          GLenumToString(GLenumGroup::QueryParameterName, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetQueryIndexediv(context, target, index, pname, params));
+        if (isCallValid)
+        {
+            context->getQueryIndexediv(target, index, pname, params);
+        }
+        ANGLE_CAPTURE(GetQueryIndexediv, isCallValid, context, target, index, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+GLuint GL_APIENTRY GetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetSubroutineIndex,
+          "context = %d, program = %u, shadertype = %s, name = 0x%016" PRIxPTR "", CID(context),
+          program, GLenumToString(GLenumGroup::ShaderType, shadertype), (uintptr_t)name);
+
+    GLuint returnValue;
+    if (context)
+    {
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetSubroutineIndex(context, programPacked, shadertype, name));
+        if (isCallValid)
+        {
+            returnValue = context->getSubroutineIndex(programPacked, shadertype, name);
+        }
+        else
+        {
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetSubroutineIndex, GLuint>();
+        }
+        ANGLE_CAPTURE(GetSubroutineIndex, isCallValid, context, programPacked, shadertype, name,
+                      returnValue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetSubroutineIndex, GLuint>();
+    }
+    return returnValue;
+}
+
+GLint GL_APIENTRY GetSubroutineUniformLocation(GLuint program,
+                                               GLenum shadertype,
+                                               const GLchar *name)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetSubroutineUniformLocation,
+          "context = %d, program = %u, shadertype = %s, name = 0x%016" PRIxPTR "", CID(context),
+          program, GLenumToString(GLenumGroup::ShaderType, shadertype), (uintptr_t)name);
+
+    GLint returnValue;
+    if (context)
+    {
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetSubroutineUniformLocation(context, programPacked, shadertype, name));
+        if (isCallValid)
+        {
+            returnValue = context->getSubroutineUniformLocation(programPacked, shadertype, name);
+        }
+        else
+        {
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLGetSubroutineUniformLocation, GLint>();
+        }
+        ANGLE_CAPTURE(GetSubroutineUniformLocation, isCallValid, context, programPacked, shadertype,
+                      name, returnValue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+        returnValue =
+            GetDefaultReturnValue<angle::EntryPoint::GLGetSubroutineUniformLocation, GLint>();
+    }
+    return returnValue;
+}
+
+void GL_APIENTRY GetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetUniformSubroutineuiv,
+          "context = %d, shadertype = %s, location = %d, params = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::ShaderType, shadertype), location, (uintptr_t)params);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetUniformSubroutineuiv(context, shadertype, location, params));
+        if (isCallValid)
+        {
+            context->getUniformSubroutineuiv(shadertype, location, params);
+        }
+        ANGLE_CAPTURE(GetUniformSubroutineuiv, isCallValid, context, shadertype, location, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetUniformdv(GLuint program, GLint location, GLdouble *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetUniformdv,
+          "context = %d, program = %u, location = %d, params = 0x%016" PRIxPTR "", CID(context),
+          program, location, (uintptr_t)params);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetUniformdv(context, programPacked, locationPacked, params));
+        if (isCallValid)
+        {
+            context->getUniformdv(programPacked, locationPacked, params);
+        }
+        ANGLE_CAPTURE(GetUniformdv, isCallValid, context, programPacked, locationPacked, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+GLboolean GL_APIENTRY IsTransformFeedback(GLuint id)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLIsTransformFeedback, "context = %d, id = %u", CID(context), id);
+
+    GLboolean returnValue;
+    if (context)
+    {
+        TransformFeedbackID idPacked                          = PackParam<TransformFeedbackID>(id);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateIsTransformFeedback(context, idPacked));
+        if (isCallValid)
+        {
+            returnValue = context->isTransformFeedback(idPacked);
+        }
+        else
+        {
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLIsTransformFeedback, GLboolean>();
+        }
+        ANGLE_CAPTURE(IsTransformFeedback, isCallValid, context, idPacked, returnValue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsTransformFeedback, GLboolean>();
+    }
+    return returnValue;
+}
+
+void GL_APIENTRY MinSampleShading(GLfloat value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMinSampleShading, "context = %d, value = %f", CID(context), value);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateMinSampleShading(context, value));
+        if (isCallValid)
+        {
+            context->minSampleShading(value);
+        }
+        ANGLE_CAPTURE(MinSampleShading, isCallValid, context, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY PatchParameterfv(GLenum pname, const GLfloat *values)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLPatchParameterfv, "context = %d, pname = %s, values = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::PatchParameterName, pname), (uintptr_t)values);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidatePatchParameterfv(context, pname, values));
+        if (isCallValid)
+        {
+            context->patchParameterfv(pname, values);
+        }
+        ANGLE_CAPTURE(PatchParameterfv, isCallValid, context, pname, values);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY PatchParameteri(GLenum pname, GLint value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLPatchParameteri, "context = %d, pname = %s, value = %d", CID(context),
+          GLenumToString(GLenumGroup::PatchParameterName, pname), value);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidatePatchParameteri(context, pname, value));
+        if (isCallValid)
+        {
+            context->patchParameteri(pname, value);
+        }
+        ANGLE_CAPTURE(PatchParameteri, isCallValid, context, pname, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY PauseTransformFeedback()
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLPauseTransformFeedback, "context = %d", CID(context));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidatePauseTransformFeedback(context));
+        if (isCallValid)
+        {
+            context->pauseTransformFeedback();
+        }
+        ANGLE_CAPTURE(PauseTransformFeedback, isCallValid, context);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ResumeTransformFeedback()
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLResumeTransformFeedback, "context = %d", CID(context));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateResumeTransformFeedback(context));
+        if (isCallValid)
+        {
+            context->resumeTransformFeedback();
+        }
+        ANGLE_CAPTURE(ResumeTransformFeedback, isCallValid, context);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Uniform1d(GLint location, GLdouble x)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLUniform1d, "context = %d, location = %d, x = %f", CID(context), location, x);
+
+    if (context)
+    {
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateUniform1d(context, locationPacked, x));
+        if (isCallValid)
+        {
+            context->uniform1d(locationPacked, x);
+        }
+        ANGLE_CAPTURE(Uniform1d, isCallValid, context, locationPacked, x);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Uniform1dv(GLint location, GLsizei count, const GLdouble *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLUniform1dv,
+          "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
+          location, count, (uintptr_t)value);
+
+    if (context)
+    {
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateUniform1dv(context, locationPacked, count, value));
+        if (isCallValid)
+        {
+            context->uniform1dv(locationPacked, count, value);
+        }
+        ANGLE_CAPTURE(Uniform1dv, isCallValid, context, locationPacked, count, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Uniform2d(GLint location, GLdouble x, GLdouble y)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLUniform2d, "context = %d, location = %d, x = %f, y = %f", CID(context),
+          location, x, y);
+
+    if (context)
+    {
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateUniform2d(context, locationPacked, x, y));
+        if (isCallValid)
+        {
+            context->uniform2d(locationPacked, x, y);
+        }
+        ANGLE_CAPTURE(Uniform2d, isCallValid, context, locationPacked, x, y);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Uniform2dv(GLint location, GLsizei count, const GLdouble *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLUniform2dv,
+          "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
+          location, count, (uintptr_t)value);
+
+    if (context)
+    {
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateUniform2dv(context, locationPacked, count, value));
+        if (isCallValid)
+        {
+            context->uniform2dv(locationPacked, count, value);
+        }
+        ANGLE_CAPTURE(Uniform2dv, isCallValid, context, locationPacked, count, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Uniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLUniform3d, "context = %d, location = %d, x = %f, y = %f, z = %f", CID(context),
+          location, x, y, z);
+
+    if (context)
+    {
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateUniform3d(context, locationPacked, x, y, z));
+        if (isCallValid)
+        {
+            context->uniform3d(locationPacked, x, y, z);
+        }
+        ANGLE_CAPTURE(Uniform3d, isCallValid, context, locationPacked, x, y, z);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Uniform3dv(GLint location, GLsizei count, const GLdouble *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLUniform3dv,
+          "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
+          location, count, (uintptr_t)value);
+
+    if (context)
+    {
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateUniform3dv(context, locationPacked, count, value));
+        if (isCallValid)
+        {
+            context->uniform3dv(locationPacked, count, value);
+        }
+        ANGLE_CAPTURE(Uniform3dv, isCallValid, context, locationPacked, count, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Uniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLUniform4d, "context = %d, location = %d, x = %f, y = %f, z = %f, w = %f",
+          CID(context), location, x, y, z, w);
+
+    if (context)
+    {
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateUniform4d(context, locationPacked, x, y, z, w));
+        if (isCallValid)
+        {
+            context->uniform4d(locationPacked, x, y, z, w);
+        }
+        ANGLE_CAPTURE(Uniform4d, isCallValid, context, locationPacked, x, y, z, w);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY Uniform4dv(GLint location, GLsizei count, const GLdouble *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLUniform4dv,
+          "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
+          location, count, (uintptr_t)value);
+
+    if (context)
+    {
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateUniform4dv(context, locationPacked, count, value));
+        if (isCallValid)
+        {
+            context->uniform4dv(locationPacked, count, value);
+        }
+        ANGLE_CAPTURE(Uniform4dv, isCallValid, context, locationPacked, count, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY UniformMatrix2dv(GLint location,
+                                  GLsizei count,
+                                  GLboolean transpose,
+                                  const GLdouble *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLUniformMatrix2dv,
+          "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
+          CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
+
+    if (context)
+    {
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateUniformMatrix2dv(context, locationPacked, count, transpose, value));
+        if (isCallValid)
+        {
+            context->uniformMatrix2dv(locationPacked, count, transpose, value);
+        }
+        ANGLE_CAPTURE(UniformMatrix2dv, isCallValid, context, locationPacked, count, transpose,
+                      value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY UniformMatrix2x3dv(GLint location,
+                                    GLsizei count,
+                                    GLboolean transpose,
+                                    const GLdouble *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLUniformMatrix2x3dv,
+          "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
+          CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
+
+    if (context)
+    {
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateUniformMatrix2x3dv(context, locationPacked, count, transpose, value));
+        if (isCallValid)
+        {
+            context->uniformMatrix2x3dv(locationPacked, count, transpose, value);
+        }
+        ANGLE_CAPTURE(UniformMatrix2x3dv, isCallValid, context, locationPacked, count, transpose,
+                      value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY UniformMatrix2x4dv(GLint location,
+                                    GLsizei count,
+                                    GLboolean transpose,
+                                    const GLdouble *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLUniformMatrix2x4dv,
+          "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
+          CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
+
+    if (context)
+    {
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateUniformMatrix2x4dv(context, locationPacked, count, transpose, value));
+        if (isCallValid)
+        {
+            context->uniformMatrix2x4dv(locationPacked, count, transpose, value);
+        }
+        ANGLE_CAPTURE(UniformMatrix2x4dv, isCallValid, context, locationPacked, count, transpose,
+                      value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY UniformMatrix3dv(GLint location,
+                                  GLsizei count,
+                                  GLboolean transpose,
+                                  const GLdouble *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLUniformMatrix3dv,
+          "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
+          CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
+
+    if (context)
+    {
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateUniformMatrix3dv(context, locationPacked, count, transpose, value));
+        if (isCallValid)
+        {
+            context->uniformMatrix3dv(locationPacked, count, transpose, value);
+        }
+        ANGLE_CAPTURE(UniformMatrix3dv, isCallValid, context, locationPacked, count, transpose,
+                      value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY UniformMatrix3x2dv(GLint location,
+                                    GLsizei count,
+                                    GLboolean transpose,
+                                    const GLdouble *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLUniformMatrix3x2dv,
+          "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
+          CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
+
+    if (context)
+    {
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateUniformMatrix3x2dv(context, locationPacked, count, transpose, value));
+        if (isCallValid)
+        {
+            context->uniformMatrix3x2dv(locationPacked, count, transpose, value);
+        }
+        ANGLE_CAPTURE(UniformMatrix3x2dv, isCallValid, context, locationPacked, count, transpose,
+                      value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY UniformMatrix3x4dv(GLint location,
+                                    GLsizei count,
+                                    GLboolean transpose,
+                                    const GLdouble *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLUniformMatrix3x4dv,
+          "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
+          CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
+
+    if (context)
+    {
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateUniformMatrix3x4dv(context, locationPacked, count, transpose, value));
+        if (isCallValid)
+        {
+            context->uniformMatrix3x4dv(locationPacked, count, transpose, value);
+        }
+        ANGLE_CAPTURE(UniformMatrix3x4dv, isCallValid, context, locationPacked, count, transpose,
+                      value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY UniformMatrix4dv(GLint location,
+                                  GLsizei count,
+                                  GLboolean transpose,
+                                  const GLdouble *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLUniformMatrix4dv,
+          "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
+          CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
+
+    if (context)
+    {
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateUniformMatrix4dv(context, locationPacked, count, transpose, value));
+        if (isCallValid)
+        {
+            context->uniformMatrix4dv(locationPacked, count, transpose, value);
+        }
+        ANGLE_CAPTURE(UniformMatrix4dv, isCallValid, context, locationPacked, count, transpose,
+                      value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY UniformMatrix4x2dv(GLint location,
+                                    GLsizei count,
+                                    GLboolean transpose,
+                                    const GLdouble *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLUniformMatrix4x2dv,
+          "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
+          CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
+
+    if (context)
+    {
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateUniformMatrix4x2dv(context, locationPacked, count, transpose, value));
+        if (isCallValid)
+        {
+            context->uniformMatrix4x2dv(locationPacked, count, transpose, value);
+        }
+        ANGLE_CAPTURE(UniformMatrix4x2dv, isCallValid, context, locationPacked, count, transpose,
+                      value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY UniformMatrix4x3dv(GLint location,
+                                    GLsizei count,
+                                    GLboolean transpose,
+                                    const GLdouble *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLUniformMatrix4x3dv,
+          "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
+          CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
+
+    if (context)
+    {
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateUniformMatrix4x3dv(context, locationPacked, count, transpose, value));
+        if (isCallValid)
+        {
+            context->uniformMatrix4x3dv(locationPacked, count, transpose, value);
+        }
+        ANGLE_CAPTURE(UniformMatrix4x3dv, isCallValid, context, locationPacked, count, transpose,
+                      value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY UniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLUniformSubroutinesuiv,
+          "context = %d, shadertype = %s, count = %d, indices = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::ShaderType, shadertype), count, (uintptr_t)indices);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateUniformSubroutinesuiv(context, shadertype, count, indices));
+        if (isCallValid)
+        {
+            context->uniformSubroutinesuiv(shadertype, count, indices);
+        }
+        ANGLE_CAPTURE(UniformSubroutinesuiv, isCallValid, context, shadertype, count, indices);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+// GL 4.1
+void GL_APIENTRY ActiveShaderProgram(GLuint pipeline, GLuint program)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLActiveShaderProgram, "context = %d, pipeline = %u, program = %u", CID(context),
+          pipeline, program);
+
+    if (context)
+    {
+        ProgramPipelineID pipelinePacked = PackParam<ProgramPipelineID>(pipeline);
+        ShaderProgramID programPacked    = PackParam<ShaderProgramID>(program);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateActiveShaderProgram(context, pipelinePacked, programPacked));
+        if (isCallValid)
+        {
+            context->activeShaderProgram(pipelinePacked, programPacked);
+        }
+        ANGLE_CAPTURE(ActiveShaderProgram, isCallValid, context, pipelinePacked, programPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY BindProgramPipeline(GLuint pipeline)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLBindProgramPipeline, "context = %d, pipeline = %u", CID(context), pipeline);
+
+    if (context)
+    {
+        ProgramPipelineID pipelinePacked = PackParam<ProgramPipelineID>(pipeline);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateBindProgramPipeline(context, pipelinePacked));
+        if (isCallValid)
+        {
+            context->bindProgramPipeline(pipelinePacked);
+        }
+        ANGLE_CAPTURE(BindProgramPipeline, isCallValid, context, pipelinePacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ClearDepthf(GLfloat d)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLClearDepthf, "context = %d, d = %f", CID(context), d);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateClearDepthf(context, d));
+        if (isCallValid)
+        {
+            context->clearDepthf(d);
+        }
+        ANGLE_CAPTURE(ClearDepthf, isCallValid, context, d);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+GLuint GL_APIENTRY CreateShaderProgramv(GLenum type, GLsizei count, const GLchar *const *strings)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLCreateShaderProgramv,
+          "context = %d, type = %s, count = %d, strings = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::ShaderType, type), count, (uintptr_t)strings);
+
+    GLuint returnValue;
+    if (context)
+    {
+        ShaderType typePacked                                 = PackParam<ShaderType>(type);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateCreateShaderProgramv(context, typePacked, count, strings));
+        if (isCallValid)
+        {
+            returnValue = context->createShaderProgramv(typePacked, count, strings);
+        }
+        else
+        {
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLCreateShaderProgramv, GLuint>();
+        }
+        ANGLE_CAPTURE(CreateShaderProgramv, isCallValid, context, typePacked, count, strings,
+                      returnValue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLCreateShaderProgramv, GLuint>();
+    }
+    return returnValue;
+}
+
+void GL_APIENTRY DeleteProgramPipelines(GLsizei n, const GLuint *pipelines)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDeleteProgramPipelines, "context = %d, n = %d, pipelines = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)pipelines);
+
+    if (context)
+    {
+        const ProgramPipelineID *pipelinesPacked = PackParam<const ProgramPipelineID *>(pipelines);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateDeleteProgramPipelines(context, n, pipelinesPacked));
+        if (isCallValid)
+        {
+            context->deleteProgramPipelines(n, pipelinesPacked);
+        }
+        ANGLE_CAPTURE(DeleteProgramPipelines, isCallValid, context, n, pipelinesPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDepthRangeArrayv,
+          "context = %d, first = %u, count = %d, v = 0x%016" PRIxPTR "", CID(context), first, count,
+          (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateDepthRangeArrayv(context, first, count, v));
+        if (isCallValid)
+        {
+            context->depthRangeArrayv(first, count, v);
+        }
+        ANGLE_CAPTURE(DepthRangeArrayv, isCallValid, context, first, count, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DepthRangeIndexed(GLuint index, GLdouble n, GLdouble f)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDepthRangeIndexed, "context = %d, index = %u, n = %f, f = %f", CID(context),
+          index, n, f);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateDepthRangeIndexed(context, index, n, f));
+        if (isCallValid)
+        {
+            context->depthRangeIndexed(index, n, f);
+        }
+        ANGLE_CAPTURE(DepthRangeIndexed, isCallValid, context, index, n, f);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DepthRangef(GLfloat n, GLfloat f)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDepthRangef, "context = %d, n = %f, f = %f", CID(context), n, f);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateDepthRangef(context, n, f));
+        if (isCallValid)
+        {
+            context->depthRangef(n, f);
+        }
+        ANGLE_CAPTURE(DepthRangef, isCallValid, context, n, f);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GenProgramPipelines(GLsizei n, GLuint *pipelines)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGenProgramPipelines, "context = %d, n = %d, pipelines = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)pipelines);
+
+    if (context)
+    {
+        ProgramPipelineID *pipelinesPacked = PackParam<ProgramPipelineID *>(pipelines);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGenProgramPipelines(context, n, pipelinesPacked));
+        if (isCallValid)
+        {
+            context->genProgramPipelines(n, pipelinesPacked);
+        }
+        ANGLE_CAPTURE(GenProgramPipelines, isCallValid, context, n, pipelinesPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetDoublei_v(GLenum target, GLuint index, GLdouble *data)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetDoublei_v,
+          "context = %d, target = %s, index = %u, data = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::TypeEnum, target), index, (uintptr_t)data);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGetDoublei_v(context, target, index, data));
+        if (isCallValid)
+        {
+            context->getDoublei_v(target, index, data);
+        }
+        ANGLE_CAPTURE(GetDoublei_v, isCallValid, context, target, index, data);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetFloati_v(GLenum target, GLuint index, GLfloat *data)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetFloati_v, "context = %d, target = %s, index = %u, data = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TypeEnum, target), index, (uintptr_t)data);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGetFloati_v(context, target, index, data));
+        if (isCallValid)
+        {
+            context->getFloati_v(target, index, data);
+        }
+        ANGLE_CAPTURE(GetFloati_v, isCallValid, context, target, index, data);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetProgramBinary(GLuint program,
+                                  GLsizei bufSize,
+                                  GLsizei *length,
+                                  GLenum *binaryFormat,
+                                  void *binary)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetProgramBinary,
+          "context = %d, program = %u, bufSize = %d, length = 0x%016" PRIxPTR
+          ", binaryFormat = 0x%016" PRIxPTR ", binary = 0x%016" PRIxPTR "",
+          CID(context), program, bufSize, (uintptr_t)length, (uintptr_t)binaryFormat,
+          (uintptr_t)binary);
+
+    if (context)
+    {
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGetProgramBinary(context, programPacked, bufSize,
+                                                                   length, binaryFormat, binary));
+        if (isCallValid)
+        {
+            context->getProgramBinary(programPacked, bufSize, length, binaryFormat, binary);
+        }
+        ANGLE_CAPTURE(GetProgramBinary, isCallValid, context, programPacked, bufSize, length,
+                      binaryFormat, binary);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetProgramPipelineInfoLog(GLuint pipeline,
+                                           GLsizei bufSize,
+                                           GLsizei *length,
+                                           GLchar *infoLog)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetProgramPipelineInfoLog,
+          "context = %d, pipeline = %u, bufSize = %d, length = 0x%016" PRIxPTR
+          ", infoLog = 0x%016" PRIxPTR "",
+          CID(context), pipeline, bufSize, (uintptr_t)length, (uintptr_t)infoLog);
+
+    if (context)
+    {
+        ProgramPipelineID pipelinePacked = PackParam<ProgramPipelineID>(pipeline);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetProgramPipelineInfoLog(context, pipelinePacked, bufSize, length, infoLog));
+        if (isCallValid)
+        {
+            context->getProgramPipelineInfoLog(pipelinePacked, bufSize, length, infoLog);
+        }
+        ANGLE_CAPTURE(GetProgramPipelineInfoLog, isCallValid, context, pipelinePacked, bufSize,
+                      length, infoLog);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetProgramPipelineiv,
+          "context = %d, pipeline = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
+          pipeline, GLenumToString(GLenumGroup::PipelineParameterName, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        ProgramPipelineID pipelinePacked = PackParam<ProgramPipelineID>(pipeline);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetProgramPipelineiv(context, pipelinePacked, pname, params));
+        if (isCallValid)
+        {
+            context->getProgramPipelineiv(pipelinePacked, pname, params);
+        }
+        ANGLE_CAPTURE(GetProgramPipelineiv, isCallValid, context, pipelinePacked, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetShaderPrecisionFormat(GLenum shadertype,
+                                          GLenum precisiontype,
+                                          GLint *range,
+                                          GLint *precision)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetShaderPrecisionFormat,
+          "context = %d, shadertype = %s, precisiontype = %s, range = 0x%016" PRIxPTR
+          ", precision = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::ShaderType, shadertype),
+          GLenumToString(GLenumGroup::PrecisionType, precisiontype), (uintptr_t)range,
+          (uintptr_t)precision);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetShaderPrecisionFormat(context, shadertype, precisiontype,
+                                                             range, precision));
+        if (isCallValid)
+        {
+            context->getShaderPrecisionFormat(shadertype, precisiontype, range, precision);
+        }
+        ANGLE_CAPTURE(GetShaderPrecisionFormat, isCallValid, context, shadertype, precisiontype,
+                      range, precision);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetVertexAttribLdv,
+          "context = %d, index = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), index,
+          GLenumToString(GLenumGroup::VertexAttribEnum, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetVertexAttribLdv(context, index, pname, params));
+        if (isCallValid)
+        {
+            context->getVertexAttribLdv(index, pname, params);
+        }
+        ANGLE_CAPTURE(GetVertexAttribLdv, isCallValid, context, index, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+GLboolean GL_APIENTRY IsProgramPipeline(GLuint pipeline)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLIsProgramPipeline, "context = %d, pipeline = %u", CID(context), pipeline);
+
+    GLboolean returnValue;
+    if (context)
+    {
+        ProgramPipelineID pipelinePacked = PackParam<ProgramPipelineID>(pipeline);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateIsProgramPipeline(context, pipelinePacked));
+        if (isCallValid)
+        {
+            returnValue = context->isProgramPipeline(pipelinePacked);
+        }
+        else
+        {
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLIsProgramPipeline, GLboolean>();
+        }
+        ANGLE_CAPTURE(IsProgramPipeline, isCallValid, context, pipelinePacked, returnValue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsProgramPipeline, GLboolean>();
+    }
+    return returnValue;
+}
+
+void GL_APIENTRY ProgramBinary(GLuint program,
+                               GLenum binaryFormat,
+                               const void *binary,
+                               GLsizei length)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramBinary,
+          "context = %d, program = %u, binaryFormat = %s, binary = 0x%016" PRIxPTR ", length = %d",
+          CID(context), program, GLenumToString(GLenumGroup::DefaultGroup, binaryFormat),
+          (uintptr_t)binary, length);
+
+    if (context)
+    {
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramBinary(context, programPacked, binaryFormat, binary, length));
+        if (isCallValid)
+        {
+            context->programBinary(programPacked, binaryFormat, binary, length);
+        }
+        ANGLE_CAPTURE(ProgramBinary, isCallValid, context, programPacked, binaryFormat, binary,
+                      length);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramParameteri(GLuint program, GLenum pname, GLint value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramParameteri, "context = %d, program = %u, pname = %s, value = %d",
+          CID(context), program, GLenumToString(GLenumGroup::ProgramParameterPName, pname), value);
+
+    if (context)
+    {
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateProgramParameteri(context, programPacked, pname, value));
+        if (isCallValid)
+        {
+            context->programParameteri(programPacked, pname, value);
+        }
+        ANGLE_CAPTURE(ProgramParameteri, isCallValid, context, programPacked, pname, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniform1d(GLuint program, GLint location, GLdouble v0)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniform1d, "context = %d, program = %u, location = %d, v0 = %f",
+          CID(context), program, location, v0);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateProgramUniform1d(context, programPacked, locationPacked, v0));
+        if (isCallValid)
+        {
+            context->programUniform1d(programPacked, locationPacked, v0);
+        }
+        ANGLE_CAPTURE(ProgramUniform1d, isCallValid, context, programPacked, locationPacked, v0);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniform1dv(GLuint program,
+                                   GLint location,
+                                   GLsizei count,
+                                   const GLdouble *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniform1dv,
+          "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
+          CID(context), program, location, count, (uintptr_t)value);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform1dv(context, programPacked, locationPacked, count, value));
+        if (isCallValid)
+        {
+            context->programUniform1dv(programPacked, locationPacked, count, value);
+        }
+        ANGLE_CAPTURE(ProgramUniform1dv, isCallValid, context, programPacked, locationPacked, count,
+                      value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniform1f(GLuint program, GLint location, GLfloat v0)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniform1f, "context = %d, program = %u, location = %d, v0 = %f",
+          CID(context), program, location, v0);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateProgramUniform1f(context, programPacked, locationPacked, v0));
+        if (isCallValid)
+        {
+            context->programUniform1f(programPacked, locationPacked, v0);
+        }
+        ANGLE_CAPTURE(ProgramUniform1f, isCallValid, context, programPacked, locationPacked, v0);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniform1fv(GLuint program,
+                                   GLint location,
+                                   GLsizei count,
+                                   const GLfloat *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniform1fv,
+          "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
+          CID(context), program, location, count, (uintptr_t)value);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform1fv(context, programPacked, locationPacked, count, value));
+        if (isCallValid)
+        {
+            context->programUniform1fv(programPacked, locationPacked, count, value);
+        }
+        ANGLE_CAPTURE(ProgramUniform1fv, isCallValid, context, programPacked, locationPacked, count,
+                      value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniform1i(GLuint program, GLint location, GLint v0)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniform1i, "context = %d, program = %u, location = %d, v0 = %d",
+          CID(context), program, location, v0);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateProgramUniform1i(context, programPacked, locationPacked, v0));
+        if (isCallValid)
+        {
+            context->programUniform1i(programPacked, locationPacked, v0);
+        }
+        ANGLE_CAPTURE(ProgramUniform1i, isCallValid, context, programPacked, locationPacked, v0);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniform1iv(GLuint program,
+                                   GLint location,
+                                   GLsizei count,
+                                   const GLint *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniform1iv,
+          "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
+          CID(context), program, location, count, (uintptr_t)value);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform1iv(context, programPacked, locationPacked, count, value));
+        if (isCallValid)
+        {
+            context->programUniform1iv(programPacked, locationPacked, count, value);
+        }
+        ANGLE_CAPTURE(ProgramUniform1iv, isCallValid, context, programPacked, locationPacked, count,
+                      value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniform1ui(GLuint program, GLint location, GLuint v0)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniform1ui, "context = %d, program = %u, location = %d, v0 = %u",
+          CID(context), program, location, v0);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateProgramUniform1ui(context, programPacked, locationPacked, v0));
+        if (isCallValid)
+        {
+            context->programUniform1ui(programPacked, locationPacked, v0);
+        }
+        ANGLE_CAPTURE(ProgramUniform1ui, isCallValid, context, programPacked, locationPacked, v0);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniform1uiv(GLuint program,
+                                    GLint location,
+                                    GLsizei count,
+                                    const GLuint *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniform1uiv,
+          "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
+          CID(context), program, location, count, (uintptr_t)value);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform1uiv(context, programPacked, locationPacked, count, value));
+        if (isCallValid)
+        {
+            context->programUniform1uiv(programPacked, locationPacked, count, value);
+        }
+        ANGLE_CAPTURE(ProgramUniform1uiv, isCallValid, context, programPacked, locationPacked,
+                      count, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniform2d,
+          "context = %d, program = %u, location = %d, v0 = %f, v1 = %f", CID(context), program,
+          location, v0, v1);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform2d(context, programPacked, locationPacked, v0, v1));
+        if (isCallValid)
+        {
+            context->programUniform2d(programPacked, locationPacked, v0, v1);
+        }
+        ANGLE_CAPTURE(ProgramUniform2d, isCallValid, context, programPacked, locationPacked, v0,
+                      v1);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniform2dv(GLuint program,
+                                   GLint location,
+                                   GLsizei count,
+                                   const GLdouble *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniform2dv,
+          "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
+          CID(context), program, location, count, (uintptr_t)value);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform2dv(context, programPacked, locationPacked, count, value));
+        if (isCallValid)
+        {
+            context->programUniform2dv(programPacked, locationPacked, count, value);
+        }
+        ANGLE_CAPTURE(ProgramUniform2dv, isCallValid, context, programPacked, locationPacked, count,
+                      value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniform2f,
+          "context = %d, program = %u, location = %d, v0 = %f, v1 = %f", CID(context), program,
+          location, v0, v1);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform2f(context, programPacked, locationPacked, v0, v1));
+        if (isCallValid)
+        {
+            context->programUniform2f(programPacked, locationPacked, v0, v1);
+        }
+        ANGLE_CAPTURE(ProgramUniform2f, isCallValid, context, programPacked, locationPacked, v0,
+                      v1);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniform2fv(GLuint program,
+                                   GLint location,
+                                   GLsizei count,
+                                   const GLfloat *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniform2fv,
+          "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
+          CID(context), program, location, count, (uintptr_t)value);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform2fv(context, programPacked, locationPacked, count, value));
+        if (isCallValid)
+        {
+            context->programUniform2fv(programPacked, locationPacked, count, value);
+        }
+        ANGLE_CAPTURE(ProgramUniform2fv, isCallValid, context, programPacked, locationPacked, count,
+                      value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniform2i,
+          "context = %d, program = %u, location = %d, v0 = %d, v1 = %d", CID(context), program,
+          location, v0, v1);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform2i(context, programPacked, locationPacked, v0, v1));
+        if (isCallValid)
+        {
+            context->programUniform2i(programPacked, locationPacked, v0, v1);
+        }
+        ANGLE_CAPTURE(ProgramUniform2i, isCallValid, context, programPacked, locationPacked, v0,
+                      v1);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniform2iv(GLuint program,
+                                   GLint location,
+                                   GLsizei count,
+                                   const GLint *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniform2iv,
+          "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
+          CID(context), program, location, count, (uintptr_t)value);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform2iv(context, programPacked, locationPacked, count, value));
+        if (isCallValid)
+        {
+            context->programUniform2iv(programPacked, locationPacked, count, value);
+        }
+        ANGLE_CAPTURE(ProgramUniform2iv, isCallValid, context, programPacked, locationPacked, count,
+                      value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniform2ui,
+          "context = %d, program = %u, location = %d, v0 = %u, v1 = %u", CID(context), program,
+          location, v0, v1);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform2ui(context, programPacked, locationPacked, v0, v1));
+        if (isCallValid)
+        {
+            context->programUniform2ui(programPacked, locationPacked, v0, v1);
+        }
+        ANGLE_CAPTURE(ProgramUniform2ui, isCallValid, context, programPacked, locationPacked, v0,
+                      v1);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniform2uiv(GLuint program,
+                                    GLint location,
+                                    GLsizei count,
+                                    const GLuint *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniform2uiv,
+          "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
+          CID(context), program, location, count, (uintptr_t)value);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform2uiv(context, programPacked, locationPacked, count, value));
+        if (isCallValid)
+        {
+            context->programUniform2uiv(programPacked, locationPacked, count, value);
+        }
+        ANGLE_CAPTURE(ProgramUniform2uiv, isCallValid, context, programPacked, locationPacked,
+                      count, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY
+ProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniform3d,
+          "context = %d, program = %u, location = %d, v0 = %f, v1 = %f, v2 = %f", CID(context),
+          program, location, v0, v1, v2);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform3d(context, programPacked, locationPacked, v0, v1, v2));
+        if (isCallValid)
+        {
+            context->programUniform3d(programPacked, locationPacked, v0, v1, v2);
+        }
+        ANGLE_CAPTURE(ProgramUniform3d, isCallValid, context, programPacked, locationPacked, v0, v1,
+                      v2);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniform3dv(GLuint program,
+                                   GLint location,
+                                   GLsizei count,
+                                   const GLdouble *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniform3dv,
+          "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
+          CID(context), program, location, count, (uintptr_t)value);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform3dv(context, programPacked, locationPacked, count, value));
+        if (isCallValid)
+        {
+            context->programUniform3dv(programPacked, locationPacked, count, value);
+        }
+        ANGLE_CAPTURE(ProgramUniform3dv, isCallValid, context, programPacked, locationPacked, count,
+                      value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY
+ProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniform3f,
+          "context = %d, program = %u, location = %d, v0 = %f, v1 = %f, v2 = %f", CID(context),
+          program, location, v0, v1, v2);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform3f(context, programPacked, locationPacked, v0, v1, v2));
+        if (isCallValid)
+        {
+            context->programUniform3f(programPacked, locationPacked, v0, v1, v2);
+        }
+        ANGLE_CAPTURE(ProgramUniform3f, isCallValid, context, programPacked, locationPacked, v0, v1,
+                      v2);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniform3fv(GLuint program,
+                                   GLint location,
+                                   GLsizei count,
+                                   const GLfloat *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniform3fv,
+          "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
+          CID(context), program, location, count, (uintptr_t)value);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform3fv(context, programPacked, locationPacked, count, value));
+        if (isCallValid)
+        {
+            context->programUniform3fv(programPacked, locationPacked, count, value);
+        }
+        ANGLE_CAPTURE(ProgramUniform3fv, isCallValid, context, programPacked, locationPacked, count,
+                      value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniform3i,
+          "context = %d, program = %u, location = %d, v0 = %d, v1 = %d, v2 = %d", CID(context),
+          program, location, v0, v1, v2);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform3i(context, programPacked, locationPacked, v0, v1, v2));
+        if (isCallValid)
+        {
+            context->programUniform3i(programPacked, locationPacked, v0, v1, v2);
+        }
+        ANGLE_CAPTURE(ProgramUniform3i, isCallValid, context, programPacked, locationPacked, v0, v1,
+                      v2);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniform3iv(GLuint program,
+                                   GLint location,
+                                   GLsizei count,
+                                   const GLint *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniform3iv,
+          "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
+          CID(context), program, location, count, (uintptr_t)value);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform3iv(context, programPacked, locationPacked, count, value));
+        if (isCallValid)
+        {
+            context->programUniform3iv(programPacked, locationPacked, count, value);
+        }
+        ANGLE_CAPTURE(ProgramUniform3iv, isCallValid, context, programPacked, locationPacked, count,
+                      value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniform3ui,
+          "context = %d, program = %u, location = %d, v0 = %u, v1 = %u, v2 = %u", CID(context),
+          program, location, v0, v1, v2);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform3ui(context, programPacked, locationPacked, v0, v1, v2));
+        if (isCallValid)
+        {
+            context->programUniform3ui(programPacked, locationPacked, v0, v1, v2);
+        }
+        ANGLE_CAPTURE(ProgramUniform3ui, isCallValid, context, programPacked, locationPacked, v0,
+                      v1, v2);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniform3uiv(GLuint program,
+                                    GLint location,
+                                    GLsizei count,
+                                    const GLuint *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniform3uiv,
+          "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
+          CID(context), program, location, count, (uintptr_t)value);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform3uiv(context, programPacked, locationPacked, count, value));
+        if (isCallValid)
+        {
+            context->programUniform3uiv(programPacked, locationPacked, count, value);
+        }
+        ANGLE_CAPTURE(ProgramUniform3uiv, isCallValid, context, programPacked, locationPacked,
+                      count, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY
+ProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniform4d,
+          "context = %d, program = %u, location = %d, v0 = %f, v1 = %f, v2 = %f, v3 = %f",
+          CID(context), program, location, v0, v1, v2, v3);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform4d(context, programPacked, locationPacked, v0, v1, v2, v3));
+        if (isCallValid)
+        {
+            context->programUniform4d(programPacked, locationPacked, v0, v1, v2, v3);
+        }
+        ANGLE_CAPTURE(ProgramUniform4d, isCallValid, context, programPacked, locationPacked, v0, v1,
+                      v2, v3);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniform4dv(GLuint program,
+                                   GLint location,
+                                   GLsizei count,
+                                   const GLdouble *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniform4dv,
+          "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
+          CID(context), program, location, count, (uintptr_t)value);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform4dv(context, programPacked, locationPacked, count, value));
+        if (isCallValid)
+        {
+            context->programUniform4dv(programPacked, locationPacked, count, value);
+        }
+        ANGLE_CAPTURE(ProgramUniform4dv, isCallValid, context, programPacked, locationPacked, count,
+                      value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY
+ProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniform4f,
+          "context = %d, program = %u, location = %d, v0 = %f, v1 = %f, v2 = %f, v3 = %f",
+          CID(context), program, location, v0, v1, v2, v3);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform4f(context, programPacked, locationPacked, v0, v1, v2, v3));
+        if (isCallValid)
+        {
+            context->programUniform4f(programPacked, locationPacked, v0, v1, v2, v3);
+        }
+        ANGLE_CAPTURE(ProgramUniform4f, isCallValid, context, programPacked, locationPacked, v0, v1,
+                      v2, v3);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniform4fv(GLuint program,
+                                   GLint location,
+                                   GLsizei count,
+                                   const GLfloat *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniform4fv,
+          "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
+          CID(context), program, location, count, (uintptr_t)value);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform4fv(context, programPacked, locationPacked, count, value));
+        if (isCallValid)
+        {
+            context->programUniform4fv(programPacked, locationPacked, count, value);
+        }
+        ANGLE_CAPTURE(ProgramUniform4fv, isCallValid, context, programPacked, locationPacked, count,
+                      value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY
+ProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniform4i,
+          "context = %d, program = %u, location = %d, v0 = %d, v1 = %d, v2 = %d, v3 = %d",
+          CID(context), program, location, v0, v1, v2, v3);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform4i(context, programPacked, locationPacked, v0, v1, v2, v3));
+        if (isCallValid)
+        {
+            context->programUniform4i(programPacked, locationPacked, v0, v1, v2, v3);
+        }
+        ANGLE_CAPTURE(ProgramUniform4i, isCallValid, context, programPacked, locationPacked, v0, v1,
+                      v2, v3);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniform4iv(GLuint program,
+                                   GLint location,
+                                   GLsizei count,
+                                   const GLint *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniform4iv,
+          "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
+          CID(context), program, location, count, (uintptr_t)value);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform4iv(context, programPacked, locationPacked, count, value));
+        if (isCallValid)
+        {
+            context->programUniform4iv(programPacked, locationPacked, count, value);
+        }
+        ANGLE_CAPTURE(ProgramUniform4iv, isCallValid, context, programPacked, locationPacked, count,
+                      value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY
+ProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniform4ui,
+          "context = %d, program = %u, location = %d, v0 = %u, v1 = %u, v2 = %u, v3 = %u",
+          CID(context), program, location, v0, v1, v2, v3);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform4ui(context, programPacked, locationPacked, v0, v1, v2, v3));
+        if (isCallValid)
+        {
+            context->programUniform4ui(programPacked, locationPacked, v0, v1, v2, v3);
+        }
+        ANGLE_CAPTURE(ProgramUniform4ui, isCallValid, context, programPacked, locationPacked, v0,
+                      v1, v2, v3);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniform4uiv(GLuint program,
+                                    GLint location,
+                                    GLsizei count,
+                                    const GLuint *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniform4uiv,
+          "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
+          CID(context), program, location, count, (uintptr_t)value);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateProgramUniform4uiv(context, programPacked, locationPacked, count, value));
+        if (isCallValid)
+        {
+            context->programUniform4uiv(programPacked, locationPacked, count, value);
+        }
+        ANGLE_CAPTURE(ProgramUniform4uiv, isCallValid, context, programPacked, locationPacked,
+                      count, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniformMatrix2dv(GLuint program,
+                                         GLint location,
+                                         GLsizei count,
+                                         GLboolean transpose,
+                                         const GLdouble *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniformMatrix2dv,
+          "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
+          "0x%016" PRIxPTR "",
+          CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix2dv(context, programPacked, locationPacked,
+                                                            count, transpose, value));
+        if (isCallValid)
+        {
+            context->programUniformMatrix2dv(programPacked, locationPacked, count, transpose,
+                                             value);
+        }
+        ANGLE_CAPTURE(ProgramUniformMatrix2dv, isCallValid, context, programPacked, locationPacked,
+                      count, transpose, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniformMatrix2fv(GLuint program,
+                                         GLint location,
+                                         GLsizei count,
+                                         GLboolean transpose,
+                                         const GLfloat *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniformMatrix2fv,
+          "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
+          "0x%016" PRIxPTR "",
+          CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix2fv(context, programPacked, locationPacked,
+                                                            count, transpose, value));
+        if (isCallValid)
+        {
+            context->programUniformMatrix2fv(programPacked, locationPacked, count, transpose,
+                                             value);
+        }
+        ANGLE_CAPTURE(ProgramUniformMatrix2fv, isCallValid, context, programPacked, locationPacked,
+                      count, transpose, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniformMatrix2x3dv(GLuint program,
+                                           GLint location,
+                                           GLsizei count,
+                                           GLboolean transpose,
+                                           const GLdouble *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniformMatrix2x3dv,
+          "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
+          "0x%016" PRIxPTR "",
+          CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix2x3dv(
+                                context, programPacked, locationPacked, count, transpose, value));
+        if (isCallValid)
+        {
+            context->programUniformMatrix2x3dv(programPacked, locationPacked, count, transpose,
+                                               value);
+        }
+        ANGLE_CAPTURE(ProgramUniformMatrix2x3dv, isCallValid, context, programPacked,
+                      locationPacked, count, transpose, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniformMatrix2x3fv(GLuint program,
+                                           GLint location,
+                                           GLsizei count,
+                                           GLboolean transpose,
+                                           const GLfloat *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniformMatrix2x3fv,
+          "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
+          "0x%016" PRIxPTR "",
+          CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix2x3fv(
+                                context, programPacked, locationPacked, count, transpose, value));
+        if (isCallValid)
+        {
+            context->programUniformMatrix2x3fv(programPacked, locationPacked, count, transpose,
+                                               value);
+        }
+        ANGLE_CAPTURE(ProgramUniformMatrix2x3fv, isCallValid, context, programPacked,
+                      locationPacked, count, transpose, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniformMatrix2x4dv(GLuint program,
+                                           GLint location,
+                                           GLsizei count,
+                                           GLboolean transpose,
+                                           const GLdouble *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniformMatrix2x4dv,
+          "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
+          "0x%016" PRIxPTR "",
+          CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix2x4dv(
+                                context, programPacked, locationPacked, count, transpose, value));
+        if (isCallValid)
+        {
+            context->programUniformMatrix2x4dv(programPacked, locationPacked, count, transpose,
+                                               value);
+        }
+        ANGLE_CAPTURE(ProgramUniformMatrix2x4dv, isCallValid, context, programPacked,
+                      locationPacked, count, transpose, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniformMatrix2x4fv(GLuint program,
+                                           GLint location,
+                                           GLsizei count,
+                                           GLboolean transpose,
+                                           const GLfloat *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniformMatrix2x4fv,
+          "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
+          "0x%016" PRIxPTR "",
+          CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix2x4fv(
+                                context, programPacked, locationPacked, count, transpose, value));
+        if (isCallValid)
+        {
+            context->programUniformMatrix2x4fv(programPacked, locationPacked, count, transpose,
+                                               value);
+        }
+        ANGLE_CAPTURE(ProgramUniformMatrix2x4fv, isCallValid, context, programPacked,
+                      locationPacked, count, transpose, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniformMatrix3dv(GLuint program,
+                                         GLint location,
+                                         GLsizei count,
+                                         GLboolean transpose,
+                                         const GLdouble *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniformMatrix3dv,
+          "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
+          "0x%016" PRIxPTR "",
+          CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix3dv(context, programPacked, locationPacked,
+                                                            count, transpose, value));
+        if (isCallValid)
+        {
+            context->programUniformMatrix3dv(programPacked, locationPacked, count, transpose,
+                                             value);
+        }
+        ANGLE_CAPTURE(ProgramUniformMatrix3dv, isCallValid, context, programPacked, locationPacked,
+                      count, transpose, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniformMatrix3fv(GLuint program,
+                                         GLint location,
+                                         GLsizei count,
+                                         GLboolean transpose,
+                                         const GLfloat *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniformMatrix3fv,
+          "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
+          "0x%016" PRIxPTR "",
+          CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix3fv(context, programPacked, locationPacked,
+                                                            count, transpose, value));
+        if (isCallValid)
+        {
+            context->programUniformMatrix3fv(programPacked, locationPacked, count, transpose,
+                                             value);
+        }
+        ANGLE_CAPTURE(ProgramUniformMatrix3fv, isCallValid, context, programPacked, locationPacked,
+                      count, transpose, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniformMatrix3x2dv(GLuint program,
+                                           GLint location,
+                                           GLsizei count,
+                                           GLboolean transpose,
+                                           const GLdouble *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniformMatrix3x2dv,
+          "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
+          "0x%016" PRIxPTR "",
+          CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix3x2dv(
+                                context, programPacked, locationPacked, count, transpose, value));
+        if (isCallValid)
+        {
+            context->programUniformMatrix3x2dv(programPacked, locationPacked, count, transpose,
+                                               value);
+        }
+        ANGLE_CAPTURE(ProgramUniformMatrix3x2dv, isCallValid, context, programPacked,
+                      locationPacked, count, transpose, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniformMatrix3x2fv(GLuint program,
+                                           GLint location,
+                                           GLsizei count,
+                                           GLboolean transpose,
+                                           const GLfloat *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniformMatrix3x2fv,
+          "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
+          "0x%016" PRIxPTR "",
+          CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix3x2fv(
+                                context, programPacked, locationPacked, count, transpose, value));
+        if (isCallValid)
+        {
+            context->programUniformMatrix3x2fv(programPacked, locationPacked, count, transpose,
+                                               value);
+        }
+        ANGLE_CAPTURE(ProgramUniformMatrix3x2fv, isCallValid, context, programPacked,
+                      locationPacked, count, transpose, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniformMatrix3x4dv(GLuint program,
+                                           GLint location,
+                                           GLsizei count,
+                                           GLboolean transpose,
+                                           const GLdouble *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniformMatrix3x4dv,
+          "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
+          "0x%016" PRIxPTR "",
+          CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix3x4dv(
+                                context, programPacked, locationPacked, count, transpose, value));
+        if (isCallValid)
+        {
+            context->programUniformMatrix3x4dv(programPacked, locationPacked, count, transpose,
+                                               value);
+        }
+        ANGLE_CAPTURE(ProgramUniformMatrix3x4dv, isCallValid, context, programPacked,
+                      locationPacked, count, transpose, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniformMatrix3x4fv(GLuint program,
+                                           GLint location,
+                                           GLsizei count,
+                                           GLboolean transpose,
+                                           const GLfloat *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniformMatrix3x4fv,
+          "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
+          "0x%016" PRIxPTR "",
+          CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix3x4fv(
+                                context, programPacked, locationPacked, count, transpose, value));
+        if (isCallValid)
+        {
+            context->programUniformMatrix3x4fv(programPacked, locationPacked, count, transpose,
+                                               value);
+        }
+        ANGLE_CAPTURE(ProgramUniformMatrix3x4fv, isCallValid, context, programPacked,
+                      locationPacked, count, transpose, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniformMatrix4dv(GLuint program,
+                                         GLint location,
+                                         GLsizei count,
+                                         GLboolean transpose,
+                                         const GLdouble *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniformMatrix4dv,
+          "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
+          "0x%016" PRIxPTR "",
+          CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix4dv(context, programPacked, locationPacked,
+                                                            count, transpose, value));
+        if (isCallValid)
+        {
+            context->programUniformMatrix4dv(programPacked, locationPacked, count, transpose,
+                                             value);
+        }
+        ANGLE_CAPTURE(ProgramUniformMatrix4dv, isCallValid, context, programPacked, locationPacked,
+                      count, transpose, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniformMatrix4fv(GLuint program,
+                                         GLint location,
+                                         GLsizei count,
+                                         GLboolean transpose,
+                                         const GLfloat *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniformMatrix4fv,
+          "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
+          "0x%016" PRIxPTR "",
+          CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix4fv(context, programPacked, locationPacked,
+                                                            count, transpose, value));
+        if (isCallValid)
+        {
+            context->programUniformMatrix4fv(programPacked, locationPacked, count, transpose,
+                                             value);
+        }
+        ANGLE_CAPTURE(ProgramUniformMatrix4fv, isCallValid, context, programPacked, locationPacked,
+                      count, transpose, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniformMatrix4x2dv(GLuint program,
+                                           GLint location,
+                                           GLsizei count,
+                                           GLboolean transpose,
+                                           const GLdouble *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniformMatrix4x2dv,
+          "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
+          "0x%016" PRIxPTR "",
+          CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix4x2dv(
+                                context, programPacked, locationPacked, count, transpose, value));
+        if (isCallValid)
+        {
+            context->programUniformMatrix4x2dv(programPacked, locationPacked, count, transpose,
+                                               value);
+        }
+        ANGLE_CAPTURE(ProgramUniformMatrix4x2dv, isCallValid, context, programPacked,
+                      locationPacked, count, transpose, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniformMatrix4x2fv(GLuint program,
+                                           GLint location,
+                                           GLsizei count,
+                                           GLboolean transpose,
+                                           const GLfloat *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniformMatrix4x2fv,
+          "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
+          "0x%016" PRIxPTR "",
+          CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix4x2fv(
+                                context, programPacked, locationPacked, count, transpose, value));
+        if (isCallValid)
+        {
+            context->programUniformMatrix4x2fv(programPacked, locationPacked, count, transpose,
+                                               value);
+        }
+        ANGLE_CAPTURE(ProgramUniformMatrix4x2fv, isCallValid, context, programPacked,
+                      locationPacked, count, transpose, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniformMatrix4x3dv(GLuint program,
+                                           GLint location,
+                                           GLsizei count,
+                                           GLboolean transpose,
+                                           const GLdouble *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniformMatrix4x3dv,
+          "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
+          "0x%016" PRIxPTR "",
+          CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix4x3dv(
+                                context, programPacked, locationPacked, count, transpose, value));
+        if (isCallValid)
+        {
+            context->programUniformMatrix4x3dv(programPacked, locationPacked, count, transpose,
+                                               value);
+        }
+        ANGLE_CAPTURE(ProgramUniformMatrix4x3dv, isCallValid, context, programPacked,
+                      locationPacked, count, transpose, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ProgramUniformMatrix4x3fv(GLuint program,
+                                           GLint location,
+                                           GLsizei count,
+                                           GLboolean transpose,
+                                           const GLfloat *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLProgramUniformMatrix4x3fv,
+          "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
+          "0x%016" PRIxPTR "",
+          CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateProgramUniformMatrix4x3fv(
+                                context, programPacked, locationPacked, count, transpose, value));
+        if (isCallValid)
+        {
+            context->programUniformMatrix4x3fv(programPacked, locationPacked, count, transpose,
+                                               value);
+        }
+        ANGLE_CAPTURE(ProgramUniformMatrix4x3fv, isCallValid, context, programPacked,
+                      locationPacked, count, transpose, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ReleaseShaderCompiler()
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLReleaseShaderCompiler, "context = %d", CID(context));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateReleaseShaderCompiler(context));
+        if (isCallValid)
+        {
+            context->releaseShaderCompiler();
+        }
+        ANGLE_CAPTURE(ReleaseShaderCompiler, isCallValid, context);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ScissorArrayv(GLuint first, GLsizei count, const GLint *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLScissorArrayv, "context = %d, first = %u, count = %d, v = 0x%016" PRIxPTR "",
+          CID(context), first, count, (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateScissorArrayv(context, first, count, v));
+        if (isCallValid)
+        {
+            context->scissorArrayv(first, count, v);
+        }
+        ANGLE_CAPTURE(ScissorArrayv, isCallValid, context, first, count, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY
+ScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLScissorIndexed,
+          "context = %d, index = %u, left = %d, bottom = %d, width = %d, height = %d", CID(context),
+          index, left, bottom, width, height);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateScissorIndexed(context, index, left, bottom, width, height));
+        if (isCallValid)
+        {
+            context->scissorIndexed(index, left, bottom, width, height);
+        }
+        ANGLE_CAPTURE(ScissorIndexed, isCallValid, context, index, left, bottom, width, height);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ScissorIndexedv(GLuint index, const GLint *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLScissorIndexedv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateScissorIndexedv(context, index, v));
+        if (isCallValid)
+        {
+            context->scissorIndexedv(index, v);
+        }
+        ANGLE_CAPTURE(ScissorIndexedv, isCallValid, context, index, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ShaderBinary(GLsizei count,
+                              const GLuint *shaders,
+                              GLenum binaryformat,
+                              const void *binary,
+                              GLsizei length)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLShaderBinary,
+          "context = %d, count = %d, shaders = 0x%016" PRIxPTR
+          ", binaryformat = %s, binary = 0x%016" PRIxPTR ", length = %d",
+          CID(context), count, (uintptr_t)shaders,
+          GLenumToString(GLenumGroup::DefaultGroup, binaryformat), (uintptr_t)binary, length);
+
+    if (context)
+    {
+        const ShaderProgramID *shadersPacked = PackParam<const ShaderProgramID *>(shaders);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateShaderBinary(context, count, shadersPacked, binaryformat, binary, length));
+        if (isCallValid)
+        {
+            context->shaderBinary(count, shadersPacked, binaryformat, binary, length);
+        }
+        ANGLE_CAPTURE(ShaderBinary, isCallValid, context, count, shadersPacked, binaryformat,
+                      binary, length);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY UseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLUseProgramStages, "context = %d, pipeline = %u, stages = %s, program = %u",
+          CID(context), pipeline,
+          GLbitfieldToString(GLenumGroup::UseProgramStageMask, stages).c_str(), program);
+
+    if (context)
+    {
+        ProgramPipelineID pipelinePacked = PackParam<ProgramPipelineID>(pipeline);
+        ShaderProgramID programPacked    = PackParam<ShaderProgramID>(program);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateUseProgramStages(context, pipelinePacked, stages, programPacked));
+        if (isCallValid)
+        {
+            context->useProgramStages(pipelinePacked, stages, programPacked);
+        }
+        ANGLE_CAPTURE(UseProgramStages, isCallValid, context, pipelinePacked, stages,
+                      programPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ValidateProgramPipeline(GLuint pipeline)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLValidateProgramPipeline, "context = %d, pipeline = %u", CID(context),
+          pipeline);
+
+    if (context)
+    {
+        ProgramPipelineID pipelinePacked = PackParam<ProgramPipelineID>(pipeline);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateValidateProgramPipeline(context, pipelinePacked));
+        if (isCallValid)
+        {
+            context->validateProgramPipeline(pipelinePacked);
+        }
+        ANGLE_CAPTURE(ValidateProgramPipeline, isCallValid, context, pipelinePacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribL1d(GLuint index, GLdouble x)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribL1d, "context = %d, index = %u, x = %f", CID(context), index, x);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateVertexAttribL1d(context, index, x));
+        if (isCallValid)
+        {
+            context->vertexAttribL1d(index, x);
+        }
+        ANGLE_CAPTURE(VertexAttribL1d, isCallValid, context, index, x);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribL1dv(GLuint index, const GLdouble *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribL1dv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateVertexAttribL1dv(context, index, v));
+        if (isCallValid)
+        {
+            context->vertexAttribL1dv(index, v);
+        }
+        ANGLE_CAPTURE(VertexAttribL1dv, isCallValid, context, index, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribL2d(GLuint index, GLdouble x, GLdouble y)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribL2d, "context = %d, index = %u, x = %f, y = %f", CID(context),
+          index, x, y);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateVertexAttribL2d(context, index, x, y));
+        if (isCallValid)
+        {
+            context->vertexAttribL2d(index, x, y);
+        }
+        ANGLE_CAPTURE(VertexAttribL2d, isCallValid, context, index, x, y);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribL2dv(GLuint index, const GLdouble *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribL2dv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateVertexAttribL2dv(context, index, v));
+        if (isCallValid)
+        {
+            context->vertexAttribL2dv(index, v);
+        }
+        ANGLE_CAPTURE(VertexAttribL2dv, isCallValid, context, index, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribL3d, "context = %d, index = %u, x = %f, y = %f, z = %f",
+          CID(context), index, x, y, z);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateVertexAttribL3d(context, index, x, y, z));
+        if (isCallValid)
+        {
+            context->vertexAttribL3d(index, x, y, z);
+        }
+        ANGLE_CAPTURE(VertexAttribL3d, isCallValid, context, index, x, y, z);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribL3dv(GLuint index, const GLdouble *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribL3dv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateVertexAttribL3dv(context, index, v));
+        if (isCallValid)
+        {
+            context->vertexAttribL3dv(index, v);
+        }
+        ANGLE_CAPTURE(VertexAttribL3dv, isCallValid, context, index, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribL4d, "context = %d, index = %u, x = %f, y = %f, z = %f, w = %f",
+          CID(context), index, x, y, z, w);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateVertexAttribL4d(context, index, x, y, z, w));
+        if (isCallValid)
+        {
+            context->vertexAttribL4d(index, x, y, z, w);
+        }
+        ANGLE_CAPTURE(VertexAttribL4d, isCallValid, context, index, x, y, z, w);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribL4dv(GLuint index, const GLdouble *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribL4dv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateVertexAttribL4dv(context, index, v));
+        if (isCallValid)
+        {
+            context->vertexAttribL4dv(index, v);
+        }
+        ANGLE_CAPTURE(VertexAttribL4dv, isCallValid, context, index, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY
+VertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribLPointer,
+          "context = %d, index = %u, size = %d, type = %s, stride = %d, pointer = 0x%016" PRIxPTR
+          "",
+          CID(context), index, size, GLenumToString(GLenumGroup::VertexAttribPointerType, type),
+          stride, (uintptr_t)pointer);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateVertexAttribLPointer(context, index, size, type, stride, pointer));
+        if (isCallValid)
+        {
+            context->vertexAttribLPointer(index, size, type, stride, pointer);
+        }
+        ANGLE_CAPTURE(VertexAttribLPointer, isCallValid, context, index, size, type, stride,
+                      pointer);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ViewportArrayv(GLuint first, GLsizei count, const GLfloat *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLViewportArrayv, "context = %d, first = %u, count = %d, v = 0x%016" PRIxPTR "",
+          CID(context), first, count, (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateViewportArrayv(context, first, count, v));
+        if (isCallValid)
+        {
+            context->viewportArrayv(first, count, v);
+        }
+        ANGLE_CAPTURE(ViewportArrayv, isCallValid, context, first, count, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLViewportIndexedf, "context = %d, index = %u, x = %f, y = %f, w = %f, h = %f",
+          CID(context), index, x, y, w, h);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateViewportIndexedf(context, index, x, y, w, h));
+        if (isCallValid)
+        {
+            context->viewportIndexedf(index, x, y, w, h);
+        }
+        ANGLE_CAPTURE(ViewportIndexedf, isCallValid, context, index, x, y, w, h);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ViewportIndexedfv(GLuint index, const GLfloat *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLViewportIndexedfv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateViewportIndexedfv(context, index, v));
+        if (isCallValid)
+        {
+            context->viewportIndexedfv(index, v);
+        }
+        ANGLE_CAPTURE(ViewportIndexedfv, isCallValid, context, index, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+// GL 4.2
+void GL_APIENTRY BindImageTexture(GLuint unit,
+                                  GLuint texture,
+                                  GLint level,
+                                  GLboolean layered,
+                                  GLint layer,
+                                  GLenum access,
+                                  GLenum format)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLBindImageTexture,
+          "context = %d, unit = %u, texture = %u, level = %d, layered = %s, layer = %d, access = "
+          "%s, format = %s",
+          CID(context), unit, texture, level, GLbooleanToString(layered), layer,
+          GLenumToString(GLenumGroup::BufferAccessARB, access),
+          GLenumToString(GLenumGroup::InternalFormat, format));
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateBindImageTexture(context, unit, texturePacked, level, layered,
+                                                     layer, access, format));
+        if (isCallValid)
+        {
+            context->bindImageTexture(unit, texturePacked, level, layered, layer, access, format);
+        }
+        ANGLE_CAPTURE(BindImageTexture, isCallValid, context, unit, texturePacked, level, layered,
+                      layer, access, format);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DrawArraysInstancedBaseInstance(GLenum mode,
+                                                 GLint first,
+                                                 GLsizei count,
+                                                 GLsizei instancecount,
+                                                 GLuint baseinstance)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDrawArraysInstancedBaseInstance,
+          "context = %d, mode = %s, first = %d, count = %d, instancecount = %d, baseinstance = %u",
+          CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), first, count,
+          instancecount, baseinstance);
+
+    if (context)
+    {
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateDrawArraysInstancedBaseInstance(
+                                context, modePacked, first, count, instancecount, baseinstance));
+        if (isCallValid)
+        {
+            context->drawArraysInstancedBaseInstance(modePacked, first, count, instancecount,
+                                                     baseinstance);
+        }
+        ANGLE_CAPTURE(DrawArraysInstancedBaseInstance, isCallValid, context, modePacked, first,
+                      count, instancecount, baseinstance);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DrawElementsInstancedBaseInstance(GLenum mode,
+                                                   GLsizei count,
+                                                   GLenum type,
+                                                   const void *indices,
+                                                   GLsizei instancecount,
+                                                   GLuint baseinstance)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDrawElementsInstancedBaseInstance,
+          "context = %d, mode = %s, count = %d, type = %s, indices = 0x%016" PRIxPTR
+          ", instancecount = %d, baseinstance = %u",
+          CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), count,
+          GLenumToString(GLenumGroup::PrimitiveType, type), (uintptr_t)indices, instancecount,
+          baseinstance);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateDrawElementsInstancedBaseInstance(
+                                context, mode, count, type, indices, instancecount, baseinstance));
+        if (isCallValid)
+        {
+            context->drawElementsInstancedBaseInstance(mode, count, type, indices, instancecount,
+                                                       baseinstance);
+        }
+        ANGLE_CAPTURE(DrawElementsInstancedBaseInstance, isCallValid, context, mode, count, type,
+                      indices, instancecount, baseinstance);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DrawElementsInstancedBaseVertexBaseInstance(GLenum mode,
+                                                             GLsizei count,
+                                                             GLenum type,
+                                                             const void *indices,
+                                                             GLsizei instancecount,
+                                                             GLint basevertex,
+                                                             GLuint baseinstance)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDrawElementsInstancedBaseVertexBaseInstance,
+          "context = %d, mode = %s, count = %d, type = %s, indices = 0x%016" PRIxPTR
+          ", instancecount = %d, basevertex = %d, baseinstance = %u",
+          CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), count,
+          GLenumToString(GLenumGroup::PrimitiveType, type), (uintptr_t)indices, instancecount,
+          basevertex, baseinstance);
+
+    if (context)
+    {
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateDrawElementsInstancedBaseVertexBaseInstance(
+                                              context, modePacked, count, typePacked, indices,
+                                              instancecount, basevertex, baseinstance));
+        if (isCallValid)
+        {
+            context->drawElementsInstancedBaseVertexBaseInstance(
+                modePacked, count, typePacked, indices, instancecount, basevertex, baseinstance);
+        }
+        ANGLE_CAPTURE(DrawElementsInstancedBaseVertexBaseInstance, isCallValid, context, modePacked,
+                      count, typePacked, indices, instancecount, basevertex, baseinstance);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DrawTransformFeedbackInstanced(GLenum mode, GLuint id, GLsizei instancecount)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDrawTransformFeedbackInstanced,
+          "context = %d, mode = %s, id = %u, instancecount = %d", CID(context),
+          GLenumToString(GLenumGroup::PrimitiveType, mode), id, instancecount);
+
+    if (context)
+    {
+        TransformFeedbackID idPacked                          = PackParam<TransformFeedbackID>(id);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateDrawTransformFeedbackInstanced(context, mode, idPacked, instancecount));
+        if (isCallValid)
+        {
+            context->drawTransformFeedbackInstanced(mode, idPacked, instancecount);
+        }
+        ANGLE_CAPTURE(DrawTransformFeedbackInstanced, isCallValid, context, mode, idPacked,
+                      instancecount);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DrawTransformFeedbackStreamInstanced(GLenum mode,
+                                                      GLuint id,
+                                                      GLuint stream,
+                                                      GLsizei instancecount)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDrawTransformFeedbackStreamInstanced,
+          "context = %d, mode = %s, id = %u, stream = %u, instancecount = %d", CID(context),
+          GLenumToString(GLenumGroup::PrimitiveType, mode), id, stream, instancecount);
+
+    if (context)
+    {
+        TransformFeedbackID idPacked                          = PackParam<TransformFeedbackID>(id);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateDrawTransformFeedbackStreamInstanced(
+                                              context, mode, idPacked, stream, instancecount));
+        if (isCallValid)
+        {
+            context->drawTransformFeedbackStreamInstanced(mode, idPacked, stream, instancecount);
+        }
+        ANGLE_CAPTURE(DrawTransformFeedbackStreamInstanced, isCallValid, context, mode, idPacked,
+                      stream, instancecount);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetActiveAtomicCounterBufferiv(GLuint program,
+                                                GLuint bufferIndex,
+                                                GLenum pname,
+                                                GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetActiveAtomicCounterBufferiv,
+          "context = %d, program = %u, bufferIndex = %u, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), program, bufferIndex,
+          GLenumToString(GLenumGroup::AtomicCounterBufferPName, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGetActiveAtomicCounterBufferiv(
+                                              context, programPacked, bufferIndex, pname, params));
+        if (isCallValid)
+        {
+            context->getActiveAtomicCounterBufferiv(programPacked, bufferIndex, pname, params);
+        }
+        ANGLE_CAPTURE(GetActiveAtomicCounterBufferiv, isCallValid, context, programPacked,
+                      bufferIndex, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetInternalformativ(GLenum target,
+                                     GLenum internalformat,
+                                     GLenum pname,
+                                     GLsizei bufSize,
+                                     GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetInternalformativ,
+          "context = %d, target = %s, internalformat = %s, pname = %s, bufSize = %d, params = "
+          "0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target),
+          GLenumToString(GLenumGroup::InternalFormat, internalformat),
+          GLenumToString(GLenumGroup::InternalFormatPName, pname), bufSize, (uintptr_t)params);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetInternalformativ(context, target, internalformat, pname, bufSize, params));
+        if (isCallValid)
+        {
+            context->getInternalformativ(target, internalformat, pname, bufSize, params);
+        }
+        ANGLE_CAPTURE(GetInternalformativ, isCallValid, context, target, internalformat, pname,
+                      bufSize, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MemoryBarrier(GLbitfield barriers)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMemoryBarrier, "context = %d, barriers = %s", CID(context),
+          GLbitfieldToString(GLenumGroup::MemoryBarrierMask, barriers).c_str());
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateMemoryBarrier(context, barriers));
+        if (isCallValid)
+        {
+            context->memoryBarrier(barriers);
+        }
+        ANGLE_CAPTURE(MemoryBarrier, isCallValid, context, barriers);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexStorage1D,
+          "context = %d, target = %s, levels = %d, internalformat = %s, width = %d", CID(context),
+          GLenumToString(GLenumGroup::TextureTarget, target), levels,
+          GLenumToString(GLenumGroup::InternalFormat, internalformat), width);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateTexStorage1D(context, target, levels, internalformat, width));
+        if (isCallValid)
+        {
+            context->texStorage1D(target, levels, internalformat, width);
+        }
+        ANGLE_CAPTURE(TexStorage1D, isCallValid, context, target, levels, internalformat, width);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY
+TexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexStorage2D,
+          "context = %d, target = %s, levels = %d, internalformat = %s, width = %d, height = %d",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), levels,
+          GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height);
+
+    if (context)
+    {
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateTexStorage2D(context, targetPacked, levels, internalformat, width, height));
+        if (isCallValid)
+        {
+            context->texStorage2D(targetPacked, levels, internalformat, width, height);
+        }
+        ANGLE_CAPTURE(TexStorage2D, isCallValid, context, targetPacked, levels, internalformat,
+                      width, height);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexStorage3D(GLenum target,
+                              GLsizei levels,
+                              GLenum internalformat,
+                              GLsizei width,
+                              GLsizei height,
+                              GLsizei depth)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexStorage3D,
+          "context = %d, target = %s, levels = %d, internalformat = %s, width = %d, height = %d, "
+          "depth = %d",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), levels,
+          GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height, depth);
+
+    if (context)
+    {
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateTexStorage3D(context, targetPacked, levels, internalformat,
+                                                 width, height, depth));
+        if (isCallValid)
+        {
+            context->texStorage3D(targetPacked, levels, internalformat, width, height, depth);
+        }
+        ANGLE_CAPTURE(TexStorage3D, isCallValid, context, targetPacked, levels, internalformat,
+                      width, height, depth);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+// GL 4.3
+void GL_APIENTRY BindVertexBuffer(GLuint bindingindex,
+                                  GLuint buffer,
+                                  GLintptr offset,
+                                  GLsizei stride)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLBindVertexBuffer,
+          "context = %d, bindingindex = %u, buffer = %u, offset = %llu, stride = %d", CID(context),
+          bindingindex, buffer, static_cast<unsigned long long>(offset), stride);
+
+    if (context)
+    {
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateBindVertexBuffer(context, bindingindex, bufferPacked, offset, stride));
+        if (isCallValid)
+        {
+            context->bindVertexBuffer(bindingindex, bufferPacked, offset, stride);
+        }
+        ANGLE_CAPTURE(BindVertexBuffer, isCallValid, context, bindingindex, bufferPacked, offset,
+                      stride);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY
+ClearBufferData(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLClearBufferData,
+          "context = %d, target = %s, internalformat = %s, format = %s, type = %s, data = "
+          "0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::BufferStorageTarget, target),
+          GLenumToString(GLenumGroup::InternalFormat, internalformat),
+          GLenumToString(GLenumGroup::PixelFormat, format),
+          GLenumToString(GLenumGroup::PixelType, type), (uintptr_t)data);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateClearBufferData(context, target, internalformat, format, type, data));
+        if (isCallValid)
+        {
+            context->clearBufferData(target, internalformat, format, type, data);
+        }
+        ANGLE_CAPTURE(ClearBufferData, isCallValid, context, target, internalformat, format, type,
+                      data);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ClearBufferSubData(GLenum target,
+                                    GLenum internalformat,
+                                    GLintptr offset,
+                                    GLsizeiptr size,
+                                    GLenum format,
+                                    GLenum type,
+                                    const void *data)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLClearBufferSubData,
+          "context = %d, target = %s, internalformat = %s, offset = %llu, size = %llu, format = "
+          "%s, type = %s, data = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::DefaultGroup, target),
+          GLenumToString(GLenumGroup::InternalFormat, internalformat),
+          static_cast<unsigned long long>(offset), static_cast<unsigned long long>(size),
+          GLenumToString(GLenumGroup::PixelFormat, format),
+          GLenumToString(GLenumGroup::PixelType, type), (uintptr_t)data);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateClearBufferSubData(context, target, internalformat, offset,
+                                                       size, format, type, data));
+        if (isCallValid)
+        {
+            context->clearBufferSubData(target, internalformat, offset, size, format, type, data);
+        }
+        ANGLE_CAPTURE(ClearBufferSubData, isCallValid, context, target, internalformat, offset,
+                      size, format, type, data);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY CopyImageSubData(GLuint srcName,
+                                  GLenum srcTarget,
+                                  GLint srcLevel,
+                                  GLint srcX,
+                                  GLint srcY,
+                                  GLint srcZ,
+                                  GLuint dstName,
+                                  GLenum dstTarget,
+                                  GLint dstLevel,
+                                  GLint dstX,
+                                  GLint dstY,
+                                  GLint dstZ,
+                                  GLsizei srcWidth,
+                                  GLsizei srcHeight,
+                                  GLsizei srcDepth)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLCopyImageSubData,
+          "context = %d, srcName = %u, srcTarget = %s, srcLevel = %d, srcX = %d, srcY = %d, srcZ = "
+          "%d, dstName = %u, dstTarget = %s, dstLevel = %d, dstX = %d, dstY = %d, dstZ = %d, "
+          "srcWidth = %d, srcHeight = %d, srcDepth = %d",
+          CID(context), srcName, GLenumToString(GLenumGroup::CopyBufferSubDataTarget, srcTarget),
+          srcLevel, srcX, srcY, srcZ, dstName,
+          GLenumToString(GLenumGroup::CopyBufferSubDataTarget, dstTarget), dstLevel, dstX, dstY,
+          dstZ, srcWidth, srcHeight, srcDepth);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateCopyImageSubData(context, srcName, srcTarget, srcLevel, srcX,
+                                                     srcY, srcZ, dstName, dstTarget, dstLevel, dstX,
+                                                     dstY, dstZ, srcWidth, srcHeight, srcDepth));
+        if (isCallValid)
+        {
+            context->copyImageSubData(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName,
+                                      dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight,
+                                      srcDepth);
+        }
+        ANGLE_CAPTURE(CopyImageSubData, isCallValid, context, srcName, srcTarget, srcLevel, srcX,
+                      srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth,
+                      srcHeight, srcDepth);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DebugMessageCallback(GLDEBUGPROC callback, const void *userParam)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDebugMessageCallback,
+          "context = %d, callback = 0x%016" PRIxPTR ", userParam = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)callback, (uintptr_t)userParam);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateDebugMessageCallback(context, callback, userParam));
+        if (isCallValid)
+        {
+            context->debugMessageCallback(callback, userParam);
+        }
+        ANGLE_CAPTURE(DebugMessageCallback, isCallValid, context, callback, userParam);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DebugMessageControl(GLenum source,
+                                     GLenum type,
+                                     GLenum severity,
+                                     GLsizei count,
+                                     const GLuint *ids,
+                                     GLboolean enabled)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDebugMessageControl,
+          "context = %d, source = %s, type = %s, severity = %s, count = %d, ids = 0x%016" PRIxPTR
+          ", enabled = %s",
+          CID(context), GLenumToString(GLenumGroup::DebugSource, source),
+          GLenumToString(GLenumGroup::DebugType, type),
+          GLenumToString(GLenumGroup::DebugSeverity, severity), count, (uintptr_t)ids,
+          GLbooleanToString(enabled));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateDebugMessageControl(context, source, type, severity, count, ids, enabled));
+        if (isCallValid)
+        {
+            context->debugMessageControl(source, type, severity, count, ids, enabled);
+        }
+        ANGLE_CAPTURE(DebugMessageControl, isCallValid, context, source, type, severity, count, ids,
+                      enabled);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DebugMessageInsert(GLenum source,
+                                    GLenum type,
+                                    GLuint id,
+                                    GLenum severity,
+                                    GLsizei length,
+                                    const GLchar *buf)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDebugMessageInsert,
+          "context = %d, source = %s, type = %s, id = %u, severity = %s, length = %d, buf = "
+          "0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::DebugSource, source),
+          GLenumToString(GLenumGroup::DebugType, type), id,
+          GLenumToString(GLenumGroup::DebugSeverity, severity), length, (uintptr_t)buf);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateDebugMessageInsert(context, source, type, id, severity, length, buf));
+        if (isCallValid)
+        {
+            context->debugMessageInsert(source, type, id, severity, length, buf);
+        }
+        ANGLE_CAPTURE(DebugMessageInsert, isCallValid, context, source, type, id, severity, length,
+                      buf);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DispatchCompute(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDispatchCompute,
+          "context = %d, num_groups_x = %u, num_groups_y = %u, num_groups_z = %u", CID(context),
+          num_groups_x, num_groups_y, num_groups_z);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateDispatchCompute(context, num_groups_x, num_groups_y, num_groups_z));
+        if (isCallValid)
+        {
+            context->dispatchCompute(num_groups_x, num_groups_y, num_groups_z);
+        }
+        ANGLE_CAPTURE(DispatchCompute, isCallValid, context, num_groups_x, num_groups_y,
+                      num_groups_z);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DispatchComputeIndirect(GLintptr indirect)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDispatchComputeIndirect, "context = %d, indirect = %llu", CID(context),
+          static_cast<unsigned long long>(indirect));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateDispatchComputeIndirect(context, indirect));
+        if (isCallValid)
+        {
+            context->dispatchComputeIndirect(indirect);
+        }
+        ANGLE_CAPTURE(DispatchComputeIndirect, isCallValid, context, indirect);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY FramebufferParameteri(GLenum target, GLenum pname, GLint param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLFramebufferParameteri, "context = %d, target = %s, pname = %s, param = %d",
+          CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target),
+          GLenumToString(GLenumGroup::FramebufferParameterName, pname), param);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateFramebufferParameteri(context, target, pname, param));
+        if (isCallValid)
+        {
+            context->framebufferParameteri(target, pname, param);
+        }
+        ANGLE_CAPTURE(FramebufferParameteri, isCallValid, context, target, pname, param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+GLuint GL_APIENTRY GetDebugMessageLog(GLuint count,
+                                      GLsizei bufSize,
+                                      GLenum *sources,
+                                      GLenum *types,
+                                      GLuint *ids,
+                                      GLenum *severities,
+                                      GLsizei *lengths,
+                                      GLchar *messageLog)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetDebugMessageLog,
+          "context = %d, count = %u, bufSize = %d, sources = 0x%016" PRIxPTR
+          ", types = 0x%016" PRIxPTR ", ids = 0x%016" PRIxPTR ", severities = 0x%016" PRIxPTR
+          ", lengths = 0x%016" PRIxPTR ", messageLog = 0x%016" PRIxPTR "",
+          CID(context), count, bufSize, (uintptr_t)sources, (uintptr_t)types, (uintptr_t)ids,
+          (uintptr_t)severities, (uintptr_t)lengths, (uintptr_t)messageLog);
+
+    GLuint returnValue;
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetDebugMessageLog(context, count, bufSize, sources, types, ids,
+                                                       severities, lengths, messageLog));
+        if (isCallValid)
+        {
+            returnValue = context->getDebugMessageLog(count, bufSize, sources, types, ids,
+                                                      severities, lengths, messageLog);
+        }
+        else
+        {
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetDebugMessageLog, GLuint>();
+        }
+        ANGLE_CAPTURE(GetDebugMessageLog, isCallValid, context, count, bufSize, sources, types, ids,
+                      severities, lengths, messageLog, returnValue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetDebugMessageLog, GLuint>();
+    }
+    return returnValue;
+}
+
+void GL_APIENTRY GetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetFramebufferParameteriv,
+          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::FramebufferTarget, target),
+          GLenumToString(GLenumGroup::FramebufferAttachmentParameterName, pname),
+          (uintptr_t)params);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetFramebufferParameteriv(context, target, pname, params));
+        if (isCallValid)
+        {
+            context->getFramebufferParameteriv(target, pname, params);
+        }
+        ANGLE_CAPTURE(GetFramebufferParameteriv, isCallValid, context, target, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetInternalformati64v(GLenum target,
+                                       GLenum internalformat,
+                                       GLenum pname,
+                                       GLsizei bufSize,
+                                       GLint64 *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetInternalformati64v,
+          "context = %d, target = %s, internalformat = %s, pname = %s, bufSize = %d, params = "
+          "0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target),
+          GLenumToString(GLenumGroup::InternalFormat, internalformat),
+          GLenumToString(GLenumGroup::InternalFormatPName, pname), bufSize, (uintptr_t)params);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetInternalformati64v(context, target, internalformat, pname,
+                                                          bufSize, params));
+        if (isCallValid)
+        {
+            context->getInternalformati64v(target, internalformat, pname, bufSize, params);
+        }
+        ANGLE_CAPTURE(GetInternalformati64v, isCallValid, context, target, internalformat, pname,
+                      bufSize, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY
+GetObjectLabel(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetObjectLabel,
+          "context = %d, identifier = %s, name = %u, bufSize = %d, length = 0x%016" PRIxPTR
+          ", label = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::DefaultGroup, identifier), name, bufSize,
+          (uintptr_t)length, (uintptr_t)label);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetObjectLabel(context, identifier, name, bufSize, length, label));
+        if (isCallValid)
+        {
+            context->getObjectLabel(identifier, name, bufSize, length, label);
+        }
+        ANGLE_CAPTURE(GetObjectLabel, isCallValid, context, identifier, name, bufSize, length,
+                      label);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetObjectPtrLabel(const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetObjectPtrLabel,
+          "context = %d, ptr = 0x%016" PRIxPTR ", bufSize = %d, length = 0x%016" PRIxPTR
+          ", label = 0x%016" PRIxPTR "",
+          CID(context), (uintptr_t)ptr, bufSize, (uintptr_t)length, (uintptr_t)label);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetObjectPtrLabel(context, ptr, bufSize, length, label));
+        if (isCallValid)
+        {
+            context->getObjectPtrLabel(ptr, bufSize, length, label);
+        }
+        ANGLE_CAPTURE(GetObjectPtrLabel, isCallValid, context, ptr, bufSize, length, label);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetProgramInterfaceiv(GLuint program,
+                                       GLenum programInterface,
+                                       GLenum pname,
+                                       GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetProgramInterfaceiv,
+          "context = %d, program = %u, programInterface = %s, pname = %s, params = 0x%016" PRIxPTR
+          "",
+          CID(context), program, GLenumToString(GLenumGroup::ProgramInterface, programInterface),
+          GLenumToString(GLenumGroup::ProgramInterfacePName, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetProgramInterfaceiv(context, programPacked, programInterface,
+                                                          pname, params));
+        if (isCallValid)
+        {
+            context->getProgramInterfaceiv(programPacked, programInterface, pname, params);
+        }
+        ANGLE_CAPTURE(GetProgramInterfaceiv, isCallValid, context, programPacked, programInterface,
+                      pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+GLuint GL_APIENTRY GetProgramResourceIndex(GLuint program,
+                                           GLenum programInterface,
+                                           const GLchar *name)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetProgramResourceIndex,
+          "context = %d, program = %u, programInterface = %s, name = 0x%016" PRIxPTR "",
+          CID(context), program, GLenumToString(GLenumGroup::ProgramInterface, programInterface),
+          (uintptr_t)name);
+
+    GLuint returnValue;
+    if (context)
+    {
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetProgramResourceIndex(context, programPacked, programInterface, name));
+        if (isCallValid)
+        {
+            returnValue = context->getProgramResourceIndex(programPacked, programInterface, name);
+        }
+        else
+        {
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLGetProgramResourceIndex, GLuint>();
+        }
+        ANGLE_CAPTURE(GetProgramResourceIndex, isCallValid, context, programPacked,
+                      programInterface, name, returnValue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetProgramResourceIndex, GLuint>();
+    }
+    return returnValue;
+}
+
+GLint GL_APIENTRY GetProgramResourceLocation(GLuint program,
+                                             GLenum programInterface,
+                                             const GLchar *name)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetProgramResourceLocation,
+          "context = %d, program = %u, programInterface = %s, name = 0x%016" PRIxPTR "",
+          CID(context), program, GLenumToString(GLenumGroup::ProgramInterface, programInterface),
+          (uintptr_t)name);
+
+    GLint returnValue;
+    if (context)
+    {
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetProgramResourceLocation(context, programPacked, programInterface, name));
+        if (isCallValid)
+        {
+            returnValue =
+                context->getProgramResourceLocation(programPacked, programInterface, name);
+        }
+        else
+        {
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLGetProgramResourceLocation, GLint>();
+        }
+        ANGLE_CAPTURE(GetProgramResourceLocation, isCallValid, context, programPacked,
+                      programInterface, name, returnValue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+        returnValue =
+            GetDefaultReturnValue<angle::EntryPoint::GLGetProgramResourceLocation, GLint>();
+    }
+    return returnValue;
+}
+
+GLint GL_APIENTRY GetProgramResourceLocationIndex(GLuint program,
+                                                  GLenum programInterface,
+                                                  const GLchar *name)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetProgramResourceLocationIndex,
+          "context = %d, program = %u, programInterface = %s, name = 0x%016" PRIxPTR "",
+          CID(context), program, GLenumToString(GLenumGroup::ProgramInterface, programInterface),
+          (uintptr_t)name);
+
+    GLint returnValue;
+    if (context)
+    {
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGetProgramResourceLocationIndex(
+                                              context, programPacked, programInterface, name));
+        if (isCallValid)
+        {
+            returnValue =
+                context->getProgramResourceLocationIndex(programPacked, programInterface, name);
+        }
+        else
+        {
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLGetProgramResourceLocationIndex,
+                                      GLint>();
+        }
+        ANGLE_CAPTURE(GetProgramResourceLocationIndex, isCallValid, context, programPacked,
+                      programInterface, name, returnValue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+        returnValue =
+            GetDefaultReturnValue<angle::EntryPoint::GLGetProgramResourceLocationIndex, GLint>();
+    }
+    return returnValue;
+}
+
+void GL_APIENTRY GetProgramResourceName(GLuint program,
+                                        GLenum programInterface,
+                                        GLuint index,
+                                        GLsizei bufSize,
+                                        GLsizei *length,
+                                        GLchar *name)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetProgramResourceName,
+          "context = %d, program = %u, programInterface = %s, index = %u, bufSize = %d, length = "
+          "0x%016" PRIxPTR ", name = 0x%016" PRIxPTR "",
+          CID(context), program, GLenumToString(GLenumGroup::ProgramInterface, programInterface),
+          index, bufSize, (uintptr_t)length, (uintptr_t)name);
+
+    if (context)
+    {
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetProgramResourceName(context, programPacked, programInterface,
+                                                           index, bufSize, length, name));
+        if (isCallValid)
+        {
+            context->getProgramResourceName(programPacked, programInterface, index, bufSize, length,
+                                            name);
+        }
+        ANGLE_CAPTURE(GetProgramResourceName, isCallValid, context, programPacked, programInterface,
+                      index, bufSize, length, name);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetProgramResourceiv(GLuint program,
+                                      GLenum programInterface,
+                                      GLuint index,
+                                      GLsizei propCount,
+                                      const GLenum *props,
+                                      GLsizei bufSize,
+                                      GLsizei *length,
+                                      GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetProgramResourceiv,
+          "context = %d, program = %u, programInterface = %s, index = %u, propCount = %d, props = "
+          "0x%016" PRIxPTR ", bufSize = %d, length = 0x%016" PRIxPTR ", params = 0x%016" PRIxPTR "",
+          CID(context), program, GLenumToString(GLenumGroup::ProgramInterface, programInterface),
+          index, propCount, (uintptr_t)props, bufSize, (uintptr_t)length, (uintptr_t)params);
+
+    if (context)
+    {
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetProgramResourceiv(context, programPacked, programInterface, index,
+                                          propCount, props, bufSize, length, params));
+        if (isCallValid)
+        {
+            context->getProgramResourceiv(programPacked, programInterface, index, propCount, props,
+                                          bufSize, length, params);
+        }
+        ANGLE_CAPTURE(GetProgramResourceiv, isCallValid, context, programPacked, programInterface,
+                      index, propCount, props, bufSize, length, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY InvalidateBufferData(GLuint buffer)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLInvalidateBufferData, "context = %d, buffer = %u", CID(context), buffer);
+
+    if (context)
+    {
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateInvalidateBufferData(context, bufferPacked));
+        if (isCallValid)
+        {
+            context->invalidateBufferData(bufferPacked);
+        }
+        ANGLE_CAPTURE(InvalidateBufferData, isCallValid, context, bufferPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY InvalidateBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr length)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLInvalidateBufferSubData,
+          "context = %d, buffer = %u, offset = %llu, length = %llu", CID(context), buffer,
+          static_cast<unsigned long long>(offset), static_cast<unsigned long long>(length));
+
+    if (context)
+    {
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateInvalidateBufferSubData(context, bufferPacked, offset, length));
+        if (isCallValid)
+        {
+            context->invalidateBufferSubData(bufferPacked, offset, length);
+        }
+        ANGLE_CAPTURE(InvalidateBufferSubData, isCallValid, context, bufferPacked, offset, length);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY InvalidateFramebuffer(GLenum target,
+                                       GLsizei numAttachments,
+                                       const GLenum *attachments)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLInvalidateFramebuffer,
+          "context = %d, target = %s, numAttachments = %d, attachments = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target), numAttachments,
+          (uintptr_t)attachments);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateInvalidateFramebuffer(context, target, numAttachments, attachments));
+        if (isCallValid)
+        {
+            context->invalidateFramebuffer(target, numAttachments, attachments);
+        }
+        ANGLE_CAPTURE(InvalidateFramebuffer, isCallValid, context, target, numAttachments,
+                      attachments);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY InvalidateSubFramebuffer(GLenum target,
+                                          GLsizei numAttachments,
+                                          const GLenum *attachments,
+                                          GLint x,
+                                          GLint y,
+                                          GLsizei width,
+                                          GLsizei height)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLInvalidateSubFramebuffer,
+          "context = %d, target = %s, numAttachments = %d, attachments = 0x%016" PRIxPTR
+          ", x = %d, y = %d, width = %d, height = %d",
+          CID(context), GLenumToString(GLenumGroup::DefaultGroup, target), numAttachments,
+          (uintptr_t)attachments, x, y, width, height);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateInvalidateSubFramebuffer(context, target, numAttachments,
+                                                             attachments, x, y, width, height));
+        if (isCallValid)
+        {
+            context->invalidateSubFramebuffer(target, numAttachments, attachments, x, y, width,
+                                              height);
+        }
+        ANGLE_CAPTURE(InvalidateSubFramebuffer, isCallValid, context, target, numAttachments,
+                      attachments, x, y, width, height);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY InvalidateTexImage(GLuint texture, GLint level)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLInvalidateTexImage, "context = %d, texture = %u, level = %d", CID(context),
+          texture, level);
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateInvalidateTexImage(context, texturePacked, level));
+        if (isCallValid)
+        {
+            context->invalidateTexImage(texturePacked, level);
+        }
+        ANGLE_CAPTURE(InvalidateTexImage, isCallValid, context, texturePacked, level);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY InvalidateTexSubImage(GLuint texture,
+                                       GLint level,
+                                       GLint xoffset,
+                                       GLint yoffset,
+                                       GLint zoffset,
+                                       GLsizei width,
+                                       GLsizei height,
+                                       GLsizei depth)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLInvalidateTexSubImage,
+          "context = %d, texture = %u, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, width "
+          "= %d, height = %d, depth = %d",
+          CID(context), texture, level, xoffset, yoffset, zoffset, width, height, depth);
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateInvalidateTexSubImage(context, texturePacked, level, xoffset,
+                                                          yoffset, zoffset, width, height, depth));
+        if (isCallValid)
+        {
+            context->invalidateTexSubImage(texturePacked, level, xoffset, yoffset, zoffset, width,
+                                           height, depth);
+        }
+        ANGLE_CAPTURE(InvalidateTexSubImage, isCallValid, context, texturePacked, level, xoffset,
+                      yoffset, zoffset, width, height, depth);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiDrawArraysIndirect(GLenum mode,
+                                         const void *indirect,
+                                         GLsizei drawcount,
+                                         GLsizei stride)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiDrawArraysIndirect,
+          "context = %d, mode = %s, indirect = 0x%016" PRIxPTR ", drawcount = %d, stride = %d",
+          CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), (uintptr_t)indirect,
+          drawcount, stride);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateMultiDrawArraysIndirect(context, mode, indirect, drawcount, stride));
+        if (isCallValid)
+        {
+            context->multiDrawArraysIndirect(mode, indirect, drawcount, stride);
+        }
+        ANGLE_CAPTURE(MultiDrawArraysIndirect, isCallValid, context, mode, indirect, drawcount,
+                      stride);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiDrawElementsIndirect(GLenum mode,
+                                           GLenum type,
+                                           const void *indirect,
+                                           GLsizei drawcount,
+                                           GLsizei stride)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiDrawElementsIndirect,
+          "context = %d, mode = %s, type = %s, indirect = 0x%016" PRIxPTR
+          ", drawcount = %d, stride = %d",
+          CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode),
+          GLenumToString(GLenumGroup::DrawElementsType, type), (uintptr_t)indirect, drawcount,
+          stride);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateMultiDrawElementsIndirect(context, mode, type, indirect, drawcount, stride));
+        if (isCallValid)
+        {
+            context->multiDrawElementsIndirect(mode, type, indirect, drawcount, stride);
+        }
+        ANGLE_CAPTURE(MultiDrawElementsIndirect, isCallValid, context, mode, type, indirect,
+                      drawcount, stride);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ObjectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLObjectLabel,
+          "context = %d, identifier = %s, name = %u, length = %d, label = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::ObjectIdentifier, identifier), name, length,
+          (uintptr_t)label);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateObjectLabel(context, identifier, name, length, label));
+        if (isCallValid)
+        {
+            context->objectLabel(identifier, name, length, label);
+        }
+        ANGLE_CAPTURE(ObjectLabel, isCallValid, context, identifier, name, length, label);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ObjectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLObjectPtrLabel,
+          "context = %d, ptr = 0x%016" PRIxPTR ", length = %d, label = 0x%016" PRIxPTR "",
+          CID(context), (uintptr_t)ptr, length, (uintptr_t)label);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateObjectPtrLabel(context, ptr, length, label));
+        if (isCallValid)
+        {
+            context->objectPtrLabel(ptr, length, label);
+        }
+        ANGLE_CAPTURE(ObjectPtrLabel, isCallValid, context, ptr, length, label);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY PopDebugGroup()
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLPopDebugGroup, "context = %d", CID(context));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidatePopDebugGroup(context));
+        if (isCallValid)
+        {
+            context->popDebugGroup();
+        }
+        ANGLE_CAPTURE(PopDebugGroup, isCallValid, context);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY PushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLPushDebugGroup,
+          "context = %d, source = %s, id = %u, length = %d, message = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::DebugSource, source), id, length,
+          (uintptr_t)message);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidatePushDebugGroup(context, source, id, length, message));
+        if (isCallValid)
+        {
+            context->pushDebugGroup(source, id, length, message);
+        }
+        ANGLE_CAPTURE(PushDebugGroup, isCallValid, context, source, id, length, message);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ShaderStorageBlockBinding(GLuint program,
+                                           GLuint storageBlockIndex,
+                                           GLuint storageBlockBinding)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLShaderStorageBlockBinding,
+          "context = %d, program = %u, storageBlockIndex = %u, storageBlockBinding = %u",
+          CID(context), program, storageBlockIndex, storageBlockBinding);
+
+    if (context)
+    {
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateShaderStorageBlockBinding(
+                                context, programPacked, storageBlockIndex, storageBlockBinding));
+        if (isCallValid)
+        {
+            context->shaderStorageBlockBinding(programPacked, storageBlockIndex,
+                                               storageBlockBinding);
+        }
+        ANGLE_CAPTURE(ShaderStorageBlockBinding, isCallValid, context, programPacked,
+                      storageBlockIndex, storageBlockBinding);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexBufferRange(GLenum target,
+                                GLenum internalformat,
+                                GLuint buffer,
+                                GLintptr offset,
+                                GLsizeiptr size)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexBufferRange,
+          "context = %d, target = %s, internalformat = %s, buffer = %u, offset = %llu, size = %llu",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target),
+          GLenumToString(GLenumGroup::InternalFormat, internalformat), buffer,
+          static_cast<unsigned long long>(offset), static_cast<unsigned long long>(size));
+
+    if (context)
+    {
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateTexBufferRange(context, targetPacked, internalformat,
+                                                   bufferPacked, offset, size));
+        if (isCallValid)
+        {
+            context->texBufferRange(targetPacked, internalformat, bufferPacked, offset, size);
+        }
+        ANGLE_CAPTURE(TexBufferRange, isCallValid, context, targetPacked, internalformat,
+                      bufferPacked, offset, size);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexStorage2DMultisample(GLenum target,
+                                         GLsizei samples,
+                                         GLenum internalformat,
+                                         GLsizei width,
+                                         GLsizei height,
+                                         GLboolean fixedsamplelocations)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexStorage2DMultisample,
+          "context = %d, target = %s, samples = %d, internalformat = %s, width = %d, height = %d, "
+          "fixedsamplelocations = %s",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), samples,
+          GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height,
+          GLbooleanToString(fixedsamplelocations));
+
+    if (context)
+    {
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateTexStorage2DMultisample(context, targetPacked, samples, internalformat, width,
+                                             height, fixedsamplelocations));
+        if (isCallValid)
+        {
+            context->texStorage2DMultisample(targetPacked, samples, internalformat, width, height,
+                                             fixedsamplelocations);
+        }
+        ANGLE_CAPTURE(TexStorage2DMultisample, isCallValid, context, targetPacked, samples,
+                      internalformat, width, height, fixedsamplelocations);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TexStorage3DMultisample(GLenum target,
+                                         GLsizei samples,
+                                         GLenum internalformat,
+                                         GLsizei width,
+                                         GLsizei height,
+                                         GLsizei depth,
+                                         GLboolean fixedsamplelocations)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTexStorage3DMultisample,
+          "context = %d, target = %s, samples = %d, internalformat = %s, width = %d, height = %d, "
+          "depth = %d, fixedsamplelocations = %s",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), samples,
+          GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height, depth,
+          GLbooleanToString(fixedsamplelocations));
+
+    if (context)
+    {
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateTexStorage3DMultisample(context, targetPacked, samples, internalformat, width,
+                                             height, depth, fixedsamplelocations));
+        if (isCallValid)
+        {
+            context->texStorage3DMultisample(targetPacked, samples, internalformat, width, height,
+                                             depth, fixedsamplelocations);
+        }
+        ANGLE_CAPTURE(TexStorage3DMultisample, isCallValid, context, targetPacked, samples,
+                      internalformat, width, height, depth, fixedsamplelocations);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TextureView(GLuint texture,
+                             GLenum target,
+                             GLuint origtexture,
+                             GLenum internalformat,
+                             GLuint minlevel,
+                             GLuint numlevels,
+                             GLuint minlayer,
+                             GLuint numlayers)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTextureView,
+          "context = %d, texture = %u, target = %s, origtexture = %u, internalformat = %s, "
+          "minlevel = %u, numlevels = %u, minlayer = %u, numlayers = %u",
+          CID(context), texture, GLenumToString(GLenumGroup::TextureTarget, target), origtexture,
+          GLenumToString(GLenumGroup::InternalFormat, internalformat), minlevel, numlevels,
+          minlayer, numlayers);
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateTextureView(context, texturePacked, target, origtexture, internalformat,
+                                 minlevel, numlevels, minlayer, numlayers));
+        if (isCallValid)
+        {
+            context->textureView(texturePacked, target, origtexture, internalformat, minlevel,
+                                 numlevels, minlayer, numlayers);
+        }
+        ANGLE_CAPTURE(TextureView, isCallValid, context, texturePacked, target, origtexture,
+                      internalformat, minlevel, numlevels, minlayer, numlayers);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribBinding(GLuint attribindex, GLuint bindingindex)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribBinding, "context = %d, attribindex = %u, bindingindex = %u",
+          CID(context), attribindex, bindingindex);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateVertexAttribBinding(context, attribindex, bindingindex));
+        if (isCallValid)
+        {
+            context->vertexAttribBinding(attribindex, bindingindex);
+        }
+        ANGLE_CAPTURE(VertexAttribBinding, isCallValid, context, attribindex, bindingindex);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribFormat(GLuint attribindex,
+                                    GLint size,
+                                    GLenum type,
+                                    GLboolean normalized,
+                                    GLuint relativeoffset)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribFormat,
+          "context = %d, attribindex = %u, size = %d, type = %s, normalized = %s, relativeoffset = "
+          "%u",
+          CID(context), attribindex, size, GLenumToString(GLenumGroup::DefaultGroup, type),
+          GLbooleanToString(normalized), relativeoffset);
+
+    if (context)
+    {
+        VertexAttribType typePacked                           = PackParam<VertexAttribType>(type);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateVertexAttribFormat(context, attribindex, size, typePacked,
+                                                       normalized, relativeoffset));
+        if (isCallValid)
+        {
+            context->vertexAttribFormat(attribindex, size, typePacked, normalized, relativeoffset);
+        }
+        ANGLE_CAPTURE(VertexAttribFormat, isCallValid, context, attribindex, size, typePacked,
+                      normalized, relativeoffset);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribIFormat(GLuint attribindex,
+                                     GLint size,
+                                     GLenum type,
+                                     GLuint relativeoffset)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribIFormat,
+          "context = %d, attribindex = %u, size = %d, type = %s, relativeoffset = %u", CID(context),
+          attribindex, size, GLenumToString(GLenumGroup::DefaultGroup, type), relativeoffset);
+
+    if (context)
+    {
+        VertexAttribType typePacked                           = PackParam<VertexAttribType>(type);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateVertexAttribIFormat(context, attribindex, size, typePacked, relativeoffset));
+        if (isCallValid)
+        {
+            context->vertexAttribIFormat(attribindex, size, typePacked, relativeoffset);
+        }
+        ANGLE_CAPTURE(VertexAttribIFormat, isCallValid, context, attribindex, size, typePacked,
+                      relativeoffset);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexAttribLFormat(GLuint attribindex,
+                                     GLint size,
+                                     GLenum type,
+                                     GLuint relativeoffset)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexAttribLFormat,
+          "context = %d, attribindex = %u, size = %d, type = %s, relativeoffset = %u", CID(context),
+          attribindex, size, GLenumToString(GLenumGroup::VertexAttribType, type), relativeoffset);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateVertexAttribLFormat(context, attribindex, size, type, relativeoffset));
+        if (isCallValid)
+        {
+            context->vertexAttribLFormat(attribindex, size, type, relativeoffset);
+        }
+        ANGLE_CAPTURE(VertexAttribLFormat, isCallValid, context, attribindex, size, type,
+                      relativeoffset);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexBindingDivisor(GLuint bindingindex, GLuint divisor)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexBindingDivisor, "context = %d, bindingindex = %u, divisor = %u",
+          CID(context), bindingindex, divisor);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateVertexBindingDivisor(context, bindingindex, divisor));
+        if (isCallValid)
+        {
+            context->vertexBindingDivisor(bindingindex, divisor);
+        }
+        ANGLE_CAPTURE(VertexBindingDivisor, isCallValid, context, bindingindex, divisor);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+// GL 4.4
+void GL_APIENTRY BindBuffersBase(GLenum target, GLuint first, GLsizei count, const GLuint *buffers)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLBindBuffersBase,
+          "context = %d, target = %s, first = %u, count = %d, buffers = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::BufferTargetARB, target), first, count,
+          (uintptr_t)buffers);
+
+    if (context)
+    {
+        const BufferID *buffersPacked = PackParam<const BufferID *>(buffers);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateBindBuffersBase(context, target, first, count, buffersPacked));
+        if (isCallValid)
+        {
+            context->bindBuffersBase(target, first, count, buffersPacked);
+        }
+        ANGLE_CAPTURE(BindBuffersBase, isCallValid, context, target, first, count, buffersPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY BindBuffersRange(GLenum target,
+                                  GLuint first,
+                                  GLsizei count,
+                                  const GLuint *buffers,
+                                  const GLintptr *offsets,
+                                  const GLsizeiptr *sizes)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLBindBuffersRange,
+          "context = %d, target = %s, first = %u, count = %d, buffers = 0x%016" PRIxPTR
+          ", offsets = 0x%016" PRIxPTR ", sizes = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::BufferTargetARB, target), first, count,
+          (uintptr_t)buffers, (uintptr_t)offsets, (uintptr_t)sizes);
+
+    if (context)
+    {
+        const BufferID *buffersPacked = PackParam<const BufferID *>(buffers);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateBindBuffersRange(context, target, first, count,
+                                                                   buffersPacked, offsets, sizes));
+        if (isCallValid)
+        {
+            context->bindBuffersRange(target, first, count, buffersPacked, offsets, sizes);
+        }
+        ANGLE_CAPTURE(BindBuffersRange, isCallValid, context, target, first, count, buffersPacked,
+                      offsets, sizes);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY BindImageTextures(GLuint first, GLsizei count, const GLuint *textures)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLBindImageTextures,
+          "context = %d, first = %u, count = %d, textures = 0x%016" PRIxPTR "", CID(context), first,
+          count, (uintptr_t)textures);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateBindImageTextures(context, first, count, textures));
+        if (isCallValid)
+        {
+            context->bindImageTextures(first, count, textures);
+        }
+        ANGLE_CAPTURE(BindImageTextures, isCallValid, context, first, count, textures);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY BindSamplers(GLuint first, GLsizei count, const GLuint *samplers)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLBindSamplers,
+          "context = %d, first = %u, count = %d, samplers = 0x%016" PRIxPTR "", CID(context), first,
+          count, (uintptr_t)samplers);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateBindSamplers(context, first, count, samplers));
+        if (isCallValid)
+        {
+            context->bindSamplers(first, count, samplers);
+        }
+        ANGLE_CAPTURE(BindSamplers, isCallValid, context, first, count, samplers);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY BindTextures(GLuint first, GLsizei count, const GLuint *textures)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLBindTextures,
+          "context = %d, first = %u, count = %d, textures = 0x%016" PRIxPTR "", CID(context), first,
+          count, (uintptr_t)textures);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateBindTextures(context, first, count, textures));
+        if (isCallValid)
+        {
+            context->bindTextures(first, count, textures);
+        }
+        ANGLE_CAPTURE(BindTextures, isCallValid, context, first, count, textures);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY BindVertexBuffers(GLuint first,
+                                   GLsizei count,
+                                   const GLuint *buffers,
+                                   const GLintptr *offsets,
+                                   const GLsizei *strides)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLBindVertexBuffers,
+          "context = %d, first = %u, count = %d, buffers = 0x%016" PRIxPTR
+          ", offsets = 0x%016" PRIxPTR ", strides = 0x%016" PRIxPTR "",
+          CID(context), first, count, (uintptr_t)buffers, (uintptr_t)offsets, (uintptr_t)strides);
+
+    if (context)
+    {
+        const BufferID *buffersPacked = PackParam<const BufferID *>(buffers);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateBindVertexBuffers(context, first, count, buffersPacked, offsets, strides));
+        if (isCallValid)
+        {
+            context->bindVertexBuffers(first, count, buffersPacked, offsets, strides);
+        }
+        ANGLE_CAPTURE(BindVertexBuffers, isCallValid, context, first, count, buffersPacked, offsets,
+                      strides);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY BufferStorage(GLenum target, GLsizeiptr size, const void *data, GLbitfield flags)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLBufferStorage,
+          "context = %d, target = %s, size = %llu, data = 0x%016" PRIxPTR ", flags = %s",
+          CID(context), GLenumToString(GLenumGroup::BufferStorageTarget, target),
+          static_cast<unsigned long long>(size), (uintptr_t)data,
+          GLbitfieldToString(GLenumGroup::MapBufferUsageMask, flags).c_str());
+
+    if (context)
+    {
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateBufferStorage(context, targetPacked, size, data, flags));
+        if (isCallValid)
+        {
+            context->bufferStorage(targetPacked, size, data, flags);
+        }
+        ANGLE_CAPTURE(BufferStorage, isCallValid, context, targetPacked, size, data, flags);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY
+ClearTexImage(GLuint texture, GLint level, GLenum format, GLenum type, const void *data)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLClearTexImage,
+          "context = %d, texture = %u, level = %d, format = %s, type = %s, data = 0x%016" PRIxPTR
+          "",
+          CID(context), texture, level, GLenumToString(GLenumGroup::PixelFormat, format),
+          GLenumToString(GLenumGroup::PixelType, type), (uintptr_t)data);
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateClearTexImage(context, texturePacked, level, format, type, data));
+        if (isCallValid)
+        {
+            context->clearTexImage(texturePacked, level, format, type, data);
+        }
+        ANGLE_CAPTURE(ClearTexImage, isCallValid, context, texturePacked, level, format, type,
+                      data);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ClearTexSubImage(GLuint texture,
+                                  GLint level,
+                                  GLint xoffset,
+                                  GLint yoffset,
+                                  GLint zoffset,
+                                  GLsizei width,
+                                  GLsizei height,
+                                  GLsizei depth,
+                                  GLenum format,
+                                  GLenum type,
+                                  const void *data)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLClearTexSubImage,
+          "context = %d, texture = %u, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, width "
+          "= %d, height = %d, depth = %d, format = %s, type = %s, data = 0x%016" PRIxPTR "",
+          CID(context), texture, level, xoffset, yoffset, zoffset, width, height, depth,
+          GLenumToString(GLenumGroup::PixelFormat, format),
+          GLenumToString(GLenumGroup::PixelType, type), (uintptr_t)data);
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateClearTexSubImage(context, texturePacked, level, xoffset, yoffset, zoffset,
+                                      width, height, depth, format, type, data));
+        if (isCallValid)
+        {
+            context->clearTexSubImage(texturePacked, level, xoffset, yoffset, zoffset, width,
+                                      height, depth, format, type, data);
+        }
+        ANGLE_CAPTURE(ClearTexSubImage, isCallValid, context, texturePacked, level, xoffset,
+                      yoffset, zoffset, width, height, depth, format, type, data);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+// GL 4.5
+void GL_APIENTRY BindTextureUnit(GLuint unit, GLuint texture)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLBindTextureUnit, "context = %d, unit = %u, texture = %u", CID(context), unit,
+          texture);
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateBindTextureUnit(context, unit, texturePacked));
+        if (isCallValid)
+        {
+            context->bindTextureUnit(unit, texturePacked);
+        }
+        ANGLE_CAPTURE(BindTextureUnit, isCallValid, context, unit, texturePacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY BlitNamedFramebuffer(GLuint readFramebuffer,
+                                      GLuint drawFramebuffer,
+                                      GLint srcX0,
+                                      GLint srcY0,
+                                      GLint srcX1,
+                                      GLint srcY1,
+                                      GLint dstX0,
+                                      GLint dstY0,
+                                      GLint dstX1,
+                                      GLint dstY1,
+                                      GLbitfield mask,
+                                      GLenum filter)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(
+        context, GLBlitNamedFramebuffer,
+        "context = %d, readFramebuffer = %u, drawFramebuffer = %u, srcX0 = %d, srcY0 = %d, srcX1 = "
+        "%d, srcY1 = %d, dstX0 = %d, dstY0 = %d, dstX1 = %d, dstY1 = %d, mask = %s, filter = %s",
+        CID(context), readFramebuffer, drawFramebuffer, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0,
+        dstX1, dstY1, GLbitfieldToString(GLenumGroup::ClearBufferMask, mask).c_str(),
+        GLenumToString(GLenumGroup::BlitFramebufferFilter, filter));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateBlitNamedFramebuffer(context, readFramebuffer, drawFramebuffer, srcX0, srcY0,
+                                          srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter));
+        if (isCallValid)
+        {
+            context->blitNamedFramebuffer(readFramebuffer, drawFramebuffer, srcX0, srcY0, srcX1,
+                                          srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
+        }
+        ANGLE_CAPTURE(BlitNamedFramebuffer, isCallValid, context, readFramebuffer, drawFramebuffer,
+                      srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+GLenum GL_APIENTRY CheckNamedFramebufferStatus(GLuint framebuffer, GLenum target)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLCheckNamedFramebufferStatus, "context = %d, framebuffer = %u, target = %s",
+          CID(context), framebuffer, GLenumToString(GLenumGroup::FramebufferTarget, target));
+
+    GLenum returnValue;
+    if (context)
+    {
+        FramebufferID framebufferPacked = PackParam<FramebufferID>(framebuffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateCheckNamedFramebufferStatus(
+                                                             context, framebufferPacked, target));
+        if (isCallValid)
+        {
+            returnValue = context->checkNamedFramebufferStatus(framebufferPacked, target);
+        }
+        else
+        {
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLCheckNamedFramebufferStatus, GLenum>();
+        }
+        ANGLE_CAPTURE(CheckNamedFramebufferStatus, isCallValid, context, framebufferPacked, target,
+                      returnValue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+        returnValue =
+            GetDefaultReturnValue<angle::EntryPoint::GLCheckNamedFramebufferStatus, GLenum>();
+    }
+    return returnValue;
+}
+
+void GL_APIENTRY ClearNamedBufferData(GLuint buffer,
+                                      GLenum internalformat,
+                                      GLenum format,
+                                      GLenum type,
+                                      const void *data)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLClearNamedBufferData,
+          "context = %d, buffer = %u, internalformat = %s, format = %s, type = %s, data = "
+          "0x%016" PRIxPTR "",
+          CID(context), buffer, GLenumToString(GLenumGroup::InternalFormat, internalformat),
+          GLenumToString(GLenumGroup::PixelFormat, format),
+          GLenumToString(GLenumGroup::PixelType, type), (uintptr_t)data);
+
+    if (context)
+    {
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateClearNamedBufferData(context, bufferPacked, internalformat,
+                                                         format, type, data));
+        if (isCallValid)
+        {
+            context->clearNamedBufferData(bufferPacked, internalformat, format, type, data);
+        }
+        ANGLE_CAPTURE(ClearNamedBufferData, isCallValid, context, bufferPacked, internalformat,
+                      format, type, data);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ClearNamedBufferSubData(GLuint buffer,
+                                         GLenum internalformat,
+                                         GLintptr offset,
+                                         GLsizeiptr size,
+                                         GLenum format,
+                                         GLenum type,
+                                         const void *data)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLClearNamedBufferSubData,
+          "context = %d, buffer = %u, internalformat = %s, offset = %llu, size = %llu, format = "
+          "%s, type = %s, data = 0x%016" PRIxPTR "",
+          CID(context), buffer, GLenumToString(GLenumGroup::InternalFormat, internalformat),
+          static_cast<unsigned long long>(offset), static_cast<unsigned long long>(size),
+          GLenumToString(GLenumGroup::PixelFormat, format),
+          GLenumToString(GLenumGroup::PixelType, type), (uintptr_t)data);
+
+    if (context)
+    {
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateClearNamedBufferSubData(context, bufferPacked, internalformat,
+                                                            offset, size, format, type, data));
+        if (isCallValid)
+        {
+            context->clearNamedBufferSubData(bufferPacked, internalformat, offset, size, format,
+                                             type, data);
+        }
+        ANGLE_CAPTURE(ClearNamedBufferSubData, isCallValid, context, bufferPacked, internalformat,
+                      offset, size, format, type, data);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ClearNamedFramebufferfi(GLuint framebuffer,
+                                         GLenum buffer,
+                                         GLint drawbuffer,
+                                         GLfloat depth,
+                                         GLint stencil)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLClearNamedFramebufferfi,
+          "context = %d, framebuffer = %u, buffer = %s, drawbuffer = %d, depth = %f, stencil = %d",
+          CID(context), framebuffer, GLenumToString(GLenumGroup::Buffer, buffer), drawbuffer, depth,
+          stencil);
+
+    if (context)
+    {
+        FramebufferID framebufferPacked = PackParam<FramebufferID>(framebuffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateClearNamedFramebufferfi(context, framebufferPacked, buffer,
+                                                            drawbuffer, depth, stencil));
+        if (isCallValid)
+        {
+            context->clearNamedFramebufferfi(framebufferPacked, buffer, drawbuffer, depth, stencil);
+        }
+        ANGLE_CAPTURE(ClearNamedFramebufferfi, isCallValid, context, framebufferPacked, buffer,
+                      drawbuffer, depth, stencil);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ClearNamedFramebufferfv(GLuint framebuffer,
+                                         GLenum buffer,
+                                         GLint drawbuffer,
+                                         const GLfloat *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLClearNamedFramebufferfv,
+          "context = %d, framebuffer = %u, buffer = %s, drawbuffer = %d, value = 0x%016" PRIxPTR "",
+          CID(context), framebuffer, GLenumToString(GLenumGroup::Buffer, buffer), drawbuffer,
+          (uintptr_t)value);
+
+    if (context)
+    {
+        FramebufferID framebufferPacked = PackParam<FramebufferID>(framebuffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateClearNamedFramebufferfv(context, framebufferPacked, buffer,
+                                                            drawbuffer, value));
+        if (isCallValid)
+        {
+            context->clearNamedFramebufferfv(framebufferPacked, buffer, drawbuffer, value);
+        }
+        ANGLE_CAPTURE(ClearNamedFramebufferfv, isCallValid, context, framebufferPacked, buffer,
+                      drawbuffer, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ClearNamedFramebufferiv(GLuint framebuffer,
+                                         GLenum buffer,
+                                         GLint drawbuffer,
+                                         const GLint *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLClearNamedFramebufferiv,
+          "context = %d, framebuffer = %u, buffer = %s, drawbuffer = %d, value = 0x%016" PRIxPTR "",
+          CID(context), framebuffer, GLenumToString(GLenumGroup::Buffer, buffer), drawbuffer,
+          (uintptr_t)value);
+
+    if (context)
+    {
+        FramebufferID framebufferPacked = PackParam<FramebufferID>(framebuffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateClearNamedFramebufferiv(context, framebufferPacked, buffer,
+                                                            drawbuffer, value));
+        if (isCallValid)
+        {
+            context->clearNamedFramebufferiv(framebufferPacked, buffer, drawbuffer, value);
+        }
+        ANGLE_CAPTURE(ClearNamedFramebufferiv, isCallValid, context, framebufferPacked, buffer,
+                      drawbuffer, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ClearNamedFramebufferuiv(GLuint framebuffer,
+                                          GLenum buffer,
+                                          GLint drawbuffer,
+                                          const GLuint *value)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLClearNamedFramebufferuiv,
+          "context = %d, framebuffer = %u, buffer = %s, drawbuffer = %d, value = 0x%016" PRIxPTR "",
+          CID(context), framebuffer, GLenumToString(GLenumGroup::Buffer, buffer), drawbuffer,
+          (uintptr_t)value);
+
+    if (context)
+    {
+        FramebufferID framebufferPacked = PackParam<FramebufferID>(framebuffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateClearNamedFramebufferuiv(context, framebufferPacked, buffer,
+                                                             drawbuffer, value));
+        if (isCallValid)
+        {
+            context->clearNamedFramebufferuiv(framebufferPacked, buffer, drawbuffer, value);
+        }
+        ANGLE_CAPTURE(ClearNamedFramebufferuiv, isCallValid, context, framebufferPacked, buffer,
+                      drawbuffer, value);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ClipControl(GLenum origin, GLenum depth)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLClipControl, "context = %d, origin = %s, depth = %s", CID(context),
+          GLenumToString(GLenumGroup::ClipControlOrigin, origin),
+          GLenumToString(GLenumGroup::ClipControlDepth, depth));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateClipControl(context, origin, depth));
+        if (isCallValid)
+        {
+            context->clipControl(origin, depth);
+        }
+        ANGLE_CAPTURE(ClipControl, isCallValid, context, origin, depth);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY CompressedTextureSubImage1D(GLuint texture,
+                                             GLint level,
+                                             GLint xoffset,
+                                             GLsizei width,
+                                             GLenum format,
+                                             GLsizei imageSize,
+                                             const void *data)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLCompressedTextureSubImage1D,
+          "context = %d, texture = %u, level = %d, xoffset = %d, width = %d, format = %s, "
+          "imageSize = %d, data = 0x%016" PRIxPTR "",
+          CID(context), texture, level, xoffset, width,
+          GLenumToString(GLenumGroup::PixelFormat, format), imageSize, (uintptr_t)data);
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateCompressedTextureSubImage1D(
+                                                             context, texturePacked, level, xoffset,
+                                                             width, format, imageSize, data));
+        if (isCallValid)
+        {
+            context->compressedTextureSubImage1D(texturePacked, level, xoffset, width, format,
+                                                 imageSize, data);
+        }
+        ANGLE_CAPTURE(CompressedTextureSubImage1D, isCallValid, context, texturePacked, level,
+                      xoffset, width, format, imageSize, data);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY CompressedTextureSubImage2D(GLuint texture,
+                                             GLint level,
+                                             GLint xoffset,
+                                             GLint yoffset,
+                                             GLsizei width,
+                                             GLsizei height,
+                                             GLenum format,
+                                             GLsizei imageSize,
+                                             const void *data)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLCompressedTextureSubImage2D,
+          "context = %d, texture = %u, level = %d, xoffset = %d, yoffset = %d, width = %d, height "
+          "= %d, format = %s, imageSize = %d, data = 0x%016" PRIxPTR "",
+          CID(context), texture, level, xoffset, yoffset, width, height,
+          GLenumToString(GLenumGroup::PixelFormat, format), imageSize, (uintptr_t)data);
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateCompressedTextureSubImage2D(context, texturePacked, level, xoffset, yoffset,
+                                                 width, height, format, imageSize, data));
+        if (isCallValid)
+        {
+            context->compressedTextureSubImage2D(texturePacked, level, xoffset, yoffset, width,
+                                                 height, format, imageSize, data);
+        }
+        ANGLE_CAPTURE(CompressedTextureSubImage2D, isCallValid, context, texturePacked, level,
+                      xoffset, yoffset, width, height, format, imageSize, data);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY CompressedTextureSubImage3D(GLuint texture,
+                                             GLint level,
+                                             GLint xoffset,
+                                             GLint yoffset,
+                                             GLint zoffset,
+                                             GLsizei width,
+                                             GLsizei height,
+                                             GLsizei depth,
+                                             GLenum format,
+                                             GLsizei imageSize,
+                                             const void *data)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLCompressedTextureSubImage3D,
+          "context = %d, texture = %u, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, width "
+          "= %d, height = %d, depth = %d, format = %s, imageSize = %d, data = 0x%016" PRIxPTR "",
+          CID(context), texture, level, xoffset, yoffset, zoffset, width, height, depth,
+          GLenumToString(GLenumGroup::PixelFormat, format), imageSize, (uintptr_t)data);
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateCompressedTextureSubImage3D(
+                                context, texturePacked, level, xoffset, yoffset, zoffset, width,
+                                height, depth, format, imageSize, data));
+        if (isCallValid)
+        {
+            context->compressedTextureSubImage3D(texturePacked, level, xoffset, yoffset, zoffset,
+                                                 width, height, depth, format, imageSize, data);
+        }
+        ANGLE_CAPTURE(CompressedTextureSubImage3D, isCallValid, context, texturePacked, level,
+                      xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY CopyNamedBufferSubData(GLuint readBuffer,
+                                        GLuint writeBuffer,
+                                        GLintptr readOffset,
+                                        GLintptr writeOffset,
+                                        GLsizeiptr size)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLCopyNamedBufferSubData,
+          "context = %d, readBuffer = %u, writeBuffer = %u, readOffset = %llu, writeOffset = %llu, "
+          "size = %llu",
+          CID(context), readBuffer, writeBuffer, static_cast<unsigned long long>(readOffset),
+          static_cast<unsigned long long>(writeOffset), static_cast<unsigned long long>(size));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateCopyNamedBufferSubData(context, readBuffer, writeBuffer,
+                                                           readOffset, writeOffset, size));
+        if (isCallValid)
+        {
+            context->copyNamedBufferSubData(readBuffer, writeBuffer, readOffset, writeOffset, size);
+        }
+        ANGLE_CAPTURE(CopyNamedBufferSubData, isCallValid, context, readBuffer, writeBuffer,
+                      readOffset, writeOffset, size);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY
+CopyTextureSubImage1D(GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLCopyTextureSubImage1D,
+          "context = %d, texture = %u, level = %d, xoffset = %d, x = %d, y = %d, width = %d",
+          CID(context), texture, level, xoffset, x, y, width);
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateCopyTextureSubImage1D(context, texturePacked, level, xoffset, x, y, width));
+        if (isCallValid)
+        {
+            context->copyTextureSubImage1D(texturePacked, level, xoffset, x, y, width);
+        }
+        ANGLE_CAPTURE(CopyTextureSubImage1D, isCallValid, context, texturePacked, level, xoffset, x,
+                      y, width);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY CopyTextureSubImage2D(GLuint texture,
+                                       GLint level,
+                                       GLint xoffset,
+                                       GLint yoffset,
+                                       GLint x,
+                                       GLint y,
+                                       GLsizei width,
+                                       GLsizei height)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLCopyTextureSubImage2D,
+          "context = %d, texture = %u, level = %d, xoffset = %d, yoffset = %d, x = %d, y = %d, "
+          "width = %d, height = %d",
+          CID(context), texture, level, xoffset, yoffset, x, y, width, height);
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateCopyTextureSubImage2D(context, texturePacked, level, xoffset,
+                                                          yoffset, x, y, width, height));
+        if (isCallValid)
+        {
+            context->copyTextureSubImage2D(texturePacked, level, xoffset, yoffset, x, y, width,
+                                           height);
+        }
+        ANGLE_CAPTURE(CopyTextureSubImage2D, isCallValid, context, texturePacked, level, xoffset,
+                      yoffset, x, y, width, height);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY CopyTextureSubImage3D(GLuint texture,
+                                       GLint level,
+                                       GLint xoffset,
+                                       GLint yoffset,
+                                       GLint zoffset,
+                                       GLint x,
+                                       GLint y,
+                                       GLsizei width,
+                                       GLsizei height)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLCopyTextureSubImage3D,
+          "context = %d, texture = %u, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, x = "
+          "%d, y = %d, width = %d, height = %d",
+          CID(context), texture, level, xoffset, yoffset, zoffset, x, y, width, height);
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateCopyTextureSubImage3D(context, texturePacked, level, xoffset,
+                                                          yoffset, zoffset, x, y, width, height));
+        if (isCallValid)
+        {
+            context->copyTextureSubImage3D(texturePacked, level, xoffset, yoffset, zoffset, x, y,
+                                           width, height);
+        }
+        ANGLE_CAPTURE(CopyTextureSubImage3D, isCallValid, context, texturePacked, level, xoffset,
+                      yoffset, zoffset, x, y, width, height);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY CreateBuffers(GLsizei n, GLuint *buffers)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLCreateBuffers, "context = %d, n = %d, buffers = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)buffers);
+
+    if (context)
+    {
+        BufferID *buffersPacked                               = PackParam<BufferID *>(buffers);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateCreateBuffers(context, n, buffersPacked));
+        if (isCallValid)
+        {
+            context->createBuffers(n, buffersPacked);
+        }
+        ANGLE_CAPTURE(CreateBuffers, isCallValid, context, n, buffersPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY CreateFramebuffers(GLsizei n, GLuint *framebuffers)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLCreateFramebuffers, "context = %d, n = %d, framebuffers = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)framebuffers);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateCreateFramebuffers(context, n, framebuffers));
+        if (isCallValid)
+        {
+            context->createFramebuffers(n, framebuffers);
+        }
+        ANGLE_CAPTURE(CreateFramebuffers, isCallValid, context, n, framebuffers);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY CreateProgramPipelines(GLsizei n, GLuint *pipelines)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLCreateProgramPipelines, "context = %d, n = %d, pipelines = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)pipelines);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateCreateProgramPipelines(context, n, pipelines));
+        if (isCallValid)
+        {
+            context->createProgramPipelines(n, pipelines);
+        }
+        ANGLE_CAPTURE(CreateProgramPipelines, isCallValid, context, n, pipelines);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY CreateQueries(GLenum target, GLsizei n, GLuint *ids)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLCreateQueries, "context = %d, target = %s, n = %d, ids = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::QueryTarget, target), n, (uintptr_t)ids);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateCreateQueries(context, target, n, ids));
+        if (isCallValid)
+        {
+            context->createQueries(target, n, ids);
+        }
+        ANGLE_CAPTURE(CreateQueries, isCallValid, context, target, n, ids);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY CreateRenderbuffers(GLsizei n, GLuint *renderbuffers)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLCreateRenderbuffers, "context = %d, n = %d, renderbuffers = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)renderbuffers);
+
+    if (context)
+    {
+        RenderbufferID *renderbuffersPacked = PackParam<RenderbufferID *>(renderbuffers);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateCreateRenderbuffers(context, n, renderbuffersPacked));
+        if (isCallValid)
+        {
+            context->createRenderbuffers(n, renderbuffersPacked);
+        }
+        ANGLE_CAPTURE(CreateRenderbuffers, isCallValid, context, n, renderbuffersPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY CreateSamplers(GLsizei n, GLuint *samplers)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLCreateSamplers, "context = %d, n = %d, samplers = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)samplers);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateCreateSamplers(context, n, samplers));
+        if (isCallValid)
+        {
+            context->createSamplers(n, samplers);
+        }
+        ANGLE_CAPTURE(CreateSamplers, isCallValid, context, n, samplers);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY CreateTextures(GLenum target, GLsizei n, GLuint *textures)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLCreateTextures,
+          "context = %d, target = %s, n = %d, textures = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::TextureTarget, target), n, (uintptr_t)textures);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateCreateTextures(context, target, n, textures));
+        if (isCallValid)
+        {
+            context->createTextures(target, n, textures);
+        }
+        ANGLE_CAPTURE(CreateTextures, isCallValid, context, target, n, textures);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY CreateTransformFeedbacks(GLsizei n, GLuint *ids)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLCreateTransformFeedbacks, "context = %d, n = %d, ids = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)ids);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateCreateTransformFeedbacks(context, n, ids));
+        if (isCallValid)
+        {
+            context->createTransformFeedbacks(n, ids);
+        }
+        ANGLE_CAPTURE(CreateTransformFeedbacks, isCallValid, context, n, ids);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY CreateVertexArrays(GLsizei n, GLuint *arrays)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLCreateVertexArrays, "context = %d, n = %d, arrays = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)arrays);
+
+    if (context)
+    {
+        VertexArrayID *arraysPacked                           = PackParam<VertexArrayID *>(arrays);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateCreateVertexArrays(context, n, arraysPacked));
+        if (isCallValid)
+        {
+            context->createVertexArrays(n, arraysPacked);
+        }
+        ANGLE_CAPTURE(CreateVertexArrays, isCallValid, context, n, arraysPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY DisableVertexArrayAttrib(GLuint vaobj, GLuint index)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLDisableVertexArrayAttrib, "context = %d, vaobj = %u, index = %u", CID(context),
+          vaobj, index);
+
+    if (context)
+    {
+        VertexArrayID vaobjPacked                             = PackParam<VertexArrayID>(vaobj);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateDisableVertexArrayAttrib(context, vaobjPacked, index));
+        if (isCallValid)
+        {
+            context->disableVertexArrayAttrib(vaobjPacked, index);
+        }
+        ANGLE_CAPTURE(DisableVertexArrayAttrib, isCallValid, context, vaobjPacked, index);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY EnableVertexArrayAttrib(GLuint vaobj, GLuint index)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLEnableVertexArrayAttrib, "context = %d, vaobj = %u, index = %u", CID(context),
+          vaobj, index);
+
+    if (context)
+    {
+        VertexArrayID vaobjPacked                             = PackParam<VertexArrayID>(vaobj);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateEnableVertexArrayAttrib(context, vaobjPacked, index));
+        if (isCallValid)
+        {
+            context->enableVertexArrayAttrib(vaobjPacked, index);
+        }
+        ANGLE_CAPTURE(EnableVertexArrayAttrib, isCallValid, context, vaobjPacked, index);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY FlushMappedNamedBufferRange(GLuint buffer, GLintptr offset, GLsizeiptr length)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLFlushMappedNamedBufferRange,
+          "context = %d, buffer = %u, offset = %llu, length = %llu", CID(context), buffer,
+          static_cast<unsigned long long>(offset), static_cast<unsigned long long>(length));
+
+    if (context)
+    {
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateFlushMappedNamedBufferRange(context, bufferPacked, offset, length));
+        if (isCallValid)
+        {
+            context->flushMappedNamedBufferRange(bufferPacked, offset, length);
+        }
+        ANGLE_CAPTURE(FlushMappedNamedBufferRange, isCallValid, context, bufferPacked, offset,
+                      length);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GenerateTextureMipmap(GLuint texture)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGenerateTextureMipmap, "context = %d, texture = %u", CID(context), texture);
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGenerateTextureMipmap(context, texturePacked));
+        if (isCallValid)
+        {
+            context->generateTextureMipmap(texturePacked);
+        }
+        ANGLE_CAPTURE(GenerateTextureMipmap, isCallValid, context, texturePacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetCompressedTextureImage(GLuint texture,
+                                           GLint level,
+                                           GLsizei bufSize,
+                                           void *pixels)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetCompressedTextureImage,
+          "context = %d, texture = %u, level = %d, bufSize = %d, pixels = 0x%016" PRIxPTR "",
+          CID(context), texture, level, bufSize, (uintptr_t)pixels);
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetCompressedTextureImage(context, texturePacked, level, bufSize, pixels));
+        if (isCallValid)
+        {
+            context->getCompressedTextureImage(texturePacked, level, bufSize, pixels);
+        }
+        ANGLE_CAPTURE(GetCompressedTextureImage, isCallValid, context, texturePacked, level,
+                      bufSize, pixels);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetCompressedTextureSubImage(GLuint texture,
+                                              GLint level,
+                                              GLint xoffset,
+                                              GLint yoffset,
+                                              GLint zoffset,
+                                              GLsizei width,
+                                              GLsizei height,
+                                              GLsizei depth,
+                                              GLsizei bufSize,
+                                              void *pixels)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetCompressedTextureSubImage,
+          "context = %d, texture = %u, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, width "
+          "= %d, height = %d, depth = %d, bufSize = %d, pixels = 0x%016" PRIxPTR "",
+          CID(context), texture, level, xoffset, yoffset, zoffset, width, height, depth, bufSize,
+          (uintptr_t)pixels);
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetCompressedTextureSubImage(context, texturePacked, level, xoffset, yoffset,
+                                                  zoffset, width, height, depth, bufSize, pixels));
+        if (isCallValid)
+        {
+            context->getCompressedTextureSubImage(texturePacked, level, xoffset, yoffset, zoffset,
+                                                  width, height, depth, bufSize, pixels);
+        }
+        ANGLE_CAPTURE(GetCompressedTextureSubImage, isCallValid, context, texturePacked, level,
+                      xoffset, yoffset, zoffset, width, height, depth, bufSize, pixels);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+GLenum GL_APIENTRY GetGraphicsResetStatus()
+{
+    Context *context = GetGlobalContext();
+    EVENT(context, GLGetGraphicsResetStatus, "context = %d", CID(context));
+
+    GLenum returnValue;
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateGetGraphicsResetStatus(context));
+        if (isCallValid)
+        {
+            returnValue = context->getGraphicsResetStatus();
+        }
+        else
+        {
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLGetGraphicsResetStatus, GLenum>();
+        }
+        ANGLE_CAPTURE(GetGraphicsResetStatus, isCallValid, context, returnValue);
+    }
+    else
+    {
+
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetGraphicsResetStatus, GLenum>();
+    }
+    return returnValue;
+}
+
+void GL_APIENTRY GetNamedBufferParameteri64v(GLuint buffer, GLenum pname, GLint64 *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetNamedBufferParameteri64v,
+          "context = %d, buffer = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), buffer,
+          GLenumToString(GLenumGroup::VertexBufferObjectParameter, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateGetNamedBufferParameteri64v(
+                                                             context, bufferPacked, pname, params));
+        if (isCallValid)
+        {
+            context->getNamedBufferParameteri64v(bufferPacked, pname, params);
+        }
+        ANGLE_CAPTURE(GetNamedBufferParameteri64v, isCallValid, context, bufferPacked, pname,
+                      params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetNamedBufferParameteriv(GLuint buffer, GLenum pname, GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetNamedBufferParameteriv,
+          "context = %d, buffer = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), buffer,
+          GLenumToString(GLenumGroup::VertexBufferObjectParameter, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateGetNamedBufferParameteriv(
+                                                             context, bufferPacked, pname, params));
+        if (isCallValid)
+        {
+            context->getNamedBufferParameteriv(bufferPacked, pname, params);
+        }
+        ANGLE_CAPTURE(GetNamedBufferParameteriv, isCallValid, context, bufferPacked, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetNamedBufferPointerv(GLuint buffer, GLenum pname, void **params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetNamedBufferPointerv,
+          "context = %d, buffer = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), buffer,
+          GLenumToString(GLenumGroup::VertexBufferObjectParameter, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetNamedBufferPointerv(context, bufferPacked, pname, params));
+        if (isCallValid)
+        {
+            context->getNamedBufferPointerv(bufferPacked, pname, params);
+        }
+        ANGLE_CAPTURE(GetNamedBufferPointerv, isCallValid, context, bufferPacked, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetNamedBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr size, void *data)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetNamedBufferSubData,
+          "context = %d, buffer = %u, offset = %llu, size = %llu, data = 0x%016" PRIxPTR "",
+          CID(context), buffer, static_cast<unsigned long long>(offset),
+          static_cast<unsigned long long>(size), (uintptr_t)data);
+
+    if (context)
+    {
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetNamedBufferSubData(context, bufferPacked, offset, size, data));
+        if (isCallValid)
+        {
+            context->getNamedBufferSubData(bufferPacked, offset, size, data);
+        }
+        ANGLE_CAPTURE(GetNamedBufferSubData, isCallValid, context, bufferPacked, offset, size,
+                      data);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetNamedFramebufferAttachmentParameteriv(GLuint framebuffer,
+                                                          GLenum attachment,
+                                                          GLenum pname,
+                                                          GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetNamedFramebufferAttachmentParameteriv,
+          "context = %d, framebuffer = %u, attachment = %s, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), framebuffer, GLenumToString(GLenumGroup::FramebufferAttachment, attachment),
+          GLenumToString(GLenumGroup::FramebufferAttachmentParameterName, pname),
+          (uintptr_t)params);
+
+    if (context)
+    {
+        FramebufferID framebufferPacked = PackParam<FramebufferID>(framebuffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetNamedFramebufferAttachmentParameteriv(
+                                context, framebufferPacked, attachment, pname, params));
+        if (isCallValid)
+        {
+            context->getNamedFramebufferAttachmentParameteriv(framebufferPacked, attachment, pname,
+                                                              params);
+        }
+        ANGLE_CAPTURE(GetNamedFramebufferAttachmentParameteriv, isCallValid, context,
+                      framebufferPacked, attachment, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetNamedFramebufferParameteriv(GLuint framebuffer, GLenum pname, GLint *param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetNamedFramebufferParameteriv,
+          "context = %d, framebuffer = %u, pname = %s, param = 0x%016" PRIxPTR "", CID(context),
+          framebuffer, GLenumToString(GLenumGroup::GetFramebufferParameter, pname),
+          (uintptr_t)param);
+
+    if (context)
+    {
+        FramebufferID framebufferPacked = PackParam<FramebufferID>(framebuffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetNamedFramebufferParameteriv(context, framebufferPacked, pname, param));
+        if (isCallValid)
+        {
+            context->getNamedFramebufferParameteriv(framebufferPacked, pname, param);
+        }
+        ANGLE_CAPTURE(GetNamedFramebufferParameteriv, isCallValid, context, framebufferPacked,
+                      pname, param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetNamedRenderbufferParameteriv(GLuint renderbuffer, GLenum pname, GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetNamedRenderbufferParameteriv,
+          "context = %d, renderbuffer = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
+          renderbuffer, GLenumToString(GLenumGroup::RenderbufferParameterName, pname),
+          (uintptr_t)params);
+
+    if (context)
+    {
+        RenderbufferID renderbufferPacked = PackParam<RenderbufferID>(renderbuffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetNamedRenderbufferParameteriv(context, renderbufferPacked, pname, params));
+        if (isCallValid)
+        {
+            context->getNamedRenderbufferParameteriv(renderbufferPacked, pname, params);
+        }
+        ANGLE_CAPTURE(GetNamedRenderbufferParameteriv, isCallValid, context, renderbufferPacked,
+                      pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetQueryBufferObjecti64v(GLuint id, GLuint buffer, GLenum pname, GLintptr offset)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetQueryBufferObjecti64v,
+          "context = %d, id = %u, buffer = %u, pname = %s, offset = %llu", CID(context), id, buffer,
+          GLenumToString(GLenumGroup::QueryObjectParameterName, pname),
+          static_cast<unsigned long long>(offset));
+
+    if (context)
+    {
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetQueryBufferObjecti64v(context, id, bufferPacked, pname, offset));
+        if (isCallValid)
+        {
+            context->getQueryBufferObjecti64v(id, bufferPacked, pname, offset);
+        }
+        ANGLE_CAPTURE(GetQueryBufferObjecti64v, isCallValid, context, id, bufferPacked, pname,
+                      offset);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetQueryBufferObjectiv(GLuint id, GLuint buffer, GLenum pname, GLintptr offset)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetQueryBufferObjectiv,
+          "context = %d, id = %u, buffer = %u, pname = %s, offset = %llu", CID(context), id, buffer,
+          GLenumToString(GLenumGroup::QueryObjectParameterName, pname),
+          static_cast<unsigned long long>(offset));
+
+    if (context)
+    {
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetQueryBufferObjectiv(context, id, bufferPacked, pname, offset));
+        if (isCallValid)
+        {
+            context->getQueryBufferObjectiv(id, bufferPacked, pname, offset);
+        }
+        ANGLE_CAPTURE(GetQueryBufferObjectiv, isCallValid, context, id, bufferPacked, pname,
+                      offset);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetQueryBufferObjectui64v(GLuint id, GLuint buffer, GLenum pname, GLintptr offset)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetQueryBufferObjectui64v,
+          "context = %d, id = %u, buffer = %u, pname = %s, offset = %llu", CID(context), id, buffer,
+          GLenumToString(GLenumGroup::QueryObjectParameterName, pname),
+          static_cast<unsigned long long>(offset));
+
+    if (context)
+    {
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetQueryBufferObjectui64v(context, id, bufferPacked, pname, offset));
+        if (isCallValid)
+        {
+            context->getQueryBufferObjectui64v(id, bufferPacked, pname, offset);
+        }
+        ANGLE_CAPTURE(GetQueryBufferObjectui64v, isCallValid, context, id, bufferPacked, pname,
+                      offset);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetQueryBufferObjectuiv(GLuint id, GLuint buffer, GLenum pname, GLintptr offset)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetQueryBufferObjectuiv,
+          "context = %d, id = %u, buffer = %u, pname = %s, offset = %llu", CID(context), id, buffer,
+          GLenumToString(GLenumGroup::QueryObjectParameterName, pname),
+          static_cast<unsigned long long>(offset));
+
+    if (context)
+    {
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetQueryBufferObjectuiv(context, id, bufferPacked, pname, offset));
+        if (isCallValid)
+        {
+            context->getQueryBufferObjectuiv(id, bufferPacked, pname, offset);
+        }
+        ANGLE_CAPTURE(GetQueryBufferObjectuiv, isCallValid, context, id, bufferPacked, pname,
+                      offset);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetTextureImage(GLuint texture,
+                                 GLint level,
+                                 GLenum format,
+                                 GLenum type,
+                                 GLsizei bufSize,
+                                 void *pixels)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetTextureImage,
+          "context = %d, texture = %u, level = %d, format = %s, type = %s, bufSize = %d, pixels = "
+          "0x%016" PRIxPTR "",
+          CID(context), texture, level, GLenumToString(GLenumGroup::PixelFormat, format),
+          GLenumToString(GLenumGroup::PixelType, type), bufSize, (uintptr_t)pixels);
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetTextureImage(context, texturePacked, level, format, type, bufSize, pixels));
+        if (isCallValid)
+        {
+            context->getTextureImage(texturePacked, level, format, type, bufSize, pixels);
+        }
+        ANGLE_CAPTURE(GetTextureImage, isCallValid, context, texturePacked, level, format, type,
+                      bufSize, pixels);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetTextureLevelParameterfv(GLuint texture,
+                                            GLint level,
+                                            GLenum pname,
+                                            GLfloat *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetTextureLevelParameterfv,
+          "context = %d, texture = %u, level = %d, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), texture, level, GLenumToString(GLenumGroup::GetTextureParameter, pname),
+          (uintptr_t)params);
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetTextureLevelParameterfv(context, texturePacked, level, pname, params));
+        if (isCallValid)
+        {
+            context->getTextureLevelParameterfv(texturePacked, level, pname, params);
+        }
+        ANGLE_CAPTURE(GetTextureLevelParameterfv, isCallValid, context, texturePacked, level, pname,
+                      params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetTextureLevelParameteriv(GLuint texture,
+                                            GLint level,
+                                            GLenum pname,
+                                            GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetTextureLevelParameteriv,
+          "context = %d, texture = %u, level = %d, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), texture, level, GLenumToString(GLenumGroup::GetTextureParameter, pname),
+          (uintptr_t)params);
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetTextureLevelParameteriv(context, texturePacked, level, pname, params));
+        if (isCallValid)
+        {
+            context->getTextureLevelParameteriv(texturePacked, level, pname, params);
+        }
+        ANGLE_CAPTURE(GetTextureLevelParameteriv, isCallValid, context, texturePacked, level, pname,
+                      params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetTextureParameterIiv(GLuint texture, GLenum pname, GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetTextureParameterIiv,
+          "context = %d, texture = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
+          texture, GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetTextureParameterIiv(context, texturePacked, pname, params));
+        if (isCallValid)
+        {
+            context->getTextureParameterIiv(texturePacked, pname, params);
+        }
+        ANGLE_CAPTURE(GetTextureParameterIiv, isCallValid, context, texturePacked, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetTextureParameterIuiv(GLuint texture, GLenum pname, GLuint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetTextureParameterIuiv,
+          "context = %d, texture = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
+          texture, GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetTextureParameterIuiv(context, texturePacked, pname, params));
+        if (isCallValid)
+        {
+            context->getTextureParameterIuiv(texturePacked, pname, params);
+        }
+        ANGLE_CAPTURE(GetTextureParameterIuiv, isCallValid, context, texturePacked, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetTextureParameterfv(GLuint texture, GLenum pname, GLfloat *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetTextureParameterfv,
+          "context = %d, texture = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
+          texture, GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetTextureParameterfv(context, texturePacked, pname, params));
+        if (isCallValid)
+        {
+            context->getTextureParameterfv(texturePacked, pname, params);
+        }
+        ANGLE_CAPTURE(GetTextureParameterfv, isCallValid, context, texturePacked, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetTextureParameteriv(GLuint texture, GLenum pname, GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetTextureParameteriv,
+          "context = %d, texture = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
+          texture, GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetTextureParameteriv(context, texturePacked, pname, params));
+        if (isCallValid)
+        {
+            context->getTextureParameteriv(texturePacked, pname, params);
+        }
+        ANGLE_CAPTURE(GetTextureParameteriv, isCallValid, context, texturePacked, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetTextureSubImage(GLuint texture,
+                                    GLint level,
+                                    GLint xoffset,
+                                    GLint yoffset,
+                                    GLint zoffset,
+                                    GLsizei width,
+                                    GLsizei height,
+                                    GLsizei depth,
+                                    GLenum format,
+                                    GLenum type,
+                                    GLsizei bufSize,
+                                    void *pixels)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(
+        context, GLGetTextureSubImage,
+        "context = %d, texture = %u, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, width = "
+        "%d, height = %d, depth = %d, format = %s, type = %s, bufSize = %d, pixels = 0x%016" PRIxPTR
+        "",
+        CID(context), texture, level, xoffset, yoffset, zoffset, width, height, depth,
+        GLenumToString(GLenumGroup::PixelFormat, format),
+        GLenumToString(GLenumGroup::PixelType, type), bufSize, (uintptr_t)pixels);
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetTextureSubImage(context, texturePacked, level, xoffset, yoffset, zoffset,
+                                        width, height, depth, format, type, bufSize, pixels));
+        if (isCallValid)
+        {
+            context->getTextureSubImage(texturePacked, level, xoffset, yoffset, zoffset, width,
+                                        height, depth, format, type, bufSize, pixels);
+        }
+        ANGLE_CAPTURE(GetTextureSubImage, isCallValid, context, texturePacked, level, xoffset,
+                      yoffset, zoffset, width, height, depth, format, type, bufSize, pixels);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetTransformFeedbacki64_v(GLuint xfb, GLenum pname, GLuint index, GLint64 *param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetTransformFeedbacki64_v,
+          "context = %d, xfb = %u, pname = %s, index = %u, param = 0x%016" PRIxPTR "", CID(context),
+          xfb, GLenumToString(GLenumGroup::TransformFeedbackPName, pname), index, (uintptr_t)param);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetTransformFeedbacki64_v(context, xfb, pname, index, param));
+        if (isCallValid)
+        {
+            context->getTransformFeedbacki64_v(xfb, pname, index, param);
+        }
+        ANGLE_CAPTURE(GetTransformFeedbacki64_v, isCallValid, context, xfb, pname, index, param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetTransformFeedbacki_v(GLuint xfb, GLenum pname, GLuint index, GLint *param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetTransformFeedbacki_v,
+          "context = %d, xfb = %u, pname = %s, index = %u, param = 0x%016" PRIxPTR "", CID(context),
+          xfb, GLenumToString(GLenumGroup::TransformFeedbackPName, pname), index, (uintptr_t)param);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetTransformFeedbacki_v(context, xfb, pname, index, param));
+        if (isCallValid)
+        {
+            context->getTransformFeedbacki_v(xfb, pname, index, param);
+        }
+        ANGLE_CAPTURE(GetTransformFeedbacki_v, isCallValid, context, xfb, pname, index, param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetTransformFeedbackiv(GLuint xfb, GLenum pname, GLint *param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetTransformFeedbackiv,
+          "context = %d, xfb = %u, pname = %s, param = 0x%016" PRIxPTR "", CID(context), xfb,
+          GLenumToString(GLenumGroup::TransformFeedbackPName, pname), (uintptr_t)param);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetTransformFeedbackiv(context, xfb, pname, param));
+        if (isCallValid)
+        {
+            context->getTransformFeedbackiv(xfb, pname, param);
+        }
+        ANGLE_CAPTURE(GetTransformFeedbackiv, isCallValid, context, xfb, pname, param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetVertexArrayIndexed64iv(GLuint vaobj, GLuint index, GLenum pname, GLint64 *param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetVertexArrayIndexed64iv,
+          "context = %d, vaobj = %u, index = %u, pname = %s, param = 0x%016" PRIxPTR "",
+          CID(context), vaobj, index, GLenumToString(GLenumGroup::VertexArrayPName, pname),
+          (uintptr_t)param);
+
+    if (context)
+    {
+        VertexArrayID vaobjPacked                             = PackParam<VertexArrayID>(vaobj);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetVertexArrayIndexed64iv(context, vaobjPacked, index, pname, param));
+        if (isCallValid)
+        {
+            context->getVertexArrayIndexed64iv(vaobjPacked, index, pname, param);
+        }
+        ANGLE_CAPTURE(GetVertexArrayIndexed64iv, isCallValid, context, vaobjPacked, index, pname,
+                      param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetVertexArrayIndexediv(GLuint vaobj, GLuint index, GLenum pname, GLint *param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetVertexArrayIndexediv,
+          "context = %d, vaobj = %u, index = %u, pname = %s, param = 0x%016" PRIxPTR "",
+          CID(context), vaobj, index, GLenumToString(GLenumGroup::VertexArrayPName, pname),
+          (uintptr_t)param);
+
+    if (context)
+    {
+        VertexArrayID vaobjPacked                             = PackParam<VertexArrayID>(vaobj);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetVertexArrayIndexediv(context, vaobjPacked, index, pname, param));
+        if (isCallValid)
+        {
+            context->getVertexArrayIndexediv(vaobjPacked, index, pname, param);
+        }
+        ANGLE_CAPTURE(GetVertexArrayIndexediv, isCallValid, context, vaobjPacked, index, pname,
+                      param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetVertexArrayiv(GLuint vaobj, GLenum pname, GLint *param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetVertexArrayiv,
+          "context = %d, vaobj = %u, pname = %s, param = 0x%016" PRIxPTR "", CID(context), vaobj,
+          GLenumToString(GLenumGroup::VertexArrayPName, pname), (uintptr_t)param);
+
+    if (context)
+    {
+        VertexArrayID vaobjPacked                             = PackParam<VertexArrayID>(vaobj);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetVertexArrayiv(context, vaobjPacked, pname, param));
+        if (isCallValid)
+        {
+            context->getVertexArrayiv(vaobjPacked, pname, param);
+        }
+        ANGLE_CAPTURE(GetVertexArrayiv, isCallValid, context, vaobjPacked, pname, param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY
+GetnColorTable(GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetnColorTable,
+          "context = %d, target = %s, format = %s, type = %s, bufSize = %d, table = 0x%016" PRIxPTR
+          "",
+          CID(context), GLenumToString(GLenumGroup::ColorTableTarget, target),
+          GLenumToString(GLenumGroup::PixelFormat, format),
+          GLenumToString(GLenumGroup::PixelType, type), bufSize, (uintptr_t)table);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetnColorTable(context, target, format, type, bufSize, table));
+        if (isCallValid)
+        {
+            context->getnColorTable(target, format, type, bufSize, table);
+        }
+        ANGLE_CAPTURE(GetnColorTable, isCallValid, context, target, format, type, bufSize, table);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetnCompressedTexImage(GLenum target, GLint lod, GLsizei bufSize, void *pixels)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetnCompressedTexImage,
+          "context = %d, target = %s, lod = %d, bufSize = %d, pixels = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), lod, bufSize,
+          (uintptr_t)pixels);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetnCompressedTexImage(context, target, lod, bufSize, pixels));
+        if (isCallValid)
+        {
+            context->getnCompressedTexImage(target, lod, bufSize, pixels);
+        }
+        ANGLE_CAPTURE(GetnCompressedTexImage, isCallValid, context, target, lod, bufSize, pixels);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY
+GetnConvolutionFilter(GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetnConvolutionFilter,
+          "context = %d, target = %s, format = %s, type = %s, bufSize = %d, image = 0x%016" PRIxPTR
+          "",
+          CID(context), GLenumToString(GLenumGroup::ConvolutionTarget, target),
+          GLenumToString(GLenumGroup::PixelFormat, format),
+          GLenumToString(GLenumGroup::PixelType, type), bufSize, (uintptr_t)image);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetnConvolutionFilter(context, target, format, type, bufSize, image));
+        if (isCallValid)
+        {
+            context->getnConvolutionFilter(target, format, type, bufSize, image);
+        }
+        ANGLE_CAPTURE(GetnConvolutionFilter, isCallValid, context, target, format, type, bufSize,
+                      image);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetnHistogram(GLenum target,
+                               GLboolean reset,
+                               GLenum format,
+                               GLenum type,
+                               GLsizei bufSize,
+                               void *values)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetnHistogram,
+          "context = %d, target = %s, reset = %s, format = %s, type = %s, bufSize = %d, values = "
+          "0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::HistogramTargetEXT, target),
+          GLbooleanToString(reset), GLenumToString(GLenumGroup::PixelFormat, format),
+          GLenumToString(GLenumGroup::PixelType, type), bufSize, (uintptr_t)values);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetnHistogram(context, target, reset, format, type, bufSize, values));
+        if (isCallValid)
+        {
+            context->getnHistogram(target, reset, format, type, bufSize, values);
+        }
+        ANGLE_CAPTURE(GetnHistogram, isCallValid, context, target, reset, format, type, bufSize,
+                      values);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetnMapdv(GLenum target, GLenum query, GLsizei bufSize, GLdouble *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetnMapdv,
+          "context = %d, target = %s, query = %s, bufSize = %d, v = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::MapTarget, target),
+          GLenumToString(GLenumGroup::MapQuery, query), bufSize, (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGetnMapdv(context, target, query, bufSize, v));
+        if (isCallValid)
+        {
+            context->getnMapdv(target, query, bufSize, v);
+        }
+        ANGLE_CAPTURE(GetnMapdv, isCallValid, context, target, query, bufSize, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetnMapfv(GLenum target, GLenum query, GLsizei bufSize, GLfloat *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetnMapfv,
+          "context = %d, target = %s, query = %s, bufSize = %d, v = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::MapTarget, target),
+          GLenumToString(GLenumGroup::MapQuery, query), bufSize, (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGetnMapfv(context, target, query, bufSize, v));
+        if (isCallValid)
+        {
+            context->getnMapfv(target, query, bufSize, v);
+        }
+        ANGLE_CAPTURE(GetnMapfv, isCallValid, context, target, query, bufSize, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetnMapiv(GLenum target, GLenum query, GLsizei bufSize, GLint *v)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetnMapiv,
+          "context = %d, target = %s, query = %s, bufSize = %d, v = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::MapTarget, target),
+          GLenumToString(GLenumGroup::MapQuery, query), bufSize, (uintptr_t)v);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGetnMapiv(context, target, query, bufSize, v));
+        if (isCallValid)
+        {
+            context->getnMapiv(target, query, bufSize, v);
+        }
+        ANGLE_CAPTURE(GetnMapiv, isCallValid, context, target, query, bufSize, v);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetnMinmax(GLenum target,
+                            GLboolean reset,
+                            GLenum format,
+                            GLenum type,
+                            GLsizei bufSize,
+                            void *values)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetnMinmax,
+          "context = %d, target = %s, reset = %s, format = %s, type = %s, bufSize = %d, values = "
+          "0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::MinmaxTargetEXT, target),
+          GLbooleanToString(reset), GLenumToString(GLenumGroup::PixelFormat, format),
+          GLenumToString(GLenumGroup::PixelType, type), bufSize, (uintptr_t)values);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetnMinmax(context, target, reset, format, type, bufSize, values));
+        if (isCallValid)
+        {
+            context->getnMinmax(target, reset, format, type, bufSize, values);
+        }
+        ANGLE_CAPTURE(GetnMinmax, isCallValid, context, target, reset, format, type, bufSize,
+                      values);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetnPixelMapfv(GLenum map, GLsizei bufSize, GLfloat *values)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetnPixelMapfv,
+          "context = %d, map = %s, bufSize = %d, values = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::PixelMap, map), bufSize, (uintptr_t)values);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGetnPixelMapfv(context, map, bufSize, values));
+        if (isCallValid)
+        {
+            context->getnPixelMapfv(map, bufSize, values);
+        }
+        ANGLE_CAPTURE(GetnPixelMapfv, isCallValid, context, map, bufSize, values);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetnPixelMapuiv(GLenum map, GLsizei bufSize, GLuint *values)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetnPixelMapuiv,
+          "context = %d, map = %s, bufSize = %d, values = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::PixelMap, map), bufSize, (uintptr_t)values);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGetnPixelMapuiv(context, map, bufSize, values));
+        if (isCallValid)
+        {
+            context->getnPixelMapuiv(map, bufSize, values);
+        }
+        ANGLE_CAPTURE(GetnPixelMapuiv, isCallValid, context, map, bufSize, values);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetnPixelMapusv(GLenum map, GLsizei bufSize, GLushort *values)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetnPixelMapusv,
+          "context = %d, map = %s, bufSize = %d, values = 0x%016" PRIxPTR "", CID(context),
+          GLenumToString(GLenumGroup::PixelMap, map), bufSize, (uintptr_t)values);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGetnPixelMapusv(context, map, bufSize, values));
+        if (isCallValid)
+        {
+            context->getnPixelMapusv(map, bufSize, values);
+        }
+        ANGLE_CAPTURE(GetnPixelMapusv, isCallValid, context, map, bufSize, values);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetnPolygonStipple(GLsizei bufSize, GLubyte *pattern)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetnPolygonStipple, "context = %d, bufSize = %d, pattern = 0x%016" PRIxPTR "",
+          CID(context), bufSize, (uintptr_t)pattern);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateGetnPolygonStipple(context, bufSize, pattern));
+        if (isCallValid)
+        {
+            context->getnPolygonStipple(bufSize, pattern);
+        }
+        ANGLE_CAPTURE(GetnPolygonStipple, isCallValid, context, bufSize, pattern);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetnSeparableFilter(GLenum target,
+                                     GLenum format,
+                                     GLenum type,
+                                     GLsizei rowBufSize,
+                                     void *row,
+                                     GLsizei columnBufSize,
+                                     void *column,
+                                     void *span)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetnSeparableFilter,
+          "context = %d, target = %s, format = %s, type = %s, rowBufSize = %d, row = 0x%016" PRIxPTR
+          ", columnBufSize = %d, column = 0x%016" PRIxPTR ", span = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::SeparableTargetEXT, target),
+          GLenumToString(GLenumGroup::PixelFormat, format),
+          GLenumToString(GLenumGroup::PixelType, type), rowBufSize, (uintptr_t)row, columnBufSize,
+          (uintptr_t)column, (uintptr_t)span);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateGetnSeparableFilter(context, target, format, type, rowBufSize,
+                                                        row, columnBufSize, column, span));
+        if (isCallValid)
+        {
+            context->getnSeparableFilter(target, format, type, rowBufSize, row, columnBufSize,
+                                         column, span);
+        }
+        ANGLE_CAPTURE(GetnSeparableFilter, isCallValid, context, target, format, type, rowBufSize,
+                      row, columnBufSize, column, span);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY
+GetnTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetnTexImage,
+          "context = %d, target = %s, level = %d, format = %s, type = %s, bufSize = %d, pixels = "
+          "0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level,
+          GLenumToString(GLenumGroup::PixelFormat, format),
+          GLenumToString(GLenumGroup::PixelType, type), bufSize, (uintptr_t)pixels);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetnTexImage(context, target, level, format, type, bufSize, pixels));
+        if (isCallValid)
+        {
+            context->getnTexImage(target, level, format, type, bufSize, pixels);
+        }
+        ANGLE_CAPTURE(GetnTexImage, isCallValid, context, target, level, format, type, bufSize,
+                      pixels);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetnUniformdv(GLuint program, GLint location, GLsizei bufSize, GLdouble *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetnUniformdv,
+          "context = %d, program = %u, location = %d, bufSize = %d, params = 0x%016" PRIxPTR "",
+          CID(context), program, location, bufSize, (uintptr_t)params);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetnUniformdv(context, programPacked, locationPacked, bufSize, params));
+        if (isCallValid)
+        {
+            context->getnUniformdv(programPacked, locationPacked, bufSize, params);
+        }
+        ANGLE_CAPTURE(GetnUniformdv, isCallValid, context, programPacked, locationPacked, bufSize,
+                      params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetnUniformfv,
+          "context = %d, program = %u, location = %d, bufSize = %d, params = 0x%016" PRIxPTR "",
+          CID(context), program, location, bufSize, (uintptr_t)params);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetnUniformfv(context, programPacked, locationPacked, bufSize, params));
+        if (isCallValid)
+        {
+            context->getnUniformfv(programPacked, locationPacked, bufSize, params);
+        }
+        ANGLE_CAPTURE(GetnUniformfv, isCallValid, context, programPacked, locationPacked, bufSize,
+                      params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetnUniformiv,
+          "context = %d, program = %u, location = %d, bufSize = %d, params = 0x%016" PRIxPTR "",
+          CID(context), program, location, bufSize, (uintptr_t)params);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetnUniformiv(context, programPacked, locationPacked, bufSize, params));
+        if (isCallValid)
+        {
+            context->getnUniformiv(programPacked, locationPacked, bufSize, params);
+        }
+        ANGLE_CAPTURE(GetnUniformiv, isCallValid, context, programPacked, locationPacked, bufSize,
+                      params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GetnUniformuiv(GLuint program, GLint location, GLsizei bufSize, GLuint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetnUniformuiv,
+          "context = %d, program = %u, location = %d, bufSize = %d, params = 0x%016" PRIxPTR "",
+          CID(context), program, location, bufSize, (uintptr_t)params);
+
+    if (context)
+    {
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetnUniformuiv(context, programPacked, locationPacked, bufSize, params));
+        if (isCallValid)
+        {
+            context->getnUniformuiv(programPacked, locationPacked, bufSize, params);
+        }
+        ANGLE_CAPTURE(GetnUniformuiv, isCallValid, context, programPacked, locationPacked, bufSize,
+                      params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY InvalidateNamedFramebufferData(GLuint framebuffer,
+                                                GLsizei numAttachments,
+                                                const GLenum *attachments)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLInvalidateNamedFramebufferData,
+          "context = %d, framebuffer = %u, numAttachments = %d, attachments = 0x%016" PRIxPTR "",
+          CID(context), framebuffer, numAttachments, (uintptr_t)attachments);
+
+    if (context)
+    {
+        FramebufferID framebufferPacked = PackParam<FramebufferID>(framebuffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateInvalidateNamedFramebufferData(context, framebufferPacked,
+                                                                   numAttachments, attachments));
+        if (isCallValid)
+        {
+            context->invalidateNamedFramebufferData(framebufferPacked, numAttachments, attachments);
+        }
+        ANGLE_CAPTURE(InvalidateNamedFramebufferData, isCallValid, context, framebufferPacked,
+                      numAttachments, attachments);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY InvalidateNamedFramebufferSubData(GLuint framebuffer,
+                                                   GLsizei numAttachments,
+                                                   const GLenum *attachments,
+                                                   GLint x,
+                                                   GLint y,
+                                                   GLsizei width,
+                                                   GLsizei height)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLInvalidateNamedFramebufferSubData,
+          "context = %d, framebuffer = %u, numAttachments = %d, attachments = 0x%016" PRIxPTR
+          ", x = %d, y = %d, width = %d, height = %d",
+          CID(context), framebuffer, numAttachments, (uintptr_t)attachments, x, y, width, height);
+
+    if (context)
+    {
+        FramebufferID framebufferPacked = PackParam<FramebufferID>(framebuffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateInvalidateNamedFramebufferSubData(context, framebufferPacked, numAttachments,
+                                                       attachments, x, y, width, height));
+        if (isCallValid)
+        {
+            context->invalidateNamedFramebufferSubData(framebufferPacked, numAttachments,
+                                                       attachments, x, y, width, height);
+        }
+        ANGLE_CAPTURE(InvalidateNamedFramebufferSubData, isCallValid, context, framebufferPacked,
+                      numAttachments, attachments, x, y, width, height);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void *GL_APIENTRY MapNamedBuffer(GLuint buffer, GLenum access)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMapNamedBuffer, "context = %d, buffer = %u, access = %s", CID(context), buffer,
+          GLenumToString(GLenumGroup::BufferAccessARB, access));
+
+    void *returnValue;
+    if (context)
+    {
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMapNamedBuffer(context, bufferPacked, access));
+        if (isCallValid)
+        {
+            returnValue = context->mapNamedBuffer(bufferPacked, access);
+        }
+        else
+        {
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLMapNamedBuffer, void *>();
+        }
+        ANGLE_CAPTURE(MapNamedBuffer, isCallValid, context, bufferPacked, access, returnValue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLMapNamedBuffer, void *>();
+    }
+    return returnValue;
+}
+
+void *GL_APIENTRY MapNamedBufferRange(GLuint buffer,
+                                      GLintptr offset,
+                                      GLsizeiptr length,
+                                      GLbitfield access)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMapNamedBufferRange,
+          "context = %d, buffer = %u, offset = %llu, length = %llu, access = %s", CID(context),
+          buffer, static_cast<unsigned long long>(offset), static_cast<unsigned long long>(length),
+          GLbitfieldToString(GLenumGroup::BufferAccessMask, access).c_str());
+
+    void *returnValue;
+    if (context)
+    {
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateMapNamedBufferRange(context, bufferPacked, offset, length, access));
+        if (isCallValid)
+        {
+            returnValue = context->mapNamedBufferRange(bufferPacked, offset, length, access);
+        }
+        else
+        {
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLMapNamedBufferRange, void *>();
+        }
+        ANGLE_CAPTURE(MapNamedBufferRange, isCallValid, context, bufferPacked, offset, length,
+                      access, returnValue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLMapNamedBufferRange, void *>();
+    }
+    return returnValue;
+}
+
+void GL_APIENTRY MemoryBarrierByRegion(GLbitfield barriers)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMemoryBarrierByRegion, "context = %d, barriers = %s", CID(context),
+          GLbitfieldToString(GLenumGroup::MemoryBarrierMask, barriers).c_str());
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateMemoryBarrierByRegion(context, barriers));
+        if (isCallValid)
+        {
+            context->memoryBarrierByRegion(barriers);
+        }
+        ANGLE_CAPTURE(MemoryBarrierByRegion, isCallValid, context, barriers);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY NamedBufferData(GLuint buffer, GLsizeiptr size, const void *data, GLenum usage)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLNamedBufferData,
+          "context = %d, buffer = %u, size = %llu, data = 0x%016" PRIxPTR ", usage = %s",
+          CID(context), buffer, static_cast<unsigned long long>(size), (uintptr_t)data,
+          GLenumToString(GLenumGroup::VertexBufferObjectUsage, usage));
+
+    if (context)
+    {
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateNamedBufferData(context, bufferPacked, size, data, usage));
+        if (isCallValid)
+        {
+            context->namedBufferData(bufferPacked, size, data, usage);
+        }
+        ANGLE_CAPTURE(NamedBufferData, isCallValid, context, bufferPacked, size, data, usage);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY NamedBufferStorage(GLuint buffer,
+                                    GLsizeiptr size,
+                                    const void *data,
+                                    GLbitfield flags)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLNamedBufferStorage,
+          "context = %d, buffer = %u, size = %llu, data = 0x%016" PRIxPTR ", flags = %s",
+          CID(context), buffer, static_cast<unsigned long long>(size), (uintptr_t)data,
+          GLbitfieldToString(GLenumGroup::MapBufferUsageMask, flags).c_str());
+
+    if (context)
+    {
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateNamedBufferStorage(context, bufferPacked, size, data, flags));
+        if (isCallValid)
+        {
+            context->namedBufferStorage(bufferPacked, size, data, flags);
+        }
+        ANGLE_CAPTURE(NamedBufferStorage, isCallValid, context, bufferPacked, size, data, flags);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY NamedBufferSubData(GLuint buffer,
+                                    GLintptr offset,
+                                    GLsizeiptr size,
+                                    const void *data)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLNamedBufferSubData,
+          "context = %d, buffer = %u, offset = %llu, size = %llu, data = 0x%016" PRIxPTR "",
+          CID(context), buffer, static_cast<unsigned long long>(offset),
+          static_cast<unsigned long long>(size), (uintptr_t)data);
+
+    if (context)
+    {
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateNamedBufferSubData(context, bufferPacked, offset, size, data));
+        if (isCallValid)
+        {
+            context->namedBufferSubData(bufferPacked, offset, size, data);
+        }
+        ANGLE_CAPTURE(NamedBufferSubData, isCallValid, context, bufferPacked, offset, size, data);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY NamedFramebufferDrawBuffer(GLuint framebuffer, GLenum buf)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLNamedFramebufferDrawBuffer, "context = %d, framebuffer = %u, buf = %s",
+          CID(context), framebuffer, GLenumToString(GLenumGroup::ColorBuffer, buf));
+
+    if (context)
+    {
+        FramebufferID framebufferPacked = PackParam<FramebufferID>(framebuffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateNamedFramebufferDrawBuffer(context, framebufferPacked, buf));
+        if (isCallValid)
+        {
+            context->namedFramebufferDrawBuffer(framebufferPacked, buf);
+        }
+        ANGLE_CAPTURE(NamedFramebufferDrawBuffer, isCallValid, context, framebufferPacked, buf);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY NamedFramebufferDrawBuffers(GLuint framebuffer, GLsizei n, const GLenum *bufs)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLNamedFramebufferDrawBuffers,
+          "context = %d, framebuffer = %u, n = %d, bufs = 0x%016" PRIxPTR "", CID(context),
+          framebuffer, n, (uintptr_t)bufs);
+
+    if (context)
+    {
+        FramebufferID framebufferPacked = PackParam<FramebufferID>(framebuffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateNamedFramebufferDrawBuffers(
+                                                             context, framebufferPacked, n, bufs));
+        if (isCallValid)
+        {
+            context->namedFramebufferDrawBuffers(framebufferPacked, n, bufs);
+        }
+        ANGLE_CAPTURE(NamedFramebufferDrawBuffers, isCallValid, context, framebufferPacked, n,
+                      bufs);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY NamedFramebufferParameteri(GLuint framebuffer, GLenum pname, GLint param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLNamedFramebufferParameteri,
+          "context = %d, framebuffer = %u, pname = %s, param = %d", CID(context), framebuffer,
+          GLenumToString(GLenumGroup::FramebufferParameterName, pname), param);
+
+    if (context)
+    {
+        FramebufferID framebufferPacked = PackParam<FramebufferID>(framebuffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateNamedFramebufferParameteri(context, framebufferPacked, pname, param));
+        if (isCallValid)
+        {
+            context->namedFramebufferParameteri(framebufferPacked, pname, param);
+        }
+        ANGLE_CAPTURE(NamedFramebufferParameteri, isCallValid, context, framebufferPacked, pname,
+                      param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY NamedFramebufferReadBuffer(GLuint framebuffer, GLenum src)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLNamedFramebufferReadBuffer, "context = %d, framebuffer = %u, src = %s",
+          CID(context), framebuffer, GLenumToString(GLenumGroup::ColorBuffer, src));
+
+    if (context)
+    {
+        FramebufferID framebufferPacked = PackParam<FramebufferID>(framebuffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateNamedFramebufferReadBuffer(context, framebufferPacked, src));
+        if (isCallValid)
+        {
+            context->namedFramebufferReadBuffer(framebufferPacked, src);
+        }
+        ANGLE_CAPTURE(NamedFramebufferReadBuffer, isCallValid, context, framebufferPacked, src);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY NamedFramebufferRenderbuffer(GLuint framebuffer,
+                                              GLenum attachment,
+                                              GLenum renderbuffertarget,
+                                              GLuint renderbuffer)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLNamedFramebufferRenderbuffer,
+          "context = %d, framebuffer = %u, attachment = %s, renderbuffertarget = %s, renderbuffer "
+          "= %u",
+          CID(context), framebuffer, GLenumToString(GLenumGroup::FramebufferAttachment, attachment),
+          GLenumToString(GLenumGroup::RenderbufferTarget, renderbuffertarget), renderbuffer);
+
+    if (context)
+    {
+        FramebufferID framebufferPacked   = PackParam<FramebufferID>(framebuffer);
+        RenderbufferID renderbufferPacked = PackParam<RenderbufferID>(renderbuffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateNamedFramebufferRenderbuffer(context, framebufferPacked, attachment,
+                                                  renderbuffertarget, renderbufferPacked));
+        if (isCallValid)
+        {
+            context->namedFramebufferRenderbuffer(framebufferPacked, attachment, renderbuffertarget,
+                                                  renderbufferPacked);
+        }
+        ANGLE_CAPTURE(NamedFramebufferRenderbuffer, isCallValid, context, framebufferPacked,
+                      attachment, renderbuffertarget, renderbufferPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY NamedFramebufferTexture(GLuint framebuffer,
+                                         GLenum attachment,
+                                         GLuint texture,
+                                         GLint level)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLNamedFramebufferTexture,
+          "context = %d, framebuffer = %u, attachment = %s, texture = %u, level = %d", CID(context),
+          framebuffer, GLenumToString(GLenumGroup::FramebufferAttachment, attachment), texture,
+          level);
+
+    if (context)
+    {
+        FramebufferID framebufferPacked = PackParam<FramebufferID>(framebuffer);
+        TextureID texturePacked         = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateNamedFramebufferTexture(context, framebufferPacked, attachment,
+                                                            texturePacked, level));
+        if (isCallValid)
+        {
+            context->namedFramebufferTexture(framebufferPacked, attachment, texturePacked, level);
+        }
+        ANGLE_CAPTURE(NamedFramebufferTexture, isCallValid, context, framebufferPacked, attachment,
+                      texturePacked, level);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY NamedFramebufferTextureLayer(GLuint framebuffer,
+                                              GLenum attachment,
+                                              GLuint texture,
+                                              GLint level,
+                                              GLint layer)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLNamedFramebufferTextureLayer,
+          "context = %d, framebuffer = %u, attachment = %s, texture = %u, level = %d, layer = %d",
+          CID(context), framebuffer, GLenumToString(GLenumGroup::FramebufferAttachment, attachment),
+          texture, level, layer);
+
+    if (context)
+    {
+        FramebufferID framebufferPacked = PackParam<FramebufferID>(framebuffer);
+        TextureID texturePacked         = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateNamedFramebufferTextureLayer(
+                                                             context, framebufferPacked, attachment,
+                                                             texturePacked, level, layer));
+        if (isCallValid)
+        {
+            context->namedFramebufferTextureLayer(framebufferPacked, attachment, texturePacked,
+                                                  level, layer);
+        }
+        ANGLE_CAPTURE(NamedFramebufferTextureLayer, isCallValid, context, framebufferPacked,
+                      attachment, texturePacked, level, layer);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY NamedRenderbufferStorage(GLuint renderbuffer,
+                                          GLenum internalformat,
+                                          GLsizei width,
+                                          GLsizei height)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLNamedRenderbufferStorage,
+          "context = %d, renderbuffer = %u, internalformat = %s, width = %d, height = %d",
+          CID(context), renderbuffer, GLenumToString(GLenumGroup::InternalFormat, internalformat),
+          width, height);
+
+    if (context)
+    {
+        RenderbufferID renderbufferPacked = PackParam<RenderbufferID>(renderbuffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateNamedRenderbufferStorage(context, renderbufferPacked,
+                                                             internalformat, width, height));
+        if (isCallValid)
+        {
+            context->namedRenderbufferStorage(renderbufferPacked, internalformat, width, height);
+        }
+        ANGLE_CAPTURE(NamedRenderbufferStorage, isCallValid, context, renderbufferPacked,
+                      internalformat, width, height);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY NamedRenderbufferStorageMultisample(GLuint renderbuffer,
+                                                     GLsizei samples,
+                                                     GLenum internalformat,
+                                                     GLsizei width,
+                                                     GLsizei height)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLNamedRenderbufferStorageMultisample,
+          "context = %d, renderbuffer = %u, samples = %d, internalformat = %s, width = %d, height "
+          "= %d",
+          CID(context), renderbuffer, samples,
+          GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height);
+
+    if (context)
+    {
+        RenderbufferID renderbufferPacked = PackParam<RenderbufferID>(renderbuffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateNamedRenderbufferStorageMultisample(context, renderbufferPacked, samples,
+                                                         internalformat, width, height));
+        if (isCallValid)
+        {
+            context->namedRenderbufferStorageMultisample(renderbufferPacked, samples,
+                                                         internalformat, width, height);
+        }
+        ANGLE_CAPTURE(NamedRenderbufferStorageMultisample, isCallValid, context, renderbufferPacked,
+                      samples, internalformat, width, height);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY ReadnPixels(GLint x,
+                             GLint y,
+                             GLsizei width,
+                             GLsizei height,
+                             GLenum format,
+                             GLenum type,
+                             GLsizei bufSize,
+                             void *data)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLReadnPixels,
+          "context = %d, x = %d, y = %d, width = %d, height = %d, format = %s, type = %s, bufSize "
+          "= %d, data = 0x%016" PRIxPTR "",
+          CID(context), x, y, width, height, GLenumToString(GLenumGroup::PixelFormat, format),
+          GLenumToString(GLenumGroup::PixelType, type), bufSize, (uintptr_t)data);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateReadnPixels(context, x, y, width, height, format, type, bufSize, data));
+        if (isCallValid)
+        {
+            context->readnPixels(x, y, width, height, format, type, bufSize, data);
+        }
+        ANGLE_CAPTURE(ReadnPixels, isCallValid, context, x, y, width, height, format, type, bufSize,
+                      data);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TextureBarrier()
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTextureBarrier, "context = %d", CID(context));
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateTextureBarrier(context));
+        if (isCallValid)
+        {
+            context->textureBarrier();
+        }
+        ANGLE_CAPTURE(TextureBarrier, isCallValid, context);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TextureBuffer(GLuint texture, GLenum internalformat, GLuint buffer)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTextureBuffer, "context = %d, texture = %u, internalformat = %s, buffer = %u",
+          CID(context), texture, GLenumToString(GLenumGroup::InternalFormat, internalformat),
+          buffer);
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateTextureBuffer(context, texturePacked, internalformat, bufferPacked));
+        if (isCallValid)
+        {
+            context->textureBuffer(texturePacked, internalformat, bufferPacked);
+        }
+        ANGLE_CAPTURE(TextureBuffer, isCallValid, context, texturePacked, internalformat,
+                      bufferPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TextureBufferRange(GLuint texture,
+                                    GLenum internalformat,
+                                    GLuint buffer,
+                                    GLintptr offset,
+                                    GLsizeiptr size)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(
+        context, GLTextureBufferRange,
+        "context = %d, texture = %u, internalformat = %s, buffer = %u, offset = %llu, size = %llu",
+        CID(context), texture, GLenumToString(GLenumGroup::InternalFormat, internalformat), buffer,
+        static_cast<unsigned long long>(offset), static_cast<unsigned long long>(size));
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateTextureBufferRange(context, texturePacked, internalformat,
+                                                       bufferPacked, offset, size));
+        if (isCallValid)
+        {
+            context->textureBufferRange(texturePacked, internalformat, bufferPacked, offset, size);
+        }
+        ANGLE_CAPTURE(TextureBufferRange, isCallValid, context, texturePacked, internalformat,
+                      bufferPacked, offset, size);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TextureParameterIiv(GLuint texture, GLenum pname, const GLint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTextureParameterIiv,
+          "context = %d, texture = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
+          texture, GLenumToString(GLenumGroup::TextureParameterName, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateTextureParameterIiv(context, texturePacked, pname, params));
+        if (isCallValid)
+        {
+            context->textureParameterIiv(texturePacked, pname, params);
+        }
+        ANGLE_CAPTURE(TextureParameterIiv, isCallValid, context, texturePacked, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TextureParameterIuiv(GLuint texture, GLenum pname, const GLuint *params)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTextureParameterIuiv,
+          "context = %d, texture = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
+          texture, GLenumToString(GLenumGroup::TextureParameterName, pname), (uintptr_t)params);
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateTextureParameterIuiv(context, texturePacked, pname, params));
+        if (isCallValid)
+        {
+            context->textureParameterIuiv(texturePacked, pname, params);
+        }
+        ANGLE_CAPTURE(TextureParameterIuiv, isCallValid, context, texturePacked, pname, params);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TextureParameterf(GLuint texture, GLenum pname, GLfloat param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTextureParameterf, "context = %d, texture = %u, pname = %s, param = %f",
+          CID(context), texture, GLenumToString(GLenumGroup::TextureParameterName, pname), param);
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateTextureParameterf(context, texturePacked, pname, param));
+        if (isCallValid)
+        {
+            context->textureParameterf(texturePacked, pname, param);
+        }
+        ANGLE_CAPTURE(TextureParameterf, isCallValid, context, texturePacked, pname, param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TextureParameterfv(GLuint texture, GLenum pname, const GLfloat *param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTextureParameterfv,
+          "context = %d, texture = %u, pname = %s, param = 0x%016" PRIxPTR "", CID(context),
+          texture, GLenumToString(GLenumGroup::TextureParameterName, pname), (uintptr_t)param);
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateTextureParameterfv(context, texturePacked, pname, param));
+        if (isCallValid)
+        {
+            context->textureParameterfv(texturePacked, pname, param);
+        }
+        ANGLE_CAPTURE(TextureParameterfv, isCallValid, context, texturePacked, pname, param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TextureParameteri(GLuint texture, GLenum pname, GLint param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTextureParameteri, "context = %d, texture = %u, pname = %s, param = %d",
+          CID(context), texture, GLenumToString(GLenumGroup::TextureParameterName, pname), param);
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateTextureParameteri(context, texturePacked, pname, param));
+        if (isCallValid)
+        {
+            context->textureParameteri(texturePacked, pname, param);
+        }
+        ANGLE_CAPTURE(TextureParameteri, isCallValid, context, texturePacked, pname, param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TextureParameteriv(GLuint texture, GLenum pname, const GLint *param)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTextureParameteriv,
+          "context = %d, texture = %u, pname = %s, param = 0x%016" PRIxPTR "", CID(context),
+          texture, GLenumToString(GLenumGroup::TextureParameterName, pname), (uintptr_t)param);
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateTextureParameteriv(context, texturePacked, pname, param));
+        if (isCallValid)
+        {
+            context->textureParameteriv(texturePacked, pname, param);
+        }
+        ANGLE_CAPTURE(TextureParameteriv, isCallValid, context, texturePacked, pname, param);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TextureStorage1D(GLuint texture,
+                                  GLsizei levels,
+                                  GLenum internalformat,
+                                  GLsizei width)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTextureStorage1D,
+          "context = %d, texture = %u, levels = %d, internalformat = %s, width = %d", CID(context),
+          texture, levels, GLenumToString(GLenumGroup::InternalFormat, internalformat), width);
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateTextureStorage1D(context, texturePacked, levels, internalformat, width));
+        if (isCallValid)
+        {
+            context->textureStorage1D(texturePacked, levels, internalformat, width);
+        }
+        ANGLE_CAPTURE(TextureStorage1D, isCallValid, context, texturePacked, levels, internalformat,
+                      width);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TextureStorage2D(GLuint texture,
+                                  GLsizei levels,
+                                  GLenum internalformat,
+                                  GLsizei width,
+                                  GLsizei height)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTextureStorage2D,
+          "context = %d, texture = %u, levels = %d, internalformat = %s, width = %d, height = %d",
+          CID(context), texture, levels,
+          GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height);
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateTextureStorage2D(context, texturePacked, levels,
+                                                                   internalformat, width, height));
+        if (isCallValid)
+        {
+            context->textureStorage2D(texturePacked, levels, internalformat, width, height);
+        }
+        ANGLE_CAPTURE(TextureStorage2D, isCallValid, context, texturePacked, levels, internalformat,
+                      width, height);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TextureStorage2DMultisample(GLuint texture,
+                                             GLsizei samples,
+                                             GLenum internalformat,
+                                             GLsizei width,
+                                             GLsizei height,
+                                             GLboolean fixedsamplelocations)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTextureStorage2DMultisample,
+          "context = %d, texture = %u, samples = %d, internalformat = %s, width = %d, height = %d, "
+          "fixedsamplelocations = %s",
+          CID(context), texture, samples,
+          GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height,
+          GLbooleanToString(fixedsamplelocations));
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateTextureStorage2DMultisample(context, texturePacked, samples, internalformat,
+                                                 width, height, fixedsamplelocations));
+        if (isCallValid)
+        {
+            context->textureStorage2DMultisample(texturePacked, samples, internalformat, width,
+                                                 height, fixedsamplelocations);
+        }
+        ANGLE_CAPTURE(TextureStorage2DMultisample, isCallValid, context, texturePacked, samples,
+                      internalformat, width, height, fixedsamplelocations);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TextureStorage3D(GLuint texture,
+                                  GLsizei levels,
+                                  GLenum internalformat,
+                                  GLsizei width,
+                                  GLsizei height,
+                                  GLsizei depth)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTextureStorage3D,
+          "context = %d, texture = %u, levels = %d, internalformat = %s, width = %d, height = %d, "
+          "depth = %d",
+          CID(context), texture, levels,
+          GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height, depth);
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateTextureStorage3D(context, texturePacked, levels, internalformat,
+                                                     width, height, depth));
+        if (isCallValid)
+        {
+            context->textureStorage3D(texturePacked, levels, internalformat, width, height, depth);
+        }
+        ANGLE_CAPTURE(TextureStorage3D, isCallValid, context, texturePacked, levels, internalformat,
+                      width, height, depth);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TextureStorage3DMultisample(GLuint texture,
+                                             GLsizei samples,
+                                             GLenum internalformat,
+                                             GLsizei width,
+                                             GLsizei height,
+                                             GLsizei depth,
+                                             GLboolean fixedsamplelocations)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTextureStorage3DMultisample,
+          "context = %d, texture = %u, samples = %d, internalformat = %s, width = %d, height = %d, "
+          "depth = %d, fixedsamplelocations = %s",
+          CID(context), texture, samples,
+          GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height, depth,
+          GLbooleanToString(fixedsamplelocations));
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateTextureStorage3DMultisample(context, texturePacked, samples, internalformat,
+                                                 width, height, depth, fixedsamplelocations));
+        if (isCallValid)
+        {
+            context->textureStorage3DMultisample(texturePacked, samples, internalformat, width,
+                                                 height, depth, fixedsamplelocations);
+        }
+        ANGLE_CAPTURE(TextureStorage3DMultisample, isCallValid, context, texturePacked, samples,
+                      internalformat, width, height, depth, fixedsamplelocations);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TextureSubImage1D(GLuint texture,
+                                   GLint level,
+                                   GLint xoffset,
+                                   GLsizei width,
+                                   GLenum format,
+                                   GLenum type,
+                                   const void *pixels)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTextureSubImage1D,
+          "context = %d, texture = %u, level = %d, xoffset = %d, width = %d, format = %s, type = "
+          "%s, pixels = 0x%016" PRIxPTR "",
+          CID(context), texture, level, xoffset, width,
+          GLenumToString(GLenumGroup::PixelFormat, format),
+          GLenumToString(GLenumGroup::PixelType, type), (uintptr_t)pixels);
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateTextureSubImage1D(context, texturePacked, level, xoffset, width,
+                                                      format, type, pixels));
+        if (isCallValid)
+        {
+            context->textureSubImage1D(texturePacked, level, xoffset, width, format, type, pixels);
+        }
+        ANGLE_CAPTURE(TextureSubImage1D, isCallValid, context, texturePacked, level, xoffset, width,
+                      format, type, pixels);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TextureSubImage2D(GLuint texture,
+                                   GLint level,
+                                   GLint xoffset,
+                                   GLint yoffset,
+                                   GLsizei width,
+                                   GLsizei height,
+                                   GLenum format,
+                                   GLenum type,
+                                   const void *pixels)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTextureSubImage2D,
+          "context = %d, texture = %u, level = %d, xoffset = %d, yoffset = %d, width = %d, height "
+          "= %d, format = %s, type = %s, pixels = 0x%016" PRIxPTR "",
+          CID(context), texture, level, xoffset, yoffset, width, height,
+          GLenumToString(GLenumGroup::PixelFormat, format),
+          GLenumToString(GLenumGroup::PixelType, type), (uintptr_t)pixels);
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateTextureSubImage2D(context, texturePacked, level, xoffset, yoffset, width,
+                                       height, format, type, pixels));
+        if (isCallValid)
+        {
+            context->textureSubImage2D(texturePacked, level, xoffset, yoffset, width, height,
+                                       format, type, pixels);
+        }
+        ANGLE_CAPTURE(TextureSubImage2D, isCallValid, context, texturePacked, level, xoffset,
+                      yoffset, width, height, format, type, pixels);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TextureSubImage3D(GLuint texture,
+                                   GLint level,
+                                   GLint xoffset,
+                                   GLint yoffset,
+                                   GLint zoffset,
+                                   GLsizei width,
+                                   GLsizei height,
+                                   GLsizei depth,
+                                   GLenum format,
+                                   GLenum type,
+                                   const void *pixels)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTextureSubImage3D,
+          "context = %d, texture = %u, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, width "
+          "= %d, height = %d, depth = %d, format = %s, type = %s, pixels = 0x%016" PRIxPTR "",
+          CID(context), texture, level, xoffset, yoffset, zoffset, width, height, depth,
+          GLenumToString(GLenumGroup::PixelFormat, format),
+          GLenumToString(GLenumGroup::PixelType, type), (uintptr_t)pixels);
+
+    if (context)
+    {
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateTextureSubImage3D(context, texturePacked, level, xoffset, yoffset, zoffset,
+                                       width, height, depth, format, type, pixels));
+        if (isCallValid)
+        {
+            context->textureSubImage3D(texturePacked, level, xoffset, yoffset, zoffset, width,
+                                       height, depth, format, type, pixels);
+        }
+        ANGLE_CAPTURE(TextureSubImage3D, isCallValid, context, texturePacked, level, xoffset,
+                      yoffset, zoffset, width, height, depth, format, type, pixels);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TransformFeedbackBufferBase(GLuint xfb, GLuint index, GLuint buffer)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTransformFeedbackBufferBase, "context = %d, xfb = %u, index = %u, buffer = %u",
+          CID(context), xfb, index, buffer);
+
+    if (context)
+    {
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateTransformFeedbackBufferBase(context, xfb, index, bufferPacked));
+        if (isCallValid)
+        {
+            context->transformFeedbackBufferBase(xfb, index, bufferPacked);
+        }
+        ANGLE_CAPTURE(TransformFeedbackBufferBase, isCallValid, context, xfb, index, bufferPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY TransformFeedbackBufferRange(GLuint xfb,
+                                              GLuint index,
+                                              GLuint buffer,
+                                              GLintptr offset,
+                                              GLsizeiptr size)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLTransformFeedbackBufferRange,
+          "context = %d, xfb = %u, index = %u, buffer = %u, offset = %llu, size = %llu",
+          CID(context), xfb, index, buffer, static_cast<unsigned long long>(offset),
+          static_cast<unsigned long long>(size));
+
+    if (context)
+    {
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateTransformFeedbackBufferRange(context, xfb, index, bufferPacked, offset, size));
+        if (isCallValid)
+        {
+            context->transformFeedbackBufferRange(xfb, index, bufferPacked, offset, size);
+        }
+        ANGLE_CAPTURE(TransformFeedbackBufferRange, isCallValid, context, xfb, index, bufferPacked,
+                      offset, size);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+GLboolean GL_APIENTRY UnmapNamedBuffer(GLuint buffer)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLUnmapNamedBuffer, "context = %d, buffer = %u", CID(context), buffer);
+
+    GLboolean returnValue;
+    if (context)
+    {
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() || ValidateUnmapNamedBuffer(context, bufferPacked));
+        if (isCallValid)
+        {
+            returnValue = context->unmapNamedBuffer(bufferPacked);
+        }
+        else
+        {
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLUnmapNamedBuffer, GLboolean>();
+        }
+        ANGLE_CAPTURE(UnmapNamedBuffer, isCallValid, context, bufferPacked, returnValue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLUnmapNamedBuffer, GLboolean>();
+    }
+    return returnValue;
+}
+
+void GL_APIENTRY VertexArrayAttribBinding(GLuint vaobj, GLuint attribindex, GLuint bindingindex)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexArrayAttribBinding,
+          "context = %d, vaobj = %u, attribindex = %u, bindingindex = %u", CID(context), vaobj,
+          attribindex, bindingindex);
+
+    if (context)
+    {
+        VertexArrayID vaobjPacked                             = PackParam<VertexArrayID>(vaobj);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateVertexArrayAttribBinding(context, vaobjPacked, attribindex, bindingindex));
+        if (isCallValid)
+        {
+            context->vertexArrayAttribBinding(vaobjPacked, attribindex, bindingindex);
+        }
+        ANGLE_CAPTURE(VertexArrayAttribBinding, isCallValid, context, vaobjPacked, attribindex,
+                      bindingindex);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexArrayAttribFormat(GLuint vaobj,
+                                         GLuint attribindex,
+                                         GLint size,
+                                         GLenum type,
+                                         GLboolean normalized,
+                                         GLuint relativeoffset)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexArrayAttribFormat,
+          "context = %d, vaobj = %u, attribindex = %u, size = %d, type = %s, normalized = %s, "
+          "relativeoffset = %u",
+          CID(context), vaobj, attribindex, size,
+          GLenumToString(GLenumGroup::VertexAttribType, type), GLbooleanToString(normalized),
+          relativeoffset);
+
+    if (context)
+    {
+        VertexArrayID vaobjPacked                             = PackParam<VertexArrayID>(vaobj);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateVertexArrayAttribFormat(context, vaobjPacked, attribindex, size,
+                                                            type, normalized, relativeoffset));
+        if (isCallValid)
+        {
+            context->vertexArrayAttribFormat(vaobjPacked, attribindex, size, type, normalized,
+                                             relativeoffset);
+        }
+        ANGLE_CAPTURE(VertexArrayAttribFormat, isCallValid, context, vaobjPacked, attribindex, size,
+                      type, normalized, relativeoffset);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexArrayAttribIFormat(GLuint vaobj,
+                                          GLuint attribindex,
+                                          GLint size,
+                                          GLenum type,
+                                          GLuint relativeoffset)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexArrayAttribIFormat,
+          "context = %d, vaobj = %u, attribindex = %u, size = %d, type = %s, relativeoffset = %u",
+          CID(context), vaobj, attribindex, size,
+          GLenumToString(GLenumGroup::VertexAttribType, type), relativeoffset);
+
+    if (context)
+    {
+        VertexArrayID vaobjPacked                             = PackParam<VertexArrayID>(vaobj);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateVertexArrayAttribIFormat(context, vaobjPacked, attribindex,
+                                                             size, type, relativeoffset));
+        if (isCallValid)
+        {
+            context->vertexArrayAttribIFormat(vaobjPacked, attribindex, size, type, relativeoffset);
+        }
+        ANGLE_CAPTURE(VertexArrayAttribIFormat, isCallValid, context, vaobjPacked, attribindex,
+                      size, type, relativeoffset);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexArrayAttribLFormat(GLuint vaobj,
+                                          GLuint attribindex,
+                                          GLint size,
+                                          GLenum type,
+                                          GLuint relativeoffset)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexArrayAttribLFormat,
+          "context = %d, vaobj = %u, attribindex = %u, size = %d, type = %s, relativeoffset = %u",
+          CID(context), vaobj, attribindex, size,
+          GLenumToString(GLenumGroup::VertexAttribType, type), relativeoffset);
+
+    if (context)
+    {
+        VertexArrayID vaobjPacked                             = PackParam<VertexArrayID>(vaobj);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateVertexArrayAttribLFormat(context, vaobjPacked, attribindex,
+                                                             size, type, relativeoffset));
+        if (isCallValid)
+        {
+            context->vertexArrayAttribLFormat(vaobjPacked, attribindex, size, type, relativeoffset);
+        }
+        ANGLE_CAPTURE(VertexArrayAttribLFormat, isCallValid, context, vaobjPacked, attribindex,
+                      size, type, relativeoffset);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexArrayBindingDivisor(GLuint vaobj, GLuint bindingindex, GLuint divisor)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexArrayBindingDivisor,
+          "context = %d, vaobj = %u, bindingindex = %u, divisor = %u", CID(context), vaobj,
+          bindingindex, divisor);
+
+    if (context)
+    {
+        VertexArrayID vaobjPacked                             = PackParam<VertexArrayID>(vaobj);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateVertexArrayBindingDivisor(context, vaobjPacked, bindingindex, divisor));
+        if (isCallValid)
+        {
+            context->vertexArrayBindingDivisor(vaobjPacked, bindingindex, divisor);
+        }
+        ANGLE_CAPTURE(VertexArrayBindingDivisor, isCallValid, context, vaobjPacked, bindingindex,
+                      divisor);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexArrayElementBuffer(GLuint vaobj, GLuint buffer)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexArrayElementBuffer, "context = %d, vaobj = %u, buffer = %u",
+          CID(context), vaobj, buffer);
+
+    if (context)
+    {
+        VertexArrayID vaobjPacked                             = PackParam<VertexArrayID>(vaobj);
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateVertexArrayElementBuffer(context, vaobjPacked, bufferPacked));
+        if (isCallValid)
+        {
+            context->vertexArrayElementBuffer(vaobjPacked, bufferPacked);
+        }
+        ANGLE_CAPTURE(VertexArrayElementBuffer, isCallValid, context, vaobjPacked, bufferPacked);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexArrayVertexBuffer(GLuint vaobj,
+                                         GLuint bindingindex,
+                                         GLuint buffer,
+                                         GLintptr offset,
+                                         GLsizei stride)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexArrayVertexBuffer,
+          "context = %d, vaobj = %u, bindingindex = %u, buffer = %u, offset = %llu, stride = %d",
+          CID(context), vaobj, bindingindex, buffer, static_cast<unsigned long long>(offset),
+          stride);
+
+    if (context)
+    {
+        VertexArrayID vaobjPacked                             = PackParam<VertexArrayID>(vaobj);
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateVertexArrayVertexBuffer(context, vaobjPacked, bindingindex,
+                                                            bufferPacked, offset, stride));
+        if (isCallValid)
+        {
+            context->vertexArrayVertexBuffer(vaobjPacked, bindingindex, bufferPacked, offset,
+                                             stride);
+        }
+        ANGLE_CAPTURE(VertexArrayVertexBuffer, isCallValid, context, vaobjPacked, bindingindex,
+                      bufferPacked, offset, stride);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY VertexArrayVertexBuffers(GLuint vaobj,
+                                          GLuint first,
+                                          GLsizei count,
+                                          const GLuint *buffers,
+                                          const GLintptr *offsets,
+                                          const GLsizei *strides)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLVertexArrayVertexBuffers,
+          "context = %d, vaobj = %u, first = %u, count = %d, buffers = 0x%016" PRIxPTR
+          ", offsets = 0x%016" PRIxPTR ", strides = 0x%016" PRIxPTR "",
+          CID(context), vaobj, first, count, (uintptr_t)buffers, (uintptr_t)offsets,
+          (uintptr_t)strides);
+
+    if (context)
+    {
+        VertexArrayID vaobjPacked     = PackParam<VertexArrayID>(vaobj);
+        const BufferID *buffersPacked = PackParam<const BufferID *>(buffers);
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateVertexArrayVertexBuffers(context, vaobjPacked, first, count,
+                                                             buffersPacked, offsets, strides));
+        if (isCallValid)
+        {
+            context->vertexArrayVertexBuffers(vaobjPacked, first, count, buffersPacked, offsets,
+                                              strides);
+        }
+        ANGLE_CAPTURE(VertexArrayVertexBuffers, isCallValid, context, vaobjPacked, first, count,
+                      buffersPacked, offsets, strides);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+// GL 4.6
+void GL_APIENTRY MultiDrawArraysIndirectCount(GLenum mode,
+                                              const void *indirect,
+                                              GLintptr drawcount,
+                                              GLsizei maxdrawcount,
+                                              GLsizei stride)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiDrawArraysIndirectCount,
+          "context = %d, mode = %s, indirect = 0x%016" PRIxPTR
+          ", drawcount = %llu, maxdrawcount = %d, stride = %d",
+          CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), (uintptr_t)indirect,
+          static_cast<unsigned long long>(drawcount), maxdrawcount, stride);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateMultiDrawArraysIndirectCount(context, mode, indirect, drawcount,
+                                                                 maxdrawcount, stride));
+        if (isCallValid)
+        {
+            context->multiDrawArraysIndirectCount(mode, indirect, drawcount, maxdrawcount, stride);
+        }
+        ANGLE_CAPTURE(MultiDrawArraysIndirectCount, isCallValid, context, mode, indirect, drawcount,
+                      maxdrawcount, stride);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY MultiDrawElementsIndirectCount(GLenum mode,
+                                                GLenum type,
+                                                const void *indirect,
+                                                GLintptr drawcount,
+                                                GLsizei maxdrawcount,
+                                                GLsizei stride)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLMultiDrawElementsIndirectCount,
+          "context = %d, mode = %s, type = %s, indirect = 0x%016" PRIxPTR
+          ", drawcount = %llu, maxdrawcount = %d, stride = %d",
+          CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode),
+          GLenumToString(GLenumGroup::DefaultGroup, type), (uintptr_t)indirect,
+          static_cast<unsigned long long>(drawcount), maxdrawcount, stride);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateMultiDrawElementsIndirectCount(
+                                context, mode, type, indirect, drawcount, maxdrawcount, stride));
+        if (isCallValid)
+        {
+            context->multiDrawElementsIndirectCount(mode, type, indirect, drawcount, maxdrawcount,
+                                                    stride);
+        }
+        ANGLE_CAPTURE(MultiDrawElementsIndirectCount, isCallValid, context, mode, type, indirect,
+                      drawcount, maxdrawcount, stride);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY PolygonOffsetClamp(GLfloat factor, GLfloat units, GLfloat clamp)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLPolygonOffsetClamp, "context = %d, factor = %f, units = %f, clamp = %f",
+          CID(context), factor, units, clamp);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidatePolygonOffsetClamp(context, factor, units, clamp));
+        if (isCallValid)
+        {
+            context->polygonOffsetClamp(factor, units, clamp);
+        }
+        ANGLE_CAPTURE(PolygonOffsetClamp, isCallValid, context, factor, units, clamp);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY SpecializeShader(GLuint shader,
+                                  const GLchar *pEntryPoint,
+                                  GLuint numSpecializationConstants,
+                                  const GLuint *pConstantIndex,
+                                  const GLuint *pConstantValue)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLSpecializeShader,
+          "context = %d, shader = %u, pEntryPoint = 0x%016" PRIxPTR
+          ", numSpecializationConstants = %u, pConstantIndex = 0x%016" PRIxPTR
+          ", pConstantValue = 0x%016" PRIxPTR "",
+          CID(context), shader, (uintptr_t)pEntryPoint, numSpecializationConstants,
+          (uintptr_t)pConstantIndex, (uintptr_t)pConstantValue);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateSpecializeShader(context, shader, pEntryPoint, numSpecializationConstants,
+                                      pConstantIndex, pConstantValue));
+        if (isCallValid)
+        {
+            context->specializeShader(shader, pEntryPoint, numSpecializationConstants,
+                                      pConstantIndex, pConstantValue);
+        }
+        ANGLE_CAPTURE(SpecializeShader, isCallValid, context, shader, pEntryPoint,
+                      numSpecializationConstants, pConstantIndex, pConstantValue);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+}  // namespace gl
diff --git a/src/libGL/entry_points_gl_4_autogen.h b/src/libGL/entry_points_gl_4_autogen.h
new file mode 100644
index 0000000..3603641
--- /dev/null
+++ b/src/libGL/entry_points_gl_4_autogen.h
@@ -0,0 +1,1119 @@
+// GENERATED FILE - DO NOT EDIT.
+// Generated by generate_entry_points.py using data from gl.xml.
+//
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// entry_points_gl_4_autogen.h:
+//   Defines the Desktop GL 4.x entry points.
+
+#ifndef LIBGL_ENTRY_POINTS_GL_4_AUTOGEN_H_
+#define LIBGL_ENTRY_POINTS_GL_4_AUTOGEN_H_
+
+#include <export.h>
+#include "angle_gl.h"
+
+namespace gl
+{
+
+// GL 4.0
+ANGLE_EXPORT void GL_APIENTRY BeginQueryIndexed(GLenum target, GLuint index, GLuint id);
+ANGLE_EXPORT void GL_APIENTRY BindTransformFeedback(GLenum target, GLuint id);
+ANGLE_EXPORT void GL_APIENTRY BlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+ANGLE_EXPORT void GL_APIENTRY BlendEquationi(GLuint buf, GLenum mode);
+ANGLE_EXPORT void GL_APIENTRY
+BlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+ANGLE_EXPORT void GL_APIENTRY BlendFunci(GLuint buf, GLenum src, GLenum dst);
+ANGLE_EXPORT void GL_APIENTRY DeleteTransformFeedbacks(GLsizei n, const GLuint *ids);
+ANGLE_EXPORT void GL_APIENTRY DrawArraysIndirect(GLenum mode, const void *indirect);
+ANGLE_EXPORT void GL_APIENTRY DrawElementsIndirect(GLenum mode, GLenum type, const void *indirect);
+ANGLE_EXPORT void GL_APIENTRY DrawTransformFeedback(GLenum mode, GLuint id);
+ANGLE_EXPORT void GL_APIENTRY DrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream);
+ANGLE_EXPORT void GL_APIENTRY EndQueryIndexed(GLenum target, GLuint index);
+ANGLE_EXPORT void GL_APIENTRY GenTransformFeedbacks(GLsizei n, GLuint *ids);
+ANGLE_EXPORT void GL_APIENTRY GetActiveSubroutineName(GLuint program,
+                                                      GLenum shadertype,
+                                                      GLuint index,
+                                                      GLsizei bufsize,
+                                                      GLsizei *length,
+                                                      GLchar *name);
+ANGLE_EXPORT void GL_APIENTRY GetActiveSubroutineUniformName(GLuint program,
+                                                             GLenum shadertype,
+                                                             GLuint index,
+                                                             GLsizei bufsize,
+                                                             GLsizei *length,
+                                                             GLchar *name);
+ANGLE_EXPORT void GL_APIENTRY GetActiveSubroutineUniformiv(GLuint program,
+                                                           GLenum shadertype,
+                                                           GLuint index,
+                                                           GLenum pname,
+                                                           GLint *values);
+ANGLE_EXPORT void GL_APIENTRY GetProgramStageiv(GLuint program,
+                                                GLenum shadertype,
+                                                GLenum pname,
+                                                GLint *values);
+ANGLE_EXPORT void GL_APIENTRY GetQueryIndexediv(GLenum target,
+                                                GLuint index,
+                                                GLenum pname,
+                                                GLint *params);
+ANGLE_EXPORT GLuint GL_APIENTRY GetSubroutineIndex(GLuint program,
+                                                   GLenum shadertype,
+                                                   const GLchar *name);
+ANGLE_EXPORT GLint GL_APIENTRY GetSubroutineUniformLocation(GLuint program,
+                                                            GLenum shadertype,
+                                                            const GLchar *name);
+ANGLE_EXPORT void GL_APIENTRY GetUniformSubroutineuiv(GLenum shadertype,
+                                                      GLint location,
+                                                      GLuint *params);
+ANGLE_EXPORT void GL_APIENTRY GetUniformdv(GLuint program, GLint location, GLdouble *params);
+ANGLE_EXPORT GLboolean GL_APIENTRY IsTransformFeedback(GLuint id);
+ANGLE_EXPORT void GL_APIENTRY MinSampleShading(GLfloat value);
+ANGLE_EXPORT void GL_APIENTRY PatchParameterfv(GLenum pname, const GLfloat *values);
+ANGLE_EXPORT void GL_APIENTRY PatchParameteri(GLenum pname, GLint value);
+ANGLE_EXPORT void GL_APIENTRY PauseTransformFeedback();
+ANGLE_EXPORT void GL_APIENTRY ResumeTransformFeedback();
+ANGLE_EXPORT void GL_APIENTRY Uniform1d(GLint location, GLdouble x);
+ANGLE_EXPORT void GL_APIENTRY Uniform1dv(GLint location, GLsizei count, const GLdouble *value);
+ANGLE_EXPORT void GL_APIENTRY Uniform2d(GLint location, GLdouble x, GLdouble y);
+ANGLE_EXPORT void GL_APIENTRY Uniform2dv(GLint location, GLsizei count, const GLdouble *value);
+ANGLE_EXPORT void GL_APIENTRY Uniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z);
+ANGLE_EXPORT void GL_APIENTRY Uniform3dv(GLint location, GLsizei count, const GLdouble *value);
+ANGLE_EXPORT void GL_APIENTRY
+Uniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ANGLE_EXPORT void GL_APIENTRY Uniform4dv(GLint location, GLsizei count, const GLdouble *value);
+ANGLE_EXPORT void GL_APIENTRY UniformMatrix2dv(GLint location,
+                                               GLsizei count,
+                                               GLboolean transpose,
+                                               const GLdouble *value);
+ANGLE_EXPORT void GL_APIENTRY UniformMatrix2x3dv(GLint location,
+                                                 GLsizei count,
+                                                 GLboolean transpose,
+                                                 const GLdouble *value);
+ANGLE_EXPORT void GL_APIENTRY UniformMatrix2x4dv(GLint location,
+                                                 GLsizei count,
+                                                 GLboolean transpose,
+                                                 const GLdouble *value);
+ANGLE_EXPORT void GL_APIENTRY UniformMatrix3dv(GLint location,
+                                               GLsizei count,
+                                               GLboolean transpose,
+                                               const GLdouble *value);
+ANGLE_EXPORT void GL_APIENTRY UniformMatrix3x2dv(GLint location,
+                                                 GLsizei count,
+                                                 GLboolean transpose,
+                                                 const GLdouble *value);
+ANGLE_EXPORT void GL_APIENTRY UniformMatrix3x4dv(GLint location,
+                                                 GLsizei count,
+                                                 GLboolean transpose,
+                                                 const GLdouble *value);
+ANGLE_EXPORT void GL_APIENTRY UniformMatrix4dv(GLint location,
+                                               GLsizei count,
+                                               GLboolean transpose,
+                                               const GLdouble *value);
+ANGLE_EXPORT void GL_APIENTRY UniformMatrix4x2dv(GLint location,
+                                                 GLsizei count,
+                                                 GLboolean transpose,
+                                                 const GLdouble *value);
+ANGLE_EXPORT void GL_APIENTRY UniformMatrix4x3dv(GLint location,
+                                                 GLsizei count,
+                                                 GLboolean transpose,
+                                                 const GLdouble *value);
+ANGLE_EXPORT void GL_APIENTRY UniformSubroutinesuiv(GLenum shadertype,
+                                                    GLsizei count,
+                                                    const GLuint *indices);
+
+// GL 4.1
+ANGLE_EXPORT void GL_APIENTRY ActiveShaderProgram(GLuint pipeline, GLuint program);
+ANGLE_EXPORT void GL_APIENTRY BindProgramPipeline(GLuint pipeline);
+ANGLE_EXPORT void GL_APIENTRY ClearDepthf(GLfloat d);
+ANGLE_EXPORT GLuint GL_APIENTRY CreateShaderProgramv(GLenum type,
+                                                     GLsizei count,
+                                                     const GLchar *const *strings);
+ANGLE_EXPORT void GL_APIENTRY DeleteProgramPipelines(GLsizei n, const GLuint *pipelines);
+ANGLE_EXPORT void GL_APIENTRY DepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v);
+ANGLE_EXPORT void GL_APIENTRY DepthRangeIndexed(GLuint index, GLdouble n, GLdouble f);
+ANGLE_EXPORT void GL_APIENTRY DepthRangef(GLfloat n, GLfloat f);
+ANGLE_EXPORT void GL_APIENTRY GenProgramPipelines(GLsizei n, GLuint *pipelines);
+ANGLE_EXPORT void GL_APIENTRY GetDoublei_v(GLenum target, GLuint index, GLdouble *data);
+ANGLE_EXPORT void GL_APIENTRY GetFloati_v(GLenum target, GLuint index, GLfloat *data);
+ANGLE_EXPORT void GL_APIENTRY GetProgramBinary(GLuint program,
+                                               GLsizei bufSize,
+                                               GLsizei *length,
+                                               GLenum *binaryFormat,
+                                               void *binary);
+ANGLE_EXPORT void GL_APIENTRY GetProgramPipelineInfoLog(GLuint pipeline,
+                                                        GLsizei bufSize,
+                                                        GLsizei *length,
+                                                        GLchar *infoLog);
+ANGLE_EXPORT void GL_APIENTRY GetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params);
+ANGLE_EXPORT void GL_APIENTRY GetShaderPrecisionFormat(GLenum shadertype,
+                                                       GLenum precisiontype,
+                                                       GLint *range,
+                                                       GLint *precision);
+ANGLE_EXPORT void GL_APIENTRY GetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params);
+ANGLE_EXPORT GLboolean GL_APIENTRY IsProgramPipeline(GLuint pipeline);
+ANGLE_EXPORT void GL_APIENTRY ProgramBinary(GLuint program,
+                                            GLenum binaryFormat,
+                                            const void *binary,
+                                            GLsizei length);
+ANGLE_EXPORT void GL_APIENTRY ProgramParameteri(GLuint program, GLenum pname, GLint value);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniform1d(GLuint program, GLint location, GLdouble v0);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniform1dv(GLuint program,
+                                                GLint location,
+                                                GLsizei count,
+                                                const GLdouble *value);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniform1f(GLuint program, GLint location, GLfloat v0);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniform1fv(GLuint program,
+                                                GLint location,
+                                                GLsizei count,
+                                                const GLfloat *value);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniform1i(GLuint program, GLint location, GLint v0);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniform1iv(GLuint program,
+                                                GLint location,
+                                                GLsizei count,
+                                                const GLint *value);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniform1ui(GLuint program, GLint location, GLuint v0);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniform1uiv(GLuint program,
+                                                 GLint location,
+                                                 GLsizei count,
+                                                 const GLuint *value);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniform2d(GLuint program,
+                                               GLint location,
+                                               GLdouble v0,
+                                               GLdouble v1);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniform2dv(GLuint program,
+                                                GLint location,
+                                                GLsizei count,
+                                                const GLdouble *value);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniform2f(GLuint program,
+                                               GLint location,
+                                               GLfloat v0,
+                                               GLfloat v1);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniform2fv(GLuint program,
+                                                GLint location,
+                                                GLsizei count,
+                                                const GLfloat *value);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniform2iv(GLuint program,
+                                                GLint location,
+                                                GLsizei count,
+                                                const GLint *value);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniform2ui(GLuint program,
+                                                GLint location,
+                                                GLuint v0,
+                                                GLuint v1);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniform2uiv(GLuint program,
+                                                 GLint location,
+                                                 GLsizei count,
+                                                 const GLuint *value);
+ANGLE_EXPORT void GL_APIENTRY
+ProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniform3dv(GLuint program,
+                                                GLint location,
+                                                GLsizei count,
+                                                const GLdouble *value);
+ANGLE_EXPORT void GL_APIENTRY
+ProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniform3fv(GLuint program,
+                                                GLint location,
+                                                GLsizei count,
+                                                const GLfloat *value);
+ANGLE_EXPORT void GL_APIENTRY
+ProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniform3iv(GLuint program,
+                                                GLint location,
+                                                GLsizei count,
+                                                const GLint *value);
+ANGLE_EXPORT void GL_APIENTRY
+ProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniform3uiv(GLuint program,
+                                                 GLint location,
+                                                 GLsizei count,
+                                                 const GLuint *value);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniform4d(GLuint program,
+                                               GLint location,
+                                               GLdouble v0,
+                                               GLdouble v1,
+                                               GLdouble v2,
+                                               GLdouble v3);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniform4dv(GLuint program,
+                                                GLint location,
+                                                GLsizei count,
+                                                const GLdouble *value);
+ANGLE_EXPORT void GL_APIENTRY
+ProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniform4fv(GLuint program,
+                                                GLint location,
+                                                GLsizei count,
+                                                const GLfloat *value);
+ANGLE_EXPORT void GL_APIENTRY
+ProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniform4iv(GLuint program,
+                                                GLint location,
+                                                GLsizei count,
+                                                const GLint *value);
+ANGLE_EXPORT void GL_APIENTRY
+ProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniform4uiv(GLuint program,
+                                                 GLint location,
+                                                 GLsizei count,
+                                                 const GLuint *value);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniformMatrix2dv(GLuint program,
+                                                      GLint location,
+                                                      GLsizei count,
+                                                      GLboolean transpose,
+                                                      const GLdouble *value);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniformMatrix2fv(GLuint program,
+                                                      GLint location,
+                                                      GLsizei count,
+                                                      GLboolean transpose,
+                                                      const GLfloat *value);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniformMatrix2x3dv(GLuint program,
+                                                        GLint location,
+                                                        GLsizei count,
+                                                        GLboolean transpose,
+                                                        const GLdouble *value);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniformMatrix2x3fv(GLuint program,
+                                                        GLint location,
+                                                        GLsizei count,
+                                                        GLboolean transpose,
+                                                        const GLfloat *value);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniformMatrix2x4dv(GLuint program,
+                                                        GLint location,
+                                                        GLsizei count,
+                                                        GLboolean transpose,
+                                                        const GLdouble *value);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniformMatrix2x4fv(GLuint program,
+                                                        GLint location,
+                                                        GLsizei count,
+                                                        GLboolean transpose,
+                                                        const GLfloat *value);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniformMatrix3dv(GLuint program,
+                                                      GLint location,
+                                                      GLsizei count,
+                                                      GLboolean transpose,
+                                                      const GLdouble *value);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniformMatrix3fv(GLuint program,
+                                                      GLint location,
+                                                      GLsizei count,
+                                                      GLboolean transpose,
+                                                      const GLfloat *value);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniformMatrix3x2dv(GLuint program,
+                                                        GLint location,
+                                                        GLsizei count,
+                                                        GLboolean transpose,
+                                                        const GLdouble *value);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniformMatrix3x2fv(GLuint program,
+                                                        GLint location,
+                                                        GLsizei count,
+                                                        GLboolean transpose,
+                                                        const GLfloat *value);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniformMatrix3x4dv(GLuint program,
+                                                        GLint location,
+                                                        GLsizei count,
+                                                        GLboolean transpose,
+                                                        const GLdouble *value);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniformMatrix3x4fv(GLuint program,
+                                                        GLint location,
+                                                        GLsizei count,
+                                                        GLboolean transpose,
+                                                        const GLfloat *value);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniformMatrix4dv(GLuint program,
+                                                      GLint location,
+                                                      GLsizei count,
+                                                      GLboolean transpose,
+                                                      const GLdouble *value);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniformMatrix4fv(GLuint program,
+                                                      GLint location,
+                                                      GLsizei count,
+                                                      GLboolean transpose,
+                                                      const GLfloat *value);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniformMatrix4x2dv(GLuint program,
+                                                        GLint location,
+                                                        GLsizei count,
+                                                        GLboolean transpose,
+                                                        const GLdouble *value);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniformMatrix4x2fv(GLuint program,
+                                                        GLint location,
+                                                        GLsizei count,
+                                                        GLboolean transpose,
+                                                        const GLfloat *value);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniformMatrix4x3dv(GLuint program,
+                                                        GLint location,
+                                                        GLsizei count,
+                                                        GLboolean transpose,
+                                                        const GLdouble *value);
+ANGLE_EXPORT void GL_APIENTRY ProgramUniformMatrix4x3fv(GLuint program,
+                                                        GLint location,
+                                                        GLsizei count,
+                                                        GLboolean transpose,
+                                                        const GLfloat *value);
+ANGLE_EXPORT void GL_APIENTRY ReleaseShaderCompiler();
+ANGLE_EXPORT void GL_APIENTRY ScissorArrayv(GLuint first, GLsizei count, const GLint *v);
+ANGLE_EXPORT void GL_APIENTRY
+ScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);
+ANGLE_EXPORT void GL_APIENTRY ScissorIndexedv(GLuint index, const GLint *v);
+ANGLE_EXPORT void GL_APIENTRY ShaderBinary(GLsizei count,
+                                           const GLuint *shaders,
+                                           GLenum binaryformat,
+                                           const void *binary,
+                                           GLsizei length);
+ANGLE_EXPORT void GL_APIENTRY UseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program);
+ANGLE_EXPORT void GL_APIENTRY ValidateProgramPipeline(GLuint pipeline);
+ANGLE_EXPORT void GL_APIENTRY VertexAttribL1d(GLuint index, GLdouble x);
+ANGLE_EXPORT void GL_APIENTRY VertexAttribL1dv(GLuint index, const GLdouble *v);
+ANGLE_EXPORT void GL_APIENTRY VertexAttribL2d(GLuint index, GLdouble x, GLdouble y);
+ANGLE_EXPORT void GL_APIENTRY VertexAttribL2dv(GLuint index, const GLdouble *v);
+ANGLE_EXPORT void GL_APIENTRY VertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+ANGLE_EXPORT void GL_APIENTRY VertexAttribL3dv(GLuint index, const GLdouble *v);
+ANGLE_EXPORT void GL_APIENTRY
+VertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ANGLE_EXPORT void GL_APIENTRY VertexAttribL4dv(GLuint index, const GLdouble *v);
+ANGLE_EXPORT void GL_APIENTRY
+VertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
+ANGLE_EXPORT void GL_APIENTRY ViewportArrayv(GLuint first, GLsizei count, const GLfloat *v);
+ANGLE_EXPORT void GL_APIENTRY
+ViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
+ANGLE_EXPORT void GL_APIENTRY ViewportIndexedfv(GLuint index, const GLfloat *v);
+
+// GL 4.2
+ANGLE_EXPORT void GL_APIENTRY BindImageTexture(GLuint unit,
+                                               GLuint texture,
+                                               GLint level,
+                                               GLboolean layered,
+                                               GLint layer,
+                                               GLenum access,
+                                               GLenum format);
+ANGLE_EXPORT void GL_APIENTRY DrawArraysInstancedBaseInstance(GLenum mode,
+                                                              GLint first,
+                                                              GLsizei count,
+                                                              GLsizei instancecount,
+                                                              GLuint baseinstance);
+ANGLE_EXPORT void GL_APIENTRY DrawElementsInstancedBaseInstance(GLenum mode,
+                                                                GLsizei count,
+                                                                GLenum type,
+                                                                const void *indices,
+                                                                GLsizei instancecount,
+                                                                GLuint baseinstance);
+ANGLE_EXPORT void GL_APIENTRY DrawElementsInstancedBaseVertexBaseInstance(GLenum mode,
+                                                                          GLsizei count,
+                                                                          GLenum type,
+                                                                          const void *indices,
+                                                                          GLsizei instancecount,
+                                                                          GLint basevertex,
+                                                                          GLuint baseinstance);
+ANGLE_EXPORT void GL_APIENTRY DrawTransformFeedbackInstanced(GLenum mode,
+                                                             GLuint id,
+                                                             GLsizei instancecount);
+ANGLE_EXPORT void GL_APIENTRY DrawTransformFeedbackStreamInstanced(GLenum mode,
+                                                                   GLuint id,
+                                                                   GLuint stream,
+                                                                   GLsizei instancecount);
+ANGLE_EXPORT void GL_APIENTRY GetActiveAtomicCounterBufferiv(GLuint program,
+                                                             GLuint bufferIndex,
+                                                             GLenum pname,
+                                                             GLint *params);
+ANGLE_EXPORT void GL_APIENTRY GetInternalformativ(GLenum target,
+                                                  GLenum internalformat,
+                                                  GLenum pname,
+                                                  GLsizei bufSize,
+                                                  GLint *params);
+ANGLE_EXPORT void GL_APIENTRY MemoryBarrier(GLbitfield barriers);
+ANGLE_EXPORT void GL_APIENTRY TexStorage1D(GLenum target,
+                                           GLsizei levels,
+                                           GLenum internalformat,
+                                           GLsizei width);
+ANGLE_EXPORT void GL_APIENTRY
+TexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+ANGLE_EXPORT void GL_APIENTRY TexStorage3D(GLenum target,
+                                           GLsizei levels,
+                                           GLenum internalformat,
+                                           GLsizei width,
+                                           GLsizei height,
+                                           GLsizei depth);
+
+// GL 4.3
+ANGLE_EXPORT void GL_APIENTRY BindVertexBuffer(GLuint bindingindex,
+                                               GLuint buffer,
+                                               GLintptr offset,
+                                               GLsizei stride);
+ANGLE_EXPORT void GL_APIENTRY
+ClearBufferData(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data);
+ANGLE_EXPORT void GL_APIENTRY ClearBufferSubData(GLenum target,
+                                                 GLenum internalformat,
+                                                 GLintptr offset,
+                                                 GLsizeiptr size,
+                                                 GLenum format,
+                                                 GLenum type,
+                                                 const void *data);
+ANGLE_EXPORT void GL_APIENTRY CopyImageSubData(GLuint srcName,
+                                               GLenum srcTarget,
+                                               GLint srcLevel,
+                                               GLint srcX,
+                                               GLint srcY,
+                                               GLint srcZ,
+                                               GLuint dstName,
+                                               GLenum dstTarget,
+                                               GLint dstLevel,
+                                               GLint dstX,
+                                               GLint dstY,
+                                               GLint dstZ,
+                                               GLsizei srcWidth,
+                                               GLsizei srcHeight,
+                                               GLsizei srcDepth);
+ANGLE_EXPORT void GL_APIENTRY DebugMessageCallback(GLDEBUGPROC callback, const void *userParam);
+ANGLE_EXPORT void GL_APIENTRY DebugMessageControl(GLenum source,
+                                                  GLenum type,
+                                                  GLenum severity,
+                                                  GLsizei count,
+                                                  const GLuint *ids,
+                                                  GLboolean enabled);
+ANGLE_EXPORT void GL_APIENTRY DebugMessageInsert(GLenum source,
+                                                 GLenum type,
+                                                 GLuint id,
+                                                 GLenum severity,
+                                                 GLsizei length,
+                                                 const GLchar *buf);
+ANGLE_EXPORT void GL_APIENTRY DispatchCompute(GLuint num_groups_x,
+                                              GLuint num_groups_y,
+                                              GLuint num_groups_z);
+ANGLE_EXPORT void GL_APIENTRY DispatchComputeIndirect(GLintptr indirect);
+ANGLE_EXPORT void GL_APIENTRY FramebufferParameteri(GLenum target, GLenum pname, GLint param);
+ANGLE_EXPORT GLuint GL_APIENTRY GetDebugMessageLog(GLuint count,
+                                                   GLsizei bufSize,
+                                                   GLenum *sources,
+                                                   GLenum *types,
+                                                   GLuint *ids,
+                                                   GLenum *severities,
+                                                   GLsizei *lengths,
+                                                   GLchar *messageLog);
+ANGLE_EXPORT void GL_APIENTRY GetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ANGLE_EXPORT void GL_APIENTRY GetInternalformati64v(GLenum target,
+                                                    GLenum internalformat,
+                                                    GLenum pname,
+                                                    GLsizei bufSize,
+                                                    GLint64 *params);
+ANGLE_EXPORT void GL_APIENTRY
+GetObjectLabel(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
+ANGLE_EXPORT void GL_APIENTRY GetObjectPtrLabel(const void *ptr,
+                                                GLsizei bufSize,
+                                                GLsizei *length,
+                                                GLchar *label);
+ANGLE_EXPORT void GL_APIENTRY GetProgramInterfaceiv(GLuint program,
+                                                    GLenum programInterface,
+                                                    GLenum pname,
+                                                    GLint *params);
+ANGLE_EXPORT GLuint GL_APIENTRY GetProgramResourceIndex(GLuint program,
+                                                        GLenum programInterface,
+                                                        const GLchar *name);
+ANGLE_EXPORT GLint GL_APIENTRY GetProgramResourceLocation(GLuint program,
+                                                          GLenum programInterface,
+                                                          const GLchar *name);
+ANGLE_EXPORT GLint GL_APIENTRY GetProgramResourceLocationIndex(GLuint program,
+                                                               GLenum programInterface,
+                                                               const GLchar *name);
+ANGLE_EXPORT void GL_APIENTRY GetProgramResourceName(GLuint program,
+                                                     GLenum programInterface,
+                                                     GLuint index,
+                                                     GLsizei bufSize,
+                                                     GLsizei *length,
+                                                     GLchar *name);
+ANGLE_EXPORT void GL_APIENTRY GetProgramResourceiv(GLuint program,
+                                                   GLenum programInterface,
+                                                   GLuint index,
+                                                   GLsizei propCount,
+                                                   const GLenum *props,
+                                                   GLsizei bufSize,
+                                                   GLsizei *length,
+                                                   GLint *params);
+ANGLE_EXPORT void GL_APIENTRY InvalidateBufferData(GLuint buffer);
+ANGLE_EXPORT void GL_APIENTRY InvalidateBufferSubData(GLuint buffer,
+                                                      GLintptr offset,
+                                                      GLsizeiptr length);
+ANGLE_EXPORT void GL_APIENTRY InvalidateFramebuffer(GLenum target,
+                                                    GLsizei numAttachments,
+                                                    const GLenum *attachments);
+ANGLE_EXPORT void GL_APIENTRY InvalidateSubFramebuffer(GLenum target,
+                                                       GLsizei numAttachments,
+                                                       const GLenum *attachments,
+                                                       GLint x,
+                                                       GLint y,
+                                                       GLsizei width,
+                                                       GLsizei height);
+ANGLE_EXPORT void GL_APIENTRY InvalidateTexImage(GLuint texture, GLint level);
+ANGLE_EXPORT void GL_APIENTRY InvalidateTexSubImage(GLuint texture,
+                                                    GLint level,
+                                                    GLint xoffset,
+                                                    GLint yoffset,
+                                                    GLint zoffset,
+                                                    GLsizei width,
+                                                    GLsizei height,
+                                                    GLsizei depth);
+ANGLE_EXPORT void GL_APIENTRY MultiDrawArraysIndirect(GLenum mode,
+                                                      const void *indirect,
+                                                      GLsizei drawcount,
+                                                      GLsizei stride);
+ANGLE_EXPORT void GL_APIENTRY MultiDrawElementsIndirect(GLenum mode,
+                                                        GLenum type,
+                                                        const void *indirect,
+                                                        GLsizei drawcount,
+                                                        GLsizei stride);
+ANGLE_EXPORT void GL_APIENTRY ObjectLabel(GLenum identifier,
+                                          GLuint name,
+                                          GLsizei length,
+                                          const GLchar *label);
+ANGLE_EXPORT void GL_APIENTRY ObjectPtrLabel(const void *ptr, GLsizei length, const GLchar *label);
+ANGLE_EXPORT void GL_APIENTRY PopDebugGroup();
+ANGLE_EXPORT void GL_APIENTRY PushDebugGroup(GLenum source,
+                                             GLuint id,
+                                             GLsizei length,
+                                             const GLchar *message);
+ANGLE_EXPORT void GL_APIENTRY ShaderStorageBlockBinding(GLuint program,
+                                                        GLuint storageBlockIndex,
+                                                        GLuint storageBlockBinding);
+ANGLE_EXPORT void GL_APIENTRY TexBufferRange(GLenum target,
+                                             GLenum internalformat,
+                                             GLuint buffer,
+                                             GLintptr offset,
+                                             GLsizeiptr size);
+ANGLE_EXPORT void GL_APIENTRY TexStorage2DMultisample(GLenum target,
+                                                      GLsizei samples,
+                                                      GLenum internalformat,
+                                                      GLsizei width,
+                                                      GLsizei height,
+                                                      GLboolean fixedsamplelocations);
+ANGLE_EXPORT void GL_APIENTRY TexStorage3DMultisample(GLenum target,
+                                                      GLsizei samples,
+                                                      GLenum internalformat,
+                                                      GLsizei width,
+                                                      GLsizei height,
+                                                      GLsizei depth,
+                                                      GLboolean fixedsamplelocations);
+ANGLE_EXPORT void GL_APIENTRY TextureView(GLuint texture,
+                                          GLenum target,
+                                          GLuint origtexture,
+                                          GLenum internalformat,
+                                          GLuint minlevel,
+                                          GLuint numlevels,
+                                          GLuint minlayer,
+                                          GLuint numlayers);
+ANGLE_EXPORT void GL_APIENTRY VertexAttribBinding(GLuint attribindex, GLuint bindingindex);
+ANGLE_EXPORT void GL_APIENTRY VertexAttribFormat(GLuint attribindex,
+                                                 GLint size,
+                                                 GLenum type,
+                                                 GLboolean normalized,
+                                                 GLuint relativeoffset);
+ANGLE_EXPORT void GL_APIENTRY VertexAttribIFormat(GLuint attribindex,
+                                                  GLint size,
+                                                  GLenum type,
+                                                  GLuint relativeoffset);
+ANGLE_EXPORT void GL_APIENTRY VertexAttribLFormat(GLuint attribindex,
+                                                  GLint size,
+                                                  GLenum type,
+                                                  GLuint relativeoffset);
+ANGLE_EXPORT void GL_APIENTRY VertexBindingDivisor(GLuint bindingindex, GLuint divisor);
+
+// GL 4.4
+ANGLE_EXPORT void GL_APIENTRY BindBuffersBase(GLenum target,
+                                              GLuint first,
+                                              GLsizei count,
+                                              const GLuint *buffers);
+ANGLE_EXPORT void GL_APIENTRY BindBuffersRange(GLenum target,
+                                               GLuint first,
+                                               GLsizei count,
+                                               const GLuint *buffers,
+                                               const GLintptr *offsets,
+                                               const GLsizeiptr *sizes);
+ANGLE_EXPORT void GL_APIENTRY BindImageTextures(GLuint first,
+                                                GLsizei count,
+                                                const GLuint *textures);
+ANGLE_EXPORT void GL_APIENTRY BindSamplers(GLuint first, GLsizei count, const GLuint *samplers);
+ANGLE_EXPORT void GL_APIENTRY BindTextures(GLuint first, GLsizei count, const GLuint *textures);
+ANGLE_EXPORT void GL_APIENTRY BindVertexBuffers(GLuint first,
+                                                GLsizei count,
+                                                const GLuint *buffers,
+                                                const GLintptr *offsets,
+                                                const GLsizei *strides);
+ANGLE_EXPORT void GL_APIENTRY BufferStorage(GLenum target,
+                                            GLsizeiptr size,
+                                            const void *data,
+                                            GLbitfield flags);
+ANGLE_EXPORT void GL_APIENTRY
+ClearTexImage(GLuint texture, GLint level, GLenum format, GLenum type, const void *data);
+ANGLE_EXPORT void GL_APIENTRY ClearTexSubImage(GLuint texture,
+                                               GLint level,
+                                               GLint xoffset,
+                                               GLint yoffset,
+                                               GLint zoffset,
+                                               GLsizei width,
+                                               GLsizei height,
+                                               GLsizei depth,
+                                               GLenum format,
+                                               GLenum type,
+                                               const void *data);
+
+// GL 4.5
+ANGLE_EXPORT void GL_APIENTRY BindTextureUnit(GLuint unit, GLuint texture);
+ANGLE_EXPORT void GL_APIENTRY BlitNamedFramebuffer(GLuint readFramebuffer,
+                                                   GLuint drawFramebuffer,
+                                                   GLint srcX0,
+                                                   GLint srcY0,
+                                                   GLint srcX1,
+                                                   GLint srcY1,
+                                                   GLint dstX0,
+                                                   GLint dstY0,
+                                                   GLint dstX1,
+                                                   GLint dstY1,
+                                                   GLbitfield mask,
+                                                   GLenum filter);
+ANGLE_EXPORT GLenum GL_APIENTRY CheckNamedFramebufferStatus(GLuint framebuffer, GLenum target);
+ANGLE_EXPORT void GL_APIENTRY ClearNamedBufferData(GLuint buffer,
+                                                   GLenum internalformat,
+                                                   GLenum format,
+                                                   GLenum type,
+                                                   const void *data);
+ANGLE_EXPORT void GL_APIENTRY ClearNamedBufferSubData(GLuint buffer,
+                                                      GLenum internalformat,
+                                                      GLintptr offset,
+                                                      GLsizeiptr size,
+                                                      GLenum format,
+                                                      GLenum type,
+                                                      const void *data);
+ANGLE_EXPORT void GL_APIENTRY ClearNamedFramebufferfi(GLuint framebuffer,
+                                                      GLenum buffer,
+                                                      GLint drawbuffer,
+                                                      GLfloat depth,
+                                                      GLint stencil);
+ANGLE_EXPORT void GL_APIENTRY ClearNamedFramebufferfv(GLuint framebuffer,
+                                                      GLenum buffer,
+                                                      GLint drawbuffer,
+                                                      const GLfloat *value);
+ANGLE_EXPORT void GL_APIENTRY ClearNamedFramebufferiv(GLuint framebuffer,
+                                                      GLenum buffer,
+                                                      GLint drawbuffer,
+                                                      const GLint *value);
+ANGLE_EXPORT void GL_APIENTRY ClearNamedFramebufferuiv(GLuint framebuffer,
+                                                       GLenum buffer,
+                                                       GLint drawbuffer,
+                                                       const GLuint *value);
+ANGLE_EXPORT void GL_APIENTRY ClipControl(GLenum origin, GLenum depth);
+ANGLE_EXPORT void GL_APIENTRY CompressedTextureSubImage1D(GLuint texture,
+                                                          GLint level,
+                                                          GLint xoffset,
+                                                          GLsizei width,
+                                                          GLenum format,
+                                                          GLsizei imageSize,
+                                                          const void *data);
+ANGLE_EXPORT void GL_APIENTRY CompressedTextureSubImage2D(GLuint texture,
+                                                          GLint level,
+                                                          GLint xoffset,
+                                                          GLint yoffset,
+                                                          GLsizei width,
+                                                          GLsizei height,
+                                                          GLenum format,
+                                                          GLsizei imageSize,
+                                                          const void *data);
+ANGLE_EXPORT void GL_APIENTRY CompressedTextureSubImage3D(GLuint texture,
+                                                          GLint level,
+                                                          GLint xoffset,
+                                                          GLint yoffset,
+                                                          GLint zoffset,
+                                                          GLsizei width,
+                                                          GLsizei height,
+                                                          GLsizei depth,
+                                                          GLenum format,
+                                                          GLsizei imageSize,
+                                                          const void *data);
+ANGLE_EXPORT void GL_APIENTRY CopyNamedBufferSubData(GLuint readBuffer,
+                                                     GLuint writeBuffer,
+                                                     GLintptr readOffset,
+                                                     GLintptr writeOffset,
+                                                     GLsizeiptr size);
+ANGLE_EXPORT void GL_APIENTRY
+CopyTextureSubImage1D(GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+ANGLE_EXPORT void GL_APIENTRY CopyTextureSubImage2D(GLuint texture,
+                                                    GLint level,
+                                                    GLint xoffset,
+                                                    GLint yoffset,
+                                                    GLint x,
+                                                    GLint y,
+                                                    GLsizei width,
+                                                    GLsizei height);
+ANGLE_EXPORT void GL_APIENTRY CopyTextureSubImage3D(GLuint texture,
+                                                    GLint level,
+                                                    GLint xoffset,
+                                                    GLint yoffset,
+                                                    GLint zoffset,
+                                                    GLint x,
+                                                    GLint y,
+                                                    GLsizei width,
+                                                    GLsizei height);
+ANGLE_EXPORT void GL_APIENTRY CreateBuffers(GLsizei n, GLuint *buffers);
+ANGLE_EXPORT void GL_APIENTRY CreateFramebuffers(GLsizei n, GLuint *framebuffers);
+ANGLE_EXPORT void GL_APIENTRY CreateProgramPipelines(GLsizei n, GLuint *pipelines);
+ANGLE_EXPORT void GL_APIENTRY CreateQueries(GLenum target, GLsizei n, GLuint *ids);
+ANGLE_EXPORT void GL_APIENTRY CreateRenderbuffers(GLsizei n, GLuint *renderbuffers);
+ANGLE_EXPORT void GL_APIENTRY CreateSamplers(GLsizei n, GLuint *samplers);
+ANGLE_EXPORT void GL_APIENTRY CreateTextures(GLenum target, GLsizei n, GLuint *textures);
+ANGLE_EXPORT void GL_APIENTRY CreateTransformFeedbacks(GLsizei n, GLuint *ids);
+ANGLE_EXPORT void GL_APIENTRY CreateVertexArrays(GLsizei n, GLuint *arrays);
+ANGLE_EXPORT void GL_APIENTRY DisableVertexArrayAttrib(GLuint vaobj, GLuint index);
+ANGLE_EXPORT void GL_APIENTRY EnableVertexArrayAttrib(GLuint vaobj, GLuint index);
+ANGLE_EXPORT void GL_APIENTRY FlushMappedNamedBufferRange(GLuint buffer,
+                                                          GLintptr offset,
+                                                          GLsizeiptr length);
+ANGLE_EXPORT void GL_APIENTRY GenerateTextureMipmap(GLuint texture);
+ANGLE_EXPORT void GL_APIENTRY GetCompressedTextureImage(GLuint texture,
+                                                        GLint level,
+                                                        GLsizei bufSize,
+                                                        void *pixels);
+ANGLE_EXPORT void GL_APIENTRY GetCompressedTextureSubImage(GLuint texture,
+                                                           GLint level,
+                                                           GLint xoffset,
+                                                           GLint yoffset,
+                                                           GLint zoffset,
+                                                           GLsizei width,
+                                                           GLsizei height,
+                                                           GLsizei depth,
+                                                           GLsizei bufSize,
+                                                           void *pixels);
+ANGLE_EXPORT GLenum GL_APIENTRY GetGraphicsResetStatus();
+ANGLE_EXPORT void GL_APIENTRY GetNamedBufferParameteri64v(GLuint buffer,
+                                                          GLenum pname,
+                                                          GLint64 *params);
+ANGLE_EXPORT void GL_APIENTRY GetNamedBufferParameteriv(GLuint buffer, GLenum pname, GLint *params);
+ANGLE_EXPORT void GL_APIENTRY GetNamedBufferPointerv(GLuint buffer, GLenum pname, void **params);
+ANGLE_EXPORT void GL_APIENTRY GetNamedBufferSubData(GLuint buffer,
+                                                    GLintptr offset,
+                                                    GLsizeiptr size,
+                                                    void *data);
+ANGLE_EXPORT void GL_APIENTRY GetNamedFramebufferAttachmentParameteriv(GLuint framebuffer,
+                                                                       GLenum attachment,
+                                                                       GLenum pname,
+                                                                       GLint *params);
+ANGLE_EXPORT void GL_APIENTRY GetNamedFramebufferParameteriv(GLuint framebuffer,
+                                                             GLenum pname,
+                                                             GLint *param);
+ANGLE_EXPORT void GL_APIENTRY GetNamedRenderbufferParameteriv(GLuint renderbuffer,
+                                                              GLenum pname,
+                                                              GLint *params);
+ANGLE_EXPORT void GL_APIENTRY GetQueryBufferObjecti64v(GLuint id,
+                                                       GLuint buffer,
+                                                       GLenum pname,
+                                                       GLintptr offset);
+ANGLE_EXPORT void GL_APIENTRY GetQueryBufferObjectiv(GLuint id,
+                                                     GLuint buffer,
+                                                     GLenum pname,
+                                                     GLintptr offset);
+ANGLE_EXPORT void GL_APIENTRY GetQueryBufferObjectui64v(GLuint id,
+                                                        GLuint buffer,
+                                                        GLenum pname,
+                                                        GLintptr offset);
+ANGLE_EXPORT void GL_APIENTRY GetQueryBufferObjectuiv(GLuint id,
+                                                      GLuint buffer,
+                                                      GLenum pname,
+                                                      GLintptr offset);
+ANGLE_EXPORT void GL_APIENTRY GetTextureImage(GLuint texture,
+                                              GLint level,
+                                              GLenum format,
+                                              GLenum type,
+                                              GLsizei bufSize,
+                                              void *pixels);
+ANGLE_EXPORT void GL_APIENTRY GetTextureLevelParameterfv(GLuint texture,
+                                                         GLint level,
+                                                         GLenum pname,
+                                                         GLfloat *params);
+ANGLE_EXPORT void GL_APIENTRY GetTextureLevelParameteriv(GLuint texture,
+                                                         GLint level,
+                                                         GLenum pname,
+                                                         GLint *params);
+ANGLE_EXPORT void GL_APIENTRY GetTextureParameterIiv(GLuint texture, GLenum pname, GLint *params);
+ANGLE_EXPORT void GL_APIENTRY GetTextureParameterIuiv(GLuint texture, GLenum pname, GLuint *params);
+ANGLE_EXPORT void GL_APIENTRY GetTextureParameterfv(GLuint texture, GLenum pname, GLfloat *params);
+ANGLE_EXPORT void GL_APIENTRY GetTextureParameteriv(GLuint texture, GLenum pname, GLint *params);
+ANGLE_EXPORT void GL_APIENTRY GetTextureSubImage(GLuint texture,
+                                                 GLint level,
+                                                 GLint xoffset,
+                                                 GLint yoffset,
+                                                 GLint zoffset,
+                                                 GLsizei width,
+                                                 GLsizei height,
+                                                 GLsizei depth,
+                                                 GLenum format,
+                                                 GLenum type,
+                                                 GLsizei bufSize,
+                                                 void *pixels);
+ANGLE_EXPORT void GL_APIENTRY GetTransformFeedbacki64_v(GLuint xfb,
+                                                        GLenum pname,
+                                                        GLuint index,
+                                                        GLint64 *param);
+ANGLE_EXPORT void GL_APIENTRY GetTransformFeedbacki_v(GLuint xfb,
+                                                      GLenum pname,
+                                                      GLuint index,
+                                                      GLint *param);
+ANGLE_EXPORT void GL_APIENTRY GetTransformFeedbackiv(GLuint xfb, GLenum pname, GLint *param);
+ANGLE_EXPORT void GL_APIENTRY GetVertexArrayIndexed64iv(GLuint vaobj,
+                                                        GLuint index,
+                                                        GLenum pname,
+                                                        GLint64 *param);
+ANGLE_EXPORT void GL_APIENTRY GetVertexArrayIndexediv(GLuint vaobj,
+                                                      GLuint index,
+                                                      GLenum pname,
+                                                      GLint *param);
+ANGLE_EXPORT void GL_APIENTRY GetVertexArrayiv(GLuint vaobj, GLenum pname, GLint *param);
+ANGLE_EXPORT void GL_APIENTRY
+GetnColorTable(GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table);
+ANGLE_EXPORT void GL_APIENTRY GetnCompressedTexImage(GLenum target,
+                                                     GLint lod,
+                                                     GLsizei bufSize,
+                                                     void *pixels);
+ANGLE_EXPORT void GL_APIENTRY
+GetnConvolutionFilter(GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image);
+ANGLE_EXPORT void GL_APIENTRY GetnHistogram(GLenum target,
+                                            GLboolean reset,
+                                            GLenum format,
+                                            GLenum type,
+                                            GLsizei bufSize,
+                                            void *values);
+ANGLE_EXPORT void GL_APIENTRY GetnMapdv(GLenum target, GLenum query, GLsizei bufSize, GLdouble *v);
+ANGLE_EXPORT void GL_APIENTRY GetnMapfv(GLenum target, GLenum query, GLsizei bufSize, GLfloat *v);
+ANGLE_EXPORT void GL_APIENTRY GetnMapiv(GLenum target, GLenum query, GLsizei bufSize, GLint *v);
+ANGLE_EXPORT void GL_APIENTRY GetnMinmax(GLenum target,
+                                         GLboolean reset,
+                                         GLenum format,
+                                         GLenum type,
+                                         GLsizei bufSize,
+                                         void *values);
+ANGLE_EXPORT void GL_APIENTRY GetnPixelMapfv(GLenum map, GLsizei bufSize, GLfloat *values);
+ANGLE_EXPORT void GL_APIENTRY GetnPixelMapuiv(GLenum map, GLsizei bufSize, GLuint *values);
+ANGLE_EXPORT void GL_APIENTRY GetnPixelMapusv(GLenum map, GLsizei bufSize, GLushort *values);
+ANGLE_EXPORT void GL_APIENTRY GetnPolygonStipple(GLsizei bufSize, GLubyte *pattern);
+ANGLE_EXPORT void GL_APIENTRY GetnSeparableFilter(GLenum target,
+                                                  GLenum format,
+                                                  GLenum type,
+                                                  GLsizei rowBufSize,
+                                                  void *row,
+                                                  GLsizei columnBufSize,
+                                                  void *column,
+                                                  void *span);
+ANGLE_EXPORT void GL_APIENTRY
+GetnTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels);
+ANGLE_EXPORT void GL_APIENTRY GetnUniformdv(GLuint program,
+                                            GLint location,
+                                            GLsizei bufSize,
+                                            GLdouble *params);
+ANGLE_EXPORT void GL_APIENTRY GetnUniformfv(GLuint program,
+                                            GLint location,
+                                            GLsizei bufSize,
+                                            GLfloat *params);
+ANGLE_EXPORT void GL_APIENTRY GetnUniformiv(GLuint program,
+                                            GLint location,
+                                            GLsizei bufSize,
+                                            GLint *params);
+ANGLE_EXPORT void GL_APIENTRY GetnUniformuiv(GLuint program,
+                                             GLint location,
+                                             GLsizei bufSize,
+                                             GLuint *params);
+ANGLE_EXPORT void GL_APIENTRY InvalidateNamedFramebufferData(GLuint framebuffer,
+                                                             GLsizei numAttachments,
+                                                             const GLenum *attachments);
+ANGLE_EXPORT void GL_APIENTRY InvalidateNamedFramebufferSubData(GLuint framebuffer,
+                                                                GLsizei numAttachments,
+                                                                const GLenum *attachments,
+                                                                GLint x,
+                                                                GLint y,
+                                                                GLsizei width,
+                                                                GLsizei height);
+ANGLE_EXPORT void *GL_APIENTRY MapNamedBuffer(GLuint buffer, GLenum access);
+ANGLE_EXPORT void *GL_APIENTRY MapNamedBufferRange(GLuint buffer,
+                                                   GLintptr offset,
+                                                   GLsizeiptr length,
+                                                   GLbitfield access);
+ANGLE_EXPORT void GL_APIENTRY MemoryBarrierByRegion(GLbitfield barriers);
+ANGLE_EXPORT void GL_APIENTRY NamedBufferData(GLuint buffer,
+                                              GLsizeiptr size,
+                                              const void *data,
+                                              GLenum usage);
+ANGLE_EXPORT void GL_APIENTRY NamedBufferStorage(GLuint buffer,
+                                                 GLsizeiptr size,
+                                                 const void *data,
+                                                 GLbitfield flags);
+ANGLE_EXPORT void GL_APIENTRY NamedBufferSubData(GLuint buffer,
+                                                 GLintptr offset,
+                                                 GLsizeiptr size,
+                                                 const void *data);
+ANGLE_EXPORT void GL_APIENTRY NamedFramebufferDrawBuffer(GLuint framebuffer, GLenum buf);
+ANGLE_EXPORT void GL_APIENTRY NamedFramebufferDrawBuffers(GLuint framebuffer,
+                                                          GLsizei n,
+                                                          const GLenum *bufs);
+ANGLE_EXPORT void GL_APIENTRY NamedFramebufferParameteri(GLuint framebuffer,
+                                                         GLenum pname,
+                                                         GLint param);
+ANGLE_EXPORT void GL_APIENTRY NamedFramebufferReadBuffer(GLuint framebuffer, GLenum src);
+ANGLE_EXPORT void GL_APIENTRY NamedFramebufferRenderbuffer(GLuint framebuffer,
+                                                           GLenum attachment,
+                                                           GLenum renderbuffertarget,
+                                                           GLuint renderbuffer);
+ANGLE_EXPORT void GL_APIENTRY NamedFramebufferTexture(GLuint framebuffer,
+                                                      GLenum attachment,
+                                                      GLuint texture,
+                                                      GLint level);
+ANGLE_EXPORT void GL_APIENTRY NamedFramebufferTextureLayer(GLuint framebuffer,
+                                                           GLenum attachment,
+                                                           GLuint texture,
+                                                           GLint level,
+                                                           GLint layer);
+ANGLE_EXPORT void GL_APIENTRY NamedRenderbufferStorage(GLuint renderbuffer,
+                                                       GLenum internalformat,
+                                                       GLsizei width,
+                                                       GLsizei height);
+ANGLE_EXPORT void GL_APIENTRY NamedRenderbufferStorageMultisample(GLuint renderbuffer,
+                                                                  GLsizei samples,
+                                                                  GLenum internalformat,
+                                                                  GLsizei width,
+                                                                  GLsizei height);
+ANGLE_EXPORT void GL_APIENTRY ReadnPixels(GLint x,
+                                          GLint y,
+                                          GLsizei width,
+                                          GLsizei height,
+                                          GLenum format,
+                                          GLenum type,
+                                          GLsizei bufSize,
+                                          void *data);
+ANGLE_EXPORT void GL_APIENTRY TextureBarrier();
+ANGLE_EXPORT void GL_APIENTRY TextureBuffer(GLuint texture, GLenum internalformat, GLuint buffer);
+ANGLE_EXPORT void GL_APIENTRY TextureBufferRange(GLuint texture,
+                                                 GLenum internalformat,
+                                                 GLuint buffer,
+                                                 GLintptr offset,
+                                                 GLsizeiptr size);
+ANGLE_EXPORT void GL_APIENTRY TextureParameterIiv(GLuint texture,
+                                                  GLenum pname,
+                                                  const GLint *params);
+ANGLE_EXPORT void GL_APIENTRY TextureParameterIuiv(GLuint texture,
+                                                   GLenum pname,
+                                                   const GLuint *params);
+ANGLE_EXPORT void GL_APIENTRY TextureParameterf(GLuint texture, GLenum pname, GLfloat param);
+ANGLE_EXPORT void GL_APIENTRY TextureParameterfv(GLuint texture,
+                                                 GLenum pname,
+                                                 const GLfloat *param);
+ANGLE_EXPORT void GL_APIENTRY TextureParameteri(GLuint texture, GLenum pname, GLint param);
+ANGLE_EXPORT void GL_APIENTRY TextureParameteriv(GLuint texture, GLenum pname, const GLint *param);
+ANGLE_EXPORT void GL_APIENTRY TextureStorage1D(GLuint texture,
+                                               GLsizei levels,
+                                               GLenum internalformat,
+                                               GLsizei width);
+ANGLE_EXPORT void GL_APIENTRY TextureStorage2D(GLuint texture,
+                                               GLsizei levels,
+                                               GLenum internalformat,
+                                               GLsizei width,
+                                               GLsizei height);
+ANGLE_EXPORT void GL_APIENTRY TextureStorage2DMultisample(GLuint texture,
+                                                          GLsizei samples,
+                                                          GLenum internalformat,
+                                                          GLsizei width,
+                                                          GLsizei height,
+                                                          GLboolean fixedsamplelocations);
+ANGLE_EXPORT void GL_APIENTRY TextureStorage3D(GLuint texture,
+                                               GLsizei levels,
+                                               GLenum internalformat,
+                                               GLsizei width,
+                                               GLsizei height,
+                                               GLsizei depth);
+ANGLE_EXPORT void GL_APIENTRY TextureStorage3DMultisample(GLuint texture,
+                                                          GLsizei samples,
+                                                          GLenum internalformat,
+                                                          GLsizei width,
+                                                          GLsizei height,
+                                                          GLsizei depth,
+                                                          GLboolean fixedsamplelocations);
+ANGLE_EXPORT void GL_APIENTRY TextureSubImage1D(GLuint texture,
+                                                GLint level,
+                                                GLint xoffset,
+                                                GLsizei width,
+                                                GLenum format,
+                                                GLenum type,
+                                                const void *pixels);
+ANGLE_EXPORT void GL_APIENTRY TextureSubImage2D(GLuint texture,
+                                                GLint level,
+                                                GLint xoffset,
+                                                GLint yoffset,
+                                                GLsizei width,
+                                                GLsizei height,
+                                                GLenum format,
+                                                GLenum type,
+                                                const void *pixels);
+ANGLE_EXPORT void GL_APIENTRY TextureSubImage3D(GLuint texture,
+                                                GLint level,
+                                                GLint xoffset,
+                                                GLint yoffset,
+                                                GLint zoffset,
+                                                GLsizei width,
+                                                GLsizei height,
+                                                GLsizei depth,
+                                                GLenum format,
+                                                GLenum type,
+                                                const void *pixels);
+ANGLE_EXPORT void GL_APIENTRY TransformFeedbackBufferBase(GLuint xfb, GLuint index, GLuint buffer);
+ANGLE_EXPORT void GL_APIENTRY TransformFeedbackBufferRange(GLuint xfb,
+                                                           GLuint index,
+                                                           GLuint buffer,
+                                                           GLintptr offset,
+                                                           GLsizeiptr size);
+ANGLE_EXPORT GLboolean GL_APIENTRY UnmapNamedBuffer(GLuint buffer);
+ANGLE_EXPORT void GL_APIENTRY VertexArrayAttribBinding(GLuint vaobj,
+                                                       GLuint attribindex,
+                                                       GLuint bindingindex);
+ANGLE_EXPORT void GL_APIENTRY VertexArrayAttribFormat(GLuint vaobj,
+                                                      GLuint attribindex,
+                                                      GLint size,
+                                                      GLenum type,
+                                                      GLboolean normalized,
+                                                      GLuint relativeoffset);
+ANGLE_EXPORT void GL_APIENTRY VertexArrayAttribIFormat(GLuint vaobj,
+                                                       GLuint attribindex,
+                                                       GLint size,
+                                                       GLenum type,
+                                                       GLuint relativeoffset);
+ANGLE_EXPORT void GL_APIENTRY VertexArrayAttribLFormat(GLuint vaobj,
+                                                       GLuint attribindex,
+                                                       GLint size,
+                                                       GLenum type,
+                                                       GLuint relativeoffset);
+ANGLE_EXPORT void GL_APIENTRY VertexArrayBindingDivisor(GLuint vaobj,
+                                                        GLuint bindingindex,
+                                                        GLuint divisor);
+ANGLE_EXPORT void GL_APIENTRY VertexArrayElementBuffer(GLuint vaobj, GLuint buffer);
+ANGLE_EXPORT void GL_APIENTRY VertexArrayVertexBuffer(GLuint vaobj,
+                                                      GLuint bindingindex,
+                                                      GLuint buffer,
+                                                      GLintptr offset,
+                                                      GLsizei stride);
+ANGLE_EXPORT void GL_APIENTRY VertexArrayVertexBuffers(GLuint vaobj,
+                                                       GLuint first,
+                                                       GLsizei count,
+                                                       const GLuint *buffers,
+                                                       const GLintptr *offsets,
+                                                       const GLsizei *strides);
+
+// GL 4.6
+ANGLE_EXPORT void GL_APIENTRY MultiDrawArraysIndirectCount(GLenum mode,
+                                                           const void *indirect,
+                                                           GLintptr drawcount,
+                                                           GLsizei maxdrawcount,
+                                                           GLsizei stride);
+ANGLE_EXPORT void GL_APIENTRY MultiDrawElementsIndirectCount(GLenum mode,
+                                                             GLenum type,
+                                                             const void *indirect,
+                                                             GLintptr drawcount,
+                                                             GLsizei maxdrawcount,
+                                                             GLsizei stride);
+ANGLE_EXPORT void GL_APIENTRY PolygonOffsetClamp(GLfloat factor, GLfloat units, GLfloat clamp);
+ANGLE_EXPORT void GL_APIENTRY SpecializeShader(GLuint shader,
+                                               const GLchar *pEntryPoint,
+                                               GLuint numSpecializationConstants,
+                                               const GLuint *pConstantIndex,
+                                               const GLuint *pConstantValue);
+}  // namespace gl
+
+#endif  // LIBGL_ENTRY_POINTS_GL_4_AUTOGEN_H_
diff --git a/src/libGL/entry_points_wgl.cpp b/src/libGL/entry_points_wgl.cpp
index 6c4cede..3627d13 100644
--- a/src/libGL/entry_points_wgl.cpp
+++ b/src/libGL/entry_points_wgl.cpp
@@ -52,6 +52,8 @@
 }
 }  // anonymous namespace
 
+#define WGL_EVENT(EP, FMT, ...) EVENT(nullptr, WGL##EP, FMT, __VA_ARGS__)
+
 extern "C" {
 
 // WGL 1.0
@@ -222,7 +224,7 @@
 PROC GL_APIENTRY wglGetProcAddress(LPCSTR lpszProc)
 {
     ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("const char *procname = \"%s\"", lpszProc);
+    WGL_EVENT(GetProcAddress, "const char *procname = \"%s\"", lpszProc);
     egl::Thread *thread = egl::GetCurrentThread();
 
     const ProcEntry *entry =
diff --git a/src/libGL/libGL_autogen.cpp b/src/libGL/libGL_autogen.cpp
index a9c0a11..11f6e8f 100644
--- a/src/libGL/libGL_autogen.cpp
+++ b/src/libGL/libGL_autogen.cpp
@@ -5,29 +5,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// libGL.cpp: Implements the exported Windows GL functions.
+// libGL_autogen.cpp: Implements the exported Windows GL functions.
 
 #include "angle_gl.h"
 
-#include "libGL/entry_points_gl_1_0_autogen.h"
-#include "libGL/entry_points_gl_1_1_autogen.h"
-#include "libGL/entry_points_gl_1_2_autogen.h"
-#include "libGL/entry_points_gl_1_3_autogen.h"
-#include "libGL/entry_points_gl_1_4_autogen.h"
-#include "libGL/entry_points_gl_1_5_autogen.h"
-#include "libGL/entry_points_gl_2_0_autogen.h"
-#include "libGL/entry_points_gl_2_1_autogen.h"
-#include "libGL/entry_points_gl_3_0_autogen.h"
-#include "libGL/entry_points_gl_3_1_autogen.h"
-#include "libGL/entry_points_gl_3_2_autogen.h"
-#include "libGL/entry_points_gl_3_3_autogen.h"
-#include "libGL/entry_points_gl_4_0_autogen.h"
-#include "libGL/entry_points_gl_4_1_autogen.h"
-#include "libGL/entry_points_gl_4_2_autogen.h"
-#include "libGL/entry_points_gl_4_3_autogen.h"
-#include "libGL/entry_points_gl_4_4_autogen.h"
-#include "libGL/entry_points_gl_4_5_autogen.h"
-#include "libGL/entry_points_gl_4_6_autogen.h"
+#include "libGL/entry_points_gl_1_autogen.h"
+#include "libGL/entry_points_gl_2_autogen.h"
+#include "libGL/entry_points_gl_3_autogen.h"
+#include "libGL/entry_points_gl_4_autogen.h"
 
 #include "common/event_tracer.h"
 
diff --git a/src/libGL/proc_table_wgl_autogen.cpp b/src/libGL/proc_table_wgl_autogen.cpp
index 7437020..a22de03 100644
--- a/src/libGL/proc_table_wgl_autogen.cpp
+++ b/src/libGL/proc_table_wgl_autogen.cpp
@@ -11,25 +11,10 @@
 
 #include "libGL/proc_table_wgl.h"
 
-#include "libGL/entry_points_gl_1_0_autogen.h"
-#include "libGL/entry_points_gl_1_1_autogen.h"
-#include "libGL/entry_points_gl_1_2_autogen.h"
-#include "libGL/entry_points_gl_1_3_autogen.h"
-#include "libGL/entry_points_gl_1_4_autogen.h"
-#include "libGL/entry_points_gl_1_5_autogen.h"
-#include "libGL/entry_points_gl_2_0_autogen.h"
-#include "libGL/entry_points_gl_2_1_autogen.h"
-#include "libGL/entry_points_gl_3_0_autogen.h"
-#include "libGL/entry_points_gl_3_1_autogen.h"
-#include "libGL/entry_points_gl_3_2_autogen.h"
-#include "libGL/entry_points_gl_3_3_autogen.h"
-#include "libGL/entry_points_gl_4_0_autogen.h"
-#include "libGL/entry_points_gl_4_1_autogen.h"
-#include "libGL/entry_points_gl_4_2_autogen.h"
-#include "libGL/entry_points_gl_4_3_autogen.h"
-#include "libGL/entry_points_gl_4_4_autogen.h"
-#include "libGL/entry_points_gl_4_5_autogen.h"
-#include "libGL/entry_points_gl_4_6_autogen.h"
+#include "libGL/entry_points_gl_1_autogen.h"
+#include "libGL/entry_points_gl_2_autogen.h"
+#include "libGL/entry_points_gl_3_autogen.h"
+#include "libGL/entry_points_gl_4_autogen.h"
 #include "libGL/entry_points_wgl.h"
 #include "platform/PlatformMethods.h"
 
diff --git a/src/libGLESv2.gni b/src/libGLESv2.gni
index f7d4ce4..f3e835e 100644
--- a/src/libGLESv2.gni
+++ b/src/libGLESv2.gni
@@ -41,6 +41,8 @@
   "src/common/platform.h",
   "src/common/string_utils.cpp",
   "src/common/string_utils.h",
+  "src/common/system_utils.cpp",
+  "src/common/system_utils.h",
   "src/common/third_party/base/anglebase/base_export.h",
   "src/common/third_party/base/anglebase/containers/mru_cache.h",
   "src/common/third_party/base/anglebase/logging.h",
@@ -68,24 +70,15 @@
   "src/common/third_party/xxhash/xxhash.h",
 ]
 
-angle_system_utils_sources = [
-  "src/common/Optional.h",
-  "src/common/angleutils.h",
-  "src/common/debug.h",
-  "src/common/platform.h",
-  "src/common/system_utils.cpp",
-  "src/common/system_utils.h",
-]
-
 if (is_linux || is_chromeos || is_android || is_fuchsia) {
-  angle_system_utils_sources += [
+  libangle_common_sources += [
     "src/common/system_utils_linux.cpp",
     "src/common/system_utils_posix.cpp",
   ]
 }
 
-if (is_mac) {
-  angle_system_utils_sources += [
+if (is_mac || is_ios) {
+  libangle_common_sources += [
     "src/common/apple/SoftLinking.h",
     "src/common/gl/cgl/FunctionsCGL.cpp",
     "src/common/gl/cgl/FunctionsCGL.h",
@@ -95,11 +88,11 @@
 }
 
 if (is_win) {
-  angle_system_utils_sources += [ "src/common/system_utils_win.cpp" ]
+  libangle_common_sources += [ "src/common/system_utils_win.cpp" ]
   if (current_os == "winuwp") {
-    angle_system_utils_sources += [ "src/common/system_utils_winuwp.cpp" ]
+    libangle_common_sources += [ "src/common/system_utils_winuwp.cpp" ]
   } else {
-    angle_system_utils_sources += [ "src/common/system_utils_win32.cpp" ]
+    libangle_common_sources += [ "src/common/system_utils_win32.cpp" ]
   }
 }
 
@@ -152,6 +145,11 @@
   "src/gpu_info_util/SystemInfo_macos.mm",
 ]
 
+libangle_gpu_info_util_ios_sources = [
+  "src/gpu_info_util/SystemInfo_apple.mm",
+  "src/gpu_info_util/SystemInfo_ios.cpp",
+]
+
 libangle_includes = [
   "include/angle_gl.h",
   "include/export.h",
@@ -200,25 +198,10 @@
   "src/libANGLE/Constants.h",
   "src/libANGLE/Context.h",
   "src/libANGLE/Context.inl.h",
-  "src/libANGLE/Context_gl_1_0_autogen.h",
-  "src/libANGLE/Context_gl_1_1_autogen.h",
-  "src/libANGLE/Context_gl_1_2_autogen.h",
-  "src/libANGLE/Context_gl_1_3_autogen.h",
-  "src/libANGLE/Context_gl_1_4_autogen.h",
-  "src/libANGLE/Context_gl_1_5_autogen.h",
-  "src/libANGLE/Context_gl_2_0_autogen.h",
-  "src/libANGLE/Context_gl_2_1_autogen.h",
-  "src/libANGLE/Context_gl_3_0_autogen.h",
-  "src/libANGLE/Context_gl_3_1_autogen.h",
-  "src/libANGLE/Context_gl_3_2_autogen.h",
-  "src/libANGLE/Context_gl_3_3_autogen.h",
-  "src/libANGLE/Context_gl_4_0_autogen.h",
-  "src/libANGLE/Context_gl_4_1_autogen.h",
-  "src/libANGLE/Context_gl_4_2_autogen.h",
-  "src/libANGLE/Context_gl_4_3_autogen.h",
-  "src/libANGLE/Context_gl_4_4_autogen.h",
-  "src/libANGLE/Context_gl_4_5_autogen.h",
-  "src/libANGLE/Context_gl_4_6_autogen.h",
+  "src/libANGLE/Context_gl_1_autogen.h",
+  "src/libANGLE/Context_gl_2_autogen.h",
+  "src/libANGLE/Context_gl_3_autogen.h",
+  "src/libANGLE/Context_gl_4_autogen.h",
   "src/libANGLE/Context_gles_1_0_autogen.h",
   "src/libANGLE/Context_gles_2_0_autogen.h",
   "src/libANGLE/Context_gles_3_0_autogen.h",
@@ -325,6 +308,7 @@
   "src/libANGLE/renderer/renderer_utils.h",
   "src/libANGLE/renderer/serial_utils.h",
   "src/libANGLE/validationEGL.h",
+  "src/libANGLE/validationEGL_autogen.h",
   "src/libANGLE/validationES.h",
   "src/libANGLE/validationES1.h",
   "src/libANGLE/validationES1_autogen.h",
@@ -338,24 +322,9 @@
   "src/libANGLE/validationES3_autogen.h",
   "src/libANGLE/validationESEXT.h",
   "src/libANGLE/validationESEXT_autogen.h",
-  "src/libANGLE/validationGL11_autogen.h",
-  "src/libANGLE/validationGL12_autogen.h",
-  "src/libANGLE/validationGL13_autogen.h",
-  "src/libANGLE/validationGL14_autogen.h",
-  "src/libANGLE/validationGL15_autogen.h",
   "src/libANGLE/validationGL1_autogen.h",
-  "src/libANGLE/validationGL21_autogen.h",
   "src/libANGLE/validationGL2_autogen.h",
-  "src/libANGLE/validationGL31_autogen.h",
-  "src/libANGLE/validationGL32_autogen.h",
-  "src/libANGLE/validationGL33_autogen.h",
   "src/libANGLE/validationGL3_autogen.h",
-  "src/libANGLE/validationGL41_autogen.h",
-  "src/libANGLE/validationGL42_autogen.h",
-  "src/libANGLE/validationGL43_autogen.h",
-  "src/libANGLE/validationGL44_autogen.h",
-  "src/libANGLE/validationGL45_autogen.h",
-  "src/libANGLE/validationGL46_autogen.h",
   "src/libANGLE/validationGL4_autogen.h",
   "src/third_party/trace_event/trace_event.h",
 ]
@@ -445,24 +414,9 @@
   "src/libANGLE/validationES32.cpp",
   "src/libANGLE/validationESEXT.cpp",
   "src/libANGLE/validationGL1.cpp",
-  "src/libANGLE/validationGL11.cpp",
-  "src/libANGLE/validationGL12.cpp",
-  "src/libANGLE/validationGL13.cpp",
-  "src/libANGLE/validationGL14.cpp",
-  "src/libANGLE/validationGL15.cpp",
   "src/libANGLE/validationGL2.cpp",
-  "src/libANGLE/validationGL21.cpp",
   "src/libANGLE/validationGL3.cpp",
-  "src/libANGLE/validationGL31.cpp",
-  "src/libANGLE/validationGL32.cpp",
-  "src/libANGLE/validationGL33.cpp",
   "src/libANGLE/validationGL4.cpp",
-  "src/libANGLE/validationGL41.cpp",
-  "src/libANGLE/validationGL42.cpp",
-  "src/libANGLE/validationGL43.cpp",
-  "src/libANGLE/validationGL44.cpp",
-  "src/libANGLE/validationGL45.cpp",
-  "src/libANGLE/validationGL46.cpp",
 ]
 
 libangle_mac_sources = [
@@ -508,44 +462,14 @@
 ]
 
 libgl_sources = [
-  "src/libGL/entry_points_gl_1_0_autogen.cpp",
-  "src/libGL/entry_points_gl_1_0_autogen.h",
-  "src/libGL/entry_points_gl_1_1_autogen.cpp",
-  "src/libGL/entry_points_gl_1_1_autogen.h",
-  "src/libGL/entry_points_gl_1_2_autogen.cpp",
-  "src/libGL/entry_points_gl_1_2_autogen.h",
-  "src/libGL/entry_points_gl_1_3_autogen.cpp",
-  "src/libGL/entry_points_gl_1_3_autogen.h",
-  "src/libGL/entry_points_gl_1_4_autogen.cpp",
-  "src/libGL/entry_points_gl_1_4_autogen.h",
-  "src/libGL/entry_points_gl_1_5_autogen.cpp",
-  "src/libGL/entry_points_gl_1_5_autogen.h",
-  "src/libGL/entry_points_gl_2_0_autogen.cpp",
-  "src/libGL/entry_points_gl_2_0_autogen.h",
-  "src/libGL/entry_points_gl_2_1_autogen.cpp",
-  "src/libGL/entry_points_gl_2_1_autogen.h",
-  "src/libGL/entry_points_gl_3_0_autogen.cpp",
-  "src/libGL/entry_points_gl_3_0_autogen.h",
-  "src/libGL/entry_points_gl_3_1_autogen.cpp",
-  "src/libGL/entry_points_gl_3_1_autogen.h",
-  "src/libGL/entry_points_gl_3_2_autogen.cpp",
-  "src/libGL/entry_points_gl_3_2_autogen.h",
-  "src/libGL/entry_points_gl_3_3_autogen.cpp",
-  "src/libGL/entry_points_gl_3_3_autogen.h",
-  "src/libGL/entry_points_gl_4_0_autogen.cpp",
-  "src/libGL/entry_points_gl_4_0_autogen.h",
-  "src/libGL/entry_points_gl_4_1_autogen.cpp",
-  "src/libGL/entry_points_gl_4_1_autogen.h",
-  "src/libGL/entry_points_gl_4_2_autogen.cpp",
-  "src/libGL/entry_points_gl_4_2_autogen.h",
-  "src/libGL/entry_points_gl_4_3_autogen.cpp",
-  "src/libGL/entry_points_gl_4_3_autogen.h",
-  "src/libGL/entry_points_gl_4_4_autogen.cpp",
-  "src/libGL/entry_points_gl_4_4_autogen.h",
-  "src/libGL/entry_points_gl_4_5_autogen.cpp",
-  "src/libGL/entry_points_gl_4_5_autogen.h",
-  "src/libGL/entry_points_gl_4_6_autogen.cpp",
-  "src/libGL/entry_points_gl_4_6_autogen.h",
+  "src/libGL/entry_points_gl_1_autogen.cpp",
+  "src/libGL/entry_points_gl_1_autogen.h",
+  "src/libGL/entry_points_gl_2_autogen.cpp",
+  "src/libGL/entry_points_gl_2_autogen.h",
+  "src/libGL/entry_points_gl_3_autogen.cpp",
+  "src/libGL/entry_points_gl_3_autogen.h",
+  "src/libGL/entry_points_gl_4_autogen.cpp",
+  "src/libGL/entry_points_gl_4_autogen.h",
   "src/libGL/entry_points_wgl.cpp",
   "src/libGL/entry_points_wgl.h",
   "src/libGL/libGL_autogen.cpp",
@@ -564,10 +488,14 @@
 }
 
 libglesv2_sources = [
-  "src/libGLESv2/entry_points_egl.cpp",
-  "src/libGLESv2/entry_points_egl.h",
-  "src/libGLESv2/entry_points_egl_ext.cpp",
-  "src/libGLESv2/entry_points_egl_ext.h",
+  "src/libGLESv2/egl_ext_stubs.cpp",
+  "src/libGLESv2/egl_ext_stubs_autogen.h",
+  "src/libGLESv2/egl_stubs.cpp",
+  "src/libGLESv2/egl_stubs_autogen.h",
+  "src/libGLESv2/entry_points_egl_autogen.cpp",
+  "src/libGLESv2/entry_points_egl_autogen.h",
+  "src/libGLESv2/entry_points_egl_ext_autogen.cpp",
+  "src/libGLESv2/entry_points_egl_ext_autogen.h",
   "src/libGLESv2/entry_points_gles_1_0_autogen.cpp",
   "src/libGLESv2/entry_points_gles_1_0_autogen.h",
   "src/libGLESv2/entry_points_gles_2_0_autogen.cpp",
@@ -603,10 +531,10 @@
 
 libegl_sources = [
   "src/libEGL/egl_loader_autogen.h",
-  "src/libEGL/libEGL.cpp",
+  "src/libEGL/libEGL_autogen.cpp",
   "src/libEGL/resource.h",
-  "src/libGLESv2/entry_points_egl.h",
-  "src/libGLESv2/entry_points_egl_ext.h",
+  "src/libGLESv2/entry_points_egl_autogen.h",
+  "src/libGLESv2/entry_points_egl_ext_autogen.h",
 ]
 
 if (is_win) {
diff --git a/src/libGLESv2/egl_ext_stubs.cpp b/src/libGLESv2/egl_ext_stubs.cpp
new file mode 100644
index 0000000..dbc151c
--- /dev/null
+++ b/src/libGLESv2/egl_ext_stubs.cpp
@@ -0,0 +1,796 @@
+//
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// egl_ext_stubs.cpp: Stubs for EXT extension entry points.
+//
+
+#include "libGLESv2/egl_ext_stubs_autogen.h"
+
+#include "libANGLE/Device.h"
+#include "libANGLE/Display.h"
+#include "libANGLE/EGLSync.h"
+#include "libANGLE/Surface.h"
+#include "libANGLE/Thread.h"
+#include "libANGLE/queryutils.h"
+#include "libANGLE/validationEGL.h"
+#include "libGLESv2/global_state.h"
+
+namespace egl
+{
+EGLint ClientWaitSyncKHR(Thread *thread,
+                         Display *display,
+                         Sync *syncObject,
+                         EGLint flags,
+                         EGLTimeKHR timeout)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglClientWaitSync",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    gl::Context *currentContext = thread->getContext();
+    EGLint syncStatus           = EGL_FALSE;
+    ANGLE_EGL_TRY_RETURN(
+        thread, syncObject->clientWait(display, currentContext, flags, timeout, &syncStatus),
+        "eglClientWaitSync", GetSyncIfValid(display, syncObject), EGL_FALSE);
+
+    thread->setSuccess();
+    return syncStatus;
+}
+
+EGLImageKHR CreateImageKHR(Thread *thread,
+                           Display *display,
+                           gl::Context *context,
+                           EGLenum target,
+                           EGLClientBuffer buffer,
+                           const AttributeMap &attributes)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglCreateImageKHR",
+                         GetDisplayIfValid(display), EGL_NO_IMAGE);
+    Image *image = nullptr;
+    ANGLE_EGL_TRY_RETURN(thread, display->createImage(context, target, buffer, attributes, &image),
+                         "", GetDisplayIfValid(display), EGL_NO_IMAGE);
+
+    thread->setSuccess();
+    return static_cast<EGLImage>(image);
+}
+
+EGLClientBuffer CreateNativeClientBufferANDROID(Thread *thread, const AttributeMap &attribMap)
+{
+    EGLClientBuffer eglClientBuffer = nullptr;
+    ANGLE_EGL_TRY_RETURN(thread,
+                         egl::Display::CreateNativeClientBuffer(attribMap, &eglClientBuffer),
+                         "eglCreateNativeClientBufferANDROID", nullptr, nullptr);
+
+    thread->setSuccess();
+    return eglClientBuffer;
+}
+
+EGLSurface CreatePlatformPixmapSurfaceEXT(Thread *thread,
+                                          Display *display,
+                                          Config *configPacked,
+                                          void *native_pixmap,
+                                          const AttributeMap &attributes)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglCreatePlatformPixmapSurfaceEXT",
+                         GetDisplayIfValid(display), EGL_NO_SURFACE);
+    thread->setError(EGL_BAD_DISPLAY, "eglCreatePlatformPixmapSurfaceEXT",
+                     GetDisplayIfValid(display), "CreatePlatformPixmapSurfaceEXT unimplemented.");
+    return EGL_NO_SURFACE;
+}
+
+EGLSurface CreatePlatformWindowSurfaceEXT(Thread *thread,
+                                          Display *display,
+                                          Config *configPacked,
+                                          void *native_window,
+                                          const AttributeMap &attributes)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglCreatePlatformWindowSurfaceEXT",
+                         GetDisplayIfValid(display), EGL_NO_SURFACE);
+    thread->setError(EGL_BAD_DISPLAY, "eglCreatePlatformWindowSurfaceEXT",
+                     GetDisplayIfValid(display), "CreatePlatformWindowSurfaceEXT unimplemented.");
+    return EGL_NO_SURFACE;
+}
+
+EGLStreamKHR CreateStreamKHR(Thread *thread, Display *display, const AttributeMap &attributes)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglCreateStreamKHR",
+                         GetDisplayIfValid(display), EGL_NO_STREAM_KHR);
+    Stream *stream;
+    ANGLE_EGL_TRY_RETURN(thread, display->createStream(attributes, &stream), "eglCreateStreamKHR",
+                         GetDisplayIfValid(display), EGL_NO_STREAM_KHR);
+
+    thread->setSuccess();
+    return static_cast<EGLStreamKHR>(stream);
+}
+
+EGLSyncKHR CreateSyncKHR(Thread *thread,
+                         Display *display,
+                         EGLenum type,
+                         const AttributeMap &attributes)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglCreateSyncKHR",
+                         GetDisplayIfValid(display), EGL_NO_SYNC);
+    egl::Sync *syncObject = nullptr;
+    ANGLE_EGL_TRY_RETURN(thread,
+                         display->createSync(thread->getContext(), type, attributes, &syncObject),
+                         "eglCreateSyncKHR", GetDisplayIfValid(display), EGL_NO_SYNC);
+
+    thread->setSuccess();
+    return static_cast<EGLSync>(syncObject);
+}
+
+EGLint DebugMessageControlKHR(Thread *thread,
+                              EGLDEBUGPROCKHR callback,
+                              const AttributeMap &attributes)
+{
+    Debug *debug = GetDebug();
+    debug->setCallback(callback, attributes);
+
+    thread->setSuccess();
+    return EGL_SUCCESS;
+}
+
+EGLBoolean DestroyImageKHR(Thread *thread, Display *display, Image *img)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglDestroyImageKHR",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    display->destroyImage(img);
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLBoolean DestroyStreamKHR(Thread *thread, Display *display, Stream *streamObject)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglDestroyStreamKHR",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    display->destroyStream(streamObject);
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLBoolean DestroySyncKHR(Thread *thread, Display *display, Sync *syncObject)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglDestroySync",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    display->destroySync(syncObject);
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLint DupNativeFenceFDANDROID(Thread *thread, Display *display, Sync *syncObject)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglDupNativeFenceFDANDROID",
+                         GetDisplayIfValid(display), EGL_NO_NATIVE_FENCE_FD_ANDROID);
+    EGLint result = EGL_NO_NATIVE_FENCE_FD_ANDROID;
+    ANGLE_EGL_TRY_RETURN(thread, syncObject->dupNativeFenceFD(display, &result),
+                         "eglDupNativeFenceFDANDROID", GetSyncIfValid(display, syncObject),
+                         EGL_NO_NATIVE_FENCE_FD_ANDROID);
+
+    thread->setSuccess();
+    return result;
+}
+
+EGLClientBuffer GetNativeClientBufferANDROID(Thread *thread, const struct AHardwareBuffer *buffer)
+{
+    thread->setSuccess();
+    return egl::Display::GetNativeClientBuffer(buffer);
+}
+
+EGLDisplay GetPlatformDisplayEXT(Thread *thread,
+                                 EGLenum platform,
+                                 void *native_display,
+                                 const AttributeMap &attribMap)
+{
+    if (platform == EGL_PLATFORM_ANGLE_ANGLE)
+    {
+        return egl::Display::GetDisplayFromNativeDisplay(
+            gl::bitCast<EGLNativeDisplayType>(native_display), attribMap);
+    }
+    else if (platform == EGL_PLATFORM_DEVICE_EXT)
+    {
+        Device *eglDevice = static_cast<Device *>(native_display);
+        return egl::Display::GetDisplayFromDevice(eglDevice, attribMap);
+    }
+    else
+    {
+        UNREACHABLE();
+        return EGL_NO_DISPLAY;
+    }
+}
+
+EGLBoolean GetSyncAttribKHR(Thread *thread,
+                            Display *display,
+                            Sync *syncObject,
+                            EGLint attribute,
+                            EGLint *value)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglGetSyncAttrib",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    ANGLE_EGL_TRY_RETURN(thread, GetSyncAttrib(display, syncObject, attribute, value),
+                         "eglGetSyncAttrib", GetSyncIfValid(display, syncObject), EGL_FALSE);
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLint LabelObjectKHR(Thread *thread,
+                      Display *display,
+                      ObjectType objectTypePacked,
+                      EGLObjectKHR object,
+                      EGLLabelKHR label)
+{
+    LabeledObject *labeledObject =
+        GetLabeledObjectIfValid(thread, display, objectTypePacked, object);
+    ASSERT(labeledObject != nullptr);
+    labeledObject->setLabel(label);
+
+    thread->setSuccess();
+    return EGL_SUCCESS;
+}
+
+EGLBoolean PostSubBufferNV(Thread *thread,
+                           Display *display,
+                           Surface *eglSurface,
+                           EGLint x,
+                           EGLint y,
+                           EGLint width,
+                           EGLint height)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglPostSubBufferNV",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    Error error = eglSurface->postSubBuffer(thread->getContext(), x, y, width, height);
+    if (error.isError())
+    {
+        thread->setError(error, "eglPostSubBufferNV", GetSurfaceIfValid(display, eglSurface));
+        return EGL_FALSE;
+    }
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLBoolean PresentationTimeANDROID(Thread *thread,
+                                   Display *display,
+                                   Surface *eglSurface,
+                                   EGLnsecsANDROID time)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglPresentationTimeANDROID",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    ANGLE_EGL_TRY_RETURN(thread, eglSurface->setPresentationTime(time),
+                         "eglPresentationTimeANDROID", GetSurfaceIfValid(display, eglSurface),
+                         EGL_FALSE);
+
+    return EGL_TRUE;
+}
+
+EGLBoolean GetCompositorTimingSupportedANDROID(Thread *thread,
+                                               Display *display,
+                                               Surface *eglSurface,
+                                               CompositorTiming nameInternal)
+{
+    thread->setSuccess();
+    return eglSurface->getSupportedCompositorTimings().test(nameInternal);
+}
+
+EGLBoolean GetCompositorTimingANDROID(Thread *thread,
+                                      Display *display,
+                                      Surface *eglSurface,
+                                      EGLint numTimestamps,
+                                      const EGLint *names,
+                                      EGLnsecsANDROID *values)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglGetCompositorTimingANDROIDD",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    ANGLE_EGL_TRY_RETURN(thread, eglSurface->getCompositorTiming(numTimestamps, names, values),
+                         "eglGetCompositorTimingANDROIDD", GetSurfaceIfValid(display, eglSurface),
+                         EGL_FALSE);
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLBoolean GetNextFrameIdANDROID(Thread *thread,
+                                 Display *display,
+                                 Surface *eglSurface,
+                                 EGLuint64KHR *frameId)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglGetNextFrameIdANDROID",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    ANGLE_EGL_TRY_RETURN(thread, eglSurface->getNextFrameId(frameId), "eglGetNextFrameIdANDROID",
+                         GetSurfaceIfValid(display, eglSurface), EGL_FALSE);
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLBoolean GetFrameTimestampSupportedANDROID(Thread *thread,
+                                             Display *display,
+                                             Surface *eglSurface,
+                                             Timestamp timestampInternal)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglQueryTimestampSupportedANDROID",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    thread->setSuccess();
+    return eglSurface->getSupportedTimestamps().test(timestampInternal);
+}
+
+EGLBoolean GetFrameTimestampsANDROID(Thread *thread,
+                                     Display *display,
+                                     Surface *eglSurface,
+                                     EGLuint64KHR frameId,
+                                     EGLint numTimestamps,
+                                     const EGLint *timestamps,
+                                     EGLnsecsANDROID *values)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglGetFrameTimestampsANDROID",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    ANGLE_EGL_TRY_RETURN(
+        thread, eglSurface->getFrameTimestamps(frameId, numTimestamps, timestamps, values),
+        "eglGetFrameTimestampsANDROID", GetSurfaceIfValid(display, eglSurface), EGL_FALSE);
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLBoolean QueryDebugKHR(Thread *thread, EGLint attribute, EGLAttrib *value)
+{
+    Debug *debug = GetDebug();
+    switch (attribute)
+    {
+        case EGL_DEBUG_MSG_CRITICAL_KHR:
+        case EGL_DEBUG_MSG_ERROR_KHR:
+        case EGL_DEBUG_MSG_WARN_KHR:
+        case EGL_DEBUG_MSG_INFO_KHR:
+            *value = debug->isMessageTypeEnabled(FromEGLenum<MessageType>(attribute)) ? EGL_TRUE
+                                                                                      : EGL_FALSE;
+            break;
+        case EGL_DEBUG_CALLBACK_KHR:
+            *value = reinterpret_cast<EGLAttrib>(debug->getCallback());
+            break;
+
+        default:
+            UNREACHABLE();
+    }
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLBoolean QueryDeviceAttribEXT(Thread *thread, Device *dev, EGLint attribute, EGLAttrib *value)
+{
+    ANGLE_EGL_TRY_RETURN(thread, dev->getAttribute(attribute, value), "eglQueryDeviceAttribEXT",
+                         GetDeviceIfValid(dev), EGL_FALSE);
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+const char *QueryDeviceStringEXT(Thread *thread, Device *dev, EGLint name)
+{
+    egl::Display *owningDisplay = dev->getOwningDisplay();
+    ANGLE_EGL_TRY_RETURN(thread, owningDisplay->prepareForCall(), "eglQueryDeviceStringEXT",
+                         GetDisplayIfValid(owningDisplay), EGL_FALSE);
+    const char *result;
+    switch (name)
+    {
+        case EGL_EXTENSIONS:
+            result = dev->getExtensionString().c_str();
+            break;
+        default:
+            thread->setError(EglBadDevice(), "eglQueryDeviceStringEXT", GetDeviceIfValid(dev));
+            return nullptr;
+    }
+
+    thread->setSuccess();
+    return result;
+}
+
+EGLBoolean QueryDisplayAttribEXT(Thread *thread,
+                                 Display *display,
+                                 EGLint attribute,
+                                 EGLAttrib *value)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglQueryDisplayAttribEXT",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    *value = display->queryAttrib(attribute);
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLBoolean QueryStreamKHR(Thread *thread,
+                          Display *display,
+                          Stream *streamObject,
+                          EGLenum attribute,
+                          EGLint *value)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglQueryStreamKHR",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    switch (attribute)
+    {
+        case EGL_STREAM_STATE_KHR:
+            *value = streamObject->getState();
+            break;
+        case EGL_CONSUMER_LATENCY_USEC_KHR:
+            *value = streamObject->getConsumerLatency();
+            break;
+        case EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR:
+            *value = streamObject->getConsumerAcquireTimeout();
+            break;
+        default:
+            UNREACHABLE();
+    }
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLBoolean QueryStreamu64KHR(Thread *thread,
+                             Display *display,
+                             Stream *streamObject,
+                             EGLenum attribute,
+                             EGLuint64KHR *value)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglQueryStreamu64KHR",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    switch (attribute)
+    {
+        case EGL_PRODUCER_FRAME_KHR:
+            *value = streamObject->getProducerFrame();
+            break;
+        case EGL_CONSUMER_FRAME_KHR:
+            *value = streamObject->getConsumerFrame();
+            break;
+        default:
+            UNREACHABLE();
+    }
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLBoolean QuerySurfacePointerANGLE(Thread *thread,
+                                    Display *display,
+                                    Surface *eglSurface,
+                                    EGLint attribute,
+                                    void **value)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglQuerySurfacePointerANGLE",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    Error error = eglSurface->querySurfacePointerANGLE(attribute, value);
+    if (error.isError())
+    {
+        thread->setError(error, "eglQuerySurfacePointerANGLE",
+                         GetSurfaceIfValid(display, eglSurface));
+        return EGL_FALSE;
+    }
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+void SetBlobCacheFuncsANDROID(Thread *thread,
+                              Display *display,
+                              EGLSetBlobFuncANDROID set,
+                              EGLGetBlobFuncANDROID get)
+{
+    ANGLE_EGL_TRY(thread, display->prepareForCall(), "eglSetBlobCacheFuncsANDROID",
+                  GetDisplayIfValid(display));
+    thread->setSuccess();
+    display->setBlobCacheFuncs(set, get);
+}
+
+EGLBoolean SignalSyncKHR(Thread *thread, Display *display, Sync *syncObject, EGLenum mode)
+{
+    gl::Context *currentContext = thread->getContext();
+    ANGLE_EGL_TRY_RETURN(thread, syncObject->signal(display, currentContext, mode),
+                         "eglSignalSyncKHR", GetSyncIfValid(display, syncObject), EGL_FALSE);
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLBoolean StreamAttribKHR(Thread *thread,
+                           Display *display,
+                           Stream *streamObject,
+                           EGLenum attribute,
+                           EGLint value)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglStreamAttribKHR",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    switch (attribute)
+    {
+        case EGL_CONSUMER_LATENCY_USEC_KHR:
+            streamObject->setConsumerLatency(value);
+            break;
+        case EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR:
+            streamObject->setConsumerAcquireTimeout(value);
+            break;
+        default:
+            UNREACHABLE();
+    }
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLBoolean StreamConsumerAcquireKHR(Thread *thread, Display *display, Stream *streamObject)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglStreamConsumerAcquireKHR",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    ANGLE_EGL_TRY_RETURN(thread, streamObject->consumerAcquire(thread->getContext()),
+                         "eglStreamConsumerAcquireKHR", GetStreamIfValid(display, streamObject),
+                         EGL_FALSE);
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLBoolean StreamConsumerGLTextureExternalKHR(Thread *thread,
+                                              Display *display,
+                                              Stream *streamObject)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglStreamConsumerGLTextureExternalKHR",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    ANGLE_EGL_TRY_RETURN(
+        thread, streamObject->createConsumerGLTextureExternal(AttributeMap(), thread->getContext()),
+        "eglStreamConsumerGLTextureExternalKHR", GetStreamIfValid(display, streamObject),
+        EGL_FALSE);
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLBoolean StreamConsumerGLTextureExternalAttribsNV(Thread *thread,
+                                                    Display *display,
+                                                    Stream *streamObject,
+                                                    const AttributeMap &attributes)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(),
+                         "eglStreamConsumerGLTextureExternalAttribsNV", GetDisplayIfValid(display),
+                         EGL_FALSE);
+
+    gl::Context *context = gl::GetValidGlobalContext();
+    ANGLE_EGL_TRY_RETURN(thread, streamObject->createConsumerGLTextureExternal(attributes, context),
+                         "eglStreamConsumerGLTextureExternalAttribsNV",
+                         GetStreamIfValid(display, streamObject), EGL_FALSE);
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLBoolean StreamConsumerReleaseKHR(Thread *thread, Display *display, Stream *streamObject)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglStreamConsumerReleaseKHR",
+                         GetDisplayIfValid(display), EGL_FALSE);
+
+    gl::Context *context = gl::GetValidGlobalContext();
+    ANGLE_EGL_TRY_RETURN(thread, streamObject->consumerRelease(context),
+                         "eglStreamConsumerReleaseKHR", GetStreamIfValid(display, streamObject),
+                         EGL_FALSE);
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLBoolean SwapBuffersWithDamageKHR(Thread *thread,
+                                    Display *display,
+                                    Surface *eglSurface,
+                                    const EGLint *rects,
+                                    EGLint n_rects)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglSwapBuffersWithDamageEXT",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    ANGLE_EGL_TRY_RETURN(thread, eglSurface->swapWithDamage(thread->getContext(), rects, n_rects),
+                         "eglSwapBuffersWithDamageEXT", GetSurfaceIfValid(display, eglSurface),
+                         EGL_FALSE);
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLint WaitSyncKHR(Thread *thread, Display *display, Sync *syncObject, EGLint flags)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglWaitSync",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    gl::Context *currentContext = thread->getContext();
+    ANGLE_EGL_TRY_RETURN(thread, syncObject->serverWait(display, currentContext, flags),
+                         "eglWaitSync", GetSyncIfValid(display, syncObject), EGL_FALSE);
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLDeviceEXT CreateDeviceANGLE(Thread *thread,
+                               EGLint device_type,
+                               void *native_device,
+                               const EGLAttrib *attrib_list)
+{
+    Device *device = nullptr;
+    ANGLE_EGL_TRY_RETURN(thread, Device::CreateDevice(device_type, native_device, &device),
+                         "eglCreateDeviceANGLE", GetThreadIfValid(thread), EGL_NO_DEVICE_EXT);
+
+    thread->setSuccess();
+    return device;
+}
+
+EGLBoolean ReleaseDeviceANGLE(Thread *thread, Device *dev)
+{
+    SafeDelete(dev);
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLBoolean CreateStreamProducerD3DTextureANGLE(Thread *thread,
+                                               Display *display,
+                                               Stream *streamObject,
+                                               const AttributeMap &attributes)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(),
+                         "eglCreateStreamProducerD3DTextureANGLE", GetDisplayIfValid(display),
+                         EGL_FALSE);
+    ANGLE_EGL_TRY_RETURN(thread, streamObject->createProducerD3D11Texture(attributes),
+                         "eglCreateStreamProducerD3DTextureANGLE",
+                         GetStreamIfValid(display, streamObject), EGL_FALSE);
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLBoolean StreamPostD3DTextureANGLE(Thread *thread,
+                                     Display *display,
+                                     Stream *streamObject,
+                                     void *texture,
+                                     const AttributeMap &attributes)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglStreamPostD3DTextureANGLE",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    ANGLE_EGL_TRY_RETURN(thread, streamObject->postD3D11Texture(texture, attributes),
+                         "eglStreamPostD3DTextureANGLE", GetStreamIfValid(display, streamObject),
+                         EGL_FALSE);
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLBoolean GetMscRateANGLE(Thread *thread,
+                           Display *display,
+                           Surface *eglSurface,
+                           EGLint *numerator,
+                           EGLint *denominator)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglGetMscRateANGLE",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    ANGLE_EGL_TRY_RETURN(thread, eglSurface->getMscRate(numerator, denominator),
+                         "eglGetMscRateANGLE", GetSurfaceIfValid(display, eglSurface), EGL_FALSE);
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLBoolean GetSyncValuesCHROMIUM(Thread *thread,
+                                 Display *display,
+                                 Surface *eglSurface,
+                                 EGLuint64KHR *ust,
+                                 EGLuint64KHR *msc,
+                                 EGLuint64KHR *sbc)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglGetSyncValuesCHROMIUM",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    ANGLE_EGL_TRY_RETURN(thread, eglSurface->getSyncValues(ust, msc, sbc),
+                         "eglGetSyncValuesCHROMIUM", GetSurfaceIfValid(display, eglSurface),
+                         EGL_FALSE);
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLint ProgramCacheGetAttribANGLE(Thread *thread, Display *display, EGLenum attrib)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglProgramCacheGetAttribANGLE",
+                         GetDisplayIfValid(display), 0);
+    thread->setSuccess();
+    return display->programCacheGetAttrib(attrib);
+}
+
+void ProgramCacheQueryANGLE(Thread *thread,
+                            Display *display,
+                            EGLint index,
+                            void *key,
+                            EGLint *keysize,
+                            void *binary,
+                            EGLint *binarysize)
+{
+    ANGLE_EGL_TRY(thread, display->prepareForCall(), "eglProgramCacheQueryANGLE",
+                  GetDisplayIfValid(display));
+    ANGLE_EGL_TRY(thread, display->programCacheQuery(index, key, keysize, binary, binarysize),
+                  "eglProgramCacheQueryANGLE", GetDisplayIfValid(display));
+
+    thread->setSuccess();
+}
+
+void ProgramCachePopulateANGLE(Thread *thread,
+                               Display *display,
+                               const void *key,
+                               EGLint keysize,
+                               const void *binary,
+                               EGLint binarysize)
+{
+    ANGLE_EGL_TRY(thread, display->prepareForCall(), "eglProgramCachePopulateANGLE",
+                  GetDisplayIfValid(display));
+    ANGLE_EGL_TRY(thread, display->programCachePopulate(key, keysize, binary, binarysize),
+                  "eglProgramCachePopulateANGLE", GetDisplayIfValid(display));
+
+    thread->setSuccess();
+}
+
+EGLint ProgramCacheResizeANGLE(Thread *thread, Display *display, EGLint limit, EGLint mode)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglProgramCacheResizeANGLE",
+                         GetDisplayIfValid(display), 0);
+    thread->setSuccess();
+    return display->programCacheResize(limit, mode);
+}
+
+const char *QueryStringiANGLE(Thread *thread, Display *display, EGLint name, EGLint index)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglQueryStringiANGLE",
+                         GetDisplayIfValid(display), nullptr);
+    thread->setSuccess();
+    return display->queryStringi(name, index);
+}
+
+EGLBoolean SwapBuffersWithFrameTokenANGLE(Thread *thread,
+                                          Display *display,
+                                          Surface *eglSurface,
+                                          EGLFrameTokenANGLE frametoken)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglSwapBuffersWithFrameTokenANGLE",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    ANGLE_EGL_TRY_RETURN(thread, eglSurface->swapWithFrameToken(thread->getContext(), frametoken),
+                         "eglSwapBuffersWithFrameTokenANGLE", GetDisplayIfValid(display),
+                         EGL_FALSE);
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+void ReleaseHighPowerGPUANGLE(Thread *thread, Display *display, gl::Context *context)
+{
+    ANGLE_EGL_TRY(thread, display->prepareForCall(), "eglReleaseHighPowerGPUANGLE",
+                  GetDisplayIfValid(display));
+    ANGLE_EGL_TRY(thread, context->releaseHighPowerGPU(), "eglReleaseHighPowerGPUANGLE",
+                  GetDisplayIfValid(display));
+
+    thread->setSuccess();
+}
+
+void ReacquireHighPowerGPUANGLE(Thread *thread, Display *display, gl::Context *context)
+{
+    ANGLE_EGL_TRY(thread, display->prepareForCall(), "eglReacquireHighPowerGPUANGLE",
+                  GetDisplayIfValid(display));
+    ANGLE_EGL_TRY(thread, context->reacquireHighPowerGPU(), "eglReacquireHighPowerGPUANGLE",
+                  GetDisplayIfValid(display));
+
+    thread->setSuccess();
+}
+
+void HandleGPUSwitchANGLE(Thread *thread, Display *display)
+{
+    ANGLE_EGL_TRY(thread, display->prepareForCall(), "eglHandleGPUSwitchANGLE",
+                  GetDisplayIfValid(display));
+    ANGLE_EGL_TRY(thread, display->handleGPUSwitch(), "eglHandleGPUSwitchANGLE",
+                  GetDisplayIfValid(display));
+
+    thread->setSuccess();
+}
+
+EGLBoolean QueryDisplayAttribANGLE(Thread *thread,
+                                   Display *display,
+                                   EGLint attribute,
+                                   EGLAttrib *value)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglQueryDisplayAttribEXT",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    *value = display->queryAttrib(attribute);
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+}  // namespace egl
diff --git a/src/libGLESv2/egl_ext_stubs_autogen.h b/src/libGLESv2/egl_ext_stubs_autogen.h
new file mode 100644
index 0000000..435cfca
--- /dev/null
+++ b/src/libGLESv2/egl_ext_stubs_autogen.h
@@ -0,0 +1,226 @@
+// GENERATED FILE - DO NOT EDIT.
+// Generated by generate_entry_points.py using data from egl.xml and egl_angle_ext.xml.
+//
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// egl_ext_stubs_autogen.h: Stubs for EXT extension entry points.
+
+#ifndef LIBGLESV2_EGL_EXT_STUBS_AUTOGEN_H_
+#define LIBGLESV2_EGL_EXT_STUBS_AUTOGEN_H_
+
+#include <EGL/egl.h>
+#include <EGL/eglext.h>
+
+#include "common/PackedEGLEnums_autogen.h"
+
+namespace gl
+{
+class Context;
+}  // namespace gl
+
+namespace egl
+{
+class AttributeMap;
+class Device;
+class Display;
+class Image;
+class Stream;
+class Surface;
+class Sync;
+class Thread;
+struct Config;
+
+EGLint ClientWaitSyncKHR(Thread *thread,
+                         egl::Display *dpyPacked,
+                         Sync *syncPacked,
+                         EGLint flags,
+                         EGLTimeKHR timeout);
+EGLImageKHR CreateImageKHR(Thread *thread,
+                           egl::Display *dpyPacked,
+                           gl::Context *ctxPacked,
+                           EGLenum target,
+                           EGLClientBuffer buffer,
+                           const AttributeMap &attrib_listPacked);
+EGLClientBuffer CreateNativeClientBufferANDROID(Thread *thread,
+                                                const AttributeMap &attrib_listPacked);
+EGLSurface CreatePlatformPixmapSurfaceEXT(Thread *thread,
+                                          egl::Display *dpyPacked,
+                                          Config *configPacked,
+                                          void *native_pixmap,
+                                          const AttributeMap &attrib_listPacked);
+EGLSurface CreatePlatformWindowSurfaceEXT(Thread *thread,
+                                          egl::Display *dpyPacked,
+                                          Config *configPacked,
+                                          void *native_window,
+                                          const AttributeMap &attrib_listPacked);
+EGLStreamKHR CreateStreamKHR(Thread *thread,
+                             egl::Display *dpyPacked,
+                             const AttributeMap &attrib_listPacked);
+EGLSyncKHR CreateSyncKHR(Thread *thread,
+                         egl::Display *dpyPacked,
+                         EGLenum type,
+                         const AttributeMap &attrib_listPacked);
+EGLint DebugMessageControlKHR(Thread *thread,
+                              EGLDEBUGPROCKHR callback,
+                              const AttributeMap &attrib_listPacked);
+EGLBoolean DestroyImageKHR(Thread *thread, egl::Display *dpyPacked, Image *imagePacked);
+EGLBoolean DestroyStreamKHR(Thread *thread, egl::Display *dpyPacked, Stream *streamPacked);
+EGLBoolean DestroySyncKHR(Thread *thread, egl::Display *dpyPacked, Sync *syncPacked);
+EGLint DupNativeFenceFDANDROID(Thread *thread, egl::Display *dpyPacked, Sync *syncPacked);
+EGLClientBuffer GetNativeClientBufferANDROID(Thread *thread, const struct AHardwareBuffer *buffer);
+EGLDisplay GetPlatformDisplayEXT(Thread *thread,
+                                 EGLenum platform,
+                                 void *native_display,
+                                 const AttributeMap &attrib_listPacked);
+EGLBoolean GetSyncAttribKHR(Thread *thread,
+                            egl::Display *dpyPacked,
+                            Sync *syncPacked,
+                            EGLint attribute,
+                            EGLint *value);
+EGLint LabelObjectKHR(Thread *thread,
+                      egl::Display *displayPacked,
+                      ObjectType objectTypePacked,
+                      EGLObjectKHR object,
+                      EGLLabelKHR label);
+EGLBoolean PostSubBufferNV(Thread *thread,
+                           egl::Display *dpyPacked,
+                           Surface *surfacePacked,
+                           EGLint x,
+                           EGLint y,
+                           EGLint width,
+                           EGLint height);
+EGLBoolean PresentationTimeANDROID(Thread *thread,
+                                   egl::Display *dpyPacked,
+                                   Surface *surfacePacked,
+                                   EGLnsecsANDROID time);
+EGLBoolean GetCompositorTimingSupportedANDROID(Thread *thread,
+                                               egl::Display *dpyPacked,
+                                               Surface *surfacePacked,
+                                               CompositorTiming namePacked);
+EGLBoolean GetCompositorTimingANDROID(Thread *thread,
+                                      egl::Display *dpyPacked,
+                                      Surface *surfacePacked,
+                                      EGLint numTimestamps,
+                                      const EGLint *names,
+                                      EGLnsecsANDROID *values);
+EGLBoolean GetNextFrameIdANDROID(Thread *thread,
+                                 egl::Display *dpyPacked,
+                                 Surface *surfacePacked,
+                                 EGLuint64KHR *frameId);
+EGLBoolean GetFrameTimestampSupportedANDROID(Thread *thread,
+                                             egl::Display *dpyPacked,
+                                             Surface *surfacePacked,
+                                             Timestamp timestampPacked);
+EGLBoolean GetFrameTimestampsANDROID(Thread *thread,
+                                     egl::Display *dpyPacked,
+                                     Surface *surfacePacked,
+                                     EGLuint64KHR frameId,
+                                     EGLint numTimestamps,
+                                     const EGLint *timestamps,
+                                     EGLnsecsANDROID *values);
+EGLBoolean QueryDebugKHR(Thread *thread, EGLint attribute, EGLAttrib *value);
+EGLBoolean QueryDeviceAttribEXT(Thread *thread,
+                                Device *devicePacked,
+                                EGLint attribute,
+                                EGLAttrib *value);
+const char *QueryDeviceStringEXT(Thread *thread, Device *devicePacked, EGLint name);
+EGLBoolean QueryDisplayAttribEXT(Thread *thread,
+                                 egl::Display *dpyPacked,
+                                 EGLint attribute,
+                                 EGLAttrib *value);
+EGLBoolean QueryStreamKHR(Thread *thread,
+                          egl::Display *dpyPacked,
+                          Stream *streamPacked,
+                          EGLenum attribute,
+                          EGLint *value);
+EGLBoolean QueryStreamu64KHR(Thread *thread,
+                             egl::Display *dpyPacked,
+                             Stream *streamPacked,
+                             EGLenum attribute,
+                             EGLuint64KHR *value);
+EGLBoolean QuerySurfacePointerANGLE(Thread *thread,
+                                    egl::Display *dpyPacked,
+                                    Surface *surfacePacked,
+                                    EGLint attribute,
+                                    void **value);
+void SetBlobCacheFuncsANDROID(Thread *thread,
+                              egl::Display *dpyPacked,
+                              EGLSetBlobFuncANDROID set,
+                              EGLGetBlobFuncANDROID get);
+EGLBoolean SignalSyncKHR(Thread *thread, egl::Display *dpyPacked, Sync *syncPacked, EGLenum mode);
+EGLBoolean StreamAttribKHR(Thread *thread,
+                           egl::Display *dpyPacked,
+                           Stream *streamPacked,
+                           EGLenum attribute,
+                           EGLint value);
+EGLBoolean StreamConsumerAcquireKHR(Thread *thread, egl::Display *dpyPacked, Stream *streamPacked);
+EGLBoolean StreamConsumerGLTextureExternalKHR(Thread *thread,
+                                              egl::Display *dpyPacked,
+                                              Stream *streamPacked);
+EGLBoolean StreamConsumerGLTextureExternalAttribsNV(Thread *thread,
+                                                    egl::Display *dpyPacked,
+                                                    Stream *streamPacked,
+                                                    const AttributeMap &attrib_listPacked);
+EGLBoolean StreamConsumerReleaseKHR(Thread *thread, egl::Display *dpyPacked, Stream *streamPacked);
+EGLBoolean SwapBuffersWithDamageKHR(Thread *thread,
+                                    egl::Display *dpyPacked,
+                                    Surface *surfacePacked,
+                                    const EGLint *rects,
+                                    EGLint n_rects);
+EGLint WaitSyncKHR(Thread *thread, egl::Display *dpyPacked, Sync *syncPacked, EGLint flags);
+EGLDeviceEXT CreateDeviceANGLE(Thread *thread,
+                               EGLint device_type,
+                               void *native_device,
+                               const EGLAttrib *attrib_list);
+EGLBoolean ReleaseDeviceANGLE(Thread *thread, Device *devicePacked);
+EGLBoolean CreateStreamProducerD3DTextureANGLE(Thread *thread,
+                                               egl::Display *dpyPacked,
+                                               Stream *streamPacked,
+                                               const AttributeMap &attrib_listPacked);
+EGLBoolean StreamPostD3DTextureANGLE(Thread *thread,
+                                     egl::Display *dpyPacked,
+                                     Stream *streamPacked,
+                                     void *texture,
+                                     const AttributeMap &attrib_listPacked);
+EGLBoolean GetMscRateANGLE(Thread *thread,
+                           egl::Display *dpyPacked,
+                           Surface *surfacePacked,
+                           EGLint *numerator,
+                           EGLint *denominator);
+EGLBoolean GetSyncValuesCHROMIUM(Thread *thread,
+                                 egl::Display *dpyPacked,
+                                 Surface *surfacePacked,
+                                 EGLuint64KHR *ust,
+                                 EGLuint64KHR *msc,
+                                 EGLuint64KHR *sbc);
+EGLint ProgramCacheGetAttribANGLE(Thread *thread, egl::Display *dpyPacked, EGLenum attrib);
+void ProgramCacheQueryANGLE(Thread *thread,
+                            egl::Display *dpyPacked,
+                            EGLint index,
+                            void *key,
+                            EGLint *keysize,
+                            void *binary,
+                            EGLint *binarysize);
+void ProgramCachePopulateANGLE(Thread *thread,
+                               egl::Display *dpyPacked,
+                               const void *key,
+                               EGLint keysize,
+                               const void *binary,
+                               EGLint binarysize);
+EGLint ProgramCacheResizeANGLE(Thread *thread, egl::Display *dpyPacked, EGLint limit, EGLint mode);
+const char *QueryStringiANGLE(Thread *thread, egl::Display *dpyPacked, EGLint name, EGLint index);
+EGLBoolean SwapBuffersWithFrameTokenANGLE(Thread *thread,
+                                          egl::Display *dpyPacked,
+                                          Surface *surfacePacked,
+                                          EGLFrameTokenANGLE frametoken);
+void ReleaseHighPowerGPUANGLE(Thread *thread, egl::Display *dpyPacked, gl::Context *ctxPacked);
+void ReacquireHighPowerGPUANGLE(Thread *thread, egl::Display *dpyPacked, gl::Context *ctxPacked);
+void HandleGPUSwitchANGLE(Thread *thread, egl::Display *dpyPacked);
+EGLBoolean QueryDisplayAttribANGLE(Thread *thread,
+                                   egl::Display *dpyPacked,
+                                   EGLint attribute,
+                                   EGLAttrib *value);
+}  // namespace egl
+#endif  // LIBGLESV2_EGL_EXT_STUBS_AUTOGEN_H_
diff --git a/src/libGLESv2/egl_get_labeled_object_data.json b/src/libGLESv2/egl_get_labeled_object_data.json
new file mode 100644
index 0000000..dee0b4d
--- /dev/null
+++ b/src/libGLESv2/egl_get_labeled_object_data.json
@@ -0,0 +1,75 @@
+{
+    "description": [
+        "Copyright 2020 The ANGLE Project Authors. All rights reserved.",
+        "Use of this source code is governed by a BSD-style license that can be",
+        "found in the LICENSE file.",
+        "",
+        "egl_get_labeled_object_data.json: Associates entry points and labeled objects.",
+        "",
+        "If an entry point has no data in this list it is associated with an",
+        "EGLDisplay if the EGLDisplay is the first parameter the function.",
+        "Otherise missing entry points have no association.",
+        "",
+        "We omit extension suffixes in this file. The generator takes care of that."
+    ],
+    "Context": [
+        "DestroyContext",
+        "MakeCurrent",
+        "QueryContext",
+        "WaitClient"
+    ],
+    "Device": [
+        "QueryDeviceAttrib",
+        "QueryDeviceString",
+        "ReleaseDevice"
+    ],
+    "Image": [
+        "DestroyImage"
+    ],
+    "LabeledObject": [
+        "LabelObject"
+    ],
+    "Stream": [
+        "CreateStreamProducerD3DTexture",
+        "DestroyStream",
+        "QueryStream",
+        "QueryStreamu64",
+        "StreamAttrib",
+        "StreamConsumerAcquire",
+        "StreamConsumerGLTextureExternal",
+        "StreamConsumerGLTextureExternalAttribsNV",
+        "StreamConsumerRelease",
+        "StreamPostD3DTexture"
+    ],
+    "Surface": [
+        "BindTexImage",
+        "CopyBuffers",
+        "DestroySurface",
+        "GetCompositorTiming",
+        "GetCompositorTimingSupported",
+        "GetFrameTimestamps",
+        "GetFrameTimestampSupported",
+        "GetNextFrameId",
+        "GetMscRate",
+        "GetSyncValues",
+        "PresentationTime",
+        "QuerySuface",
+        "ReleaseTexImage",
+        "SurfaceAttrib",
+        "SwapBuffers",
+        "SwapBuffersWithDamage"
+    ],
+    "Sync": [
+        "ClientWaitSync",
+        "DupNativeFenceFD",
+        "GetSyncAttrib",
+        "SignalSync",
+        "WaitSync"
+    ],
+    "Thread": [
+        "BindAPI",
+        "CreateDevice",
+        "GetPlatformDisplay",
+        "WaitNative"
+    ]
+}
diff --git a/src/libGLESv2/egl_stubs.cpp b/src/libGLESv2/egl_stubs.cpp
new file mode 100644
index 0000000..3bcf58a
--- /dev/null
+++ b/src/libGLESv2/egl_stubs.cpp
@@ -0,0 +1,723 @@
+//
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// egl_stubs.cpp: Stubs for EGL entry points.
+//
+
+#include "libGLESv2/egl_stubs_autogen.h"
+
+#include "common/version.h"
+#include "libANGLE/Context.h"
+#include "libANGLE/Display.h"
+#include "libANGLE/EGLSync.h"
+#include "libANGLE/Surface.h"
+#include "libANGLE/Thread.h"
+#include "libANGLE/queryutils.h"
+#include "libANGLE/validationEGL.h"
+#include "libGLESv2/global_state.h"
+#include "libGLESv2/proc_table_egl.h"
+
+namespace egl
+{
+namespace
+{
+bool CompareProc(const ProcEntry &a, const char *b)
+{
+    return strcmp(a.first, b) < 0;
+}
+
+void ClipConfigs(const std::vector<const Config *> &filteredConfigs,
+                 EGLConfig *outputConfigs,
+                 EGLint configSize,
+                 EGLint *numConfigs)
+{
+    EGLint resultSize = static_cast<EGLint>(filteredConfigs.size());
+    if (outputConfigs)
+    {
+        resultSize = std::max(std::min(resultSize, configSize), 0);
+        for (EGLint i = 0; i < resultSize; i++)
+        {
+            outputConfigs[i] = const_cast<Config *>(filteredConfigs[i]);
+        }
+    }
+    *numConfigs = resultSize;
+}
+}  // anonymous namespace
+
+EGLBoolean BindAPI(Thread *thread, EGLenum api)
+{
+    thread->setAPI(api);
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLBoolean BindTexImage(Thread *thread, Display *display, Surface *eglSurface, EGLint buffer)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglBindTexImage",
+                         GetDisplayIfValid(display), EGL_FALSE);
+
+    gl::Context *context = thread->getContext();
+    if (context)
+    {
+        gl::TextureType type =
+            egl_gl::EGLTextureTargetToTextureType(eglSurface->getTextureTarget());
+        gl::Texture *textureObject = context->getTextureByType(type);
+        ANGLE_EGL_TRY_RETURN(thread, eglSurface->bindTexImage(context, textureObject, buffer),
+                             "eglBindTexImage", GetSurfaceIfValid(display, eglSurface), EGL_FALSE);
+    }
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLBoolean ChooseConfig(Thread *thread,
+                        Display *display,
+                        const AttributeMap &attribMap,
+                        EGLConfig *configs,
+                        EGLint config_size,
+                        EGLint *num_config)
+{
+    ClipConfigs(display->chooseConfig(attribMap), configs, config_size, num_config);
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLint ClientWaitSync(Thread *thread,
+                      Display *display,
+                      Sync *syncObject,
+                      EGLint flags,
+                      EGLTime timeout)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglClientWaitSync",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    gl::Context *currentContext = thread->getContext();
+    EGLint syncStatus           = EGL_FALSE;
+    ANGLE_EGL_TRY_RETURN(
+        thread, syncObject->clientWait(display, currentContext, flags, timeout, &syncStatus),
+        "eglClientWaitSync", GetSyncIfValid(display, syncObject), EGL_FALSE);
+
+    thread->setSuccess();
+    return syncStatus;
+}
+
+EGLBoolean CopyBuffers(Thread *thread,
+                       Display *display,
+                       Surface *eglSurface,
+                       EGLNativePixmapType target)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglCopyBuffers",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    UNIMPLEMENTED();  // FIXME
+
+    thread->setSuccess();
+    return 0;
+}
+
+EGLContext CreateContext(Thread *thread,
+                         Display *display,
+                         Config *configuration,
+                         gl::Context *sharedGLContext,
+                         const AttributeMap &attributes)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglCreateContext",
+                         GetDisplayIfValid(display), EGL_NO_CONTEXT);
+    gl::Context *context = nullptr;
+    ANGLE_EGL_TRY_RETURN(thread,
+                         display->createContext(configuration, sharedGLContext, thread->getAPI(),
+                                                attributes, &context),
+                         "eglCreateContext", GetDisplayIfValid(display), EGL_NO_CONTEXT);
+
+    thread->setSuccess();
+    return static_cast<EGLContext>(context);
+}
+
+EGLImage CreateImage(Thread *thread,
+                     Display *display,
+                     gl::Context *context,
+                     EGLenum target,
+                     EGLClientBuffer buffer,
+                     const AttributeMap &attributes)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglCreateImage",
+                         GetDisplayIfValid(display), EGL_FALSE);
+
+    Image *image = nullptr;
+    Error error  = display->createImage(context, target, buffer, attributes, &image);
+    if (error.isError())
+    {
+        thread->setError(error, "eglCreateImage", GetDisplayIfValid(display));
+        return EGL_NO_IMAGE;
+    }
+
+    thread->setSuccess();
+    return static_cast<EGLImage>(image);
+}
+
+EGLSurface CreatePbufferFromClientBuffer(Thread *thread,
+                                         Display *display,
+                                         EGLenum buftype,
+                                         EGLClientBuffer buffer,
+                                         Config *configuration,
+                                         const AttributeMap &attributes)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglCreatePbufferFromClientBuffer",
+                         GetDisplayIfValid(display), EGL_NO_SURFACE);
+    Surface *surface = nullptr;
+    ANGLE_EGL_TRY_RETURN(thread,
+                         display->createPbufferFromClientBuffer(configuration, buftype, buffer,
+                                                                attributes, &surface),
+                         "eglCreatePbufferFromClientBuffer", GetDisplayIfValid(display),
+                         EGL_NO_SURFACE);
+
+    return static_cast<EGLSurface>(surface);
+}
+
+EGLSurface CreatePbufferSurface(Thread *thread,
+                                Display *display,
+                                Config *configuration,
+                                const AttributeMap &attributes)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglCreatePbufferSurface",
+                         GetDisplayIfValid(display), EGL_NO_SURFACE);
+    Surface *surface = nullptr;
+    ANGLE_EGL_TRY_RETURN(thread, display->createPbufferSurface(configuration, attributes, &surface),
+                         "eglCreatePbufferSurface", GetDisplayIfValid(display), EGL_NO_SURFACE);
+
+    return static_cast<EGLSurface>(surface);
+}
+
+EGLSurface CreatePixmapSurface(Thread *thread,
+                               Display *display,
+                               Config *configuration,
+                               EGLNativePixmapType pixmap,
+                               const AttributeMap &attributes)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglCreatePixmapSurface",
+                         GetDisplayIfValid(display), EGL_NO_SURFACE);
+    Surface *surface = nullptr;
+    ANGLE_EGL_TRY_RETURN(thread,
+                         display->createPixmapSurface(configuration, pixmap, attributes, &surface),
+                         "eglCreatePixmapSurface", GetDisplayIfValid(display), EGL_NO_SURFACE);
+
+    thread->setSuccess();
+    return static_cast<EGLSurface>(surface);
+}
+
+EGLSurface CreatePlatformPixmapSurface(Thread *thread,
+                                       Display *display,
+                                       Config *configuration,
+                                       void *pixmap,
+                                       const AttributeMap &attributes)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglCreatePlatformPixmapSurface",
+                         GetDisplayIfValid(display), EGL_NO_SURFACE);
+    Surface *surface                 = nullptr;
+    EGLNativePixmapType nativePixmap = reinterpret_cast<EGLNativePixmapType>(pixmap);
+    ANGLE_EGL_TRY_RETURN(
+        thread, display->createPixmapSurface(configuration, nativePixmap, attributes, &surface),
+        "eglCreatePlatformPixmapSurface", GetDisplayIfValid(display), EGL_NO_SURFACE);
+
+    thread->setSuccess();
+    return static_cast<EGLSurface>(surface);
+}
+
+EGLSurface CreatePlatformWindowSurface(Thread *thread,
+                                       Display *display,
+                                       Config *configuration,
+                                       void *win,
+                                       const AttributeMap &attributes)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglCreatePlatformWindowSurface",
+                         GetDisplayIfValid(display), EGL_NO_SURFACE);
+    Surface *surface                 = nullptr;
+    EGLNativeWindowType nativeWindow = reinterpret_cast<EGLNativeWindowType>(win);
+    ANGLE_EGL_TRY_RETURN(
+        thread, display->createWindowSurface(configuration, nativeWindow, attributes, &surface),
+        "eglPlatformCreateWindowSurface", GetDisplayIfValid(display), EGL_NO_SURFACE);
+
+    return static_cast<EGLSurface>(surface);
+}
+
+EGLSync CreateSync(Thread *thread, Display *display, EGLenum type, const AttributeMap &attributes)
+{
+    gl::Context *currentContext = thread->getContext();
+
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglCreateSync",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    Sync *syncObject = nullptr;
+    ANGLE_EGL_TRY_RETURN(thread, display->createSync(currentContext, type, attributes, &syncObject),
+                         "eglCreateSync", GetDisplayIfValid(display), EGL_NO_SYNC);
+
+    thread->setSuccess();
+    return static_cast<EGLSync>(syncObject);
+}
+
+EGLSurface CreateWindowSurface(Thread *thread,
+                               Display *display,
+                               Config *configuration,
+                               EGLNativeWindowType win,
+                               const AttributeMap &attributes)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglCreateWindowSurface",
+                         GetDisplayIfValid(display), EGL_NO_SURFACE);
+
+    Surface *surface = nullptr;
+    ANGLE_EGL_TRY_RETURN(thread,
+                         display->createWindowSurface(configuration, win, attributes, &surface),
+                         "eglCreateWindowSurface", GetDisplayIfValid(display), EGL_NO_SURFACE);
+
+    return static_cast<EGLSurface>(surface);
+}
+
+EGLBoolean DestroyContext(Thread *thread, Display *display, gl::Context *context)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglDestroyContext",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    bool contextWasCurrent = context == thread->getContext();
+
+    ANGLE_EGL_TRY_RETURN(thread, display->destroyContext(thread, context), "eglDestroyContext",
+                         GetContextIfValid(display, context), EGL_FALSE);
+
+    if (contextWasCurrent)
+    {
+        ANGLE_EGL_TRY_RETURN(thread, display->makeCurrent(context, nullptr, nullptr, nullptr),
+                             "eglDestroyContext", GetContextIfValid(display, context), EGL_FALSE);
+        SetContextCurrent(thread, nullptr);
+    }
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLBoolean DestroyImage(Thread *thread, Display *display, Image *img)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglDestroyImage",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    display->destroyImage(img);
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLBoolean DestroySurface(Thread *thread, Display *display, Surface *eglSurface)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglDestroySurface",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    ANGLE_EGL_TRY_RETURN(thread, display->destroySurface(eglSurface), "eglDestroySurface",
+                         GetSurfaceIfValid(display, eglSurface), EGL_FALSE);
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLBoolean DestroySync(Thread *thread, Display *display, Sync *syncObject)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglDestroySync",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    display->destroySync(syncObject);
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLBoolean GetConfigAttrib(Thread *thread,
+                           Display *display,
+                           Config *configuration,
+                           EGLint attribute,
+                           EGLint *value)
+{
+    QueryConfigAttrib(configuration, attribute, value);
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLBoolean GetConfigs(Thread *thread,
+                      Display *display,
+                      EGLConfig *configs,
+                      EGLint config_size,
+                      EGLint *num_config)
+{
+    ClipConfigs(display->getConfigs(AttributeMap()), configs, config_size, num_config);
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLContext GetCurrentContext(Thread *thread)
+{
+    gl::Context *context = thread->getContext();
+
+    thread->setSuccess();
+    return static_cast<EGLContext>(context);
+}
+
+EGLDisplay GetCurrentDisplay(Thread *thread)
+{
+    thread->setSuccess();
+    if (thread->getContext() != nullptr)
+    {
+        return thread->getContext()->getDisplay();
+    }
+    return EGL_NO_DISPLAY;
+}
+
+EGLSurface GetCurrentSurface(Thread *thread, EGLint readdraw)
+{
+    if (readdraw == EGL_READ)
+    {
+        thread->setSuccess();
+        return thread->getCurrentReadSurface();
+    }
+    else if (readdraw == EGL_DRAW)
+    {
+        thread->setSuccess();
+        return thread->getCurrentDrawSurface();
+    }
+    else
+    {
+        thread->setError(EglBadParameter(), "eglGetCurrentSurface", nullptr);
+        return EGL_NO_SURFACE;
+    }
+}
+
+EGLDisplay GetDisplay(Thread *thread, EGLNativeDisplayType display_id)
+{
+    return Display::GetDisplayFromNativeDisplay(display_id, AttributeMap());
+}
+
+EGLint GetError(Thread *thread)
+{
+    EGLint error = thread->getError();
+    thread->setSuccess();
+    return error;
+}
+
+EGLDisplay GetPlatformDisplay(Thread *thread,
+                              EGLenum platform,
+                              void *native_display,
+                              const AttributeMap &attribMap)
+{
+    if (platform == EGL_PLATFORM_ANGLE_ANGLE)
+    {
+        return Display::GetDisplayFromNativeDisplay(
+            gl::bitCast<EGLNativeDisplayType>(native_display), attribMap);
+    }
+    else if (platform == EGL_PLATFORM_DEVICE_EXT)
+    {
+        Device *eglDevice = static_cast<Device *>(native_display);
+        return Display::GetDisplayFromDevice(eglDevice, attribMap);
+    }
+    else
+    {
+        UNREACHABLE();
+        return EGL_NO_DISPLAY;
+    }
+}
+
+__eglMustCastToProperFunctionPointerType GetProcAddress(Thread *thread, const char *procname)
+{
+    const ProcEntry *entry =
+        std::lower_bound(&g_procTable[0], &g_procTable[g_numProcs], procname, CompareProc);
+
+    thread->setSuccess();
+
+    if (entry == &g_procTable[g_numProcs] || strcmp(entry->first, procname) != 0)
+    {
+        return nullptr;
+    }
+
+    return entry->second;
+}
+
+EGLBoolean GetSyncAttrib(Thread *thread,
+                         Display *display,
+                         Sync *syncObject,
+                         EGLint attribute,
+                         EGLAttrib *value)
+{
+    EGLint valueExt;
+    ANGLE_EGL_TRY_RETURN(thread, GetSyncAttrib(display, syncObject, attribute, &valueExt),
+                         "eglGetSyncAttrib", GetSyncIfValid(display, syncObject), EGL_FALSE);
+    *value = valueExt;
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLBoolean Initialize(Thread *thread, Display *display, EGLint *major, EGLint *minor)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->initialize(), "eglInitialize", GetDisplayIfValid(display),
+                         EGL_FALSE);
+
+    if (major)
+        *major = 1;
+    if (minor)
+        *minor = 5;
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLBoolean MakeCurrent(Thread *thread,
+                       Display *display,
+                       Surface *drawSurface,
+                       Surface *readSurface,
+                       gl::Context *context)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglMakeCurrent",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    Surface *previousDraw        = thread->getCurrentDrawSurface();
+    Surface *previousRead        = thread->getCurrentReadSurface();
+    gl::Context *previousContext = thread->getContext();
+
+    // Only call makeCurrent if the context or surfaces have changed.
+    if (previousDraw != drawSurface || previousRead != readSurface || previousContext != context)
+    {
+        ANGLE_EGL_TRY_RETURN(
+            thread, display->makeCurrent(previousContext, drawSurface, readSurface, context),
+            "eglMakeCurrent", GetContextIfValid(display, context), EGL_FALSE);
+
+        SetContextCurrent(thread, context);
+    }
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLenum QueryAPI(Thread *thread)
+{
+    EGLenum API = thread->getAPI();
+
+    thread->setSuccess();
+    return API;
+}
+
+EGLBoolean QueryContext(Thread *thread,
+                        Display *display,
+                        gl::Context *context,
+                        EGLint attribute,
+                        EGLint *value)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglQueryContext",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    QueryContextAttrib(context, attribute, value);
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+const char *QueryString(Thread *thread, Display *display, EGLint name)
+{
+    if (display)
+    {
+        ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglQueryString",
+                             GetDisplayIfValid(display), nullptr);
+    }
+
+    const char *result = nullptr;
+    switch (name)
+    {
+        case EGL_CLIENT_APIS:
+            result = "OpenGL_ES";
+            break;
+        case EGL_EXTENSIONS:
+            if (display == EGL_NO_DISPLAY)
+            {
+                result = Display::GetClientExtensionString().c_str();
+            }
+            else
+            {
+                result = display->getExtensionString().c_str();
+            }
+            break;
+        case EGL_VENDOR:
+            result = display->getVendorString().c_str();
+            break;
+        case EGL_VERSION:
+            result = "1.5 (ANGLE " ANGLE_VERSION_STRING ")";
+            break;
+        default:
+            UNREACHABLE();
+            break;
+    }
+
+    thread->setSuccess();
+    return result;
+}
+
+EGLBoolean QuerySurface(Thread *thread,
+                        Display *display,
+                        Surface *eglSurface,
+                        EGLint attribute,
+                        EGLint *value)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglQuerySurface",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    ANGLE_EGL_TRY_RETURN(thread, QuerySurfaceAttrib(display, eglSurface, attribute, value),
+                         "eglQuerySurface", GetSurfaceIfValid(display, eglSurface), EGL_FALSE);
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLBoolean ReleaseTexImage(Thread *thread, Display *display, Surface *eglSurface, EGLint buffer)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglReleaseTexImage",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    gl::Texture *texture = eglSurface->getBoundTexture();
+
+    if (texture)
+    {
+        ANGLE_EGL_TRY_RETURN(thread, eglSurface->releaseTexImage(thread->getContext(), buffer),
+                             "eglReleaseTexImage", GetSurfaceIfValid(display, eglSurface),
+                             EGL_FALSE);
+    }
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLBoolean ReleaseThread(Thread *thread)
+{
+    Surface *previousDraw        = thread->getCurrentDrawSurface();
+    Surface *previousRead        = thread->getCurrentReadSurface();
+    gl::Context *previousContext = thread->getContext();
+    Display *previousDisplay     = thread->getDisplay();
+
+    if (previousDisplay != EGL_NO_DISPLAY)
+    {
+        ANGLE_EGL_TRY_RETURN(thread, previousDisplay->prepareForCall(), "eglReleaseThread",
+                             GetDisplayIfValid(previousDisplay), EGL_FALSE);
+        // Only call makeCurrent if the context or surfaces have changed.
+        if (previousDraw != EGL_NO_SURFACE || previousRead != EGL_NO_SURFACE ||
+            previousContext != EGL_NO_CONTEXT)
+        {
+            ANGLE_EGL_TRY_RETURN(
+                thread, previousDisplay->makeCurrent(previousContext, nullptr, nullptr, nullptr),
+                "eglReleaseThread", nullptr, EGL_FALSE);
+        }
+        ANGLE_EGL_TRY_RETURN(thread, previousDisplay->releaseThread(), "eglReleaseThread",
+                             GetDisplayIfValid(previousDisplay), EGL_FALSE);
+        SetContextCurrent(thread, nullptr);
+    }
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLBoolean SurfaceAttrib(Thread *thread,
+                         Display *display,
+                         Surface *eglSurface,
+                         EGLint attribute,
+                         EGLint value)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglSurfaceAttrib",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    SetSurfaceAttrib(eglSurface, attribute, value);
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLBoolean SwapBuffers(Thread *thread, Display *display, Surface *eglSurface)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglSwapBuffers",
+                         GetDisplayIfValid(display), EGL_FALSE);
+
+    ANGLE_EGL_TRY_RETURN(thread, eglSurface->swap(thread->getContext()), "eglSwapBuffers",
+                         GetSurfaceIfValid(display, eglSurface), EGL_FALSE);
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLBoolean SwapInterval(Thread *thread, Display *display, EGLint interval)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglSwapInterval",
+                         GetDisplayIfValid(display), EGL_FALSE);
+
+    Surface *drawSurface        = static_cast<Surface *>(thread->getCurrentDrawSurface());
+    const Config *surfaceConfig = drawSurface->getConfig();
+    EGLint clampedInterval      = std::min(std::max(interval, surfaceConfig->minSwapInterval),
+                                      surfaceConfig->maxSwapInterval);
+
+    drawSurface->setSwapInterval(clampedInterval);
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLBoolean Terminate(Thread *thread, Display *display)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglTerminate",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    ANGLE_EGL_TRY_RETURN(thread,
+                         display->makeCurrent(thread->getContext(), nullptr, nullptr, nullptr),
+                         "eglTerminate", GetDisplayIfValid(display), EGL_FALSE);
+    SetContextCurrent(thread, nullptr);
+    ANGLE_EGL_TRY_RETURN(thread, display->terminate(thread), "eglTerminate",
+                         GetDisplayIfValid(display), EGL_FALSE);
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLBoolean WaitClient(Thread *thread)
+{
+    Display *display     = thread->getDisplay();
+    gl::Context *context = thread->getContext();
+
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglWaitClient",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    ANGLE_EGL_TRY_RETURN(thread, display->waitClient(context), "eglWaitClient",
+                         GetContextIfValid(display, context), EGL_FALSE);
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLBoolean WaitGL(Thread *thread)
+{
+    Display *display = thread->getDisplay();
+
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglWaitGL", GetDisplayIfValid(display),
+                         EGL_FALSE);
+
+    // eglWaitGL like calling eglWaitClient with the OpenGL ES API bound. Since we only implement
+    // OpenGL ES we can do the call directly.
+    ANGLE_EGL_TRY_RETURN(thread, display->waitClient(thread->getContext()), "eglWaitGL",
+                         GetDisplayIfValid(display), EGL_FALSE);
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLBoolean WaitNative(Thread *thread, EGLint engine)
+{
+    Display *display = thread->getDisplay();
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglWaitNative",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    ANGLE_EGL_TRY_RETURN(thread, display->waitNative(thread->getContext(), engine), "eglWaitNative",
+                         GetThreadIfValid(thread), EGL_FALSE);
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+
+EGLBoolean WaitSync(Thread *thread, Display *display, Sync *syncObject, EGLint flags)
+{
+    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglWaitSync",
+                         GetDisplayIfValid(display), EGL_FALSE);
+    gl::Context *currentContext = thread->getContext();
+    ANGLE_EGL_TRY_RETURN(thread, syncObject->serverWait(display, currentContext, flags),
+                         "eglWaitSync", GetSyncIfValid(display, syncObject), EGL_FALSE);
+
+    thread->setSuccess();
+    return EGL_TRUE;
+}
+}  // namespace egl
diff --git a/src/libGLESv2/egl_stubs_autogen.h b/src/libGLESv2/egl_stubs_autogen.h
new file mode 100644
index 0000000..6d7d210
--- /dev/null
+++ b/src/libGLESv2/egl_stubs_autogen.h
@@ -0,0 +1,165 @@
+// GENERATED FILE - DO NOT EDIT.
+// Generated by generate_entry_points.py using data from egl.xml.
+//
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// egl_stubs_autogen.h: Stubs for EGL entry points.
+
+#ifndef LIBGLESV2_EGL_STUBS_AUTOGEN_H_
+#define LIBGLESV2_EGL_STUBS_AUTOGEN_H_
+
+#include <EGL/egl.h>
+#include <EGL/eglext.h>
+
+#include "common/PackedEGLEnums_autogen.h"
+
+namespace gl
+{
+class Context;
+}  // namespace gl
+
+namespace egl
+{
+class AttributeMap;
+class Device;
+class Display;
+class Image;
+class Stream;
+class Surface;
+class Sync;
+class Thread;
+struct Config;
+
+EGLBoolean BindAPI(Thread *thread, EGLenum api);
+EGLBoolean BindTexImage(Thread *thread,
+                        egl::Display *dpyPacked,
+                        Surface *surfacePacked,
+                        EGLint buffer);
+EGLBoolean ChooseConfig(Thread *thread,
+                        egl::Display *dpyPacked,
+                        const AttributeMap &attrib_listPacked,
+                        EGLConfig *configs,
+                        EGLint config_size,
+                        EGLint *num_config);
+EGLint ClientWaitSync(Thread *thread,
+                      egl::Display *dpyPacked,
+                      Sync *syncPacked,
+                      EGLint flags,
+                      EGLTime timeout);
+EGLBoolean CopyBuffers(Thread *thread,
+                       egl::Display *dpyPacked,
+                       Surface *surfacePacked,
+                       EGLNativePixmapType target);
+EGLContext CreateContext(Thread *thread,
+                         egl::Display *dpyPacked,
+                         Config *configPacked,
+                         gl::Context *share_contextPacked,
+                         const AttributeMap &attrib_listPacked);
+EGLImage CreateImage(Thread *thread,
+                     egl::Display *dpyPacked,
+                     gl::Context *ctxPacked,
+                     EGLenum target,
+                     EGLClientBuffer buffer,
+                     const AttributeMap &attrib_listPacked);
+EGLSurface CreatePbufferFromClientBuffer(Thread *thread,
+                                         egl::Display *dpyPacked,
+                                         EGLenum buftype,
+                                         EGLClientBuffer buffer,
+                                         Config *configPacked,
+                                         const AttributeMap &attrib_listPacked);
+EGLSurface CreatePbufferSurface(Thread *thread,
+                                egl::Display *dpyPacked,
+                                Config *configPacked,
+                                const AttributeMap &attrib_listPacked);
+EGLSurface CreatePixmapSurface(Thread *thread,
+                               egl::Display *dpyPacked,
+                               Config *configPacked,
+                               EGLNativePixmapType pixmap,
+                               const AttributeMap &attrib_listPacked);
+EGLSurface CreatePlatformPixmapSurface(Thread *thread,
+                                       egl::Display *dpyPacked,
+                                       Config *configPacked,
+                                       void *native_pixmap,
+                                       const AttributeMap &attrib_listPacked);
+EGLSurface CreatePlatformWindowSurface(Thread *thread,
+                                       egl::Display *dpyPacked,
+                                       Config *configPacked,
+                                       void *native_window,
+                                       const AttributeMap &attrib_listPacked);
+EGLSync CreateSync(Thread *thread,
+                   egl::Display *dpyPacked,
+                   EGLenum type,
+                   const AttributeMap &attrib_listPacked);
+EGLSurface CreateWindowSurface(Thread *thread,
+                               egl::Display *dpyPacked,
+                               Config *configPacked,
+                               EGLNativeWindowType win,
+                               const AttributeMap &attrib_listPacked);
+EGLBoolean DestroyContext(Thread *thread, egl::Display *dpyPacked, gl::Context *ctxPacked);
+EGLBoolean DestroyImage(Thread *thread, egl::Display *dpyPacked, Image *imagePacked);
+EGLBoolean DestroySurface(Thread *thread, egl::Display *dpyPacked, Surface *surfacePacked);
+EGLBoolean DestroySync(Thread *thread, egl::Display *dpyPacked, Sync *syncPacked);
+EGLBoolean GetConfigAttrib(Thread *thread,
+                           egl::Display *dpyPacked,
+                           Config *configPacked,
+                           EGLint attribute,
+                           EGLint *value);
+EGLBoolean GetConfigs(Thread *thread,
+                      egl::Display *dpyPacked,
+                      EGLConfig *configs,
+                      EGLint config_size,
+                      EGLint *num_config);
+EGLContext GetCurrentContext(Thread *thread);
+EGLDisplay GetCurrentDisplay(Thread *thread);
+EGLSurface GetCurrentSurface(Thread *thread, EGLint readdraw);
+EGLDisplay GetDisplay(Thread *thread, EGLNativeDisplayType display_id);
+EGLint GetError(Thread *thread);
+EGLDisplay GetPlatformDisplay(Thread *thread,
+                              EGLenum platform,
+                              void *native_display,
+                              const AttributeMap &attrib_listPacked);
+__eglMustCastToProperFunctionPointerType GetProcAddress(Thread *thread, const char *procname);
+EGLBoolean GetSyncAttrib(Thread *thread,
+                         egl::Display *dpyPacked,
+                         Sync *syncPacked,
+                         EGLint attribute,
+                         EGLAttrib *value);
+EGLBoolean Initialize(Thread *thread, egl::Display *dpyPacked, EGLint *major, EGLint *minor);
+EGLBoolean MakeCurrent(Thread *thread,
+                       egl::Display *dpyPacked,
+                       Surface *drawPacked,
+                       Surface *readPacked,
+                       gl::Context *ctxPacked);
+EGLenum QueryAPI(Thread *thread);
+EGLBoolean QueryContext(Thread *thread,
+                        egl::Display *dpyPacked,
+                        gl::Context *ctxPacked,
+                        EGLint attribute,
+                        EGLint *value);
+const char *QueryString(Thread *thread, egl::Display *dpyPacked, EGLint name);
+EGLBoolean QuerySurface(Thread *thread,
+                        egl::Display *dpyPacked,
+                        Surface *surfacePacked,
+                        EGLint attribute,
+                        EGLint *value);
+EGLBoolean ReleaseTexImage(Thread *thread,
+                           egl::Display *dpyPacked,
+                           Surface *surfacePacked,
+                           EGLint buffer);
+EGLBoolean ReleaseThread(Thread *thread);
+EGLBoolean SurfaceAttrib(Thread *thread,
+                         egl::Display *dpyPacked,
+                         Surface *surfacePacked,
+                         EGLint attribute,
+                         EGLint value);
+EGLBoolean SwapBuffers(Thread *thread, egl::Display *dpyPacked, Surface *surfacePacked);
+EGLBoolean SwapInterval(Thread *thread, egl::Display *dpyPacked, EGLint interval);
+EGLBoolean Terminate(Thread *thread, egl::Display *dpyPacked);
+EGLBoolean WaitClient(Thread *thread);
+EGLBoolean WaitGL(Thread *thread);
+EGLBoolean WaitNative(Thread *thread, EGLint engine);
+EGLBoolean WaitSync(Thread *thread, egl::Display *dpyPacked, Sync *syncPacked, EGLint flags);
+}  // namespace egl
+#endif  // LIBGLESV2_EGL_STUBS_AUTOGEN_H_
diff --git a/src/libGLESv2/entry_points_egl.cpp b/src/libGLESv2/entry_points_egl.cpp
deleted file mode 100644
index 755bd61..0000000
--- a/src/libGLESv2/entry_points_egl.cpp
+++ /dev/null
@@ -1,1171 +0,0 @@
-//
-// Copyright 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// entry_points_egl.cpp : Implements the EGL entry points.
-
-#include "libGLESv2/entry_points_egl.h"
-
-#include "common/angle_version.h"
-#include "common/debug.h"
-#include "common/utilities.h"
-#include "libANGLE/Context.h"
-#include "libANGLE/Display.h"
-#include "libANGLE/EGLSync.h"
-#include "libANGLE/Surface.h"
-#include "libANGLE/Texture.h"
-#include "libANGLE/Thread.h"
-#include "libANGLE/entry_points_utils.h"
-#include "libANGLE/queryutils.h"
-#include "libANGLE/validationEGL.h"
-#include "libGLESv2/global_state.h"
-#include "libGLESv2/proc_table_egl.h"
-
-using namespace egl;
-
-namespace
-{
-
-bool CompareProc(const ProcEntry &a, const char *b)
-{
-    return strcmp(a.first, b) < 0;
-}
-
-void ClipConfigs(const std::vector<const Config *> &filteredConfigs,
-                 EGLConfig *output_configs,
-                 EGLint config_size,
-                 EGLint *num_config)
-{
-    EGLint result_size = static_cast<EGLint>(filteredConfigs.size());
-    if (output_configs)
-    {
-        result_size = std::max(std::min(result_size, config_size), 0);
-        for (EGLint i = 0; i < result_size; i++)
-        {
-            output_configs[i] = const_cast<Config *>(filteredConfigs[i]);
-        }
-    }
-    *num_config = result_size;
-}
-}  // anonymous namespace
-
-extern "C" {
-// EGL 1.0
-EGLint EGLAPIENTRY EGL_GetError(void)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    EVENT(nullptr, gl::EntryPoint::Begin, __FUNCTION__, "");
-    Thread *thread = egl::GetCurrentThread();
-
-    EGLint error = thread->getError();
-    thread->setSuccess();
-    return error;
-}
-
-EGLDisplay EGLAPIENTRY EGL_GetDisplay(EGLNativeDisplayType display_id)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLNativeDisplayType display_id = 0x%016" PRIxPTR, (uintptr_t)display_id);
-
-    return egl::Display::GetDisplayFromNativeDisplay(display_id, AttributeMap());
-}
-
-EGLBoolean EGLAPIENTRY EGL_Initialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLint *major = 0x%016" PRIxPTR
-               ", EGLint *minor = 0x%016" PRIxPTR,
-               (uintptr_t)dpy, (uintptr_t)major, (uintptr_t)minor);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    ANGLE_EGL_TRY_RETURN(thread, ValidateInitialize(display), "eglInitialize",
-                         GetDisplayIfValid(display), EGL_FALSE);
-
-    ANGLE_EGL_TRY_RETURN(thread, display->initialize(), "eglInitialize", GetDisplayIfValid(display),
-                         EGL_FALSE);
-
-    if (major)
-        *major = 1;
-    if (minor)
-        *minor = 5;
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-EGLBoolean EGLAPIENTRY EGL_Terminate(EGLDisplay dpy)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR, (uintptr_t)dpy);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    ANGLE_EGL_TRY_RETURN(thread, ValidateTerminate(display), "eglTerminate",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglTerminate",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    ANGLE_EGL_TRY_RETURN(thread,
-                         display->makeCurrent(thread->getContext(), nullptr, nullptr, nullptr),
-                         "eglTerminate", GetDisplayIfValid(display), EGL_FALSE);
-    SetContextCurrent(thread, nullptr);
-    ANGLE_EGL_TRY_RETURN(thread, display->terminate(thread), "eglTerminate",
-                         GetDisplayIfValid(display), EGL_FALSE);
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-const char *EGLAPIENTRY EGL_QueryString(EGLDisplay dpy, EGLint name)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLint name = %d", (uintptr_t)dpy, name);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    if (!(display == EGL_NO_DISPLAY && name == EGL_EXTENSIONS))
-    {
-        ANGLE_EGL_TRY_RETURN(thread, ValidateDisplay(display), "eglQueryString",
-                             GetDisplayIfValid(display), nullptr);
-        ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglQueryString",
-                             GetDisplayIfValid(display), nullptr);
-    }
-
-    const char *result;
-    switch (name)
-    {
-        case EGL_CLIENT_APIS:
-            result = "OpenGL_ES";
-            break;
-        case EGL_EXTENSIONS:
-            if (display == EGL_NO_DISPLAY)
-            {
-                result = egl::Display::GetClientExtensionString().c_str();
-            }
-            else
-            {
-                result = display->getExtensionString().c_str();
-            }
-            break;
-        case EGL_VENDOR:
-            result = display->getVendorString().c_str();
-            break;
-        case EGL_VERSION:
-            result = "1.5 (ANGLE " ANGLE_VERSION_STRING ")";
-            break;
-        default:
-            thread->setError(EglBadParameter(), GetDebug(), "eglQueryString",
-                             GetDisplayIfValid(display));
-            return nullptr;
-    }
-
-    thread->setSuccess();
-    return result;
-}
-
-EGLBoolean EGLAPIENTRY EGL_GetConfigs(EGLDisplay dpy,
-                                      EGLConfig *configs,
-                                      EGLint config_size,
-                                      EGLint *num_config)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLConfig *configs = 0x%016" PRIxPTR
-               ", "
-               "EGLint config_size = %d, EGLint *num_config = 0x%016" PRIxPTR,
-               (uintptr_t)dpy, (uintptr_t)configs, config_size, (uintptr_t)num_config);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-
-    ANGLE_EGL_TRY_RETURN(thread, ValidateGetConfigs(display, config_size, num_config),
-                         "eglGetConfigs", GetDisplayIfValid(display), EGL_FALSE);
-
-    ClipConfigs(display->getConfigs(AttributeMap()), configs, config_size, num_config);
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-EGLBoolean EGLAPIENTRY EGL_ChooseConfig(EGLDisplay dpy,
-                                        const EGLint *attrib_list,
-                                        EGLConfig *configs,
-                                        EGLint config_size,
-                                        EGLint *num_config)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", const EGLint *attrib_list = 0x%016" PRIxPTR
-               ", "
-               "EGLConfig *configs = 0x%016" PRIxPTR
-               ", EGLint config_size = %d, EGLint *num_config = 0x%016" PRIxPTR,
-               (uintptr_t)dpy, (uintptr_t)attrib_list, (uintptr_t)configs, config_size,
-               (uintptr_t)num_config);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display  = static_cast<egl::Display *>(dpy);
-    AttributeMap attribMap = AttributeMap::CreateFromIntArray(attrib_list);
-
-    ANGLE_EGL_TRY_RETURN(thread, ValidateChooseConfig(display, attribMap, config_size, num_config),
-                         "eglChooseConfig", GetDisplayIfValid(display), EGL_FALSE);
-
-    ClipConfigs(display->chooseConfig(attribMap), configs, config_size, num_config);
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-EGLBoolean EGLAPIENTRY EGL_GetConfigAttrib(EGLDisplay dpy,
-                                           EGLConfig config,
-                                           EGLint attribute,
-                                           EGLint *value)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLConfig config = 0x%016" PRIxPTR
-               ", EGLint attribute = %d, EGLint "
-               "*value = 0x%016" PRIxPTR,
-               (uintptr_t)dpy, (uintptr_t)config, attribute, (uintptr_t)value);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    Config *configuration = static_cast<Config *>(config);
-
-    ANGLE_EGL_TRY_RETURN(thread, ValidateGetConfigAttrib(display, configuration, attribute),
-                         "eglGetConfigAttrib", GetDisplayIfValid(display), EGL_FALSE);
-
-    QueryConfigAttrib(configuration, attribute, value);
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-EGLSurface EGLAPIENTRY EGL_CreateWindowSurface(EGLDisplay dpy,
-                                               EGLConfig config,
-                                               EGLNativeWindowType win,
-                                               const EGLint *attrib_list)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLConfig config = 0x%016" PRIxPTR
-               ", EGLNativeWindowType win = 0x%016" PRIxPTR
-               ", "
-               "const EGLint *attrib_list = 0x%016" PRIxPTR,
-               (uintptr_t)dpy, (uintptr_t)config, (uintptr_t)win, (uintptr_t)attrib_list);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display   = static_cast<egl::Display *>(dpy);
-    Config *configuration   = static_cast<Config *>(config);
-    AttributeMap attributes = AttributeMap::CreateFromIntArray(attrib_list);
-
-    ANGLE_EGL_TRY_RETURN(thread,
-                         ValidateCreateWindowSurface(display, configuration, win, attributes),
-                         "eglCreateWindowSurface", GetDisplayIfValid(display), EGL_NO_SURFACE);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglCreateWindowSurface",
-                         GetDisplayIfValid(display), EGL_NO_SURFACE);
-
-    egl::Surface *surface = nullptr;
-    ANGLE_EGL_TRY_RETURN(thread,
-                         display->createWindowSurface(configuration, win, attributes, &surface),
-                         "eglCreateWindowSurface", GetDisplayIfValid(display), EGL_NO_SURFACE);
-
-    return static_cast<EGLSurface>(surface);
-}
-
-EGLSurface EGLAPIENTRY EGL_CreatePbufferSurface(EGLDisplay dpy,
-                                                EGLConfig config,
-                                                const EGLint *attrib_list)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLConfig config = 0x%016" PRIxPTR
-               ", const EGLint *attrib_list = "
-               "0x%016" PRIxPTR,
-               (uintptr_t)dpy, (uintptr_t)config, (uintptr_t)attrib_list);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display   = static_cast<egl::Display *>(dpy);
-    Config *configuration   = static_cast<Config *>(config);
-    AttributeMap attributes = AttributeMap::CreateFromIntArray(attrib_list);
-
-    ANGLE_EGL_TRY_RETURN(thread, ValidateCreatePbufferSurface(display, configuration, attributes),
-                         "eglCreatePbufferSurface", GetDisplayIfValid(display), EGL_NO_SURFACE);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglCreatePbufferSurface",
-                         GetDisplayIfValid(display), EGL_NO_SURFACE);
-    egl::Surface *surface = nullptr;
-    ANGLE_EGL_TRY_RETURN(thread, display->createPbufferSurface(configuration, attributes, &surface),
-                         "eglCreatePbufferSurface", GetDisplayIfValid(display), EGL_NO_SURFACE);
-
-    return static_cast<EGLSurface>(surface);
-}
-
-EGLSurface EGLAPIENTRY EGL_CreatePixmapSurface(EGLDisplay dpy,
-                                               EGLConfig config,
-                                               EGLNativePixmapType pixmap,
-                                               const EGLint *attrib_list)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLConfig config = 0x%016" PRIxPTR
-               ", EGLNativePixmapType pixmap = "
-               "0x%016" PRIxPTR
-               ", "
-               "const EGLint *attrib_list = 0x%016" PRIxPTR,
-               (uintptr_t)dpy, (uintptr_t)config, (uintptr_t)pixmap, (uintptr_t)attrib_list);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display   = static_cast<egl::Display *>(dpy);
-    Config *configuration   = static_cast<Config *>(config);
-    AttributeMap attributes = AttributeMap::CreateFromIntArray(attrib_list);
-
-    ANGLE_EGL_TRY_RETURN(thread,
-                         ValidateCreatePixmapSurface(display, configuration, pixmap, attributes),
-                         "eglCreatePixmapSurface", GetDisplayIfValid(display), EGL_NO_SURFACE);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglCreatePixmapSurface",
-                         GetDisplayIfValid(display), EGL_NO_SURFACE);
-    egl::Surface *surface = nullptr;
-    ANGLE_EGL_TRY_RETURN(thread,
-                         display->createPixmapSurface(configuration, pixmap, attributes, &surface),
-                         "eglCreatePixmapSurface", GetDisplayIfValid(display), EGL_NO_SURFACE);
-
-    thread->setSuccess();
-    return static_cast<EGLSurface>(surface);
-}
-
-EGLBoolean EGLAPIENTRY EGL_DestroySurface(EGLDisplay dpy, EGLSurface surface)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLSurface surface = 0x%016" PRIxPTR,
-               (uintptr_t)dpy, (uintptr_t)surface);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    Surface *eglSurface   = static_cast<Surface *>(surface);
-
-    ANGLE_EGL_TRY_RETURN(thread, ValidateDestroySurface(display, eglSurface, surface),
-                         "eglDestroySurface", GetSurfaceIfValid(display, eglSurface), EGL_FALSE);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglDestroySurface",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    ANGLE_EGL_TRY_RETURN(thread, display->destroySurface(eglSurface), "eglDestroySurface",
-                         GetSurfaceIfValid(display, eglSurface), EGL_FALSE);
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-EGLBoolean EGLAPIENTRY EGL_QuerySurface(EGLDisplay dpy,
-                                        EGLSurface surface,
-                                        EGLint attribute,
-                                        EGLint *value)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLSurface surface = 0x%016" PRIxPTR
-               ", EGLint attribute = %d, EGLint "
-               "*value = 0x%016" PRIxPTR,
-               (uintptr_t)dpy, (uintptr_t)surface, attribute, (uintptr_t)value);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display     = static_cast<egl::Display *>(dpy);
-    const Surface *eglSurface = static_cast<const Surface *>(surface);
-
-    ANGLE_EGL_TRY_RETURN(thread, ValidateQuerySurface(display, eglSurface, attribute, value),
-                         "eglQuerySurface", GetSurfaceIfValid(display, eglSurface), EGL_FALSE);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglQuerySurface",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    ANGLE_EGL_TRY_RETURN(thread, QuerySurfaceAttrib(display, eglSurface, attribute, value),
-                         "eglQuerySurface", GetSurfaceIfValid(display, eglSurface), EGL_FALSE);
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-EGLContext EGLAPIENTRY EGL_CreateContext(EGLDisplay dpy,
-                                         EGLConfig config,
-                                         EGLContext share_context,
-                                         const EGLint *attrib_list)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLConfig config = 0x%016" PRIxPTR
-               ", EGLContext share_context = %d, "
-               "const EGLint *attrib_list = 0x%016" PRIxPTR,
-               (uintptr_t)dpy, (uintptr_t)config, CID(dpy, share_context), (uintptr_t)attrib_list);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display        = static_cast<egl::Display *>(dpy);
-    Config *configuration        = static_cast<Config *>(config);
-    gl::Context *sharedGLContext = static_cast<gl::Context *>(share_context);
-    AttributeMap attributes      = AttributeMap::CreateFromIntArray(attrib_list);
-
-    ANGLE_EGL_TRY_RETURN(thread,
-                         ValidateCreateContext(display, configuration, sharedGLContext, attributes),
-                         "eglCreateContext", GetDisplayIfValid(display), EGL_NO_CONTEXT);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglCreateContext",
-                         GetDisplayIfValid(display), EGL_NO_CONTEXT);
-    gl::Context *context = nullptr;
-    ANGLE_EGL_TRY_RETURN(thread,
-                         display->createContext(configuration, sharedGLContext, thread->getAPI(),
-                                                attributes, &context),
-                         "eglCreateContext", GetDisplayIfValid(display), EGL_NO_CONTEXT);
-
-    thread->setSuccess();
-    return static_cast<EGLContext>(context);
-}
-
-EGLBoolean EGLAPIENTRY EGL_DestroyContext(EGLDisplay dpy, EGLContext ctx)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLContext ctx = %d", (uintptr_t)dpy,
-               CID(dpy, ctx));
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    gl::Context *context  = static_cast<gl::Context *>(ctx);
-
-    ANGLE_EGL_TRY_RETURN(thread, ValidateDestroyContext(display, context, ctx), "eglDestroyContext",
-                         GetContextIfValid(display, context), EGL_FALSE);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglDestroyContext",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    bool contextWasCurrent = context == thread->getContext();
-
-    ANGLE_EGL_TRY_RETURN(thread, display->destroyContext(thread, context), "eglDestroyContext",
-                         GetContextIfValid(display, context), EGL_FALSE);
-
-    if (contextWasCurrent)
-    {
-        ANGLE_EGL_TRY_RETURN(thread, display->makeCurrent(context, nullptr, nullptr, nullptr),
-                             "eglDestroyContext", GetContextIfValid(display, context), EGL_FALSE);
-        SetContextCurrent(thread, nullptr);
-    }
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-EGLBoolean EGLAPIENTRY EGL_MakeCurrent(EGLDisplay dpy,
-                                       EGLSurface draw,
-                                       EGLSurface read,
-                                       EGLContext ctx)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLSurface draw = 0x%016" PRIxPTR
-               ", EGLSurface read = 0x%016" PRIxPTR
-               ", "
-               "EGLContext ctx = %d",
-               (uintptr_t)dpy, (uintptr_t)draw, (uintptr_t)read, CID(dpy, ctx));
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    Surface *drawSurface  = static_cast<Surface *>(draw);
-    Surface *readSurface  = static_cast<Surface *>(read);
-    gl::Context *context  = static_cast<gl::Context *>(ctx);
-
-    ANGLE_EGL_TRY_RETURN(thread, ValidateMakeCurrent(display, drawSurface, readSurface, context),
-                         "eglMakeCurrent", GetContextIfValid(display, context), EGL_FALSE);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglMakeCurrent",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    Surface *previousDraw        = thread->getCurrentDrawSurface();
-    Surface *previousRead        = thread->getCurrentReadSurface();
-    gl::Context *previousContext = thread->getContext();
-
-    // Only call makeCurrent if the context or surfaces have changed.
-    if (previousDraw != drawSurface || previousRead != readSurface || previousContext != context)
-    {
-        ANGLE_EGL_TRY_RETURN(
-            thread, display->makeCurrent(previousContext, drawSurface, readSurface, context),
-            "eglMakeCurrent", GetContextIfValid(display, context), EGL_FALSE);
-
-        SetContextCurrent(thread, context);
-    }
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-EGLSurface EGLAPIENTRY EGL_GetCurrentSurface(EGLint readdraw)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLint readdraw = %d", readdraw);
-    Thread *thread = egl::GetCurrentThread();
-
-    if (readdraw == EGL_READ)
-    {
-        thread->setSuccess();
-        return thread->getCurrentReadSurface();
-    }
-    else if (readdraw == EGL_DRAW)
-    {
-        thread->setSuccess();
-        return thread->getCurrentDrawSurface();
-    }
-    else
-    {
-        thread->setError(EglBadParameter(), GetDebug(), "eglGetCurrentSurface", nullptr);
-        return EGL_NO_SURFACE;
-    }
-}
-
-EGLDisplay EGLAPIENTRY EGL_GetCurrentDisplay(void)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    EVENT(nullptr, gl::EntryPoint::Begin, __FUNCTION__, "");
-    Thread *thread = egl::GetCurrentThread();
-
-    thread->setSuccess();
-    if (thread->getContext() != nullptr)
-    {
-        return thread->getContext()->getDisplay();
-    }
-    return EGL_NO_DISPLAY;
-}
-
-EGLBoolean EGLAPIENTRY EGL_QueryContext(EGLDisplay dpy,
-                                        EGLContext ctx,
-                                        EGLint attribute,
-                                        EGLint *value)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR
-               ", EGLContext ctx = %d"
-               ", EGLint attribute = %d, EGLint *value "
-               "= 0x%016" PRIxPTR,
-               (uintptr_t)dpy, CID(dpy, ctx), attribute, (uintptr_t)value);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    gl::Context *context  = static_cast<gl::Context *>(ctx);
-
-    ANGLE_EGL_TRY_RETURN(thread, ValidateQueryContext(display, context, attribute, value),
-                         "eglQueryContext", GetContextIfValid(display, context), EGL_FALSE);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglQueryContext",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    QueryContextAttrib(context, attribute, value);
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-EGLBoolean EGLAPIENTRY EGL_WaitGL(void)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    EVENT(nullptr, gl::EntryPoint::Begin, __FUNCTION__, "");
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display = thread->getDisplay();
-
-    ANGLE_EGL_TRY_RETURN(thread, ValidateDisplay(display), "eglWaitGL", GetDisplayIfValid(display),
-                         EGL_FALSE);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglWaitGL", GetDisplayIfValid(display),
-                         EGL_FALSE);
-
-    // eglWaitGL like calling eglWaitClient with the OpenGL ES API bound. Since we only implement
-    // OpenGL ES we can do the call directly.
-    ANGLE_EGL_TRY_RETURN(thread, display->waitClient(thread->getContext()), "eglWaitGL",
-                         GetDisplayIfValid(display), EGL_FALSE);
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-EGLBoolean EGLAPIENTRY EGL_WaitNative(EGLint engine)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLint engine = %d", engine);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display = thread->getDisplay();
-
-    ANGLE_EGL_TRY_RETURN(thread, ValidateWaitNative(display, engine), "eglWaitNative",
-                         GetThreadIfValid(thread), EGL_FALSE);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglWaitNative",
-                         GetDisplayIfValid(display), EGL_FALSE);
-
-    ANGLE_EGL_TRY_RETURN(thread, display->waitNative(thread->getContext(), engine), "eglWaitNative",
-                         GetThreadIfValid(thread), EGL_FALSE);
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-EGLBoolean EGLAPIENTRY EGL_SwapBuffers(EGLDisplay dpy, EGLSurface surface)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLSurface surface = 0x%016" PRIxPTR,
-               (uintptr_t)dpy, (uintptr_t)surface);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    Surface *eglSurface   = (Surface *)surface;
-
-    ANGLE_EGL_TRY_RETURN(thread, ValidateSwapBuffers(thread, display, eglSurface), "eglSwapBuffers",
-                         GetSurfaceIfValid(display, eglSurface), EGL_FALSE);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglSwapBuffers",
-                         GetDisplayIfValid(display), EGL_FALSE);
-
-    ANGLE_EGL_TRY_RETURN(thread, eglSurface->swap(thread->getContext()), "eglSwapBuffers",
-                         GetSurfaceIfValid(display, eglSurface), EGL_FALSE);
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-EGLBoolean EGLAPIENTRY EGL_CopyBuffers(EGLDisplay dpy,
-                                       EGLSurface surface,
-                                       EGLNativePixmapType target)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLSurface surface = 0x%016" PRIxPTR
-               ", EGLNativePixmapType target = "
-               "0x%016" PRIxPTR,
-               (uintptr_t)dpy, (uintptr_t)surface, (uintptr_t)target);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    Surface *eglSurface   = static_cast<Surface *>(surface);
-
-    ANGLE_EGL_TRY_RETURN(thread, ValidateCopyBuffers(display, eglSurface), "eglCopyBuffers",
-                         GetSurfaceIfValid(display, eglSurface), EGL_FALSE);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglCopyBuffers",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    UNIMPLEMENTED();  // FIXME
-
-    thread->setSuccess();
-    return 0;
-}
-
-// EGL 1.1
-EGLBoolean EGLAPIENTRY EGL_BindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLSurface surface = 0x%016" PRIxPTR
-               ", EGLint buffer = %d",
-               (uintptr_t)dpy, (uintptr_t)surface, buffer);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display      = static_cast<egl::Display *>(dpy);
-    Surface *eglSurface        = static_cast<Surface *>(surface);
-    gl::Context *context       = thread->getContext();
-    gl::Texture *textureObject = nullptr;
-
-    ANGLE_EGL_TRY_RETURN(
-        thread, ValidateBindTexImage(display, eglSurface, surface, buffer, context, &textureObject),
-        "eglBindTexImage", GetSurfaceIfValid(display, eglSurface), EGL_FALSE);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglBindTexImage",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    if (context)
-    {
-        ANGLE_EGL_TRY_RETURN(thread, eglSurface->bindTexImage(context, textureObject, buffer),
-                             "eglBindTexImage", GetSurfaceIfValid(display, eglSurface), EGL_FALSE);
-    }
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-EGLBoolean EGLAPIENTRY EGL_SurfaceAttrib(EGLDisplay dpy,
-                                         EGLSurface surface,
-                                         EGLint attribute,
-                                         EGLint value)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLSurface surface = 0x%016" PRIxPTR
-               ", EGLint attribute = %d, EGLint "
-               "value = %d",
-               (uintptr_t)dpy, (uintptr_t)surface, attribute, value);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    Surface *eglSurface   = static_cast<Surface *>(surface);
-
-    ANGLE_EGL_TRY_RETURN(thread, ValidateSurfaceAttrib(display, eglSurface, attribute, value),
-                         "eglSurfaceAttrib", GetSurfaceIfValid(display, eglSurface), EGL_FALSE);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglSurfaceAttrib",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    SetSurfaceAttrib(eglSurface, attribute, value);
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-EGLBoolean EGLAPIENTRY EGL_ReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLSurface surface = 0x%016" PRIxPTR
-               ", EGLint buffer = %d",
-               (uintptr_t)dpy, (uintptr_t)surface, buffer);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    Surface *eglSurface   = static_cast<Surface *>(surface);
-
-    ANGLE_EGL_TRY_RETURN(thread, ValidateReleaseTexImage(display, eglSurface, surface, buffer),
-                         "eglReleaseTexImage", GetSurfaceIfValid(display, eglSurface), EGL_FALSE);
-
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglReleaseTexImage",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    gl::Texture *texture = eglSurface->getBoundTexture();
-
-    if (texture)
-    {
-        ANGLE_EGL_TRY_RETURN(thread, eglSurface->releaseTexImage(thread->getContext(), buffer),
-                             "eglReleaseTexImage", GetSurfaceIfValid(display, eglSurface),
-                             EGL_FALSE);
-    }
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-EGLBoolean EGLAPIENTRY EGL_SwapInterval(EGLDisplay dpy, EGLint interval)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLint interval = %d", (uintptr_t)dpy,
-               interval);
-    Thread *thread       = egl::GetCurrentThread();
-    gl::Context *context = thread->getContext();
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    Surface *draw_surface = static_cast<Surface *>(thread->getCurrentDrawSurface());
-
-    ANGLE_EGL_TRY_RETURN(thread, ValidateSwapInterval(display, draw_surface, context),
-                         "eglSwapInterval", GetDisplayIfValid(display), EGL_FALSE);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglSwapInterval",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    const egl::Config *surfaceConfig = draw_surface->getConfig();
-    EGLint clampedInterval           = std::min(std::max(interval, surfaceConfig->minSwapInterval),
-                                      surfaceConfig->maxSwapInterval);
-
-    draw_surface->setSwapInterval(clampedInterval);
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-// EGL 1.2
-EGLBoolean EGLAPIENTRY EGL_BindAPI(EGLenum api)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLenum api = 0x%X", api);
-    Thread *thread = egl::GetCurrentThread();
-
-    ANGLE_EGL_TRY_RETURN(thread, ValidateBindAPI(api), "eglBindAPI", GetThreadIfValid(thread),
-                         EGL_FALSE);
-
-    thread->setAPI(api);
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-EGLenum EGLAPIENTRY EGL_QueryAPI(void)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    EVENT(nullptr, gl::EntryPoint::Begin, __FUNCTION__, "");
-    Thread *thread = egl::GetCurrentThread();
-
-    EGLenum API = thread->getAPI();
-
-    thread->setSuccess();
-    return API;
-}
-
-EGLSurface EGLAPIENTRY EGL_CreatePbufferFromClientBuffer(EGLDisplay dpy,
-                                                         EGLenum buftype,
-                                                         EGLClientBuffer buffer,
-                                                         EGLConfig config,
-                                                         const EGLint *attrib_list)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR
-               ", EGLenum buftype = 0x%X, EGLClientBuffer buffer = 0x%016" PRIxPTR
-               ", "
-               "EGLConfig config = 0x%016" PRIxPTR ", const EGLint *attrib_list = 0x%016" PRIxPTR,
-               (uintptr_t)dpy, buftype, (uintptr_t)buffer, (uintptr_t)config,
-               (uintptr_t)attrib_list);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display   = static_cast<egl::Display *>(dpy);
-    Config *configuration   = static_cast<Config *>(config);
-    AttributeMap attributes = AttributeMap::CreateFromIntArray(attrib_list);
-
-    ANGLE_EGL_TRY_RETURN(
-        thread,
-        ValidateCreatePbufferFromClientBuffer(display, buftype, buffer, configuration, attributes),
-        "eglCreatePbufferFromClientBuffer", GetDisplayIfValid(display), EGL_NO_SURFACE);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglCreatePbufferFromClientBuffer",
-                         GetDisplayIfValid(display), EGL_NO_SURFACE);
-    egl::Surface *surface = nullptr;
-    ANGLE_EGL_TRY_RETURN(thread,
-                         display->createPbufferFromClientBuffer(configuration, buftype, buffer,
-                                                                attributes, &surface),
-                         "eglCreatePbufferFromClientBuffer", GetDisplayIfValid(display),
-                         EGL_NO_SURFACE);
-
-    return static_cast<EGLSurface>(surface);
-}
-
-EGLBoolean EGLAPIENTRY EGL_ReleaseThread(void)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    EVENT(nullptr, gl::EntryPoint::Begin, __FUNCTION__, "");
-    Thread *thread = egl::GetCurrentThread();
-
-    Surface *previousDraw         = thread->getCurrentDrawSurface();
-    Surface *previousRead         = thread->getCurrentReadSurface();
-    gl::Context *previousContext  = thread->getContext();
-    egl::Display *previousDisplay = thread->getDisplay();
-
-    if (previousDisplay != EGL_NO_DISPLAY)
-    {
-        ANGLE_EGL_TRY_RETURN(thread, previousDisplay->prepareForCall(), "eglReleaseThread",
-                             GetDisplayIfValid(previousDisplay), EGL_FALSE);
-        // Only call makeCurrent if the context or surfaces have changed.
-        if (previousDraw != EGL_NO_SURFACE || previousRead != EGL_NO_SURFACE ||
-            previousContext != EGL_NO_CONTEXT)
-        {
-            ANGLE_EGL_TRY_RETURN(
-                thread, previousDisplay->makeCurrent(previousContext, nullptr, nullptr, nullptr),
-                "eglReleaseThread", nullptr, EGL_FALSE);
-        }
-        ANGLE_EGL_TRY_RETURN(thread, previousDisplay->releaseThread(), "eglReleaseThread",
-                             GetDisplayIfValid(previousDisplay), EGL_FALSE);
-        SetContextCurrent(thread, nullptr);
-    }
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-EGLBoolean EGLAPIENTRY EGL_WaitClient(void)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    EVENT(nullptr, gl::EntryPoint::Begin, __FUNCTION__, "");
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display = thread->getDisplay();
-    gl::Context *context  = thread->getContext();
-
-    ANGLE_EGL_TRY_RETURN(thread, ValidateDisplay(display), "eglWaitClient",
-                         GetContextIfValid(display, context), EGL_FALSE);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglWaitClient",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    ANGLE_EGL_TRY_RETURN(thread, display->waitClient(context), "eglWaitClient",
-                         GetContextIfValid(display, context), EGL_FALSE);
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-// EGL 1.4
-EGLContext EGLAPIENTRY EGL_GetCurrentContext(void)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    EVENT(nullptr, gl::EntryPoint::Begin, __FUNCTION__, "");
-    Thread *thread = egl::GetCurrentThread();
-
-    gl::Context *context = thread->getContext();
-
-    thread->setSuccess();
-    return static_cast<EGLContext>(context);
-}
-
-// EGL 1.5
-EGLSync EGLAPIENTRY EGL_CreateSync(EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR
-               ", EGLenum type = 0x%X, const EGLint* attrib_list = 0x%016" PRIxPTR,
-               (uintptr_t)dpy, type, (uintptr_t)attrib_list);
-
-    Thread *thread          = egl::GetCurrentThread();
-    egl::Display *display   = static_cast<egl::Display *>(dpy);
-    AttributeMap attributes = AttributeMap::CreateFromAttribArray(attrib_list);
-
-    gl::Context *currentContext  = thread->getContext();
-    egl::Display *currentDisplay = currentContext ? currentContext->getDisplay() : nullptr;
-
-    ANGLE_EGL_TRY_RETURN(
-        thread, ValidateCreateSync(display, type, attributes, currentDisplay, currentContext),
-        "eglCreateSync", GetDisplayIfValid(display), EGL_NO_SYNC);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglCreateSync",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    egl::Sync *syncObject = nullptr;
-    ANGLE_EGL_TRY_RETURN(thread, display->createSync(currentContext, type, attributes, &syncObject),
-                         "eglCreateSync", GetDisplayIfValid(display), EGL_NO_SYNC);
-
-    thread->setSuccess();
-    return static_cast<EGLSync>(syncObject);
-}
-
-EGLBoolean EGLAPIENTRY EGL_DestroySync(EGLDisplay dpy, EGLSync sync)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLSync sync = 0x%016" PRIxPTR, (uintptr_t)dpy,
-               (uintptr_t)sync);
-
-    Thread *thread        = egl::GetCurrentThread();
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    egl::Sync *syncObject = static_cast<Sync *>(sync);
-
-    ANGLE_EGL_TRY_RETURN(thread, ValidateDestroySync(display, syncObject), "eglDestroySync",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglDestroySync",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    display->destroySync(syncObject);
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-EGLint EGLAPIENTRY EGL_ClientWaitSync(EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLSync sync = 0x%016" PRIxPTR
-               ", EGLint flags = 0x%X, EGLTime timeout = "
-               "%llu",
-               (uintptr_t)dpy, (uintptr_t)sync, flags, static_cast<unsigned long long>(timeout));
-
-    Thread *thread        = egl::GetCurrentThread();
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    egl::Sync *syncObject = static_cast<Sync *>(sync);
-
-    ANGLE_EGL_TRY_RETURN(thread, ValidateClientWaitSync(display, syncObject, flags, timeout),
-                         "eglClientWaitSync", GetSyncIfValid(display, syncObject), EGL_FALSE);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglClientWaitSync",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    gl::Context *currentContext = thread->getContext();
-    EGLint syncStatus           = EGL_FALSE;
-    ANGLE_EGL_TRY_RETURN(
-        thread, syncObject->clientWait(display, currentContext, flags, timeout, &syncStatus),
-        "eglClientWaitSync", GetSyncIfValid(display, syncObject), EGL_FALSE);
-
-    thread->setSuccess();
-    return syncStatus;
-}
-
-EGLBoolean EGLAPIENTRY EGL_GetSyncAttrib(EGLDisplay dpy,
-                                         EGLSync sync,
-                                         EGLint attribute,
-                                         EGLAttrib *value)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLSync sync = 0x%016" PRIxPTR
-               ", EGLint attribute = 0x%X, EGLAttrib "
-               "*value = 0x%016" PRIxPTR,
-               (uintptr_t)dpy, (uintptr_t)sync, attribute, (uintptr_t)value);
-
-    Thread *thread        = egl::GetCurrentThread();
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    egl::Sync *syncObject = static_cast<Sync *>(sync);
-
-    ANGLE_EGL_TRY_RETURN(thread, ValidateGetSyncAttrib(display, syncObject, attribute, value),
-                         "eglGetSyncAttrib", GetSyncIfValid(display, syncObject), EGL_FALSE);
-
-    EGLint valueExt;
-    ANGLE_EGL_TRY_RETURN(thread, GetSyncAttrib(display, syncObject, attribute, &valueExt),
-                         "eglGetSyncAttrib", GetSyncIfValid(display, syncObject), EGL_FALSE);
-    *value = valueExt;
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-EGLImage EGLAPIENTRY EGL_CreateImage(EGLDisplay dpy,
-                                     EGLContext ctx,
-                                     EGLenum target,
-                                     EGLClientBuffer buffer,
-                                     const EGLAttrib *attrib_list)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR
-               ", EGLContext ctx = %d"
-               ", EGLenum target = 0x%X, "
-               "EGLClientBuffer buffer = 0x%016" PRIxPTR
-               ", const EGLAttrib *attrib_list = 0x%016" PRIxPTR,
-               (uintptr_t)dpy, CID(dpy, ctx), target, (uintptr_t)buffer, (uintptr_t)attrib_list);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display   = static_cast<egl::Display *>(dpy);
-    gl::Context *context    = static_cast<gl::Context *>(ctx);
-    AttributeMap attributes = AttributeMap::CreateFromIntArray((const EGLint *)attrib_list);
-
-    Error error = ValidateCreateImage(display, context, target, buffer, attributes);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglCreateImage", GetDisplayIfValid(display));
-        return EGL_NO_IMAGE;
-    }
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglCreateImage",
-                         GetDisplayIfValid(display), EGL_FALSE);
-
-    Image *image = nullptr;
-    error        = display->createImage(context, target, buffer, attributes, &image);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglCreateImage", GetDisplayIfValid(display));
-        return EGL_NO_IMAGE;
-    }
-
-    thread->setSuccess();
-    return static_cast<EGLImage>(image);
-}
-
-EGLBoolean EGLAPIENTRY EGL_DestroyImage(EGLDisplay dpy, EGLImage image)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLImage image = 0x%016" PRIxPTR,
-               (uintptr_t)dpy, (uintptr_t)image);
-    Thread *thread        = egl::GetCurrentThread();
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    Image *img            = static_cast<Image *>(image);
-
-    Error error = ValidateDestroyImage(display, img);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglDestroyImage", GetImageIfValid(display, img));
-        return EGL_FALSE;
-    }
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglDestroyImage",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    display->destroyImage(img);
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-EGLDisplay EGLAPIENTRY EGL_GetPlatformDisplay(EGLenum platform,
-                                              void *native_display,
-                                              const EGLAttrib *attrib_list)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLenum platform = %d, void* native_display = 0x%016" PRIxPTR
-               ", const EGLint* attrib_list = "
-               "0x%016" PRIxPTR,
-               platform, (uintptr_t)native_display, (uintptr_t)attrib_list);
-    Thread *thread = egl::GetCurrentThread();
-
-    ANGLE_EGL_TRY_RETURN(thread, ValidateGetPlatformDisplay(platform, native_display, attrib_list),
-                         "eglGetPlatformDisplay", GetThreadIfValid(thread), EGL_NO_DISPLAY);
-
-    const auto &attribMap = AttributeMap::CreateFromAttribArray(attrib_list);
-    if (platform == EGL_PLATFORM_ANGLE_ANGLE)
-    {
-        return egl::Display::GetDisplayFromNativeDisplay(
-            gl::bitCast<EGLNativeDisplayType>(native_display), attribMap);
-    }
-    else if (platform == EGL_PLATFORM_DEVICE_EXT)
-    {
-        Device *eglDevice = static_cast<Device *>(native_display);
-        return egl::Display::GetDisplayFromDevice(eglDevice, attribMap);
-    }
-    else
-    {
-        UNREACHABLE();
-        return EGL_NO_DISPLAY;
-    }
-}
-
-EGLSurface EGLAPIENTRY EGL_CreatePlatformWindowSurface(EGLDisplay dpy,
-                                                       EGLConfig config,
-                                                       void *native_window,
-                                                       const EGLAttrib *attrib_list)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLConfig config = 0x%016" PRIxPTR
-               ", void* native_window = 0x%016" PRIxPTR
-               ", "
-               "const EGLint* attrib_list = 0x%016" PRIxPTR,
-               (uintptr_t)dpy, (uintptr_t)config, (uintptr_t)native_window, (uintptr_t)attrib_list);
-
-    Thread *thread        = egl::GetCurrentThread();
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-
-    Config *configuration = static_cast<Config *>(config);
-    // Use reinterpret_cast since native_window could be a pointer or an actual value.
-    EGLNativeWindowType win = reinterpret_cast<EGLNativeWindowType>(native_window);
-    AttributeMap attributes = AttributeMap::CreateFromAttribArray(attrib_list);
-
-    ANGLE_EGL_TRY_RETURN(
-        thread, ValidateCreateWindowSurface(display, configuration, win, attributes),
-        "eglPlatformCreateWindowSurface", GetDisplayIfValid(display), EGL_NO_SURFACE);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglCreateWindowSurface",
-                         GetDisplayIfValid(display), EGL_NO_SURFACE);
-    egl::Surface *surface = nullptr;
-    ANGLE_EGL_TRY_RETURN(
-        thread, display->createWindowSurface(configuration, win, attributes, &surface),
-        "eglPlatformCreateWindowSurface", GetDisplayIfValid(display), EGL_NO_SURFACE);
-
-    return static_cast<EGLSurface>(surface);
-}
-
-EGLSurface EGLAPIENTRY EGL_CreatePlatformPixmapSurface(EGLDisplay dpy,
-                                                       EGLConfig config,
-                                                       void *native_pixmap,
-                                                       const EGLAttrib *attrib_list)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLConfig config = 0x%016" PRIxPTR
-               ", void* native_pixmap = 0x%016" PRIxPTR
-               ", "
-               "const EGLint* attrib_list = 0x%016" PRIxPTR,
-               (uintptr_t)dpy, (uintptr_t)config, (uintptr_t)native_pixmap, (uintptr_t)attrib_list);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    Config *configuration = static_cast<Config *>(config);
-    // Use reinterpret_cast since native_window could be a pointer or an actual value.
-    EGLNativePixmapType pixmap = reinterpret_cast<EGLNativePixmapType>(native_pixmap);
-    AttributeMap attributes    = AttributeMap::CreateFromAttribArray(attrib_list);
-
-    ANGLE_EGL_TRY_RETURN(
-        thread, ValidateCreatePixmapSurface(display, configuration, pixmap, attributes),
-        "eglCreatePlatformPixmapSurface", GetDisplayIfValid(display), EGL_NO_SURFACE);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglCreatePlatformPixmapSurface",
-                         GetDisplayIfValid(display), EGL_NO_SURFACE);
-    egl::Surface *surface = nullptr;
-    ANGLE_EGL_TRY_RETURN(
-        thread, display->createPixmapSurface(configuration, pixmap, attributes, &surface),
-        "eglCreatePlatformPixmapSurface", GetDisplayIfValid(display), EGL_NO_SURFACE);
-
-    thread->setSuccess();
-    return static_cast<EGLSurface>(surface);
-}
-
-EGLBoolean EGLAPIENTRY EGL_WaitSync(EGLDisplay dpy, EGLSync sync, EGLint flags)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy =0x%016" PRIxPTR "p, EGLSync sync = 0x%016" PRIxPTR
-               ", EGLint flags = 0x%X",
-               (uintptr_t)dpy, (uintptr_t)sync, flags);
-
-    Thread *thread        = egl::GetCurrentThread();
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    gl::Context *context  = thread->getContext();
-    egl::Sync *syncObject = static_cast<Sync *>(sync);
-
-    ANGLE_EGL_TRY_RETURN(thread, ValidateWaitSync(display, context, syncObject, flags),
-                         "eglWaitSync", GetSyncIfValid(display, syncObject), EGL_FALSE);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglWaitSync",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    gl::Context *currentContext = thread->getContext();
-    ANGLE_EGL_TRY_RETURN(thread, syncObject->serverWait(display, currentContext, flags),
-                         "eglWaitSync", GetSyncIfValid(display, syncObject), EGL_FALSE);
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-__eglMustCastToProperFunctionPointerType EGLAPIENTRY EGL_GetProcAddress(const char *procname)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("const char *procname = \"%s\"", procname);
-    Thread *thread = egl::GetCurrentThread();
-
-    const ProcEntry *entry =
-        std::lower_bound(&g_procTable[0], &g_procTable[g_numProcs], procname, CompareProc);
-
-    thread->setSuccess();
-
-    if (entry == &g_procTable[g_numProcs] || strcmp(entry->first, procname) != 0)
-    {
-        return nullptr;
-    }
-
-    return entry->second;
-}
-}  // extern "C"
diff --git a/src/libGLESv2/entry_points_egl_autogen.cpp b/src/libGLESv2/entry_points_egl_autogen.cpp
new file mode 100644
index 0000000..7671cc7
--- /dev/null
+++ b/src/libGLESv2/entry_points_egl_autogen.cpp
@@ -0,0 +1,811 @@
+// GENERATED FILE - DO NOT EDIT.
+// Generated by generate_entry_points.py using data from egl.xml.
+//
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// entry_points_egl_autogen.cpp:
+//   Defines the EGL entry points.
+
+#include "libGLESv2/entry_points_egl_autogen.h"
+
+#include "libANGLE/entry_points_utils.h"
+#include "libANGLE/validationEGL_autogen.h"
+#include "libGLESv2/egl_stubs_autogen.h"
+#include "libGLESv2/global_state.h"
+
+using namespace egl;
+
+extern "C" {
+
+// EGL 1.0
+EGLBoolean EGLAPIENTRY EGL_ChooseConfig(EGLDisplay dpy,
+                                        const EGLint *attrib_list,
+                                        EGLConfig *configs,
+                                        EGLint config_size,
+                                        EGLint *num_config)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(ChooseConfig,
+              "dpy = 0x%016" PRIxPTR ", attrib_list = 0x%016" PRIxPTR ", configs = 0x%016" PRIxPTR
+              ", config_size = %d, num_config = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, (uintptr_t)attrib_list, (uintptr_t)configs, config_size,
+              (uintptr_t)num_config);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked               = PackParam<egl::Display *>(dpy);
+    const AttributeMap &attrib_listPacked = PackParam<const AttributeMap &>(attrib_list);
+
+    ANGLE_EGL_VALIDATE(thread, ChooseConfig, GetDisplayIfValid(dpyPacked), EGLBoolean, dpyPacked,
+                       attrib_listPacked, configs, config_size, num_config);
+
+    return ChooseConfig(thread, dpyPacked, attrib_listPacked, configs, config_size, num_config);
+}
+
+EGLBoolean EGLAPIENTRY EGL_CopyBuffers(EGLDisplay dpy,
+                                       EGLSurface surface,
+                                       EGLNativePixmapType target)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(CopyBuffers,
+              "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR ", target = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, (uintptr_t)surface, (uintptr_t)target);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    Surface *surfacePacked  = PackParam<Surface *>(surface);
+
+    ANGLE_EGL_VALIDATE(thread, CopyBuffers, GetDisplayIfValid(dpyPacked), EGLBoolean, dpyPacked,
+                       surfacePacked, target);
+
+    return CopyBuffers(thread, dpyPacked, surfacePacked, target);
+}
+
+EGLContext EGLAPIENTRY EGL_CreateContext(EGLDisplay dpy,
+                                         EGLConfig config,
+                                         EGLContext share_context,
+                                         const EGLint *attrib_list)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(CreateContext,
+              "dpy = 0x%016" PRIxPTR ", config = 0x%016" PRIxPTR ", share_context = 0x%016" PRIxPTR
+              ", attrib_list = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, (uintptr_t)config, (uintptr_t)share_context, (uintptr_t)attrib_list);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked               = PackParam<egl::Display *>(dpy);
+    Config *configPacked                  = PackParam<Config *>(config);
+    gl::Context *share_contextPacked      = PackParam<gl::Context *>(share_context);
+    const AttributeMap &attrib_listPacked = PackParam<const AttributeMap &>(attrib_list);
+
+    ANGLE_EGL_VALIDATE(thread, CreateContext, GetDisplayIfValid(dpyPacked), EGLContext, dpyPacked,
+                       configPacked, share_contextPacked, attrib_listPacked);
+
+    return CreateContext(thread, dpyPacked, configPacked, share_contextPacked, attrib_listPacked);
+}
+
+EGLSurface EGLAPIENTRY EGL_CreatePbufferSurface(EGLDisplay dpy,
+                                                EGLConfig config,
+                                                const EGLint *attrib_list)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(CreatePbufferSurface,
+              "dpy = 0x%016" PRIxPTR ", config = 0x%016" PRIxPTR ", attrib_list = 0x%016" PRIxPTR
+              "",
+              (uintptr_t)dpy, (uintptr_t)config, (uintptr_t)attrib_list);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked               = PackParam<egl::Display *>(dpy);
+    Config *configPacked                  = PackParam<Config *>(config);
+    const AttributeMap &attrib_listPacked = PackParam<const AttributeMap &>(attrib_list);
+
+    ANGLE_EGL_VALIDATE(thread, CreatePbufferSurface, GetDisplayIfValid(dpyPacked), EGLSurface,
+                       dpyPacked, configPacked, attrib_listPacked);
+
+    return CreatePbufferSurface(thread, dpyPacked, configPacked, attrib_listPacked);
+}
+
+EGLSurface EGLAPIENTRY EGL_CreatePixmapSurface(EGLDisplay dpy,
+                                               EGLConfig config,
+                                               EGLNativePixmapType pixmap,
+                                               const EGLint *attrib_list)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(CreatePixmapSurface,
+              "dpy = 0x%016" PRIxPTR ", config = 0x%016" PRIxPTR ", pixmap = 0x%016" PRIxPTR
+              ", attrib_list = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, (uintptr_t)config, (uintptr_t)pixmap, (uintptr_t)attrib_list);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked               = PackParam<egl::Display *>(dpy);
+    Config *configPacked                  = PackParam<Config *>(config);
+    const AttributeMap &attrib_listPacked = PackParam<const AttributeMap &>(attrib_list);
+
+    ANGLE_EGL_VALIDATE(thread, CreatePixmapSurface, GetDisplayIfValid(dpyPacked), EGLSurface,
+                       dpyPacked, configPacked, pixmap, attrib_listPacked);
+
+    return CreatePixmapSurface(thread, dpyPacked, configPacked, pixmap, attrib_listPacked);
+}
+
+EGLSurface EGLAPIENTRY EGL_CreateWindowSurface(EGLDisplay dpy,
+                                               EGLConfig config,
+                                               EGLNativeWindowType win,
+                                               const EGLint *attrib_list)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(CreateWindowSurface,
+              "dpy = 0x%016" PRIxPTR ", config = 0x%016" PRIxPTR ", win = 0x%016" PRIxPTR
+              ", attrib_list = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, (uintptr_t)config, (uintptr_t)win, (uintptr_t)attrib_list);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked               = PackParam<egl::Display *>(dpy);
+    Config *configPacked                  = PackParam<Config *>(config);
+    const AttributeMap &attrib_listPacked = PackParam<const AttributeMap &>(attrib_list);
+
+    ANGLE_EGL_VALIDATE(thread, CreateWindowSurface, GetDisplayIfValid(dpyPacked), EGLSurface,
+                       dpyPacked, configPacked, win, attrib_listPacked);
+
+    return CreateWindowSurface(thread, dpyPacked, configPacked, win, attrib_listPacked);
+}
+
+EGLBoolean EGLAPIENTRY EGL_DestroyContext(EGLDisplay dpy, EGLContext ctx)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(DestroyContext, "dpy = 0x%016" PRIxPTR ", ctx = 0x%016" PRIxPTR "", (uintptr_t)dpy,
+              (uintptr_t)ctx);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    gl::Context *ctxPacked  = PackParam<gl::Context *>(ctx);
+
+    ANGLE_EGL_VALIDATE(thread, DestroyContext, GetDisplayIfValid(dpyPacked), EGLBoolean, dpyPacked,
+                       ctxPacked);
+
+    return DestroyContext(thread, dpyPacked, ctxPacked);
+}
+
+EGLBoolean EGLAPIENTRY EGL_DestroySurface(EGLDisplay dpy, EGLSurface surface)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(DestroySurface, "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, (uintptr_t)surface);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    Surface *surfacePacked  = PackParam<Surface *>(surface);
+
+    ANGLE_EGL_VALIDATE(thread, DestroySurface, GetDisplayIfValid(dpyPacked), EGLBoolean, dpyPacked,
+                       surfacePacked);
+
+    return DestroySurface(thread, dpyPacked, surfacePacked);
+}
+
+EGLBoolean EGLAPIENTRY EGL_GetConfigAttrib(EGLDisplay dpy,
+                                           EGLConfig config,
+                                           EGLint attribute,
+                                           EGLint *value)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(GetConfigAttrib,
+              "dpy = 0x%016" PRIxPTR ", config = 0x%016" PRIxPTR
+              ", attribute = %d, value = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, (uintptr_t)config, attribute, (uintptr_t)value);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    Config *configPacked    = PackParam<Config *>(config);
+
+    ANGLE_EGL_VALIDATE(thread, GetConfigAttrib, GetDisplayIfValid(dpyPacked), EGLBoolean, dpyPacked,
+                       configPacked, attribute, value);
+
+    return GetConfigAttrib(thread, dpyPacked, configPacked, attribute, value);
+}
+
+EGLBoolean EGLAPIENTRY EGL_GetConfigs(EGLDisplay dpy,
+                                      EGLConfig *configs,
+                                      EGLint config_size,
+                                      EGLint *num_config)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(GetConfigs,
+              "dpy = 0x%016" PRIxPTR ", configs = 0x%016" PRIxPTR
+              ", config_size = %d, num_config = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, (uintptr_t)configs, config_size, (uintptr_t)num_config);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+
+    ANGLE_EGL_VALIDATE(thread, GetConfigs, GetDisplayIfValid(dpyPacked), EGLBoolean, dpyPacked,
+                       configs, config_size, num_config);
+
+    return GetConfigs(thread, dpyPacked, configs, config_size, num_config);
+}
+
+EGLDisplay EGLAPIENTRY EGL_GetCurrentDisplay()
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(GetCurrentDisplay, "");
+
+    Thread *thread = egl::GetCurrentThread();
+
+    ANGLE_EGL_VALIDATE(thread, GetCurrentDisplay, nullptr, EGLDisplay);
+
+    return GetCurrentDisplay(thread);
+}
+
+EGLSurface EGLAPIENTRY EGL_GetCurrentSurface(EGLint readdraw)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(GetCurrentSurface, "readdraw = %d", readdraw);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    ANGLE_EGL_VALIDATE(thread, GetCurrentSurface, nullptr, EGLSurface, readdraw);
+
+    return GetCurrentSurface(thread, readdraw);
+}
+
+EGLDisplay EGLAPIENTRY EGL_GetDisplay(EGLNativeDisplayType display_id)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(GetDisplay, "display_id = 0x%016" PRIxPTR "", (uintptr_t)display_id);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    ANGLE_EGL_VALIDATE(thread, GetDisplay, nullptr, EGLDisplay, display_id);
+
+    return GetDisplay(thread, display_id);
+}
+
+EGLint EGLAPIENTRY EGL_GetError()
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(GetError, "");
+
+    Thread *thread = egl::GetCurrentThread();
+
+    ANGLE_EGL_VALIDATE(thread, GetError, nullptr, EGLint);
+
+    return GetError(thread);
+}
+
+__eglMustCastToProperFunctionPointerType EGLAPIENTRY EGL_GetProcAddress(const char *procname)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(GetProcAddress, "procname = 0x%016" PRIxPTR "", (uintptr_t)procname);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    ANGLE_EGL_VALIDATE(thread, GetProcAddress, nullptr, __eglMustCastToProperFunctionPointerType,
+                       procname);
+
+    return GetProcAddress(thread, procname);
+}
+
+EGLBoolean EGLAPIENTRY EGL_Initialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(Initialize,
+              "dpy = 0x%016" PRIxPTR ", major = 0x%016" PRIxPTR ", minor = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, (uintptr_t)major, (uintptr_t)minor);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+
+    ANGLE_EGL_VALIDATE(thread, Initialize, GetDisplayIfValid(dpyPacked), EGLBoolean, dpyPacked,
+                       major, minor);
+
+    return Initialize(thread, dpyPacked, major, minor);
+}
+
+EGLBoolean EGLAPIENTRY EGL_MakeCurrent(EGLDisplay dpy,
+                                       EGLSurface draw,
+                                       EGLSurface read,
+                                       EGLContext ctx)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(MakeCurrent,
+              "dpy = 0x%016" PRIxPTR ", draw = 0x%016" PRIxPTR ", read = 0x%016" PRIxPTR
+              ", ctx = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, (uintptr_t)draw, (uintptr_t)read, (uintptr_t)ctx);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    Surface *drawPacked     = PackParam<Surface *>(draw);
+    Surface *readPacked     = PackParam<Surface *>(read);
+    gl::Context *ctxPacked  = PackParam<gl::Context *>(ctx);
+
+    ANGLE_EGL_VALIDATE(thread, MakeCurrent, GetDisplayIfValid(dpyPacked), EGLBoolean, dpyPacked,
+                       drawPacked, readPacked, ctxPacked);
+
+    return MakeCurrent(thread, dpyPacked, drawPacked, readPacked, ctxPacked);
+}
+
+EGLBoolean EGLAPIENTRY EGL_QueryContext(EGLDisplay dpy,
+                                        EGLContext ctx,
+                                        EGLint attribute,
+                                        EGLint *value)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(QueryContext,
+              "dpy = 0x%016" PRIxPTR ", ctx = 0x%016" PRIxPTR
+              ", attribute = %d, value = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, (uintptr_t)ctx, attribute, (uintptr_t)value);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    gl::Context *ctxPacked  = PackParam<gl::Context *>(ctx);
+
+    ANGLE_EGL_VALIDATE(thread, QueryContext, GetDisplayIfValid(dpyPacked), EGLBoolean, dpyPacked,
+                       ctxPacked, attribute, value);
+
+    return QueryContext(thread, dpyPacked, ctxPacked, attribute, value);
+}
+
+const char *EGLAPIENTRY EGL_QueryString(EGLDisplay dpy, EGLint name)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(QueryString, "dpy = 0x%016" PRIxPTR ", name = %d", (uintptr_t)dpy, name);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+
+    ANGLE_EGL_VALIDATE(thread, QueryString, GetDisplayIfValid(dpyPacked), const char *, dpyPacked,
+                       name);
+
+    return QueryString(thread, dpyPacked, name);
+}
+
+EGLBoolean EGLAPIENTRY EGL_QuerySurface(EGLDisplay dpy,
+                                        EGLSurface surface,
+                                        EGLint attribute,
+                                        EGLint *value)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(QuerySurface,
+              "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR
+              ", attribute = %d, value = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, (uintptr_t)surface, attribute, (uintptr_t)value);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    Surface *surfacePacked  = PackParam<Surface *>(surface);
+
+    ANGLE_EGL_VALIDATE(thread, QuerySurface, GetDisplayIfValid(dpyPacked), EGLBoolean, dpyPacked,
+                       surfacePacked, attribute, value);
+
+    return QuerySurface(thread, dpyPacked, surfacePacked, attribute, value);
+}
+
+EGLBoolean EGLAPIENTRY EGL_SwapBuffers(EGLDisplay dpy, EGLSurface surface)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(SwapBuffers, "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR "", (uintptr_t)dpy,
+              (uintptr_t)surface);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    Surface *surfacePacked  = PackParam<Surface *>(surface);
+
+    ANGLE_EGL_VALIDATE(thread, SwapBuffers, GetDisplayIfValid(dpyPacked), EGLBoolean, dpyPacked,
+                       surfacePacked);
+
+    return SwapBuffers(thread, dpyPacked, surfacePacked);
+}
+
+EGLBoolean EGLAPIENTRY EGL_Terminate(EGLDisplay dpy)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(Terminate, "dpy = 0x%016" PRIxPTR "", (uintptr_t)dpy);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+
+    ANGLE_EGL_VALIDATE(thread, Terminate, GetDisplayIfValid(dpyPacked), EGLBoolean, dpyPacked);
+
+    return Terminate(thread, dpyPacked);
+}
+
+EGLBoolean EGLAPIENTRY EGL_WaitGL()
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(WaitGL, "");
+
+    Thread *thread = egl::GetCurrentThread();
+
+    ANGLE_EGL_VALIDATE(thread, WaitGL, nullptr, EGLBoolean);
+
+    return WaitGL(thread);
+}
+
+EGLBoolean EGLAPIENTRY EGL_WaitNative(EGLint engine)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(WaitNative, "engine = %d", engine);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    ANGLE_EGL_VALIDATE(thread, WaitNative, nullptr, EGLBoolean, engine);
+
+    return WaitNative(thread, engine);
+}
+
+// EGL 1.1
+EGLBoolean EGLAPIENTRY EGL_BindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(BindTexImage, "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR ", buffer = %d",
+              (uintptr_t)dpy, (uintptr_t)surface, buffer);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    Surface *surfacePacked  = PackParam<Surface *>(surface);
+
+    ANGLE_EGL_VALIDATE(thread, BindTexImage, GetDisplayIfValid(dpyPacked), EGLBoolean, dpyPacked,
+                       surfacePacked, buffer);
+
+    return BindTexImage(thread, dpyPacked, surfacePacked, buffer);
+}
+
+EGLBoolean EGLAPIENTRY EGL_ReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(ReleaseTexImage, "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR ", buffer = %d",
+              (uintptr_t)dpy, (uintptr_t)surface, buffer);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    Surface *surfacePacked  = PackParam<Surface *>(surface);
+
+    ANGLE_EGL_VALIDATE(thread, ReleaseTexImage, GetDisplayIfValid(dpyPacked), EGLBoolean, dpyPacked,
+                       surfacePacked, buffer);
+
+    return ReleaseTexImage(thread, dpyPacked, surfacePacked, buffer);
+}
+
+EGLBoolean EGLAPIENTRY EGL_SurfaceAttrib(EGLDisplay dpy,
+                                         EGLSurface surface,
+                                         EGLint attribute,
+                                         EGLint value)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(SurfaceAttrib,
+              "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR ", attribute = %d, value = %d",
+              (uintptr_t)dpy, (uintptr_t)surface, attribute, value);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    Surface *surfacePacked  = PackParam<Surface *>(surface);
+
+    ANGLE_EGL_VALIDATE(thread, SurfaceAttrib, GetDisplayIfValid(dpyPacked), EGLBoolean, dpyPacked,
+                       surfacePacked, attribute, value);
+
+    return SurfaceAttrib(thread, dpyPacked, surfacePacked, attribute, value);
+}
+
+EGLBoolean EGLAPIENTRY EGL_SwapInterval(EGLDisplay dpy, EGLint interval)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(SwapInterval, "dpy = 0x%016" PRIxPTR ", interval = %d", (uintptr_t)dpy, interval);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+
+    ANGLE_EGL_VALIDATE(thread, SwapInterval, GetDisplayIfValid(dpyPacked), EGLBoolean, dpyPacked,
+                       interval);
+
+    return SwapInterval(thread, dpyPacked, interval);
+}
+
+// EGL 1.2
+EGLBoolean EGLAPIENTRY EGL_BindAPI(EGLenum api)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(BindAPI, "api = 0x%X", api);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    ANGLE_EGL_VALIDATE(thread, BindAPI, nullptr, EGLBoolean, api);
+
+    return BindAPI(thread, api);
+}
+
+EGLSurface EGLAPIENTRY EGL_CreatePbufferFromClientBuffer(EGLDisplay dpy,
+                                                         EGLenum buftype,
+                                                         EGLClientBuffer buffer,
+                                                         EGLConfig config,
+                                                         const EGLint *attrib_list)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(CreatePbufferFromClientBuffer,
+              "dpy = 0x%016" PRIxPTR ", buftype = 0x%X, buffer = 0x%016" PRIxPTR
+              ", config = 0x%016" PRIxPTR ", attrib_list = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, buftype, (uintptr_t)buffer, (uintptr_t)config,
+              (uintptr_t)attrib_list);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked               = PackParam<egl::Display *>(dpy);
+    Config *configPacked                  = PackParam<Config *>(config);
+    const AttributeMap &attrib_listPacked = PackParam<const AttributeMap &>(attrib_list);
+
+    ANGLE_EGL_VALIDATE(thread, CreatePbufferFromClientBuffer, GetDisplayIfValid(dpyPacked),
+                       EGLSurface, dpyPacked, buftype, buffer, configPacked, attrib_listPacked);
+
+    return CreatePbufferFromClientBuffer(thread, dpyPacked, buftype, buffer, configPacked,
+                                         attrib_listPacked);
+}
+
+EGLenum EGLAPIENTRY EGL_QueryAPI()
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(QueryAPI, "");
+
+    Thread *thread = egl::GetCurrentThread();
+
+    ANGLE_EGL_VALIDATE(thread, QueryAPI, nullptr, EGLenum);
+
+    return QueryAPI(thread);
+}
+
+EGLBoolean EGLAPIENTRY EGL_ReleaseThread()
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(ReleaseThread, "");
+
+    Thread *thread = egl::GetCurrentThread();
+
+    ANGLE_EGL_VALIDATE(thread, ReleaseThread, nullptr, EGLBoolean);
+
+    return ReleaseThread(thread);
+}
+
+EGLBoolean EGLAPIENTRY EGL_WaitClient()
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(WaitClient, "");
+
+    Thread *thread = egl::GetCurrentThread();
+
+    ANGLE_EGL_VALIDATE(thread, WaitClient, nullptr, EGLBoolean);
+
+    return WaitClient(thread);
+}
+
+// EGL 1.4
+EGLContext EGLAPIENTRY EGL_GetCurrentContext()
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(GetCurrentContext, "");
+
+    Thread *thread = egl::GetCurrentThread();
+
+    ANGLE_EGL_VALIDATE(thread, GetCurrentContext, nullptr, EGLContext);
+
+    return GetCurrentContext(thread);
+}
+
+// EGL 1.5
+EGLint EGLAPIENTRY EGL_ClientWaitSync(EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(ClientWaitSync,
+              "dpy = 0x%016" PRIxPTR ", sync = 0x%016" PRIxPTR ", flags = %d, timeout = %llu",
+              (uintptr_t)dpy, (uintptr_t)sync, flags, static_cast<unsigned long long>(timeout));
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    Sync *syncPacked        = PackParam<Sync *>(sync);
+
+    ANGLE_EGL_VALIDATE(thread, ClientWaitSync, GetDisplayIfValid(dpyPacked), EGLint, dpyPacked,
+                       syncPacked, flags, timeout);
+
+    return ClientWaitSync(thread, dpyPacked, syncPacked, flags, timeout);
+}
+
+EGLImage EGLAPIENTRY EGL_CreateImage(EGLDisplay dpy,
+                                     EGLContext ctx,
+                                     EGLenum target,
+                                     EGLClientBuffer buffer,
+                                     const EGLAttrib *attrib_list)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(CreateImage,
+              "dpy = 0x%016" PRIxPTR ", ctx = 0x%016" PRIxPTR
+              ", target = 0x%X, buffer = 0x%016" PRIxPTR ", attrib_list = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, (uintptr_t)ctx, target, (uintptr_t)buffer, (uintptr_t)attrib_list);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked               = PackParam<egl::Display *>(dpy);
+    gl::Context *ctxPacked                = PackParam<gl::Context *>(ctx);
+    const AttributeMap &attrib_listPacked = PackParam<const AttributeMap &>(attrib_list);
+
+    ANGLE_EGL_VALIDATE(thread, CreateImage, GetDisplayIfValid(dpyPacked), EGLImage, dpyPacked,
+                       ctxPacked, target, buffer, attrib_listPacked);
+
+    return CreateImage(thread, dpyPacked, ctxPacked, target, buffer, attrib_listPacked);
+}
+
+EGLSurface EGLAPIENTRY EGL_CreatePlatformPixmapSurface(EGLDisplay dpy,
+                                                       EGLConfig config,
+                                                       void *native_pixmap,
+                                                       const EGLAttrib *attrib_list)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(CreatePlatformPixmapSurface,
+              "dpy = 0x%016" PRIxPTR ", config = 0x%016" PRIxPTR ", native_pixmap = 0x%016" PRIxPTR
+              ", attrib_list = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, (uintptr_t)config, (uintptr_t)native_pixmap, (uintptr_t)attrib_list);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked               = PackParam<egl::Display *>(dpy);
+    Config *configPacked                  = PackParam<Config *>(config);
+    const AttributeMap &attrib_listPacked = PackParam<const AttributeMap &>(attrib_list);
+
+    ANGLE_EGL_VALIDATE(thread, CreatePlatformPixmapSurface, GetDisplayIfValid(dpyPacked),
+                       EGLSurface, dpyPacked, configPacked, native_pixmap, attrib_listPacked);
+
+    return CreatePlatformPixmapSurface(thread, dpyPacked, configPacked, native_pixmap,
+                                       attrib_listPacked);
+}
+
+EGLSurface EGLAPIENTRY EGL_CreatePlatformWindowSurface(EGLDisplay dpy,
+                                                       EGLConfig config,
+                                                       void *native_window,
+                                                       const EGLAttrib *attrib_list)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(CreatePlatformWindowSurface,
+              "dpy = 0x%016" PRIxPTR ", config = 0x%016" PRIxPTR ", native_window = 0x%016" PRIxPTR
+              ", attrib_list = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, (uintptr_t)config, (uintptr_t)native_window, (uintptr_t)attrib_list);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked               = PackParam<egl::Display *>(dpy);
+    Config *configPacked                  = PackParam<Config *>(config);
+    const AttributeMap &attrib_listPacked = PackParam<const AttributeMap &>(attrib_list);
+
+    ANGLE_EGL_VALIDATE(thread, CreatePlatformWindowSurface, GetDisplayIfValid(dpyPacked),
+                       EGLSurface, dpyPacked, configPacked, native_window, attrib_listPacked);
+
+    return CreatePlatformWindowSurface(thread, dpyPacked, configPacked, native_window,
+                                       attrib_listPacked);
+}
+
+EGLSync EGLAPIENTRY EGL_CreateSync(EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(CreateSync, "dpy = 0x%016" PRIxPTR ", type = 0x%X, attrib_list = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, type, (uintptr_t)attrib_list);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked               = PackParam<egl::Display *>(dpy);
+    const AttributeMap &attrib_listPacked = PackParam<const AttributeMap &>(attrib_list);
+
+    ANGLE_EGL_VALIDATE(thread, CreateSync, GetDisplayIfValid(dpyPacked), EGLSync, dpyPacked, type,
+                       attrib_listPacked);
+
+    return CreateSync(thread, dpyPacked, type, attrib_listPacked);
+}
+
+EGLBoolean EGLAPIENTRY EGL_DestroyImage(EGLDisplay dpy, EGLImage image)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(DestroyImage, "dpy = 0x%016" PRIxPTR ", image = 0x%016" PRIxPTR "", (uintptr_t)dpy,
+              (uintptr_t)image);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    Image *imagePacked      = PackParam<Image *>(image);
+
+    ANGLE_EGL_VALIDATE(thread, DestroyImage, GetDisplayIfValid(dpyPacked), EGLBoolean, dpyPacked,
+                       imagePacked);
+
+    return DestroyImage(thread, dpyPacked, imagePacked);
+}
+
+EGLBoolean EGLAPIENTRY EGL_DestroySync(EGLDisplay dpy, EGLSync sync)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(DestroySync, "dpy = 0x%016" PRIxPTR ", sync = 0x%016" PRIxPTR "", (uintptr_t)dpy,
+              (uintptr_t)sync);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    Sync *syncPacked        = PackParam<Sync *>(sync);
+
+    ANGLE_EGL_VALIDATE(thread, DestroySync, GetDisplayIfValid(dpyPacked), EGLBoolean, dpyPacked,
+                       syncPacked);
+
+    return DestroySync(thread, dpyPacked, syncPacked);
+}
+
+EGLDisplay EGLAPIENTRY EGL_GetPlatformDisplay(EGLenum platform,
+                                              void *native_display,
+                                              const EGLAttrib *attrib_list)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(GetPlatformDisplay,
+              "platform = 0x%X, native_display = 0x%016" PRIxPTR ", attrib_list = 0x%016" PRIxPTR
+              "",
+              platform, (uintptr_t)native_display, (uintptr_t)attrib_list);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    const AttributeMap &attrib_listPacked = PackParam<const AttributeMap &>(attrib_list);
+
+    ANGLE_EGL_VALIDATE(thread, GetPlatformDisplay, nullptr, EGLDisplay, platform, native_display,
+                       attrib_listPacked);
+
+    return GetPlatformDisplay(thread, platform, native_display, attrib_listPacked);
+}
+
+EGLBoolean EGLAPIENTRY EGL_GetSyncAttrib(EGLDisplay dpy,
+                                         EGLSync sync,
+                                         EGLint attribute,
+                                         EGLAttrib *value)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(GetSyncAttrib,
+              "dpy = 0x%016" PRIxPTR ", sync = 0x%016" PRIxPTR
+              ", attribute = %d, value = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, (uintptr_t)sync, attribute, (uintptr_t)value);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    Sync *syncPacked        = PackParam<Sync *>(sync);
+
+    ANGLE_EGL_VALIDATE(thread, GetSyncAttrib, GetDisplayIfValid(dpyPacked), EGLBoolean, dpyPacked,
+                       syncPacked, attribute, value);
+
+    return GetSyncAttrib(thread, dpyPacked, syncPacked, attribute, value);
+}
+
+EGLBoolean EGLAPIENTRY EGL_WaitSync(EGLDisplay dpy, EGLSync sync, EGLint flags)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(WaitSync, "dpy = 0x%016" PRIxPTR ", sync = 0x%016" PRIxPTR ", flags = %d",
+              (uintptr_t)dpy, (uintptr_t)sync, flags);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    Sync *syncPacked        = PackParam<Sync *>(sync);
+
+    ANGLE_EGL_VALIDATE(thread, WaitSync, GetDisplayIfValid(dpyPacked), EGLBoolean, dpyPacked,
+                       syncPacked, flags);
+
+    return WaitSync(thread, dpyPacked, syncPacked, flags);
+}
+}  // extern "C"
diff --git a/src/libGLESv2/entry_points_egl.h b/src/libGLESv2/entry_points_egl_autogen.h
similarity index 90%
rename from src/libGLESv2/entry_points_egl.h
rename to src/libGLESv2/entry_points_egl_autogen.h
index 95f5c31..407054b 100644
--- a/src/libGLESv2/entry_points_egl.h
+++ b/src/libGLESv2/entry_points_egl_autogen.h
@@ -1,13 +1,15 @@
+// GENERATED FILE - DO NOT EDIT.
+// Generated by generate_entry_points.py using data from egl.xml.
 //
-// Copyright 2014 The ANGLE Project Authors. All rights reserved.
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
+// entry_points_egl_autogen.h:
+//   Defines the EGL entry points.
 
-// entry_points_egl.h : Defines the EGL entry points.
-
-#ifndef LIBGLESV2_ENTRYPOINTSEGL_H_
-#define LIBGLESV2_ENTRYPOINTSEGL_H_
+#ifndef LIBGLESV2_ENTRY_POINTS_EGL_AUTOGEN_H_
+#define LIBGLESV2_ENTRY_POINTS_EGL_AUTOGEN_H_
 
 #include <EGL/egl.h>
 #include <export.h>
@@ -48,10 +50,10 @@
                                                    EGLConfig *configs,
                                                    EGLint config_size,
                                                    EGLint *num_config);
-ANGLE_EXPORT EGLDisplay EGLAPIENTRY EGL_GetCurrentDisplay(void);
+ANGLE_EXPORT EGLDisplay EGLAPIENTRY EGL_GetCurrentDisplay();
 ANGLE_EXPORT EGLSurface EGLAPIENTRY EGL_GetCurrentSurface(EGLint readdraw);
 ANGLE_EXPORT EGLDisplay EGLAPIENTRY EGL_GetDisplay(EGLNativeDisplayType display_id);
-ANGLE_EXPORT EGLint EGLAPIENTRY EGL_GetError(void);
+ANGLE_EXPORT EGLint EGLAPIENTRY EGL_GetError();
 ANGLE_EXPORT __eglMustCastToProperFunctionPointerType EGLAPIENTRY
 EGL_GetProcAddress(const char *procname);
 ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_Initialize(EGLDisplay dpy, EGLint *major, EGLint *minor);
@@ -70,7 +72,7 @@
                                                      EGLint *value);
 ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_SwapBuffers(EGLDisplay dpy, EGLSurface surface);
 ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_Terminate(EGLDisplay dpy);
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_WaitGL(void);
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_WaitGL();
 ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_WaitNative(EGLint engine);
 
 // EGL 1.1
@@ -88,49 +90,49 @@
 
 // EGL 1.2
 ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_BindAPI(EGLenum api);
-ANGLE_EXPORT EGLenum EGLAPIENTRY EGL_QueryAPI(void);
 ANGLE_EXPORT EGLSurface EGLAPIENTRY EGL_CreatePbufferFromClientBuffer(EGLDisplay dpy,
                                                                       EGLenum buftype,
                                                                       EGLClientBuffer buffer,
                                                                       EGLConfig config,
                                                                       const EGLint *attrib_list);
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_ReleaseThread(void);
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_WaitClient(void);
+ANGLE_EXPORT EGLenum EGLAPIENTRY EGL_QueryAPI();
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_ReleaseThread();
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_WaitClient();
 
 // EGL 1.4
-ANGLE_EXPORT EGLContext EGLAPIENTRY EGL_GetCurrentContext(void);
+ANGLE_EXPORT EGLContext EGLAPIENTRY EGL_GetCurrentContext();
 
 // EGL 1.5
-ANGLE_EXPORT EGLSync EGLAPIENTRY EGL_CreateSync(EGLDisplay dpy,
-                                                EGLenum type,
-                                                const EGLAttrib *attrib_list);
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_DestroySync(EGLDisplay dpy, EGLSync sync);
 ANGLE_EXPORT EGLint EGLAPIENTRY EGL_ClientWaitSync(EGLDisplay dpy,
                                                    EGLSync sync,
                                                    EGLint flags,
                                                    EGLTime timeout);
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_GetSyncAttrib(EGLDisplay dpy,
-                                                      EGLSync sync,
-                                                      EGLint attribute,
-                                                      EGLAttrib *value);
 ANGLE_EXPORT EGLImage EGLAPIENTRY EGL_CreateImage(EGLDisplay dpy,
                                                   EGLContext ctx,
                                                   EGLenum target,
                                                   EGLClientBuffer buffer,
                                                   const EGLAttrib *attrib_list);
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_DestroyImage(EGLDisplay dpy, EGLImage image);
-ANGLE_EXPORT EGLDisplay EGLAPIENTRY EGL_GetPlatformDisplay(EGLenum platform,
-                                                           void *native_display,
-                                                           const EGLAttrib *attrib_list);
-ANGLE_EXPORT EGLSurface EGLAPIENTRY EGL_CreatePlatformWindowSurface(EGLDisplay dpy,
-                                                                    EGLConfig config,
-                                                                    void *native_window,
-                                                                    const EGLAttrib *attrib_list);
 ANGLE_EXPORT EGLSurface EGLAPIENTRY EGL_CreatePlatformPixmapSurface(EGLDisplay dpy,
                                                                     EGLConfig config,
                                                                     void *native_pixmap,
                                                                     const EGLAttrib *attrib_list);
+ANGLE_EXPORT EGLSurface EGLAPIENTRY EGL_CreatePlatformWindowSurface(EGLDisplay dpy,
+                                                                    EGLConfig config,
+                                                                    void *native_window,
+                                                                    const EGLAttrib *attrib_list);
+ANGLE_EXPORT EGLSync EGLAPIENTRY EGL_CreateSync(EGLDisplay dpy,
+                                                EGLenum type,
+                                                const EGLAttrib *attrib_list);
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_DestroyImage(EGLDisplay dpy, EGLImage image);
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_DestroySync(EGLDisplay dpy, EGLSync sync);
+ANGLE_EXPORT EGLDisplay EGLAPIENTRY EGL_GetPlatformDisplay(EGLenum platform,
+                                                           void *native_display,
+                                                           const EGLAttrib *attrib_list);
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_GetSyncAttrib(EGLDisplay dpy,
+                                                      EGLSync sync,
+                                                      EGLint attribute,
+                                                      EGLAttrib *value);
 ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_WaitSync(EGLDisplay dpy, EGLSync sync, EGLint flags);
 }  // extern "C"
 
-#endif  // LIBGLESV2_ENTRYPOINTSEGL_H_
+#endif  // LIBGLESV2_ENTRY_POINTS_EGL_AUTOGEN_H_
diff --git a/src/libGLESv2/entry_points_egl_ext.cpp b/src/libGLESv2/entry_points_egl_ext.cpp
deleted file mode 100644
index fd30978..0000000
--- a/src/libGLESv2/entry_points_egl_ext.cpp
+++ /dev/null
@@ -1,1730 +0,0 @@
-//
-// Copyright 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// entry_points_ext.cpp : Implements the EGL extension entry points.
-
-#include "libGLESv2/entry_points_egl_ext.h"
-
-#include "common/debug.h"
-#include "libANGLE/Context.h"
-#include "libANGLE/Device.h"
-#include "libANGLE/Display.h"
-#include "libANGLE/EGLSync.h"
-#include "libANGLE/Stream.h"
-#include "libANGLE/Surface.h"
-#include "libANGLE/Thread.h"
-#include "libANGLE/entry_points_utils.h"
-#include "libANGLE/queryutils.h"
-#include "libANGLE/validationEGL.h"
-#include "libGLESv2/global_state.h"
-
-using namespace egl;
-
-extern "C" {
-
-// EGL_ANGLE_query_surface_pointer
-EGLBoolean EGLAPIENTRY EGL_QuerySurfacePointerANGLE(EGLDisplay dpy,
-                                                    EGLSurface surface,
-                                                    EGLint attribute,
-                                                    void **value)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLSurface surface = 0x%016" PRIxPTR
-               ", EGLint attribute = %d, void "
-               "**value = 0x%016" PRIxPTR,
-               (uintptr_t)dpy, (uintptr_t)surface, attribute, (uintptr_t)value);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    Surface *eglSurface   = static_cast<Surface *>(surface);
-
-    Error error = ValidateSurface(display, eglSurface);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglQuerySurfacePointerANGLE",
-                         GetSurfaceIfValid(display, eglSurface));
-        return EGL_FALSE;
-    }
-
-    if (!display->getExtensions().querySurfacePointer)
-    {
-        thread->setSuccess();
-        return EGL_FALSE;
-    }
-
-    if (surface == EGL_NO_SURFACE)
-    {
-        thread->setError(EglBadSurface(), GetDebug(), "eglQuerySurfacePointerANGLE",
-                         GetSurfaceIfValid(display, eglSurface));
-        return EGL_FALSE;
-    }
-
-    // validate the attribute parameter
-    switch (attribute)
-    {
-        case EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE:
-            if (!display->getExtensions().surfaceD3DTexture2DShareHandle)
-            {
-                thread->setError(EglBadAttribute(), GetDebug(), "eglQuerySurfacePointerANGLE",
-                                 GetSurfaceIfValid(display, eglSurface));
-                return EGL_FALSE;
-            }
-            break;
-        case EGL_DXGI_KEYED_MUTEX_ANGLE:
-            if (!display->getExtensions().keyedMutex)
-            {
-                thread->setError(EglBadAttribute(), GetDebug(), "eglQuerySurfacePointerANGLE",
-                                 GetSurfaceIfValid(display, eglSurface));
-                return EGL_FALSE;
-            }
-            break;
-        default:
-            thread->setError(EglBadAttribute(), GetDebug(), "eglQuerySurfacePointerANGLE",
-                             GetSurfaceIfValid(display, eglSurface));
-            return EGL_FALSE;
-    }
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglQuerySurfacePointerANGLE",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    error = eglSurface->querySurfacePointerANGLE(attribute, value);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglQuerySurfacePointerANGLE",
-                         GetSurfaceIfValid(display, eglSurface));
-        return EGL_FALSE;
-    }
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-// EGL_NV_post_sub_buffer
-EGLBoolean EGLAPIENTRY EGL_PostSubBufferNV(EGLDisplay dpy,
-                                           EGLSurface surface,
-                                           EGLint x,
-                                           EGLint y,
-                                           EGLint width,
-                                           EGLint height)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLSurface surface = 0x%016" PRIxPTR
-               ", EGLint x = %d, EGLint y = %d, "
-               "EGLint width = %d, EGLint height = %d",
-               (uintptr_t)dpy, (uintptr_t)surface, x, y, width, height);
-    Thread *thread        = egl::GetCurrentThread();
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    Surface *eglSurface   = static_cast<Surface *>(surface);
-
-    if (x < 0 || y < 0 || width < 0 || height < 0)
-    {
-        thread->setError(EglBadParameter(), GetDebug(), "eglPostSubBufferNV",
-                         GetSurfaceIfValid(display, eglSurface));
-        return EGL_FALSE;
-    }
-
-    Error error = ValidateSurface(display, eglSurface);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglPostSubBufferNV",
-                         GetSurfaceIfValid(display, eglSurface));
-        return EGL_FALSE;
-    }
-
-    if (display->testDeviceLost())
-    {
-        thread->setError(EglContextLost(), GetDebug(), "eglPostSubBufferNV",
-                         GetSurfaceIfValid(display, eglSurface));
-        return EGL_FALSE;
-    }
-
-    if (surface == EGL_NO_SURFACE)
-    {
-        thread->setError(EglBadSurface(), GetDebug(), "eglPostSubBufferNV",
-                         GetSurfaceIfValid(display, eglSurface));
-        return EGL_FALSE;
-    }
-
-    if (!display->getExtensions().postSubBuffer)
-    {
-        // Spec is not clear about how this should be handled.
-        thread->setSuccess();
-        return EGL_TRUE;
-    }
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglPostSubBufferNV",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    // TODO(jmadill): Validate Surface is bound to the thread.
-    error = eglSurface->postSubBuffer(thread->getContext(), x, y, width, height);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglPostSubBufferNV",
-                         GetSurfaceIfValid(display, eglSurface));
-        return EGL_FALSE;
-    }
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-// EGL_EXT_platform_base
-EGLDisplay EGLAPIENTRY EGL_GetPlatformDisplayEXT(EGLenum platform,
-                                                 void *native_display,
-                                                 const EGLint *attrib_list)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLenum platform = %d, void* native_display = 0x%016" PRIxPTR
-               ", const EGLint* attrib_list = "
-               "0x%016" PRIxPTR,
-               platform, (uintptr_t)native_display, (uintptr_t)attrib_list);
-    Thread *thread = egl::GetCurrentThread();
-
-    Error err = ValidateGetPlatformDisplayEXT(platform, native_display, attrib_list);
-    thread->setError(err, GetDebug(), "eglGetPlatformDisplayEXT", GetThreadIfValid(thread));
-    if (err.isError())
-    {
-        return EGL_NO_DISPLAY;
-    }
-
-    const auto &attribMap = AttributeMap::CreateFromIntArray(attrib_list);
-    if (platform == EGL_PLATFORM_ANGLE_ANGLE)
-    {
-        return egl::Display::GetDisplayFromNativeDisplay(
-            gl::bitCast<EGLNativeDisplayType>(native_display), attribMap);
-    }
-    else if (platform == EGL_PLATFORM_DEVICE_EXT)
-    {
-        Device *eglDevice = static_cast<Device *>(native_display);
-        return egl::Display::GetDisplayFromDevice(eglDevice, attribMap);
-    }
-    else
-    {
-        UNREACHABLE();
-        return EGL_NO_DISPLAY;
-    }
-}
-
-EGLSurface EGLAPIENTRY EGL_CreatePlatformWindowSurfaceEXT(EGLDisplay dpy,
-                                                          EGLConfig config,
-                                                          void *native_window,
-                                                          const EGLint *attrib_list)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLConfig config = 0x%016" PRIxPTR
-               ", void *native_window = 0x%016" PRIxPTR
-               ", "
-               "const EGLint *attrib_list = 0x%016" PRIxPTR,
-               (uintptr_t)dpy, (uintptr_t)config, (uintptr_t)native_window, (uintptr_t)attrib_list);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display   = static_cast<egl::Display *>(dpy);
-    Config *configuration   = static_cast<Config *>(config);
-    AttributeMap attributes = AttributeMap::CreateFromIntArray(attrib_list);
-
-    ANGLE_EGL_TRY_RETURN(
-        thread,
-        ValidateCreatePlatformWindowSurfaceEXT(display, configuration, native_window, attributes),
-        "eglCreatePlatformWindowSurfaceEXT", GetDisplayIfValid(display), EGL_NO_SURFACE);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglCreatePlatformWindowSurfaceEXT",
-                         GetDisplayIfValid(display), EGL_NO_SURFACE);
-    thread->setError(EglBadDisplay() << "CreatePlatformWindowSurfaceEXT unimplemented.", GetDebug(),
-                     "eglCreatePlatformWindowSurfaceEXT", GetDisplayIfValid(display));
-    return EGL_NO_SURFACE;
-}
-
-EGLSurface EGLAPIENTRY EGL_CreatePlatformPixmapSurfaceEXT(EGLDisplay dpy,
-                                                          EGLConfig config,
-                                                          void *native_pixmap,
-                                                          const EGLint *attrib_list)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLConfig config = 0x%016" PRIxPTR
-               ", void *native_pixmap = 0x%016" PRIxPTR
-               ", "
-               "const EGLint *attrib_list = 0x%016" PRIxPTR,
-               (uintptr_t)dpy, (uintptr_t)config, (uintptr_t)native_pixmap, (uintptr_t)attrib_list);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display   = static_cast<egl::Display *>(dpy);
-    Config *configuration   = static_cast<Config *>(config);
-    AttributeMap attributes = AttributeMap::CreateFromIntArray(attrib_list);
-
-    ANGLE_EGL_TRY_RETURN(
-        thread,
-        ValidateCreatePlatformPixmapSurfaceEXT(display, configuration, native_pixmap, attributes),
-        "eglCreatePlatformPixmapSurfaceEXT", GetDisplayIfValid(display), EGL_NO_SURFACE);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglCreatePlatformPixmapSurfaceEXT",
-                         GetDisplayIfValid(display), EGL_NO_SURFACE);
-    thread->setError(EglBadDisplay() << "CreatePlatformPixmapSurfaceEXT unimplemented.", GetDebug(),
-                     "eglCreatePlatformPixmapSurfaceEXT", GetDisplayIfValid(display));
-    return EGL_NO_SURFACE;
-}
-
-// EGL_EXT_device_query
-EGLBoolean EGLAPIENTRY EGL_QueryDeviceAttribEXT(EGLDeviceEXT device,
-                                                EGLint attribute,
-                                                EGLAttrib *value)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDeviceEXT device = 0x%016" PRIxPTR
-               ", EGLint attribute = %d, EGLAttrib *value = 0x%016" PRIxPTR,
-               (uintptr_t)device, attribute, (uintptr_t)value);
-    Thread *thread = egl::GetCurrentThread();
-
-    Device *dev = static_cast<Device *>(device);
-
-    Error error = ValidateDevice(dev);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglQueryDeviceAttribEXT", GetDeviceIfValid(dev));
-        return EGL_FALSE;
-    }
-    egl::Display *owningDisplay = dev->getOwningDisplay();
-    if (owningDisplay)
-    {
-        ANGLE_EGL_TRY_RETURN(thread, owningDisplay->prepareForCall(), "eglQueryDeviceAttribEXT",
-                             GetDisplayIfValid(owningDisplay), EGL_FALSE);
-    }
-    // If the device was created by (and is owned by) a display, and that display doesn't support
-    // device querying, then this call should fail
-    if (owningDisplay != nullptr && !owningDisplay->getExtensions().deviceQuery)
-    {
-        thread->setError(EglBadAccess() << "Device wasn't created using eglCreateDeviceANGLE, "
-                                           "and the egl::Display that created it doesn't support "
-                                           "device querying",
-                         GetDebug(), "eglQueryDeviceAttribEXT", GetDeviceIfValid(dev));
-        return EGL_FALSE;
-    }
-
-    // validate the attribute parameter
-    switch (attribute)
-    {
-        case EGL_D3D11_DEVICE_ANGLE:
-        case EGL_D3D9_DEVICE_ANGLE:
-            if (!dev->getExtensions().deviceD3D || dev->getType() != attribute)
-            {
-                thread->setError(EglBadAttribute(), GetDebug(), "eglQueryDeviceAttribEXT",
-                                 GetDeviceIfValid(dev));
-                return EGL_FALSE;
-            }
-            error = dev->getAttribute(attribute, value);
-            break;
-        case EGL_EAGL_CONTEXT_ANGLE:
-            if (!dev->getExtensions().deviceEAGL)
-            {
-                thread->setError(EglBadAttribute(), GetDebug(), "eglQueryDeviceAttribEXT",
-                                 GetDeviceIfValid(dev));
-                return EGL_FALSE;
-            }
-            error = dev->getAttribute(attribute, value);
-            break;
-        case EGL_CGL_CONTEXT_ANGLE:
-        case EGL_CGL_PIXEL_FORMAT_ANGLE:
-            if (!dev->getExtensions().deviceCGL)
-            {
-                thread->setError(EglBadAttribute(), GetDebug(), "eglQueryDeviceAttribEXT",
-                                 GetDeviceIfValid(dev));
-                return EGL_FALSE;
-            }
-            error = dev->getAttribute(attribute, value);
-            break;
-        default:
-            thread->setError(EglBadAttribute(), GetDebug(), "eglQueryDeviceAttribEXT",
-                             GetDeviceIfValid(dev));
-            return EGL_FALSE;
-    }
-
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglQueryDeviceAttribEXT", GetDeviceIfValid(dev));
-        return EGL_FALSE;
-    }
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-// EGL_EXT_device_query
-const char *EGLAPIENTRY EGL_QueryDeviceStringEXT(EGLDeviceEXT device, EGLint name)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDeviceEXT device = 0x%016" PRIxPTR ", EGLint name = %d", (uintptr_t)device,
-               name);
-    Thread *thread = egl::GetCurrentThread();
-
-    Device *dev = static_cast<Device *>(device);
-
-    Error error = ValidateDevice(dev);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglQueryDeviceStringEXT", GetDeviceIfValid(dev));
-        return EGL_FALSE;
-    }
-    egl::Display *owningDisplay = dev->getOwningDisplay();
-    ANGLE_EGL_TRY_RETURN(thread, owningDisplay->prepareForCall(), "eglQueryDeviceStringEXT",
-                         GetDisplayIfValid(owningDisplay), EGL_FALSE);
-    const char *result;
-    switch (name)
-    {
-        case EGL_EXTENSIONS:
-            result = dev->getExtensionString().c_str();
-            break;
-        default:
-            thread->setError(EglBadDevice(), GetDebug(), "eglQueryDeviceStringEXT",
-                             GetDeviceIfValid(dev));
-            return nullptr;
-    }
-
-    thread->setSuccess();
-    return result;
-}
-
-// EGL_EXT_device_query
-EGLBoolean EGLAPIENTRY EGL_QueryDisplayAttribEXT(EGLDisplay dpy, EGLint attribute, EGLAttrib *value)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR
-               ", EGLint attribute = %d, EGLAttrib *value = 0x%016" PRIxPTR,
-               (uintptr_t)dpy, attribute, (uintptr_t)value);
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    Thread *thread        = egl::GetCurrentThread();
-
-    ANGLE_EGL_TRY_RETURN(thread, ValidateQueryDisplayAttribEXT(display, attribute),
-                         "eglQueryDisplayAttribEXT", GetDisplayIfValid(display), EGL_FALSE);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglQueryDisplayAttribEXT",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    *value = display->queryAttrib(attribute);
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-// EGL_ANGLE_feature_control
-EGLBoolean EGLAPIENTRY EGL_QueryDisplayAttribANGLE(EGLDisplay dpy,
-                                                   EGLint attribute,
-                                                   EGLAttrib *value)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR
-               ", EGLint attribute = %d, EGLAttrib *value = 0x%016" PRIxPTR,
-               (uintptr_t)dpy, attribute, (uintptr_t)value);
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    Thread *thread        = egl::GetCurrentThread();
-
-    ANGLE_EGL_TRY_RETURN(thread, ValidateQueryDisplayAttribANGLE(display, attribute),
-                         "eglQueryDisplayAttribANGLE", GetDisplayIfValid(display), EGL_FALSE);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglQueryDisplayAttribANGLE",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    *value = display->queryAttrib(attribute);
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-ANGLE_EXPORT EGLImageKHR EGLAPIENTRY EGL_CreateImageKHR(EGLDisplay dpy,
-                                                        EGLContext ctx,
-                                                        EGLenum target,
-                                                        EGLClientBuffer buffer,
-                                                        const EGLint *attrib_list)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR
-               ", EGLContext ctx = %d"
-               ", EGLenum target = 0x%X, "
-               "EGLClientBuffer buffer = 0x%016" PRIxPTR
-               ", const EGLAttrib *attrib_list = 0x%016" PRIxPTR,
-               (uintptr_t)dpy, CID(dpy, ctx), target, (uintptr_t)buffer, (uintptr_t)attrib_list);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display   = static_cast<egl::Display *>(dpy);
-    gl::Context *context    = static_cast<gl::Context *>(ctx);
-    AttributeMap attributes = AttributeMap::CreateFromIntArray(attrib_list);
-
-    Error error = ValidateCreateImageKHR(display, context, target, buffer, attributes);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglCreateImageKHR", GetDisplayIfValid(display));
-        return EGL_NO_IMAGE;
-    }
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglCreateImageKHR",
-                         GetDisplayIfValid(display), EGL_NO_IMAGE);
-    Image *image = nullptr;
-    error        = display->createImage(context, target, buffer, attributes, &image);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglCreateImageKHR", GetDisplayIfValid(display));
-        return EGL_NO_IMAGE;
-    }
-
-    thread->setSuccess();
-    return static_cast<EGLImage>(image);
-}
-
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_DestroyImageKHR(EGLDisplay dpy, EGLImageKHR image)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLImage image = 0x%016" PRIxPTR,
-               (uintptr_t)dpy, (uintptr_t)image);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    Image *img            = static_cast<Image *>(image);
-
-    Error error = ValidateDestroyImageKHR(display, img);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglDestroyImageKHR", GetImageIfValid(display, img));
-        return EGL_FALSE;
-    }
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglDestroyImageKHR",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    display->destroyImage(img);
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-ANGLE_EXPORT EGLDeviceEXT EGLAPIENTRY EGL_CreateDeviceANGLE(EGLint device_type,
-                                                            void *native_device,
-                                                            const EGLAttrib *attrib_list)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLint device_type = %d, void* native_device = 0x%016" PRIxPTR
-               ", const EGLAttrib* attrib_list = "
-               "0x%016" PRIxPTR,
-               device_type, (uintptr_t)native_device, (uintptr_t)attrib_list);
-    Thread *thread = egl::GetCurrentThread();
-
-    Error error = ValidateCreateDeviceANGLE(device_type, native_device, attrib_list);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglCreateDeviceANGLE", GetThreadIfValid(thread));
-        return EGL_NO_DEVICE_EXT;
-    }
-
-    Device *device = nullptr;
-    error          = Device::CreateDevice(device_type, native_device, &device);
-    if (error.isError())
-    {
-        ASSERT(device == nullptr);
-        thread->setError(error, GetDebug(), "eglCreateDeviceANGLE", GetThreadIfValid(thread));
-        return EGL_NO_DEVICE_EXT;
-    }
-
-    thread->setSuccess();
-    return device;
-}
-
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_ReleaseDeviceANGLE(EGLDeviceEXT device)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDeviceEXT device = 0x%016" PRIxPTR, (uintptr_t)device);
-    Thread *thread = egl::GetCurrentThread();
-
-    Device *dev = static_cast<Device *>(device);
-
-    Error error = ValidateReleaseDeviceANGLE(dev);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglReleaseDeviceANGLE", GetDeviceIfValid(dev));
-        return EGL_FALSE;
-    }
-
-    SafeDelete(dev);
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-// EGL_KHR_stream
-EGLStreamKHR EGLAPIENTRY EGL_CreateStreamKHR(EGLDisplay dpy, const EGLint *attrib_list)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", const EGLAttrib* attrib_list = 0x%016" PRIxPTR,
-               (uintptr_t)dpy, (uintptr_t)attrib_list);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display   = static_cast<egl::Display *>(dpy);
-    AttributeMap attributes = AttributeMap::CreateFromIntArray(attrib_list);
-
-    Error error = ValidateCreateStreamKHR(display, attributes);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglCreateStreamKHR", GetDisplayIfValid(display));
-        return EGL_NO_STREAM_KHR;
-    }
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglCreateStreamKHR",
-                         GetDisplayIfValid(display), EGL_NO_STREAM_KHR);
-    Stream *stream;
-    error = display->createStream(attributes, &stream);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglCreateStreamKHR", GetDisplayIfValid(display));
-        return EGL_NO_STREAM_KHR;
-    }
-
-    thread->setSuccess();
-    return static_cast<EGLStreamKHR>(stream);
-}
-
-EGLBoolean EGLAPIENTRY EGL_DestroyStreamKHR(EGLDisplay dpy, EGLStreamKHR stream)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLStreamKHR = 0x%016" PRIxPTR, (uintptr_t)dpy,
-               (uintptr_t)stream);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    Stream *streamObject  = static_cast<Stream *>(stream);
-
-    Error error = ValidateDestroyStreamKHR(display, streamObject);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglDestroyStreamKHR",
-                         GetStreamIfValid(display, streamObject));
-        return EGL_FALSE;
-    }
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglDestroyStreamKHR",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    display->destroyStream(streamObject);
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-EGLBoolean EGLAPIENTRY EGL_StreamAttribKHR(EGLDisplay dpy,
-                                           EGLStreamKHR stream,
-                                           EGLenum attribute,
-                                           EGLint value)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLStreamKHR stream = 0x%016" PRIxPTR
-               ", EGLenum attribute = 0x%X, "
-               "EGLint value = 0x%X",
-               (uintptr_t)dpy, (uintptr_t)stream, attribute, value);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    Stream *streamObject  = static_cast<Stream *>(stream);
-
-    Error error = ValidateStreamAttribKHR(display, streamObject, attribute, value);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglStreamAttribKHR",
-                         GetStreamIfValid(display, streamObject));
-        return EGL_FALSE;
-    }
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglStreamAttribKHR",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    switch (attribute)
-    {
-        case EGL_CONSUMER_LATENCY_USEC_KHR:
-            streamObject->setConsumerLatency(value);
-            break;
-        case EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR:
-            streamObject->setConsumerAcquireTimeout(value);
-            break;
-        default:
-            UNREACHABLE();
-    }
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-EGLBoolean EGLAPIENTRY EGL_QueryStreamKHR(EGLDisplay dpy,
-                                          EGLStreamKHR stream,
-                                          EGLenum attribute,
-                                          EGLint *value)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLStreamKHR stream = 0x%016" PRIxPTR
-               ", EGLenum attribute = 0x%X, "
-               "EGLint value = 0x%016" PRIxPTR,
-               (uintptr_t)dpy, (uintptr_t)stream, attribute, (uintptr_t)value);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    Stream *streamObject  = static_cast<Stream *>(stream);
-
-    Error error = ValidateQueryStreamKHR(display, streamObject, attribute, value);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglQueryStreamKHR",
-                         GetStreamIfValid(display, streamObject));
-        return EGL_FALSE;
-    }
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglQueryStreamKHR",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    switch (attribute)
-    {
-        case EGL_STREAM_STATE_KHR:
-            *value = streamObject->getState();
-            break;
-        case EGL_CONSUMER_LATENCY_USEC_KHR:
-            *value = streamObject->getConsumerLatency();
-            break;
-        case EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR:
-            *value = streamObject->getConsumerAcquireTimeout();
-            break;
-        default:
-            UNREACHABLE();
-    }
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-EGLBoolean EGLAPIENTRY EGL_QueryStreamu64KHR(EGLDisplay dpy,
-                                             EGLStreamKHR stream,
-                                             EGLenum attribute,
-                                             EGLuint64KHR *value)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLStreamKHR stream = 0x%016" PRIxPTR
-               ", EGLenum attribute = 0x%X, "
-               "EGLuint64KHR value = 0x%016" PRIxPTR,
-               (uintptr_t)dpy, (uintptr_t)stream, attribute, (uintptr_t)value);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    Stream *streamObject  = static_cast<Stream *>(stream);
-
-    Error error = ValidateQueryStreamu64KHR(display, streamObject, attribute, value);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglQueryStreamu64KHR",
-                         GetStreamIfValid(display, streamObject));
-        return EGL_FALSE;
-    }
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglQueryStreamu64KHR",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    switch (attribute)
-    {
-        case EGL_PRODUCER_FRAME_KHR:
-            *value = streamObject->getProducerFrame();
-            break;
-        case EGL_CONSUMER_FRAME_KHR:
-            *value = streamObject->getConsumerFrame();
-            break;
-        default:
-            UNREACHABLE();
-    }
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-EGLBoolean EGLAPIENTRY EGL_StreamConsumerGLTextureExternalKHR(EGLDisplay dpy, EGLStreamKHR stream)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLStreamKHR = 0x%016" PRIxPTR, (uintptr_t)dpy,
-               (uintptr_t)stream);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    Stream *streamObject  = static_cast<Stream *>(stream);
-    gl::Context *context  = gl::GetValidGlobalContext();
-
-    Error error = ValidateStreamConsumerGLTextureExternalKHR(display, context, streamObject);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglStreamConsumerGLTextureExternalKHR",
-                         GetStreamIfValid(display, streamObject));
-        return EGL_FALSE;
-    }
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglStreamConsumerGLTextureExternalKHR",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    error = streamObject->createConsumerGLTextureExternal(AttributeMap(), context);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglStreamConsumerGLTextureExternalKHR",
-                         GetStreamIfValid(display, streamObject));
-        return EGL_FALSE;
-    }
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-EGLBoolean EGLAPIENTRY EGL_StreamConsumerAcquireKHR(EGLDisplay dpy, EGLStreamKHR stream)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLStreamKHR = 0x%016" PRIxPTR, (uintptr_t)dpy,
-               (uintptr_t)stream);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    Stream *streamObject  = static_cast<Stream *>(stream);
-    gl::Context *context  = gl::GetValidGlobalContext();
-
-    Error error = ValidateStreamConsumerAcquireKHR(display, context, streamObject);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglStreamConsumerAcquireKHR",
-                         GetStreamIfValid(display, streamObject));
-        return EGL_FALSE;
-    }
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglStreamConsumerAcquireKHR",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    error = streamObject->consumerAcquire(context);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglStreamConsumerAcquireKHR",
-                         GetStreamIfValid(display, streamObject));
-        return EGL_FALSE;
-    }
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-EGLBoolean EGLAPIENTRY EGL_StreamConsumerReleaseKHR(EGLDisplay dpy, EGLStreamKHR stream)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLStreamKHR = 0x%016" PRIxPTR, (uintptr_t)dpy,
-               (uintptr_t)stream);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    Stream *streamObject  = static_cast<Stream *>(stream);
-    gl::Context *context  = gl::GetValidGlobalContext();
-
-    Error error = ValidateStreamConsumerReleaseKHR(display, context, streamObject);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglSStreamConsumerReleaseKHR",
-                         GetStreamIfValid(display, streamObject));
-        return EGL_FALSE;
-    }
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglStreamConsumerReleaseKHR",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    error = streamObject->consumerRelease(context);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglStreamConsumerReleaseKHR",
-                         GetStreamIfValid(display, streamObject));
-        return EGL_FALSE;
-    }
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-EGLBoolean EGLAPIENTRY EGL_StreamConsumerGLTextureExternalAttribsNV(EGLDisplay dpy,
-                                                                    EGLStreamKHR stream,
-                                                                    const EGLAttrib *attrib_list)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLStreamKHR stream = 0x%016" PRIxPTR
-               ", EGLAttrib attrib_list = 0x%016" PRIxPTR "",
-               (uintptr_t)dpy, (uintptr_t)stream, (uintptr_t)attrib_list);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display   = static_cast<egl::Display *>(dpy);
-    Stream *streamObject    = static_cast<Stream *>(stream);
-    gl::Context *context    = gl::GetValidGlobalContext();
-    AttributeMap attributes = AttributeMap::CreateFromAttribArray(attrib_list);
-
-    Error error = ValidateStreamConsumerGLTextureExternalAttribsNV(display, context, streamObject,
-                                                                   attributes);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglStreamConsumerGLTextureExternalAttribsNV",
-                         GetStreamIfValid(display, streamObject));
-        return EGL_FALSE;
-    }
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(),
-                         "eglStreamConsumerGLTextureExternalAttribsNV", GetDisplayIfValid(display),
-                         EGL_FALSE);
-    error = streamObject->createConsumerGLTextureExternal(attributes, context);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglStreamConsumerGLTextureExternalAttribsNV",
-                         GetStreamIfValid(display, streamObject));
-        return EGL_FALSE;
-    }
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-EGLBoolean EGLAPIENTRY EGL_CreateStreamProducerD3DTextureANGLE(EGLDisplay dpy,
-                                                               EGLStreamKHR stream,
-                                                               const EGLAttrib *attrib_list)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLStreamKHR stream = 0x%016" PRIxPTR
-               ", EGLAttrib attrib_list = 0x%016" PRIxPTR "",
-               (uintptr_t)dpy, (uintptr_t)stream, (uintptr_t)attrib_list);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display   = static_cast<egl::Display *>(dpy);
-    Stream *streamObject    = static_cast<Stream *>(stream);
-    AttributeMap attributes = AttributeMap::CreateFromAttribArray(attrib_list);
-
-    Error error = ValidateCreateStreamProducerD3DTextureANGLE(display, streamObject, attributes);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglCreateStreamProducerD3DTextureANGLE",
-                         GetStreamIfValid(display, streamObject));
-        return EGL_FALSE;
-    }
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(),
-                         "eglCreateStreamProducerD3DTextureANGLE", GetDisplayIfValid(display),
-                         EGL_FALSE);
-    error = streamObject->createProducerD3D11Texture(attributes);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglCreateStreamProducerD3DTextureANGLE",
-                         GetStreamIfValid(display, streamObject));
-        return EGL_FALSE;
-    }
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-EGLBoolean EGLAPIENTRY EGL_StreamPostD3DTextureANGLE(EGLDisplay dpy,
-                                                     EGLStreamKHR stream,
-                                                     void *texture,
-                                                     const EGLAttrib *attrib_list)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLStreamKHR stream = 0x%016" PRIxPTR
-               ", void* texture = 0x%016" PRIxPTR
-               ", "
-               "EGLAttrib attrib_list = 0x%016" PRIxPTR "",
-               (uintptr_t)dpy, (uintptr_t)stream, (uintptr_t)texture, (uintptr_t)attrib_list);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display   = static_cast<egl::Display *>(dpy);
-    Stream *streamObject    = static_cast<Stream *>(stream);
-    AttributeMap attributes = AttributeMap::CreateFromAttribArray(attrib_list);
-
-    Error error = ValidateStreamPostD3DTextureANGLE(display, streamObject, texture, attributes);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglStreamPostD3DTextureANGLE",
-                         GetStreamIfValid(display, streamObject));
-        return EGL_FALSE;
-    }
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglStreamPostD3DTextureANGLE",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    error = streamObject->postD3D11Texture(texture, attributes);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglStreamPostD3DTextureANGLE",
-                         GetStreamIfValid(display, streamObject));
-        return EGL_FALSE;
-    }
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-// EGL_KHR_fence_sync
-ANGLE_EXPORT EGLSync EGLAPIENTRY EGL_CreateSyncKHR(EGLDisplay dpy,
-                                                   EGLenum type,
-                                                   const EGLint *attrib_list)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR
-               ", EGLenum type = 0x%X, const EGLint* attrib_list = 0x%016" PRIxPTR,
-               (uintptr_t)dpy, type, (uintptr_t)attrib_list);
-
-    Thread *thread          = egl::GetCurrentThread();
-    egl::Display *display   = static_cast<egl::Display *>(dpy);
-    AttributeMap attributes = AttributeMap::CreateFromIntArray(attrib_list);
-
-    gl::Context *currentContext  = thread->getContext();
-    egl::Display *currentDisplay = currentContext ? currentContext->getDisplay() : nullptr;
-
-    ANGLE_EGL_TRY_RETURN(
-        thread, ValidateCreateSyncKHR(display, type, attributes, currentDisplay, currentContext),
-        "eglCreateSync", GetDisplayIfValid(display), EGL_NO_SYNC);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglCreateSync",
-                         GetDisplayIfValid(display), EGL_NO_SYNC);
-    egl::Sync *syncObject = nullptr;
-    ANGLE_EGL_TRY_RETURN(thread, display->createSync(currentContext, type, attributes, &syncObject),
-                         "eglCreateSync", GetDisplayIfValid(display), EGL_NO_SYNC);
-
-    thread->setSuccess();
-    return static_cast<EGLSync>(syncObject);
-}
-
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_DestroySyncKHR(EGLDisplay dpy, EGLSync sync)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLSync sync = 0x%016" PRIxPTR, (uintptr_t)dpy,
-               (uintptr_t)sync);
-
-    Thread *thread        = egl::GetCurrentThread();
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    egl::Sync *syncObject = static_cast<Sync *>(sync);
-
-    ANGLE_EGL_TRY_RETURN(thread, ValidateDestroySync(display, syncObject), "eglDestroySync",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglDestroySync",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    display->destroySync(syncObject);
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-ANGLE_EXPORT EGLint EGLAPIENTRY EGL_ClientWaitSyncKHR(EGLDisplay dpy,
-                                                      EGLSync sync,
-                                                      EGLint flags,
-                                                      EGLTime timeout)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLSync sync = 0x%016" PRIxPTR
-               ", EGLint flags = 0x%X, EGLTime timeout = "
-               "%llu",
-               (uintptr_t)dpy, (uintptr_t)sync, flags, static_cast<unsigned long long>(timeout));
-
-    Thread *thread        = egl::GetCurrentThread();
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    egl::Sync *syncObject = static_cast<Sync *>(sync);
-
-    ANGLE_EGL_TRY_RETURN(thread, ValidateClientWaitSync(display, syncObject, flags, timeout),
-                         "eglClientWaitSync", GetSyncIfValid(display, syncObject), EGL_FALSE);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglClientWaitSync",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    gl::Context *currentContext = thread->getContext();
-    EGLint syncStatus           = EGL_FALSE;
-    ANGLE_EGL_TRY_RETURN(
-        thread, syncObject->clientWait(display, currentContext, flags, timeout, &syncStatus),
-        "eglClientWaitSync", GetSyncIfValid(display, syncObject), EGL_FALSE);
-
-    thread->setSuccess();
-    return syncStatus;
-}
-
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_GetSyncAttribKHR(EGLDisplay dpy,
-                                                         EGLSync sync,
-                                                         EGLint attribute,
-                                                         EGLint *value)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLSync sync = 0x%016" PRIxPTR
-               ", EGLint attribute = 0x%X, EGLAttrib "
-               "*value = 0x%016" PRIxPTR,
-               (uintptr_t)dpy, (uintptr_t)sync, attribute, (uintptr_t)value);
-
-    Thread *thread        = egl::GetCurrentThread();
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    egl::Sync *syncObject = static_cast<Sync *>(sync);
-
-    ANGLE_EGL_TRY_RETURN(thread, ValidateGetSyncAttribKHR(display, syncObject, attribute, value),
-                         "eglGetSyncAttrib", GetSyncIfValid(display, syncObject), EGL_FALSE);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglGetSyncAttrib",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    ANGLE_EGL_TRY_RETURN(thread, GetSyncAttrib(display, syncObject, attribute, value),
-                         "eglGetSyncAttrib", GetSyncIfValid(display, syncObject), EGL_FALSE);
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-// EGL_KHR_wait_sync
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_WaitSyncKHR(EGLDisplay dpy, EGLSync sync, EGLint flags)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR "p, EGLSync sync = 0x%016" PRIxPTR
-               ", EGLint flags = 0x%X",
-               (uintptr_t)dpy, (uintptr_t)sync, flags);
-
-    Thread *thread        = egl::GetCurrentThread();
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    gl::Context *context  = thread->getContext();
-    egl::Sync *syncObject = static_cast<Sync *>(sync);
-
-    ANGLE_EGL_TRY_RETURN(thread, ValidateWaitSync(display, context, syncObject, flags),
-                         "eglWaitSync", GetSyncIfValid(display, syncObject), EGL_FALSE);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglWaitSync",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    gl::Context *currentContext = thread->getContext();
-    ANGLE_EGL_TRY_RETURN(thread, syncObject->serverWait(display, currentContext, flags),
-                         "eglWaitSync", GetSyncIfValid(display, syncObject), EGL_FALSE);
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-EGLBoolean EGLAPIENTRY EGL_GetMscRateANGLE(EGLDisplay dpy,
-                                           EGLSurface surface,
-                                           EGLint *numerator,
-                                           EGLint *denominator)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLSurface surface = 0x%016" PRIxPTR
-               ", EGLint* numerator = 0x%016" PRIxPTR
-               ", "
-               "EGLint* denomintor = 0x%016" PRIxPTR "",
-               (uintptr_t)dpy, (uintptr_t)surface, (uintptr_t)numerator, (uintptr_t)denominator);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    Surface *eglSurface   = static_cast<Surface *>(surface);
-
-    Error error = ValidateGetMscRateANGLE(display, eglSurface, numerator, denominator);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglGetMscRateANGLE",
-                         GetSurfaceIfValid(display, eglSurface));
-        return EGL_FALSE;
-    }
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglGetMscRateANGLE",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    error = eglSurface->getMscRate(numerator, denominator);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglGetMscRateANGLE",
-                         GetSurfaceIfValid(display, eglSurface));
-        return EGL_FALSE;
-    }
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-EGLBoolean EGLAPIENTRY EGL_GetSyncValuesCHROMIUM(EGLDisplay dpy,
-                                                 EGLSurface surface,
-                                                 EGLuint64KHR *ust,
-                                                 EGLuint64KHR *msc,
-                                                 EGLuint64KHR *sbc)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLSurface surface = 0x%016" PRIxPTR
-               ", EGLuint64KHR* ust = 0x%016" PRIxPTR
-               ", "
-               "EGLuint64KHR* msc = 0x%016" PRIxPTR ", EGLuint64KHR* sbc = 0x%016" PRIxPTR "",
-               (uintptr_t)dpy, (uintptr_t)surface, (uintptr_t)ust, (uintptr_t)msc, (uintptr_t)sbc);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    Surface *eglSurface   = static_cast<Surface *>(surface);
-
-    Error error = ValidateGetSyncValuesCHROMIUM(display, eglSurface, ust, msc, sbc);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglGetSyncValuesCHROMIUM",
-                         GetSurfaceIfValid(display, eglSurface));
-        return EGL_FALSE;
-    }
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglGetSyncValuesCHROMIUM",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    error = eglSurface->getSyncValues(ust, msc, sbc);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglGetSyncValuesCHROMIUM",
-                         GetSurfaceIfValid(display, eglSurface));
-        return EGL_FALSE;
-    }
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-EGLBoolean EGLAPIENTRY EGL_SwapBuffersWithDamageKHR(EGLDisplay dpy,
-                                                    EGLSurface surface,
-                                                    EGLint *rects,
-                                                    EGLint n_rects)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLSurface surface = 0x%016" PRIxPTR
-               ", EGLint *rects = 0x%016" PRIxPTR
-               ", EGLint "
-               "n_rects = %d",
-               (uintptr_t)dpy, (uintptr_t)surface, (uintptr_t)rects, n_rects);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    Surface *eglSurface   = static_cast<Surface *>(surface);
-
-    Error error = ValidateSwapBuffersWithDamageKHR(display, eglSurface, rects, n_rects);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglSwapBuffersWithDamageEXT",
-                         GetSurfaceIfValid(display, eglSurface));
-        return EGL_FALSE;
-    }
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglSwapBuffersWithDamageEXT",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    error = eglSurface->swapWithDamage(thread->getContext(), rects, n_rects);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglSwapBuffersWithDamageEXT",
-                         GetSurfaceIfValid(display, eglSurface));
-        return EGL_FALSE;
-    }
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-EGLBoolean EGLAPIENTRY EGL_PresentationTimeANDROID(EGLDisplay dpy,
-                                                   EGLSurface surface,
-                                                   EGLnsecsANDROID time)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLSurface surface = 0x%016" PRIxPTR
-               ", EGLnsecsANDROID time = %llu",
-               (uintptr_t)dpy, (uintptr_t)surface, static_cast<unsigned long long>(time));
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    Surface *eglSurface   = static_cast<Surface *>(surface);
-
-    ANGLE_EGL_TRY_RETURN(thread, ValidatePresentationTimeANDROID(display, eglSurface, time),
-                         "eglPresentationTimeANDROID", GetSurfaceIfValid(display, eglSurface),
-                         EGL_FALSE);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglPresentationTimeANDROID",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    ANGLE_EGL_TRY_RETURN(thread, eglSurface->setPresentationTime(time),
-                         "eglPresentationTimeANDROID", GetSurfaceIfValid(display, eglSurface),
-                         EGL_FALSE);
-
-    return EGL_TRUE;
-}
-
-ANGLE_EXPORT void EGLAPIENTRY EGL_SetBlobCacheFuncsANDROID(EGLDisplay dpy,
-                                                           EGLSetBlobFuncANDROID set,
-                                                           EGLGetBlobFuncANDROID get)
-{
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLSetBlobFuncANDROID set = 0x%016" PRIxPTR
-               ", EGLGetBlobFuncANDROID get "
-               "= 0x%016" PRIxPTR,
-               (uintptr_t)dpy, (uintptr_t)set, (uintptr_t)get);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-
-    ANGLE_EGL_TRY(thread, ValidateSetBlobCacheANDROID(display, set, get),
-                  "eglSetBlobCacheFuncsANDROID", GetDisplayIfValid(display));
-    ANGLE_EGL_TRY(thread, display->prepareForCall(), "eglSetBlobCacheFuncsANDROID",
-                  GetDisplayIfValid(display));
-    thread->setSuccess();
-    display->setBlobCacheFuncs(set, get);
-}
-
-EGLint EGLAPIENTRY EGL_ProgramCacheGetAttribANGLE(EGLDisplay dpy, EGLenum attrib)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLenum attrib = 0x%X", (uintptr_t)dpy, attrib);
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    Thread *thread        = egl::GetCurrentThread();
-
-    ANGLE_EGL_TRY_RETURN(thread, ValidateProgramCacheGetAttribANGLE(display, attrib),
-                         "eglProgramCacheGetAttribANGLE", GetDisplayIfValid(display), 0);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglProgramCacheGetAttribANGLE",
-                         GetDisplayIfValid(display), 0);
-    thread->setSuccess();
-    return display->programCacheGetAttrib(attrib);
-}
-
-void EGLAPIENTRY EGL_ProgramCacheQueryANGLE(EGLDisplay dpy,
-                                            EGLint index,
-                                            void *key,
-                                            EGLint *keysize,
-                                            void *binary,
-                                            EGLint *binarysize)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLint index = %d, void *key = 0x%016" PRIxPTR
-               ", EGLint *keysize = "
-               "0x%016" PRIxPTR ", void *binary = 0x%016" PRIxPTR ", EGLint *size = 0x%016" PRIxPTR,
-               (uintptr_t)dpy, index, (uintptr_t)key, (uintptr_t)keysize, (uintptr_t)binary,
-               (uintptr_t)binarysize);
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    Thread *thread        = egl::GetCurrentThread();
-
-    ANGLE_EGL_TRY(thread,
-                  ValidateProgramCacheQueryANGLE(display, index, key, keysize, binary, binarysize),
-                  "eglProgramCacheQueryANGLE", GetDisplayIfValid(display));
-    ANGLE_EGL_TRY(thread, display->prepareForCall(), "eglProgramCacheQueryANGLE",
-                  GetDisplayIfValid(display));
-    ANGLE_EGL_TRY(thread, display->programCacheQuery(index, key, keysize, binary, binarysize),
-                  "eglProgramCacheQueryANGLE", GetDisplayIfValid(display));
-
-    thread->setSuccess();
-}
-
-void EGLAPIENTRY EGL_ProgramCachePopulateANGLE(EGLDisplay dpy,
-                                               const void *key,
-                                               EGLint keysize,
-                                               const void *binary,
-                                               EGLint binarysize)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", void *key = 0x%016" PRIxPTR
-               ", EGLint keysize = %d, void *binary = "
-               "0x%016" PRIxPTR ", EGLint size = %d",
-               (uintptr_t)dpy, (uintptr_t)key, keysize, (uintptr_t)binary, binarysize);
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    Thread *thread        = egl::GetCurrentThread();
-
-    ANGLE_EGL_TRY(thread,
-                  ValidateProgramCachePopulateANGLE(display, key, keysize, binary, binarysize),
-                  "eglProgramCachePopulateANGLE", GetDisplayIfValid(display));
-    ANGLE_EGL_TRY(thread, display->prepareForCall(), "eglProgramCachePopulateANGLE",
-                  GetDisplayIfValid(display));
-    ANGLE_EGL_TRY(thread, display->programCachePopulate(key, keysize, binary, binarysize),
-                  "eglProgramCachePopulateANGLE", GetDisplayIfValid(display));
-
-    thread->setSuccess();
-}
-
-EGLint EGLAPIENTRY EGL_ProgramCacheResizeANGLE(EGLDisplay dpy, EGLint limit, EGLenum mode)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLint limit = %d, EGLenum mode = 0x%X",
-               (uintptr_t)dpy, limit, mode);
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    Thread *thread        = egl::GetCurrentThread();
-
-    ANGLE_EGL_TRY_RETURN(thread, ValidateProgramCacheResizeANGLE(display, limit, mode),
-                         "eglProgramCacheResizeANGLE", GetDisplayIfValid(display), 0);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglProgramCacheResizeANGLE",
-                         GetDisplayIfValid(display), 0);
-    thread->setSuccess();
-    return display->programCacheResize(limit, mode);
-}
-
-EGLint EGLAPIENTRY EGL_DebugMessageControlKHR(EGLDEBUGPROCKHR callback,
-                                              const EGLAttrib *attrib_list)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDEBUGPROCKHR callback = 0x%016" PRIxPTR
-               ", EGLAttrib attrib_list = 0x%016" PRIxPTR,
-               (uintptr_t)callback, (uintptr_t)attrib_list);
-
-    Thread *thread = egl::GetCurrentThread();
-
-    AttributeMap attributes = AttributeMap::CreateFromAttribArray(attrib_list);
-
-    Error error = ValidateDebugMessageControlKHR(callback, attributes);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglDebugMessageControlKHR", nullptr);
-        return error.getCode();
-    }
-
-    Debug *debug = GetDebug();
-    debug->setCallback(callback, attributes);
-
-    thread->setSuccess();
-    return EGL_SUCCESS;
-}
-
-EGLBoolean EGLAPIENTRY EGL_QueryDebugKHR(EGLint attribute, EGLAttrib *value)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLint attribute = 0x%X, EGLAttrib* value = 0x%016" PRIxPTR, attribute,
-               (uintptr_t)value);
-
-    Thread *thread = egl::GetCurrentThread();
-
-    Error error = ValidateQueryDebugKHR(attribute, value);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglQueryDebugKHR", nullptr);
-        return EGL_FALSE;
-    }
-
-    Debug *debug = GetDebug();
-    switch (attribute)
-    {
-        case EGL_DEBUG_MSG_CRITICAL_KHR:
-        case EGL_DEBUG_MSG_ERROR_KHR:
-        case EGL_DEBUG_MSG_WARN_KHR:
-        case EGL_DEBUG_MSG_INFO_KHR:
-            *value = debug->isMessageTypeEnabled(FromEGLenum<MessageType>(attribute)) ? EGL_TRUE
-                                                                                      : EGL_FALSE;
-            break;
-        case EGL_DEBUG_CALLBACK_KHR:
-            *value = reinterpret_cast<EGLAttrib>(debug->getCallback());
-            break;
-
-        default:
-            UNREACHABLE();
-    }
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-EGLint EGLAPIENTRY EGL_LabelObjectKHR(EGLDisplay dpy,
-                                      EGLenum objectType,
-                                      EGLObjectKHR object,
-                                      EGLLabelKHR label)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR
-               ", EGLenum objectType = 0x%X, EGLObjectKHR object = 0x%016" PRIxPTR
-               ", "
-               "EGLLabelKHR label = 0x%016" PRIxPTR,
-               (uintptr_t)dpy, objectType, (uintptr_t)object, (uintptr_t)label);
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    Thread *thread        = egl::GetCurrentThread();
-
-    ObjectType objectTypePacked = FromEGLenum<ObjectType>(objectType);
-    Error error = ValidateLabelObjectKHR(thread, display, objectTypePacked, object, label);
-    if (error.isError())
-    {
-        thread->setError(error, GetDebug(), "eglLabelObjectKHR",
-                         GetLabeledObjectIfValid(thread, display, objectTypePacked, object));
-        return error.getCode();
-    }
-    if (display)
-    {
-        error = display->prepareForCall();
-        if (error.isError())
-        {
-            thread->setError(error, GetDebug(), "eglLabelObjectKHR", GetDisplayIfValid(display));
-            return error.getCode();
-        }
-    }
-    LabeledObject *labeledObject =
-        GetLabeledObjectIfValid(thread, display, objectTypePacked, object);
-    ASSERT(labeledObject != nullptr);
-    labeledObject->setLabel(label);
-
-    thread->setSuccess();
-    return EGL_SUCCESS;
-}
-
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_GetCompositorTimingSupportedANDROID(EGLDisplay dpy,
-                                                                            EGLSurface surface,
-                                                                            EGLint name)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLSurface surface = 0x%016" PRIxPTR
-               ", EGLint name = 0x%X",
-               (uintptr_t)dpy, (uintptr_t)surface, name);
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    Surface *eglSurface   = static_cast<Surface *>(surface);
-    Thread *thread        = egl::GetCurrentThread();
-
-    CompositorTiming nameInternal = FromEGLenum<CompositorTiming>(name);
-
-    ANGLE_EGL_TRY_RETURN(
-        thread, ValidateGetCompositorTimingSupportedANDROID(display, eglSurface, nameInternal),
-        "eglQueryTimestampSupportedANDROID", GetSurfaceIfValid(display, eglSurface), EGL_FALSE);
-
-    thread->setSuccess();
-    return eglSurface->getSupportedCompositorTimings().test(nameInternal);
-}
-
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_GetCompositorTimingANDROID(EGLDisplay dpy,
-                                                                   EGLSurface surface,
-                                                                   EGLint numTimestamps,
-                                                                   const EGLint *names,
-                                                                   EGLnsecsANDROID *values)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLSurface surface = 0x%016" PRIxPTR
-               ", EGLint numTimestamps = %d, const EGLint *names = 0x%016" PRIxPTR
-               ", EGLnsecsANDROID *values = 0x%016" PRIxPTR,
-               (uintptr_t)dpy, (uintptr_t)surface, numTimestamps, (uintptr_t)names,
-               (uintptr_t)values);
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    Surface *eglSurface   = static_cast<Surface *>(surface);
-    Thread *thread        = egl::GetCurrentThread();
-
-    ANGLE_EGL_TRY_RETURN(
-        thread,
-        ValidateGetCompositorTimingANDROID(display, eglSurface, numTimestamps, names, values),
-        "eglGetCompositorTimingANDROIDD", GetSurfaceIfValid(display, eglSurface), EGL_FALSE);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglGetCompositorTimingANDROIDD",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    ANGLE_EGL_TRY_RETURN(thread, eglSurface->getCompositorTiming(numTimestamps, names, values),
-                         "eglGetCompositorTimingANDROIDD", GetSurfaceIfValid(display, eglSurface),
-                         EGL_FALSE);
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_GetNextFrameIdANDROID(EGLDisplay dpy,
-                                                              EGLSurface surface,
-                                                              EGLuint64KHR *frameId)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLSurface surface = 0x%016" PRIxPTR
-               ", EGLuint64KHR *frameId = 0x%016" PRIxPTR,
-               (uintptr_t)dpy, (uintptr_t)surface, (uintptr_t)frameId);
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    Surface *eglSurface   = static_cast<Surface *>(surface);
-    Thread *thread        = egl::GetCurrentThread();
-
-    ANGLE_EGL_TRY_RETURN(thread, ValidateGetNextFrameIdANDROID(display, eglSurface, frameId),
-                         "eglGetNextFrameIdANDROID", GetSurfaceIfValid(display, eglSurface),
-                         EGL_FALSE);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglGetNextFrameIdANDROID",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    ANGLE_EGL_TRY_RETURN(thread, eglSurface->getNextFrameId(frameId), "eglGetNextFrameIdANDROID",
-                         GetSurfaceIfValid(display, eglSurface), EGL_FALSE);
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_GetFrameTimestampSupportedANDROID(EGLDisplay dpy,
-                                                                          EGLSurface surface,
-                                                                          EGLint timestamp)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLSurface surface = 0x%016" PRIxPTR
-               ", EGLint timestamp = 0x%X",
-               (uintptr_t)dpy, (uintptr_t)surface, timestamp);
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    Surface *eglSurface   = static_cast<Surface *>(surface);
-    Thread *thread        = egl::GetCurrentThread();
-
-    Timestamp timestampInternal = FromEGLenum<Timestamp>(timestamp);
-
-    ANGLE_EGL_TRY_RETURN(
-        thread, ValidateGetFrameTimestampSupportedANDROID(display, eglSurface, timestampInternal),
-        "eglQueryTimestampSupportedANDROID", GetSurfaceIfValid(display, eglSurface), EGL_FALSE);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglQueryTimestampSupportedANDROID",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    thread->setSuccess();
-    return eglSurface->getSupportedTimestamps().test(timestampInternal);
-}
-
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_GetFrameTimestampsANDROID(EGLDisplay dpy,
-                                                                  EGLSurface surface,
-                                                                  EGLuint64KHR frameId,
-                                                                  EGLint numTimestamps,
-                                                                  const EGLint *timestamps,
-                                                                  EGLnsecsANDROID *values)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT(
-        "EGLDisplay dpy = 0x%016" PRIxPTR ", EGLSurface surface = 0x%016" PRIxPTR
-        ", EGLuint64KHR frameId = %llu, EGLint numTimestamps = %d, const EGLint *timestamps = "
-        "0x%016" PRIxPTR ", EGLnsecsANDROID *values = 0x%016" PRIxPTR,
-        (uintptr_t)dpy, (uintptr_t)surface, (unsigned long long)frameId, numTimestamps,
-        (uintptr_t)timestamps, (uintptr_t)values);
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    Surface *eglSurface   = static_cast<Surface *>(surface);
-    Thread *thread        = egl::GetCurrentThread();
-
-    ANGLE_EGL_TRY_RETURN(thread,
-                         ValidateGetFrameTimestampsANDROID(display, eglSurface, frameId,
-                                                           numTimestamps, timestamps, values),
-                         "eglGetFrameTimestampsANDROID", GetSurfaceIfValid(display, eglSurface),
-                         EGL_FALSE);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglGetFrameTimestampsANDROID",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    ANGLE_EGL_TRY_RETURN(
-        thread, eglSurface->getFrameTimestamps(frameId, numTimestamps, timestamps, values),
-        "eglGetFrameTimestampsANDROID", GetSurfaceIfValid(display, eglSurface), EGL_FALSE);
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-// EGL_ANGLE_feature_control
-ANGLE_EXPORT const char *EGLAPIENTRY EGL_QueryStringiANGLE(EGLDisplay dpy,
-                                                           EGLint name,
-                                                           EGLint index)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLint name = %d, EGLint index = %d",
-               (uintptr_t)dpy, name, index);
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    Thread *thread        = egl::GetCurrentThread();
-
-    ANGLE_EGL_TRY_RETURN(thread, ValidateQueryStringiANGLE(display, name, index),
-                         "eglQueryStringiANGLE", GetDisplayIfValid(display), nullptr);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglQueryStringiANGLE",
-                         GetDisplayIfValid(display), nullptr);
-    thread->setSuccess();
-    return display->queryStringi(name, index);
-}
-
-EGLClientBuffer EGLAPIENTRY EGL_GetNativeClientBufferANDROID(const struct AHardwareBuffer *buffer)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("const struct AHardwareBuffer *buffer = 0x%016" PRIxPTR, (uintptr_t)buffer);
-
-    Thread *thread = egl::GetCurrentThread();
-
-    ANGLE_EGL_TRY_RETURN(thread, ValidateGetNativeClientBufferANDROID(buffer),
-                         "eglGetNativeClientBufferANDROID", nullptr, nullptr);
-
-    thread->setSuccess();
-    return egl::Display::GetNativeClientBuffer(buffer);
-}
-
-EGLClientBuffer EGLAPIENTRY EGL_CreateNativeClientBufferANDROID(const EGLint *attrib_list)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("const EGLint *attrib_list = 0x%016" PRIxPTR, (uintptr_t)attrib_list);
-
-    Thread *thread = egl::GetCurrentThread();
-    ANGLE_EGL_TRY_RETURN(thread,
-                         (attrib_list == nullptr || attrib_list[0] == EGL_NONE)
-                             ? egl::EglBadParameter() << "invalid attribute list."
-                             : NoError(),
-                         "eglCreateNativeClientBufferANDROID", nullptr, nullptr);
-
-    const AttributeMap &attribMap = AttributeMap::CreateFromIntArray(attrib_list);
-    ANGLE_EGL_TRY_RETURN(thread, ValidateCreateNativeClientBufferANDROID(attribMap),
-                         "eglCreateNativeClientBufferANDROID", nullptr, nullptr);
-
-    EGLClientBuffer eglClientBuffer = nullptr;
-    ANGLE_EGL_TRY_RETURN(thread,
-                         egl::Display::CreateNativeClientBuffer(attribMap, &eglClientBuffer),
-                         "eglCreateNativeClientBufferANDROID", nullptr, nullptr);
-
-    thread->setSuccess();
-    return eglClientBuffer;
-}
-
-EGLint EGLAPIENTRY EGL_DupNativeFenceFDANDROID(EGLDisplay dpy, EGLSyncKHR sync)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLSyncKHR sync = 0x%016" PRIxPTR,
-               (uintptr_t)dpy, (uintptr_t)sync);
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    Sync *syncObject      = static_cast<Sync *>(sync);
-    Thread *thread        = egl::GetCurrentThread();
-
-    ANGLE_EGL_TRY_RETURN(thread, ValidateDupNativeFenceFDANDROID(display, syncObject),
-                         "eglDupNativeFenceFDANDROID", GetSyncIfValid(display, syncObject),
-                         EGL_NO_NATIVE_FENCE_FD_ANDROID);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglDupNativeFenceFDANDROID",
-                         GetDisplayIfValid(display), EGL_NO_NATIVE_FENCE_FD_ANDROID);
-    EGLint result = EGL_NO_NATIVE_FENCE_FD_ANDROID;
-    ANGLE_EGL_TRY_RETURN(thread, syncObject->dupNativeFenceFD(display, &result),
-                         "eglDupNativeFenceFDANDROID", GetSyncIfValid(display, syncObject),
-                         EGL_NO_NATIVE_FENCE_FD_ANDROID);
-
-    thread->setSuccess();
-    return result;
-}
-
-EGLBoolean EGLAPIENTRY EGL_SwapBuffersWithFrameTokenANGLE(EGLDisplay dpy,
-                                                          EGLSurface surface,
-                                                          EGLFrameTokenANGLE frametoken)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLSurface surface = 0x%016" PRIxPTR
-               ", EGLFrameTokenANGLE frametoken = 0x%llX",
-               (uintptr_t)dpy, (uintptr_t)surface, (unsigned long long)frametoken);
-
-    egl::Display *display    = static_cast<egl::Display *>(dpy);
-    egl::Surface *eglSurface = static_cast<egl::Surface *>(surface);
-    Thread *thread           = egl::GetCurrentThread();
-
-    ANGLE_EGL_TRY_RETURN(
-        thread, ValidateSwapBuffersWithFrameTokenANGLE(display, eglSurface, frametoken),
-        "eglSwapBuffersWithFrameTokenANGLE", GetDisplayIfValid(display), EGL_FALSE);
-    ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglSwapBuffersWithFrameTokenANGLE",
-                         GetDisplayIfValid(display), EGL_FALSE);
-    ANGLE_EGL_TRY_RETURN(thread, eglSurface->swapWithFrameToken(thread->getContext(), frametoken),
-                         "eglSwapBuffersWithFrameTokenANGLE", GetDisplayIfValid(display),
-                         EGL_FALSE);
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-void EGLAPIENTRY EGL_ReleaseHighPowerGPUANGLE(EGLDisplay dpy, EGLContext ctx)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLContext ctx = 0x%016" PRIxPTR,
-               (uintptr_t)dpy, (uintptr_t)ctx);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    gl::Context *context  = static_cast<gl::Context *>(ctx);
-
-    ANGLE_EGL_TRY(thread, ValidateContext(display, context), "eglReleaseHighPowerGPUANGLE",
-                  GetDisplayIfValid(display));
-    ANGLE_EGL_TRY(thread, display->prepareForCall(), "eglReleaseHighPowerGPUANGLE",
-                  GetDisplayIfValid(display));
-    ANGLE_EGL_TRY(thread, context->releaseHighPowerGPU(), "eglReleaseHighPowerGPUANGLE",
-                  GetDisplayIfValid(display));
-
-    thread->setSuccess();
-}
-
-void EGLAPIENTRY EGL_ReacquireHighPowerGPUANGLE(EGLDisplay dpy, EGLContext ctx)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLContext ctx = 0x%016" PRIxPTR,
-               (uintptr_t)dpy, (uintptr_t)ctx);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    gl::Context *context  = static_cast<gl::Context *>(ctx);
-
-    ANGLE_EGL_TRY(thread, ValidateContext(display, context), "eglReacquireHighPowerGPUANGLE",
-                  GetDisplayIfValid(display));
-    ANGLE_EGL_TRY(thread, display->prepareForCall(), "eglReacquireHighPowerGPUANGLE",
-                  GetDisplayIfValid(display));
-    ANGLE_EGL_TRY(thread, context->reacquireHighPowerGPU(), "eglReacquireHighPowerGPUANGLE",
-                  GetDisplayIfValid(display));
-
-    thread->setSuccess();
-}
-
-void EGLAPIENTRY EGL_HandleGPUSwitchANGLE(EGLDisplay dpy)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR, (uintptr_t)dpy);
-    Thread *thread = egl::GetCurrentThread();
-
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-
-    ANGLE_EGL_TRY(thread, ValidateDisplay(display), "eglHandleGPUSwitchANGLE",
-                  GetDisplayIfValid(display));
-    ANGLE_EGL_TRY(thread, display->prepareForCall(), "eglHandleGPUSwitchANGLE",
-                  GetDisplayIfValid(display));
-    ANGLE_EGL_TRY(thread, display->handleGPUSwitch(), "eglHandleGPUSwitchANGLE",
-                  GetDisplayIfValid(display));
-
-    thread->setSuccess();
-}
-
-// EGL_KHR_reusable_sync
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_SignalSyncKHR(EGLDisplay dpy, EGLSync sync, EGLenum mode)
-{
-    ANGLE_SCOPED_GLOBAL_LOCK();
-    FUNC_EVENT("EGLDisplay dpy = 0x%016" PRIxPTR ", EGLSync sync = 0x%016" PRIxPTR
-               ", EGLint mode = 0x%X",
-               (uintptr_t)dpy, (uintptr_t)sync, mode);
-
-    Thread *thread        = egl::GetCurrentThread();
-    egl::Display *display = static_cast<egl::Display *>(dpy);
-    egl::Sync *syncObject = static_cast<Sync *>(sync);
-
-    ANGLE_EGL_TRY_RETURN(thread, ValidateSignalSyncKHR(display, syncObject, mode),
-                         "eglSignalSyncKHR", GetSyncIfValid(display, syncObject), EGL_FALSE);
-
-    gl::Context *currentContext = thread->getContext();
-    ANGLE_EGL_TRY_RETURN(thread, syncObject->signal(display, currentContext, mode),
-                         "eglSignalSyncKHR", GetSyncIfValid(display, syncObject), EGL_FALSE);
-
-    thread->setSuccess();
-    return EGL_TRUE;
-}
-
-}  // extern "C"
diff --git a/src/libGLESv2/entry_points_egl_ext_autogen.cpp b/src/libGLESv2/entry_points_egl_ext_autogen.cpp
new file mode 100644
index 0000000..24e32c0
--- /dev/null
+++ b/src/libGLESv2/entry_points_egl_ext_autogen.cpp
@@ -0,0 +1,1126 @@
+// GENERATED FILE - DO NOT EDIT.
+// Generated by generate_entry_points.py using data from egl.xml and egl_angle_ext.xml.
+//
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// entry_points_egl_ext_autogen.cpp:
+//   Defines the EGL Extension entry points.
+
+#include "libGLESv2/entry_points_egl_ext_autogen.h"
+
+#include "libANGLE/entry_points_utils.h"
+#include "libANGLE/validationEGL_autogen.h"
+#include "libGLESv2/egl_ext_stubs_autogen.h"
+#include "libGLESv2/global_state.h"
+
+using namespace egl;
+
+extern "C" {
+
+// EGL_ANDROID_blob_cache
+void EGLAPIENTRY EGL_SetBlobCacheFuncsANDROID(EGLDisplay dpy,
+                                              EGLSetBlobFuncANDROID set,
+                                              EGLGetBlobFuncANDROID get)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(SetBlobCacheFuncsANDROID,
+              "dpy = 0x%016" PRIxPTR ", set = 0x%016" PRIxPTR ", get = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, (uintptr_t)set, (uintptr_t)get);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+
+    ANGLE_EGL_VALIDATE_VOID(thread, SetBlobCacheFuncsANDROID, GetDisplayIfValid(dpyPacked),
+                            dpyPacked, set, get);
+
+    SetBlobCacheFuncsANDROID(thread, dpyPacked, set, get);
+}
+
+// EGL_ANDROID_create_native_client_buffer
+EGLClientBuffer EGLAPIENTRY EGL_CreateNativeClientBufferANDROID(const EGLint *attrib_list)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(CreateNativeClientBufferANDROID, "attrib_list = 0x%016" PRIxPTR "",
+              (uintptr_t)attrib_list);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    const AttributeMap &attrib_listPacked = PackParam<const AttributeMap &>(attrib_list);
+
+    ANGLE_EGL_VALIDATE(thread, CreateNativeClientBufferANDROID, nullptr, EGLClientBuffer,
+                       attrib_listPacked);
+
+    return CreateNativeClientBufferANDROID(thread, attrib_listPacked);
+}
+
+// EGL_ANDROID_get_frame_timestamps
+EGLBoolean EGLAPIENTRY EGL_GetCompositorTimingSupportedANDROID(EGLDisplay dpy,
+                                                               EGLSurface surface,
+                                                               EGLint name)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(GetCompositorTimingSupportedANDROID,
+              "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR ", name = %d", (uintptr_t)dpy,
+              (uintptr_t)surface, name);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked     = PackParam<egl::Display *>(dpy);
+    Surface *surfacePacked      = PackParam<Surface *>(surface);
+    CompositorTiming namePacked = PackParam<CompositorTiming>(name);
+
+    ANGLE_EGL_VALIDATE(thread, GetCompositorTimingSupportedANDROID, GetDisplayIfValid(dpyPacked),
+                       EGLBoolean, dpyPacked, surfacePacked, namePacked);
+
+    return GetCompositorTimingSupportedANDROID(thread, dpyPacked, surfacePacked, namePacked);
+}
+
+EGLBoolean EGLAPIENTRY EGL_GetCompositorTimingANDROID(EGLDisplay dpy,
+                                                      EGLSurface surface,
+                                                      EGLint numTimestamps,
+                                                      const EGLint *names,
+                                                      EGLnsecsANDROID *values)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(GetCompositorTimingANDROID,
+              "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR
+              ", numTimestamps = %d, names = 0x%016" PRIxPTR ", values = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, (uintptr_t)surface, numTimestamps, (uintptr_t)names,
+              (uintptr_t)values);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    Surface *surfacePacked  = PackParam<Surface *>(surface);
+
+    ANGLE_EGL_VALIDATE(thread, GetCompositorTimingANDROID, GetDisplayIfValid(dpyPacked), EGLBoolean,
+                       dpyPacked, surfacePacked, numTimestamps, names, values);
+
+    return GetCompositorTimingANDROID(thread, dpyPacked, surfacePacked, numTimestamps, names,
+                                      values);
+}
+
+EGLBoolean EGLAPIENTRY EGL_GetNextFrameIdANDROID(EGLDisplay dpy,
+                                                 EGLSurface surface,
+                                                 EGLuint64KHR *frameId)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(GetNextFrameIdANDROID,
+              "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR ", frameId = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, (uintptr_t)surface, (uintptr_t)frameId);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    Surface *surfacePacked  = PackParam<Surface *>(surface);
+
+    ANGLE_EGL_VALIDATE(thread, GetNextFrameIdANDROID, GetDisplayIfValid(dpyPacked), EGLBoolean,
+                       dpyPacked, surfacePacked, frameId);
+
+    return GetNextFrameIdANDROID(thread, dpyPacked, surfacePacked, frameId);
+}
+
+EGLBoolean EGLAPIENTRY EGL_GetFrameTimestampSupportedANDROID(EGLDisplay dpy,
+                                                             EGLSurface surface,
+                                                             EGLint timestamp)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(GetFrameTimestampSupportedANDROID,
+              "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR ", timestamp = %d",
+              (uintptr_t)dpy, (uintptr_t)surface, timestamp);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked   = PackParam<egl::Display *>(dpy);
+    Surface *surfacePacked    = PackParam<Surface *>(surface);
+    Timestamp timestampPacked = PackParam<Timestamp>(timestamp);
+
+    ANGLE_EGL_VALIDATE(thread, GetFrameTimestampSupportedANDROID, GetDisplayIfValid(dpyPacked),
+                       EGLBoolean, dpyPacked, surfacePacked, timestampPacked);
+
+    return GetFrameTimestampSupportedANDROID(thread, dpyPacked, surfacePacked, timestampPacked);
+}
+
+EGLBoolean EGLAPIENTRY EGL_GetFrameTimestampsANDROID(EGLDisplay dpy,
+                                                     EGLSurface surface,
+                                                     EGLuint64KHR frameId,
+                                                     EGLint numTimestamps,
+                                                     const EGLint *timestamps,
+                                                     EGLnsecsANDROID *values)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(GetFrameTimestampsANDROID,
+              "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR
+              ", frameId = %llu, numTimestamps = %d, timestamps = 0x%016" PRIxPTR
+              ", values = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, (uintptr_t)surface, static_cast<unsigned long long>(frameId),
+              numTimestamps, (uintptr_t)timestamps, (uintptr_t)values);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    Surface *surfacePacked  = PackParam<Surface *>(surface);
+
+    ANGLE_EGL_VALIDATE(thread, GetFrameTimestampsANDROID, GetDisplayIfValid(dpyPacked), EGLBoolean,
+                       dpyPacked, surfacePacked, frameId, numTimestamps, timestamps, values);
+
+    return GetFrameTimestampsANDROID(thread, dpyPacked, surfacePacked, frameId, numTimestamps,
+                                     timestamps, values);
+}
+
+// EGL_ANDROID_get_native_client_buffer
+EGLClientBuffer EGLAPIENTRY EGL_GetNativeClientBufferANDROID(const struct AHardwareBuffer *buffer)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(GetNativeClientBufferANDROID, "buffer = 0x%016" PRIxPTR "", (uintptr_t)buffer);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    ANGLE_EGL_VALIDATE(thread, GetNativeClientBufferANDROID, nullptr, EGLClientBuffer, buffer);
+
+    return GetNativeClientBufferANDROID(thread, buffer);
+}
+
+// EGL_ANDROID_native_fence_sync
+EGLint EGLAPIENTRY EGL_DupNativeFenceFDANDROID(EGLDisplay dpy, EGLSyncKHR sync)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(DupNativeFenceFDANDROID, "dpy = 0x%016" PRIxPTR ", sync = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, (uintptr_t)sync);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    Sync *syncPacked        = PackParam<Sync *>(sync);
+
+    ANGLE_EGL_VALIDATE(thread, DupNativeFenceFDANDROID, GetDisplayIfValid(dpyPacked), EGLint,
+                       dpyPacked, syncPacked);
+
+    return DupNativeFenceFDANDROID(thread, dpyPacked, syncPacked);
+}
+
+// EGL_ANDROID_presentation_time
+EGLBoolean EGLAPIENTRY EGL_PresentationTimeANDROID(EGLDisplay dpy,
+                                                   EGLSurface surface,
+                                                   EGLnsecsANDROID time)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(PresentationTimeANDROID,
+              "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR ", time = %llu", (uintptr_t)dpy,
+              (uintptr_t)surface, static_cast<unsigned long long>(time));
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    Surface *surfacePacked  = PackParam<Surface *>(surface);
+
+    ANGLE_EGL_VALIDATE(thread, PresentationTimeANDROID, GetDisplayIfValid(dpyPacked), EGLBoolean,
+                       dpyPacked, surfacePacked, time);
+
+    return PresentationTimeANDROID(thread, dpyPacked, surfacePacked, time);
+}
+
+// EGL_ANGLE_device_creation
+EGLDeviceEXT EGLAPIENTRY EGL_CreateDeviceANGLE(EGLint device_type,
+                                               void *native_device,
+                                               const EGLAttrib *attrib_list)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(CreateDeviceANGLE,
+              "device_type = %d, native_device = 0x%016" PRIxPTR ", attrib_list = 0x%016" PRIxPTR
+              "",
+              device_type, (uintptr_t)native_device, (uintptr_t)attrib_list);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    ANGLE_EGL_VALIDATE(thread, CreateDeviceANGLE, nullptr, EGLDeviceEXT, device_type, native_device,
+                       attrib_list);
+
+    return CreateDeviceANGLE(thread, device_type, native_device, attrib_list);
+}
+
+EGLBoolean EGLAPIENTRY EGL_ReleaseDeviceANGLE(EGLDeviceEXT device)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(ReleaseDeviceANGLE, "device = 0x%016" PRIxPTR "", (uintptr_t)device);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    Device *devicePacked = PackParam<Device *>(device);
+
+    ANGLE_EGL_VALIDATE(thread, ReleaseDeviceANGLE, nullptr, EGLBoolean, devicePacked);
+
+    return ReleaseDeviceANGLE(thread, devicePacked);
+}
+
+// EGL_ANGLE_feature_control
+const char *EGLAPIENTRY EGL_QueryStringiANGLE(EGLDisplay dpy, EGLint name, EGLint index)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(QueryStringiANGLE, "dpy = 0x%016" PRIxPTR ", name = %d, index = %d", (uintptr_t)dpy,
+              name, index);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+
+    ANGLE_EGL_VALIDATE(thread, QueryStringiANGLE, GetDisplayIfValid(dpyPacked), const char *,
+                       dpyPacked, name, index);
+
+    return QueryStringiANGLE(thread, dpyPacked, name, index);
+}
+
+EGLBoolean EGLAPIENTRY EGL_QueryDisplayAttribANGLE(EGLDisplay dpy,
+                                                   EGLint attribute,
+                                                   EGLAttrib *value)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(QueryDisplayAttribANGLE,
+              "dpy = 0x%016" PRIxPTR ", attribute = %d, value = 0x%016" PRIxPTR "", (uintptr_t)dpy,
+              attribute, (uintptr_t)value);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+
+    ANGLE_EGL_VALIDATE(thread, QueryDisplayAttribANGLE, GetDisplayIfValid(dpyPacked), EGLBoolean,
+                       dpyPacked, attribute, value);
+
+    return QueryDisplayAttribANGLE(thread, dpyPacked, attribute, value);
+}
+
+// EGL_ANGLE_power_preference
+void EGLAPIENTRY EGL_ReleaseHighPowerGPUANGLE(EGLDisplay dpy, EGLContext ctx)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(ReleaseHighPowerGPUANGLE, "dpy = 0x%016" PRIxPTR ", ctx = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, (uintptr_t)ctx);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    gl::Context *ctxPacked  = PackParam<gl::Context *>(ctx);
+
+    ANGLE_EGL_VALIDATE_VOID(thread, ReleaseHighPowerGPUANGLE, GetDisplayIfValid(dpyPacked),
+                            dpyPacked, ctxPacked);
+
+    ReleaseHighPowerGPUANGLE(thread, dpyPacked, ctxPacked);
+}
+
+void EGLAPIENTRY EGL_ReacquireHighPowerGPUANGLE(EGLDisplay dpy, EGLContext ctx)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(ReacquireHighPowerGPUANGLE, "dpy = 0x%016" PRIxPTR ", ctx = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, (uintptr_t)ctx);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    gl::Context *ctxPacked  = PackParam<gl::Context *>(ctx);
+
+    ANGLE_EGL_VALIDATE_VOID(thread, ReacquireHighPowerGPUANGLE, GetDisplayIfValid(dpyPacked),
+                            dpyPacked, ctxPacked);
+
+    ReacquireHighPowerGPUANGLE(thread, dpyPacked, ctxPacked);
+}
+
+void EGLAPIENTRY EGL_HandleGPUSwitchANGLE(EGLDisplay dpy)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(HandleGPUSwitchANGLE, "dpy = 0x%016" PRIxPTR "", (uintptr_t)dpy);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+
+    ANGLE_EGL_VALIDATE_VOID(thread, HandleGPUSwitchANGLE, GetDisplayIfValid(dpyPacked), dpyPacked);
+
+    HandleGPUSwitchANGLE(thread, dpyPacked);
+}
+
+// EGL_ANGLE_program_cache_control
+EGLint EGLAPIENTRY EGL_ProgramCacheGetAttribANGLE(EGLDisplay dpy, EGLenum attrib)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(ProgramCacheGetAttribANGLE, "dpy = 0x%016" PRIxPTR ", attrib = 0x%X", (uintptr_t)dpy,
+              attrib);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+
+    ANGLE_EGL_VALIDATE(thread, ProgramCacheGetAttribANGLE, GetDisplayIfValid(dpyPacked), EGLint,
+                       dpyPacked, attrib);
+
+    return ProgramCacheGetAttribANGLE(thread, dpyPacked, attrib);
+}
+
+void EGLAPIENTRY EGL_ProgramCacheQueryANGLE(EGLDisplay dpy,
+                                            EGLint index,
+                                            void *key,
+                                            EGLint *keysize,
+                                            void *binary,
+                                            EGLint *binarysize)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(ProgramCacheQueryANGLE,
+              "dpy = 0x%016" PRIxPTR ", index = %d, key = 0x%016" PRIxPTR
+              ", keysize = 0x%016" PRIxPTR ", binary = 0x%016" PRIxPTR
+              ", binarysize = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, index, (uintptr_t)key, (uintptr_t)keysize, (uintptr_t)binary,
+              (uintptr_t)binarysize);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+
+    ANGLE_EGL_VALIDATE_VOID(thread, ProgramCacheQueryANGLE, GetDisplayIfValid(dpyPacked), dpyPacked,
+                            index, key, keysize, binary, binarysize);
+
+    ProgramCacheQueryANGLE(thread, dpyPacked, index, key, keysize, binary, binarysize);
+}
+
+void EGLAPIENTRY EGL_ProgramCachePopulateANGLE(EGLDisplay dpy,
+                                               const void *key,
+                                               EGLint keysize,
+                                               const void *binary,
+                                               EGLint binarysize)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(ProgramCachePopulateANGLE,
+              "dpy = 0x%016" PRIxPTR ", key = 0x%016" PRIxPTR
+              ", keysize = %d, binary = 0x%016" PRIxPTR ", binarysize = %d",
+              (uintptr_t)dpy, (uintptr_t)key, keysize, (uintptr_t)binary, binarysize);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+
+    ANGLE_EGL_VALIDATE_VOID(thread, ProgramCachePopulateANGLE, GetDisplayIfValid(dpyPacked),
+                            dpyPacked, key, keysize, binary, binarysize);
+
+    ProgramCachePopulateANGLE(thread, dpyPacked, key, keysize, binary, binarysize);
+}
+
+EGLint EGLAPIENTRY EGL_ProgramCacheResizeANGLE(EGLDisplay dpy, EGLint limit, EGLint mode)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(ProgramCacheResizeANGLE, "dpy = 0x%016" PRIxPTR ", limit = %d, mode = %d",
+              (uintptr_t)dpy, limit, mode);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+
+    ANGLE_EGL_VALIDATE(thread, ProgramCacheResizeANGLE, GetDisplayIfValid(dpyPacked), EGLint,
+                       dpyPacked, limit, mode);
+
+    return ProgramCacheResizeANGLE(thread, dpyPacked, limit, mode);
+}
+
+// EGL_ANGLE_query_surface_pointer
+EGLBoolean EGLAPIENTRY EGL_QuerySurfacePointerANGLE(EGLDisplay dpy,
+                                                    EGLSurface surface,
+                                                    EGLint attribute,
+                                                    void **value)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(QuerySurfacePointerANGLE,
+              "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR
+              ", attribute = %d, value = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, (uintptr_t)surface, attribute, (uintptr_t)value);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    Surface *surfacePacked  = PackParam<Surface *>(surface);
+
+    ANGLE_EGL_VALIDATE(thread, QuerySurfacePointerANGLE, GetDisplayIfValid(dpyPacked), EGLBoolean,
+                       dpyPacked, surfacePacked, attribute, value);
+
+    return QuerySurfacePointerANGLE(thread, dpyPacked, surfacePacked, attribute, value);
+}
+
+// EGL_ANGLE_stream_producer_d3d_texture
+EGLBoolean EGLAPIENTRY EGL_CreateStreamProducerD3DTextureANGLE(EGLDisplay dpy,
+                                                               EGLStreamKHR stream,
+                                                               const EGLAttrib *attrib_list)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(CreateStreamProducerD3DTextureANGLE,
+              "dpy = 0x%016" PRIxPTR ", stream = 0x%016" PRIxPTR ", attrib_list = 0x%016" PRIxPTR
+              "",
+              (uintptr_t)dpy, (uintptr_t)stream, (uintptr_t)attrib_list);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked               = PackParam<egl::Display *>(dpy);
+    Stream *streamPacked                  = PackParam<Stream *>(stream);
+    const AttributeMap &attrib_listPacked = PackParam<const AttributeMap &>(attrib_list);
+
+    ANGLE_EGL_VALIDATE(thread, CreateStreamProducerD3DTextureANGLE, GetDisplayIfValid(dpyPacked),
+                       EGLBoolean, dpyPacked, streamPacked, attrib_listPacked);
+
+    return CreateStreamProducerD3DTextureANGLE(thread, dpyPacked, streamPacked, attrib_listPacked);
+}
+
+EGLBoolean EGLAPIENTRY EGL_StreamPostD3DTextureANGLE(EGLDisplay dpy,
+                                                     EGLStreamKHR stream,
+                                                     void *texture,
+                                                     const EGLAttrib *attrib_list)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(StreamPostD3DTextureANGLE,
+              "dpy = 0x%016" PRIxPTR ", stream = 0x%016" PRIxPTR ", texture = 0x%016" PRIxPTR
+              ", attrib_list = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, (uintptr_t)stream, (uintptr_t)texture, (uintptr_t)attrib_list);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked               = PackParam<egl::Display *>(dpy);
+    Stream *streamPacked                  = PackParam<Stream *>(stream);
+    const AttributeMap &attrib_listPacked = PackParam<const AttributeMap &>(attrib_list);
+
+    ANGLE_EGL_VALIDATE(thread, StreamPostD3DTextureANGLE, GetDisplayIfValid(dpyPacked), EGLBoolean,
+                       dpyPacked, streamPacked, texture, attrib_listPacked);
+
+    return StreamPostD3DTextureANGLE(thread, dpyPacked, streamPacked, texture, attrib_listPacked);
+}
+
+// EGL_ANGLE_swap_with_frame_token
+EGLBoolean EGLAPIENTRY EGL_SwapBuffersWithFrameTokenANGLE(EGLDisplay dpy,
+                                                          EGLSurface surface,
+                                                          EGLFrameTokenANGLE frametoken)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(SwapBuffersWithFrameTokenANGLE,
+              "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR ", frametoken = 0x%llX",
+              (uintptr_t)dpy, (uintptr_t)surface, static_cast<unsigned long long>(frametoken));
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    Surface *surfacePacked  = PackParam<Surface *>(surface);
+
+    ANGLE_EGL_VALIDATE(thread, SwapBuffersWithFrameTokenANGLE, GetDisplayIfValid(dpyPacked),
+                       EGLBoolean, dpyPacked, surfacePacked, frametoken);
+
+    return SwapBuffersWithFrameTokenANGLE(thread, dpyPacked, surfacePacked, frametoken);
+}
+
+// EGL_ANGLE_sync_control_rate
+EGLBoolean EGLAPIENTRY EGL_GetMscRateANGLE(EGLDisplay dpy,
+                                           EGLSurface surface,
+                                           EGLint *numerator,
+                                           EGLint *denominator)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(GetMscRateANGLE,
+              "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR ", numerator = 0x%016" PRIxPTR
+              ", denominator = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, (uintptr_t)surface, (uintptr_t)numerator, (uintptr_t)denominator);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    Surface *surfacePacked  = PackParam<Surface *>(surface);
+
+    ANGLE_EGL_VALIDATE(thread, GetMscRateANGLE, GetDisplayIfValid(dpyPacked), EGLBoolean, dpyPacked,
+                       surfacePacked, numerator, denominator);
+
+    return GetMscRateANGLE(thread, dpyPacked, surfacePacked, numerator, denominator);
+}
+
+// EGL_CHROMIUM_sync_control
+EGLBoolean EGLAPIENTRY EGL_GetSyncValuesCHROMIUM(EGLDisplay dpy,
+                                                 EGLSurface surface,
+                                                 EGLuint64KHR *ust,
+                                                 EGLuint64KHR *msc,
+                                                 EGLuint64KHR *sbc)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(GetSyncValuesCHROMIUM,
+              "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR ", ust = 0x%016" PRIxPTR
+              ", msc = 0x%016" PRIxPTR ", sbc = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, (uintptr_t)surface, (uintptr_t)ust, (uintptr_t)msc, (uintptr_t)sbc);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    Surface *surfacePacked  = PackParam<Surface *>(surface);
+
+    ANGLE_EGL_VALIDATE(thread, GetSyncValuesCHROMIUM, GetDisplayIfValid(dpyPacked), EGLBoolean,
+                       dpyPacked, surfacePacked, ust, msc, sbc);
+
+    return GetSyncValuesCHROMIUM(thread, dpyPacked, surfacePacked, ust, msc, sbc);
+}
+
+// EGL_EXT_device_query
+EGLBoolean EGLAPIENTRY EGL_QueryDeviceAttribEXT(EGLDeviceEXT device,
+                                                EGLint attribute,
+                                                EGLAttrib *value)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(QueryDeviceAttribEXT,
+              "device = 0x%016" PRIxPTR ", attribute = %d, value = 0x%016" PRIxPTR "",
+              (uintptr_t)device, attribute, (uintptr_t)value);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    Device *devicePacked = PackParam<Device *>(device);
+
+    ANGLE_EGL_VALIDATE(thread, QueryDeviceAttribEXT, nullptr, EGLBoolean, devicePacked, attribute,
+                       value);
+
+    return QueryDeviceAttribEXT(thread, devicePacked, attribute, value);
+}
+
+const char *EGLAPIENTRY EGL_QueryDeviceStringEXT(EGLDeviceEXT device, EGLint name)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(QueryDeviceStringEXT, "device = 0x%016" PRIxPTR ", name = %d", (uintptr_t)device,
+              name);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    Device *devicePacked = PackParam<Device *>(device);
+
+    ANGLE_EGL_VALIDATE(thread, QueryDeviceStringEXT, nullptr, const char *, devicePacked, name);
+
+    return QueryDeviceStringEXT(thread, devicePacked, name);
+}
+
+EGLBoolean EGLAPIENTRY EGL_QueryDisplayAttribEXT(EGLDisplay dpy, EGLint attribute, EGLAttrib *value)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(QueryDisplayAttribEXT,
+              "dpy = 0x%016" PRIxPTR ", attribute = %d, value = 0x%016" PRIxPTR "", (uintptr_t)dpy,
+              attribute, (uintptr_t)value);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+
+    ANGLE_EGL_VALIDATE(thread, QueryDisplayAttribEXT, GetDisplayIfValid(dpyPacked), EGLBoolean,
+                       dpyPacked, attribute, value);
+
+    return QueryDisplayAttribEXT(thread, dpyPacked, attribute, value);
+}
+
+// EGL_EXT_platform_base
+EGLSurface EGLAPIENTRY EGL_CreatePlatformPixmapSurfaceEXT(EGLDisplay dpy,
+                                                          EGLConfig config,
+                                                          void *native_pixmap,
+                                                          const EGLint *attrib_list)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(CreatePlatformPixmapSurfaceEXT,
+              "dpy = 0x%016" PRIxPTR ", config = 0x%016" PRIxPTR ", native_pixmap = 0x%016" PRIxPTR
+              ", attrib_list = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, (uintptr_t)config, (uintptr_t)native_pixmap, (uintptr_t)attrib_list);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked               = PackParam<egl::Display *>(dpy);
+    Config *configPacked                  = PackParam<Config *>(config);
+    const AttributeMap &attrib_listPacked = PackParam<const AttributeMap &>(attrib_list);
+
+    ANGLE_EGL_VALIDATE(thread, CreatePlatformPixmapSurfaceEXT, GetDisplayIfValid(dpyPacked),
+                       EGLSurface, dpyPacked, configPacked, native_pixmap, attrib_listPacked);
+
+    return CreatePlatformPixmapSurfaceEXT(thread, dpyPacked, configPacked, native_pixmap,
+                                          attrib_listPacked);
+}
+
+EGLSurface EGLAPIENTRY EGL_CreatePlatformWindowSurfaceEXT(EGLDisplay dpy,
+                                                          EGLConfig config,
+                                                          void *native_window,
+                                                          const EGLint *attrib_list)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(CreatePlatformWindowSurfaceEXT,
+              "dpy = 0x%016" PRIxPTR ", config = 0x%016" PRIxPTR ", native_window = 0x%016" PRIxPTR
+              ", attrib_list = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, (uintptr_t)config, (uintptr_t)native_window, (uintptr_t)attrib_list);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked               = PackParam<egl::Display *>(dpy);
+    Config *configPacked                  = PackParam<Config *>(config);
+    const AttributeMap &attrib_listPacked = PackParam<const AttributeMap &>(attrib_list);
+
+    ANGLE_EGL_VALIDATE(thread, CreatePlatformWindowSurfaceEXT, GetDisplayIfValid(dpyPacked),
+                       EGLSurface, dpyPacked, configPacked, native_window, attrib_listPacked);
+
+    return CreatePlatformWindowSurfaceEXT(thread, dpyPacked, configPacked, native_window,
+                                          attrib_listPacked);
+}
+
+EGLDisplay EGLAPIENTRY EGL_GetPlatformDisplayEXT(EGLenum platform,
+                                                 void *native_display,
+                                                 const EGLint *attrib_list)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(GetPlatformDisplayEXT,
+              "platform = 0x%X, native_display = 0x%016" PRIxPTR ", attrib_list = 0x%016" PRIxPTR
+              "",
+              platform, (uintptr_t)native_display, (uintptr_t)attrib_list);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    const AttributeMap &attrib_listPacked = PackParam<const AttributeMap &>(attrib_list);
+
+    ANGLE_EGL_VALIDATE(thread, GetPlatformDisplayEXT, nullptr, EGLDisplay, platform, native_display,
+                       attrib_listPacked);
+
+    return GetPlatformDisplayEXT(thread, platform, native_display, attrib_listPacked);
+}
+
+// EGL_KHR_debug
+EGLint EGLAPIENTRY EGL_DebugMessageControlKHR(EGLDEBUGPROCKHR callback,
+                                              const EGLAttrib *attrib_list)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(DebugMessageControlKHR,
+              "callback = 0x%016" PRIxPTR ", attrib_list = 0x%016" PRIxPTR "", (uintptr_t)callback,
+              (uintptr_t)attrib_list);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    const AttributeMap &attrib_listPacked = PackParam<const AttributeMap &>(attrib_list);
+
+    ANGLE_EGL_VALIDATE(thread, DebugMessageControlKHR, nullptr, EGLint, callback,
+                       attrib_listPacked);
+
+    return DebugMessageControlKHR(thread, callback, attrib_listPacked);
+}
+
+EGLint EGLAPIENTRY EGL_LabelObjectKHR(EGLDisplay display,
+                                      EGLenum objectType,
+                                      EGLObjectKHR object,
+                                      EGLLabelKHR label)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(LabelObjectKHR,
+              "display = 0x%016" PRIxPTR ", objectType = 0x%X, object = 0x%016" PRIxPTR
+              ", label = 0x%016" PRIxPTR "",
+              (uintptr_t)display, objectType, (uintptr_t)object, (uintptr_t)label);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *displayPacked = PackParam<egl::Display *>(display);
+    ObjectType objectTypePacked = PackParam<ObjectType>(objectType);
+
+    ANGLE_EGL_VALIDATE(thread, LabelObjectKHR, GetDisplayIfValid(displayPacked), EGLint,
+                       displayPacked, objectTypePacked, object, label);
+
+    return LabelObjectKHR(thread, displayPacked, objectTypePacked, object, label);
+}
+
+EGLBoolean EGLAPIENTRY EGL_QueryDebugKHR(EGLint attribute, EGLAttrib *value)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(QueryDebugKHR, "attribute = %d, value = 0x%016" PRIxPTR "", attribute,
+              (uintptr_t)value);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    ANGLE_EGL_VALIDATE(thread, QueryDebugKHR, nullptr, EGLBoolean, attribute, value);
+
+    return QueryDebugKHR(thread, attribute, value);
+}
+
+// EGL_KHR_fence_sync
+EGLint EGLAPIENTRY EGL_ClientWaitSyncKHR(EGLDisplay dpy,
+                                         EGLSyncKHR sync,
+                                         EGLint flags,
+                                         EGLTimeKHR timeout)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(ClientWaitSyncKHR,
+              "dpy = 0x%016" PRIxPTR ", sync = 0x%016" PRIxPTR ", flags = %d, timeout = %llu",
+              (uintptr_t)dpy, (uintptr_t)sync, flags, static_cast<unsigned long long>(timeout));
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    Sync *syncPacked        = PackParam<Sync *>(sync);
+
+    ANGLE_EGL_VALIDATE(thread, ClientWaitSyncKHR, GetDisplayIfValid(dpyPacked), EGLint, dpyPacked,
+                       syncPacked, flags, timeout);
+
+    return ClientWaitSyncKHR(thread, dpyPacked, syncPacked, flags, timeout);
+}
+
+EGLSyncKHR EGLAPIENTRY EGL_CreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(CreateSyncKHR,
+              "dpy = 0x%016" PRIxPTR ", type = 0x%X, attrib_list = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, type, (uintptr_t)attrib_list);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked               = PackParam<egl::Display *>(dpy);
+    const AttributeMap &attrib_listPacked = PackParam<const AttributeMap &>(attrib_list);
+
+    ANGLE_EGL_VALIDATE(thread, CreateSyncKHR, GetDisplayIfValid(dpyPacked), EGLSyncKHR, dpyPacked,
+                       type, attrib_listPacked);
+
+    return CreateSyncKHR(thread, dpyPacked, type, attrib_listPacked);
+}
+
+EGLBoolean EGLAPIENTRY EGL_DestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(DestroySyncKHR, "dpy = 0x%016" PRIxPTR ", sync = 0x%016" PRIxPTR "", (uintptr_t)dpy,
+              (uintptr_t)sync);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    Sync *syncPacked        = PackParam<Sync *>(sync);
+
+    ANGLE_EGL_VALIDATE(thread, DestroySyncKHR, GetDisplayIfValid(dpyPacked), EGLBoolean, dpyPacked,
+                       syncPacked);
+
+    return DestroySyncKHR(thread, dpyPacked, syncPacked);
+}
+
+EGLBoolean EGLAPIENTRY EGL_GetSyncAttribKHR(EGLDisplay dpy,
+                                            EGLSyncKHR sync,
+                                            EGLint attribute,
+                                            EGLint *value)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(GetSyncAttribKHR,
+              "dpy = 0x%016" PRIxPTR ", sync = 0x%016" PRIxPTR
+              ", attribute = %d, value = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, (uintptr_t)sync, attribute, (uintptr_t)value);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    Sync *syncPacked        = PackParam<Sync *>(sync);
+
+    ANGLE_EGL_VALIDATE(thread, GetSyncAttribKHR, GetDisplayIfValid(dpyPacked), EGLBoolean,
+                       dpyPacked, syncPacked, attribute, value);
+
+    return GetSyncAttribKHR(thread, dpyPacked, syncPacked, attribute, value);
+}
+
+// EGL_KHR_image
+EGLImageKHR EGLAPIENTRY EGL_CreateImageKHR(EGLDisplay dpy,
+                                           EGLContext ctx,
+                                           EGLenum target,
+                                           EGLClientBuffer buffer,
+                                           const EGLint *attrib_list)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(CreateImageKHR,
+              "dpy = 0x%016" PRIxPTR ", ctx = 0x%016" PRIxPTR
+              ", target = 0x%X, buffer = 0x%016" PRIxPTR ", attrib_list = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, (uintptr_t)ctx, target, (uintptr_t)buffer, (uintptr_t)attrib_list);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked               = PackParam<egl::Display *>(dpy);
+    gl::Context *ctxPacked                = PackParam<gl::Context *>(ctx);
+    const AttributeMap &attrib_listPacked = PackParam<const AttributeMap &>(attrib_list);
+
+    ANGLE_EGL_VALIDATE(thread, CreateImageKHR, GetDisplayIfValid(dpyPacked), EGLImageKHR, dpyPacked,
+                       ctxPacked, target, buffer, attrib_listPacked);
+
+    return CreateImageKHR(thread, dpyPacked, ctxPacked, target, buffer, attrib_listPacked);
+}
+
+EGLBoolean EGLAPIENTRY EGL_DestroyImageKHR(EGLDisplay dpy, EGLImageKHR image)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(DestroyImageKHR, "dpy = 0x%016" PRIxPTR ", image = 0x%016" PRIxPTR "", (uintptr_t)dpy,
+              (uintptr_t)image);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    Image *imagePacked      = PackParam<Image *>(image);
+
+    ANGLE_EGL_VALIDATE(thread, DestroyImageKHR, GetDisplayIfValid(dpyPacked), EGLBoolean, dpyPacked,
+                       imagePacked);
+
+    return DestroyImageKHR(thread, dpyPacked, imagePacked);
+}
+
+// EGL_KHR_reusable_sync
+EGLBoolean EGLAPIENTRY EGL_SignalSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(SignalSyncKHR, "dpy = 0x%016" PRIxPTR ", sync = 0x%016" PRIxPTR ", mode = 0x%X",
+              (uintptr_t)dpy, (uintptr_t)sync, mode);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    Sync *syncPacked        = PackParam<Sync *>(sync);
+
+    ANGLE_EGL_VALIDATE(thread, SignalSyncKHR, GetDisplayIfValid(dpyPacked), EGLBoolean, dpyPacked,
+                       syncPacked, mode);
+
+    return SignalSyncKHR(thread, dpyPacked, syncPacked, mode);
+}
+
+// ClientWaitSyncKHR is already defined.
+
+// CreateSyncKHR is already defined.
+
+// DestroySyncKHR is already defined.
+
+// GetSyncAttribKHR is already defined.
+
+// EGL_KHR_stream
+EGLStreamKHR EGLAPIENTRY EGL_CreateStreamKHR(EGLDisplay dpy, const EGLint *attrib_list)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(CreateStreamKHR, "dpy = 0x%016" PRIxPTR ", attrib_list = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, (uintptr_t)attrib_list);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked               = PackParam<egl::Display *>(dpy);
+    const AttributeMap &attrib_listPacked = PackParam<const AttributeMap &>(attrib_list);
+
+    ANGLE_EGL_VALIDATE(thread, CreateStreamKHR, GetDisplayIfValid(dpyPacked), EGLStreamKHR,
+                       dpyPacked, attrib_listPacked);
+
+    return CreateStreamKHR(thread, dpyPacked, attrib_listPacked);
+}
+
+EGLBoolean EGLAPIENTRY EGL_DestroyStreamKHR(EGLDisplay dpy, EGLStreamKHR stream)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(DestroyStreamKHR, "dpy = 0x%016" PRIxPTR ", stream = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, (uintptr_t)stream);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    Stream *streamPacked    = PackParam<Stream *>(stream);
+
+    ANGLE_EGL_VALIDATE(thread, DestroyStreamKHR, GetDisplayIfValid(dpyPacked), EGLBoolean,
+                       dpyPacked, streamPacked);
+
+    return DestroyStreamKHR(thread, dpyPacked, streamPacked);
+}
+
+EGLBoolean EGLAPIENTRY EGL_QueryStreamKHR(EGLDisplay dpy,
+                                          EGLStreamKHR stream,
+                                          EGLenum attribute,
+                                          EGLint *value)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(QueryStreamKHR,
+              "dpy = 0x%016" PRIxPTR ", stream = 0x%016" PRIxPTR
+              ", attribute = 0x%X, value = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, (uintptr_t)stream, attribute, (uintptr_t)value);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    Stream *streamPacked    = PackParam<Stream *>(stream);
+
+    ANGLE_EGL_VALIDATE(thread, QueryStreamKHR, GetDisplayIfValid(dpyPacked), EGLBoolean, dpyPacked,
+                       streamPacked, attribute, value);
+
+    return QueryStreamKHR(thread, dpyPacked, streamPacked, attribute, value);
+}
+
+EGLBoolean EGLAPIENTRY EGL_QueryStreamu64KHR(EGLDisplay dpy,
+                                             EGLStreamKHR stream,
+                                             EGLenum attribute,
+                                             EGLuint64KHR *value)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(QueryStreamu64KHR,
+              "dpy = 0x%016" PRIxPTR ", stream = 0x%016" PRIxPTR
+              ", attribute = 0x%X, value = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, (uintptr_t)stream, attribute, (uintptr_t)value);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    Stream *streamPacked    = PackParam<Stream *>(stream);
+
+    ANGLE_EGL_VALIDATE(thread, QueryStreamu64KHR, GetDisplayIfValid(dpyPacked), EGLBoolean,
+                       dpyPacked, streamPacked, attribute, value);
+
+    return QueryStreamu64KHR(thread, dpyPacked, streamPacked, attribute, value);
+}
+
+EGLBoolean EGLAPIENTRY EGL_StreamAttribKHR(EGLDisplay dpy,
+                                           EGLStreamKHR stream,
+                                           EGLenum attribute,
+                                           EGLint value)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(StreamAttribKHR,
+              "dpy = 0x%016" PRIxPTR ", stream = 0x%016" PRIxPTR ", attribute = 0x%X, value = %d",
+              (uintptr_t)dpy, (uintptr_t)stream, attribute, value);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    Stream *streamPacked    = PackParam<Stream *>(stream);
+
+    ANGLE_EGL_VALIDATE(thread, StreamAttribKHR, GetDisplayIfValid(dpyPacked), EGLBoolean, dpyPacked,
+                       streamPacked, attribute, value);
+
+    return StreamAttribKHR(thread, dpyPacked, streamPacked, attribute, value);
+}
+
+// EGL_KHR_stream_consumer_gltexture
+EGLBoolean EGLAPIENTRY EGL_StreamConsumerAcquireKHR(EGLDisplay dpy, EGLStreamKHR stream)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(StreamConsumerAcquireKHR, "dpy = 0x%016" PRIxPTR ", stream = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, (uintptr_t)stream);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    Stream *streamPacked    = PackParam<Stream *>(stream);
+
+    ANGLE_EGL_VALIDATE(thread, StreamConsumerAcquireKHR, GetDisplayIfValid(dpyPacked), EGLBoolean,
+                       dpyPacked, streamPacked);
+
+    return StreamConsumerAcquireKHR(thread, dpyPacked, streamPacked);
+}
+
+EGLBoolean EGLAPIENTRY EGL_StreamConsumerGLTextureExternalKHR(EGLDisplay dpy, EGLStreamKHR stream)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(StreamConsumerGLTextureExternalKHR,
+              "dpy = 0x%016" PRIxPTR ", stream = 0x%016" PRIxPTR "", (uintptr_t)dpy,
+              (uintptr_t)stream);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    Stream *streamPacked    = PackParam<Stream *>(stream);
+
+    ANGLE_EGL_VALIDATE(thread, StreamConsumerGLTextureExternalKHR, GetDisplayIfValid(dpyPacked),
+                       EGLBoolean, dpyPacked, streamPacked);
+
+    return StreamConsumerGLTextureExternalKHR(thread, dpyPacked, streamPacked);
+}
+
+EGLBoolean EGLAPIENTRY EGL_StreamConsumerReleaseKHR(EGLDisplay dpy, EGLStreamKHR stream)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(StreamConsumerReleaseKHR, "dpy = 0x%016" PRIxPTR ", stream = 0x%016" PRIxPTR "",
+              (uintptr_t)dpy, (uintptr_t)stream);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    Stream *streamPacked    = PackParam<Stream *>(stream);
+
+    ANGLE_EGL_VALIDATE(thread, StreamConsumerReleaseKHR, GetDisplayIfValid(dpyPacked), EGLBoolean,
+                       dpyPacked, streamPacked);
+
+    return StreamConsumerReleaseKHR(thread, dpyPacked, streamPacked);
+}
+
+// EGL_KHR_swap_buffers_with_damage
+EGLBoolean EGLAPIENTRY EGL_SwapBuffersWithDamageKHR(EGLDisplay dpy,
+                                                    EGLSurface surface,
+                                                    const EGLint *rects,
+                                                    EGLint n_rects)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(SwapBuffersWithDamageKHR,
+              "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR ", rects = 0x%016" PRIxPTR
+              ", n_rects = %d",
+              (uintptr_t)dpy, (uintptr_t)surface, (uintptr_t)rects, n_rects);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    Surface *surfacePacked  = PackParam<Surface *>(surface);
+
+    ANGLE_EGL_VALIDATE(thread, SwapBuffersWithDamageKHR, GetDisplayIfValid(dpyPacked), EGLBoolean,
+                       dpyPacked, surfacePacked, rects, n_rects);
+
+    return SwapBuffersWithDamageKHR(thread, dpyPacked, surfacePacked, rects, n_rects);
+}
+
+// EGL_KHR_wait_sync
+EGLint EGLAPIENTRY EGL_WaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(WaitSyncKHR, "dpy = 0x%016" PRIxPTR ", sync = 0x%016" PRIxPTR ", flags = %d",
+              (uintptr_t)dpy, (uintptr_t)sync, flags);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    Sync *syncPacked        = PackParam<Sync *>(sync);
+
+    ANGLE_EGL_VALIDATE(thread, WaitSyncKHR, GetDisplayIfValid(dpyPacked), EGLint, dpyPacked,
+                       syncPacked, flags);
+
+    return WaitSyncKHR(thread, dpyPacked, syncPacked, flags);
+}
+
+// EGL_NV_post_sub_buffer
+EGLBoolean EGLAPIENTRY EGL_PostSubBufferNV(EGLDisplay dpy,
+                                           EGLSurface surface,
+                                           EGLint x,
+                                           EGLint y,
+                                           EGLint width,
+                                           EGLint height)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(PostSubBufferNV,
+              "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR
+              ", x = %d, y = %d, width = %d, height = %d",
+              (uintptr_t)dpy, (uintptr_t)surface, x, y, width, height);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked = PackParam<egl::Display *>(dpy);
+    Surface *surfacePacked  = PackParam<Surface *>(surface);
+
+    ANGLE_EGL_VALIDATE(thread, PostSubBufferNV, GetDisplayIfValid(dpyPacked), EGLBoolean, dpyPacked,
+                       surfacePacked, x, y, width, height);
+
+    return PostSubBufferNV(thread, dpyPacked, surfacePacked, x, y, width, height);
+}
+
+// EGL_NV_stream_consumer_gltexture_yuv
+EGLBoolean EGLAPIENTRY EGL_StreamConsumerGLTextureExternalAttribsNV(EGLDisplay dpy,
+                                                                    EGLStreamKHR stream,
+                                                                    const EGLAttrib *attrib_list)
+{
+    ANGLE_SCOPED_GLOBAL_LOCK();
+    EGL_EVENT(StreamConsumerGLTextureExternalAttribsNV,
+              "dpy = 0x%016" PRIxPTR ", stream = 0x%016" PRIxPTR ", attrib_list = 0x%016" PRIxPTR
+              "",
+              (uintptr_t)dpy, (uintptr_t)stream, (uintptr_t)attrib_list);
+
+    Thread *thread = egl::GetCurrentThread();
+
+    egl::Display *dpyPacked               = PackParam<egl::Display *>(dpy);
+    Stream *streamPacked                  = PackParam<Stream *>(stream);
+    const AttributeMap &attrib_listPacked = PackParam<const AttributeMap &>(attrib_list);
+
+    ANGLE_EGL_VALIDATE(thread, StreamConsumerGLTextureExternalAttribsNV,
+                       GetDisplayIfValid(dpyPacked), EGLBoolean, dpyPacked, streamPacked,
+                       attrib_listPacked);
+
+    return StreamConsumerGLTextureExternalAttribsNV(thread, dpyPacked, streamPacked,
+                                                    attrib_listPacked);
+}
+}  // extern "C"
diff --git a/src/libGLESv2/entry_points_egl_ext.h b/src/libGLESv2/entry_points_egl_ext_autogen.h
similarity index 90%
rename from src/libGLESv2/entry_points_egl_ext.h
rename to src/libGLESv2/entry_points_egl_ext_autogen.h
index ab99556..7eef98a 100644
--- a/src/libGLESv2/entry_points_egl_ext.h
+++ b/src/libGLESv2/entry_points_egl_ext_autogen.h
@@ -1,13 +1,15 @@
+// GENERATED FILE - DO NOT EDIT.
+// Generated by generate_entry_points.py using data from egl.xml and egl_angle_ext.xml.
 //
-// Copyright 2014 The ANGLE Project Authors. All rights reserved.
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
+// entry_points_egl_ext_autogen.h:
+//   Defines the EGL Extension entry points.
 
-// entry_points_egl_ext.h : Defines the EGL extension entry points.
-
-#ifndef LIBGLESV2_ENTRYPOINTSEGLEXT_H_
-#define LIBGLESV2_ENTRYPOINTSEGLEXT_H_
+#ifndef LIBGLESV2_ENTRY_POINTS_EGL_EXT_AUTOGEN_H_
+#define LIBGLESV2_ENTRY_POINTS_EGL_EXT_AUTOGEN_H_
 
 #include <EGL/egl.h>
 #include <EGL/eglext.h>
@@ -15,56 +17,48 @@
 
 extern "C" {
 
-// EGL_ANGLE_query_surface_pointer
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_QuerySurfacePointerANGLE(EGLDisplay dpy,
-                                                                 EGLSurface surface,
-                                                                 EGLint attribute,
-                                                                 void **value);
+// EGL_ANDROID_blob_cache
+ANGLE_EXPORT void EGLAPIENTRY EGL_SetBlobCacheFuncsANDROID(EGLDisplay dpy,
+                                                           EGLSetBlobFuncANDROID set,
+                                                           EGLGetBlobFuncANDROID get);
 
-// EGL_NV_post_sub_buffer
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_PostSubBufferNV(EGLDisplay dpy,
-                                                        EGLSurface surface,
-                                                        EGLint x,
-                                                        EGLint y,
-                                                        EGLint width,
-                                                        EGLint height);
+// EGL_ANDROID_create_native_client_buffer
+ANGLE_EXPORT EGLClientBuffer EGLAPIENTRY
+EGL_CreateNativeClientBufferANDROID(const EGLint *attrib_list);
 
-// EGL_EXT_platform_base
-ANGLE_EXPORT EGLDisplay EGLAPIENTRY EGL_GetPlatformDisplayEXT(EGLenum platform,
-                                                              void *native_display,
-                                                              const EGLint *attrib_list);
-ANGLE_EXPORT EGLSurface EGLAPIENTRY EGL_CreatePlatformWindowSurfaceEXT(EGLDisplay dpy,
-                                                                       EGLConfig config,
-                                                                       void *native_window,
-                                                                       const EGLint *attrib_list);
-ANGLE_EXPORT EGLSurface EGLAPIENTRY EGL_CreatePlatformPixmapSurfaceEXT(EGLDisplay dpy,
-                                                                       EGLConfig config,
-                                                                       void *native_pixmap,
-                                                                       const EGLint *attrib_list);
+// EGL_ANDROID_get_frame_timestamps
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_GetCompositorTimingSupportedANDROID(EGLDisplay dpy,
+                                                                            EGLSurface surface,
+                                                                            EGLint name);
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_GetCompositorTimingANDROID(EGLDisplay dpy,
+                                                                   EGLSurface surface,
+                                                                   EGLint numTimestamps,
+                                                                   const EGLint *names,
+                                                                   EGLnsecsANDROID *values);
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_GetNextFrameIdANDROID(EGLDisplay dpy,
+                                                              EGLSurface surface,
+                                                              EGLuint64KHR *frameId);
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_GetFrameTimestampSupportedANDROID(EGLDisplay dpy,
+                                                                          EGLSurface surface,
+                                                                          EGLint timestamp);
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_GetFrameTimestampsANDROID(EGLDisplay dpy,
+                                                                  EGLSurface surface,
+                                                                  EGLuint64KHR frameId,
+                                                                  EGLint numTimestamps,
+                                                                  const EGLint *timestamps,
+                                                                  EGLnsecsANDROID *values);
 
-// EGL_EXT_device_query
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_QueryDisplayAttribEXT(EGLDisplay dpy,
-                                                              EGLint attribute,
-                                                              EGLAttrib *value);
+// EGL_ANDROID_get_native_client_buffer
+ANGLE_EXPORT EGLClientBuffer EGLAPIENTRY
+EGL_GetNativeClientBufferANDROID(const struct AHardwareBuffer *buffer);
 
-// EGL_ANGLE_feature_control
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_QueryDisplayAttribANGLE(EGLDisplay dpy,
-                                                                EGLint attribute,
-                                                                EGLAttrib *value);
+// EGL_ANDROID_native_fence_sync
+ANGLE_EXPORT EGLint EGLAPIENTRY EGL_DupNativeFenceFDANDROID(EGLDisplay dpy, EGLSyncKHR sync);
 
-// EGL_EXT_device_query
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_QueryDeviceAttribEXT(EGLDeviceEXT device,
-                                                             EGLint attribute,
-                                                             EGLAttrib *value);
-ANGLE_EXPORT const char *EGLAPIENTRY EGL_QueryDeviceStringEXT(EGLDeviceEXT device, EGLint name);
-
-// EGL_KHR_image_base/EGL_KHR_image
-ANGLE_EXPORT EGLImageKHR EGLAPIENTRY EGL_CreateImageKHR(EGLDisplay dpy,
-                                                        EGLContext ctx,
-                                                        EGLenum target,
-                                                        EGLClientBuffer buffer,
-                                                        const EGLint *attrib_list);
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_DestroyImageKHR(EGLDisplay dpy, EGLImageKHR image);
+// EGL_ANDROID_presentation_time
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_PresentationTimeANDROID(EGLDisplay dpy,
+                                                                EGLSurface surface,
+                                                                EGLnsecsANDROID time);
 
 // EGL_ANGLE_device_creation
 ANGLE_EXPORT EGLDeviceEXT EGLAPIENTRY EGL_CreateDeviceANGLE(EGLint device_type,
@@ -72,90 +66,18 @@
                                                             const EGLAttrib *attrib_list);
 ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_ReleaseDeviceANGLE(EGLDeviceEXT device);
 
-// EGL_KHR_stream
-ANGLE_EXPORT EGLStreamKHR EGLAPIENTRY EGL_CreateStreamKHR(EGLDisplay dpy,
-                                                          const EGLint *attrib_list);
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_DestroyStreamKHR(EGLDisplay dpy, EGLStreamKHR stream);
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_StreamAttribKHR(EGLDisplay dpy,
-                                                        EGLStreamKHR stream,
-                                                        EGLenum attribute,
-                                                        EGLint value);
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_QueryStreamKHR(EGLDisplay dpy,
-                                                       EGLStreamKHR stream,
-                                                       EGLenum attribute,
-                                                       EGLint *value);
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_QueryStreamu64KHR(EGLDisplay dpy,
-                                                          EGLStreamKHR stream,
-                                                          EGLenum attribute,
-                                                          EGLuint64KHR *value);
+// EGL_ANGLE_feature_control
+ANGLE_EXPORT const char *EGLAPIENTRY EGL_QueryStringiANGLE(EGLDisplay dpy,
+                                                           EGLint name,
+                                                           EGLint index);
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_QueryDisplayAttribANGLE(EGLDisplay dpy,
+                                                                EGLint attribute,
+                                                                EGLAttrib *value);
 
-// EGL_KHR_stream_consumer_gltexture
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_StreamConsumerGLTextureExternalKHR(EGLDisplay dpy,
-                                                                           EGLStreamKHR stream);
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_StreamConsumerAcquireKHR(EGLDisplay dpy,
-                                                                 EGLStreamKHR stream);
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_StreamConsumerReleaseKHR(EGLDisplay dpy,
-                                                                 EGLStreamKHR stream);
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY
-EGL_StreamConsumerGLTextureExternalAttribsNV(EGLDisplay dpy,
-                                             EGLStreamKHR stream,
-                                             const EGLAttrib *attrib_list);
-
-// EGL_ANGLE_stream_producer_d3d_texture
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY
-EGL_CreateStreamProducerD3DTextureANGLE(EGLDisplay dpy,
-                                        EGLStreamKHR stream,
-                                        const EGLAttrib *attrib_list);
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_StreamPostD3DTextureANGLE(EGLDisplay dpy,
-                                                                  EGLStreamKHR stream,
-                                                                  void *texture,
-                                                                  const EGLAttrib *attrib_list);
-
-// EGL_KHR_fence_sync
-ANGLE_EXPORT EGLSync EGLAPIENTRY EGL_CreateSyncKHR(EGLDisplay dpy,
-                                                   EGLenum type,
-                                                   const EGLint *attrib_list);
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_DestroySyncKHR(EGLDisplay dpy, EGLSync sync);
-ANGLE_EXPORT EGLint EGLAPIENTRY EGL_ClientWaitSyncKHR(EGLDisplay dpy,
-                                                      EGLSync sync,
-                                                      EGLint flags,
-                                                      EGLTime timeout);
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_GetSyncAttribKHR(EGLDisplay dpy,
-                                                         EGLSync sync,
-                                                         EGLint attribute,
-                                                         EGLint *value);
-
-// EGL_KHR_wait_sync
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_WaitSyncKHR(EGLDisplay dpy, EGLSync sync, EGLint flags);
-
-// EGL_CHROMIUM_sync_control
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_GetSyncValuesCHROMIUM(EGLDisplay dpy,
-                                                              EGLSurface surface,
-                                                              EGLuint64KHR *ust,
-                                                              EGLuint64KHR *msc,
-                                                              EGLuint64KHR *sbc);
-
-// EGL_ANGLE_sync_control_rate
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_GetMscRateANGLE(EGLDisplay dpy,
-                                                        EGLSurface surface,
-                                                        EGLint *numerator,
-                                                        EGLint *denominator);
-
-// EGL_KHR_swap_buffers_with_damage
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_SwapBuffersWithDamageKHR(EGLDisplay dpy,
-                                                                 EGLSurface surface,
-                                                                 EGLint *rects,
-                                                                 EGLint n_rects);
-
-// EGL_ANDROID_presentation_time
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_PresentationTimeANDROID(EGLDisplay dpy,
-                                                                EGLSurface surface,
-                                                                EGLnsecsANDROID time);
-
-// EGL_ANDRIOD_blob_cache
-ANGLE_EXPORT void EGLAPIENTRY EGL_SetBlobCacheFuncsANDROID(EGLDisplay dpy,
-                                                           EGLSetBlobFuncANDROID set,
-                                                           EGLGetBlobFuncANDROID get);
+// EGL_ANGLE_power_preference
+ANGLE_EXPORT void EGLAPIENTRY EGL_ReleaseHighPowerGPUANGLE(EGLDisplay dpy, EGLContext ctx);
+ANGLE_EXPORT void EGLAPIENTRY EGL_ReacquireHighPowerGPUANGLE(EGLDisplay dpy, EGLContext ctx);
+ANGLE_EXPORT void EGLAPIENTRY EGL_HandleGPUSwitchANGLE(EGLDisplay dpy);
 
 // EGL_ANGLE_program_cache_control
 ANGLE_EXPORT EGLint EGLAPIENTRY EGL_ProgramCacheGetAttribANGLE(EGLDisplay dpy, EGLenum attrib);
@@ -172,60 +94,23 @@
                                                             EGLint binarysize);
 ANGLE_EXPORT EGLint EGLAPIENTRY EGL_ProgramCacheResizeANGLE(EGLDisplay dpy,
                                                             EGLint limit,
-                                                            EGLenum mode);
+                                                            EGLint mode);
 
-// EGL_KHR_debug
-ANGLE_EXPORT EGLint EGLAPIENTRY EGL_DebugMessageControlKHR(EGLDEBUGPROCKHR callback,
-                                                           const EGLAttrib *attrib_list);
+// EGL_ANGLE_query_surface_pointer
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_QuerySurfacePointerANGLE(EGLDisplay dpy,
+                                                                 EGLSurface surface,
+                                                                 EGLint attribute,
+                                                                 void **value);
 
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_QueryDebugKHR(EGLint attribute, EGLAttrib *value);
-
-ANGLE_EXPORT EGLint EGLAPIENTRY EGL_LabelObjectKHR(EGLDisplay display,
-                                                   EGLenum objectType,
-                                                   EGLObjectKHR object,
-                                                   EGLLabelKHR label);
-
-// ANDROID_get_frame_timestamps
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_GetCompositorTimingSupportedANDROID(EGLDisplay dpy,
-                                                                            EGLSurface surface,
-                                                                            EGLint name);
-
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_GetCompositorTimingANDROID(EGLDisplay dpy,
-                                                                   EGLSurface surface,
-                                                                   EGLint numTimestamps,
-                                                                   const EGLint *names,
-                                                                   EGLnsecsANDROID *values);
-
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_GetNextFrameIdANDROID(EGLDisplay dpy,
-                                                              EGLSurface surface,
-                                                              EGLuint64KHR *frameId);
-
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_GetFrameTimestampSupportedANDROID(EGLDisplay dpy,
-                                                                          EGLSurface surface,
-                                                                          EGLint timestamp);
-
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_GetFrameTimestampsANDROID(EGLDisplay dpy,
-                                                                  EGLSurface surface,
-                                                                  EGLuint64KHR frameId,
-                                                                  EGLint numTimestamps,
-                                                                  const EGLint *timestamps,
-                                                                  EGLnsecsANDROID *values);
-
-// EGL_ANGLE_feature_control
-ANGLE_EXPORT const char *EGLAPIENTRY EGL_QueryStringiANGLE(EGLDisplay dpy,
-                                                           EGLint name,
-                                                           EGLint index);
-
-// EGL_ANDROID_get_native_client_buffer
-ANGLE_EXPORT EGLClientBuffer EGLAPIENTRY
-EGL_GetNativeClientBufferANDROID(const struct AHardwareBuffer *buffer);
-
-// EGL_ANDROID_create_native_client_buffer
-ANGLE_EXPORT EGLClientBuffer EGLAPIENTRY
-EGL_CreateNativeClientBufferANDROID(const EGLint *attrib_list);
-
-// EGL_ANDROID_native_fence_sync
-ANGLE_EXPORT EGLint EGLAPIENTRY EGL_DupNativeFenceFDANDROID(EGLDisplay dpy, EGLSyncKHR sync);
+// EGL_ANGLE_stream_producer_d3d_texture
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY
+EGL_CreateStreamProducerD3DTextureANGLE(EGLDisplay dpy,
+                                        EGLStreamKHR stream,
+                                        const EGLAttrib *attrib_list);
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_StreamPostD3DTextureANGLE(EGLDisplay dpy,
+                                                                  EGLStreamKHR stream,
+                                                                  void *texture,
+                                                                  const EGLAttrib *attrib_list);
 
 // EGL_ANGLE_swap_with_frame_token
 ANGLE_EXPORT EGLBoolean EGLAPIENTRY
@@ -233,16 +118,124 @@
                                    EGLSurface surface,
                                    EGLFrameTokenANGLE frametoken);
 
-// EGL_ANGLE_power_preference
-ANGLE_EXPORT void EGLAPIENTRY EGL_ReleaseHighPowerGPUANGLE(EGLDisplay dpy, EGLContext ctx);
+// EGL_ANGLE_sync_control_rate
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_GetMscRateANGLE(EGLDisplay dpy,
+                                                        EGLSurface surface,
+                                                        EGLint *numerator,
+                                                        EGLint *denominator);
 
-ANGLE_EXPORT void EGLAPIENTRY EGL_ReacquireHighPowerGPUANGLE(EGLDisplay dpy, EGLContext ctx);
+// EGL_CHROMIUM_sync_control
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_GetSyncValuesCHROMIUM(EGLDisplay dpy,
+                                                              EGLSurface surface,
+                                                              EGLuint64KHR *ust,
+                                                              EGLuint64KHR *msc,
+                                                              EGLuint64KHR *sbc);
 
-ANGLE_EXPORT void EGLAPIENTRY EGL_HandleGPUSwitchANGLE(EGLDisplay dpy);
+// EGL_EXT_device_query
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_QueryDeviceAttribEXT(EGLDeviceEXT device,
+                                                             EGLint attribute,
+                                                             EGLAttrib *value);
+ANGLE_EXPORT const char *EGLAPIENTRY EGL_QueryDeviceStringEXT(EGLDeviceEXT device, EGLint name);
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_QueryDisplayAttribEXT(EGLDisplay dpy,
+                                                              EGLint attribute,
+                                                              EGLAttrib *value);
+
+// EGL_EXT_platform_base
+ANGLE_EXPORT EGLSurface EGLAPIENTRY EGL_CreatePlatformPixmapSurfaceEXT(EGLDisplay dpy,
+                                                                       EGLConfig config,
+                                                                       void *native_pixmap,
+                                                                       const EGLint *attrib_list);
+ANGLE_EXPORT EGLSurface EGLAPIENTRY EGL_CreatePlatformWindowSurfaceEXT(EGLDisplay dpy,
+                                                                       EGLConfig config,
+                                                                       void *native_window,
+                                                                       const EGLint *attrib_list);
+ANGLE_EXPORT EGLDisplay EGLAPIENTRY EGL_GetPlatformDisplayEXT(EGLenum platform,
+                                                              void *native_display,
+                                                              const EGLint *attrib_list);
+
+// EGL_KHR_debug
+ANGLE_EXPORT EGLint EGLAPIENTRY EGL_DebugMessageControlKHR(EGLDEBUGPROCKHR callback,
+                                                           const EGLAttrib *attrib_list);
+ANGLE_EXPORT EGLint EGLAPIENTRY EGL_LabelObjectKHR(EGLDisplay display,
+                                                   EGLenum objectType,
+                                                   EGLObjectKHR object,
+                                                   EGLLabelKHR label);
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_QueryDebugKHR(EGLint attribute, EGLAttrib *value);
+
+// EGL_KHR_fence_sync
+ANGLE_EXPORT EGLint EGLAPIENTRY EGL_ClientWaitSyncKHR(EGLDisplay dpy,
+                                                      EGLSyncKHR sync,
+                                                      EGLint flags,
+                                                      EGLTimeKHR timeout);
+ANGLE_EXPORT EGLSyncKHR EGLAPIENTRY EGL_CreateSyncKHR(EGLDisplay dpy,
+                                                      EGLenum type,
+                                                      const EGLint *attrib_list);
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_DestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync);
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_GetSyncAttribKHR(EGLDisplay dpy,
+                                                         EGLSyncKHR sync,
+                                                         EGLint attribute,
+                                                         EGLint *value);
+
+// EGL_KHR_image
+ANGLE_EXPORT EGLImageKHR EGLAPIENTRY EGL_CreateImageKHR(EGLDisplay dpy,
+                                                        EGLContext ctx,
+                                                        EGLenum target,
+                                                        EGLClientBuffer buffer,
+                                                        const EGLint *attrib_list);
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_DestroyImageKHR(EGLDisplay dpy, EGLImageKHR image);
 
 // EGL_KHR_reusable_sync
-ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_SignalSyncKHR(EGLDisplay dpy, EGLSync sync, EGLenum mode);
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_SignalSyncKHR(EGLDisplay dpy,
+                                                      EGLSyncKHR sync,
+                                                      EGLenum mode);
 
+// EGL_KHR_stream
+ANGLE_EXPORT EGLStreamKHR EGLAPIENTRY EGL_CreateStreamKHR(EGLDisplay dpy,
+                                                          const EGLint *attrib_list);
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_DestroyStreamKHR(EGLDisplay dpy, EGLStreamKHR stream);
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_QueryStreamKHR(EGLDisplay dpy,
+                                                       EGLStreamKHR stream,
+                                                       EGLenum attribute,
+                                                       EGLint *value);
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_QueryStreamu64KHR(EGLDisplay dpy,
+                                                          EGLStreamKHR stream,
+                                                          EGLenum attribute,
+                                                          EGLuint64KHR *value);
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_StreamAttribKHR(EGLDisplay dpy,
+                                                        EGLStreamKHR stream,
+                                                        EGLenum attribute,
+                                                        EGLint value);
+
+// EGL_KHR_stream_consumer_gltexture
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_StreamConsumerAcquireKHR(EGLDisplay dpy,
+                                                                 EGLStreamKHR stream);
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_StreamConsumerGLTextureExternalKHR(EGLDisplay dpy,
+                                                                           EGLStreamKHR stream);
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_StreamConsumerReleaseKHR(EGLDisplay dpy,
+                                                                 EGLStreamKHR stream);
+
+// EGL_KHR_swap_buffers_with_damage
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_SwapBuffersWithDamageKHR(EGLDisplay dpy,
+                                                                 EGLSurface surface,
+                                                                 const EGLint *rects,
+                                                                 EGLint n_rects);
+
+// EGL_KHR_wait_sync
+ANGLE_EXPORT EGLint EGLAPIENTRY EGL_WaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags);
+
+// EGL_NV_post_sub_buffer
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_PostSubBufferNV(EGLDisplay dpy,
+                                                        EGLSurface surface,
+                                                        EGLint x,
+                                                        EGLint y,
+                                                        EGLint width,
+                                                        EGLint height);
+
+// EGL_NV_stream_consumer_gltexture_yuv
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY
+EGL_StreamConsumerGLTextureExternalAttribsNV(EGLDisplay dpy,
+                                             EGLStreamKHR stream,
+                                             const EGLAttrib *attrib_list);
 }  // extern "C"
 
-#endif  // LIBGLESV2_ENTRYPOINTSEGLEXT_H_
+#endif  // LIBGLESV2_ENTRY_POINTS_EGL_EXT_AUTOGEN_H_
diff --git a/src/libGLESv2/entry_points_gles_1_0_autogen.cpp b/src/libGLESv2/entry_points_gles_1_0_autogen.cpp
index ffa8424..c8ab8ce 100644
--- a/src/libGLESv2/entry_points_gles_1_0_autogen.cpp
+++ b/src/libGLESv2/entry_points_gles_1_0_autogen.cpp
@@ -24,12 +24,12 @@
 void GL_APIENTRY AlphaFunc(GLenum func, GLfloat ref)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::AlphaFunc, "glAlphaFunc", "context = %d, func = %s, ref = %f",
-          CID(context), GLenumToString(GLenumGroup::AlphaFunction, func), ref);
+    EVENT(context, GLAlphaFunc, "context = %d, func = %s, ref = %f", CID(context),
+          GLenumToString(GLenumGroup::AlphaFunction, func), ref);
 
     if (context)
     {
-        AlphaTestFunc funcPacked                              = FromGL<AlphaTestFunc>(func);
+        AlphaTestFunc funcPacked                              = PackParam<AlphaTestFunc>(func);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateAlphaFunc(context, funcPacked, ref));
@@ -48,13 +48,12 @@
 void GL_APIENTRY AlphaFuncx(GLenum func, GLfixed ref)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::AlphaFuncx, "glAlphaFuncx",
-          "context = %d, func = %s, ref = 0x%X", CID(context),
+    EVENT(context, GLAlphaFuncx, "context = %d, func = %s, ref = 0x%X", CID(context),
           GLenumToString(GLenumGroup::AlphaFunction, func), ref);
 
     if (context)
     {
-        AlphaTestFunc funcPacked                              = FromGL<AlphaTestFunc>(func);
+        AlphaTestFunc funcPacked                              = PackParam<AlphaTestFunc>(func);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateAlphaFuncx(context, funcPacked, ref));
@@ -73,7 +72,7 @@
 void GL_APIENTRY ClearColorx(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ClearColorx, "glClearColorx",
+    EVENT(context, GLClearColorx,
           "context = %d, red = 0x%X, green = 0x%X, blue = 0x%X, alpha = 0x%X", CID(context), red,
           green, blue, alpha);
 
@@ -97,8 +96,7 @@
 void GL_APIENTRY ClearDepthx(GLfixed depth)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ClearDepthx, "glClearDepthx", "context = %d, depth = 0x%X",
-          CID(context), depth);
+    EVENT(context, GLClearDepthx, "context = %d, depth = 0x%X", CID(context), depth);
 
     if (context)
     {
@@ -119,8 +117,7 @@
 void GL_APIENTRY ClientActiveTexture(GLenum texture)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ClientActiveTexture, "glClientActiveTexture",
-          "context = %d, texture = %s", CID(context),
+    EVENT(context, GLClientActiveTexture, "context = %d, texture = %s", CID(context),
           GLenumToString(GLenumGroup::TextureUnit, texture));
 
     if (context)
@@ -143,8 +140,7 @@
 void GL_APIENTRY ClipPlanef(GLenum p, const GLfloat *eqn)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ClipPlanef, "glClipPlanef",
-          "context = %d, p = %s, eqn = 0x%016" PRIxPTR "", CID(context),
+    EVENT(context, GLClipPlanef, "context = %d, p = %s, eqn = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::ClipPlaneName, p), (uintptr_t)eqn);
 
     if (context)
@@ -166,9 +162,8 @@
 void GL_APIENTRY ClipPlanex(GLenum plane, const GLfixed *equation)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ClipPlanex, "glClipPlanex",
-          "context = %d, plane = %s, equation = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::ClipPlaneName, plane), (uintptr_t)equation);
+    EVENT(context, GLClipPlanex, "context = %d, plane = %s, equation = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::ClipPlaneName, plane), (uintptr_t)equation);
 
     if (context)
     {
@@ -190,9 +185,8 @@
 void GL_APIENTRY Color4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Color4f, "glColor4f",
-          "context = %d, red = %f, green = %f, blue = %f, alpha = %f", CID(context), red, green,
-          blue, alpha);
+    EVENT(context, GLColor4f, "context = %d, red = %f, green = %f, blue = %f, alpha = %f",
+          CID(context), red, green, blue, alpha);
 
     if (context)
     {
@@ -214,9 +208,8 @@
 void GL_APIENTRY Color4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Color4ub, "glColor4ub",
-          "context = %d, red = %d, green = %d, blue = %d, alpha = %d", CID(context), red, green,
-          blue, alpha);
+    EVENT(context, GLColor4ub, "context = %d, red = %d, green = %d, blue = %d, alpha = %d",
+          CID(context), red, green, blue, alpha);
 
     if (context)
     {
@@ -238,9 +231,8 @@
 void GL_APIENTRY Color4x(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Color4x, "glColor4x",
-          "context = %d, red = 0x%X, green = 0x%X, blue = 0x%X, alpha = 0x%X", CID(context), red,
-          green, blue, alpha);
+    EVENT(context, GLColor4x, "context = %d, red = 0x%X, green = 0x%X, blue = 0x%X, alpha = 0x%X",
+          CID(context), red, green, blue, alpha);
 
     if (context)
     {
@@ -262,14 +254,14 @@
 void GL_APIENTRY ColorPointer(GLint size, GLenum type, GLsizei stride, const void *pointer)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ColorPointer, "glColorPointer",
+    EVENT(context, GLColorPointer,
           "context = %d, size = %d, type = %s, stride = %d, pointer = 0x%016" PRIxPTR "",
           CID(context), size, GLenumToString(GLenumGroup::ColorPointerType, type), stride,
           (uintptr_t)pointer);
 
     if (context)
     {
-        VertexAttribType typePacked                           = FromGL<VertexAttribType>(type);
+        VertexAttribType typePacked                           = PackParam<VertexAttribType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateColorPointer(context, size, typePacked, stride, pointer));
@@ -288,8 +280,7 @@
 void GL_APIENTRY DepthRangex(GLfixed n, GLfixed f)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DepthRangex, "glDepthRangex", "context = %d, n = 0x%X, f = 0x%X",
-          CID(context), n, f);
+    EVENT(context, GLDepthRangex, "context = %d, n = 0x%X, f = 0x%X", CID(context), n, f);
 
     if (context)
     {
@@ -310,12 +301,12 @@
 void GL_APIENTRY DisableClientState(GLenum array)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DisableClientState, "glDisableClientState",
-          "context = %d, array = %s", CID(context), GLenumToString(GLenumGroup::EnableCap, array));
+    EVENT(context, GLDisableClientState, "context = %d, array = %s", CID(context),
+          GLenumToString(GLenumGroup::EnableCap, array));
 
     if (context)
     {
-        ClientVertexArrayType arrayPacked = FromGL<ClientVertexArrayType>(array);
+        ClientVertexArrayType arrayPacked = PackParam<ClientVertexArrayType>(array);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateDisableClientState(context, arrayPacked));
@@ -334,12 +325,12 @@
 void GL_APIENTRY EnableClientState(GLenum array)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::EnableClientState, "glEnableClientState",
-          "context = %d, array = %s", CID(context), GLenumToString(GLenumGroup::EnableCap, array));
+    EVENT(context, GLEnableClientState, "context = %d, array = %s", CID(context),
+          GLenumToString(GLenumGroup::EnableCap, array));
 
     if (context)
     {
-        ClientVertexArrayType arrayPacked = FromGL<ClientVertexArrayType>(array);
+        ClientVertexArrayType arrayPacked = PackParam<ClientVertexArrayType>(array);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateEnableClientState(context, arrayPacked));
@@ -358,8 +349,8 @@
 void GL_APIENTRY Fogf(GLenum pname, GLfloat param)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Fogf, "glFogf", "context = %d, pname = %s, param = %f",
-          CID(context), GLenumToString(GLenumGroup::FogParameter, pname), param);
+    EVENT(context, GLFogf, "context = %d, pname = %s, param = %f", CID(context),
+          GLenumToString(GLenumGroup::FogParameter, pname), param);
 
     if (context)
     {
@@ -380,8 +371,7 @@
 void GL_APIENTRY Fogfv(GLenum pname, const GLfloat *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Fogfv, "glFogfv",
-          "context = %d, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
+    EVENT(context, GLFogfv, "context = %d, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::FogParameter, pname), (uintptr_t)params);
 
     if (context)
@@ -403,8 +393,8 @@
 void GL_APIENTRY Fogx(GLenum pname, GLfixed param)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Fogx, "glFogx", "context = %d, pname = %s, param = 0x%X",
-          CID(context), GLenumToString(GLenumGroup::FogPName, pname), param);
+    EVENT(context, GLFogx, "context = %d, pname = %s, param = 0x%X", CID(context),
+          GLenumToString(GLenumGroup::FogPName, pname), param);
 
     if (context)
     {
@@ -425,8 +415,7 @@
 void GL_APIENTRY Fogxv(GLenum pname, const GLfixed *param)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Fogxv, "glFogxv",
-          "context = %d, pname = %s, param = 0x%016" PRIxPTR "", CID(context),
+    EVENT(context, GLFogxv, "context = %d, pname = %s, param = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::FogPName, pname), (uintptr_t)param);
 
     if (context)
@@ -448,9 +437,8 @@
 void GL_APIENTRY Frustumf(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Frustumf, "glFrustumf",
-          "context = %d, l = %f, r = %f, b = %f, t = %f, n = %f, f = %f", CID(context), l, r, b, t,
-          n, f);
+    EVENT(context, GLFrustumf, "context = %d, l = %f, r = %f, b = %f, t = %f, n = %f, f = %f",
+          CID(context), l, r, b, t, n, f);
 
     if (context)
     {
@@ -472,7 +460,7 @@
 void GL_APIENTRY Frustumx(GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Frustumx, "glFrustumx",
+    EVENT(context, GLFrustumx,
           "context = %d, l = 0x%X, r = 0x%X, b = 0x%X, t = 0x%X, n = 0x%X, f = 0x%X", CID(context),
           l, r, b, t, n, f);
 
@@ -496,9 +484,8 @@
 void GL_APIENTRY GetClipPlanef(GLenum plane, GLfloat *equation)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetClipPlanef, "glGetClipPlanef",
-          "context = %d, plane = %s, equation = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::ClipPlaneName, plane), (uintptr_t)equation);
+    EVENT(context, GLGetClipPlanef, "context = %d, plane = %s, equation = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::ClipPlaneName, plane), (uintptr_t)equation);
 
     if (context)
     {
@@ -520,9 +507,8 @@
 void GL_APIENTRY GetClipPlanex(GLenum plane, GLfixed *equation)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetClipPlanex, "glGetClipPlanex",
-          "context = %d, plane = %s, equation = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::ClipPlaneName, plane), (uintptr_t)equation);
+    EVENT(context, GLGetClipPlanex, "context = %d, plane = %s, equation = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::ClipPlaneName, plane), (uintptr_t)equation);
 
     if (context)
     {
@@ -544,9 +530,8 @@
 void GL_APIENTRY GetFixedv(GLenum pname, GLfixed *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetFixedv, "glGetFixedv",
-          "context = %d, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::GetPName, pname), (uintptr_t)params);
+    EVENT(context, GLGetFixedv, "context = %d, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::GetPName, pname), (uintptr_t)params);
 
     if (context)
     {
@@ -567,14 +552,13 @@
 void GL_APIENTRY GetLightfv(GLenum light, GLenum pname, GLfloat *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetLightfv, "glGetLightfv",
-          "context = %d, light = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::LightName, light),
+    EVENT(context, GLGetLightfv, "context = %d, light = %s, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::LightName, light),
           GLenumToString(GLenumGroup::LightParameter, pname), (uintptr_t)params);
 
     if (context)
     {
-        LightParameter pnamePacked                            = FromGL<LightParameter>(pname);
+        LightParameter pnamePacked                            = PackParam<LightParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGetLightfv(context, light, pnamePacked, params));
@@ -593,14 +577,13 @@
 void GL_APIENTRY GetLightxv(GLenum light, GLenum pname, GLfixed *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetLightxv, "glGetLightxv",
-          "context = %d, light = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::LightName, light),
+    EVENT(context, GLGetLightxv, "context = %d, light = %s, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::LightName, light),
           GLenumToString(GLenumGroup::LightParameter, pname), (uintptr_t)params);
 
     if (context)
     {
-        LightParameter pnamePacked                            = FromGL<LightParameter>(pname);
+        LightParameter pnamePacked                            = PackParam<LightParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGetLightxv(context, light, pnamePacked, params));
@@ -619,14 +602,14 @@
 void GL_APIENTRY GetMaterialfv(GLenum face, GLenum pname, GLfloat *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetMaterialfv, "glGetMaterialfv",
+    EVENT(context, GLGetMaterialfv,
           "context = %d, face = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::MaterialFace, face),
           GLenumToString(GLenumGroup::MaterialParameter, pname), (uintptr_t)params);
 
     if (context)
     {
-        MaterialParameter pnamePacked                         = FromGL<MaterialParameter>(pname);
+        MaterialParameter pnamePacked                         = PackParam<MaterialParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetMaterialfv(context, face, pnamePacked, params));
@@ -645,14 +628,14 @@
 void GL_APIENTRY GetMaterialxv(GLenum face, GLenum pname, GLfixed *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetMaterialxv, "glGetMaterialxv",
+    EVENT(context, GLGetMaterialxv,
           "context = %d, face = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::MaterialFace, face),
           GLenumToString(GLenumGroup::MaterialParameter, pname), (uintptr_t)params);
 
     if (context)
     {
-        MaterialParameter pnamePacked                         = FromGL<MaterialParameter>(pname);
+        MaterialParameter pnamePacked                         = PackParam<MaterialParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetMaterialxv(context, face, pnamePacked, params));
@@ -671,15 +654,15 @@
 void GL_APIENTRY GetTexEnvfv(GLenum target, GLenum pname, GLfloat *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTexEnvfv, "glGetTexEnvfv",
+    EVENT(context, GLGetTexEnvfv,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureEnvTarget, target),
           GLenumToString(GLenumGroup::TextureEnvParameter, pname), (uintptr_t)params);
 
     if (context)
     {
-        TextureEnvTarget targetPacked                         = FromGL<TextureEnvTarget>(target);
-        TextureEnvParameter pnamePacked                       = FromGL<TextureEnvParameter>(pname);
+        TextureEnvTarget targetPacked   = PackParam<TextureEnvTarget>(target);
+        TextureEnvParameter pnamePacked = PackParam<TextureEnvParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetTexEnvfv(context, targetPacked, pnamePacked, params));
@@ -698,15 +681,15 @@
 void GL_APIENTRY GetTexEnviv(GLenum target, GLenum pname, GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTexEnviv, "glGetTexEnviv",
+    EVENT(context, GLGetTexEnviv,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureEnvTarget, target),
           GLenumToString(GLenumGroup::TextureEnvParameter, pname), (uintptr_t)params);
 
     if (context)
     {
-        TextureEnvTarget targetPacked                         = FromGL<TextureEnvTarget>(target);
-        TextureEnvParameter pnamePacked                       = FromGL<TextureEnvParameter>(pname);
+        TextureEnvTarget targetPacked   = PackParam<TextureEnvTarget>(target);
+        TextureEnvParameter pnamePacked = PackParam<TextureEnvParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetTexEnviv(context, targetPacked, pnamePacked, params));
@@ -725,15 +708,15 @@
 void GL_APIENTRY GetTexEnvxv(GLenum target, GLenum pname, GLfixed *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTexEnvxv, "glGetTexEnvxv",
+    EVENT(context, GLGetTexEnvxv,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureEnvTarget, target),
           GLenumToString(GLenumGroup::TextureEnvParameter, pname), (uintptr_t)params);
 
     if (context)
     {
-        TextureEnvTarget targetPacked                         = FromGL<TextureEnvTarget>(target);
-        TextureEnvParameter pnamePacked                       = FromGL<TextureEnvParameter>(pname);
+        TextureEnvTarget targetPacked   = PackParam<TextureEnvTarget>(target);
+        TextureEnvParameter pnamePacked = PackParam<TextureEnvParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetTexEnvxv(context, targetPacked, pnamePacked, params));
@@ -752,14 +735,14 @@
 void GL_APIENTRY GetTexParameterxv(GLenum target, GLenum pname, GLfixed *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTexParameterxv, "glGetTexParameterxv",
+    EVENT(context, GLGetTexParameterxv,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetTexParameterxv(context, targetPacked, pname, params));
@@ -778,8 +761,7 @@
 void GL_APIENTRY LightModelf(GLenum pname, GLfloat param)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::LightModelf, "glLightModelf",
-          "context = %d, pname = %s, param = %f", CID(context),
+    EVENT(context, GLLightModelf, "context = %d, pname = %s, param = %f", CID(context),
           GLenumToString(GLenumGroup::LightModelParameter, pname), param);
 
     if (context)
@@ -802,9 +784,8 @@
 void GL_APIENTRY LightModelfv(GLenum pname, const GLfloat *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::LightModelfv, "glLightModelfv",
-          "context = %d, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::LightModelParameter, pname), (uintptr_t)params);
+    EVENT(context, GLLightModelfv, "context = %d, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::LightModelParameter, pname), (uintptr_t)params);
 
     if (context)
     {
@@ -826,8 +807,7 @@
 void GL_APIENTRY LightModelx(GLenum pname, GLfixed param)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::LightModelx, "glLightModelx",
-          "context = %d, pname = %s, param = 0x%X", CID(context),
+    EVENT(context, GLLightModelx, "context = %d, pname = %s, param = 0x%X", CID(context),
           GLenumToString(GLenumGroup::LightModelParameter, pname), param);
 
     if (context)
@@ -850,9 +830,8 @@
 void GL_APIENTRY LightModelxv(GLenum pname, const GLfixed *param)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::LightModelxv, "glLightModelxv",
-          "context = %d, pname = %s, param = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::LightModelParameter, pname), (uintptr_t)param);
+    EVENT(context, GLLightModelxv, "context = %d, pname = %s, param = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::LightModelParameter, pname), (uintptr_t)param);
 
     if (context)
     {
@@ -874,14 +853,13 @@
 void GL_APIENTRY Lightf(GLenum light, GLenum pname, GLfloat param)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Lightf, "glLightf",
-          "context = %d, light = %s, pname = %s, param = %f", CID(context),
+    EVENT(context, GLLightf, "context = %d, light = %s, pname = %s, param = %f", CID(context),
           GLenumToString(GLenumGroup::LightName, light),
           GLenumToString(GLenumGroup::LightParameter, pname), param);
 
     if (context)
     {
-        LightParameter pnamePacked                            = FromGL<LightParameter>(pname);
+        LightParameter pnamePacked                            = PackParam<LightParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateLightf(context, light, pnamePacked, param));
@@ -900,14 +878,13 @@
 void GL_APIENTRY Lightfv(GLenum light, GLenum pname, const GLfloat *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Lightfv, "glLightfv",
-          "context = %d, light = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::LightName, light),
+    EVENT(context, GLLightfv, "context = %d, light = %s, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::LightName, light),
           GLenumToString(GLenumGroup::LightParameter, pname), (uintptr_t)params);
 
     if (context)
     {
-        LightParameter pnamePacked                            = FromGL<LightParameter>(pname);
+        LightParameter pnamePacked                            = PackParam<LightParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateLightfv(context, light, pnamePacked, params));
@@ -926,14 +903,13 @@
 void GL_APIENTRY Lightx(GLenum light, GLenum pname, GLfixed param)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Lightx, "glLightx",
-          "context = %d, light = %s, pname = %s, param = 0x%X", CID(context),
+    EVENT(context, GLLightx, "context = %d, light = %s, pname = %s, param = 0x%X", CID(context),
           GLenumToString(GLenumGroup::LightName, light),
           GLenumToString(GLenumGroup::LightParameter, pname), param);
 
     if (context)
     {
-        LightParameter pnamePacked                            = FromGL<LightParameter>(pname);
+        LightParameter pnamePacked                            = PackParam<LightParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateLightx(context, light, pnamePacked, param));
@@ -952,14 +928,13 @@
 void GL_APIENTRY Lightxv(GLenum light, GLenum pname, const GLfixed *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Lightxv, "glLightxv",
-          "context = %d, light = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::LightName, light),
+    EVENT(context, GLLightxv, "context = %d, light = %s, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::LightName, light),
           GLenumToString(GLenumGroup::LightParameter, pname), (uintptr_t)params);
 
     if (context)
     {
-        LightParameter pnamePacked                            = FromGL<LightParameter>(pname);
+        LightParameter pnamePacked                            = PackParam<LightParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateLightxv(context, light, pnamePacked, params));
@@ -978,8 +953,7 @@
 void GL_APIENTRY LineWidthx(GLfixed width)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::LineWidthx, "glLineWidthx", "context = %d, width = 0x%X",
-          CID(context), width);
+    EVENT(context, GLLineWidthx, "context = %d, width = 0x%X", CID(context), width);
 
     if (context)
     {
@@ -1000,7 +974,7 @@
 void GL_APIENTRY LoadIdentity()
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::LoadIdentity, "glLoadIdentity", "context = %d", CID(context));
+    EVENT(context, GLLoadIdentity, "context = %d", CID(context));
 
     if (context)
     {
@@ -1021,8 +995,8 @@
 void GL_APIENTRY LoadMatrixf(const GLfloat *m)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::LoadMatrixf, "glLoadMatrixf",
-          "context = %d, m = 0x%016" PRIxPTR "", CID(context), (uintptr_t)m);
+    EVENT(context, GLLoadMatrixf, "context = %d, m = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)m);
 
     if (context)
     {
@@ -1043,8 +1017,8 @@
 void GL_APIENTRY LoadMatrixx(const GLfixed *m)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::LoadMatrixx, "glLoadMatrixx",
-          "context = %d, m = 0x%016" PRIxPTR "", CID(context), (uintptr_t)m);
+    EVENT(context, GLLoadMatrixx, "context = %d, m = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)m);
 
     if (context)
     {
@@ -1065,12 +1039,12 @@
 void GL_APIENTRY LogicOp(GLenum opcode)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::LogicOp, "glLogicOp", "context = %d, opcode = %s", CID(context),
+    EVENT(context, GLLogicOp, "context = %d, opcode = %s", CID(context),
           GLenumToString(GLenumGroup::LogicOp, opcode));
 
     if (context)
     {
-        LogicalOperation opcodePacked                         = FromGL<LogicalOperation>(opcode);
+        LogicalOperation opcodePacked                         = PackParam<LogicalOperation>(opcode);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateLogicOp(context, opcodePacked));
         if (isCallValid)
@@ -1088,14 +1062,13 @@
 void GL_APIENTRY Materialf(GLenum face, GLenum pname, GLfloat param)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Materialf, "glMaterialf",
-          "context = %d, face = %s, pname = %s, param = %f", CID(context),
+    EVENT(context, GLMaterialf, "context = %d, face = %s, pname = %s, param = %f", CID(context),
           GLenumToString(GLenumGroup::MaterialFace, face),
           GLenumToString(GLenumGroup::MaterialParameter, pname), param);
 
     if (context)
     {
-        MaterialParameter pnamePacked                         = FromGL<MaterialParameter>(pname);
+        MaterialParameter pnamePacked                         = PackParam<MaterialParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateMaterialf(context, face, pnamePacked, param));
@@ -1114,14 +1087,13 @@
 void GL_APIENTRY Materialfv(GLenum face, GLenum pname, const GLfloat *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Materialfv, "glMaterialfv",
-          "context = %d, face = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::MaterialFace, face),
+    EVENT(context, GLMaterialfv, "context = %d, face = %s, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::MaterialFace, face),
           GLenumToString(GLenumGroup::MaterialParameter, pname), (uintptr_t)params);
 
     if (context)
     {
-        MaterialParameter pnamePacked                         = FromGL<MaterialParameter>(pname);
+        MaterialParameter pnamePacked                         = PackParam<MaterialParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateMaterialfv(context, face, pnamePacked, params));
@@ -1140,14 +1112,13 @@
 void GL_APIENTRY Materialx(GLenum face, GLenum pname, GLfixed param)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Materialx, "glMaterialx",
-          "context = %d, face = %s, pname = %s, param = 0x%X", CID(context),
+    EVENT(context, GLMaterialx, "context = %d, face = %s, pname = %s, param = 0x%X", CID(context),
           GLenumToString(GLenumGroup::MaterialFace, face),
           GLenumToString(GLenumGroup::MaterialParameter, pname), param);
 
     if (context)
     {
-        MaterialParameter pnamePacked                         = FromGL<MaterialParameter>(pname);
+        MaterialParameter pnamePacked                         = PackParam<MaterialParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateMaterialx(context, face, pnamePacked, param));
@@ -1166,14 +1137,13 @@
 void GL_APIENTRY Materialxv(GLenum face, GLenum pname, const GLfixed *param)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Materialxv, "glMaterialxv",
-          "context = %d, face = %s, pname = %s, param = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::MaterialFace, face),
+    EVENT(context, GLMaterialxv, "context = %d, face = %s, pname = %s, param = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::MaterialFace, face),
           GLenumToString(GLenumGroup::MaterialParameter, pname), (uintptr_t)param);
 
     if (context)
     {
-        MaterialParameter pnamePacked                         = FromGL<MaterialParameter>(pname);
+        MaterialParameter pnamePacked                         = PackParam<MaterialParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateMaterialxv(context, face, pnamePacked, param));
@@ -1192,12 +1162,12 @@
 void GL_APIENTRY MatrixMode(GLenum mode)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MatrixMode, "glMatrixMode", "context = %d, mode = %s",
-          CID(context), GLenumToString(GLenumGroup::MatrixMode, mode));
+    EVENT(context, GLMatrixMode, "context = %d, mode = %s", CID(context),
+          GLenumToString(GLenumGroup::MatrixMode, mode));
 
     if (context)
     {
-        MatrixType modePacked                                 = FromGL<MatrixType>(mode);
+        MatrixType modePacked                                 = PackParam<MatrixType>(mode);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateMatrixMode(context, modePacked));
         if (isCallValid)
@@ -1215,8 +1185,8 @@
 void GL_APIENTRY MultMatrixf(const GLfloat *m)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultMatrixf, "glMultMatrixf",
-          "context = %d, m = 0x%016" PRIxPTR "", CID(context), (uintptr_t)m);
+    EVENT(context, GLMultMatrixf, "context = %d, m = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)m);
 
     if (context)
     {
@@ -1237,8 +1207,8 @@
 void GL_APIENTRY MultMatrixx(const GLfixed *m)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultMatrixx, "glMultMatrixx",
-          "context = %d, m = 0x%016" PRIxPTR "", CID(context), (uintptr_t)m);
+    EVENT(context, GLMultMatrixx, "context = %d, m = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)m);
 
     if (context)
     {
@@ -1259,9 +1229,8 @@
 void GL_APIENTRY MultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoord4f, "glMultiTexCoord4f",
-          "context = %d, target = %s, s = %f, t = %f, r = %f, q = %f", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, target), s, t, r, q);
+    EVENT(context, GLMultiTexCoord4f, "context = %d, target = %s, s = %f, t = %f, r = %f, q = %f",
+          CID(context), GLenumToString(GLenumGroup::TextureUnit, target), s, t, r, q);
 
     if (context)
     {
@@ -1283,7 +1252,7 @@
 void GL_APIENTRY MultiTexCoord4x(GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiTexCoord4x, "glMultiTexCoord4x",
+    EVENT(context, GLMultiTexCoord4x,
           "context = %d, texture = %s, s = 0x%X, t = 0x%X, r = 0x%X, q = 0x%X", CID(context),
           GLenumToString(GLenumGroup::TextureUnit, texture), s, t, r, q);
 
@@ -1307,8 +1276,7 @@
 void GL_APIENTRY Normal3f(GLfloat nx, GLfloat ny, GLfloat nz)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Normal3f, "glNormal3f",
-          "context = %d, nx = %f, ny = %f, nz = %f", CID(context), nx, ny, nz);
+    EVENT(context, GLNormal3f, "context = %d, nx = %f, ny = %f, nz = %f", CID(context), nx, ny, nz);
 
     if (context)
     {
@@ -1329,8 +1297,8 @@
 void GL_APIENTRY Normal3x(GLfixed nx, GLfixed ny, GLfixed nz)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Normal3x, "glNormal3x",
-          "context = %d, nx = 0x%X, ny = 0x%X, nz = 0x%X", CID(context), nx, ny, nz);
+    EVENT(context, GLNormal3x, "context = %d, nx = 0x%X, ny = 0x%X, nz = 0x%X", CID(context), nx,
+          ny, nz);
 
     if (context)
     {
@@ -1351,13 +1319,13 @@
 void GL_APIENTRY NormalPointer(GLenum type, GLsizei stride, const void *pointer)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::NormalPointer, "glNormalPointer",
+    EVENT(context, GLNormalPointer,
           "context = %d, type = %s, stride = %d, pointer = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::NormalPointerType, type), stride, (uintptr_t)pointer);
 
     if (context)
     {
-        VertexAttribType typePacked                           = FromGL<VertexAttribType>(type);
+        VertexAttribType typePacked                           = PackParam<VertexAttribType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateNormalPointer(context, typePacked, stride, pointer));
@@ -1376,9 +1344,8 @@
 void GL_APIENTRY Orthof(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Orthof, "glOrthof",
-          "context = %d, l = %f, r = %f, b = %f, t = %f, n = %f, f = %f", CID(context), l, r, b, t,
-          n, f);
+    EVENT(context, GLOrthof, "context = %d, l = %f, r = %f, b = %f, t = %f, n = %f, f = %f",
+          CID(context), l, r, b, t, n, f);
 
     if (context)
     {
@@ -1399,7 +1366,7 @@
 void GL_APIENTRY Orthox(GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Orthox, "glOrthox",
+    EVENT(context, GLOrthox,
           "context = %d, l = 0x%X, r = 0x%X, b = 0x%X, t = 0x%X, n = 0x%X, f = 0x%X", CID(context),
           l, r, b, t, n, f);
 
@@ -1422,13 +1389,12 @@
 void GL_APIENTRY PointParameterf(GLenum pname, GLfloat param)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PointParameterf, "glPointParameterf",
-          "context = %d, pname = %s, param = %f", CID(context),
+    EVENT(context, GLPointParameterf, "context = %d, pname = %s, param = %f", CID(context),
           GLenumToString(GLenumGroup::DefaultGroup, pname), param);
 
     if (context)
     {
-        PointParameter pnamePacked                            = FromGL<PointParameter>(pname);
+        PointParameter pnamePacked                            = PackParam<PointParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidatePointParameterf(context, pnamePacked, param));
@@ -1447,13 +1413,12 @@
 void GL_APIENTRY PointParameterfv(GLenum pname, const GLfloat *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PointParameterfv, "glPointParameterfv",
-          "context = %d, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
+    EVENT(context, GLPointParameterfv, "context = %d, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
 
     if (context)
     {
-        PointParameter pnamePacked                            = FromGL<PointParameter>(pname);
+        PointParameter pnamePacked                            = PackParam<PointParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidatePointParameterfv(context, pnamePacked, params));
@@ -1472,13 +1437,12 @@
 void GL_APIENTRY PointParameterx(GLenum pname, GLfixed param)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PointParameterx, "glPointParameterx",
-          "context = %d, pname = %s, param = 0x%X", CID(context),
+    EVENT(context, GLPointParameterx, "context = %d, pname = %s, param = 0x%X", CID(context),
           GLenumToString(GLenumGroup::DefaultGroup, pname), param);
 
     if (context)
     {
-        PointParameter pnamePacked                            = FromGL<PointParameter>(pname);
+        PointParameter pnamePacked                            = PackParam<PointParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidatePointParameterx(context, pnamePacked, param));
@@ -1497,13 +1461,12 @@
 void GL_APIENTRY PointParameterxv(GLenum pname, const GLfixed *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PointParameterxv, "glPointParameterxv",
-          "context = %d, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
+    EVENT(context, GLPointParameterxv, "context = %d, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
 
     if (context)
     {
-        PointParameter pnamePacked                            = FromGL<PointParameter>(pname);
+        PointParameter pnamePacked                            = PackParam<PointParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidatePointParameterxv(context, pnamePacked, params));
@@ -1522,8 +1485,7 @@
 void GL_APIENTRY PointSize(GLfloat size)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PointSize, "glPointSize", "context = %d, size = %f",
-          CID(context), size);
+    EVENT(context, GLPointSize, "context = %d, size = %f", CID(context), size);
 
     if (context)
     {
@@ -1544,8 +1506,7 @@
 void GL_APIENTRY PointSizex(GLfixed size)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PointSizex, "glPointSizex", "context = %d, size = 0x%X",
-          CID(context), size);
+    EVENT(context, GLPointSizex, "context = %d, size = 0x%X", CID(context), size);
 
     if (context)
     {
@@ -1566,8 +1527,8 @@
 void GL_APIENTRY PolygonOffsetx(GLfixed factor, GLfixed units)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PolygonOffsetx, "glPolygonOffsetx",
-          "context = %d, factor = 0x%X, units = 0x%X", CID(context), factor, units);
+    EVENT(context, GLPolygonOffsetx, "context = %d, factor = 0x%X, units = 0x%X", CID(context),
+          factor, units);
 
     if (context)
     {
@@ -1589,7 +1550,7 @@
 void GL_APIENTRY PopMatrix()
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PopMatrix, "glPopMatrix", "context = %d", CID(context));
+    EVENT(context, GLPopMatrix, "context = %d", CID(context));
 
     if (context)
     {
@@ -1610,7 +1571,7 @@
 void GL_APIENTRY PushMatrix()
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PushMatrix, "glPushMatrix", "context = %d", CID(context));
+    EVENT(context, GLPushMatrix, "context = %d", CID(context));
 
     if (context)
     {
@@ -1631,8 +1592,8 @@
 void GL_APIENTRY Rotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Rotatef, "glRotatef",
-          "context = %d, angle = %f, x = %f, y = %f, z = %f", CID(context), angle, x, y, z);
+    EVENT(context, GLRotatef, "context = %d, angle = %f, x = %f, y = %f, z = %f", CID(context),
+          angle, x, y, z);
 
     if (context)
     {
@@ -1653,8 +1614,8 @@
 void GL_APIENTRY Rotatex(GLfixed angle, GLfixed x, GLfixed y, GLfixed z)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Rotatex, "glRotatex",
-          "context = %d, angle = 0x%X, x = 0x%X, y = 0x%X, z = 0x%X", CID(context), angle, x, y, z);
+    EVENT(context, GLRotatex, "context = %d, angle = 0x%X, x = 0x%X, y = 0x%X, z = 0x%X",
+          CID(context), angle, x, y, z);
 
     if (context)
     {
@@ -1675,9 +1636,8 @@
 void GL_APIENTRY SampleCoveragex(GLclampx value, GLboolean invert)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SampleCoveragex, "glSampleCoveragex",
-          "context = %d, value = 0x%X, invert = %s", CID(context), value,
-          GLbooleanToString(invert));
+    EVENT(context, GLSampleCoveragex, "context = %d, value = 0x%X, invert = %s", CID(context),
+          value, GLbooleanToString(invert));
 
     if (context)
     {
@@ -1699,8 +1659,7 @@
 void GL_APIENTRY Scalef(GLfloat x, GLfloat y, GLfloat z)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Scalef, "glScalef", "context = %d, x = %f, y = %f, z = %f",
-          CID(context), x, y, z);
+    EVENT(context, GLScalef, "context = %d, x = %f, y = %f, z = %f", CID(context), x, y, z);
 
     if (context)
     {
@@ -1721,8 +1680,7 @@
 void GL_APIENTRY Scalex(GLfixed x, GLfixed y, GLfixed z)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Scalex, "glScalex", "context = %d, x = 0x%X, y = 0x%X, z = 0x%X",
-          CID(context), x, y, z);
+    EVENT(context, GLScalex, "context = %d, x = 0x%X, y = 0x%X, z = 0x%X", CID(context), x, y, z);
 
     if (context)
     {
@@ -1743,12 +1701,12 @@
 void GL_APIENTRY ShadeModel(GLenum mode)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ShadeModel, "glShadeModel", "context = %d, mode = %s",
-          CID(context), GLenumToString(GLenumGroup::ShadingModel, mode));
+    EVENT(context, GLShadeModel, "context = %d, mode = %s", CID(context),
+          GLenumToString(GLenumGroup::ShadingModel, mode));
 
     if (context)
     {
-        ShadingModel modePacked                               = FromGL<ShadingModel>(mode);
+        ShadingModel modePacked                               = PackParam<ShadingModel>(mode);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateShadeModel(context, modePacked));
         if (isCallValid)
@@ -1766,14 +1724,14 @@
 void GL_APIENTRY TexCoordPointer(GLint size, GLenum type, GLsizei stride, const void *pointer)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexCoordPointer, "glTexCoordPointer",
+    EVENT(context, GLTexCoordPointer,
           "context = %d, size = %d, type = %s, stride = %d, pointer = 0x%016" PRIxPTR "",
           CID(context), size, GLenumToString(GLenumGroup::TexCoordPointerType, type), stride,
           (uintptr_t)pointer);
 
     if (context)
     {
-        VertexAttribType typePacked                           = FromGL<VertexAttribType>(type);
+        VertexAttribType typePacked                           = PackParam<VertexAttribType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexCoordPointer(context, size, typePacked, stride, pointer));
@@ -1792,15 +1750,14 @@
 void GL_APIENTRY TexEnvf(GLenum target, GLenum pname, GLfloat param)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexEnvf, "glTexEnvf",
-          "context = %d, target = %s, pname = %s, param = %f", CID(context),
+    EVENT(context, GLTexEnvf, "context = %d, target = %s, pname = %s, param = %f", CID(context),
           GLenumToString(GLenumGroup::TextureEnvTarget, target),
           GLenumToString(GLenumGroup::TextureEnvParameter, pname), param);
 
     if (context)
     {
-        TextureEnvTarget targetPacked                         = FromGL<TextureEnvTarget>(target);
-        TextureEnvParameter pnamePacked                       = FromGL<TextureEnvParameter>(pname);
+        TextureEnvTarget targetPacked   = PackParam<TextureEnvTarget>(target);
+        TextureEnvParameter pnamePacked = PackParam<TextureEnvParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexEnvf(context, targetPacked, pnamePacked, param));
@@ -1819,15 +1776,14 @@
 void GL_APIENTRY TexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexEnvfv, "glTexEnvfv",
-          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureEnvTarget, target),
+    EVENT(context, GLTexEnvfv, "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureEnvTarget, target),
           GLenumToString(GLenumGroup::TextureEnvParameter, pname), (uintptr_t)params);
 
     if (context)
     {
-        TextureEnvTarget targetPacked                         = FromGL<TextureEnvTarget>(target);
-        TextureEnvParameter pnamePacked                       = FromGL<TextureEnvParameter>(pname);
+        TextureEnvTarget targetPacked   = PackParam<TextureEnvTarget>(target);
+        TextureEnvParameter pnamePacked = PackParam<TextureEnvParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexEnvfv(context, targetPacked, pnamePacked, params));
@@ -1846,15 +1802,14 @@
 void GL_APIENTRY TexEnvi(GLenum target, GLenum pname, GLint param)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexEnvi, "glTexEnvi",
-          "context = %d, target = %s, pname = %s, param = %d", CID(context),
+    EVENT(context, GLTexEnvi, "context = %d, target = %s, pname = %s, param = %d", CID(context),
           GLenumToString(GLenumGroup::TextureEnvTarget, target),
           GLenumToString(GLenumGroup::TextureEnvParameter, pname), param);
 
     if (context)
     {
-        TextureEnvTarget targetPacked                         = FromGL<TextureEnvTarget>(target);
-        TextureEnvParameter pnamePacked                       = FromGL<TextureEnvParameter>(pname);
+        TextureEnvTarget targetPacked   = PackParam<TextureEnvTarget>(target);
+        TextureEnvParameter pnamePacked = PackParam<TextureEnvParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexEnvi(context, targetPacked, pnamePacked, param));
@@ -1873,15 +1828,14 @@
 void GL_APIENTRY TexEnviv(GLenum target, GLenum pname, const GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexEnviv, "glTexEnviv",
-          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureEnvTarget, target),
+    EVENT(context, GLTexEnviv, "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureEnvTarget, target),
           GLenumToString(GLenumGroup::TextureEnvParameter, pname), (uintptr_t)params);
 
     if (context)
     {
-        TextureEnvTarget targetPacked                         = FromGL<TextureEnvTarget>(target);
-        TextureEnvParameter pnamePacked                       = FromGL<TextureEnvParameter>(pname);
+        TextureEnvTarget targetPacked   = PackParam<TextureEnvTarget>(target);
+        TextureEnvParameter pnamePacked = PackParam<TextureEnvParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexEnviv(context, targetPacked, pnamePacked, params));
@@ -1900,15 +1854,14 @@
 void GL_APIENTRY TexEnvx(GLenum target, GLenum pname, GLfixed param)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexEnvx, "glTexEnvx",
-          "context = %d, target = %s, pname = %s, param = 0x%X", CID(context),
+    EVENT(context, GLTexEnvx, "context = %d, target = %s, pname = %s, param = 0x%X", CID(context),
           GLenumToString(GLenumGroup::TextureEnvTarget, target),
           GLenumToString(GLenumGroup::TextureEnvParameter, pname), param);
 
     if (context)
     {
-        TextureEnvTarget targetPacked                         = FromGL<TextureEnvTarget>(target);
-        TextureEnvParameter pnamePacked                       = FromGL<TextureEnvParameter>(pname);
+        TextureEnvTarget targetPacked   = PackParam<TextureEnvTarget>(target);
+        TextureEnvParameter pnamePacked = PackParam<TextureEnvParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexEnvx(context, targetPacked, pnamePacked, param));
@@ -1927,15 +1880,14 @@
 void GL_APIENTRY TexEnvxv(GLenum target, GLenum pname, const GLfixed *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexEnvxv, "glTexEnvxv",
-          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureEnvTarget, target),
+    EVENT(context, GLTexEnvxv, "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureEnvTarget, target),
           GLenumToString(GLenumGroup::TextureEnvParameter, pname), (uintptr_t)params);
 
     if (context)
     {
-        TextureEnvTarget targetPacked                         = FromGL<TextureEnvTarget>(target);
-        TextureEnvParameter pnamePacked                       = FromGL<TextureEnvParameter>(pname);
+        TextureEnvTarget targetPacked   = PackParam<TextureEnvTarget>(target);
+        TextureEnvParameter pnamePacked = PackParam<TextureEnvParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexEnvxv(context, targetPacked, pnamePacked, params));
@@ -1954,14 +1906,13 @@
 void GL_APIENTRY TexParameterx(GLenum target, GLenum pname, GLfixed param)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexParameterx, "glTexParameterx",
-          "context = %d, target = %s, pname = %s, param = 0x%X", CID(context),
-          GLenumToString(GLenumGroup::TextureTarget, target),
+    EVENT(context, GLTexParameterx, "context = %d, target = %s, pname = %s, param = 0x%X",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::GetTextureParameter, pname), param);
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexParameterx(context, targetPacked, pname, param));
@@ -1980,14 +1931,14 @@
 void GL_APIENTRY TexParameterxv(GLenum target, GLenum pname, const GLfixed *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexParameterxv, "glTexParameterxv",
+    EVENT(context, GLTexParameterxv,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexParameterxv(context, targetPacked, pname, params));
@@ -2006,8 +1957,7 @@
 void GL_APIENTRY Translatef(GLfloat x, GLfloat y, GLfloat z)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Translatef, "glTranslatef",
-          "context = %d, x = %f, y = %f, z = %f", CID(context), x, y, z);
+    EVENT(context, GLTranslatef, "context = %d, x = %f, y = %f, z = %f", CID(context), x, y, z);
 
     if (context)
     {
@@ -2028,8 +1978,8 @@
 void GL_APIENTRY Translatex(GLfixed x, GLfixed y, GLfixed z)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Translatex, "glTranslatex",
-          "context = %d, x = 0x%X, y = 0x%X, z = 0x%X", CID(context), x, y, z);
+    EVENT(context, GLTranslatex, "context = %d, x = 0x%X, y = 0x%X, z = 0x%X", CID(context), x, y,
+          z);
 
     if (context)
     {
@@ -2050,14 +2000,14 @@
 void GL_APIENTRY VertexPointer(GLint size, GLenum type, GLsizei stride, const void *pointer)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexPointer, "glVertexPointer",
+    EVENT(context, GLVertexPointer,
           "context = %d, size = %d, type = %s, stride = %d, pointer = 0x%016" PRIxPTR "",
           CID(context), size, GLenumToString(GLenumGroup::VertexPointerType, type), stride,
           (uintptr_t)pointer);
 
     if (context)
     {
-        VertexAttribType typePacked                           = FromGL<VertexAttribType>(type);
+        VertexAttribType typePacked                           = PackParam<VertexAttribType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateVertexPointer(context, size, typePacked, stride, pointer));
diff --git a/src/libGLESv2/entry_points_gles_2_0_autogen.cpp b/src/libGLESv2/entry_points_gles_2_0_autogen.cpp
index 87f96bd..6f607b4 100644
--- a/src/libGLESv2/entry_points_gles_2_0_autogen.cpp
+++ b/src/libGLESv2/entry_points_gles_2_0_autogen.cpp
@@ -24,8 +24,8 @@
 void GL_APIENTRY ActiveTexture(GLenum texture)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ActiveTexture, "glActiveTexture", "context = %d, texture = %s",
-          CID(context), GLenumToString(GLenumGroup::TextureUnit, texture));
+    EVENT(context, GLActiveTexture, "context = %d, texture = %s", CID(context),
+          GLenumToString(GLenumGroup::TextureUnit, texture));
 
     if (context)
     {
@@ -46,13 +46,13 @@
 void GL_APIENTRY AttachShader(GLuint program, GLuint shader)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::AttachShader, "glAttachShader",
-          "context = %d, program = %u, shader = %u", CID(context), program, shader);
+    EVENT(context, GLAttachShader, "context = %d, program = %u, shader = %u", CID(context), program,
+          shader);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        ShaderProgramID shaderPacked                          = FromGL<ShaderProgramID>(shader);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
+        ShaderProgramID shaderPacked                          = PackParam<ShaderProgramID>(shader);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateAttachShader(context, programPacked, shaderPacked));
@@ -71,13 +71,13 @@
 void GL_APIENTRY BindAttribLocation(GLuint program, GLuint index, const GLchar *name)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindAttribLocation, "glBindAttribLocation",
+    EVENT(context, GLBindAttribLocation,
           "context = %d, program = %u, index = %u, name = 0x%016" PRIxPTR "", CID(context), program,
           index, (uintptr_t)name);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateBindAttribLocation(context, programPacked, index, name));
@@ -96,14 +96,13 @@
 void GL_APIENTRY BindBuffer(GLenum target, GLuint buffer)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindBuffer, "glBindBuffer",
-          "context = %d, target = %s, buffer = %u", CID(context),
+    EVENT(context, GLBindBuffer, "context = %d, target = %s, buffer = %u", CID(context),
           GLenumToString(GLenumGroup::BufferTargetARB, target), buffer);
 
     if (context)
     {
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateBindBuffer(context, targetPacked, bufferPacked));
@@ -122,13 +121,12 @@
 void GL_APIENTRY BindFramebuffer(GLenum target, GLuint framebuffer)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindFramebuffer, "glBindFramebuffer",
-          "context = %d, target = %s, framebuffer = %u", CID(context),
+    EVENT(context, GLBindFramebuffer, "context = %d, target = %s, framebuffer = %u", CID(context),
           GLenumToString(GLenumGroup::FramebufferTarget, target), framebuffer);
 
     if (context)
     {
-        FramebufferID framebufferPacked                       = FromGL<FramebufferID>(framebuffer);
+        FramebufferID framebufferPacked = PackParam<FramebufferID>(framebuffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateBindFramebuffer(context, target, framebufferPacked));
@@ -147,13 +145,12 @@
 void GL_APIENTRY BindRenderbuffer(GLenum target, GLuint renderbuffer)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindRenderbuffer, "glBindRenderbuffer",
-          "context = %d, target = %s, renderbuffer = %u", CID(context),
+    EVENT(context, GLBindRenderbuffer, "context = %d, target = %s, renderbuffer = %u", CID(context),
           GLenumToString(GLenumGroup::RenderbufferTarget, target), renderbuffer);
 
     if (context)
     {
-        RenderbufferID renderbufferPacked = FromGL<RenderbufferID>(renderbuffer);
+        RenderbufferID renderbufferPacked = PackParam<RenderbufferID>(renderbuffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateBindRenderbuffer(context, target, renderbufferPacked));
@@ -172,14 +169,13 @@
 void GL_APIENTRY BindTexture(GLenum target, GLuint texture)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindTexture, "glBindTexture",
-          "context = %d, target = %s, texture = %u", CID(context),
+    EVENT(context, GLBindTexture, "context = %d, target = %s, texture = %u", CID(context),
           GLenumToString(GLenumGroup::TextureTarget, target), texture);
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateBindTexture(context, targetPacked, texturePacked));
@@ -198,9 +194,8 @@
 void GL_APIENTRY BlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BlendColor, "glBlendColor",
-          "context = %d, red = %f, green = %f, blue = %f, alpha = %f", CID(context), red, green,
-          blue, alpha);
+    EVENT(context, GLBlendColor, "context = %d, red = %f, green = %f, blue = %f, alpha = %f",
+          CID(context), red, green, blue, alpha);
 
     if (context)
     {
@@ -222,8 +217,8 @@
 void GL_APIENTRY BlendEquation(GLenum mode)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BlendEquation, "glBlendEquation", "context = %d, mode = %s",
-          CID(context), GLenumToString(GLenumGroup::BlendEquationModeEXT, mode));
+    EVENT(context, GLBlendEquation, "context = %d, mode = %s", CID(context),
+          GLenumToString(GLenumGroup::BlendEquationModeEXT, mode));
 
     if (context)
     {
@@ -244,9 +239,8 @@
 void GL_APIENTRY BlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BlendEquationSeparate, "glBlendEquationSeparate",
-          "context = %d, modeRGB = %s, modeAlpha = %s", CID(context),
-          GLenumToString(GLenumGroup::BlendEquationModeEXT, modeRGB),
+    EVENT(context, GLBlendEquationSeparate, "context = %d, modeRGB = %s, modeAlpha = %s",
+          CID(context), GLenumToString(GLenumGroup::BlendEquationModeEXT, modeRGB),
           GLenumToString(GLenumGroup::BlendEquationModeEXT, modeAlpha));
 
     if (context)
@@ -269,8 +263,7 @@
 void GL_APIENTRY BlendFunc(GLenum sfactor, GLenum dfactor)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BlendFunc, "glBlendFunc",
-          "context = %d, sfactor = %s, dfactor = %s", CID(context),
+    EVENT(context, GLBlendFunc, "context = %d, sfactor = %s, dfactor = %s", CID(context),
           GLenumToString(GLenumGroup::BlendingFactor, sfactor),
           GLenumToString(GLenumGroup::BlendingFactor, dfactor));
 
@@ -297,7 +290,7 @@
                                    GLenum dfactorAlpha)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BlendFuncSeparate, "glBlendFuncSeparate",
+    EVENT(context, GLBlendFuncSeparate,
           "context = %d, sfactorRGB = %s, dfactorRGB = %s, sfactorAlpha = %s, dfactorAlpha = %s",
           CID(context), GLenumToString(GLenumGroup::BlendingFactor, sfactorRGB),
           GLenumToString(GLenumGroup::BlendingFactor, dfactorRGB),
@@ -326,7 +319,7 @@
 void GL_APIENTRY BufferData(GLenum target, GLsizeiptr size, const void *data, GLenum usage)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BufferData, "glBufferData",
+    EVENT(context, GLBufferData,
           "context = %d, target = %s, size = %llu, data = 0x%016" PRIxPTR ", usage = %s",
           CID(context), GLenumToString(GLenumGroup::BufferTargetARB, target),
           static_cast<unsigned long long>(size), (uintptr_t)data,
@@ -334,8 +327,8 @@
 
     if (context)
     {
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
-        BufferUsage usagePacked                               = FromGL<BufferUsage>(usage);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
+        BufferUsage usagePacked                               = PackParam<BufferUsage>(usage);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateBufferData(context, targetPacked, size, data, usagePacked));
@@ -354,7 +347,7 @@
 void GL_APIENTRY BufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void *data)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BufferSubData, "glBufferSubData",
+    EVENT(context, GLBufferSubData,
           "context = %d, target = %s, offset = %llu, size = %llu, data = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::BufferTargetARB, target),
           static_cast<unsigned long long>(offset), static_cast<unsigned long long>(size),
@@ -362,7 +355,7 @@
 
     if (context)
     {
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateBufferSubData(context, targetPacked, offset, size, data));
@@ -381,8 +374,7 @@
 GLenum GL_APIENTRY CheckFramebufferStatus(GLenum target)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CheckFramebufferStatus, "glCheckFramebufferStatus",
-          "context = %d, target = %s", CID(context),
+    EVENT(context, GLCheckFramebufferStatus, "context = %d, target = %s", CID(context),
           GLenumToString(GLenumGroup::FramebufferTarget, target));
 
     GLenum returnValue;
@@ -397,14 +389,15 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::CheckFramebufferStatus, GLenum>();
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLCheckFramebufferStatus, GLenum>();
         }
         ANGLE_CAPTURE(CheckFramebufferStatus, isCallValid, context, target, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::CheckFramebufferStatus, GLenum>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLCheckFramebufferStatus, GLenum>();
     }
     return returnValue;
 }
@@ -412,7 +405,7 @@
 void GL_APIENTRY Clear(GLbitfield mask)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Clear, "glClear", "context = %d, mask = %s", CID(context),
+    EVENT(context, GLClear, "context = %d, mask = %s", CID(context),
           GLbitfieldToString(GLenumGroup::ClearBufferMask, mask).c_str());
 
     if (context)
@@ -434,9 +427,8 @@
 void GL_APIENTRY ClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ClearColor, "glClearColor",
-          "context = %d, red = %f, green = %f, blue = %f, alpha = %f", CID(context), red, green,
-          blue, alpha);
+    EVENT(context, GLClearColor, "context = %d, red = %f, green = %f, blue = %f, alpha = %f",
+          CID(context), red, green, blue, alpha);
 
     if (context)
     {
@@ -458,8 +450,7 @@
 void GL_APIENTRY ClearDepthf(GLfloat d)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ClearDepthf, "glClearDepthf", "context = %d, d = %f",
-          CID(context), d);
+    EVENT(context, GLClearDepthf, "context = %d, d = %f", CID(context), d);
 
     if (context)
     {
@@ -480,8 +471,7 @@
 void GL_APIENTRY ClearStencil(GLint s)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ClearStencil, "glClearStencil", "context = %d, s = %d",
-          CID(context), s);
+    EVENT(context, GLClearStencil, "context = %d, s = %d", CID(context), s);
 
     if (context)
     {
@@ -502,9 +492,8 @@
 void GL_APIENTRY ColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ColorMask, "glColorMask",
-          "context = %d, red = %s, green = %s, blue = %s, alpha = %s", CID(context),
-          GLbooleanToString(red), GLbooleanToString(green), GLbooleanToString(blue),
+    EVENT(context, GLColorMask, "context = %d, red = %s, green = %s, blue = %s, alpha = %s",
+          CID(context), GLbooleanToString(red), GLbooleanToString(green), GLbooleanToString(blue),
           GLbooleanToString(alpha));
 
     if (context)
@@ -527,12 +516,11 @@
 void GL_APIENTRY CompileShader(GLuint shader)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CompileShader, "glCompileShader", "context = %d, shader = %u",
-          CID(context), shader);
+    EVENT(context, GLCompileShader, "context = %d, shader = %u", CID(context), shader);
 
     if (context)
     {
-        ShaderProgramID shaderPacked                          = FromGL<ShaderProgramID>(shader);
+        ShaderProgramID shaderPacked                          = PackParam<ShaderProgramID>(shader);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateCompileShader(context, shaderPacked));
@@ -558,7 +546,7 @@
                                       const void *data)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CompressedTexImage2D, "glCompressedTexImage2D",
+    EVENT(context, GLCompressedTexImage2D,
           "context = %d, target = %s, level = %d, internalformat = %s, width = %d, height = %d, "
           "border = %d, imageSize = %d, data = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level,
@@ -567,7 +555,7 @@
 
     if (context)
     {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -598,7 +586,7 @@
                                          const void *data)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CompressedTexSubImage2D, "glCompressedTexSubImage2D",
+    EVENT(context, GLCompressedTexSubImage2D,
           "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, width = %d, height = "
           "%d, format = %s, imageSize = %d, data = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, xoffset, yoffset,
@@ -607,7 +595,7 @@
 
     if (context)
     {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -637,7 +625,7 @@
                                 GLint border)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CopyTexImage2D, "glCopyTexImage2D",
+    EVENT(context, GLCopyTexImage2D,
           "context = %d, target = %s, level = %d, internalformat = %s, x = %d, y = %d, width = %d, "
           "height = %d, border = %d",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level,
@@ -645,7 +633,7 @@
 
     if (context)
     {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateCopyTexImage2D(context, targetPacked, level, internalformat, x,
@@ -674,7 +662,7 @@
                                    GLsizei height)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CopyTexSubImage2D, "glCopyTexSubImage2D",
+    EVENT(context, GLCopyTexSubImage2D,
           "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, x = %d, y = %d, "
           "width = %d, height = %d",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, xoffset, yoffset,
@@ -682,7 +670,7 @@
 
     if (context)
     {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateCopyTexSubImage2D(context, targetPacked, level, xoffset,
@@ -703,7 +691,7 @@
 GLuint GL_APIENTRY CreateProgram()
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CreateProgram, "glCreateProgram", "context = %d", CID(context));
+    EVENT(context, GLCreateProgram, "context = %d", CID(context));
 
     GLuint returnValue;
     if (context)
@@ -716,14 +704,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::CreateProgram, GLuint>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLCreateProgram, GLuint>();
         }
         ANGLE_CAPTURE(CreateProgram, isCallValid, context, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::CreateProgram, GLuint>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLCreateProgram, GLuint>();
     }
     return returnValue;
 }
@@ -731,13 +719,13 @@
 GLuint GL_APIENTRY CreateShader(GLenum type)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CreateShader, "glCreateShader", "context = %d, type = %s",
-          CID(context), GLenumToString(GLenumGroup::ShaderType, type));
+    EVENT(context, GLCreateShader, "context = %d, type = %s", CID(context),
+          GLenumToString(GLenumGroup::ShaderType, type));
 
     GLuint returnValue;
     if (context)
     {
-        ShaderType typePacked                                 = FromGL<ShaderType>(type);
+        ShaderType typePacked                                 = PackParam<ShaderType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateCreateShader(context, typePacked));
         if (isCallValid)
@@ -746,14 +734,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::CreateShader, GLuint>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLCreateShader, GLuint>();
         }
         ANGLE_CAPTURE(CreateShader, isCallValid, context, typePacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::CreateShader, GLuint>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLCreateShader, GLuint>();
     }
     return returnValue;
 }
@@ -761,12 +749,12 @@
 void GL_APIENTRY CullFace(GLenum mode)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CullFace, "glCullFace", "context = %d, mode = %s", CID(context),
+    EVENT(context, GLCullFace, "context = %d, mode = %s", CID(context),
           GLenumToString(GLenumGroup::CullFaceMode, mode));
 
     if (context)
     {
-        CullFaceMode modePacked                               = FromGL<CullFaceMode>(mode);
+        CullFaceMode modePacked                               = PackParam<CullFaceMode>(mode);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateCullFace(context, modePacked));
         if (isCallValid)
@@ -784,12 +772,12 @@
 void GL_APIENTRY DeleteBuffers(GLsizei n, const GLuint *buffers)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DeleteBuffers, "glDeleteBuffers",
-          "context = %d, n = %d, buffers = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)buffers);
+    EVENT(context, GLDeleteBuffers, "context = %d, n = %d, buffers = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)buffers);
 
     if (context)
     {
-        const BufferID *buffersPacked                         = FromGL<const BufferID *>(buffers);
+        const BufferID *buffersPacked = PackParam<const BufferID *>(buffers);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateDeleteBuffers(context, n, buffersPacked));
@@ -808,13 +796,12 @@
 void GL_APIENTRY DeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DeleteFramebuffers, "glDeleteFramebuffers",
-          "context = %d, n = %d, framebuffers = 0x%016" PRIxPTR "", CID(context), n,
-          (uintptr_t)framebuffers);
+    EVENT(context, GLDeleteFramebuffers, "context = %d, n = %d, framebuffers = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)framebuffers);
 
     if (context)
     {
-        const FramebufferID *framebuffersPacked = FromGL<const FramebufferID *>(framebuffers);
+        const FramebufferID *framebuffersPacked = PackParam<const FramebufferID *>(framebuffers);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateDeleteFramebuffers(context, n, framebuffersPacked));
@@ -833,12 +820,11 @@
 void GL_APIENTRY DeleteProgram(GLuint program)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DeleteProgram, "glDeleteProgram", "context = %d, program = %u",
-          CID(context), program);
+    EVENT(context, GLDeleteProgram, "context = %d, program = %u", CID(context), program);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateDeleteProgram(context, programPacked));
@@ -857,13 +843,13 @@
 void GL_APIENTRY DeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DeleteRenderbuffers, "glDeleteRenderbuffers",
-          "context = %d, n = %d, renderbuffers = 0x%016" PRIxPTR "", CID(context), n,
-          (uintptr_t)renderbuffers);
+    EVENT(context, GLDeleteRenderbuffers, "context = %d, n = %d, renderbuffers = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)renderbuffers);
 
     if (context)
     {
-        const RenderbufferID *renderbuffersPacked = FromGL<const RenderbufferID *>(renderbuffers);
+        const RenderbufferID *renderbuffersPacked =
+            PackParam<const RenderbufferID *>(renderbuffers);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateDeleteRenderbuffers(context, n, renderbuffersPacked));
@@ -882,12 +868,11 @@
 void GL_APIENTRY DeleteShader(GLuint shader)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DeleteShader, "glDeleteShader", "context = %d, shader = %u",
-          CID(context), shader);
+    EVENT(context, GLDeleteShader, "context = %d, shader = %u", CID(context), shader);
 
     if (context)
     {
-        ShaderProgramID shaderPacked                          = FromGL<ShaderProgramID>(shader);
+        ShaderProgramID shaderPacked                          = PackParam<ShaderProgramID>(shader);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateDeleteShader(context, shaderPacked));
@@ -906,13 +891,12 @@
 void GL_APIENTRY DeleteTextures(GLsizei n, const GLuint *textures)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DeleteTextures, "glDeleteTextures",
-          "context = %d, n = %d, textures = 0x%016" PRIxPTR "", CID(context), n,
-          (uintptr_t)textures);
+    EVENT(context, GLDeleteTextures, "context = %d, n = %d, textures = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)textures);
 
     if (context)
     {
-        const TextureID *texturesPacked                       = FromGL<const TextureID *>(textures);
+        const TextureID *texturesPacked = PackParam<const TextureID *>(textures);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateDeleteTextures(context, n, texturesPacked));
@@ -931,8 +915,8 @@
 void GL_APIENTRY DepthFunc(GLenum func)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DepthFunc, "glDepthFunc", "context = %d, func = %s",
-          CID(context), GLenumToString(GLenumGroup::DepthFunction, func));
+    EVENT(context, GLDepthFunc, "context = %d, func = %s", CID(context),
+          GLenumToString(GLenumGroup::DepthFunction, func));
 
     if (context)
     {
@@ -953,8 +937,7 @@
 void GL_APIENTRY DepthMask(GLboolean flag)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DepthMask, "glDepthMask", "context = %d, flag = %s",
-          CID(context), GLbooleanToString(flag));
+    EVENT(context, GLDepthMask, "context = %d, flag = %s", CID(context), GLbooleanToString(flag));
 
     if (context)
     {
@@ -975,8 +958,7 @@
 void GL_APIENTRY DepthRangef(GLfloat n, GLfloat f)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DepthRangef, "glDepthRangef", "context = %d, n = %f, f = %f",
-          CID(context), n, f);
+    EVENT(context, GLDepthRangef, "context = %d, n = %f, f = %f", CID(context), n, f);
 
     if (context)
     {
@@ -997,13 +979,13 @@
 void GL_APIENTRY DetachShader(GLuint program, GLuint shader)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DetachShader, "glDetachShader",
-          "context = %d, program = %u, shader = %u", CID(context), program, shader);
+    EVENT(context, GLDetachShader, "context = %d, program = %u, shader = %u", CID(context), program,
+          shader);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        ShaderProgramID shaderPacked                          = FromGL<ShaderProgramID>(shader);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
+        ShaderProgramID shaderPacked                          = PackParam<ShaderProgramID>(shader);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateDetachShader(context, programPacked, shaderPacked));
@@ -1022,7 +1004,7 @@
 void GL_APIENTRY Disable(GLenum cap)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Disable, "glDisable", "context = %d, cap = %s", CID(context),
+    EVENT(context, GLDisable, "context = %d, cap = %s", CID(context),
           GLenumToString(GLenumGroup::EnableCap, cap));
 
     if (context)
@@ -1044,8 +1026,7 @@
 void GL_APIENTRY DisableVertexAttribArray(GLuint index)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DisableVertexAttribArray, "glDisableVertexAttribArray",
-          "context = %d, index = %u", CID(context), index);
+    EVENT(context, GLDisableVertexAttribArray, "context = %d, index = %u", CID(context), index);
 
     if (context)
     {
@@ -1067,13 +1048,12 @@
 void GL_APIENTRY DrawArrays(GLenum mode, GLint first, GLsizei count)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawArrays, "glDrawArrays",
-          "context = %d, mode = %s, first = %d, count = %d", CID(context),
+    EVENT(context, GLDrawArrays, "context = %d, mode = %s, first = %d, count = %d", CID(context),
           GLenumToString(GLenumGroup::PrimitiveType, mode), first, count);
 
     if (context)
     {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateDrawArrays(context, modePacked, first, count));
@@ -1092,15 +1072,15 @@
 void GL_APIENTRY DrawElements(GLenum mode, GLsizei count, GLenum type, const void *indices)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawElements, "glDrawElements",
+    EVENT(context, GLDrawElements,
           "context = %d, mode = %s, count = %d, type = %s, indices = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), count,
           GLenumToString(GLenumGroup::DrawElementsType, type), (uintptr_t)indices);
 
     if (context)
     {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateDrawElements(context, modePacked, count, typePacked, indices));
@@ -1119,7 +1099,7 @@
 void GL_APIENTRY Enable(GLenum cap)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Enable, "glEnable", "context = %d, cap = %s", CID(context),
+    EVENT(context, GLEnable, "context = %d, cap = %s", CID(context),
           GLenumToString(GLenumGroup::EnableCap, cap));
 
     if (context)
@@ -1141,8 +1121,7 @@
 void GL_APIENTRY EnableVertexAttribArray(GLuint index)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::EnableVertexAttribArray, "glEnableVertexAttribArray",
-          "context = %d, index = %u", CID(context), index);
+    EVENT(context, GLEnableVertexAttribArray, "context = %d, index = %u", CID(context), index);
 
     if (context)
     {
@@ -1164,7 +1143,7 @@
 void GL_APIENTRY Finish()
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Finish, "glFinish", "context = %d", CID(context));
+    EVENT(context, GLFinish, "context = %d", CID(context));
 
     if (context)
     {
@@ -1185,7 +1164,7 @@
 void GL_APIENTRY Flush()
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Flush, "glFlush", "context = %d", CID(context));
+    EVENT(context, GLFlush, "context = %d", CID(context));
 
     if (context)
     {
@@ -1209,7 +1188,7 @@
                                          GLuint renderbuffer)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::FramebufferRenderbuffer, "glFramebufferRenderbuffer",
+    EVENT(context, GLFramebufferRenderbuffer,
           "context = %d, target = %s, attachment = %s, renderbuffertarget = %s, renderbuffer = %u",
           CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target),
           GLenumToString(GLenumGroup::FramebufferAttachment, attachment),
@@ -1217,7 +1196,7 @@
 
     if (context)
     {
-        RenderbufferID renderbufferPacked = FromGL<RenderbufferID>(renderbuffer);
+        RenderbufferID renderbufferPacked = PackParam<RenderbufferID>(renderbuffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -1244,7 +1223,7 @@
                                       GLint level)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::FramebufferTexture2D, "glFramebufferTexture2D",
+    EVENT(context, GLFramebufferTexture2D,
           "context = %d, target = %s, attachment = %s, textarget = %s, texture = %u, level = %d",
           CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target),
           GLenumToString(GLenumGroup::FramebufferAttachment, attachment),
@@ -1252,8 +1231,8 @@
 
     if (context)
     {
-        TextureTarget textargetPacked                         = FromGL<TextureTarget>(textarget);
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
+        TextureTarget textargetPacked                         = PackParam<TextureTarget>(textarget);
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateFramebufferTexture2D(context, target, attachment,
@@ -1275,8 +1254,8 @@
 void GL_APIENTRY FrontFace(GLenum mode)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::FrontFace, "glFrontFace", "context = %d, mode = %s",
-          CID(context), GLenumToString(GLenumGroup::FrontFaceDirection, mode));
+    EVENT(context, GLFrontFace, "context = %d, mode = %s", CID(context),
+          GLenumToString(GLenumGroup::FrontFaceDirection, mode));
 
     if (context)
     {
@@ -1297,12 +1276,12 @@
 void GL_APIENTRY GenBuffers(GLsizei n, GLuint *buffers)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GenBuffers, "glGenBuffers",
-          "context = %d, n = %d, buffers = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)buffers);
+    EVENT(context, GLGenBuffers, "context = %d, n = %d, buffers = 0x%016" PRIxPTR "", CID(context),
+          n, (uintptr_t)buffers);
 
     if (context)
     {
-        BufferID *buffersPacked                               = FromGL<BufferID *>(buffers);
+        BufferID *buffersPacked                               = PackParam<BufferID *>(buffers);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGenBuffers(context, n, buffersPacked));
@@ -1321,13 +1300,12 @@
 void GL_APIENTRY GenFramebuffers(GLsizei n, GLuint *framebuffers)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GenFramebuffers, "glGenFramebuffers",
-          "context = %d, n = %d, framebuffers = 0x%016" PRIxPTR "", CID(context), n,
-          (uintptr_t)framebuffers);
+    EVENT(context, GLGenFramebuffers, "context = %d, n = %d, framebuffers = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)framebuffers);
 
     if (context)
     {
-        FramebufferID *framebuffersPacked = FromGL<FramebufferID *>(framebuffers);
+        FramebufferID *framebuffersPacked = PackParam<FramebufferID *>(framebuffers);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGenFramebuffers(context, n, framebuffersPacked));
@@ -1346,13 +1324,12 @@
 void GL_APIENTRY GenRenderbuffers(GLsizei n, GLuint *renderbuffers)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GenRenderbuffers, "glGenRenderbuffers",
-          "context = %d, n = %d, renderbuffers = 0x%016" PRIxPTR "", CID(context), n,
-          (uintptr_t)renderbuffers);
+    EVENT(context, GLGenRenderbuffers, "context = %d, n = %d, renderbuffers = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)renderbuffers);
 
     if (context)
     {
-        RenderbufferID *renderbuffersPacked = FromGL<RenderbufferID *>(renderbuffers);
+        RenderbufferID *renderbuffersPacked = PackParam<RenderbufferID *>(renderbuffers);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGenRenderbuffers(context, n, renderbuffersPacked));
@@ -1371,13 +1348,12 @@
 void GL_APIENTRY GenTextures(GLsizei n, GLuint *textures)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GenTextures, "glGenTextures",
-          "context = %d, n = %d, textures = 0x%016" PRIxPTR "", CID(context), n,
-          (uintptr_t)textures);
+    EVENT(context, GLGenTextures, "context = %d, n = %d, textures = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)textures);
 
     if (context)
     {
-        TextureID *texturesPacked                             = FromGL<TextureID *>(textures);
+        TextureID *texturesPacked                             = PackParam<TextureID *>(textures);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGenTextures(context, n, texturesPacked));
@@ -1396,12 +1372,12 @@
 void GL_APIENTRY GenerateMipmap(GLenum target)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GenerateMipmap, "glGenerateMipmap", "context = %d, target = %s",
-          CID(context), GLenumToString(GLenumGroup::TextureTarget, target));
+    EVENT(context, GLGenerateMipmap, "context = %d, target = %s", CID(context),
+          GLenumToString(GLenumGroup::TextureTarget, target));
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGenerateMipmap(context, targetPacked));
@@ -1426,7 +1402,7 @@
                                  GLchar *name)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetActiveAttrib, "glGetActiveAttrib",
+    EVENT(context, GLGetActiveAttrib,
           "context = %d, program = %u, index = %u, bufSize = %d, length = 0x%016" PRIxPTR
           ", size = 0x%016" PRIxPTR ", type = 0x%016" PRIxPTR ", name = 0x%016" PRIxPTR "",
           CID(context), program, index, bufSize, (uintptr_t)length, (uintptr_t)size,
@@ -1434,7 +1410,7 @@
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetActiveAttrib(context, programPacked, index, bufSize, length,
@@ -1461,7 +1437,7 @@
                                   GLchar *name)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetActiveUniform, "glGetActiveUniform",
+    EVENT(context, GLGetActiveUniform,
           "context = %d, program = %u, index = %u, bufSize = %d, length = 0x%016" PRIxPTR
           ", size = 0x%016" PRIxPTR ", type = 0x%016" PRIxPTR ", name = 0x%016" PRIxPTR "",
           CID(context), program, index, bufSize, (uintptr_t)length, (uintptr_t)size,
@@ -1469,7 +1445,7 @@
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetActiveUniform(context, programPacked, index, bufSize, length,
@@ -1493,15 +1469,15 @@
                                     GLuint *shaders)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetAttachedShaders, "glGetAttachedShaders",
+    EVENT(context, GLGetAttachedShaders,
           "context = %d, program = %u, maxCount = %d, count = 0x%016" PRIxPTR
           ", shaders = 0x%016" PRIxPTR "",
           CID(context), program, maxCount, (uintptr_t)count, (uintptr_t)shaders);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        ShaderProgramID *shadersPacked                        = FromGL<ShaderProgramID *>(shaders);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        ShaderProgramID *shadersPacked = PackParam<ShaderProgramID *>(shaders);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -1522,14 +1498,13 @@
 GLint GL_APIENTRY GetAttribLocation(GLuint program, const GLchar *name)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetAttribLocation, "glGetAttribLocation",
-          "context = %d, program = %u, name = 0x%016" PRIxPTR "", CID(context), program,
-          (uintptr_t)name);
+    EVENT(context, GLGetAttribLocation, "context = %d, program = %u, name = 0x%016" PRIxPTR "",
+          CID(context), program, (uintptr_t)name);
 
     GLint returnValue;
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGetAttribLocation(context, programPacked, name));
@@ -1539,14 +1514,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetAttribLocation, GLint>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetAttribLocation, GLint>();
         }
         ANGLE_CAPTURE(GetAttribLocation, isCallValid, context, programPacked, name, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::GetAttribLocation, GLint>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetAttribLocation, GLint>();
     }
     return returnValue;
 }
@@ -1554,9 +1529,8 @@
 void GL_APIENTRY GetBooleanv(GLenum pname, GLboolean *data)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetBooleanv, "glGetBooleanv",
-          "context = %d, pname = %s, data = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::GetPName, pname), (uintptr_t)data);
+    EVENT(context, GLGetBooleanv, "context = %d, pname = %s, data = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::GetPName, pname), (uintptr_t)data);
 
     if (context)
     {
@@ -1577,14 +1551,14 @@
 void GL_APIENTRY GetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetBufferParameteriv, "glGetBufferParameteriv",
+    EVENT(context, GLGetBufferParameteriv,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::BufferTargetARB, target),
           GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
 
     if (context)
     {
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetBufferParameteriv(context, targetPacked, pname, params));
@@ -1603,7 +1577,7 @@
 GLenum GL_APIENTRY GetError()
 {
     Context *context = GetGlobalContext();
-    EVENT(context, gl::EntryPoint::GetError, "glGetError", "context = %d", CID(context));
+    EVENT(context, GLGetError, "context = %d", CID(context));
 
     GLenum returnValue;
     if (context)
@@ -1616,14 +1590,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetError, GLenum>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetError, GLenum>();
         }
         ANGLE_CAPTURE(GetError, isCallValid, context, returnValue);
     }
     else
     {
 
-        returnValue = GetDefaultReturnValue<EntryPoint::GetError, GLenum>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetError, GLenum>();
     }
     return returnValue;
 }
@@ -1631,8 +1605,7 @@
 void GL_APIENTRY GetFloatv(GLenum pname, GLfloat *data)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetFloatv, "glGetFloatv",
-          "context = %d, pname = %s, data = 0x%016" PRIxPTR "", CID(context),
+    EVENT(context, GLGetFloatv, "context = %d, pname = %s, data = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::GetPName, pname), (uintptr_t)data);
 
     if (context)
@@ -1657,8 +1630,7 @@
                                                      GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetFramebufferAttachmentParameteriv,
-          "glGetFramebufferAttachmentParameteriv",
+    EVENT(context, GLGetFramebufferAttachmentParameteriv,
           "context = %d, target = %s, attachment = %s, pname = %s, params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target),
           GLenumToString(GLenumGroup::FramebufferAttachment, attachment),
@@ -1687,9 +1659,8 @@
 void GL_APIENTRY GetIntegerv(GLenum pname, GLint *data)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetIntegerv, "glGetIntegerv",
-          "context = %d, pname = %s, data = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::GetPName, pname), (uintptr_t)data);
+    EVENT(context, GLGetIntegerv, "context = %d, pname = %s, data = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::GetPName, pname), (uintptr_t)data);
 
     if (context)
     {
@@ -1713,14 +1684,14 @@
                                    GLchar *infoLog)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetProgramInfoLog, "glGetProgramInfoLog",
+    EVENT(context, GLGetProgramInfoLog,
           "context = %d, program = %u, bufSize = %d, length = 0x%016" PRIxPTR
           ", infoLog = 0x%016" PRIxPTR "",
           CID(context), program, bufSize, (uintptr_t)length, (uintptr_t)infoLog);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -1741,13 +1712,13 @@
 void GL_APIENTRY GetProgramiv(GLuint program, GLenum pname, GLint *params)
 {
     Context *context = GetGlobalContext();
-    EVENT(context, gl::EntryPoint::GetProgramiv, "glGetProgramiv",
+    EVENT(context, GLGetProgramiv,
           "context = %d, program = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           program, GLenumToString(GLenumGroup::ProgramPropertyARB, pname), (uintptr_t)params);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetProgramiv(context, programPacked, pname, params));
@@ -1764,7 +1735,7 @@
 void GL_APIENTRY GetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetRenderbufferParameteriv, "glGetRenderbufferParameteriv",
+    EVENT(context, GLGetRenderbufferParameteriv,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::RenderbufferTarget, target),
           GLenumToString(GLenumGroup::RenderbufferParameterName, pname), (uintptr_t)params);
@@ -1789,14 +1760,14 @@
 void GL_APIENTRY GetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetShaderInfoLog, "glGetShaderInfoLog",
+    EVENT(context, GLGetShaderInfoLog,
           "context = %d, shader = %u, bufSize = %d, length = 0x%016" PRIxPTR
           ", infoLog = 0x%016" PRIxPTR "",
           CID(context), shader, bufSize, (uintptr_t)length, (uintptr_t)infoLog);
 
     if (context)
     {
-        ShaderProgramID shaderPacked                          = FromGL<ShaderProgramID>(shader);
+        ShaderProgramID shaderPacked                          = PackParam<ShaderProgramID>(shader);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -1820,7 +1791,7 @@
                                           GLint *precision)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetShaderPrecisionFormat, "glGetShaderPrecisionFormat",
+    EVENT(context, GLGetShaderPrecisionFormat,
           "context = %d, shadertype = %s, precisiontype = %s, range = 0x%016" PRIxPTR
           ", precision = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::ShaderType, shadertype),
@@ -1849,14 +1820,14 @@
 void GL_APIENTRY GetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetShaderSource, "glGetShaderSource",
+    EVENT(context, GLGetShaderSource,
           "context = %d, shader = %u, bufSize = %d, length = 0x%016" PRIxPTR
           ", source = 0x%016" PRIxPTR "",
           CID(context), shader, bufSize, (uintptr_t)length, (uintptr_t)source);
 
     if (context)
     {
-        ShaderProgramID shaderPacked                          = FromGL<ShaderProgramID>(shader);
+        ShaderProgramID shaderPacked                          = PackParam<ShaderProgramID>(shader);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -1876,13 +1847,13 @@
 void GL_APIENTRY GetShaderiv(GLuint shader, GLenum pname, GLint *params)
 {
     Context *context = GetGlobalContext();
-    EVENT(context, gl::EntryPoint::GetShaderiv, "glGetShaderiv",
+    EVENT(context, GLGetShaderiv,
           "context = %d, shader = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), shader,
           GLenumToString(GLenumGroup::ShaderParameterName, pname), (uintptr_t)params);
 
     if (context)
     {
-        ShaderProgramID shaderPacked                          = FromGL<ShaderProgramID>(shader);
+        ShaderProgramID shaderPacked                          = PackParam<ShaderProgramID>(shader);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetShaderiv(context, shaderPacked, pname, params));
@@ -1899,8 +1870,8 @@
 const GLubyte *GL_APIENTRY GetString(GLenum name)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetString, "glGetString", "context = %d, name = %s",
-          CID(context), GLenumToString(GLenumGroup::StringName, name));
+    EVENT(context, GLGetString, "context = %d, name = %s", CID(context),
+          GLenumToString(GLenumGroup::StringName, name));
 
     const GLubyte *returnValue;
     if (context)
@@ -1913,14 +1884,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetString, const GLubyte *>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetString, const GLubyte *>();
         }
         ANGLE_CAPTURE(GetString, isCallValid, context, name, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::GetString, const GLubyte *>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetString, const GLubyte *>();
     }
     return returnValue;
 }
@@ -1928,14 +1899,14 @@
 void GL_APIENTRY GetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTexParameterfv, "glGetTexParameterfv",
+    EVENT(context, GLGetTexParameterfv,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetTexParameterfv(context, targetPacked, pname, params));
@@ -1954,14 +1925,14 @@
 void GL_APIENTRY GetTexParameteriv(GLenum target, GLenum pname, GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTexParameteriv, "glGetTexParameteriv",
+    EVENT(context, GLGetTexParameteriv,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetTexParameteriv(context, targetPacked, pname, params));
@@ -1980,14 +1951,13 @@
 GLint GL_APIENTRY GetUniformLocation(GLuint program, const GLchar *name)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetUniformLocation, "glGetUniformLocation",
-          "context = %d, program = %u, name = 0x%016" PRIxPTR "", CID(context), program,
-          (uintptr_t)name);
+    EVENT(context, GLGetUniformLocation, "context = %d, program = %u, name = 0x%016" PRIxPTR "",
+          CID(context), program, (uintptr_t)name);
 
     GLint returnValue;
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGetUniformLocation(context, programPacked, name));
@@ -1997,14 +1967,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetUniformLocation, GLint>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetUniformLocation, GLint>();
         }
         ANGLE_CAPTURE(GetUniformLocation, isCallValid, context, programPacked, name, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::GetUniformLocation, GLint>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetUniformLocation, GLint>();
     }
     return returnValue;
 }
@@ -2012,14 +1982,14 @@
 void GL_APIENTRY GetUniformfv(GLuint program, GLint location, GLfloat *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetUniformfv, "glGetUniformfv",
+    EVENT(context, GLGetUniformfv,
           "context = %d, program = %u, location = %d, params = 0x%016" PRIxPTR "", CID(context),
           program, location, (uintptr_t)params);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetUniformfv(context, programPacked, locationPacked, params));
@@ -2038,14 +2008,14 @@
 void GL_APIENTRY GetUniformiv(GLuint program, GLint location, GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetUniformiv, "glGetUniformiv",
+    EVENT(context, GLGetUniformiv,
           "context = %d, program = %u, location = %d, params = 0x%016" PRIxPTR "", CID(context),
           program, location, (uintptr_t)params);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetUniformiv(context, programPacked, locationPacked, params));
@@ -2064,7 +2034,7 @@
 void GL_APIENTRY GetVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetVertexAttribPointerv, "glGetVertexAttribPointerv",
+    EVENT(context, GLGetVertexAttribPointerv,
           "context = %d, index = %u, pname = %s, pointer = 0x%016" PRIxPTR "", CID(context), index,
           GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)pointer);
 
@@ -2088,7 +2058,7 @@
 void GL_APIENTRY GetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetVertexAttribfv, "glGetVertexAttribfv",
+    EVENT(context, GLGetVertexAttribfv,
           "context = %d, index = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), index,
           GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
 
@@ -2112,7 +2082,7 @@
 void GL_APIENTRY GetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetVertexAttribiv, "glGetVertexAttribiv",
+    EVENT(context, GLGetVertexAttribiv,
           "context = %d, index = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), index,
           GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
 
@@ -2136,8 +2106,8 @@
 void GL_APIENTRY Hint(GLenum target, GLenum mode)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Hint, "glHint", "context = %d, target = %s, mode = %s",
-          CID(context), GLenumToString(GLenumGroup::HintTarget, target),
+    EVENT(context, GLHint, "context = %d, target = %s, mode = %s", CID(context),
+          GLenumToString(GLenumGroup::HintTarget, target),
           GLenumToString(GLenumGroup::HintMode, mode));
 
     if (context)
@@ -2159,13 +2129,12 @@
 GLboolean GL_APIENTRY IsBuffer(GLuint buffer)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IsBuffer, "glIsBuffer", "context = %d, buffer = %u",
-          CID(context), buffer);
+    EVENT(context, GLIsBuffer, "context = %d, buffer = %u", CID(context), buffer);
 
     GLboolean returnValue;
     if (context)
     {
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateIsBuffer(context, bufferPacked));
         if (isCallValid)
@@ -2174,14 +2143,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsBuffer, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsBuffer, GLboolean>();
         }
         ANGLE_CAPTURE(IsBuffer, isCallValid, context, bufferPacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::IsBuffer, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsBuffer, GLboolean>();
     }
     return returnValue;
 }
@@ -2189,7 +2158,7 @@
 GLboolean GL_APIENTRY IsEnabled(GLenum cap)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IsEnabled, "glIsEnabled", "context = %d, cap = %s", CID(context),
+    EVENT(context, GLIsEnabled, "context = %d, cap = %s", CID(context),
           GLenumToString(GLenumGroup::EnableCap, cap));
 
     GLboolean returnValue;
@@ -2203,14 +2172,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsEnabled, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsEnabled, GLboolean>();
         }
         ANGLE_CAPTURE(IsEnabled, isCallValid, context, cap, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::IsEnabled, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsEnabled, GLboolean>();
     }
     return returnValue;
 }
@@ -2218,13 +2187,12 @@
 GLboolean GL_APIENTRY IsFramebuffer(GLuint framebuffer)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IsFramebuffer, "glIsFramebuffer",
-          "context = %d, framebuffer = %u", CID(context), framebuffer);
+    EVENT(context, GLIsFramebuffer, "context = %d, framebuffer = %u", CID(context), framebuffer);
 
     GLboolean returnValue;
     if (context)
     {
-        FramebufferID framebufferPacked                       = FromGL<FramebufferID>(framebuffer);
+        FramebufferID framebufferPacked = PackParam<FramebufferID>(framebuffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateIsFramebuffer(context, framebufferPacked));
@@ -2234,14 +2202,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsFramebuffer, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsFramebuffer, GLboolean>();
         }
         ANGLE_CAPTURE(IsFramebuffer, isCallValid, context, framebufferPacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::IsFramebuffer, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsFramebuffer, GLboolean>();
     }
     return returnValue;
 }
@@ -2249,13 +2217,12 @@
 GLboolean GL_APIENTRY IsProgram(GLuint program)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IsProgram, "glIsProgram", "context = %d, program = %u",
-          CID(context), program);
+    EVENT(context, GLIsProgram, "context = %d, program = %u", CID(context), program);
 
     GLboolean returnValue;
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateIsProgram(context, programPacked));
         if (isCallValid)
@@ -2264,14 +2231,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsProgram, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsProgram, GLboolean>();
         }
         ANGLE_CAPTURE(IsProgram, isCallValid, context, programPacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::IsProgram, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsProgram, GLboolean>();
     }
     return returnValue;
 }
@@ -2279,13 +2246,12 @@
 GLboolean GL_APIENTRY IsRenderbuffer(GLuint renderbuffer)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IsRenderbuffer, "glIsRenderbuffer",
-          "context = %d, renderbuffer = %u", CID(context), renderbuffer);
+    EVENT(context, GLIsRenderbuffer, "context = %d, renderbuffer = %u", CID(context), renderbuffer);
 
     GLboolean returnValue;
     if (context)
     {
-        RenderbufferID renderbufferPacked = FromGL<RenderbufferID>(renderbuffer);
+        RenderbufferID renderbufferPacked = PackParam<RenderbufferID>(renderbuffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateIsRenderbuffer(context, renderbufferPacked));
@@ -2295,14 +2261,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsRenderbuffer, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsRenderbuffer, GLboolean>();
         }
         ANGLE_CAPTURE(IsRenderbuffer, isCallValid, context, renderbufferPacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::IsRenderbuffer, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsRenderbuffer, GLboolean>();
     }
     return returnValue;
 }
@@ -2310,13 +2276,12 @@
 GLboolean GL_APIENTRY IsShader(GLuint shader)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IsShader, "glIsShader", "context = %d, shader = %u",
-          CID(context), shader);
+    EVENT(context, GLIsShader, "context = %d, shader = %u", CID(context), shader);
 
     GLboolean returnValue;
     if (context)
     {
-        ShaderProgramID shaderPacked                          = FromGL<ShaderProgramID>(shader);
+        ShaderProgramID shaderPacked                          = PackParam<ShaderProgramID>(shader);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateIsShader(context, shaderPacked));
         if (isCallValid)
@@ -2325,14 +2290,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsShader, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsShader, GLboolean>();
         }
         ANGLE_CAPTURE(IsShader, isCallValid, context, shaderPacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::IsShader, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsShader, GLboolean>();
     }
     return returnValue;
 }
@@ -2340,13 +2305,12 @@
 GLboolean GL_APIENTRY IsTexture(GLuint texture)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IsTexture, "glIsTexture", "context = %d, texture = %u",
-          CID(context), texture);
+    EVENT(context, GLIsTexture, "context = %d, texture = %u", CID(context), texture);
 
     GLboolean returnValue;
     if (context)
     {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateIsTexture(context, texturePacked));
         if (isCallValid)
@@ -2355,14 +2319,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsTexture, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsTexture, GLboolean>();
         }
         ANGLE_CAPTURE(IsTexture, isCallValid, context, texturePacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::IsTexture, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsTexture, GLboolean>();
     }
     return returnValue;
 }
@@ -2370,8 +2334,7 @@
 void GL_APIENTRY LineWidth(GLfloat width)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::LineWidth, "glLineWidth", "context = %d, width = %f",
-          CID(context), width);
+    EVENT(context, GLLineWidth, "context = %d, width = %f", CID(context), width);
 
     if (context)
     {
@@ -2392,12 +2355,11 @@
 void GL_APIENTRY LinkProgram(GLuint program)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::LinkProgram, "glLinkProgram", "context = %d, program = %u",
-          CID(context), program);
+    EVENT(context, GLLinkProgram, "context = %d, program = %u", CID(context), program);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateLinkProgram(context, programPacked));
@@ -2416,8 +2378,7 @@
 void GL_APIENTRY PixelStorei(GLenum pname, GLint param)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PixelStorei, "glPixelStorei",
-          "context = %d, pname = %s, param = %d", CID(context),
+    EVENT(context, GLPixelStorei, "context = %d, pname = %s, param = %d", CID(context),
           GLenumToString(GLenumGroup::PixelStoreParameter, pname), param);
 
     if (context)
@@ -2440,8 +2401,8 @@
 void GL_APIENTRY PolygonOffset(GLfloat factor, GLfloat units)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PolygonOffset, "glPolygonOffset",
-          "context = %d, factor = %f, units = %f", CID(context), factor, units);
+    EVENT(context, GLPolygonOffset, "context = %d, factor = %f, units = %f", CID(context), factor,
+          units);
 
     if (context)
     {
@@ -2469,7 +2430,7 @@
                             void *pixels)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ReadPixels, "glReadPixels",
+    EVENT(context, GLReadPixels,
           "context = %d, x = %d, y = %d, width = %d, height = %d, format = %s, type = %s, pixels = "
           "0x%016" PRIxPTR "",
           CID(context), x, y, width, height, GLenumToString(GLenumGroup::PixelFormat, format),
@@ -2495,8 +2456,7 @@
 void GL_APIENTRY ReleaseShaderCompiler()
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ReleaseShaderCompiler, "glReleaseShaderCompiler", "context = %d",
-          CID(context));
+    EVENT(context, GLReleaseShaderCompiler, "context = %d", CID(context));
 
     if (context)
     {
@@ -2520,7 +2480,7 @@
                                      GLsizei height)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::RenderbufferStorage, "glRenderbufferStorage",
+    EVENT(context, GLRenderbufferStorage,
           "context = %d, target = %s, internalformat = %s, width = %d, height = %d", CID(context),
           GLenumToString(GLenumGroup::RenderbufferTarget, target),
           GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height);
@@ -2547,8 +2507,8 @@
 void GL_APIENTRY SampleCoverage(GLfloat value, GLboolean invert)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SampleCoverage, "glSampleCoverage",
-          "context = %d, value = %f, invert = %s", CID(context), value, GLbooleanToString(invert));
+    EVENT(context, GLSampleCoverage, "context = %d, value = %f, invert = %s", CID(context), value,
+          GLbooleanToString(invert));
 
     if (context)
     {
@@ -2570,9 +2530,8 @@
 void GL_APIENTRY Scissor(GLint x, GLint y, GLsizei width, GLsizei height)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Scissor, "glScissor",
-          "context = %d, x = %d, y = %d, width = %d, height = %d", CID(context), x, y, width,
-          height);
+    EVENT(context, GLScissor, "context = %d, x = %d, y = %d, width = %d, height = %d", CID(context),
+          x, y, width, height);
 
     if (context)
     {
@@ -2598,7 +2557,7 @@
                               GLsizei length)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ShaderBinary, "glShaderBinary",
+    EVENT(context, GLShaderBinary,
           "context = %d, count = %d, shaders = 0x%016" PRIxPTR
           ", binaryformat = %s, binary = 0x%016" PRIxPTR ", length = %d",
           CID(context), count, (uintptr_t)shaders,
@@ -2606,7 +2565,7 @@
 
     if (context)
     {
-        const ShaderProgramID *shadersPacked = FromGL<const ShaderProgramID *>(shaders);
+        const ShaderProgramID *shadersPacked = PackParam<const ShaderProgramID *>(shaders);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -2630,14 +2589,14 @@
                               const GLint *length)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ShaderSource, "glShaderSource",
+    EVENT(context, GLShaderSource,
           "context = %d, shader = %u, count = %d, string = 0x%016" PRIxPTR
           ", length = 0x%016" PRIxPTR "",
           CID(context), shader, count, (uintptr_t)string, (uintptr_t)length);
 
     if (context)
     {
-        ShaderProgramID shaderPacked                          = FromGL<ShaderProgramID>(shader);
+        ShaderProgramID shaderPacked                          = PackParam<ShaderProgramID>(shader);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateShaderSource(context, shaderPacked, count, string, length));
@@ -2656,8 +2615,7 @@
 void GL_APIENTRY StencilFunc(GLenum func, GLint ref, GLuint mask)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::StencilFunc, "glStencilFunc",
-          "context = %d, func = %s, ref = %d, mask = %u", CID(context),
+    EVENT(context, GLStencilFunc, "context = %d, func = %s, ref = %d, mask = %u", CID(context),
           GLenumToString(GLenumGroup::StencilFunction, func), ref, mask);
 
     if (context)
@@ -2680,9 +2638,8 @@
 void GL_APIENTRY StencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::StencilFuncSeparate, "glStencilFuncSeparate",
-          "context = %d, face = %s, func = %s, ref = %d, mask = %u", CID(context),
-          GLenumToString(GLenumGroup::StencilFaceDirection, face),
+    EVENT(context, GLStencilFuncSeparate, "context = %d, face = %s, func = %s, ref = %d, mask = %u",
+          CID(context), GLenumToString(GLenumGroup::StencilFaceDirection, face),
           GLenumToString(GLenumGroup::StencilFunction, func), ref, mask);
 
     if (context)
@@ -2705,8 +2662,7 @@
 void GL_APIENTRY StencilMask(GLuint mask)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::StencilMask, "glStencilMask", "context = %d, mask = %u",
-          CID(context), mask);
+    EVENT(context, GLStencilMask, "context = %d, mask = %u", CID(context), mask);
 
     if (context)
     {
@@ -2727,8 +2683,7 @@
 void GL_APIENTRY StencilMaskSeparate(GLenum face, GLuint mask)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::StencilMaskSeparate, "glStencilMaskSeparate",
-          "context = %d, face = %s, mask = %u", CID(context),
+    EVENT(context, GLStencilMaskSeparate, "context = %d, face = %s, mask = %u", CID(context),
           GLenumToString(GLenumGroup::StencilFaceDirection, face), mask);
 
     if (context)
@@ -2751,8 +2706,7 @@
 void GL_APIENTRY StencilOp(GLenum fail, GLenum zfail, GLenum zpass)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::StencilOp, "glStencilOp",
-          "context = %d, fail = %s, zfail = %s, zpass = %s", CID(context),
+    EVENT(context, GLStencilOp, "context = %d, fail = %s, zfail = %s, zpass = %s", CID(context),
           GLenumToString(GLenumGroup::StencilOp, fail),
           GLenumToString(GLenumGroup::StencilOp, zfail),
           GLenumToString(GLenumGroup::StencilOp, zpass));
@@ -2777,7 +2731,7 @@
 void GL_APIENTRY StencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::StencilOpSeparate, "glStencilOpSeparate",
+    EVENT(context, GLStencilOpSeparate,
           "context = %d, face = %s, sfail = %s, dpfail = %s, dppass = %s", CID(context),
           GLenumToString(GLenumGroup::StencilFaceDirection, face),
           GLenumToString(GLenumGroup::StencilOp, sfail),
@@ -2812,7 +2766,7 @@
                             const void *pixels)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexImage2D, "glTexImage2D",
+    EVENT(context, GLTexImage2D,
           "context = %d, target = %s, level = %d, internalformat = %d, width = %d, height = %d, "
           "border = %d, format = %s, type = %s, pixels = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, internalformat,
@@ -2821,7 +2775,7 @@
 
     if (context)
     {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexImage2D(context, targetPacked, level, internalformat, width,
@@ -2843,14 +2797,13 @@
 void GL_APIENTRY TexParameterf(GLenum target, GLenum pname, GLfloat param)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexParameterf, "glTexParameterf",
-          "context = %d, target = %s, pname = %s, param = %f", CID(context),
-          GLenumToString(GLenumGroup::TextureTarget, target),
+    EVENT(context, GLTexParameterf, "context = %d, target = %s, pname = %s, param = %f",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::TextureParameterName, pname), param);
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexParameterf(context, targetPacked, pname, param));
@@ -2869,14 +2822,14 @@
 void GL_APIENTRY TexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexParameterfv, "glTexParameterfv",
+    EVENT(context, GLTexParameterfv,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::TextureParameterName, pname), (uintptr_t)params);
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexParameterfv(context, targetPacked, pname, params));
@@ -2895,14 +2848,13 @@
 void GL_APIENTRY TexParameteri(GLenum target, GLenum pname, GLint param)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexParameteri, "glTexParameteri",
-          "context = %d, target = %s, pname = %s, param = %d", CID(context),
-          GLenumToString(GLenumGroup::TextureTarget, target),
+    EVENT(context, GLTexParameteri, "context = %d, target = %s, pname = %s, param = %d",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::TextureParameterName, pname), param);
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexParameteri(context, targetPacked, pname, param));
@@ -2921,14 +2873,14 @@
 void GL_APIENTRY TexParameteriv(GLenum target, GLenum pname, const GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexParameteriv, "glTexParameteriv",
+    EVENT(context, GLTexParameteriv,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::TextureParameterName, pname), (uintptr_t)params);
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexParameteriv(context, targetPacked, pname, params));
@@ -2955,7 +2907,7 @@
                                const void *pixels)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexSubImage2D, "glTexSubImage2D",
+    EVENT(context, GLTexSubImage2D,
           "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, width = %d, height = "
           "%d, format = %s, type = %s, pixels = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, xoffset, yoffset,
@@ -2964,7 +2916,7 @@
 
     if (context)
     {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexSubImage2D(context, targetPacked, level, xoffset, yoffset,
@@ -2986,12 +2938,11 @@
 void GL_APIENTRY Uniform1f(GLint location, GLfloat v0)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform1f, "glUniform1f", "context = %d, location = %d, v0 = %f",
-          CID(context), location, v0);
+    EVENT(context, GLUniform1f, "context = %d, location = %d, v0 = %f", CID(context), location, v0);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateUniform1f(context, locationPacked, v0));
@@ -3010,13 +2961,13 @@
 void GL_APIENTRY Uniform1fv(GLint location, GLsizei count, const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform1fv, "glUniform1fv",
+    EVENT(context, GLUniform1fv,
           "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
           location, count, (uintptr_t)value);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform1fv(context, locationPacked, count, value));
@@ -3035,12 +2986,11 @@
 void GL_APIENTRY Uniform1i(GLint location, GLint v0)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform1i, "glUniform1i", "context = %d, location = %d, v0 = %d",
-          CID(context), location, v0);
+    EVENT(context, GLUniform1i, "context = %d, location = %d, v0 = %d", CID(context), location, v0);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateUniform1i(context, locationPacked, v0));
@@ -3059,13 +3009,13 @@
 void GL_APIENTRY Uniform1iv(GLint location, GLsizei count, const GLint *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform1iv, "glUniform1iv",
+    EVENT(context, GLUniform1iv,
           "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
           location, count, (uintptr_t)value);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform1iv(context, locationPacked, count, value));
@@ -3084,12 +3034,12 @@
 void GL_APIENTRY Uniform2f(GLint location, GLfloat v0, GLfloat v1)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform2f, "glUniform2f",
-          "context = %d, location = %d, v0 = %f, v1 = %f", CID(context), location, v0, v1);
+    EVENT(context, GLUniform2f, "context = %d, location = %d, v0 = %f, v1 = %f", CID(context),
+          location, v0, v1);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateUniform2f(context, locationPacked, v0, v1));
@@ -3108,13 +3058,13 @@
 void GL_APIENTRY Uniform2fv(GLint location, GLsizei count, const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform2fv, "glUniform2fv",
+    EVENT(context, GLUniform2fv,
           "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
           location, count, (uintptr_t)value);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform2fv(context, locationPacked, count, value));
@@ -3133,12 +3083,12 @@
 void GL_APIENTRY Uniform2i(GLint location, GLint v0, GLint v1)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform2i, "glUniform2i",
-          "context = %d, location = %d, v0 = %d, v1 = %d", CID(context), location, v0, v1);
+    EVENT(context, GLUniform2i, "context = %d, location = %d, v0 = %d, v1 = %d", CID(context),
+          location, v0, v1);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateUniform2i(context, locationPacked, v0, v1));
@@ -3157,13 +3107,13 @@
 void GL_APIENTRY Uniform2iv(GLint location, GLsizei count, const GLint *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform2iv, "glUniform2iv",
+    EVENT(context, GLUniform2iv,
           "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
           location, count, (uintptr_t)value);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform2iv(context, locationPacked, count, value));
@@ -3182,13 +3132,12 @@
 void GL_APIENTRY Uniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform3f, "glUniform3f",
-          "context = %d, location = %d, v0 = %f, v1 = %f, v2 = %f", CID(context), location, v0, v1,
-          v2);
+    EVENT(context, GLUniform3f, "context = %d, location = %d, v0 = %f, v1 = %f, v2 = %f",
+          CID(context), location, v0, v1, v2);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateUniform3f(context, locationPacked, v0, v1, v2));
@@ -3207,13 +3156,13 @@
 void GL_APIENTRY Uniform3fv(GLint location, GLsizei count, const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform3fv, "glUniform3fv",
+    EVENT(context, GLUniform3fv,
           "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
           location, count, (uintptr_t)value);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform3fv(context, locationPacked, count, value));
@@ -3232,13 +3181,12 @@
 void GL_APIENTRY Uniform3i(GLint location, GLint v0, GLint v1, GLint v2)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform3i, "glUniform3i",
-          "context = %d, location = %d, v0 = %d, v1 = %d, v2 = %d", CID(context), location, v0, v1,
-          v2);
+    EVENT(context, GLUniform3i, "context = %d, location = %d, v0 = %d, v1 = %d, v2 = %d",
+          CID(context), location, v0, v1, v2);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateUniform3i(context, locationPacked, v0, v1, v2));
@@ -3257,13 +3205,13 @@
 void GL_APIENTRY Uniform3iv(GLint location, GLsizei count, const GLint *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform3iv, "glUniform3iv",
+    EVENT(context, GLUniform3iv,
           "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
           location, count, (uintptr_t)value);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform3iv(context, locationPacked, count, value));
@@ -3282,13 +3230,12 @@
 void GL_APIENTRY Uniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform4f, "glUniform4f",
-          "context = %d, location = %d, v0 = %f, v1 = %f, v2 = %f, v3 = %f", CID(context), location,
-          v0, v1, v2, v3);
+    EVENT(context, GLUniform4f, "context = %d, location = %d, v0 = %f, v1 = %f, v2 = %f, v3 = %f",
+          CID(context), location, v0, v1, v2, v3);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform4f(context, locationPacked, v0, v1, v2, v3));
@@ -3307,13 +3254,13 @@
 void GL_APIENTRY Uniform4fv(GLint location, GLsizei count, const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform4fv, "glUniform4fv",
+    EVENT(context, GLUniform4fv,
           "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
           location, count, (uintptr_t)value);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform4fv(context, locationPacked, count, value));
@@ -3332,13 +3279,12 @@
 void GL_APIENTRY Uniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform4i, "glUniform4i",
-          "context = %d, location = %d, v0 = %d, v1 = %d, v2 = %d, v3 = %d", CID(context), location,
-          v0, v1, v2, v3);
+    EVENT(context, GLUniform4i, "context = %d, location = %d, v0 = %d, v1 = %d, v2 = %d, v3 = %d",
+          CID(context), location, v0, v1, v2, v3);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform4i(context, locationPacked, v0, v1, v2, v3));
@@ -3357,13 +3303,13 @@
 void GL_APIENTRY Uniform4iv(GLint location, GLsizei count, const GLint *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform4iv, "glUniform4iv",
+    EVENT(context, GLUniform4iv,
           "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
           location, count, (uintptr_t)value);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform4iv(context, locationPacked, count, value));
@@ -3385,13 +3331,13 @@
                                   const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::UniformMatrix2fv, "glUniformMatrix2fv",
+    EVENT(context, GLUniformMatrix2fv,
           "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
           CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -3415,13 +3361,13 @@
                                   const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::UniformMatrix3fv, "glUniformMatrix3fv",
+    EVENT(context, GLUniformMatrix3fv,
           "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
           CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -3445,13 +3391,13 @@
                                   const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::UniformMatrix4fv, "glUniformMatrix4fv",
+    EVENT(context, GLUniformMatrix4fv,
           "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
           CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -3472,12 +3418,11 @@
 void GL_APIENTRY UseProgram(GLuint program)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::UseProgram, "glUseProgram", "context = %d, program = %u",
-          CID(context), program);
+    EVENT(context, GLUseProgram, "context = %d, program = %u", CID(context), program);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateUseProgram(context, programPacked));
@@ -3496,12 +3441,11 @@
 void GL_APIENTRY ValidateProgram(GLuint program)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ValidateProgram, "glValidateProgram",
-          "context = %d, program = %u", CID(context), program);
+    EVENT(context, GLValidateProgram, "context = %d, program = %u", CID(context), program);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateValidateProgram(context, programPacked));
@@ -3520,8 +3464,7 @@
 void GL_APIENTRY VertexAttrib1f(GLuint index, GLfloat x)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib1f, "glVertexAttrib1f",
-          "context = %d, index = %u, x = %f", CID(context), index, x);
+    EVENT(context, GLVertexAttrib1f, "context = %d, index = %u, x = %f", CID(context), index, x);
 
     if (context)
     {
@@ -3542,8 +3485,8 @@
 void GL_APIENTRY VertexAttrib1fv(GLuint index, const GLfloat *v)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib1fv, "glVertexAttrib1fv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
+    EVENT(context, GLVertexAttrib1fv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
 
     if (context)
     {
@@ -3565,8 +3508,8 @@
 void GL_APIENTRY VertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib2f, "glVertexAttrib2f",
-          "context = %d, index = %u, x = %f, y = %f", CID(context), index, x, y);
+    EVENT(context, GLVertexAttrib2f, "context = %d, index = %u, x = %f, y = %f", CID(context),
+          index, x, y);
 
     if (context)
     {
@@ -3588,8 +3531,8 @@
 void GL_APIENTRY VertexAttrib2fv(GLuint index, const GLfloat *v)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib2fv, "glVertexAttrib2fv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
+    EVENT(context, GLVertexAttrib2fv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
 
     if (context)
     {
@@ -3611,8 +3554,8 @@
 void GL_APIENTRY VertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib3f, "glVertexAttrib3f",
-          "context = %d, index = %u, x = %f, y = %f, z = %f", CID(context), index, x, y, z);
+    EVENT(context, GLVertexAttrib3f, "context = %d, index = %u, x = %f, y = %f, z = %f",
+          CID(context), index, x, y, z);
 
     if (context)
     {
@@ -3634,8 +3577,8 @@
 void GL_APIENTRY VertexAttrib3fv(GLuint index, const GLfloat *v)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib3fv, "glVertexAttrib3fv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
+    EVENT(context, GLVertexAttrib3fv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
 
     if (context)
     {
@@ -3657,9 +3600,8 @@
 void GL_APIENTRY VertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib4f, "glVertexAttrib4f",
-          "context = %d, index = %u, x = %f, y = %f, z = %f, w = %f", CID(context), index, x, y, z,
-          w);
+    EVENT(context, GLVertexAttrib4f, "context = %d, index = %u, x = %f, y = %f, z = %f, w = %f",
+          CID(context), index, x, y, z, w);
 
     if (context)
     {
@@ -3681,8 +3623,8 @@
 void GL_APIENTRY VertexAttrib4fv(GLuint index, const GLfloat *v)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttrib4fv, "glVertexAttrib4fv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
+    EVENT(context, GLVertexAttrib4fv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
 
     if (context)
     {
@@ -3709,7 +3651,7 @@
                                      const void *pointer)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribPointer, "glVertexAttribPointer",
+    EVENT(context, GLVertexAttribPointer,
           "context = %d, index = %u, size = %d, type = %s, normalized = %s, stride = %d, pointer = "
           "0x%016" PRIxPTR "",
           CID(context), index, size, GLenumToString(GLenumGroup::VertexAttribPointerType, type),
@@ -3717,7 +3659,7 @@
 
     if (context)
     {
-        VertexAttribType typePacked                           = FromGL<VertexAttribType>(type);
+        VertexAttribType typePacked                           = PackParam<VertexAttribType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateVertexAttribPointer(context, index, size, typePacked,
@@ -3738,9 +3680,8 @@
 void GL_APIENTRY Viewport(GLint x, GLint y, GLsizei width, GLsizei height)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Viewport, "glViewport",
-          "context = %d, x = %d, y = %d, width = %d, height = %d", CID(context), x, y, width,
-          height);
+    EVENT(context, GLViewport, "context = %d, x = %d, y = %d, width = %d, height = %d",
+          CID(context), x, y, width, height);
 
     if (context)
     {
diff --git a/src/libGLESv2/entry_points_gles_3_0_autogen.cpp b/src/libGLESv2/entry_points_gles_3_0_autogen.cpp
index 25ef1ca..6dfebd5 100644
--- a/src/libGLESv2/entry_points_gles_3_0_autogen.cpp
+++ b/src/libGLESv2/entry_points_gles_3_0_autogen.cpp
@@ -24,13 +24,13 @@
 void GL_APIENTRY BeginQuery(GLenum target, GLuint id)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BeginQuery, "glBeginQuery", "context = %d, target = %s, id = %u",
-          CID(context), GLenumToString(GLenumGroup::QueryTarget, target), id);
+    EVENT(context, GLBeginQuery, "context = %d, target = %s, id = %u", CID(context),
+          GLenumToString(GLenumGroup::QueryTarget, target), id);
 
     if (context)
     {
-        QueryType targetPacked                                = FromGL<QueryType>(target);
-        QueryID idPacked                                      = FromGL<QueryID>(id);
+        QueryType targetPacked                                = PackParam<QueryType>(target);
+        QueryID idPacked                                      = PackParam<QueryID>(id);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateBeginQuery(context, targetPacked, idPacked));
@@ -49,13 +49,12 @@
 void GL_APIENTRY BeginTransformFeedback(GLenum primitiveMode)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BeginTransformFeedback, "glBeginTransformFeedback",
-          "context = %d, primitiveMode = %s", CID(context),
+    EVENT(context, GLBeginTransformFeedback, "context = %d, primitiveMode = %s", CID(context),
           GLenumToString(GLenumGroup::PrimitiveType, primitiveMode));
 
     if (context)
     {
-        PrimitiveMode primitiveModePacked = FromGL<PrimitiveMode>(primitiveMode);
+        PrimitiveMode primitiveModePacked = PackParam<PrimitiveMode>(primitiveMode);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateBeginTransformFeedback(context, primitiveModePacked));
@@ -74,14 +73,13 @@
 void GL_APIENTRY BindBufferBase(GLenum target, GLuint index, GLuint buffer)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindBufferBase, "glBindBufferBase",
-          "context = %d, target = %s, index = %u, buffer = %u", CID(context),
-          GLenumToString(GLenumGroup::BufferTargetARB, target), index, buffer);
+    EVENT(context, GLBindBufferBase, "context = %d, target = %s, index = %u, buffer = %u",
+          CID(context), GLenumToString(GLenumGroup::BufferTargetARB, target), index, buffer);
 
     if (context)
     {
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateBindBufferBase(context, targetPacked, index, bufferPacked));
@@ -101,15 +99,15 @@
 BindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindBufferRange, "glBindBufferRange",
+    EVENT(context, GLBindBufferRange,
           "context = %d, target = %s, index = %u, buffer = %u, offset = %llu, size = %llu",
           CID(context), GLenumToString(GLenumGroup::BufferTargetARB, target), index, buffer,
           static_cast<unsigned long long>(offset), static_cast<unsigned long long>(size));
 
     if (context)
     {
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -130,12 +128,12 @@
 void GL_APIENTRY BindSampler(GLuint unit, GLuint sampler)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindSampler, "glBindSampler",
-          "context = %d, unit = %u, sampler = %u", CID(context), unit, sampler);
+    EVENT(context, GLBindSampler, "context = %d, unit = %u, sampler = %u", CID(context), unit,
+          sampler);
 
     if (context)
     {
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateBindSampler(context, unit, samplerPacked));
@@ -154,13 +152,12 @@
 void GL_APIENTRY BindTransformFeedback(GLenum target, GLuint id)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindTransformFeedback, "glBindTransformFeedback",
-          "context = %d, target = %s, id = %u", CID(context),
+    EVENT(context, GLBindTransformFeedback, "context = %d, target = %s, id = %u", CID(context),
           GLenumToString(GLenumGroup::BindTransformFeedbackTarget, target), id);
 
     if (context)
     {
-        TransformFeedbackID idPacked                          = FromGL<TransformFeedbackID>(id);
+        TransformFeedbackID idPacked                          = PackParam<TransformFeedbackID>(id);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateBindTransformFeedback(context, target, idPacked));
@@ -179,12 +176,11 @@
 void GL_APIENTRY BindVertexArray(GLuint array)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindVertexArray, "glBindVertexArray", "context = %d, array = %u",
-          CID(context), array);
+    EVENT(context, GLBindVertexArray, "context = %d, array = %u", CID(context), array);
 
     if (context)
     {
-        VertexArrayID arrayPacked                             = FromGL<VertexArrayID>(array);
+        VertexArrayID arrayPacked                             = PackParam<VertexArrayID>(array);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateBindVertexArray(context, arrayPacked));
@@ -212,7 +208,7 @@
                                  GLenum filter)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BlitFramebuffer, "glBlitFramebuffer",
+    EVENT(context, GLBlitFramebuffer,
           "context = %d, srcX0 = %d, srcY0 = %d, srcX1 = %d, srcY1 = %d, dstX0 = %d, dstY0 = %d, "
           "dstX1 = %d, dstY1 = %d, mask = %s, filter = %s",
           CID(context), srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
@@ -242,7 +238,7 @@
 void GL_APIENTRY ClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ClearBufferfi, "glClearBufferfi",
+    EVENT(context, GLClearBufferfi,
           "context = %d, buffer = %s, drawbuffer = %d, depth = %f, stencil = %d", CID(context),
           GLenumToString(GLenumGroup::Buffer, buffer), drawbuffer, depth, stencil);
 
@@ -266,7 +262,7 @@
 void GL_APIENTRY ClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ClearBufferfv, "glClearBufferfv",
+    EVENT(context, GLClearBufferfv,
           "context = %d, buffer = %s, drawbuffer = %d, value = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::Buffer, buffer), drawbuffer, (uintptr_t)value);
 
@@ -290,7 +286,7 @@
 void GL_APIENTRY ClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ClearBufferiv, "glClearBufferiv",
+    EVENT(context, GLClearBufferiv,
           "context = %d, buffer = %s, drawbuffer = %d, value = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::Buffer, buffer), drawbuffer, (uintptr_t)value);
 
@@ -314,7 +310,7 @@
 void GL_APIENTRY ClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ClearBufferuiv, "glClearBufferuiv",
+    EVENT(context, GLClearBufferuiv,
           "context = %d, buffer = %s, drawbuffer = %d, value = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::Buffer, buffer), drawbuffer, (uintptr_t)value);
 
@@ -338,7 +334,7 @@
 GLenum GL_APIENTRY ClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ClientWaitSync, "glClientWaitSync",
+    EVENT(context, GLClientWaitSync,
           "context = %d, sync = 0x%016" PRIxPTR ", flags = %s, timeout = %llu", CID(context),
           (uintptr_t)sync, GLbitfieldToString(GLenumGroup::SyncObjectMask, flags).c_str(),
           static_cast<unsigned long long>(timeout));
@@ -355,14 +351,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::ClientWaitSync, GLenum>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLClientWaitSync, GLenum>();
         }
         ANGLE_CAPTURE(ClientWaitSync, isCallValid, context, sync, flags, timeout, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::ClientWaitSync, GLenum>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLClientWaitSync, GLenum>();
     }
     return returnValue;
 }
@@ -378,7 +374,7 @@
                                       const void *data)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CompressedTexImage3D, "glCompressedTexImage3D",
+    EVENT(context, GLCompressedTexImage3D,
           "context = %d, target = %s, level = %d, internalformat = %s, width = %d, height = %d, "
           "depth = %d, border = %d, imageSize = %d, data = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level,
@@ -387,7 +383,7 @@
 
     if (context)
     {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -420,7 +416,7 @@
                                          const void *data)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CompressedTexSubImage3D, "glCompressedTexSubImage3D",
+    EVENT(context, GLCompressedTexSubImage3D,
           "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, width "
           "= %d, height = %d, depth = %d, format = %s, imageSize = %d, data = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, xoffset, yoffset,
@@ -429,7 +425,7 @@
 
     if (context)
     {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateCompressedTexSubImage3D(context, targetPacked, level, xoffset,
@@ -456,7 +452,7 @@
                                    GLsizeiptr size)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CopyBufferSubData, "glCopyBufferSubData",
+    EVENT(context, GLCopyBufferSubData,
           "context = %d, readTarget = %s, writeTarget = %s, readOffset = %llu, writeOffset = %llu, "
           "size = %llu",
           CID(context), GLenumToString(GLenumGroup::CopyBufferSubDataTarget, readTarget),
@@ -466,8 +462,8 @@
 
     if (context)
     {
-        BufferBinding readTargetPacked                        = FromGL<BufferBinding>(readTarget);
-        BufferBinding writeTargetPacked                       = FromGL<BufferBinding>(writeTarget);
+        BufferBinding readTargetPacked  = PackParam<BufferBinding>(readTarget);
+        BufferBinding writeTargetPacked = PackParam<BufferBinding>(writeTarget);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateCopyBufferSubData(context, readTargetPacked, writeTargetPacked,
@@ -497,7 +493,7 @@
                                    GLsizei height)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CopyTexSubImage3D, "glCopyTexSubImage3D",
+    EVENT(context, GLCopyTexSubImage3D,
           "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, x = "
           "%d, y = %d, width = %d, height = %d",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, xoffset, yoffset,
@@ -505,7 +501,7 @@
 
     if (context)
     {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateCopyTexSubImage3D(context, targetPacked, level, xoffset,
@@ -527,12 +523,12 @@
 void GL_APIENTRY DeleteQueries(GLsizei n, const GLuint *ids)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DeleteQueries, "glDeleteQueries",
-          "context = %d, n = %d, ids = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)ids);
+    EVENT(context, GLDeleteQueries, "context = %d, n = %d, ids = 0x%016" PRIxPTR "", CID(context),
+          n, (uintptr_t)ids);
 
     if (context)
     {
-        const QueryID *idsPacked                              = FromGL<const QueryID *>(ids);
+        const QueryID *idsPacked                              = PackParam<const QueryID *>(ids);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateDeleteQueries(context, n, idsPacked));
@@ -551,13 +547,12 @@
 void GL_APIENTRY DeleteSamplers(GLsizei count, const GLuint *samplers)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DeleteSamplers, "glDeleteSamplers",
-          "context = %d, count = %d, samplers = 0x%016" PRIxPTR "", CID(context), count,
-          (uintptr_t)samplers);
+    EVENT(context, GLDeleteSamplers, "context = %d, count = %d, samplers = 0x%016" PRIxPTR "",
+          CID(context), count, (uintptr_t)samplers);
 
     if (context)
     {
-        const SamplerID *samplersPacked                       = FromGL<const SamplerID *>(samplers);
+        const SamplerID *samplersPacked = PackParam<const SamplerID *>(samplers);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateDeleteSamplers(context, count, samplersPacked));
@@ -576,8 +571,8 @@
 void GL_APIENTRY DeleteSync(GLsync sync)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DeleteSync, "glDeleteSync",
-          "context = %d, sync = 0x%016" PRIxPTR "", CID(context), (uintptr_t)sync);
+    EVENT(context, GLDeleteSync, "context = %d, sync = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)sync);
 
     if (context)
     {
@@ -598,12 +593,12 @@
 void GL_APIENTRY DeleteTransformFeedbacks(GLsizei n, const GLuint *ids)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DeleteTransformFeedbacks, "glDeleteTransformFeedbacks",
-          "context = %d, n = %d, ids = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)ids);
+    EVENT(context, GLDeleteTransformFeedbacks, "context = %d, n = %d, ids = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)ids);
 
     if (context)
     {
-        const TransformFeedbackID *idsPacked = FromGL<const TransformFeedbackID *>(ids);
+        const TransformFeedbackID *idsPacked = PackParam<const TransformFeedbackID *>(ids);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateDeleteTransformFeedbacks(context, n, idsPacked));
@@ -622,12 +617,12 @@
 void GL_APIENTRY DeleteVertexArrays(GLsizei n, const GLuint *arrays)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DeleteVertexArrays, "glDeleteVertexArrays",
-          "context = %d, n = %d, arrays = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)arrays);
+    EVENT(context, GLDeleteVertexArrays, "context = %d, n = %d, arrays = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)arrays);
 
     if (context)
     {
-        const VertexArrayID *arraysPacked = FromGL<const VertexArrayID *>(arrays);
+        const VertexArrayID *arraysPacked = PackParam<const VertexArrayID *>(arrays);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateDeleteVertexArrays(context, n, arraysPacked));
@@ -646,13 +641,13 @@
 void GL_APIENTRY DrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawArraysInstanced, "glDrawArraysInstanced",
+    EVENT(context, GLDrawArraysInstanced,
           "context = %d, mode = %s, first = %d, count = %d, instancecount = %d", CID(context),
           GLenumToString(GLenumGroup::PrimitiveType, mode), first, count, instancecount);
 
     if (context)
     {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -673,8 +668,8 @@
 void GL_APIENTRY DrawBuffers(GLsizei n, const GLenum *bufs)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawBuffers, "glDrawBuffers",
-          "context = %d, n = %d, bufs = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)bufs);
+    EVENT(context, GLDrawBuffers, "context = %d, n = %d, bufs = 0x%016" PRIxPTR "", CID(context), n,
+          (uintptr_t)bufs);
 
     if (context)
     {
@@ -699,7 +694,7 @@
                                        GLsizei instancecount)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawElementsInstanced, "glDrawElementsInstanced",
+    EVENT(context, GLDrawElementsInstanced,
           "context = %d, mode = %s, count = %d, type = %s, indices = 0x%016" PRIxPTR
           ", instancecount = %d",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), count,
@@ -707,8 +702,8 @@
 
     if (context)
     {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateDrawElementsInstanced(context, modePacked, count, typePacked,
@@ -734,7 +729,7 @@
                                    const void *indices)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawRangeElements, "glDrawRangeElements",
+    EVENT(context, GLDrawRangeElements,
           "context = %d, mode = %s, start = %u, end = %u, count = %d, type = %s, indices = "
           "0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), start, end, count,
@@ -742,8 +737,8 @@
 
     if (context)
     {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateDrawRangeElements(context, modePacked, start, end,
@@ -764,12 +759,12 @@
 void GL_APIENTRY EndQuery(GLenum target)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::EndQuery, "glEndQuery", "context = %d, target = %s",
-          CID(context), GLenumToString(GLenumGroup::QueryTarget, target));
+    EVENT(context, GLEndQuery, "context = %d, target = %s", CID(context),
+          GLenumToString(GLenumGroup::QueryTarget, target));
 
     if (context)
     {
-        QueryType targetPacked                                = FromGL<QueryType>(target);
+        QueryType targetPacked                                = PackParam<QueryType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateEndQuery(context, targetPacked));
         if (isCallValid)
@@ -787,8 +782,7 @@
 void GL_APIENTRY EndTransformFeedback()
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::EndTransformFeedback, "glEndTransformFeedback", "context = %d",
-          CID(context));
+    EVENT(context, GLEndTransformFeedback, "context = %d", CID(context));
 
     if (context)
     {
@@ -809,8 +803,7 @@
 GLsync GL_APIENTRY FenceSync(GLenum condition, GLbitfield flags)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::FenceSync, "glFenceSync",
-          "context = %d, condition = %s, flags = %s", CID(context),
+    EVENT(context, GLFenceSync, "context = %d, condition = %s, flags = %s", CID(context),
           GLenumToString(GLenumGroup::SyncCondition, condition),
           GLbitfieldToString(GLenumGroup::DefaultGroup, flags).c_str());
 
@@ -826,14 +819,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::FenceSync, GLsync>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLFenceSync, GLsync>();
         }
         ANGLE_CAPTURE(FenceSync, isCallValid, context, condition, flags, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::FenceSync, GLsync>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLFenceSync, GLsync>();
     }
     return returnValue;
 }
@@ -841,14 +834,14 @@
 void GL_APIENTRY FlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::FlushMappedBufferRange, "glFlushMappedBufferRange",
+    EVENT(context, GLFlushMappedBufferRange,
           "context = %d, target = %s, offset = %llu, length = %llu", CID(context),
           GLenumToString(GLenumGroup::BufferTargetARB, target),
           static_cast<unsigned long long>(offset), static_cast<unsigned long long>(length));
 
     if (context)
     {
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateFlushMappedBufferRange(context, targetPacked, offset, length));
@@ -868,14 +861,14 @@
 FramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::FramebufferTextureLayer, "glFramebufferTextureLayer",
+    EVENT(context, GLFramebufferTextureLayer,
           "context = %d, target = %s, attachment = %s, texture = %u, level = %d, layer = %d",
           CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target),
           GLenumToString(GLenumGroup::FramebufferAttachment, attachment), texture, level, layer);
 
     if (context)
     {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateFramebufferTextureLayer(context, target, attachment,
@@ -896,12 +889,12 @@
 void GL_APIENTRY GenQueries(GLsizei n, GLuint *ids)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GenQueries, "glGenQueries",
-          "context = %d, n = %d, ids = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)ids);
+    EVENT(context, GLGenQueries, "context = %d, n = %d, ids = 0x%016" PRIxPTR "", CID(context), n,
+          (uintptr_t)ids);
 
     if (context)
     {
-        QueryID *idsPacked                                    = FromGL<QueryID *>(ids);
+        QueryID *idsPacked                                    = PackParam<QueryID *>(ids);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateGenQueries(context, n, idsPacked));
         if (isCallValid)
@@ -919,13 +912,12 @@
 void GL_APIENTRY GenSamplers(GLsizei count, GLuint *samplers)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GenSamplers, "glGenSamplers",
-          "context = %d, count = %d, samplers = 0x%016" PRIxPTR "", CID(context), count,
-          (uintptr_t)samplers);
+    EVENT(context, GLGenSamplers, "context = %d, count = %d, samplers = 0x%016" PRIxPTR "",
+          CID(context), count, (uintptr_t)samplers);
 
     if (context)
     {
-        SamplerID *samplersPacked                             = FromGL<SamplerID *>(samplers);
+        SamplerID *samplersPacked                             = PackParam<SamplerID *>(samplers);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGenSamplers(context, count, samplersPacked));
@@ -944,12 +936,12 @@
 void GL_APIENTRY GenTransformFeedbacks(GLsizei n, GLuint *ids)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GenTransformFeedbacks, "glGenTransformFeedbacks",
-          "context = %d, n = %d, ids = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)ids);
+    EVENT(context, GLGenTransformFeedbacks, "context = %d, n = %d, ids = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)ids);
 
     if (context)
     {
-        TransformFeedbackID *idsPacked                        = FromGL<TransformFeedbackID *>(ids);
+        TransformFeedbackID *idsPacked = PackParam<TransformFeedbackID *>(ids);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGenTransformFeedbacks(context, n, idsPacked));
@@ -968,12 +960,12 @@
 void GL_APIENTRY GenVertexArrays(GLsizei n, GLuint *arrays)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GenVertexArrays, "glGenVertexArrays",
-          "context = %d, n = %d, arrays = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)arrays);
+    EVENT(context, GLGenVertexArrays, "context = %d, n = %d, arrays = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)arrays);
 
     if (context)
     {
-        VertexArrayID *arraysPacked                           = FromGL<VertexArrayID *>(arrays);
+        VertexArrayID *arraysPacked                           = PackParam<VertexArrayID *>(arrays);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGenVertexArrays(context, n, arraysPacked));
@@ -997,7 +989,7 @@
 {
     Context *context = GetValidGlobalContext();
     EVENT(
-        context, gl::EntryPoint::GetActiveUniformBlockName, "glGetActiveUniformBlockName",
+        context, GLGetActiveUniformBlockName,
         "context = %d, program = %u, uniformBlockIndex = %u, bufSize = %d, length = 0x%016" PRIxPTR
         ", uniformBlockName = 0x%016" PRIxPTR "",
         CID(context), program, uniformBlockIndex, bufSize, (uintptr_t)length,
@@ -1005,7 +997,7 @@
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -1031,7 +1023,7 @@
                                          GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetActiveUniformBlockiv, "glGetActiveUniformBlockiv",
+    EVENT(context, GLGetActiveUniformBlockiv,
           "context = %d, program = %u, uniformBlockIndex = %u, pname = %s, params = 0x%016" PRIxPTR
           "",
           CID(context), program, uniformBlockIndex,
@@ -1039,7 +1031,7 @@
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetActiveUniformBlockiv(context, programPacked,
@@ -1064,7 +1056,7 @@
                                      GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetActiveUniformsiv, "glGetActiveUniformsiv",
+    EVENT(context, GLGetActiveUniformsiv,
           "context = %d, program = %u, uniformCount = %d, uniformIndices = 0x%016" PRIxPTR
           ", pname = %s, params = 0x%016" PRIxPTR "",
           CID(context), program, uniformCount, (uintptr_t)uniformIndices,
@@ -1072,7 +1064,7 @@
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetActiveUniformsiv(context, programPacked, uniformCount,
@@ -1094,14 +1086,14 @@
 void GL_APIENTRY GetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetBufferParameteri64v, "glGetBufferParameteri64v",
+    EVENT(context, GLGetBufferParameteri64v,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::BufferTargetARB, target),
           GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
 
     if (context)
     {
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetBufferParameteri64v(context, targetPacked, pname, params));
@@ -1120,14 +1112,14 @@
 void GL_APIENTRY GetBufferPointerv(GLenum target, GLenum pname, void **params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetBufferPointerv, "glGetBufferPointerv",
+    EVENT(context, GLGetBufferPointerv,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::BufferTargetARB, target),
           GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
 
     if (context)
     {
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetBufferPointerv(context, targetPacked, pname, params));
@@ -1146,14 +1138,13 @@
 GLint GL_APIENTRY GetFragDataLocation(GLuint program, const GLchar *name)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetFragDataLocation, "glGetFragDataLocation",
-          "context = %d, program = %u, name = 0x%016" PRIxPTR "", CID(context), program,
-          (uintptr_t)name);
+    EVENT(context, GLGetFragDataLocation, "context = %d, program = %u, name = 0x%016" PRIxPTR "",
+          CID(context), program, (uintptr_t)name);
 
     GLint returnValue;
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetFragDataLocation(context, programPacked, name));
@@ -1163,14 +1154,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetFragDataLocation, GLint>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetFragDataLocation, GLint>();
         }
         ANGLE_CAPTURE(GetFragDataLocation, isCallValid, context, programPacked, name, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::GetFragDataLocation, GLint>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetFragDataLocation, GLint>();
     }
     return returnValue;
 }
@@ -1178,7 +1169,7 @@
 void GL_APIENTRY GetInteger64i_v(GLenum target, GLuint index, GLint64 *data)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetInteger64i_v, "glGetInteger64i_v",
+    EVENT(context, GLGetInteger64i_v,
           "context = %d, target = %s, index = %u, data = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TypeEnum, target), index, (uintptr_t)data);
 
@@ -1202,9 +1193,8 @@
 void GL_APIENTRY GetInteger64v(GLenum pname, GLint64 *data)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetInteger64v, "glGetInteger64v",
-          "context = %d, pname = %s, data = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::GetPName, pname), (uintptr_t)data);
+    EVENT(context, GLGetInteger64v, "context = %d, pname = %s, data = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::GetPName, pname), (uintptr_t)data);
 
     if (context)
     {
@@ -1226,7 +1216,7 @@
 void GL_APIENTRY GetIntegeri_v(GLenum target, GLuint index, GLint *data)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetIntegeri_v, "glGetIntegeri_v",
+    EVENT(context, GLGetIntegeri_v,
           "context = %d, target = %s, index = %u, data = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TypeEnum, target), index, (uintptr_t)data);
 
@@ -1254,7 +1244,7 @@
                                      GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetInternalformativ, "glGetInternalformativ",
+    EVENT(context, GLGetInternalformativ,
           "context = %d, target = %s, internalformat = %s, pname = %s, bufSize = %d, params = "
           "0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target),
@@ -1287,7 +1277,7 @@
                                   void *binary)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetProgramBinary, "glGetProgramBinary",
+    EVENT(context, GLGetProgramBinary,
           "context = %d, program = %u, bufSize = %d, length = 0x%016" PRIxPTR
           ", binaryFormat = 0x%016" PRIxPTR ", binary = 0x%016" PRIxPTR "",
           CID(context), program, bufSize, (uintptr_t)length, (uintptr_t)binaryFormat,
@@ -1295,7 +1285,7 @@
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGetProgramBinary(context, programPacked, bufSize,
@@ -1316,13 +1306,13 @@
 void GL_APIENTRY GetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetQueryObjectuiv, "glGetQueryObjectuiv",
+    EVENT(context, GLGetQueryObjectuiv,
           "context = %d, id = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), id,
           GLenumToString(GLenumGroup::QueryObjectParameterName, pname), (uintptr_t)params);
 
     if (context)
     {
-        QueryID idPacked                                      = FromGL<QueryID>(id);
+        QueryID idPacked                                      = PackParam<QueryID>(id);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetQueryObjectuiv(context, idPacked, pname, params));
@@ -1341,14 +1331,14 @@
 void GL_APIENTRY GetQueryiv(GLenum target, GLenum pname, GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetQueryiv, "glGetQueryiv",
+    EVENT(context, GLGetQueryiv,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::QueryTarget, target),
           GLenumToString(GLenumGroup::QueryParameterName, pname), (uintptr_t)params);
 
     if (context)
     {
-        QueryType targetPacked                                = FromGL<QueryType>(target);
+        QueryType targetPacked                                = PackParam<QueryType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGetQueryiv(context, targetPacked, pname, params));
@@ -1367,13 +1357,13 @@
 void GL_APIENTRY GetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetSamplerParameterfv, "glGetSamplerParameterfv",
+    EVENT(context, GLGetSamplerParameterfv,
           "context = %d, sampler = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)params);
 
     if (context)
     {
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetSamplerParameterfv(context, samplerPacked, pname, params));
@@ -1392,13 +1382,13 @@
 void GL_APIENTRY GetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetSamplerParameteriv, "glGetSamplerParameteriv",
+    EVENT(context, GLGetSamplerParameteriv,
           "context = %d, sampler = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)params);
 
     if (context)
     {
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetSamplerParameteriv(context, samplerPacked, pname, params));
@@ -1417,8 +1407,7 @@
 const GLubyte *GL_APIENTRY GetStringi(GLenum name, GLuint index)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetStringi, "glGetStringi",
-          "context = %d, name = %s, index = %u", CID(context),
+    EVENT(context, GLGetStringi, "context = %d, name = %s, index = %u", CID(context),
           GLenumToString(GLenumGroup::StringName, name), index);
 
     const GLubyte *returnValue;
@@ -1432,14 +1421,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetStringi, const GLubyte *>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetStringi, const GLubyte *>();
         }
         ANGLE_CAPTURE(GetStringi, isCallValid, context, name, index, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::GetStringi, const GLubyte *>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetStringi, const GLubyte *>();
     }
     return returnValue;
 }
@@ -1448,7 +1437,7 @@
 GetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
 {
     Context *context = GetGlobalContext();
-    EVENT(context, gl::EntryPoint::GetSynciv, "glGetSynciv",
+    EVENT(context, GLGetSynciv,
           "context = %d, sync = 0x%016" PRIxPTR
           ", pname = %s, bufSize = %d, length = 0x%016" PRIxPTR ", values = 0x%016" PRIxPTR "",
           CID(context), (uintptr_t)sync, GLenumToString(GLenumGroup::SyncParameterName, pname),
@@ -1478,7 +1467,7 @@
                                              GLchar *name)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTransformFeedbackVarying, "glGetTransformFeedbackVarying",
+    EVENT(context, GLGetTransformFeedbackVarying,
           "context = %d, program = %u, index = %u, bufSize = %d, length = 0x%016" PRIxPTR
           ", size = 0x%016" PRIxPTR ", type = 0x%016" PRIxPTR ", name = 0x%016" PRIxPTR "",
           CID(context), program, index, bufSize, (uintptr_t)length, (uintptr_t)size,
@@ -1486,7 +1475,7 @@
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetTransformFeedbackVarying(context, programPacked, index,
@@ -1508,14 +1497,14 @@
 GLuint GL_APIENTRY GetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetUniformBlockIndex, "glGetUniformBlockIndex",
+    EVENT(context, GLGetUniformBlockIndex,
           "context = %d, program = %u, uniformBlockName = 0x%016" PRIxPTR "", CID(context), program,
           (uintptr_t)uniformBlockName);
 
     GLuint returnValue;
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetUniformBlockIndex(context, programPacked, uniformBlockName));
@@ -1525,7 +1514,8 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetUniformBlockIndex, GLuint>();
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLGetUniformBlockIndex, GLuint>();
         }
         ANGLE_CAPTURE(GetUniformBlockIndex, isCallValid, context, programPacked, uniformBlockName,
                       returnValue);
@@ -1533,7 +1523,7 @@
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::GetUniformBlockIndex, GLuint>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetUniformBlockIndex, GLuint>();
     }
     return returnValue;
 }
@@ -1544,14 +1534,14 @@
                                    GLuint *uniformIndices)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetUniformIndices, "glGetUniformIndices",
+    EVENT(context, GLGetUniformIndices,
           "context = %d, program = %u, uniformCount = %d, uniformNames = 0x%016" PRIxPTR
           ", uniformIndices = 0x%016" PRIxPTR "",
           CID(context), program, uniformCount, (uintptr_t)uniformNames, (uintptr_t)uniformIndices);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetUniformIndices(context, programPacked, uniformCount,
@@ -1572,14 +1562,14 @@
 void GL_APIENTRY GetUniformuiv(GLuint program, GLint location, GLuint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetUniformuiv, "glGetUniformuiv",
+    EVENT(context, GLGetUniformuiv,
           "context = %d, program = %u, location = %d, params = 0x%016" PRIxPTR "", CID(context),
           program, location, (uintptr_t)params);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetUniformuiv(context, programPacked, locationPacked, params));
@@ -1598,7 +1588,7 @@
 void GL_APIENTRY GetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetVertexAttribIiv, "glGetVertexAttribIiv",
+    EVENT(context, GLGetVertexAttribIiv,
           "context = %d, index = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), index,
           GLenumToString(GLenumGroup::VertexAttribEnum, pname), (uintptr_t)params);
 
@@ -1622,7 +1612,7 @@
 void GL_APIENTRY GetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetVertexAttribIuiv, "glGetVertexAttribIuiv",
+    EVENT(context, GLGetVertexAttribIuiv,
           "context = %d, index = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), index,
           GLenumToString(GLenumGroup::VertexAttribEnum, pname), (uintptr_t)params);
 
@@ -1648,7 +1638,7 @@
                                        const GLenum *attachments)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::InvalidateFramebuffer, "glInvalidateFramebuffer",
+    EVENT(context, GLInvalidateFramebuffer,
           "context = %d, target = %s, numAttachments = %d, attachments = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target), numAttachments,
           (uintptr_t)attachments);
@@ -1681,7 +1671,7 @@
                                           GLsizei height)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::InvalidateSubFramebuffer, "glInvalidateSubFramebuffer",
+    EVENT(context, GLInvalidateSubFramebuffer,
           "context = %d, target = %s, numAttachments = %d, attachments = 0x%016" PRIxPTR
           ", x = %d, y = %d, width = %d, height = %d",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target), numAttachments,
@@ -1710,12 +1700,12 @@
 GLboolean GL_APIENTRY IsQuery(GLuint id)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IsQuery, "glIsQuery", "context = %d, id = %u", CID(context), id);
+    EVENT(context, GLIsQuery, "context = %d, id = %u", CID(context), id);
 
     GLboolean returnValue;
     if (context)
     {
-        QueryID idPacked                                      = FromGL<QueryID>(id);
+        QueryID idPacked                                      = PackParam<QueryID>(id);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateIsQuery(context, idPacked));
         if (isCallValid)
@@ -1724,14 +1714,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsQuery, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsQuery, GLboolean>();
         }
         ANGLE_CAPTURE(IsQuery, isCallValid, context, idPacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::IsQuery, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsQuery, GLboolean>();
     }
     return returnValue;
 }
@@ -1739,13 +1729,12 @@
 GLboolean GL_APIENTRY IsSampler(GLuint sampler)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IsSampler, "glIsSampler", "context = %d, sampler = %u",
-          CID(context), sampler);
+    EVENT(context, GLIsSampler, "context = %d, sampler = %u", CID(context), sampler);
 
     GLboolean returnValue;
     if (context)
     {
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateIsSampler(context, samplerPacked));
         if (isCallValid)
@@ -1754,14 +1743,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsSampler, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsSampler, GLboolean>();
         }
         ANGLE_CAPTURE(IsSampler, isCallValid, context, samplerPacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::IsSampler, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsSampler, GLboolean>();
     }
     return returnValue;
 }
@@ -1769,8 +1758,8 @@
 GLboolean GL_APIENTRY IsSync(GLsync sync)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IsSync, "glIsSync", "context = %d, sync = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)sync);
+    EVENT(context, GLIsSync, "context = %d, sync = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)sync);
 
     GLboolean returnValue;
     if (context)
@@ -1783,14 +1772,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsSync, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsSync, GLboolean>();
         }
         ANGLE_CAPTURE(IsSync, isCallValid, context, sync, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::IsSync, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsSync, GLboolean>();
     }
     return returnValue;
 }
@@ -1798,13 +1787,12 @@
 GLboolean GL_APIENTRY IsTransformFeedback(GLuint id)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IsTransformFeedback, "glIsTransformFeedback",
-          "context = %d, id = %u", CID(context), id);
+    EVENT(context, GLIsTransformFeedback, "context = %d, id = %u", CID(context), id);
 
     GLboolean returnValue;
     if (context)
     {
-        TransformFeedbackID idPacked                          = FromGL<TransformFeedbackID>(id);
+        TransformFeedbackID idPacked                          = PackParam<TransformFeedbackID>(id);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateIsTransformFeedback(context, idPacked));
@@ -1814,14 +1802,15 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsTransformFeedback, GLboolean>();
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLIsTransformFeedback, GLboolean>();
         }
         ANGLE_CAPTURE(IsTransformFeedback, isCallValid, context, idPacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::IsTransformFeedback, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsTransformFeedback, GLboolean>();
     }
     return returnValue;
 }
@@ -1829,13 +1818,12 @@
 GLboolean GL_APIENTRY IsVertexArray(GLuint array)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IsVertexArray, "glIsVertexArray", "context = %d, array = %u",
-          CID(context), array);
+    EVENT(context, GLIsVertexArray, "context = %d, array = %u", CID(context), array);
 
     GLboolean returnValue;
     if (context)
     {
-        VertexArrayID arrayPacked                             = FromGL<VertexArrayID>(array);
+        VertexArrayID arrayPacked                             = PackParam<VertexArrayID>(array);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateIsVertexArray(context, arrayPacked));
@@ -1845,14 +1833,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsVertexArray, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsVertexArray, GLboolean>();
         }
         ANGLE_CAPTURE(IsVertexArray, isCallValid, context, arrayPacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::IsVertexArray, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsVertexArray, GLboolean>();
     }
     return returnValue;
 }
@@ -1863,7 +1851,7 @@
                                  GLbitfield access)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MapBufferRange, "glMapBufferRange",
+    EVENT(context, GLMapBufferRange,
           "context = %d, target = %s, offset = %llu, length = %llu, access = %s", CID(context),
           GLenumToString(GLenumGroup::BufferTargetARB, target),
           static_cast<unsigned long long>(offset), static_cast<unsigned long long>(length),
@@ -1872,7 +1860,7 @@
     void *returnValue;
     if (context)
     {
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateMapBufferRange(context, targetPacked, offset, length, access));
@@ -1882,7 +1870,7 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::MapBufferRange, void *>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLMapBufferRange, void *>();
         }
         ANGLE_CAPTURE(MapBufferRange, isCallValid, context, targetPacked, offset, length, access,
                       returnValue);
@@ -1890,7 +1878,7 @@
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::MapBufferRange, void *>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLMapBufferRange, void *>();
     }
     return returnValue;
 }
@@ -1898,8 +1886,7 @@
 void GL_APIENTRY PauseTransformFeedback()
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PauseTransformFeedback, "glPauseTransformFeedback",
-          "context = %d", CID(context));
+    EVENT(context, GLPauseTransformFeedback, "context = %d", CID(context));
 
     if (context)
     {
@@ -1923,14 +1910,14 @@
                                GLsizei length)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramBinary, "glProgramBinary",
+    EVENT(context, GLProgramBinary,
           "context = %d, program = %u, binaryFormat = %s, binary = 0x%016" PRIxPTR ", length = %d",
           CID(context), program, GLenumToString(GLenumGroup::DefaultGroup, binaryFormat),
           (uintptr_t)binary, length);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -1951,13 +1938,12 @@
 void GL_APIENTRY ProgramParameteri(GLuint program, GLenum pname, GLint value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramParameteri, "glProgramParameteri",
-          "context = %d, program = %u, pname = %s, value = %d", CID(context), program,
-          GLenumToString(GLenumGroup::ProgramParameterPName, pname), value);
+    EVENT(context, GLProgramParameteri, "context = %d, program = %u, pname = %s, value = %d",
+          CID(context), program, GLenumToString(GLenumGroup::ProgramParameterPName, pname), value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramParameteri(context, programPacked, pname, value));
@@ -1976,8 +1962,8 @@
 void GL_APIENTRY ReadBuffer(GLenum src)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ReadBuffer, "glReadBuffer", "context = %d, src = %s",
-          CID(context), GLenumToString(GLenumGroup::ReadBufferMode, src));
+    EVENT(context, GLReadBuffer, "context = %d, src = %s", CID(context),
+          GLenumToString(GLenumGroup::ReadBufferMode, src));
 
     if (context)
     {
@@ -2002,8 +1988,7 @@
                                                 GLsizei height)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::RenderbufferStorageMultisample,
-          "glRenderbufferStorageMultisample",
+    EVENT(context, GLRenderbufferStorageMultisample,
           "context = %d, target = %s, samples = %d, internalformat = %s, width = %d, height = %d",
           CID(context), GLenumToString(GLenumGroup::RenderbufferTarget, target), samples,
           GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height);
@@ -2030,8 +2015,7 @@
 void GL_APIENTRY ResumeTransformFeedback()
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ResumeTransformFeedback, "glResumeTransformFeedback",
-          "context = %d", CID(context));
+    EVENT(context, GLResumeTransformFeedback, "context = %d", CID(context));
 
     if (context)
     {
@@ -2052,13 +2036,12 @@
 void GL_APIENTRY SamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SamplerParameterf, "glSamplerParameterf",
-          "context = %d, sampler = %u, pname = %s, param = %f", CID(context), sampler,
-          GLenumToString(GLenumGroup::SamplerParameterName, pname), param);
+    EVENT(context, GLSamplerParameterf, "context = %d, sampler = %u, pname = %s, param = %f",
+          CID(context), sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), param);
 
     if (context)
     {
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateSamplerParameterf(context, samplerPacked, pname, param));
@@ -2077,13 +2060,13 @@
 void GL_APIENTRY SamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SamplerParameterfv, "glSamplerParameterfv",
+    EVENT(context, GLSamplerParameterfv,
           "context = %d, sampler = %u, pname = %s, param = 0x%016" PRIxPTR "", CID(context),
           sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)param);
 
     if (context)
     {
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateSamplerParameterfv(context, samplerPacked, pname, param));
@@ -2102,13 +2085,12 @@
 void GL_APIENTRY SamplerParameteri(GLuint sampler, GLenum pname, GLint param)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SamplerParameteri, "glSamplerParameteri",
-          "context = %d, sampler = %u, pname = %s, param = %d", CID(context), sampler,
-          GLenumToString(GLenumGroup::SamplerParameterName, pname), param);
+    EVENT(context, GLSamplerParameteri, "context = %d, sampler = %u, pname = %s, param = %d",
+          CID(context), sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), param);
 
     if (context)
     {
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateSamplerParameteri(context, samplerPacked, pname, param));
@@ -2127,13 +2109,13 @@
 void GL_APIENTRY SamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SamplerParameteriv, "glSamplerParameteriv",
+    EVENT(context, GLSamplerParameteriv,
           "context = %d, sampler = %u, pname = %s, param = 0x%016" PRIxPTR "", CID(context),
           sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)param);
 
     if (context)
     {
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateSamplerParameteriv(context, samplerPacked, pname, param));
@@ -2161,7 +2143,7 @@
                             const void *pixels)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexImage3D, "glTexImage3D",
+    EVENT(context, GLTexImage3D,
           "context = %d, target = %s, level = %d, internalformat = %d, width = %d, height = %d, "
           "depth = %d, border = %d, format = %s, type = %s, pixels = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, internalformat,
@@ -2170,7 +2152,7 @@
 
     if (context)
     {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexImage3D(context, targetPacked, level, internalformat, width,
@@ -2193,14 +2175,14 @@
 TexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexStorage2D, "glTexStorage2D",
+    EVENT(context, GLTexStorage2D,
           "context = %d, target = %s, levels = %d, internalformat = %s, width = %d, height = %d",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), levels,
           GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height);
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -2226,7 +2208,7 @@
                               GLsizei depth)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexStorage3D, "glTexStorage3D",
+    EVENT(context, GLTexStorage3D,
           "context = %d, target = %s, levels = %d, internalformat = %s, width = %d, height = %d, "
           "depth = %d",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), levels,
@@ -2234,7 +2216,7 @@
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexStorage3D(context, targetPacked, levels, internalformat,
@@ -2265,7 +2247,7 @@
                                const void *pixels)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexSubImage3D, "glTexSubImage3D",
+    EVENT(context, GLTexSubImage3D,
           "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, width "
           "= %d, height = %d, depth = %d, format = %s, type = %s, pixels = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, xoffset, yoffset,
@@ -2274,7 +2256,7 @@
 
     if (context)
     {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -2300,14 +2282,14 @@
                                            GLenum bufferMode)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TransformFeedbackVaryings, "glTransformFeedbackVaryings",
+    EVENT(context, GLTransformFeedbackVaryings,
           "context = %d, program = %u, count = %d, varyings = 0x%016" PRIxPTR ", bufferMode = %s",
           CID(context), program, count, (uintptr_t)varyings,
           GLenumToString(GLenumGroup::DefaultGroup, bufferMode));
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateTransformFeedbackVaryings(
@@ -2328,12 +2310,12 @@
 void GL_APIENTRY Uniform1ui(GLint location, GLuint v0)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform1ui, "glUniform1ui",
-          "context = %d, location = %d, v0 = %u", CID(context), location, v0);
+    EVENT(context, GLUniform1ui, "context = %d, location = %d, v0 = %u", CID(context), location,
+          v0);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateUniform1ui(context, locationPacked, v0));
@@ -2352,13 +2334,13 @@
 void GL_APIENTRY Uniform1uiv(GLint location, GLsizei count, const GLuint *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform1uiv, "glUniform1uiv",
+    EVENT(context, GLUniform1uiv,
           "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
           location, count, (uintptr_t)value);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform1uiv(context, locationPacked, count, value));
@@ -2377,12 +2359,12 @@
 void GL_APIENTRY Uniform2ui(GLint location, GLuint v0, GLuint v1)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform2ui, "glUniform2ui",
-          "context = %d, location = %d, v0 = %u, v1 = %u", CID(context), location, v0, v1);
+    EVENT(context, GLUniform2ui, "context = %d, location = %d, v0 = %u, v1 = %u", CID(context),
+          location, v0, v1);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateUniform2ui(context, locationPacked, v0, v1));
@@ -2401,13 +2383,13 @@
 void GL_APIENTRY Uniform2uiv(GLint location, GLsizei count, const GLuint *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform2uiv, "glUniform2uiv",
+    EVENT(context, GLUniform2uiv,
           "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
           location, count, (uintptr_t)value);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform2uiv(context, locationPacked, count, value));
@@ -2426,13 +2408,12 @@
 void GL_APIENTRY Uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform3ui, "glUniform3ui",
-          "context = %d, location = %d, v0 = %u, v1 = %u, v2 = %u", CID(context), location, v0, v1,
-          v2);
+    EVENT(context, GLUniform3ui, "context = %d, location = %d, v0 = %u, v1 = %u, v2 = %u",
+          CID(context), location, v0, v1, v2);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateUniform3ui(context, locationPacked, v0, v1, v2));
@@ -2451,13 +2432,13 @@
 void GL_APIENTRY Uniform3uiv(GLint location, GLsizei count, const GLuint *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform3uiv, "glUniform3uiv",
+    EVENT(context, GLUniform3uiv,
           "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
           location, count, (uintptr_t)value);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform3uiv(context, locationPacked, count, value));
@@ -2476,13 +2457,12 @@
 void GL_APIENTRY Uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform4ui, "glUniform4ui",
-          "context = %d, location = %d, v0 = %u, v1 = %u, v2 = %u, v3 = %u", CID(context), location,
-          v0, v1, v2, v3);
+    EVENT(context, GLUniform4ui, "context = %d, location = %d, v0 = %u, v1 = %u, v2 = %u, v3 = %u",
+          CID(context), location, v0, v1, v2, v3);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform4ui(context, locationPacked, v0, v1, v2, v3));
@@ -2501,13 +2481,13 @@
 void GL_APIENTRY Uniform4uiv(GLint location, GLsizei count, const GLuint *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Uniform4uiv, "glUniform4uiv",
+    EVENT(context, GLUniform4uiv,
           "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
           location, count, (uintptr_t)value);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform4uiv(context, locationPacked, count, value));
@@ -2528,13 +2508,13 @@
                                      GLuint uniformBlockBinding)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::UniformBlockBinding, "glUniformBlockBinding",
+    EVENT(context, GLUniformBlockBinding,
           "context = %d, program = %u, uniformBlockIndex = %u, uniformBlockBinding = %u",
           CID(context), program, uniformBlockIndex, uniformBlockBinding);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniformBlockBinding(context, programPacked, uniformBlockIndex,
@@ -2558,13 +2538,13 @@
                                     const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::UniformMatrix2x3fv, "glUniformMatrix2x3fv",
+    EVENT(context, GLUniformMatrix2x3fv,
           "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
           CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -2588,13 +2568,13 @@
                                     const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::UniformMatrix2x4fv, "glUniformMatrix2x4fv",
+    EVENT(context, GLUniformMatrix2x4fv,
           "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
           CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -2618,13 +2598,13 @@
                                     const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::UniformMatrix3x2fv, "glUniformMatrix3x2fv",
+    EVENT(context, GLUniformMatrix3x2fv,
           "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
           CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -2648,13 +2628,13 @@
                                     const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::UniformMatrix3x4fv, "glUniformMatrix3x4fv",
+    EVENT(context, GLUniformMatrix3x4fv,
           "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
           CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -2678,13 +2658,13 @@
                                     const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::UniformMatrix4x2fv, "glUniformMatrix4x2fv",
+    EVENT(context, GLUniformMatrix4x2fv,
           "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
           CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -2708,13 +2688,13 @@
                                     const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::UniformMatrix4x3fv, "glUniformMatrix4x3fv",
+    EVENT(context, GLUniformMatrix4x3fv,
           "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
           CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
 
     if (context)
     {
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -2735,13 +2715,13 @@
 GLboolean GL_APIENTRY UnmapBuffer(GLenum target)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::UnmapBuffer, "glUnmapBuffer", "context = %d, target = %s",
-          CID(context), GLenumToString(GLenumGroup::BufferTargetARB, target));
+    EVENT(context, GLUnmapBuffer, "context = %d, target = %s", CID(context),
+          GLenumToString(GLenumGroup::BufferTargetARB, target));
 
     GLboolean returnValue;
     if (context)
     {
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateUnmapBuffer(context, targetPacked));
@@ -2751,14 +2731,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::UnmapBuffer, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLUnmapBuffer, GLboolean>();
         }
         ANGLE_CAPTURE(UnmapBuffer, isCallValid, context, targetPacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::UnmapBuffer, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLUnmapBuffer, GLboolean>();
     }
     return returnValue;
 }
@@ -2766,8 +2746,8 @@
 void GL_APIENTRY VertexAttribDivisor(GLuint index, GLuint divisor)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribDivisor, "glVertexAttribDivisor",
-          "context = %d, index = %u, divisor = %u", CID(context), index, divisor);
+    EVENT(context, GLVertexAttribDivisor, "context = %d, index = %u, divisor = %u", CID(context),
+          index, divisor);
 
     if (context)
     {
@@ -2789,9 +2769,8 @@
 void GL_APIENTRY VertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribI4i, "glVertexAttribI4i",
-          "context = %d, index = %u, x = %d, y = %d, z = %d, w = %d", CID(context), index, x, y, z,
-          w);
+    EVENT(context, GLVertexAttribI4i, "context = %d, index = %u, x = %d, y = %d, z = %d, w = %d",
+          CID(context), index, x, y, z, w);
 
     if (context)
     {
@@ -2813,8 +2792,8 @@
 void GL_APIENTRY VertexAttribI4iv(GLuint index, const GLint *v)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribI4iv, "glVertexAttribI4iv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
+    EVENT(context, GLVertexAttribI4iv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
 
     if (context)
     {
@@ -2836,9 +2815,8 @@
 void GL_APIENTRY VertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribI4ui, "glVertexAttribI4ui",
-          "context = %d, index = %u, x = %u, y = %u, z = %u, w = %u", CID(context), index, x, y, z,
-          w);
+    EVENT(context, GLVertexAttribI4ui, "context = %d, index = %u, x = %u, y = %u, z = %u, w = %u",
+          CID(context), index, x, y, z, w);
 
     if (context)
     {
@@ -2860,8 +2838,8 @@
 void GL_APIENTRY VertexAttribI4uiv(GLuint index, const GLuint *v)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribI4uiv, "glVertexAttribI4uiv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
+    EVENT(context, GLVertexAttribI4uiv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
 
     if (context)
     {
@@ -2884,7 +2862,7 @@
 VertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribIPointer, "glVertexAttribIPointer",
+    EVENT(context, GLVertexAttribIPointer,
           "context = %d, index = %u, size = %d, type = %s, stride = %d, pointer = 0x%016" PRIxPTR
           "",
           CID(context), index, size, GLenumToString(GLenumGroup::VertexAttribPointerType, type),
@@ -2892,7 +2870,7 @@
 
     if (context)
     {
-        VertexAttribType typePacked                           = FromGL<VertexAttribType>(type);
+        VertexAttribType typePacked                           = PackParam<VertexAttribType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -2913,9 +2891,9 @@
 void GL_APIENTRY WaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::WaitSync, "glWaitSync",
-          "context = %d, sync = 0x%016" PRIxPTR ", flags = %s, timeout = %llu", CID(context),
-          (uintptr_t)sync, GLbitfieldToString(GLenumGroup::DefaultGroup, flags).c_str(),
+    EVENT(context, GLWaitSync, "context = %d, sync = 0x%016" PRIxPTR ", flags = %s, timeout = %llu",
+          CID(context), (uintptr_t)sync,
+          GLbitfieldToString(GLenumGroup::DefaultGroup, flags).c_str(),
           static_cast<unsigned long long>(timeout));
 
     if (context)
diff --git a/src/libGLESv2/entry_points_gles_3_1_autogen.cpp b/src/libGLESv2/entry_points_gles_3_1_autogen.cpp
index a6f4455..f52afce 100644
--- a/src/libGLESv2/entry_points_gles_3_1_autogen.cpp
+++ b/src/libGLESv2/entry_points_gles_3_1_autogen.cpp
@@ -24,13 +24,13 @@
 void GL_APIENTRY ActiveShaderProgram(GLuint pipeline, GLuint program)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ActiveShaderProgram, "glActiveShaderProgram",
-          "context = %d, pipeline = %u, program = %u", CID(context), pipeline, program);
+    EVENT(context, GLActiveShaderProgram, "context = %d, pipeline = %u, program = %u", CID(context),
+          pipeline, program);
 
     if (context)
     {
-        ProgramPipelineID pipelinePacked                      = FromGL<ProgramPipelineID>(pipeline);
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ProgramPipelineID pipelinePacked = PackParam<ProgramPipelineID>(pipeline);
+        ShaderProgramID programPacked    = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateActiveShaderProgram(context, pipelinePacked, programPacked));
@@ -55,7 +55,7 @@
                                   GLenum format)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindImageTexture, "glBindImageTexture",
+    EVENT(context, GLBindImageTexture,
           "context = %d, unit = %u, texture = %u, level = %d, layered = %s, layer = %d, access = "
           "%s, format = %s",
           CID(context), unit, texture, level, GLbooleanToString(layered), layer,
@@ -64,7 +64,7 @@
 
     if (context)
     {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateBindImageTexture(context, unit, texturePacked, level, layered,
@@ -85,12 +85,11 @@
 void GL_APIENTRY BindProgramPipeline(GLuint pipeline)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindProgramPipeline, "glBindProgramPipeline",
-          "context = %d, pipeline = %u", CID(context), pipeline);
+    EVENT(context, GLBindProgramPipeline, "context = %d, pipeline = %u", CID(context), pipeline);
 
     if (context)
     {
-        ProgramPipelineID pipelinePacked                      = FromGL<ProgramPipelineID>(pipeline);
+        ProgramPipelineID pipelinePacked = PackParam<ProgramPipelineID>(pipeline);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateBindProgramPipeline(context, pipelinePacked));
@@ -112,13 +111,13 @@
                                   GLsizei stride)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindVertexBuffer, "glBindVertexBuffer",
+    EVENT(context, GLBindVertexBuffer,
           "context = %d, bindingindex = %u, buffer = %u, offset = %llu, stride = %d", CID(context),
           bindingindex, buffer, static_cast<unsigned long long>(offset), stride);
 
     if (context)
     {
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -139,14 +138,14 @@
 GLuint GL_APIENTRY CreateShaderProgramv(GLenum type, GLsizei count, const GLchar *const *strings)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CreateShaderProgramv, "glCreateShaderProgramv",
+    EVENT(context, GLCreateShaderProgramv,
           "context = %d, type = %s, count = %d, strings = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::ShaderType, type), count, (uintptr_t)strings);
 
     GLuint returnValue;
     if (context)
     {
-        ShaderType typePacked                                 = FromGL<ShaderType>(type);
+        ShaderType typePacked                                 = PackParam<ShaderType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateCreateShaderProgramv(context, typePacked, count, strings));
@@ -156,7 +155,8 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::CreateShaderProgramv, GLuint>();
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLCreateShaderProgramv, GLuint>();
         }
         ANGLE_CAPTURE(CreateShaderProgramv, isCallValid, context, typePacked, count, strings,
                       returnValue);
@@ -164,7 +164,7 @@
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::CreateShaderProgramv, GLuint>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLCreateShaderProgramv, GLuint>();
     }
     return returnValue;
 }
@@ -172,13 +172,12 @@
 void GL_APIENTRY DeleteProgramPipelines(GLsizei n, const GLuint *pipelines)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DeleteProgramPipelines, "glDeleteProgramPipelines",
-          "context = %d, n = %d, pipelines = 0x%016" PRIxPTR "", CID(context), n,
-          (uintptr_t)pipelines);
+    EVENT(context, GLDeleteProgramPipelines, "context = %d, n = %d, pipelines = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)pipelines);
 
     if (context)
     {
-        const ProgramPipelineID *pipelinesPacked = FromGL<const ProgramPipelineID *>(pipelines);
+        const ProgramPipelineID *pipelinesPacked = PackParam<const ProgramPipelineID *>(pipelines);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateDeleteProgramPipelines(context, n, pipelinesPacked));
@@ -197,7 +196,7 @@
 void GL_APIENTRY DispatchCompute(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DispatchCompute, "glDispatchCompute",
+    EVENT(context, GLDispatchCompute,
           "context = %d, num_groups_x = %u, num_groups_y = %u, num_groups_z = %u", CID(context),
           num_groups_x, num_groups_y, num_groups_z);
 
@@ -223,8 +222,8 @@
 void GL_APIENTRY DispatchComputeIndirect(GLintptr indirect)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DispatchComputeIndirect, "glDispatchComputeIndirect",
-          "context = %d, indirect = %llu", CID(context), static_cast<unsigned long long>(indirect));
+    EVENT(context, GLDispatchComputeIndirect, "context = %d, indirect = %llu", CID(context),
+          static_cast<unsigned long long>(indirect));
 
     if (context)
     {
@@ -246,13 +245,12 @@
 void GL_APIENTRY DrawArraysIndirect(GLenum mode, const void *indirect)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawArraysIndirect, "glDrawArraysIndirect",
-          "context = %d, mode = %s, indirect = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::PrimitiveType, mode), (uintptr_t)indirect);
+    EVENT(context, GLDrawArraysIndirect, "context = %d, mode = %s, indirect = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), (uintptr_t)indirect);
 
     if (context)
     {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateDrawArraysIndirect(context, modePacked, indirect));
@@ -271,15 +269,15 @@
 void GL_APIENTRY DrawElementsIndirect(GLenum mode, GLenum type, const void *indirect)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawElementsIndirect, "glDrawElementsIndirect",
+    EVENT(context, GLDrawElementsIndirect,
           "context = %d, mode = %s, type = %s, indirect = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::PrimitiveType, mode),
           GLenumToString(GLenumGroup::DrawElementsType, type), (uintptr_t)indirect);
 
     if (context)
     {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -299,9 +297,8 @@
 void GL_APIENTRY FramebufferParameteri(GLenum target, GLenum pname, GLint param)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::FramebufferParameteri, "glFramebufferParameteri",
-          "context = %d, target = %s, pname = %s, param = %d", CID(context),
-          GLenumToString(GLenumGroup::FramebufferTarget, target),
+    EVENT(context, GLFramebufferParameteri, "context = %d, target = %s, pname = %s, param = %d",
+          CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target),
           GLenumToString(GLenumGroup::FramebufferParameterName, pname), param);
 
     if (context)
@@ -324,13 +321,12 @@
 void GL_APIENTRY GenProgramPipelines(GLsizei n, GLuint *pipelines)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GenProgramPipelines, "glGenProgramPipelines",
-          "context = %d, n = %d, pipelines = 0x%016" PRIxPTR "", CID(context), n,
-          (uintptr_t)pipelines);
+    EVENT(context, GLGenProgramPipelines, "context = %d, n = %d, pipelines = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)pipelines);
 
     if (context)
     {
-        ProgramPipelineID *pipelinesPacked = FromGL<ProgramPipelineID *>(pipelines);
+        ProgramPipelineID *pipelinesPacked = PackParam<ProgramPipelineID *>(pipelines);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGenProgramPipelines(context, n, pipelinesPacked));
@@ -349,7 +345,7 @@
 void GL_APIENTRY GetBooleani_v(GLenum target, GLuint index, GLboolean *data)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetBooleani_v, "glGetBooleani_v",
+    EVENT(context, GLGetBooleani_v,
           "context = %d, target = %s, index = %u, data = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::BufferTargetARB, target), index, (uintptr_t)data);
 
@@ -373,7 +369,7 @@
 void GL_APIENTRY GetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetFramebufferParameteriv, "glGetFramebufferParameteriv",
+    EVENT(context, GLGetFramebufferParameteriv,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::FramebufferTarget, target),
           GLenumToString(GLenumGroup::FramebufferAttachmentParameterName, pname),
@@ -399,7 +395,7 @@
 void GL_APIENTRY GetMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetMultisamplefv, "glGetMultisamplefv",
+    EVENT(context, GLGetMultisamplefv,
           "context = %d, pname = %s, index = %u, val = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::DefaultGroup, pname), index, (uintptr_t)val);
 
@@ -426,7 +422,7 @@
                                        GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetProgramInterfaceiv, "glGetProgramInterfaceiv",
+    EVENT(context, GLGetProgramInterfaceiv,
           "context = %d, program = %u, programInterface = %s, pname = %s, params = 0x%016" PRIxPTR
           "",
           CID(context), program, GLenumToString(GLenumGroup::ProgramInterface, programInterface),
@@ -434,7 +430,7 @@
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetProgramInterfaceiv(context, programPacked, programInterface,
@@ -458,14 +454,14 @@
                                            GLchar *infoLog)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetProgramPipelineInfoLog, "glGetProgramPipelineInfoLog",
+    EVENT(context, GLGetProgramPipelineInfoLog,
           "context = %d, pipeline = %u, bufSize = %d, length = 0x%016" PRIxPTR
           ", infoLog = 0x%016" PRIxPTR "",
           CID(context), pipeline, bufSize, (uintptr_t)length, (uintptr_t)infoLog);
 
     if (context)
     {
-        ProgramPipelineID pipelinePacked                      = FromGL<ProgramPipelineID>(pipeline);
+        ProgramPipelineID pipelinePacked = PackParam<ProgramPipelineID>(pipeline);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -486,13 +482,13 @@
 void GL_APIENTRY GetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetProgramPipelineiv, "glGetProgramPipelineiv",
+    EVENT(context, GLGetProgramPipelineiv,
           "context = %d, pipeline = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           pipeline, GLenumToString(GLenumGroup::PipelineParameterName, pname), (uintptr_t)params);
 
     if (context)
     {
-        ProgramPipelineID pipelinePacked                      = FromGL<ProgramPipelineID>(pipeline);
+        ProgramPipelineID pipelinePacked = PackParam<ProgramPipelineID>(pipeline);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetProgramPipelineiv(context, pipelinePacked, pname, params));
@@ -513,7 +509,7 @@
                                            const GLchar *name)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetProgramResourceIndex, "glGetProgramResourceIndex",
+    EVENT(context, GLGetProgramResourceIndex,
           "context = %d, program = %u, programInterface = %s, name = 0x%016" PRIxPTR "",
           CID(context), program, GLenumToString(GLenumGroup::ProgramInterface, programInterface),
           (uintptr_t)name);
@@ -521,7 +517,7 @@
     GLuint returnValue;
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -532,7 +528,8 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetProgramResourceIndex, GLuint>();
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLGetProgramResourceIndex, GLuint>();
         }
         ANGLE_CAPTURE(GetProgramResourceIndex, isCallValid, context, programPacked,
                       programInterface, name, returnValue);
@@ -540,7 +537,7 @@
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::GetProgramResourceIndex, GLuint>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetProgramResourceIndex, GLuint>();
     }
     return returnValue;
 }
@@ -550,7 +547,7 @@
                                              const GLchar *name)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetProgramResourceLocation, "glGetProgramResourceLocation",
+    EVENT(context, GLGetProgramResourceLocation,
           "context = %d, program = %u, programInterface = %s, name = 0x%016" PRIxPTR "",
           CID(context), program, GLenumToString(GLenumGroup::ProgramInterface, programInterface),
           (uintptr_t)name);
@@ -558,7 +555,7 @@
     GLint returnValue;
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -570,7 +567,8 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetProgramResourceLocation, GLint>();
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLGetProgramResourceLocation, GLint>();
         }
         ANGLE_CAPTURE(GetProgramResourceLocation, isCallValid, context, programPacked,
                       programInterface, name, returnValue);
@@ -578,7 +576,8 @@
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::GetProgramResourceLocation, GLint>();
+        returnValue =
+            GetDefaultReturnValue<angle::EntryPoint::GLGetProgramResourceLocation, GLint>();
     }
     return returnValue;
 }
@@ -591,7 +590,7 @@
                                         GLchar *name)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetProgramResourceName, "glGetProgramResourceName",
+    EVENT(context, GLGetProgramResourceName,
           "context = %d, program = %u, programInterface = %s, index = %u, bufSize = %d, length = "
           "0x%016" PRIxPTR ", name = 0x%016" PRIxPTR "",
           CID(context), program, GLenumToString(GLenumGroup::ProgramInterface, programInterface),
@@ -599,7 +598,7 @@
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetProgramResourceName(context, programPacked, programInterface,
@@ -628,7 +627,7 @@
                                       GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetProgramResourceiv, "glGetProgramResourceiv",
+    EVENT(context, GLGetProgramResourceiv,
           "context = %d, program = %u, programInterface = %s, index = %u, propCount = %d, props = "
           "0x%016" PRIxPTR ", bufSize = %d, length = 0x%016" PRIxPTR ", params = 0x%016" PRIxPTR "",
           CID(context), program, GLenumToString(GLenumGroup::ProgramInterface, programInterface),
@@ -636,7 +635,7 @@
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -659,14 +658,14 @@
 void GL_APIENTRY GetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTexLevelParameterfv, "glGetTexLevelParameterfv",
+    EVENT(context, GLGetTexLevelParameterfv,
           "context = %d, target = %s, level = %d, pname = %s, params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level,
           GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
 
     if (context)
     {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -687,14 +686,14 @@
 void GL_APIENTRY GetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTexLevelParameteriv, "glGetTexLevelParameteriv",
+    EVENT(context, GLGetTexLevelParameteriv,
           "context = %d, target = %s, level = %d, pname = %s, params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level,
           GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
 
     if (context)
     {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -715,13 +714,12 @@
 GLboolean GL_APIENTRY IsProgramPipeline(GLuint pipeline)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IsProgramPipeline, "glIsProgramPipeline",
-          "context = %d, pipeline = %u", CID(context), pipeline);
+    EVENT(context, GLIsProgramPipeline, "context = %d, pipeline = %u", CID(context), pipeline);
 
     GLboolean returnValue;
     if (context)
     {
-        ProgramPipelineID pipelinePacked                      = FromGL<ProgramPipelineID>(pipeline);
+        ProgramPipelineID pipelinePacked = PackParam<ProgramPipelineID>(pipeline);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateIsProgramPipeline(context, pipelinePacked));
@@ -731,14 +729,15 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsProgramPipeline, GLboolean>();
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLIsProgramPipeline, GLboolean>();
         }
         ANGLE_CAPTURE(IsProgramPipeline, isCallValid, context, pipelinePacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::IsProgramPipeline, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsProgramPipeline, GLboolean>();
     }
     return returnValue;
 }
@@ -746,8 +745,8 @@
 void GL_APIENTRY MemoryBarrier(GLbitfield barriers)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MemoryBarrier, "glMemoryBarrier", "context = %d, barriers = %s",
-          CID(context), GLbitfieldToString(GLenumGroup::MemoryBarrierMask, barriers).c_str());
+    EVENT(context, GLMemoryBarrier, "context = %d, barriers = %s", CID(context),
+          GLbitfieldToString(GLenumGroup::MemoryBarrierMask, barriers).c_str());
 
     if (context)
     {
@@ -768,8 +767,7 @@
 void GL_APIENTRY MemoryBarrierByRegion(GLbitfield barriers)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MemoryBarrierByRegion, "glMemoryBarrierByRegion",
-          "context = %d, barriers = %s", CID(context),
+    EVENT(context, GLMemoryBarrierByRegion, "context = %d, barriers = %s", CID(context),
           GLbitfieldToString(GLenumGroup::MemoryBarrierMask, barriers).c_str());
 
     if (context)
@@ -792,14 +790,13 @@
 void GL_APIENTRY ProgramUniform1f(GLuint program, GLint location, GLfloat v0)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform1f, "glProgramUniform1f",
-          "context = %d, program = %u, location = %d, v0 = %f", CID(context), program, location,
-          v0);
+    EVENT(context, GLProgramUniform1f, "context = %d, program = %u, location = %d, v0 = %f",
+          CID(context), program, location, v0);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniform1f(context, programPacked, locationPacked, v0));
@@ -821,14 +818,14 @@
                                    const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform1fv, "glProgramUniform1fv",
+    EVENT(context, GLProgramUniform1fv,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -849,14 +846,13 @@
 void GL_APIENTRY ProgramUniform1i(GLuint program, GLint location, GLint v0)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform1i, "glProgramUniform1i",
-          "context = %d, program = %u, location = %d, v0 = %d", CID(context), program, location,
-          v0);
+    EVENT(context, GLProgramUniform1i, "context = %d, program = %u, location = %d, v0 = %d",
+          CID(context), program, location, v0);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniform1i(context, programPacked, locationPacked, v0));
@@ -878,14 +874,14 @@
                                    const GLint *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform1iv, "glProgramUniform1iv",
+    EVENT(context, GLProgramUniform1iv,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -906,14 +902,13 @@
 void GL_APIENTRY ProgramUniform1ui(GLuint program, GLint location, GLuint v0)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform1ui, "glProgramUniform1ui",
-          "context = %d, program = %u, location = %d, v0 = %u", CID(context), program, location,
-          v0);
+    EVENT(context, GLProgramUniform1ui, "context = %d, program = %u, location = %d, v0 = %u",
+          CID(context), program, location, v0);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniform1ui(context, programPacked, locationPacked, v0));
@@ -935,14 +930,14 @@
                                     const GLuint *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform1uiv, "glProgramUniform1uiv",
+    EVENT(context, GLProgramUniform1uiv,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -963,14 +958,14 @@
 void GL_APIENTRY ProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform2f, "glProgramUniform2f",
+    EVENT(context, GLProgramUniform2f,
           "context = %d, program = %u, location = %d, v0 = %f, v1 = %f", CID(context), program,
           location, v0, v1);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -994,14 +989,14 @@
                                    const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform2fv, "glProgramUniform2fv",
+    EVENT(context, GLProgramUniform2fv,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -1022,14 +1017,14 @@
 void GL_APIENTRY ProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform2i, "glProgramUniform2i",
+    EVENT(context, GLProgramUniform2i,
           "context = %d, program = %u, location = %d, v0 = %d, v1 = %d", CID(context), program,
           location, v0, v1);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -1053,14 +1048,14 @@
                                    const GLint *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform2iv, "glProgramUniform2iv",
+    EVENT(context, GLProgramUniform2iv,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -1081,14 +1076,14 @@
 void GL_APIENTRY ProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform2ui, "glProgramUniform2ui",
+    EVENT(context, GLProgramUniform2ui,
           "context = %d, program = %u, location = %d, v0 = %u, v1 = %u", CID(context), program,
           location, v0, v1);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -1112,14 +1107,14 @@
                                     const GLuint *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform2uiv, "glProgramUniform2uiv",
+    EVENT(context, GLProgramUniform2uiv,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -1141,14 +1136,14 @@
 ProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform3f, "glProgramUniform3f",
+    EVENT(context, GLProgramUniform3f,
           "context = %d, program = %u, location = %d, v0 = %f, v1 = %f, v2 = %f", CID(context),
           program, location, v0, v1, v2);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -1172,14 +1167,14 @@
                                    const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform3fv, "glProgramUniform3fv",
+    EVENT(context, GLProgramUniform3fv,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -1200,14 +1195,14 @@
 void GL_APIENTRY ProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform3i, "glProgramUniform3i",
+    EVENT(context, GLProgramUniform3i,
           "context = %d, program = %u, location = %d, v0 = %d, v1 = %d, v2 = %d", CID(context),
           program, location, v0, v1, v2);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -1231,14 +1226,14 @@
                                    const GLint *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform3iv, "glProgramUniform3iv",
+    EVENT(context, GLProgramUniform3iv,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -1259,14 +1254,14 @@
 void GL_APIENTRY ProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform3ui, "glProgramUniform3ui",
+    EVENT(context, GLProgramUniform3ui,
           "context = %d, program = %u, location = %d, v0 = %u, v1 = %u, v2 = %u", CID(context),
           program, location, v0, v1, v2);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -1290,14 +1285,14 @@
                                     const GLuint *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform3uiv, "glProgramUniform3uiv",
+    EVENT(context, GLProgramUniform3uiv,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -1319,14 +1314,14 @@
 ProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform4f, "glProgramUniform4f",
+    EVENT(context, GLProgramUniform4f,
           "context = %d, program = %u, location = %d, v0 = %f, v1 = %f, v2 = %f, v3 = %f",
           CID(context), program, location, v0, v1, v2, v3);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -1350,14 +1345,14 @@
                                    const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform4fv, "glProgramUniform4fv",
+    EVENT(context, GLProgramUniform4fv,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -1379,14 +1374,14 @@
 ProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform4i, "glProgramUniform4i",
+    EVENT(context, GLProgramUniform4i,
           "context = %d, program = %u, location = %d, v0 = %d, v1 = %d, v2 = %d, v3 = %d",
           CID(context), program, location, v0, v1, v2, v3);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -1410,14 +1405,14 @@
                                    const GLint *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform4iv, "glProgramUniform4iv",
+    EVENT(context, GLProgramUniform4iv,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -1439,14 +1434,14 @@
 ProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform4ui, "glProgramUniform4ui",
+    EVENT(context, GLProgramUniform4ui,
           "context = %d, program = %u, location = %d, v0 = %u, v1 = %u, v2 = %u, v3 = %u",
           CID(context), program, location, v0, v1, v2, v3);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -1470,14 +1465,14 @@
                                     const GLuint *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform4uiv, "glProgramUniform4uiv",
+    EVENT(context, GLProgramUniform4uiv,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -1502,15 +1497,15 @@
                                          const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix2fv, "glProgramUniformMatrix2fv",
+    EVENT(context, GLProgramUniformMatrix2fv,
           "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
           "0x%016" PRIxPTR "",
           CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniformMatrix2fv(context, programPacked, locationPacked,
@@ -1536,15 +1531,15 @@
                                            const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix2x3fv, "glProgramUniformMatrix2x3fv",
+    EVENT(context, GLProgramUniformMatrix2x3fv,
           "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
           "0x%016" PRIxPTR "",
           CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniformMatrix2x3fv(
@@ -1570,15 +1565,15 @@
                                            const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix2x4fv, "glProgramUniformMatrix2x4fv",
+    EVENT(context, GLProgramUniformMatrix2x4fv,
           "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
           "0x%016" PRIxPTR "",
           CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniformMatrix2x4fv(
@@ -1604,15 +1599,15 @@
                                          const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix3fv, "glProgramUniformMatrix3fv",
+    EVENT(context, GLProgramUniformMatrix3fv,
           "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
           "0x%016" PRIxPTR "",
           CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniformMatrix3fv(context, programPacked, locationPacked,
@@ -1638,15 +1633,15 @@
                                            const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix3x2fv, "glProgramUniformMatrix3x2fv",
+    EVENT(context, GLProgramUniformMatrix3x2fv,
           "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
           "0x%016" PRIxPTR "",
           CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniformMatrix3x2fv(
@@ -1672,15 +1667,15 @@
                                            const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix3x4fv, "glProgramUniformMatrix3x4fv",
+    EVENT(context, GLProgramUniformMatrix3x4fv,
           "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
           "0x%016" PRIxPTR "",
           CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniformMatrix3x4fv(
@@ -1706,15 +1701,15 @@
                                          const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix4fv, "glProgramUniformMatrix4fv",
+    EVENT(context, GLProgramUniformMatrix4fv,
           "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
           "0x%016" PRIxPTR "",
           CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniformMatrix4fv(context, programPacked, locationPacked,
@@ -1740,15 +1735,15 @@
                                            const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix4x2fv, "glProgramUniformMatrix4x2fv",
+    EVENT(context, GLProgramUniformMatrix4x2fv,
           "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
           "0x%016" PRIxPTR "",
           CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniformMatrix4x2fv(
@@ -1774,15 +1769,15 @@
                                            const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix4x3fv, "glProgramUniformMatrix4x3fv",
+    EVENT(context, GLProgramUniformMatrix4x3fv,
           "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
           "0x%016" PRIxPTR "",
           CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniformMatrix4x3fv(
@@ -1804,9 +1799,8 @@
 void GL_APIENTRY SampleMaski(GLuint maskNumber, GLbitfield mask)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SampleMaski, "glSampleMaski",
-          "context = %d, maskNumber = %u, mask = %s", CID(context), maskNumber,
-          GLbitfieldToString(GLenumGroup::DefaultGroup, mask).c_str());
+    EVENT(context, GLSampleMaski, "context = %d, maskNumber = %u, mask = %s", CID(context),
+          maskNumber, GLbitfieldToString(GLenumGroup::DefaultGroup, mask).c_str());
 
     if (context)
     {
@@ -1833,7 +1827,7 @@
                                          GLboolean fixedsamplelocations)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexStorage2DMultisample, "glTexStorage2DMultisample",
+    EVENT(context, GLTexStorage2DMultisample,
           "context = %d, target = %s, samples = %d, internalformat = %s, width = %d, height = %d, "
           "fixedsamplelocations = %s",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), samples,
@@ -1842,7 +1836,7 @@
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -1865,14 +1859,14 @@
 void GL_APIENTRY UseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::UseProgramStages, "glUseProgramStages",
-          "context = %d, pipeline = %u, stages = %s, program = %u", CID(context), pipeline,
+    EVENT(context, GLUseProgramStages, "context = %d, pipeline = %u, stages = %s, program = %u",
+          CID(context), pipeline,
           GLbitfieldToString(GLenumGroup::UseProgramStageMask, stages).c_str(), program);
 
     if (context)
     {
-        ProgramPipelineID pipelinePacked                      = FromGL<ProgramPipelineID>(pipeline);
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ProgramPipelineID pipelinePacked = PackParam<ProgramPipelineID>(pipeline);
+        ShaderProgramID programPacked    = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -1893,12 +1887,12 @@
 void GL_APIENTRY ValidateProgramPipeline(GLuint pipeline)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ValidateProgramPipeline, "glValidateProgramPipeline",
-          "context = %d, pipeline = %u", CID(context), pipeline);
+    EVENT(context, GLValidateProgramPipeline, "context = %d, pipeline = %u", CID(context),
+          pipeline);
 
     if (context)
     {
-        ProgramPipelineID pipelinePacked                      = FromGL<ProgramPipelineID>(pipeline);
+        ProgramPipelineID pipelinePacked = PackParam<ProgramPipelineID>(pipeline);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateValidateProgramPipeline(context, pipelinePacked));
@@ -1917,9 +1911,8 @@
 void GL_APIENTRY VertexAttribBinding(GLuint attribindex, GLuint bindingindex)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribBinding, "glVertexAttribBinding",
-          "context = %d, attribindex = %u, bindingindex = %u", CID(context), attribindex,
-          bindingindex);
+    EVENT(context, GLVertexAttribBinding, "context = %d, attribindex = %u, bindingindex = %u",
+          CID(context), attribindex, bindingindex);
 
     if (context)
     {
@@ -1945,7 +1938,7 @@
                                     GLuint relativeoffset)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribFormat, "glVertexAttribFormat",
+    EVENT(context, GLVertexAttribFormat,
           "context = %d, attribindex = %u, size = %d, type = %s, normalized = %s, relativeoffset = "
           "%u",
           CID(context), attribindex, size, GLenumToString(GLenumGroup::DefaultGroup, type),
@@ -1953,7 +1946,7 @@
 
     if (context)
     {
-        VertexAttribType typePacked                           = FromGL<VertexAttribType>(type);
+        VertexAttribType typePacked                           = PackParam<VertexAttribType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateVertexAttribFormat(context, attribindex, size, typePacked,
@@ -1977,13 +1970,13 @@
                                      GLuint relativeoffset)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribIFormat, "glVertexAttribIFormat",
+    EVENT(context, GLVertexAttribIFormat,
           "context = %d, attribindex = %u, size = %d, type = %s, relativeoffset = %u", CID(context),
           attribindex, size, GLenumToString(GLenumGroup::DefaultGroup, type), relativeoffset);
 
     if (context)
     {
-        VertexAttribType typePacked                           = FromGL<VertexAttribType>(type);
+        VertexAttribType typePacked                           = PackParam<VertexAttribType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -2004,8 +1997,8 @@
 void GL_APIENTRY VertexBindingDivisor(GLuint bindingindex, GLuint divisor)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexBindingDivisor, "glVertexBindingDivisor",
-          "context = %d, bindingindex = %u, divisor = %u", CID(context), bindingindex, divisor);
+    EVENT(context, GLVertexBindingDivisor, "context = %d, bindingindex = %u, divisor = %u",
+          CID(context), bindingindex, divisor);
 
     if (context)
     {
diff --git a/src/libGLESv2/entry_points_gles_3_2_autogen.cpp b/src/libGLESv2/entry_points_gles_3_2_autogen.cpp
index 535ffe4..39dc9c1 100644
--- a/src/libGLESv2/entry_points_gles_3_2_autogen.cpp
+++ b/src/libGLESv2/entry_points_gles_3_2_autogen.cpp
@@ -24,7 +24,7 @@
 void GL_APIENTRY BlendBarrier()
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BlendBarrier, "glBlendBarrier", "context = %d", CID(context));
+    EVENT(context, GLBlendBarrier, "context = %d", CID(context));
 
     if (context)
     {
@@ -45,9 +45,8 @@
 void GL_APIENTRY BlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BlendEquationSeparatei, "glBlendEquationSeparatei",
-          "context = %d, buf = %u, modeRGB = %s, modeAlpha = %s", CID(context), buf,
-          GLenumToString(GLenumGroup::BlendEquationModeEXT, modeRGB),
+    EVENT(context, GLBlendEquationSeparatei, "context = %d, buf = %u, modeRGB = %s, modeAlpha = %s",
+          CID(context), buf, GLenumToString(GLenumGroup::BlendEquationModeEXT, modeRGB),
           GLenumToString(GLenumGroup::BlendEquationModeEXT, modeAlpha));
 
     if (context)
@@ -70,8 +69,7 @@
 void GL_APIENTRY BlendEquationi(GLuint buf, GLenum mode)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BlendEquationi, "glBlendEquationi",
-          "context = %d, buf = %u, mode = %s", CID(context), buf,
+    EVENT(context, GLBlendEquationi, "context = %d, buf = %u, mode = %s", CID(context), buf,
           GLenumToString(GLenumGroup::BlendEquationModeEXT, mode));
 
     if (context)
@@ -95,7 +93,7 @@
 BlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BlendFuncSeparatei, "glBlendFuncSeparatei",
+    EVENT(context, GLBlendFuncSeparatei,
           "context = %d, buf = %u, srcRGB = %s, dstRGB = %s, srcAlpha = %s, dstAlpha = %s",
           CID(context), buf, GLenumToString(GLenumGroup::BlendingFactor, srcRGB),
           GLenumToString(GLenumGroup::BlendingFactor, dstRGB),
@@ -124,8 +122,7 @@
 void GL_APIENTRY BlendFunci(GLuint buf, GLenum src, GLenum dst)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BlendFunci, "glBlendFunci",
-          "context = %d, buf = %u, src = %s, dst = %s", CID(context), buf,
+    EVENT(context, GLBlendFunci, "context = %d, buf = %u, src = %s, dst = %s", CID(context), buf,
           GLenumToString(GLenumGroup::BlendingFactor, src),
           GLenumToString(GLenumGroup::BlendingFactor, dst));
 
@@ -149,9 +146,9 @@
 void GL_APIENTRY ColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ColorMaski, "glColorMaski",
-          "context = %d, index = %u, r = %s, g = %s, b = %s, a = %s", CID(context), index,
-          GLbooleanToString(r), GLbooleanToString(g), GLbooleanToString(b), GLbooleanToString(a));
+    EVENT(context, GLColorMaski, "context = %d, index = %u, r = %s, g = %s, b = %s, a = %s",
+          CID(context), index, GLbooleanToString(r), GLbooleanToString(g), GLbooleanToString(b),
+          GLbooleanToString(a));
 
     if (context)
     {
@@ -187,7 +184,7 @@
                                   GLsizei srcDepth)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CopyImageSubData, "glCopyImageSubData",
+    EVENT(context, GLCopyImageSubData,
           "context = %d, srcName = %u, srcTarget = %s, srcLevel = %d, srcX = %d, srcY = %d, srcZ = "
           "%d, dstName = %u, dstTarget = %s, dstLevel = %d, dstX = %d, dstY = %d, dstZ = %d, "
           "srcWidth = %d, srcHeight = %d, srcDepth = %d",
@@ -222,7 +219,7 @@
 void GL_APIENTRY DebugMessageCallback(GLDEBUGPROC callback, const void *userParam)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DebugMessageCallback, "glDebugMessageCallback",
+    EVENT(context, GLDebugMessageCallback,
           "context = %d, callback = 0x%016" PRIxPTR ", userParam = 0x%016" PRIxPTR "", CID(context),
           (uintptr_t)callback, (uintptr_t)userParam);
 
@@ -251,7 +248,7 @@
                                      GLboolean enabled)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DebugMessageControl, "glDebugMessageControl",
+    EVENT(context, GLDebugMessageControl,
           "context = %d, source = %s, type = %s, severity = %s, count = %d, ids = 0x%016" PRIxPTR
           ", enabled = %s",
           CID(context), GLenumToString(GLenumGroup::DebugSource, source),
@@ -286,7 +283,7 @@
                                     const GLchar *buf)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DebugMessageInsert, "glDebugMessageInsert",
+    EVENT(context, GLDebugMessageInsert,
           "context = %d, source = %s, type = %s, id = %u, severity = %s, length = %d, buf = "
           "0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DebugSource, source),
@@ -315,8 +312,8 @@
 void GL_APIENTRY Disablei(GLenum target, GLuint index)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Disablei, "glDisablei", "context = %d, target = %s, index = %u",
-          CID(context), GLenumToString(GLenumGroup::EnableCap, target), index);
+    EVENT(context, GLDisablei, "context = %d, target = %s, index = %u", CID(context),
+          GLenumToString(GLenumGroup::EnableCap, target), index);
 
     if (context)
     {
@@ -341,7 +338,7 @@
                                         GLint basevertex)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawElementsBaseVertex, "glDrawElementsBaseVertex",
+    EVENT(context, GLDrawElementsBaseVertex,
           "context = %d, mode = %s, count = %d, type = %s, indices = 0x%016" PRIxPTR
           ", basevertex = %d",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), count,
@@ -349,8 +346,8 @@
 
     if (context)
     {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateDrawElementsBaseVertex(context, modePacked, count, typePacked,
@@ -376,8 +373,7 @@
                                                  GLint basevertex)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawElementsInstancedBaseVertex,
-          "glDrawElementsInstancedBaseVertex",
+    EVENT(context, GLDrawElementsInstancedBaseVertex,
           "context = %d, mode = %s, count = %d, type = %s, indices = 0x%016" PRIxPTR
           ", instancecount = %d, basevertex = %d",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), count,
@@ -386,8 +382,8 @@
 
     if (context)
     {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateDrawElementsInstancedBaseVertex(
                                                              context, modePacked, count, typePacked,
@@ -415,7 +411,7 @@
                                              GLint basevertex)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawRangeElementsBaseVertex, "glDrawRangeElementsBaseVertex",
+    EVENT(context, GLDrawRangeElementsBaseVertex,
           "context = %d, mode = %s, start = %u, end = %u, count = %d, type = %s, indices = "
           "0x%016" PRIxPTR ", basevertex = %d",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), start, end, count,
@@ -423,8 +419,8 @@
 
     if (context)
     {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateDrawRangeElementsBaseVertex(
                                                              context, modePacked, start, end, count,
@@ -446,8 +442,8 @@
 void GL_APIENTRY Enablei(GLenum target, GLuint index)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::Enablei, "glEnablei", "context = %d, target = %s, index = %u",
-          CID(context), GLenumToString(GLenumGroup::EnableCap, target), index);
+    EVENT(context, GLEnablei, "context = %d, target = %s, index = %u", CID(context),
+          GLenumToString(GLenumGroup::EnableCap, target), index);
 
     if (context)
     {
@@ -468,14 +464,14 @@
 void GL_APIENTRY FramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::FramebufferTexture, "glFramebufferTexture",
+    EVENT(context, GLFramebufferTexture,
           "context = %d, target = %s, attachment = %s, texture = %u, level = %d", CID(context),
           GLenumToString(GLenumGroup::FramebufferTarget, target),
           GLenumToString(GLenumGroup::FramebufferAttachment, attachment), texture, level);
 
     if (context)
     {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -503,7 +499,7 @@
                                       GLchar *messageLog)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetDebugMessageLog, "glGetDebugMessageLog",
+    EVENT(context, GLGetDebugMessageLog,
           "context = %d, count = %u, bufSize = %d, sources = 0x%016" PRIxPTR
           ", types = 0x%016" PRIxPTR ", ids = 0x%016" PRIxPTR ", severities = 0x%016" PRIxPTR
           ", lengths = 0x%016" PRIxPTR ", messageLog = 0x%016" PRIxPTR "",
@@ -524,7 +520,7 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetDebugMessageLog, GLuint>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetDebugMessageLog, GLuint>();
         }
         ANGLE_CAPTURE(GetDebugMessageLog, isCallValid, context, count, bufSize, sources, types, ids,
                       severities, lengths, messageLog, returnValue);
@@ -532,7 +528,7 @@
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::GetDebugMessageLog, GLuint>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetDebugMessageLog, GLuint>();
     }
     return returnValue;
 }
@@ -540,8 +536,7 @@
 GLenum GL_APIENTRY GetGraphicsResetStatus()
 {
     Context *context = GetGlobalContext();
-    EVENT(context, gl::EntryPoint::GetGraphicsResetStatus, "glGetGraphicsResetStatus",
-          "context = %d", CID(context));
+    EVENT(context, GLGetGraphicsResetStatus, "context = %d", CID(context));
 
     GLenum returnValue;
     if (context)
@@ -554,14 +549,15 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetGraphicsResetStatus, GLenum>();
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLGetGraphicsResetStatus, GLenum>();
         }
         ANGLE_CAPTURE(GetGraphicsResetStatus, isCallValid, context, returnValue);
     }
     else
     {
 
-        returnValue = GetDefaultReturnValue<EntryPoint::GetGraphicsResetStatus, GLenum>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetGraphicsResetStatus, GLenum>();
     }
     return returnValue;
 }
@@ -570,7 +566,7 @@
 GetObjectLabel(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetObjectLabel, "glGetObjectLabel",
+    EVENT(context, GLGetObjectLabel,
           "context = %d, identifier = %s, name = %u, bufSize = %d, length = 0x%016" PRIxPTR
           ", label = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, identifier), name, bufSize,
@@ -598,7 +594,7 @@
 void GL_APIENTRY GetObjectPtrLabel(const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetObjectPtrLabel, "glGetObjectPtrLabel",
+    EVENT(context, GLGetObjectPtrLabel,
           "context = %d, ptr = 0x%016" PRIxPTR ", bufSize = %d, length = 0x%016" PRIxPTR
           ", label = 0x%016" PRIxPTR "",
           CID(context), (uintptr_t)ptr, bufSize, (uintptr_t)length, (uintptr_t)label);
@@ -623,9 +619,8 @@
 void GL_APIENTRY GetPointerv(GLenum pname, void **params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetPointerv, "glGetPointerv",
-          "context = %d, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::GetPointervPName, pname), (uintptr_t)params);
+    EVENT(context, GLGetPointerv, "context = %d, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::GetPointervPName, pname), (uintptr_t)params);
 
     if (context)
     {
@@ -647,13 +642,13 @@
 void GL_APIENTRY GetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetSamplerParameterIiv, "glGetSamplerParameterIiv",
+    EVENT(context, GLGetSamplerParameterIiv,
           "context = %d, sampler = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)params);
 
     if (context)
     {
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetSamplerParameterIiv(context, samplerPacked, pname, params));
@@ -672,13 +667,13 @@
 void GL_APIENTRY GetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetSamplerParameterIuiv, "glGetSamplerParameterIuiv",
+    EVENT(context, GLGetSamplerParameterIuiv,
           "context = %d, sampler = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)params);
 
     if (context)
     {
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetSamplerParameterIuiv(context, samplerPacked, pname, params));
@@ -697,14 +692,14 @@
 void GL_APIENTRY GetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTexParameterIiv, "glGetTexParameterIiv",
+    EVENT(context, GLGetTexParameterIiv,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetTexParameterIiv(context, targetPacked, pname, params));
@@ -723,14 +718,14 @@
 void GL_APIENTRY GetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTexParameterIuiv, "glGetTexParameterIuiv",
+    EVENT(context, GLGetTexParameterIuiv,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetTexParameterIuiv(context, targetPacked, pname, params));
@@ -749,14 +744,14 @@
 void GL_APIENTRY GetnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetnUniformfv, "glGetnUniformfv",
+    EVENT(context, GLGetnUniformfv,
           "context = %d, program = %u, location = %d, bufSize = %d, params = 0x%016" PRIxPTR "",
           CID(context), program, location, bufSize, (uintptr_t)params);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -777,14 +772,14 @@
 void GL_APIENTRY GetnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetnUniformiv, "glGetnUniformiv",
+    EVENT(context, GLGetnUniformiv,
           "context = %d, program = %u, location = %d, bufSize = %d, params = 0x%016" PRIxPTR "",
           CID(context), program, location, bufSize, (uintptr_t)params);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -805,14 +800,14 @@
 void GL_APIENTRY GetnUniformuiv(GLuint program, GLint location, GLsizei bufSize, GLuint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetnUniformuiv, "glGetnUniformuiv",
+    EVENT(context, GLGetnUniformuiv,
           "context = %d, program = %u, location = %d, bufSize = %d, params = 0x%016" PRIxPTR "",
           CID(context), program, location, bufSize, (uintptr_t)params);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -833,8 +828,7 @@
 GLboolean GL_APIENTRY IsEnabledi(GLenum target, GLuint index)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IsEnabledi, "glIsEnabledi",
-          "context = %d, target = %s, index = %u", CID(context),
+    EVENT(context, GLIsEnabledi, "context = %d, target = %s, index = %u", CID(context),
           GLenumToString(GLenumGroup::EnableCap, target), index);
 
     GLboolean returnValue;
@@ -849,14 +843,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsEnabledi, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsEnabledi, GLboolean>();
         }
         ANGLE_CAPTURE(IsEnabledi, isCallValid, context, target, index, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::IsEnabledi, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsEnabledi, GLboolean>();
     }
     return returnValue;
 }
@@ -864,8 +858,7 @@
 void GL_APIENTRY MinSampleShading(GLfloat value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MinSampleShading, "glMinSampleShading",
-          "context = %d, value = %f", CID(context), value);
+    EVENT(context, GLMinSampleShading, "context = %d, value = %f", CID(context), value);
 
     if (context)
     {
@@ -886,7 +879,7 @@
 void GL_APIENTRY ObjectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ObjectLabel, "glObjectLabel",
+    EVENT(context, GLObjectLabel,
           "context = %d, identifier = %s, name = %u, length = %d, label = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::ObjectIdentifier, identifier), name, length,
           (uintptr_t)label);
@@ -911,7 +904,7 @@
 void GL_APIENTRY ObjectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ObjectPtrLabel, "glObjectPtrLabel",
+    EVENT(context, GLObjectPtrLabel,
           "context = %d, ptr = 0x%016" PRIxPTR ", length = %d, label = 0x%016" PRIxPTR "",
           CID(context), (uintptr_t)ptr, length, (uintptr_t)label);
 
@@ -935,8 +928,7 @@
 void GL_APIENTRY PatchParameteri(GLenum pname, GLint value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PatchParameteri, "glPatchParameteri",
-          "context = %d, pname = %s, value = %d", CID(context),
+    EVENT(context, GLPatchParameteri, "context = %d, pname = %s, value = %d", CID(context),
           GLenumToString(GLenumGroup::PatchParameterName, pname), value);
 
     if (context)
@@ -959,7 +951,7 @@
 void GL_APIENTRY PopDebugGroup()
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PopDebugGroup, "glPopDebugGroup", "context = %d", CID(context));
+    EVENT(context, GLPopDebugGroup, "context = %d", CID(context));
 
     if (context)
     {
@@ -987,7 +979,7 @@
                                       GLfloat maxW)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PrimitiveBoundingBox, "glPrimitiveBoundingBox",
+    EVENT(context, GLPrimitiveBoundingBox,
           "context = %d, minX = %f, minY = %f, minZ = %f, minW = %f, maxX = %f, maxY = %f, maxZ = "
           "%f, maxW = %f",
           CID(context), minX, minY, minZ, minW, maxX, maxY, maxZ, maxW);
@@ -1014,7 +1006,7 @@
 void GL_APIENTRY PushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PushDebugGroup, "glPushDebugGroup",
+    EVENT(context, GLPushDebugGroup,
           "context = %d, source = %s, id = %u, length = %d, message = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DebugSource, source), id, length,
           (uintptr_t)message);
@@ -1046,7 +1038,7 @@
                              void *data)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ReadnPixels, "glReadnPixels",
+    EVENT(context, GLReadnPixels,
           "context = %d, x = %d, y = %d, width = %d, height = %d, format = %s, type = %s, bufSize "
           "= %d, data = 0x%016" PRIxPTR "",
           CID(context), x, y, width, height, GLenumToString(GLenumGroup::PixelFormat, format),
@@ -1074,13 +1066,13 @@
 void GL_APIENTRY SamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SamplerParameterIiv, "glSamplerParameterIiv",
+    EVENT(context, GLSamplerParameterIiv,
           "context = %d, sampler = %u, pname = %s, param = 0x%016" PRIxPTR "", CID(context),
           sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)param);
 
     if (context)
     {
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateSamplerParameterIiv(context, samplerPacked, pname, param));
@@ -1099,13 +1091,13 @@
 void GL_APIENTRY SamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SamplerParameterIuiv, "glSamplerParameterIuiv",
+    EVENT(context, GLSamplerParameterIuiv,
           "context = %d, sampler = %u, pname = %s, param = 0x%016" PRIxPTR "", CID(context),
           sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)param);
 
     if (context)
     {
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateSamplerParameterIuiv(context, samplerPacked, pname, param));
@@ -1124,15 +1116,14 @@
 void GL_APIENTRY TexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexBuffer, "glTexBuffer",
-          "context = %d, target = %s, internalformat = %s, buffer = %u", CID(context),
-          GLenumToString(GLenumGroup::TextureTarget, target),
+    EVENT(context, GLTexBuffer, "context = %d, target = %s, internalformat = %s, buffer = %u",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::InternalFormat, internalformat), buffer);
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexBuffer(context, targetPacked, internalformat, bufferPacked));
@@ -1155,7 +1146,7 @@
                                 GLsizeiptr size)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexBufferRange, "glTexBufferRange",
+    EVENT(context, GLTexBufferRange,
           "context = %d, target = %s, internalformat = %s, buffer = %u, offset = %llu, size = %llu",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::InternalFormat, internalformat), buffer,
@@ -1163,8 +1154,8 @@
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexBufferRange(context, targetPacked, internalformat,
@@ -1185,14 +1176,14 @@
 void GL_APIENTRY TexParameterIiv(GLenum target, GLenum pname, const GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexParameterIiv, "glTexParameterIiv",
+    EVENT(context, GLTexParameterIiv,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::TextureParameterName, pname), (uintptr_t)params);
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexParameterIiv(context, targetPacked, pname, params));
@@ -1211,14 +1202,14 @@
 void GL_APIENTRY TexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexParameterIuiv, "glTexParameterIuiv",
+    EVENT(context, GLTexParameterIuiv,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::TextureParameterName, pname), (uintptr_t)params);
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexParameterIuiv(context, targetPacked, pname, params));
@@ -1243,7 +1234,7 @@
                                          GLboolean fixedsamplelocations)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexStorage3DMultisample, "glTexStorage3DMultisample",
+    EVENT(context, GLTexStorage3DMultisample,
           "context = %d, target = %s, samples = %d, internalformat = %s, width = %d, height = %d, "
           "depth = %d, fixedsamplelocations = %s",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), samples,
@@ -1252,7 +1243,7 @@
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
diff --git a/src/libGLESv2/entry_points_gles_ext_autogen.cpp b/src/libGLESv2/entry_points_gles_ext_autogen.cpp
index 1a3a531..9e7e31c 100644
--- a/src/libGLESv2/entry_points_gles_ext_autogen.cpp
+++ b/src/libGLESv2/entry_points_gles_ext_autogen.cpp
@@ -41,15 +41,14 @@
                                                       GLuint baseInstance)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawArraysInstancedBaseInstanceANGLE,
-          "glDrawArraysInstancedBaseInstanceANGLE",
+    EVENT(context, GLDrawArraysInstancedBaseInstanceANGLE,
           "context = %d, mode = %s, first = %d, count = %d, instanceCount = %d, baseInstance = %u",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), first, count,
           instanceCount, baseInstance);
 
     if (context)
     {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateDrawArraysInstancedBaseInstanceANGLE(
@@ -77,8 +76,7 @@
                                                                   GLuint baseInstance)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawElementsInstancedBaseVertexBaseInstanceANGLE,
-          "glDrawElementsInstancedBaseVertexBaseInstanceANGLE",
+    EVENT(context, GLDrawElementsInstancedBaseVertexBaseInstanceANGLE,
           "context = %d, mode = %s, count = %d, type = %s, indices = 0x%016" PRIxPTR
           ", instanceCounts = %d, baseVertex = %d, baseInstance = %u",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), count,
@@ -87,8 +85,8 @@
 
     if (context)
     {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateDrawElementsInstancedBaseVertexBaseInstanceANGLE(
@@ -117,8 +115,7 @@
                                                            GLsizei drawcount)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiDrawArraysInstancedBaseInstanceANGLE,
-          "glMultiDrawArraysInstancedBaseInstanceANGLE",
+    EVENT(context, GLMultiDrawArraysInstancedBaseInstanceANGLE,
           "context = %d, mode = %s, firsts = 0x%016" PRIxPTR ", counts = 0x%016" PRIxPTR
           ", instanceCounts = 0x%016" PRIxPTR ", baseInstances = 0x%016" PRIxPTR ", drawcount = %d",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), (uintptr_t)firsts,
@@ -126,7 +123,7 @@
 
     if (context)
     {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -157,8 +154,7 @@
                                                       GLsizei drawcount)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiDrawElementsInstancedBaseVertexBaseInstanceANGLE,
-          "glMultiDrawElementsInstancedBaseVertexBaseInstanceANGLE",
+    EVENT(context, GLMultiDrawElementsInstancedBaseVertexBaseInstanceANGLE,
           "context = %d, mode = %s, counts = 0x%016" PRIxPTR ", type = %s, indices = 0x%016" PRIxPTR
           ", instanceCounts = 0x%016" PRIxPTR ", baseVertices = 0x%016" PRIxPTR
           ", baseInstances = 0x%016" PRIxPTR ", drawcount = %d",
@@ -168,8 +164,8 @@
 
     if (context)
     {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateMultiDrawElementsInstancedBaseVertexBaseInstanceANGLE(
@@ -204,7 +200,7 @@
                                     GLboolean unpackUnmultiplyAlpha)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CopyTexture3DANGLE, "glCopyTexture3DANGLE",
+    EVENT(context, GLCopyTexture3DANGLE,
           "context = %d, sourceId = %u, sourceLevel = %d, destTarget = %s, destId = %u, destLevel "
           "= %d, internalFormat = %d, destType = %s, unpackFlipY = %s, unpackPremultiplyAlpha = "
           "%s, unpackUnmultiplyAlpha = %s",
@@ -215,9 +211,9 @@
 
     if (context)
     {
-        TextureID sourceIdPacked                              = FromGL<TextureID>(sourceId);
-        TextureTarget destTargetPacked                        = FromGL<TextureTarget>(destTarget);
-        TextureID destIdPacked                                = FromGL<TextureID>(destId);
+        TextureID sourceIdPacked       = PackParam<TextureID>(sourceId);
+        TextureTarget destTargetPacked = PackParam<TextureTarget>(destTarget);
+        TextureID destIdPacked         = PackParam<TextureID>(destId);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateCopyTexture3DANGLE(
@@ -259,7 +255,7 @@
                                        GLboolean unpackUnmultiplyAlpha)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CopySubTexture3DANGLE, "glCopySubTexture3DANGLE",
+    EVENT(context, GLCopySubTexture3DANGLE,
           "context = %d, sourceId = %u, sourceLevel = %d, destTarget = %s, destId = %u, destLevel "
           "= %d, xoffset = %d, yoffset = %d, zoffset = %d, x = %d, y = %d, z = %d, width = %d, "
           "height = %d, depth = %d, unpackFlipY = %s, unpackPremultiplyAlpha = %s, "
@@ -271,9 +267,9 @@
 
     if (context)
     {
-        TextureID sourceIdPacked                              = FromGL<TextureID>(sourceId);
-        TextureTarget destTargetPacked                        = FromGL<TextureTarget>(destTarget);
-        TextureID destIdPacked                                = FromGL<TextureID>(destId);
+        TextureID sourceIdPacked       = PackParam<TextureID>(sourceId);
+        TextureTarget destTargetPacked = PackParam<TextureTarget>(destTarget);
+        TextureID destIdPacked         = PackParam<TextureID>(destId);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -312,7 +308,7 @@
                                       GLenum filter)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BlitFramebufferANGLE, "glBlitFramebufferANGLE",
+    EVENT(context, GLBlitFramebufferANGLE,
           "context = %d, srcX0 = %d, srcY0 = %d, srcX1 = %d, srcY1 = %d, dstX0 = %d, dstY0 = %d, "
           "dstX1 = %d, dstY1 = %d, mask = %s, filter = %s",
           CID(context), srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
@@ -347,8 +343,7 @@
                                                      GLsizei height)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::RenderbufferStorageMultisampleANGLE,
-          "glRenderbufferStorageMultisampleANGLE",
+    EVENT(context, GLRenderbufferStorageMultisampleANGLE,
           "context = %d, target = %s, samples = %d, internalformat = %s, width = %d, height = %d",
           CID(context), GLenumToString(GLenumGroup::RenderbufferTarget, target), samples,
           GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height);
@@ -377,7 +372,7 @@
 GetTexImageANGLE(GLenum target, GLint level, GLenum format, GLenum type, void *pixels)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTexImageANGLE, "glGetTexImageANGLE",
+    EVENT(context, GLGetTexImageANGLE,
           "context = %d, target = %s, level = %d, format = %s, type = %s, pixels = 0x%016" PRIxPTR
           "",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level,
@@ -386,7 +381,7 @@
 
     if (context)
     {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -407,7 +402,7 @@
 void GL_APIENTRY GetRenderbufferImageANGLE(GLenum target, GLenum format, GLenum type, void *pixels)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetRenderbufferImageANGLE, "glGetRenderbufferImageANGLE",
+    EVENT(context, GLGetRenderbufferImageANGLE,
           "context = %d, target = %s, format = %s, type = %s, pixels = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::RenderbufferTarget, target),
           GLenumToString(GLenumGroup::PixelFormat, format),
@@ -439,14 +434,14 @@
                                              GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTexLevelParameterivANGLE, "glGetTexLevelParameterivANGLE",
+    EVENT(context, GLGetTexLevelParameterivANGLE,
           "context = %d, target = %s, level = %d, pname = %s, params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target), level,
           GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
 
     if (context)
     {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -470,14 +465,14 @@
                                              GLfloat *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTexLevelParameterfvANGLE, "glGetTexLevelParameterfvANGLE",
+    EVENT(context, GLGetTexLevelParameterfvANGLE,
           "context = %d, target = %s, level = %d, pname = %s, params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target), level,
           GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
 
     if (context)
     {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -502,13 +497,13 @@
                                           GLsizei primcount)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawArraysInstancedANGLE, "glDrawArraysInstancedANGLE",
+    EVENT(context, GLDrawArraysInstancedANGLE,
           "context = %d, mode = %s, first = %d, count = %d, primcount = %d", CID(context),
           GLenumToString(GLenumGroup::PrimitiveType, mode), first, count, primcount);
 
     if (context)
     {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -533,7 +528,7 @@
                                             GLsizei primcount)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawElementsInstancedANGLE, "glDrawElementsInstancedANGLE",
+    EVENT(context, GLDrawElementsInstancedANGLE,
           "context = %d, mode = %s, count = %d, type = %s, indices = 0x%016" PRIxPTR
           ", primcount = %d",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), count,
@@ -541,8 +536,8 @@
 
     if (context)
     {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateDrawElementsInstancedANGLE(context, modePacked, count,
@@ -563,8 +558,8 @@
 void GL_APIENTRY VertexAttribDivisorANGLE(GLuint index, GLuint divisor)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribDivisorANGLE, "glVertexAttribDivisorANGLE",
-          "context = %d, index = %u, divisor = %u", CID(context), index, divisor);
+    EVENT(context, GLVertexAttribDivisorANGLE, "context = %d, index = %u, divisor = %u",
+          CID(context), index, divisor);
 
     if (context)
     {
@@ -595,7 +590,7 @@
                                            GLbitfield usageFlags)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexStorageMemFlags2DANGLE, "glTexStorageMemFlags2DANGLE",
+    EVENT(context, GLTexStorageMemFlags2DANGLE,
           "context = %d, target = %s, levels = %d, internalFormat = %s, width = %d, height = %d, "
           "memory = %u, offset = %llu, createFlags = %s, usageFlags = %s",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), levels,
@@ -606,8 +601,8 @@
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        MemoryObjectID memoryPacked                           = FromGL<MemoryObjectID>(memory);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        MemoryObjectID memoryPacked                           = PackParam<MemoryObjectID>(memory);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexStorageMemFlags2DANGLE(
@@ -640,8 +635,7 @@
 {
     Context *context = GetValidGlobalContext();
     EVENT(
-        context, gl::EntryPoint::TexStorageMemFlags2DMultisampleANGLE,
-        "glTexStorageMemFlags2DMultisampleANGLE",
+        context, GLTexStorageMemFlags2DMultisampleANGLE,
         "context = %d, target = %s, samples = %d, internalFormat = %s, width = %d, height = %d, "
         "fixedSampleLocations = %s, memory = %u, offset = %llu, createFlags = %s, usageFlags = %s",
         CID(context), GLenumToString(GLenumGroup::TextureTarget, target), samples,
@@ -652,8 +646,8 @@
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        MemoryObjectID memoryPacked                           = FromGL<MemoryObjectID>(memory);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        MemoryObjectID memoryPacked                           = PackParam<MemoryObjectID>(memory);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -688,7 +682,7 @@
                                            GLbitfield usageFlags)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexStorageMemFlags3DANGLE, "glTexStorageMemFlags3DANGLE",
+    EVENT(context, GLTexStorageMemFlags3DANGLE,
           "context = %d, target = %s, levels = %d, internalFormat = %s, width = %d, height = %d, "
           "depth = %d, memory = %u, offset = %llu, createFlags = %s, usageFlags = %s",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), levels,
@@ -699,8 +693,8 @@
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        MemoryObjectID memoryPacked                           = FromGL<MemoryObjectID>(memory);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        MemoryObjectID memoryPacked                           = PackParam<MemoryObjectID>(memory);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexStorageMemFlags3DANGLE(
@@ -734,8 +728,7 @@
                                                       GLbitfield usageFlags)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexStorageMemFlags3DMultisampleANGLE,
-          "glTexStorageMemFlags3DMultisampleANGLE",
+    EVENT(context, GLTexStorageMemFlags3DMultisampleANGLE,
           "context = %d, target = %s, samples = %d, internalFormat = %s, width = %d, height = %d, "
           "depth = %d, fixedSampleLocations = %s, memory = %u, offset = %llu, createFlags = %s, "
           "usageFlags = %s",
@@ -747,8 +740,8 @@
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        MemoryObjectID memoryPacked                           = FromGL<MemoryObjectID>(memory);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        MemoryObjectID memoryPacked                           = PackParam<MemoryObjectID>(memory);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -778,15 +771,15 @@
                                                GLuint handle)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ImportMemoryZirconHandleANGLE, "glImportMemoryZirconHandleANGLE",
+    EVENT(context, GLImportMemoryZirconHandleANGLE,
           "context = %d, memory = %u, size = %llu, handleType = %s, handle = %u", CID(context),
           memory, static_cast<unsigned long long>(size),
           GLenumToString(GLenumGroup::ExternalHandleType, handleType), handle);
 
     if (context)
     {
-        MemoryObjectID memoryPacked                           = FromGL<MemoryObjectID>(memory);
-        HandleType handleTypePacked                           = FromGL<HandleType>(handleType);
+        MemoryObjectID memoryPacked                           = PackParam<MemoryObjectID>(memory);
+        HandleType handleTypePacked                           = PackParam<HandleType>(handleType);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateImportMemoryZirconHandleANGLE(context, memoryPacked, size,
@@ -811,7 +804,7 @@
                                       GLsizei drawcount)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiDrawArraysANGLE, "glMultiDrawArraysANGLE",
+    EVENT(context, GLMultiDrawArraysANGLE,
           "context = %d, mode = %s, firsts = 0x%016" PRIxPTR ", counts = 0x%016" PRIxPTR
           ", drawcount = %d",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), (uintptr_t)firsts,
@@ -819,7 +812,7 @@
 
     if (context)
     {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -844,7 +837,7 @@
                                                GLsizei drawcount)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiDrawArraysInstancedANGLE, "glMultiDrawArraysInstancedANGLE",
+    EVENT(context, GLMultiDrawArraysInstancedANGLE,
           "context = %d, mode = %s, firsts = 0x%016" PRIxPTR ", counts = 0x%016" PRIxPTR
           ", instanceCounts = 0x%016" PRIxPTR ", drawcount = %d",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), (uintptr_t)firsts,
@@ -852,7 +845,7 @@
 
     if (context)
     {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateMultiDrawArraysInstancedANGLE(
@@ -878,7 +871,7 @@
                                         GLsizei drawcount)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiDrawElementsANGLE, "glMultiDrawElementsANGLE",
+    EVENT(context, GLMultiDrawElementsANGLE,
           "context = %d, mode = %s, counts = 0x%016" PRIxPTR ", type = %s, indices = 0x%016" PRIxPTR
           ", drawcount = %d",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), (uintptr_t)counts,
@@ -886,8 +879,8 @@
 
     if (context)
     {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateMultiDrawElementsANGLE(context, modePacked, counts, typePacked,
@@ -913,8 +906,7 @@
                                                  GLsizei drawcount)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiDrawElementsInstancedANGLE,
-          "glMultiDrawElementsInstancedANGLE",
+    EVENT(context, GLMultiDrawElementsInstancedANGLE,
           "context = %d, mode = %s, counts = 0x%016" PRIxPTR ", type = %s, indices = 0x%016" PRIxPTR
           ", instanceCounts = 0x%016" PRIxPTR ", drawcount = %d",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), (uintptr_t)counts,
@@ -923,8 +915,8 @@
 
     if (context)
     {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -950,13 +942,12 @@
 void GL_APIENTRY ProvokingVertexANGLE(GLenum mode)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProvokingVertexANGLE, "glProvokingVertexANGLE",
-          "context = %d, mode = %s", CID(context),
+    EVENT(context, GLProvokingVertexANGLE, "context = %d, mode = %s", CID(context),
           GLenumToString(GLenumGroup::VertexProvokingMode, mode));
 
     if (context)
     {
-        ProvokingVertexConvention modePacked = FromGL<ProvokingVertexConvention>(mode);
+        ProvokingVertexConvention modePacked = PackParam<ProvokingVertexConvention>(mode);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateProvokingVertexANGLE(context, modePacked));
@@ -976,8 +967,8 @@
 void GL_APIENTRY RequestExtensionANGLE(const GLchar *name)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::RequestExtensionANGLE, "glRequestExtensionANGLE",
-          "context = %d, name = 0x%016" PRIxPTR "", CID(context), (uintptr_t)name);
+    EVENT(context, GLRequestExtensionANGLE, "context = %d, name = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)name);
 
     if (context)
     {
@@ -999,8 +990,8 @@
 void GL_APIENTRY DisableExtensionANGLE(const GLchar *name)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DisableExtensionANGLE, "glDisableExtensionANGLE",
-          "context = %d, name = 0x%016" PRIxPTR "", CID(context), (uintptr_t)name);
+    EVENT(context, GLDisableExtensionANGLE, "context = %d, name = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)name);
 
     if (context)
     {
@@ -1026,7 +1017,7 @@
                                         GLboolean *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetBooleanvRobustANGLE, "glGetBooleanvRobustANGLE",
+    EVENT(context, GLGetBooleanvRobustANGLE,
           "context = %d, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -1057,8 +1048,7 @@
                                                  GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetBufferParameterivRobustANGLE,
-          "glGetBufferParameterivRobustANGLE",
+    EVENT(context, GLGetBufferParameterivRobustANGLE,
           "context = %d, target = %s, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target),
@@ -1067,7 +1057,7 @@
 
     if (context)
     {
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetBufferParameterivRobustANGLE(context, targetPacked, pname,
@@ -1091,7 +1081,7 @@
                                       GLfloat *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetFloatvRobustANGLE, "glGetFloatvRobustANGLE",
+    EVENT(context, GLGetFloatvRobustANGLE,
           "context = %d, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -1122,8 +1112,7 @@
                                                                 GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetFramebufferAttachmentParameterivRobustANGLE,
-          "glGetFramebufferAttachmentParameterivRobustANGLE",
+    EVENT(context, GLGetFramebufferAttachmentParameterivRobustANGLE,
           "context = %d, target = %s, attachment = %s, pname = %s, bufSize = %d, length = "
           "0x%016" PRIxPTR ", params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target),
@@ -1154,7 +1143,7 @@
 void GL_APIENTRY GetIntegervRobustANGLE(GLenum pname, GLsizei bufSize, GLsizei *length, GLint *data)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetIntegervRobustANGLE, "glGetIntegervRobustANGLE",
+    EVENT(context, GLGetIntegervRobustANGLE,
           "context = %d, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", data = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -1184,7 +1173,7 @@
                                          GLint *params)
 {
     Context *context = GetGlobalContext();
-    EVENT(context, gl::EntryPoint::GetProgramivRobustANGLE, "glGetProgramivRobustANGLE",
+    EVENT(context, GLGetProgramivRobustANGLE,
           "context = %d, program = %u, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), program, GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -1192,7 +1181,7 @@
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetProgramivRobustANGLE(context, programPacked, pname, bufSize,
@@ -1215,8 +1204,7 @@
                                                        GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetRenderbufferParameterivRobustANGLE,
-          "glGetRenderbufferParameterivRobustANGLE",
+    EVENT(context, GLGetRenderbufferParameterivRobustANGLE,
           "context = %d, target = %s, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target),
@@ -1246,7 +1234,7 @@
 GetShaderivRobustANGLE(GLuint shader, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params)
 {
     Context *context = GetGlobalContext();
-    EVENT(context, gl::EntryPoint::GetShaderivRobustANGLE, "glGetShaderivRobustANGLE",
+    EVENT(context, GLGetShaderivRobustANGLE,
           "context = %d, shader = %u, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), shader, GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -1254,7 +1242,7 @@
 
     if (context)
     {
-        ShaderProgramID shaderPacked                          = FromGL<ShaderProgramID>(shader);
+        ShaderProgramID shaderPacked                          = PackParam<ShaderProgramID>(shader);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -1277,7 +1265,7 @@
                                               GLfloat *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTexParameterfvRobustANGLE, "glGetTexParameterfvRobustANGLE",
+    EVENT(context, GLGetTexParameterfvRobustANGLE,
           "context = %d, target = %s, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target),
@@ -1286,7 +1274,7 @@
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetTexParameterfvRobustANGLE(context, targetPacked, pname,
@@ -1311,7 +1299,7 @@
                                               GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTexParameterivRobustANGLE, "glGetTexParameterivRobustANGLE",
+    EVENT(context, GLGetTexParameterivRobustANGLE,
           "context = %d, target = %s, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target),
@@ -1320,7 +1308,7 @@
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetTexParameterivRobustANGLE(context, targetPacked, pname,
@@ -1345,15 +1333,15 @@
                                          GLfloat *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetUniformfvRobustANGLE, "glGetUniformfvRobustANGLE",
+    EVENT(context, GLGetUniformfvRobustANGLE,
           "context = %d, program = %u, location = %d, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), program, location, bufSize, (uintptr_t)length, (uintptr_t)params);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetUniformfvRobustANGLE(context, programPacked, locationPacked,
@@ -1378,15 +1366,15 @@
                                          GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetUniformivRobustANGLE, "glGetUniformivRobustANGLE",
+    EVENT(context, GLGetUniformivRobustANGLE,
           "context = %d, program = %u, location = %d, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), program, location, bufSize, (uintptr_t)length, (uintptr_t)params);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetUniformivRobustANGLE(context, programPacked, locationPacked,
@@ -1411,7 +1399,7 @@
                                               GLfloat *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetVertexAttribfvRobustANGLE, "glGetVertexAttribfvRobustANGLE",
+    EVENT(context, GLGetVertexAttribfvRobustANGLE,
           "context = %d, index = %u, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), index, GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -1443,7 +1431,7 @@
                                               GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetVertexAttribivRobustANGLE, "glGetVertexAttribivRobustANGLE",
+    EVENT(context, GLGetVertexAttribivRobustANGLE,
           "context = %d, index = %u, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), index, GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -1475,8 +1463,7 @@
                                                     void **pointer)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetVertexAttribPointervRobustANGLE,
-          "glGetVertexAttribPointervRobustANGLE",
+    EVENT(context, GLGetVertexAttribPointervRobustANGLE,
           "context = %d, index = %u, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", pointer = 0x%016" PRIxPTR "",
           CID(context), index, GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -1514,7 +1501,7 @@
                                        void *pixels)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ReadPixelsRobustANGLE, "glReadPixelsRobustANGLE",
+    EVENT(context, GLReadPixelsRobustANGLE,
           "context = %d, x = %d, y = %d, width = %d, height = %d, format = %s, type = %s, bufSize "
           "= %d, length = 0x%016" PRIxPTR ", columns = 0x%016" PRIxPTR ", rows = 0x%016" PRIxPTR
           ", pixels = 0x%016" PRIxPTR "",
@@ -1555,7 +1542,7 @@
                                        const void *pixels)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexImage2DRobustANGLE, "glTexImage2DRobustANGLE",
+    EVENT(context, GLTexImage2DRobustANGLE,
           "context = %d, target = %s, level = %d, internalformat = %d, width = %d, height = %d, "
           "border = %d, format = %s, type = %s, bufSize = %d, pixels = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target), level, internalformat,
@@ -1564,7 +1551,7 @@
 
     if (context)
     {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -1590,14 +1577,14 @@
                                            const GLfloat *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexParameterfvRobustANGLE, "glTexParameterfvRobustANGLE",
+    EVENT(context, GLTexParameterfvRobustANGLE,
           "context = %d, target = %s, pname = %s, bufSize = %d, params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target),
           GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize, (uintptr_t)params);
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -1621,14 +1608,14 @@
                                            const GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexParameterivRobustANGLE, "glTexParameterivRobustANGLE",
+    EVENT(context, GLTexParameterivRobustANGLE,
           "context = %d, target = %s, pname = %s, bufSize = %d, params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target),
           GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize, (uintptr_t)params);
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -1658,7 +1645,7 @@
                                           const void *pixels)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexSubImage2DRobustANGLE, "glTexSubImage2DRobustANGLE",
+    EVENT(context, GLTexSubImage2DRobustANGLE,
           "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, width = %d, height = "
           "%d, format = %s, type = %s, bufSize = %d, pixels = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target), level, xoffset, yoffset,
@@ -1667,7 +1654,7 @@
 
     if (context)
     {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -1700,7 +1687,7 @@
                                        const void *pixels)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexImage3DRobustANGLE, "glTexImage3DRobustANGLE",
+    EVENT(context, GLTexImage3DRobustANGLE,
           "context = %d, target = %s, level = %d, internalformat = %d, width = %d, height = %d, "
           "depth = %d, border = %d, format = %s, type = %s, bufSize = %d, pixels = 0x%016" PRIxPTR
           "",
@@ -1710,7 +1697,7 @@
 
     if (context)
     {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -1745,7 +1732,7 @@
 {
     Context *context = GetValidGlobalContext();
     EVENT(
-        context, gl::EntryPoint::TexSubImage3DRobustANGLE, "glTexSubImage3DRobustANGLE",
+        context, GLTexSubImage3DRobustANGLE,
         "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, width = "
         "%d, height = %d, depth = %d, format = %s, type = %s, bufSize = %d, pixels = 0x%016" PRIxPTR
         "",
@@ -1755,7 +1742,7 @@
 
     if (context)
     {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexSubImage3DRobustANGLE(context, targetPacked, level, xoffset,
@@ -1786,8 +1773,7 @@
                                                  const GLvoid *data)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CompressedTexImage2DRobustANGLE,
-          "glCompressedTexImage2DRobustANGLE",
+    EVENT(context, GLCompressedTexImage2DRobustANGLE,
           "context = %d, target = %s, level = %d, internalformat = %s, width = %d, height = %d, "
           "border = %d, imageSize = %d, dataSize = %d, data = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target), level,
@@ -1796,7 +1782,7 @@
 
     if (context)
     {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateCompressedTexImage2DRobustANGLE(
@@ -1828,8 +1814,7 @@
                                                     const GLvoid *data)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CompressedTexSubImage2DRobustANGLE,
-          "glCompressedTexSubImage2DRobustANGLE",
+    EVENT(context, GLCompressedTexSubImage2DRobustANGLE,
           "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, width = %d, height = "
           "%d, format = %s, imageSize = %d, dataSize = %d, data = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target), level, xoffset, yoffset,
@@ -1838,7 +1823,7 @@
 
     if (context)
     {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateCompressedTexSubImage2DRobustANGLE(
@@ -1870,8 +1855,7 @@
                                                  const GLvoid *data)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CompressedTexImage3DRobustANGLE,
-          "glCompressedTexImage3DRobustANGLE",
+    EVENT(context, GLCompressedTexImage3DRobustANGLE,
           "context = %d, target = %s, level = %d, internalformat = %s, width = %d, height = %d, "
           "depth = %d, border = %d, imageSize = %d, dataSize = %d, data = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target), level,
@@ -1880,7 +1864,7 @@
 
     if (context)
     {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateCompressedTexImage3DRobustANGLE(
@@ -1914,8 +1898,7 @@
                                                     const GLvoid *data)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CompressedTexSubImage3DRobustANGLE,
-          "glCompressedTexSubImage3DRobustANGLE",
+    EVENT(context, GLCompressedTexSubImage3DRobustANGLE,
           "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, width "
           "= %d, height = %d, depth = %d, format = %s, imageSize = %d, dataSize = %d, data = "
           "0x%016" PRIxPTR "",
@@ -1925,7 +1908,7 @@
 
     if (context)
     {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateCompressedTexSubImage3DRobustANGLE(
@@ -1951,7 +1934,7 @@
 GetQueryivRobustANGLE(GLenum target, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetQueryivRobustANGLE, "glGetQueryivRobustANGLE",
+    EVENT(context, GLGetQueryivRobustANGLE,
           "context = %d, target = %s, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target),
@@ -1960,7 +1943,7 @@
 
     if (context)
     {
-        QueryType targetPacked                                = FromGL<QueryType>(target);
+        QueryType targetPacked                                = PackParam<QueryType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -1985,7 +1968,7 @@
                                               GLuint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetQueryObjectuivRobustANGLE, "glGetQueryObjectuivRobustANGLE",
+    EVENT(context, GLGetQueryObjectuivRobustANGLE,
           "context = %d, id = %u, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), id, GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -1993,7 +1976,7 @@
 
     if (context)
     {
-        QueryID idPacked                                      = FromGL<QueryID>(id);
+        QueryID idPacked                                      = PackParam<QueryID>(id);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGetQueryObjectuivRobustANGLE(
@@ -2018,7 +2001,7 @@
                                               void **params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetBufferPointervRobustANGLE, "glGetBufferPointervRobustANGLE",
+    EVENT(context, GLGetBufferPointervRobustANGLE,
           "context = %d, target = %s, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target),
@@ -2027,7 +2010,7 @@
 
     if (context)
     {
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetBufferPointervRobustANGLE(context, targetPacked, pname,
@@ -2049,7 +2032,7 @@
 GetIntegeri_vRobustANGLE(GLenum target, GLuint index, GLsizei bufSize, GLsizei *length, GLint *data)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetIntegeri_vRobustANGLE, "glGetIntegeri_vRobustANGLE",
+    EVENT(context, GLGetIntegeri_vRobustANGLE,
           "context = %d, target = %s, index = %u, bufSize = %d, length = 0x%016" PRIxPTR
           ", data = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target), index, bufSize,
@@ -2082,8 +2065,7 @@
                                                 GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetInternalformativRobustANGLE,
-          "glGetInternalformativRobustANGLE",
+    EVENT(context, GLGetInternalformativRobustANGLE,
           "context = %d, target = %s, internalformat = %s, pname = %s, bufSize = %d, length = "
           "0x%016" PRIxPTR ", params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target),
@@ -2118,7 +2100,7 @@
                                                GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetVertexAttribIivRobustANGLE, "glGetVertexAttribIivRobustANGLE",
+    EVENT(context, GLGetVertexAttribIivRobustANGLE,
           "context = %d, index = %u, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), index, GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -2150,8 +2132,7 @@
                                                 GLuint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetVertexAttribIuivRobustANGLE,
-          "glGetVertexAttribIuivRobustANGLE",
+    EVENT(context, GLGetVertexAttribIuivRobustANGLE,
           "context = %d, index = %u, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), index, GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -2183,15 +2164,15 @@
                                           GLuint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetUniformuivRobustANGLE, "glGetUniformuivRobustANGLE",
+    EVENT(context, GLGetUniformuivRobustANGLE,
           "context = %d, program = %u, location = %d, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), program, location, bufSize, (uintptr_t)length, (uintptr_t)params);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetUniformuivRobustANGLE(context, programPacked, locationPacked,
@@ -2217,8 +2198,7 @@
                                                     GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetActiveUniformBlockivRobustANGLE,
-          "glGetActiveUniformBlockivRobustANGLE",
+    EVENT(context, GLGetActiveUniformBlockivRobustANGLE,
           "context = %d, program = %u, uniformBlockIndex = %u, pname = %s, bufSize = %d, length = "
           "0x%016" PRIxPTR ", params = 0x%016" PRIxPTR "",
           CID(context), program, uniformBlockIndex,
@@ -2227,7 +2207,7 @@
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -2253,7 +2233,7 @@
                                           GLint64 *data)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetInteger64vRobustANGLE, "glGetInteger64vRobustANGLE",
+    EVENT(context, GLGetInteger64vRobustANGLE,
           "context = %d, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", data = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -2284,7 +2264,7 @@
                                             GLint64 *data)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetInteger64i_vRobustANGLE, "glGetInteger64i_vRobustANGLE",
+    EVENT(context, GLGetInteger64i_vRobustANGLE,
           "context = %d, target = %s, index = %u, bufSize = %d, length = 0x%016" PRIxPTR
           ", data = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target), index, bufSize,
@@ -2316,8 +2296,7 @@
                                                    GLint64 *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetBufferParameteri64vRobustANGLE,
-          "glGetBufferParameteri64vRobustANGLE",
+    EVENT(context, GLGetBufferParameteri64vRobustANGLE,
           "context = %d, target = %s, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target),
@@ -2326,7 +2305,7 @@
 
     if (context)
     {
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetBufferParameteri64vRobustANGLE(context, targetPacked, pname,
@@ -2350,13 +2329,13 @@
                                                const GLint *param)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SamplerParameterivRobustANGLE, "glSamplerParameterivRobustANGLE",
+    EVENT(context, GLSamplerParameterivRobustANGLE,
           "context = %d, sampler = %u, pname = %u, bufSize = %d, param = 0x%016" PRIxPTR "",
           CID(context), sampler, pname, bufSize, (uintptr_t)param);
 
     if (context)
     {
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -2380,14 +2359,14 @@
                                                const GLfloat *param)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SamplerParameterfvRobustANGLE, "glSamplerParameterfvRobustANGLE",
+    EVENT(context, GLSamplerParameterfvRobustANGLE,
           "context = %d, sampler = %u, pname = %s, bufSize = %d, param = 0x%016" PRIxPTR "",
           CID(context), sampler, GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
           (uintptr_t)param);
 
     if (context)
     {
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -2412,8 +2391,7 @@
                                                   GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetSamplerParameterivRobustANGLE,
-          "glGetSamplerParameterivRobustANGLE",
+    EVENT(context, GLGetSamplerParameterivRobustANGLE,
           "context = %d, sampler = %u, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), sampler, GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -2421,7 +2399,7 @@
 
     if (context)
     {
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetSamplerParameterivRobustANGLE(context, samplerPacked, pname,
@@ -2446,8 +2424,7 @@
                                                   GLfloat *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetSamplerParameterfvRobustANGLE,
-          "glGetSamplerParameterfvRobustANGLE",
+    EVENT(context, GLGetSamplerParameterfvRobustANGLE,
           "context = %d, sampler = %u, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), sampler, GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -2455,7 +2432,7 @@
 
     if (context)
     {
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetSamplerParameterfvRobustANGLE(context, samplerPacked, pname,
@@ -2480,8 +2457,7 @@
                                                       GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetFramebufferParameterivRobustANGLE,
-          "glGetFramebufferParameterivRobustANGLE",
+    EVENT(context, GLGetFramebufferParameterivRobustANGLE,
           "context = %d, target = %s, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target),
@@ -2515,8 +2491,7 @@
                                                   GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetProgramInterfaceivRobustANGLE,
-          "glGetProgramInterfaceivRobustANGLE",
+    EVENT(context, GLGetProgramInterfaceivRobustANGLE,
           "context = %d, program = %u, programInterface = %s, pname = %s, bufSize = %d, length = "
           "0x%016" PRIxPTR ", params = 0x%016" PRIxPTR "",
           CID(context), program, GLenumToString(GLenumGroup::DefaultGroup, programInterface),
@@ -2525,7 +2500,7 @@
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -2552,7 +2527,7 @@
                                           GLboolean *data)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetBooleani_vRobustANGLE, "glGetBooleani_vRobustANGLE",
+    EVENT(context, GLGetBooleani_vRobustANGLE,
           "context = %d, target = %s, index = %u, bufSize = %d, length = 0x%016" PRIxPTR
           ", data = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target), index, bufSize,
@@ -2584,7 +2559,7 @@
                                              GLfloat *val)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetMultisamplefvRobustANGLE, "glGetMultisamplefvRobustANGLE",
+    EVENT(context, GLGetMultisamplefvRobustANGLE,
           "context = %d, pname = %s, index = %u, bufSize = %d, length = 0x%016" PRIxPTR
           ", val = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, pname), index, bufSize,
@@ -2617,8 +2592,7 @@
                                                    GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTexLevelParameterivRobustANGLE,
-          "glGetTexLevelParameterivRobustANGLE",
+    EVENT(context, GLGetTexLevelParameterivRobustANGLE,
           "context = %d, target = %s, level = %d, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target), level,
@@ -2627,7 +2601,7 @@
 
     if (context)
     {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetTexLevelParameterivRobustANGLE(
@@ -2654,8 +2628,7 @@
                                                    GLfloat *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTexLevelParameterfvRobustANGLE,
-          "glGetTexLevelParameterfvRobustANGLE",
+    EVENT(context, GLGetTexLevelParameterfvRobustANGLE,
           "context = %d, target = %s, level = %d, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target), level,
@@ -2664,7 +2637,7 @@
 
     if (context)
     {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetTexLevelParameterfvRobustANGLE(
@@ -2689,8 +2662,7 @@
                                                    void **params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetPointervRobustANGLERobustANGLE,
-          "glGetPointervRobustANGLERobustANGLE",
+    EVENT(context, GLGetPointervRobustANGLERobustANGLE,
           "context = %d, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -2728,7 +2700,7 @@
                                         void *data)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ReadnPixelsRobustANGLE, "glReadnPixelsRobustANGLE",
+    EVENT(context, GLReadnPixelsRobustANGLE,
           "context = %d, x = %d, y = %d, width = %d, height = %d, format = %s, type = %s, bufSize "
           "= %d, length = 0x%016" PRIxPTR ", columns = 0x%016" PRIxPTR ", rows = 0x%016" PRIxPTR
           ", data = 0x%016" PRIxPTR "",
@@ -2764,15 +2736,15 @@
                                           GLfloat *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetnUniformfvRobustANGLE, "glGetnUniformfvRobustANGLE",
+    EVENT(context, GLGetnUniformfvRobustANGLE,
           "context = %d, program = %u, location = %d, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), program, location, bufSize, (uintptr_t)length, (uintptr_t)params);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetnUniformfvRobustANGLE(context, programPacked, locationPacked,
@@ -2797,15 +2769,15 @@
                                           GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetnUniformivRobustANGLE, "glGetnUniformivRobustANGLE",
+    EVENT(context, GLGetnUniformivRobustANGLE,
           "context = %d, program = %u, location = %d, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), program, location, bufSize, (uintptr_t)length, (uintptr_t)params);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetnUniformivRobustANGLE(context, programPacked, locationPacked,
@@ -2830,15 +2802,15 @@
                                            GLuint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetnUniformuivRobustANGLE, "glGetnUniformuivRobustANGLE",
+    EVENT(context, GLGetnUniformuivRobustANGLE,
           "context = %d, program = %u, location = %d, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), program, location, bufSize, (uintptr_t)length, (uintptr_t)params);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetnUniformuivRobustANGLE(
@@ -2862,14 +2834,14 @@
                                             const GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexParameterIivRobustANGLE, "glTexParameterIivRobustANGLE",
+    EVENT(context, GLTexParameterIivRobustANGLE,
           "context = %d, target = %s, pname = %s, bufSize = %d, params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target),
           GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize, (uintptr_t)params);
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -2893,14 +2865,14 @@
                                              const GLuint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexParameterIuivRobustANGLE, "glTexParameterIuivRobustANGLE",
+    EVENT(context, GLTexParameterIuivRobustANGLE,
           "context = %d, target = %s, pname = %s, bufSize = %d, params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target),
           GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize, (uintptr_t)params);
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -2925,7 +2897,7 @@
                                                GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTexParameterIivRobustANGLE, "glGetTexParameterIivRobustANGLE",
+    EVENT(context, GLGetTexParameterIivRobustANGLE,
           "context = %d, target = %s, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target),
@@ -2934,7 +2906,7 @@
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetTexParameterIivRobustANGLE(context, targetPacked, pname,
@@ -2959,8 +2931,7 @@
                                                 GLuint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTexParameterIuivRobustANGLE,
-          "glGetTexParameterIuivRobustANGLE",
+    EVENT(context, GLGetTexParameterIuivRobustANGLE,
           "context = %d, target = %s, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target),
@@ -2969,7 +2940,7 @@
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetTexParameterIuivRobustANGLE(context, targetPacked, pname,
@@ -2993,15 +2964,14 @@
                                                 const GLint *param)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SamplerParameterIivRobustANGLE,
-          "glSamplerParameterIivRobustANGLE",
+    EVENT(context, GLSamplerParameterIivRobustANGLE,
           "context = %d, sampler = %u, pname = %s, bufSize = %d, param = 0x%016" PRIxPTR "",
           CID(context), sampler, GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
           (uintptr_t)param);
 
     if (context)
     {
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -3025,15 +2995,14 @@
                                                  const GLuint *param)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SamplerParameterIuivRobustANGLE,
-          "glSamplerParameterIuivRobustANGLE",
+    EVENT(context, GLSamplerParameterIuivRobustANGLE,
           "context = %d, sampler = %u, pname = %s, bufSize = %d, param = 0x%016" PRIxPTR "",
           CID(context), sampler, GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
           (uintptr_t)param);
 
     if (context)
     {
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateSamplerParameterIuivRobustANGLE(
@@ -3058,8 +3027,7 @@
                                                    GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetSamplerParameterIivRobustANGLE,
-          "glGetSamplerParameterIivRobustANGLE",
+    EVENT(context, GLGetSamplerParameterIivRobustANGLE,
           "context = %d, sampler = %u, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), sampler, GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -3067,7 +3035,7 @@
 
     if (context)
     {
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetSamplerParameterIivRobustANGLE(context, samplerPacked, pname,
@@ -3092,8 +3060,7 @@
                                                     GLuint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetSamplerParameterIuivRobustANGLE,
-          "glGetSamplerParameterIuivRobustANGLE",
+    EVENT(context, GLGetSamplerParameterIuivRobustANGLE,
           "context = %d, sampler = %u, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), sampler, GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -3101,7 +3068,7 @@
 
     if (context)
     {
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetSamplerParameterIuivRobustANGLE(
@@ -3126,7 +3093,7 @@
                                              GLint *params)
 {
     Context *context = GetGlobalContext();
-    EVENT(context, gl::EntryPoint::GetQueryObjectivRobustANGLE, "glGetQueryObjectivRobustANGLE",
+    EVENT(context, GLGetQueryObjectivRobustANGLE,
           "context = %d, id = %u, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), id, GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -3134,7 +3101,7 @@
 
     if (context)
     {
-        QueryID idPacked                                      = FromGL<QueryID>(id);
+        QueryID idPacked                                      = PackParam<QueryID>(id);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGetQueryObjectivRobustANGLE(
@@ -3157,7 +3124,7 @@
                                                GLint64 *params)
 {
     Context *context = GetGlobalContext();
-    EVENT(context, gl::EntryPoint::GetQueryObjecti64vRobustANGLE, "glGetQueryObjecti64vRobustANGLE",
+    EVENT(context, GLGetQueryObjecti64vRobustANGLE,
           "context = %d, id = %u, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), id, GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -3165,7 +3132,7 @@
 
     if (context)
     {
-        QueryID idPacked                                      = FromGL<QueryID>(id);
+        QueryID idPacked                                      = PackParam<QueryID>(id);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGetQueryObjecti64vRobustANGLE(
@@ -3188,8 +3155,7 @@
                                                 GLuint64 *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetQueryObjectui64vRobustANGLE,
-          "glGetQueryObjectui64vRobustANGLE",
+    EVENT(context, GLGetQueryObjectui64vRobustANGLE,
           "context = %d, id = %u, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), id, GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -3197,7 +3163,7 @@
 
     if (context)
     {
-        QueryID idPacked                                      = FromGL<QueryID>(id);
+        QueryID idPacked                                      = PackParam<QueryID>(id);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGetQueryObjectui64vRobustANGLE(
@@ -3221,15 +3187,14 @@
                                                   GLuint handle)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ImportSemaphoreZirconHandleANGLE,
-          "glImportSemaphoreZirconHandleANGLE",
+    EVENT(context, GLImportSemaphoreZirconHandleANGLE,
           "context = %d, semaphore = %u, handleType = %s, handle = %u", CID(context), semaphore,
           GLenumToString(GLenumGroup::ExternalHandleType, handleType), handle);
 
     if (context)
     {
-        SemaphoreID semaphorePacked                           = FromGL<SemaphoreID>(semaphore);
-        HandleType handleTypePacked                           = FromGL<HandleType>(handleType);
+        SemaphoreID semaphorePacked                           = PackParam<SemaphoreID>(semaphore);
+        HandleType handleTypePacked                           = PackParam<HandleType>(handleType);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateImportSemaphoreZirconHandleANGLE(
@@ -3258,7 +3223,7 @@
                                          GLenum type)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexImage2DExternalANGLE, "glTexImage2DExternalANGLE",
+    EVENT(context, GLTexImage2DExternalANGLE,
           "context = %d, target = %s, level = %d, internalformat = %d, width = %d, height = %d, "
           "border = %d, format = %s, type = %s",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, internalformat,
@@ -3267,7 +3232,7 @@
 
     if (context)
     {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -3290,13 +3255,12 @@
 void GL_APIENTRY InvalidateTextureANGLE(GLenum target)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::InvalidateTextureANGLE, "glInvalidateTextureANGLE",
-          "context = %d, target = %s", CID(context),
+    EVENT(context, GLInvalidateTextureANGLE, "context = %d, target = %s", CID(context),
           GLenumToString(GLenumGroup::TextureTarget, target));
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateInvalidateTextureANGLE(context, targetPacked));
@@ -3321,7 +3285,7 @@
                                               GLboolean fixedsamplelocations)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexStorage2DMultisampleANGLE, "glTexStorage2DMultisampleANGLE",
+    EVENT(context, GLTexStorage2DMultisampleANGLE,
           "context = %d, target = %s, samples = %d, internalformat = %s, width = %d, height = %d, "
           "fixedsamplelocations = %s",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target), samples,
@@ -3330,7 +3294,7 @@
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -3353,7 +3317,7 @@
 void GL_APIENTRY GetMultisamplefvANGLE(GLenum pname, GLuint index, GLfloat *val)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetMultisamplefvANGLE, "glGetMultisamplefvANGLE",
+    EVENT(context, GLGetMultisamplefvANGLE,
           "context = %d, pname = %s, index = %u, val = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::DefaultGroup, pname), index, (uintptr_t)val);
 
@@ -3377,9 +3341,8 @@
 void GL_APIENTRY SampleMaskiANGLE(GLuint maskNumber, GLbitfield mask)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SampleMaskiANGLE, "glSampleMaskiANGLE",
-          "context = %d, maskNumber = %u, mask = %s", CID(context), maskNumber,
-          GLbitfieldToString(GLenumGroup::DefaultGroup, mask).c_str());
+    EVENT(context, GLSampleMaskiANGLE, "context = %d, maskNumber = %u, mask = %s", CID(context),
+          maskNumber, GLbitfieldToString(GLenumGroup::DefaultGroup, mask).c_str());
 
     if (context)
     {
@@ -3409,15 +3372,14 @@
                                                 GLchar *source)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTranslatedShaderSourceANGLE,
-          "glGetTranslatedShaderSourceANGLE",
+    EVENT(context, GLGetTranslatedShaderSourceANGLE,
           "context = %d, shader = %u, bufsize = %d, length = 0x%016" PRIxPTR
           ", source = 0x%016" PRIxPTR "",
           CID(context), shader, bufsize, (uintptr_t)length, (uintptr_t)source);
 
     if (context)
     {
-        ShaderProgramID shaderPacked                          = FromGL<ShaderProgramID>(shader);
+        ShaderProgramID shaderPacked                          = PackParam<ShaderProgramID>(shader);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGetTranslatedShaderSourceANGLE(
@@ -3439,14 +3401,14 @@
 void GL_APIENTRY BindUniformLocationCHROMIUM(GLuint program, GLint location, const GLchar *name)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindUniformLocationCHROMIUM, "glBindUniformLocationCHROMIUM",
+    EVENT(context, GLBindUniformLocationCHROMIUM,
           "context = %d, program = %u, location = %d, name = 0x%016" PRIxPTR "", CID(context),
           program, location, (uintptr_t)name);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -3468,13 +3430,13 @@
 void GL_APIENTRY CompressedCopyTextureCHROMIUM(GLuint sourceId, GLuint destId)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CompressedCopyTextureCHROMIUM, "glCompressedCopyTextureCHROMIUM",
-          "context = %d, sourceId = %u, destId = %u", CID(context), sourceId, destId);
+    EVENT(context, GLCompressedCopyTextureCHROMIUM, "context = %d, sourceId = %u, destId = %u",
+          CID(context), sourceId, destId);
 
     if (context)
     {
-        TextureID sourceIdPacked                              = FromGL<TextureID>(sourceId);
-        TextureID destIdPacked                                = FromGL<TextureID>(destId);
+        TextureID sourceIdPacked                              = PackParam<TextureID>(sourceId);
+        TextureID destIdPacked                                = PackParam<TextureID>(destId);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -3505,7 +3467,7 @@
                                      GLboolean unpackUnmultiplyAlpha)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CopyTextureCHROMIUM, "glCopyTextureCHROMIUM",
+    EVENT(context, GLCopyTextureCHROMIUM,
           "context = %d, sourceId = %u, sourceLevel = %d, destTarget = %s, destId = %u, destLevel "
           "= %d, internalFormat = %d, destType = %s, unpackFlipY = %s, unpackPremultiplyAlpha = "
           "%s, unpackUnmultiplyAlpha = %s",
@@ -3516,9 +3478,9 @@
 
     if (context)
     {
-        TextureID sourceIdPacked                              = FromGL<TextureID>(sourceId);
-        TextureTarget destTargetPacked                        = FromGL<TextureTarget>(destTarget);
-        TextureID destIdPacked                                = FromGL<TextureID>(destId);
+        TextureID sourceIdPacked       = PackParam<TextureID>(sourceId);
+        TextureTarget destTargetPacked = PackParam<TextureTarget>(destTarget);
+        TextureID destIdPacked         = PackParam<TextureID>(destId);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateCopyTextureCHROMIUM(
@@ -3557,7 +3519,7 @@
                                         GLboolean unpackUnmultiplyAlpha)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CopySubTextureCHROMIUM, "glCopySubTextureCHROMIUM",
+    EVENT(context, GLCopySubTextureCHROMIUM,
           "context = %d, sourceId = %u, sourceLevel = %d, destTarget = %s, destId = %u, destLevel "
           "= %d, xoffset = %d, yoffset = %d, x = %d, y = %d, width = %d, height = %d, unpackFlipY "
           "= %s, unpackPremultiplyAlpha = %s, unpackUnmultiplyAlpha = %s",
@@ -3568,9 +3530,9 @@
 
     if (context)
     {
-        TextureID sourceIdPacked                              = FromGL<TextureID>(sourceId);
-        TextureTarget destTargetPacked                        = FromGL<TextureTarget>(destTarget);
-        TextureID destIdPacked                                = FromGL<TextureID>(destId);
+        TextureID sourceIdPacked       = PackParam<TextureID>(sourceId);
+        TextureTarget destTargetPacked = PackParam<TextureTarget>(destTarget);
+        TextureID destIdPacked         = PackParam<TextureID>(destId);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateCopySubTextureCHROMIUM(
@@ -3597,8 +3559,7 @@
 void GL_APIENTRY CoverageModulationCHROMIUM(GLenum components)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CoverageModulationCHROMIUM, "glCoverageModulationCHROMIUM",
-          "context = %d, components = %s", CID(context),
+    EVENT(context, GLCoverageModulationCHROMIUM, "context = %d, components = %s", CID(context),
           GLenumToString(GLenumGroup::DefaultGroup, components));
 
     if (context)
@@ -3622,15 +3583,14 @@
 void GL_APIENTRY LoseContextCHROMIUM(GLenum current, GLenum other)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::LoseContextCHROMIUM, "glLoseContextCHROMIUM",
-          "context = %d, current = %s, other = %s", CID(context),
+    EVENT(context, GLLoseContextCHROMIUM, "context = %d, current = %s, other = %s", CID(context),
           GLenumToString(GLenumGroup::GraphicsResetStatus, current),
           GLenumToString(GLenumGroup::GraphicsResetStatus, other));
 
     if (context)
     {
-        GraphicsResetStatus currentPacked = FromGL<GraphicsResetStatus>(current);
-        GraphicsResetStatus otherPacked   = FromGL<GraphicsResetStatus>(other);
+        GraphicsResetStatus currentPacked = PackParam<GraphicsResetStatus>(current);
+        GraphicsResetStatus otherPacked   = PackParam<GraphicsResetStatus>(other);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateLoseContextCHROMIUM(context, currentPacked, otherPacked));
@@ -3654,13 +3614,13 @@
 void GL_APIENTRY BindFragDataLocationEXT(GLuint program, GLuint color, const GLchar *name)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindFragDataLocationEXT, "glBindFragDataLocationEXT",
+    EVENT(context, GLBindFragDataLocationEXT,
           "context = %d, program = %u, color = %u, name = 0x%016" PRIxPTR "", CID(context), program,
           color, (uintptr_t)name);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateBindFragDataLocationEXT(context, programPacked, color, name));
@@ -3682,14 +3642,13 @@
                                                 const GLchar *name)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindFragDataLocationIndexedEXT,
-          "glBindFragDataLocationIndexedEXT",
+    EVENT(context, GLBindFragDataLocationIndexedEXT,
           "context = %d, program = %u, colorNumber = %u, index = %u, name = 0x%016" PRIxPTR "",
           CID(context), program, colorNumber, index, (uintptr_t)name);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateBindFragDataLocationIndexedEXT(
@@ -3710,14 +3669,13 @@
 GLint GL_APIENTRY GetFragDataIndexEXT(GLuint program, const GLchar *name)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetFragDataIndexEXT, "glGetFragDataIndexEXT",
-          "context = %d, program = %u, name = 0x%016" PRIxPTR "", CID(context), program,
-          (uintptr_t)name);
+    EVENT(context, GLGetFragDataIndexEXT, "context = %d, program = %u, name = 0x%016" PRIxPTR "",
+          CID(context), program, (uintptr_t)name);
 
     GLint returnValue;
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetFragDataIndexEXT(context, programPacked, name));
@@ -3727,14 +3685,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetFragDataIndexEXT, GLint>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetFragDataIndexEXT, GLint>();
         }
         ANGLE_CAPTURE(GetFragDataIndexEXT, isCallValid, context, programPacked, name, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::GetFragDataIndexEXT, GLint>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetFragDataIndexEXT, GLint>();
     }
     return returnValue;
 }
@@ -3744,8 +3702,7 @@
                                                      const GLchar *name)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetProgramResourceLocationIndexEXT,
-          "glGetProgramResourceLocationIndexEXT",
+    EVENT(context, GLGetProgramResourceLocationIndexEXT,
           "context = %d, program = %u, programInterface = %s, name = 0x%016" PRIxPTR "",
           CID(context), program, GLenumToString(GLenumGroup::ProgramInterface, programInterface),
           (uintptr_t)name);
@@ -3753,7 +3710,7 @@
     GLint returnValue;
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGetProgramResourceLocationIndexEXT(
@@ -3766,7 +3723,8 @@
         else
         {
             returnValue =
-                GetDefaultReturnValue<EntryPoint::GetProgramResourceLocationIndexEXT, GLint>();
+                GetDefaultReturnValue<angle::EntryPoint::GLGetProgramResourceLocationIndexEXT,
+                                      GLint>();
         }
         ANGLE_CAPTURE(GetProgramResourceLocationIndexEXT, isCallValid, context, programPacked,
                       programInterface, name, returnValue);
@@ -3775,7 +3733,7 @@
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
         returnValue =
-            GetDefaultReturnValue<EntryPoint::GetProgramResourceLocationIndexEXT, GLint>();
+            GetDefaultReturnValue<angle::EntryPoint::GLGetProgramResourceLocationIndexEXT, GLint>();
     }
     return returnValue;
 }
@@ -3787,7 +3745,7 @@
                                   GLbitfield flags)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BufferStorageEXT, "glBufferStorageEXT",
+    EVENT(context, GLBufferStorageEXT,
           "context = %d, target = %s, size = %llu, data = 0x%016" PRIxPTR ", flags = %s",
           CID(context), GLenumToString(GLenumGroup::BufferStorageTarget, target),
           static_cast<unsigned long long>(size), (uintptr_t)data,
@@ -3795,7 +3753,7 @@
 
     if (context)
     {
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateBufferStorageEXT(context, targetPacked, size, data, flags));
@@ -3829,7 +3787,7 @@
                                      GLsizei srcDepth)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CopyImageSubDataEXT, "glCopyImageSubDataEXT",
+    EVENT(context, GLCopyImageSubDataEXT,
           "context = %d, srcName = %u, srcTarget = %s, srcLevel = %d, srcX = %d, srcY = %d, srcZ = "
           "%d, dstName = %u, dstTarget = %s, dstLevel = %d, dstX = %d, dstY = %d, dstZ = %d, "
           "srcWidth = %d, srcHeight = %d, srcDepth = %d",
@@ -3862,14 +3820,69 @@
     }
 }
 
+// GL_EXT_debug_label
+void GL_APIENTRY
+GetObjectLabelEXT(GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLGetObjectLabelEXT,
+          "context = %d, type = %s, object = %u, bufSize = %d, length = 0x%016" PRIxPTR
+          ", label = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::DefaultGroup, type), object, bufSize,
+          (uintptr_t)length, (uintptr_t)label);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetObjectLabelEXT(context, type, object, bufSize, length, label));
+        if (isCallValid)
+        {
+            context->getObjectLabel(type, object, bufSize, length, label);
+        }
+        ANGLE_CAPTURE(GetObjectLabelEXT, isCallValid, context, type, object, bufSize, length,
+                      label);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY LabelObjectEXT(GLenum type, GLuint object, GLsizei length, const GLchar *label)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLLabelObjectEXT,
+          "context = %d, type = %s, object = %u, length = %d, label = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::DefaultGroup, type), object, length,
+          (uintptr_t)label);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateLabelObjectEXT(context, type, object, length, label));
+        if (isCallValid)
+        {
+            context->labelObject(type, object, length, label);
+        }
+        ANGLE_CAPTURE(LabelObjectEXT, isCallValid, context, type, object, length, label);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
 // GL_EXT_debug_marker
 void GL_APIENTRY InsertEventMarkerEXT(GLsizei length, const GLchar *marker)
 {
     Context *context = GetValidGlobalContext();
     // Don't run the EVENT() macro on the EXT_debug_marker entry points.
     // It can interfere with the debug events being set by the caller.
-    // EVENT(context, gl::EntryPoint::InsertEventMarkerEXT, "glInsertEventMarkerEXT", "context = %d,
-    // length = %d, marker = 0x%016" PRIxPTR "", CID(context), length, (uintptr_t)marker);
+    // EVENT(context, GLInsertEventMarkerEXT, "context = %d, length = %d, marker = 0x%016" PRIxPTR
+    // "", CID(context), length, (uintptr_t)marker);
 
     if (context)
     {
@@ -3893,8 +3906,7 @@
     Context *context = GetValidGlobalContext();
     // Don't run the EVENT() macro on the EXT_debug_marker entry points.
     // It can interfere with the debug events being set by the caller.
-    // EVENT(context, gl::EntryPoint::PopGroupMarkerEXT, "glPopGroupMarkerEXT", "context = %d",
-    // CID(context));
+    // EVENT(context, GLPopGroupMarkerEXT, "context = %d", CID(context));
 
     if (context)
     {
@@ -3917,8 +3929,8 @@
     Context *context = GetValidGlobalContext();
     // Don't run the EVENT() macro on the EXT_debug_marker entry points.
     // It can interfere with the debug events being set by the caller.
-    // EVENT(context, gl::EntryPoint::PushGroupMarkerEXT, "glPushGroupMarkerEXT", "context = %d,
-    // length = %d, marker = 0x%016" PRIxPTR "", CID(context), length, (uintptr_t)marker);
+    // EVENT(context, GLPushGroupMarkerEXT, "context = %d, length = %d, marker = 0x%016" PRIxPTR "",
+    // CID(context), length, (uintptr_t)marker);
 
     if (context)
     {
@@ -3943,7 +3955,7 @@
                                        const GLenum *attachments)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DiscardFramebufferEXT, "glDiscardFramebufferEXT",
+    EVENT(context, GLDiscardFramebufferEXT,
           "context = %d, target = %s, numAttachments = %d, attachments = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target), numAttachments,
           (uintptr_t)attachments);
@@ -3971,14 +3983,13 @@
 void GL_APIENTRY BeginQueryEXT(GLenum target, GLuint id)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BeginQueryEXT, "glBeginQueryEXT",
-          "context = %d, target = %s, id = %u", CID(context),
+    EVENT(context, GLBeginQueryEXT, "context = %d, target = %s, id = %u", CID(context),
           GLenumToString(GLenumGroup::QueryTarget, target), id);
 
     if (context)
     {
-        QueryType targetPacked                                = FromGL<QueryType>(target);
-        QueryID idPacked                                      = FromGL<QueryID>(id);
+        QueryType targetPacked                                = PackParam<QueryType>(target);
+        QueryID idPacked                                      = PackParam<QueryID>(id);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateBeginQueryEXT(context, targetPacked, idPacked));
@@ -3997,12 +4008,12 @@
 void GL_APIENTRY DeleteQueriesEXT(GLsizei n, const GLuint *ids)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DeleteQueriesEXT, "glDeleteQueriesEXT",
-          "context = %d, n = %d, ids = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)ids);
+    EVENT(context, GLDeleteQueriesEXT, "context = %d, n = %d, ids = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)ids);
 
     if (context)
     {
-        const QueryID *idsPacked                              = FromGL<const QueryID *>(ids);
+        const QueryID *idsPacked                              = PackParam<const QueryID *>(ids);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateDeleteQueriesEXT(context, n, idsPacked));
@@ -4021,12 +4032,12 @@
 void GL_APIENTRY EndQueryEXT(GLenum target)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::EndQueryEXT, "glEndQueryEXT", "context = %d, target = %s",
-          CID(context), GLenumToString(GLenumGroup::QueryTarget, target));
+    EVENT(context, GLEndQueryEXT, "context = %d, target = %s", CID(context),
+          GLenumToString(GLenumGroup::QueryTarget, target));
 
     if (context)
     {
-        QueryType targetPacked                                = FromGL<QueryType>(target);
+        QueryType targetPacked                                = PackParam<QueryType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateEndQueryEXT(context, targetPacked));
@@ -4045,12 +4056,12 @@
 void GL_APIENTRY GenQueriesEXT(GLsizei n, GLuint *ids)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GenQueriesEXT, "glGenQueriesEXT",
-          "context = %d, n = %d, ids = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)ids);
+    EVENT(context, GLGenQueriesEXT, "context = %d, n = %d, ids = 0x%016" PRIxPTR "", CID(context),
+          n, (uintptr_t)ids);
 
     if (context)
     {
-        QueryID *idsPacked                                    = FromGL<QueryID *>(ids);
+        QueryID *idsPacked                                    = PackParam<QueryID *>(ids);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGenQueriesEXT(context, n, idsPacked));
@@ -4069,9 +4080,8 @@
 void GL_APIENTRY GetInteger64vEXT(GLenum pname, GLint64 *data)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetInteger64vEXT, "glGetInteger64vEXT",
-          "context = %d, pname = %s, data = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::GetPName, pname), (uintptr_t)data);
+    EVENT(context, GLGetInteger64vEXT, "context = %d, pname = %s, data = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::GetPName, pname), (uintptr_t)data);
 
     if (context)
     {
@@ -4093,13 +4103,13 @@
 void GL_APIENTRY GetQueryObjecti64vEXT(GLuint id, GLenum pname, GLint64 *params)
 {
     Context *context = GetGlobalContext();
-    EVENT(context, gl::EntryPoint::GetQueryObjecti64vEXT, "glGetQueryObjecti64vEXT",
+    EVENT(context, GLGetQueryObjecti64vEXT,
           "context = %d, id = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), id,
           GLenumToString(GLenumGroup::QueryObjectParameterName, pname), (uintptr_t)params);
 
     if (context)
     {
-        QueryID idPacked                                      = FromGL<QueryID>(id);
+        QueryID idPacked                                      = PackParam<QueryID>(id);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetQueryObjecti64vEXT(context, idPacked, pname, params));
@@ -4116,13 +4126,13 @@
 void GL_APIENTRY GetQueryObjectivEXT(GLuint id, GLenum pname, GLint *params)
 {
     Context *context = GetGlobalContext();
-    EVENT(context, gl::EntryPoint::GetQueryObjectivEXT, "glGetQueryObjectivEXT",
+    EVENT(context, GLGetQueryObjectivEXT,
           "context = %d, id = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), id,
           GLenumToString(GLenumGroup::QueryObjectParameterName, pname), (uintptr_t)params);
 
     if (context)
     {
-        QueryID idPacked                                      = FromGL<QueryID>(id);
+        QueryID idPacked                                      = PackParam<QueryID>(id);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetQueryObjectivEXT(context, idPacked, pname, params));
@@ -4139,13 +4149,13 @@
 void GL_APIENTRY GetQueryObjectui64vEXT(GLuint id, GLenum pname, GLuint64 *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetQueryObjectui64vEXT, "glGetQueryObjectui64vEXT",
+    EVENT(context, GLGetQueryObjectui64vEXT,
           "context = %d, id = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), id,
           GLenumToString(GLenumGroup::QueryObjectParameterName, pname), (uintptr_t)params);
 
     if (context)
     {
-        QueryID idPacked                                      = FromGL<QueryID>(id);
+        QueryID idPacked                                      = PackParam<QueryID>(id);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetQueryObjectui64vEXT(context, idPacked, pname, params));
@@ -4164,13 +4174,13 @@
 void GL_APIENTRY GetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetQueryObjectuivEXT, "glGetQueryObjectuivEXT",
+    EVENT(context, GLGetQueryObjectuivEXT,
           "context = %d, id = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), id,
           GLenumToString(GLenumGroup::QueryObjectParameterName, pname), (uintptr_t)params);
 
     if (context)
     {
-        QueryID idPacked                                      = FromGL<QueryID>(id);
+        QueryID idPacked                                      = PackParam<QueryID>(id);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetQueryObjectuivEXT(context, idPacked, pname, params));
@@ -4189,14 +4199,14 @@
 void GL_APIENTRY GetQueryivEXT(GLenum target, GLenum pname, GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetQueryivEXT, "glGetQueryivEXT",
+    EVENT(context, GLGetQueryivEXT,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::QueryTarget, target),
           GLenumToString(GLenumGroup::QueryParameterName, pname), (uintptr_t)params);
 
     if (context)
     {
-        QueryType targetPacked                                = FromGL<QueryType>(target);
+        QueryType targetPacked                                = PackParam<QueryType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetQueryivEXT(context, targetPacked, pname, params));
@@ -4215,13 +4225,12 @@
 GLboolean GL_APIENTRY IsQueryEXT(GLuint id)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IsQueryEXT, "glIsQueryEXT", "context = %d, id = %u",
-          CID(context), id);
+    EVENT(context, GLIsQueryEXT, "context = %d, id = %u", CID(context), id);
 
     GLboolean returnValue;
     if (context)
     {
-        QueryID idPacked                                      = FromGL<QueryID>(id);
+        QueryID idPacked                                      = PackParam<QueryID>(id);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateIsQueryEXT(context, idPacked));
         if (isCallValid)
@@ -4230,14 +4239,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsQueryEXT, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsQueryEXT, GLboolean>();
         }
         ANGLE_CAPTURE(IsQueryEXT, isCallValid, context, idPacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::IsQueryEXT, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsQueryEXT, GLboolean>();
     }
     return returnValue;
 }
@@ -4245,14 +4254,13 @@
 void GL_APIENTRY QueryCounterEXT(GLuint id, GLenum target)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::QueryCounterEXT, "glQueryCounterEXT",
-          "context = %d, id = %u, target = %s", CID(context), id,
+    EVENT(context, GLQueryCounterEXT, "context = %d, id = %u, target = %s", CID(context), id,
           GLenumToString(GLenumGroup::QueryTarget, target));
 
     if (context)
     {
-        QueryID idPacked                                      = FromGL<QueryID>(id);
-        QueryType targetPacked                                = FromGL<QueryType>(target);
+        QueryID idPacked                                      = PackParam<QueryID>(id);
+        QueryType targetPacked                                = PackParam<QueryType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateQueryCounterEXT(context, idPacked, targetPacked));
@@ -4272,8 +4280,8 @@
 void GL_APIENTRY DrawBuffersEXT(GLsizei n, const GLenum *bufs)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawBuffersEXT, "glDrawBuffersEXT",
-          "context = %d, n = %d, bufs = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)bufs);
+    EVENT(context, GLDrawBuffersEXT, "context = %d, n = %d, bufs = 0x%016" PRIxPTR "", CID(context),
+          n, (uintptr_t)bufs);
 
     if (context)
     {
@@ -4295,7 +4303,7 @@
 void GL_APIENTRY BlendEquationSeparateiEXT(GLuint buf, GLenum modeRGB, GLenum modeAlpha)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BlendEquationSeparateiEXT, "glBlendEquationSeparateiEXT",
+    EVENT(context, GLBlendEquationSeparateiEXT,
           "context = %d, buf = %u, modeRGB = %s, modeAlpha = %s", CID(context), buf,
           GLenumToString(GLenumGroup::BlendEquationModeEXT, modeRGB),
           GLenumToString(GLenumGroup::BlendEquationModeEXT, modeAlpha));
@@ -4320,8 +4328,7 @@
 void GL_APIENTRY BlendEquationiEXT(GLuint buf, GLenum mode)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BlendEquationiEXT, "glBlendEquationiEXT",
-          "context = %d, buf = %u, mode = %s", CID(context), buf,
+    EVENT(context, GLBlendEquationiEXT, "context = %d, buf = %u, mode = %s", CID(context), buf,
           GLenumToString(GLenumGroup::BlendEquationModeEXT, mode));
 
     if (context)
@@ -4345,7 +4352,7 @@
 BlendFuncSeparateiEXT(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BlendFuncSeparateiEXT, "glBlendFuncSeparateiEXT",
+    EVENT(context, GLBlendFuncSeparateiEXT,
           "context = %d, buf = %u, srcRGB = %s, dstRGB = %s, srcAlpha = %s, dstAlpha = %s",
           CID(context), buf, GLenumToString(GLenumGroup::BlendingFactor, srcRGB),
           GLenumToString(GLenumGroup::BlendingFactor, dstRGB),
@@ -4374,8 +4381,7 @@
 void GL_APIENTRY BlendFunciEXT(GLuint buf, GLenum src, GLenum dst)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BlendFunciEXT, "glBlendFunciEXT",
-          "context = %d, buf = %u, src = %s, dst = %s", CID(context), buf,
+    EVENT(context, GLBlendFunciEXT, "context = %d, buf = %u, src = %s, dst = %s", CID(context), buf,
           GLenumToString(GLenumGroup::BlendingFactor, src),
           GLenumToString(GLenumGroup::BlendingFactor, dst));
 
@@ -4399,9 +4405,9 @@
 void GL_APIENTRY ColorMaskiEXT(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ColorMaskiEXT, "glColorMaskiEXT",
-          "context = %d, index = %u, r = %s, g = %s, b = %s, a = %s", CID(context), index,
-          GLbooleanToString(r), GLbooleanToString(g), GLbooleanToString(b), GLbooleanToString(a));
+    EVENT(context, GLColorMaskiEXT, "context = %d, index = %u, r = %s, g = %s, b = %s, a = %s",
+          CID(context), index, GLbooleanToString(r), GLbooleanToString(g), GLbooleanToString(b),
+          GLbooleanToString(a));
 
     if (context)
     {
@@ -4423,8 +4429,7 @@
 void GL_APIENTRY DisableiEXT(GLenum target, GLuint index)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DisableiEXT, "glDisableiEXT",
-          "context = %d, target = %s, index = %u", CID(context),
+    EVENT(context, GLDisableiEXT, "context = %d, target = %s, index = %u", CID(context),
           GLenumToString(GLenumGroup::EnableCap, target), index);
 
     if (context)
@@ -4447,8 +4452,7 @@
 void GL_APIENTRY EnableiEXT(GLenum target, GLuint index)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::EnableiEXT, "glEnableiEXT",
-          "context = %d, target = %s, index = %u", CID(context),
+    EVENT(context, GLEnableiEXT, "context = %d, target = %s, index = %u", CID(context),
           GLenumToString(GLenumGroup::EnableCap, target), index);
 
     if (context)
@@ -4471,8 +4475,7 @@
 GLboolean GL_APIENTRY IsEnablediEXT(GLenum target, GLuint index)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IsEnablediEXT, "glIsEnablediEXT",
-          "context = %d, target = %s, index = %u", CID(context),
+    EVENT(context, GLIsEnablediEXT, "context = %d, target = %s, index = %u", CID(context),
           GLenumToString(GLenumGroup::EnableCap, target), index);
 
     GLboolean returnValue;
@@ -4487,14 +4490,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsEnablediEXT, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsEnablediEXT, GLboolean>();
         }
         ANGLE_CAPTURE(IsEnablediEXT, isCallValid, context, target, index, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::IsEnablediEXT, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsEnablediEXT, GLboolean>();
     }
     return returnValue;
 }
@@ -4507,7 +4510,7 @@
                                            GLint basevertex)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawElementsBaseVertexEXT, "glDrawElementsBaseVertexEXT",
+    EVENT(context, GLDrawElementsBaseVertexEXT,
           "context = %d, mode = %s, count = %d, type = %s, indices = 0x%016" PRIxPTR
           ", basevertex = %d",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), count,
@@ -4515,8 +4518,8 @@
 
     if (context)
     {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateDrawElementsBaseVertexEXT(context, modePacked, count,
@@ -4542,8 +4545,7 @@
                                                     GLint basevertex)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawElementsInstancedBaseVertexEXT,
-          "glDrawElementsInstancedBaseVertexEXT",
+    EVENT(context, GLDrawElementsInstancedBaseVertexEXT,
           "context = %d, mode = %s, count = %d, type = %s, indices = 0x%016" PRIxPTR
           ", instancecount = %d, basevertex = %d",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), count,
@@ -4552,8 +4554,8 @@
 
     if (context)
     {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateDrawElementsInstancedBaseVertexEXT(
                                                              context, modePacked, count, typePacked,
@@ -4581,8 +4583,7 @@
                                                 GLint basevertex)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawRangeElementsBaseVertexEXT,
-          "glDrawRangeElementsBaseVertexEXT",
+    EVENT(context, GLDrawRangeElementsBaseVertexEXT,
           "context = %d, mode = %s, start = %u, end = %u, count = %d, type = %s, indices = "
           "0x%016" PRIxPTR ", basevertex = %d",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), start, end, count,
@@ -4590,8 +4591,8 @@
 
     if (context)
     {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateDrawRangeElementsBaseVertexEXT(
                                                              context, modePacked, start, end, count,
@@ -4618,8 +4619,7 @@
                                                 const GLint *basevertex)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MultiDrawElementsBaseVertexEXT,
-          "glMultiDrawElementsBaseVertexEXT",
+    EVENT(context, GLMultiDrawElementsBaseVertexEXT,
           "context = %d, mode = %s, count = 0x%016" PRIxPTR ", type = %s, indices = 0x%016" PRIxPTR
           ", primcount = %d, basevertex = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), (uintptr_t)count,
@@ -4628,8 +4628,8 @@
 
     if (context)
     {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateMultiDrawElementsBaseVertexEXT(
                                                              context, modePacked, count, typePacked,
@@ -4656,7 +4656,7 @@
                                           GLbitfield flags)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BufferStorageExternalEXT, "glBufferStorageExternalEXT",
+    EVENT(context, GLBufferStorageExternalEXT,
           "context = %d, target = %s, offset = %llu, size = %llu, clientBuffer = 0x%016" PRIxPTR
           ", flags = %s",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target),
@@ -4666,7 +4666,7 @@
 
     if (context)
     {
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateBufferStorageExternalEXT(context, targetPacked, offset, size,
@@ -4691,7 +4691,7 @@
                                                GLbitfield flags)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::NamedBufferStorageExternalEXT, "glNamedBufferStorageExternalEXT",
+    EVENT(context, GLNamedBufferStorageExternalEXT,
           "context = %d, buffer = %u, offset = %llu, size = %llu, clientBuffer = 0x%016" PRIxPTR
           ", flags = %s",
           CID(context), buffer, static_cast<unsigned long long>(offset),
@@ -4724,14 +4724,14 @@
                                        GLint level)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::FramebufferTextureEXT, "glFramebufferTextureEXT",
+    EVENT(context, GLFramebufferTextureEXT,
           "context = %d, target = %s, attachment = %s, texture = %u, level = %d", CID(context),
           GLenumToString(GLenumGroup::FramebufferTarget, target),
           GLenumToString(GLenumGroup::FramebufferAttachment, attachment), texture, level);
 
     if (context)
     {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -4753,13 +4753,13 @@
 void GL_APIENTRY DrawArraysInstancedEXT(GLenum mode, GLint start, GLsizei count, GLsizei primcount)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawArraysInstancedEXT, "glDrawArraysInstancedEXT",
+    EVENT(context, GLDrawArraysInstancedEXT,
           "context = %d, mode = %s, start = %d, count = %d, primcount = %d", CID(context),
           GLenumToString(GLenumGroup::PrimitiveType, mode), start, count, primcount);
 
     if (context)
     {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -4784,7 +4784,7 @@
                                           GLsizei primcount)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawElementsInstancedEXT, "glDrawElementsInstancedEXT",
+    EVENT(context, GLDrawElementsInstancedEXT,
           "context = %d, mode = %s, count = %d, type = %s, indices = 0x%016" PRIxPTR
           ", primcount = %d",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), count,
@@ -4792,8 +4792,8 @@
 
     if (context)
     {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateDrawElementsInstancedEXT(context, modePacked, count, typePacked,
@@ -4814,8 +4814,8 @@
 void GL_APIENTRY VertexAttribDivisorEXT(GLuint index, GLuint divisor)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::VertexAttribDivisorEXT, "glVertexAttribDivisorEXT",
-          "context = %d, index = %u, divisor = %u", CID(context), index, divisor);
+    EVENT(context, GLVertexAttribDivisorEXT, "context = %d, index = %u, divisor = %u", CID(context),
+          index, divisor);
 
     if (context)
     {
@@ -4838,14 +4838,14 @@
 void GL_APIENTRY FlushMappedBufferRangeEXT(GLenum target, GLintptr offset, GLsizeiptr length)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::FlushMappedBufferRangeEXT, "glFlushMappedBufferRangeEXT",
+    EVENT(context, GLFlushMappedBufferRangeEXT,
           "context = %d, target = %s, offset = %llu, length = %llu", CID(context),
           GLenumToString(GLenumGroup::BufferTargetARB, target),
           static_cast<unsigned long long>(offset), static_cast<unsigned long long>(length));
 
     if (context)
     {
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -4869,7 +4869,7 @@
                                     GLbitfield access)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MapBufferRangeEXT, "glMapBufferRangeEXT",
+    EVENT(context, GLMapBufferRangeEXT,
           "context = %d, target = %s, offset = %llu, length = %llu, access = %s", CID(context),
           GLenumToString(GLenumGroup::BufferTargetARB, target),
           static_cast<unsigned long long>(offset), static_cast<unsigned long long>(length),
@@ -4878,7 +4878,7 @@
     void *returnValue;
     if (context)
     {
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -4889,7 +4889,7 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::MapBufferRangeEXT, void *>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLMapBufferRangeEXT, void *>();
         }
         ANGLE_CAPTURE(MapBufferRangeEXT, isCallValid, context, targetPacked, offset, length, access,
                       returnValue);
@@ -4897,7 +4897,7 @@
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::MapBufferRangeEXT, void *>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLMapBufferRangeEXT, void *>();
     }
     return returnValue;
 }
@@ -4906,15 +4906,15 @@
 void GL_APIENTRY BufferStorageMemEXT(GLenum target, GLsizeiptr size, GLuint memory, GLuint64 offset)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BufferStorageMemEXT, "glBufferStorageMemEXT",
+    EVENT(context, GLBufferStorageMemEXT,
           "context = %d, target = %s, size = %llu, memory = %u, offset = %llu", CID(context),
           GLenumToString(GLenumGroup::BufferTargetARB, target),
           static_cast<unsigned long long>(size), memory, static_cast<unsigned long long>(offset));
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        MemoryObjectID memoryPacked                           = FromGL<MemoryObjectID>(memory);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        MemoryObjectID memoryPacked                           = PackParam<MemoryObjectID>(memory);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -4935,13 +4935,13 @@
 void GL_APIENTRY CreateMemoryObjectsEXT(GLsizei n, GLuint *memoryObjects)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CreateMemoryObjectsEXT, "glCreateMemoryObjectsEXT",
+    EVENT(context, GLCreateMemoryObjectsEXT,
           "context = %d, n = %d, memoryObjects = 0x%016" PRIxPTR "", CID(context), n,
           (uintptr_t)memoryObjects);
 
     if (context)
     {
-        MemoryObjectID *memoryObjectsPacked = FromGL<MemoryObjectID *>(memoryObjects);
+        MemoryObjectID *memoryObjectsPacked = PackParam<MemoryObjectID *>(memoryObjects);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateCreateMemoryObjectsEXT(context, n, memoryObjectsPacked));
@@ -4960,13 +4960,14 @@
 void GL_APIENTRY DeleteMemoryObjectsEXT(GLsizei n, const GLuint *memoryObjects)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DeleteMemoryObjectsEXT, "glDeleteMemoryObjectsEXT",
+    EVENT(context, GLDeleteMemoryObjectsEXT,
           "context = %d, n = %d, memoryObjects = 0x%016" PRIxPTR "", CID(context), n,
           (uintptr_t)memoryObjects);
 
     if (context)
     {
-        const MemoryObjectID *memoryObjectsPacked = FromGL<const MemoryObjectID *>(memoryObjects);
+        const MemoryObjectID *memoryObjectsPacked =
+            PackParam<const MemoryObjectID *>(memoryObjects);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateDeleteMemoryObjectsEXT(context, n, memoryObjectsPacked));
@@ -4985,14 +4986,14 @@
 void GL_APIENTRY GetMemoryObjectParameterivEXT(GLuint memoryObject, GLenum pname, GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetMemoryObjectParameterivEXT, "glGetMemoryObjectParameterivEXT",
+    EVENT(context, GLGetMemoryObjectParameterivEXT,
           "context = %d, memoryObject = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           memoryObject, GLenumToString(GLenumGroup::MemoryObjectParameterName, pname),
           (uintptr_t)params);
 
     if (context)
     {
-        MemoryObjectID memoryObjectPacked = FromGL<MemoryObjectID>(memoryObject);
+        MemoryObjectID memoryObjectPacked = PackParam<MemoryObjectID>(memoryObject);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -5013,9 +5014,8 @@
 void GL_APIENTRY GetUnsignedBytevEXT(GLenum pname, GLubyte *data)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetUnsignedBytevEXT, "glGetUnsignedBytevEXT",
-          "context = %d, pname = %s, data = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::GetPName, pname), (uintptr_t)data);
+    EVENT(context, GLGetUnsignedBytevEXT, "context = %d, pname = %s, data = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::GetPName, pname), (uintptr_t)data);
 
     if (context)
     {
@@ -5037,7 +5037,7 @@
 void GL_APIENTRY GetUnsignedBytei_vEXT(GLenum target, GLuint index, GLubyte *data)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetUnsignedBytei_vEXT, "glGetUnsignedBytei_vEXT",
+    EVENT(context, GLGetUnsignedBytei_vEXT,
           "context = %d, target = %s, index = %u, data = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::DefaultGroup, target), index, (uintptr_t)data);
 
@@ -5061,13 +5061,13 @@
 GLboolean GL_APIENTRY IsMemoryObjectEXT(GLuint memoryObject)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IsMemoryObjectEXT, "glIsMemoryObjectEXT",
-          "context = %d, memoryObject = %u", CID(context), memoryObject);
+    EVENT(context, GLIsMemoryObjectEXT, "context = %d, memoryObject = %u", CID(context),
+          memoryObject);
 
     GLboolean returnValue;
     if (context)
     {
-        MemoryObjectID memoryObjectPacked = FromGL<MemoryObjectID>(memoryObject);
+        MemoryObjectID memoryObjectPacked = PackParam<MemoryObjectID>(memoryObject);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateIsMemoryObjectEXT(context, memoryObjectPacked));
@@ -5077,14 +5077,15 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsMemoryObjectEXT, GLboolean>();
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLIsMemoryObjectEXT, GLboolean>();
         }
         ANGLE_CAPTURE(IsMemoryObjectEXT, isCallValid, context, memoryObjectPacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::IsMemoryObjectEXT, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsMemoryObjectEXT, GLboolean>();
     }
     return returnValue;
 }
@@ -5092,14 +5093,14 @@
 void GL_APIENTRY MemoryObjectParameterivEXT(GLuint memoryObject, GLenum pname, const GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MemoryObjectParameterivEXT, "glMemoryObjectParameterivEXT",
+    EVENT(context, GLMemoryObjectParameterivEXT,
           "context = %d, memoryObject = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           memoryObject, GLenumToString(GLenumGroup::MemoryObjectParameterName, pname),
           (uintptr_t)params);
 
     if (context)
     {
-        MemoryObjectID memoryObjectPacked = FromGL<MemoryObjectID>(memoryObject);
+        MemoryObjectID memoryObjectPacked = PackParam<MemoryObjectID>(memoryObject);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -5126,7 +5127,7 @@
                                     GLuint64 offset)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexStorageMem2DEXT, "glTexStorageMem2DEXT",
+    EVENT(context, GLTexStorageMem2DEXT,
           "context = %d, target = %s, levels = %d, internalFormat = %s, width = %d, height = %d, "
           "memory = %u, offset = %llu",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), levels,
@@ -5135,8 +5136,8 @@
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        MemoryObjectID memoryPacked                           = FromGL<MemoryObjectID>(memory);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        MemoryObjectID memoryPacked                           = PackParam<MemoryObjectID>(memory);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -5166,7 +5167,7 @@
                                                GLuint64 offset)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexStorageMem2DMultisampleEXT, "glTexStorageMem2DMultisampleEXT",
+    EVENT(context, GLTexStorageMem2DMultisampleEXT,
           "context = %d, target = %s, samples = %d, internalFormat = %s, width = %d, height = %d, "
           "fixedSampleLocations = %s, memory = %u, offset = %llu",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), samples,
@@ -5175,8 +5176,8 @@
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        MemoryObjectID memoryPacked                           = FromGL<MemoryObjectID>(memory);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        MemoryObjectID memoryPacked                           = PackParam<MemoryObjectID>(memory);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateTexStorageMem2DMultisampleEXT(
@@ -5206,7 +5207,7 @@
                                     GLuint64 offset)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexStorageMem3DEXT, "glTexStorageMem3DEXT",
+    EVENT(context, GLTexStorageMem3DEXT,
           "context = %d, target = %s, levels = %d, internalFormat = %s, width = %d, height = %d, "
           "depth = %d, memory = %u, offset = %llu",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), levels,
@@ -5215,8 +5216,8 @@
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        MemoryObjectID memoryPacked                           = FromGL<MemoryObjectID>(memory);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        MemoryObjectID memoryPacked                           = PackParam<MemoryObjectID>(memory);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -5247,7 +5248,7 @@
                                                GLuint64 offset)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexStorageMem3DMultisampleEXT, "glTexStorageMem3DMultisampleEXT",
+    EVENT(context, GLTexStorageMem3DMultisampleEXT,
           "context = %d, target = %s, samples = %d, internalFormat = %s, width = %d, height = %d, "
           "depth = %d, fixedSampleLocations = %s, memory = %u, offset = %llu",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), samples,
@@ -5256,8 +5257,8 @@
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        MemoryObjectID memoryPacked                           = FromGL<MemoryObjectID>(memory);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        MemoryObjectID memoryPacked                           = PackParam<MemoryObjectID>(memory);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexStorageMem3DMultisampleEXT(
@@ -5283,15 +5284,15 @@
 void GL_APIENTRY ImportMemoryFdEXT(GLuint memory, GLuint64 size, GLenum handleType, GLint fd)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ImportMemoryFdEXT, "glImportMemoryFdEXT",
+    EVENT(context, GLImportMemoryFdEXT,
           "context = %d, memory = %u, size = %llu, handleType = %s, fd = %d", CID(context), memory,
           static_cast<unsigned long long>(size),
           GLenumToString(GLenumGroup::ExternalHandleType, handleType), fd);
 
     if (context)
     {
-        MemoryObjectID memoryPacked                           = FromGL<MemoryObjectID>(memory);
-        HandleType handleTypePacked                           = FromGL<HandleType>(handleType);
+        MemoryObjectID memoryPacked                           = PackParam<MemoryObjectID>(memory);
+        HandleType handleTypePacked                           = PackParam<HandleType>(handleType);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -5318,8 +5319,7 @@
                                                     GLsizei samples)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::FramebufferTexture2DMultisampleEXT,
-          "glFramebufferTexture2DMultisampleEXT",
+    EVENT(context, GLFramebufferTexture2DMultisampleEXT,
           "context = %d, target = %s, attachment = %s, textarget = %s, texture = %u, level = %d, "
           "samples = %d",
           CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target),
@@ -5328,8 +5328,8 @@
 
     if (context)
     {
-        TextureTarget textargetPacked                         = FromGL<TextureTarget>(textarget);
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
+        TextureTarget textargetPacked                         = PackParam<TextureTarget>(textarget);
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -5356,8 +5356,7 @@
                                                    GLsizei height)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::RenderbufferStorageMultisampleEXT,
-          "glRenderbufferStorageMultisampleEXT",
+    EVENT(context, GLRenderbufferStorageMultisampleEXT,
           "context = %d, target = %s, samples = %d, internalformat = %s, width = %d, height = %d",
           CID(context), GLenumToString(GLenumGroup::RenderbufferTarget, target), samples,
           GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height);
@@ -5403,8 +5402,7 @@
 GLenum GL_APIENTRY GetGraphicsResetStatusEXT()
 {
     Context *context = GetGlobalContext();
-    EVENT(context, gl::EntryPoint::GetGraphicsResetStatusEXT, "glGetGraphicsResetStatusEXT",
-          "context = %d", CID(context));
+    EVENT(context, GLGetGraphicsResetStatusEXT, "context = %d", CID(context));
 
     GLenum returnValue;
     if (context)
@@ -5418,14 +5416,16 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetGraphicsResetStatusEXT, GLenum>();
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLGetGraphicsResetStatusEXT, GLenum>();
         }
         ANGLE_CAPTURE(GetGraphicsResetStatusEXT, isCallValid, context, returnValue);
     }
     else
     {
 
-        returnValue = GetDefaultReturnValue<EntryPoint::GetGraphicsResetStatusEXT, GLenum>();
+        returnValue =
+            GetDefaultReturnValue<angle::EntryPoint::GLGetGraphicsResetStatusEXT, GLenum>();
     }
     return returnValue;
 }
@@ -5433,14 +5433,14 @@
 void GL_APIENTRY GetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetnUniformfvEXT, "glGetnUniformfvEXT",
+    EVENT(context, GLGetnUniformfvEXT,
           "context = %d, program = %u, location = %d, bufSize = %d, params = 0x%016" PRIxPTR "",
           CID(context), program, location, bufSize, (uintptr_t)params);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -5461,14 +5461,14 @@
 void GL_APIENTRY GetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetnUniformivEXT, "glGetnUniformivEXT",
+    EVENT(context, GLGetnUniformivEXT,
           "context = %d, program = %u, location = %d, bufSize = %d, params = 0x%016" PRIxPTR "",
           CID(context), program, location, bufSize, (uintptr_t)params);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -5496,7 +5496,7 @@
                                 void *data)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ReadnPixelsEXT, "glReadnPixelsEXT",
+    EVENT(context, GLReadnPixelsEXT,
           "context = %d, x = %d, y = %d, width = %d, height = %d, format = %s, type = %s, bufSize "
           "= %d, data = 0x%016" PRIxPTR "",
           CID(context), x, y, width, height, GLenumToString(GLenumGroup::PixelFormat, format),
@@ -5527,13 +5527,12 @@
 void GL_APIENTRY DeleteSemaphoresEXT(GLsizei n, const GLuint *semaphores)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DeleteSemaphoresEXT, "glDeleteSemaphoresEXT",
-          "context = %d, n = %d, semaphores = 0x%016" PRIxPTR "", CID(context), n,
-          (uintptr_t)semaphores);
+    EVENT(context, GLDeleteSemaphoresEXT, "context = %d, n = %d, semaphores = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)semaphores);
 
     if (context)
     {
-        const SemaphoreID *semaphoresPacked = FromGL<const SemaphoreID *>(semaphores);
+        const SemaphoreID *semaphoresPacked = PackParam<const SemaphoreID *>(semaphores);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateDeleteSemaphoresEXT(context, n, semaphoresPacked));
@@ -5552,13 +5551,12 @@
 void GL_APIENTRY GenSemaphoresEXT(GLsizei n, GLuint *semaphores)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GenSemaphoresEXT, "glGenSemaphoresEXT",
-          "context = %d, n = %d, semaphores = 0x%016" PRIxPTR "", CID(context), n,
-          (uintptr_t)semaphores);
+    EVENT(context, GLGenSemaphoresEXT, "context = %d, n = %d, semaphores = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)semaphores);
 
     if (context)
     {
-        SemaphoreID *semaphoresPacked                         = FromGL<SemaphoreID *>(semaphores);
+        SemaphoreID *semaphoresPacked = PackParam<SemaphoreID *>(semaphores);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGenSemaphoresEXT(context, n, semaphoresPacked));
@@ -5577,13 +5575,13 @@
 void GL_APIENTRY GetSemaphoreParameterui64vEXT(GLuint semaphore, GLenum pname, GLuint64 *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetSemaphoreParameterui64vEXT, "glGetSemaphoreParameterui64vEXT",
+    EVENT(context, GLGetSemaphoreParameterui64vEXT,
           "context = %d, semaphore = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           semaphore, GLenumToString(GLenumGroup::SemaphoreParameterName, pname), (uintptr_t)params);
 
     if (context)
     {
-        SemaphoreID semaphorePacked                           = FromGL<SemaphoreID>(semaphore);
+        SemaphoreID semaphorePacked                           = PackParam<SemaphoreID>(semaphore);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -5604,13 +5602,12 @@
 GLboolean GL_APIENTRY IsSemaphoreEXT(GLuint semaphore)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IsSemaphoreEXT, "glIsSemaphoreEXT",
-          "context = %d, semaphore = %u", CID(context), semaphore);
+    EVENT(context, GLIsSemaphoreEXT, "context = %d, semaphore = %u", CID(context), semaphore);
 
     GLboolean returnValue;
     if (context)
     {
-        SemaphoreID semaphorePacked                           = FromGL<SemaphoreID>(semaphore);
+        SemaphoreID semaphorePacked                           = PackParam<SemaphoreID>(semaphore);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateIsSemaphoreEXT(context, semaphorePacked));
@@ -5620,14 +5617,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsSemaphoreEXT, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsSemaphoreEXT, GLboolean>();
         }
         ANGLE_CAPTURE(IsSemaphoreEXT, isCallValid, context, semaphorePacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::IsSemaphoreEXT, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsSemaphoreEXT, GLboolean>();
     }
     return returnValue;
 }
@@ -5635,13 +5632,13 @@
 void GL_APIENTRY SemaphoreParameterui64vEXT(GLuint semaphore, GLenum pname, const GLuint64 *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SemaphoreParameterui64vEXT, "glSemaphoreParameterui64vEXT",
+    EVENT(context, GLSemaphoreParameterui64vEXT,
           "context = %d, semaphore = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           semaphore, GLenumToString(GLenumGroup::SemaphoreParameterName, pname), (uintptr_t)params);
 
     if (context)
     {
-        SemaphoreID semaphorePacked                           = FromGL<SemaphoreID>(semaphore);
+        SemaphoreID semaphorePacked                           = PackParam<SemaphoreID>(semaphore);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -5667,7 +5664,7 @@
                                     const GLenum *dstLayouts)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SignalSemaphoreEXT, "glSignalSemaphoreEXT",
+    EVENT(context, GLSignalSemaphoreEXT,
           "context = %d, semaphore = %u, numBufferBarriers = %u, buffers = 0x%016" PRIxPTR
           ", numTextureBarriers = %u, textures = 0x%016" PRIxPTR ", dstLayouts = 0x%016" PRIxPTR "",
           CID(context), semaphore, numBufferBarriers, (uintptr_t)buffers, numTextureBarriers,
@@ -5675,9 +5672,9 @@
 
     if (context)
     {
-        SemaphoreID semaphorePacked                           = FromGL<SemaphoreID>(semaphore);
-        const BufferID *buffersPacked                         = FromGL<const BufferID *>(buffers);
-        const TextureID *texturesPacked                       = FromGL<const TextureID *>(textures);
+        SemaphoreID semaphorePacked     = PackParam<SemaphoreID>(semaphore);
+        const BufferID *buffersPacked   = PackParam<const BufferID *>(buffers);
+        const TextureID *texturesPacked = PackParam<const TextureID *>(textures);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -5705,7 +5702,7 @@
                                   const GLenum *srcLayouts)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::WaitSemaphoreEXT, "glWaitSemaphoreEXT",
+    EVENT(context, GLWaitSemaphoreEXT,
           "context = %d, semaphore = %u, numBufferBarriers = %u, buffers = 0x%016" PRIxPTR
           ", numTextureBarriers = %u, textures = 0x%016" PRIxPTR ", srcLayouts = 0x%016" PRIxPTR "",
           CID(context), semaphore, numBufferBarriers, (uintptr_t)buffers, numTextureBarriers,
@@ -5713,9 +5710,9 @@
 
     if (context)
     {
-        SemaphoreID semaphorePacked                           = FromGL<SemaphoreID>(semaphore);
-        const BufferID *buffersPacked                         = FromGL<const BufferID *>(buffers);
-        const TextureID *texturesPacked                       = FromGL<const TextureID *>(textures);
+        SemaphoreID semaphorePacked     = PackParam<SemaphoreID>(semaphore);
+        const BufferID *buffersPacked   = PackParam<const BufferID *>(buffers);
+        const TextureID *texturesPacked = PackParam<const TextureID *>(textures);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -5743,14 +5740,13 @@
 void GL_APIENTRY ImportSemaphoreFdEXT(GLuint semaphore, GLenum handleType, GLint fd)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ImportSemaphoreFdEXT, "glImportSemaphoreFdEXT",
-          "context = %d, semaphore = %u, handleType = %s, fd = %d", CID(context), semaphore,
-          GLenumToString(GLenumGroup::ExternalHandleType, handleType), fd);
+    EVENT(context, GLImportSemaphoreFdEXT, "context = %d, semaphore = %u, handleType = %s, fd = %d",
+          CID(context), semaphore, GLenumToString(GLenumGroup::ExternalHandleType, handleType), fd);
 
     if (context)
     {
-        SemaphoreID semaphorePacked                           = FromGL<SemaphoreID>(semaphore);
-        HandleType handleTypePacked                           = FromGL<HandleType>(handleType);
+        SemaphoreID semaphorePacked                           = PackParam<SemaphoreID>(semaphore);
+        HandleType handleTypePacked                           = PackParam<HandleType>(handleType);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -5772,13 +5768,13 @@
 void GL_APIENTRY ActiveShaderProgramEXT(GLuint pipeline, GLuint program)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ActiveShaderProgramEXT, "glActiveShaderProgramEXT",
-          "context = %d, pipeline = %u, program = %u", CID(context), pipeline, program);
+    EVENT(context, GLActiveShaderProgramEXT, "context = %d, pipeline = %u, program = %u",
+          CID(context), pipeline, program);
 
     if (context)
     {
-        ProgramPipelineID pipelinePacked                      = FromGL<ProgramPipelineID>(pipeline);
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ProgramPipelineID pipelinePacked = PackParam<ProgramPipelineID>(pipeline);
+        ShaderProgramID programPacked    = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateActiveShaderProgramEXT(context, pipelinePacked, programPacked));
@@ -5797,12 +5793,11 @@
 void GL_APIENTRY BindProgramPipelineEXT(GLuint pipeline)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindProgramPipelineEXT, "glBindProgramPipelineEXT",
-          "context = %d, pipeline = %u", CID(context), pipeline);
+    EVENT(context, GLBindProgramPipelineEXT, "context = %d, pipeline = %u", CID(context), pipeline);
 
     if (context)
     {
-        ProgramPipelineID pipelinePacked                      = FromGL<ProgramPipelineID>(pipeline);
+        ProgramPipelineID pipelinePacked = PackParam<ProgramPipelineID>(pipeline);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateBindProgramPipelineEXT(context, pipelinePacked));
@@ -5821,14 +5816,14 @@
 GLuint GL_APIENTRY CreateShaderProgramvEXT(GLenum type, GLsizei count, const GLchar **strings)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CreateShaderProgramvEXT, "glCreateShaderProgramvEXT",
+    EVENT(context, GLCreateShaderProgramvEXT,
           "context = %d, type = %s, count = %d, strings = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::ShaderType, type), count, (uintptr_t)strings);
 
     GLuint returnValue;
     if (context)
     {
-        ShaderType typePacked                                 = FromGL<ShaderType>(type);
+        ShaderType typePacked                                 = PackParam<ShaderType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateCreateShaderProgramvEXT(context, typePacked, count, strings));
@@ -5838,7 +5833,8 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::CreateShaderProgramvEXT, GLuint>();
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLCreateShaderProgramvEXT, GLuint>();
         }
         ANGLE_CAPTURE(CreateShaderProgramvEXT, isCallValid, context, typePacked, count, strings,
                       returnValue);
@@ -5846,7 +5842,7 @@
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::CreateShaderProgramvEXT, GLuint>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLCreateShaderProgramvEXT, GLuint>();
     }
     return returnValue;
 }
@@ -5854,13 +5850,13 @@
 void GL_APIENTRY DeleteProgramPipelinesEXT(GLsizei n, const GLuint *pipelines)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DeleteProgramPipelinesEXT, "glDeleteProgramPipelinesEXT",
+    EVENT(context, GLDeleteProgramPipelinesEXT,
           "context = %d, n = %d, pipelines = 0x%016" PRIxPTR "", CID(context), n,
           (uintptr_t)pipelines);
 
     if (context)
     {
-        const ProgramPipelineID *pipelinesPacked = FromGL<const ProgramPipelineID *>(pipelines);
+        const ProgramPipelineID *pipelinesPacked = PackParam<const ProgramPipelineID *>(pipelines);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateDeleteProgramPipelinesEXT(context, n, pipelinesPacked));
@@ -5879,13 +5875,12 @@
 void GL_APIENTRY GenProgramPipelinesEXT(GLsizei n, GLuint *pipelines)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GenProgramPipelinesEXT, "glGenProgramPipelinesEXT",
-          "context = %d, n = %d, pipelines = 0x%016" PRIxPTR "", CID(context), n,
-          (uintptr_t)pipelines);
+    EVENT(context, GLGenProgramPipelinesEXT, "context = %d, n = %d, pipelines = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)pipelines);
 
     if (context)
     {
-        ProgramPipelineID *pipelinesPacked = FromGL<ProgramPipelineID *>(pipelines);
+        ProgramPipelineID *pipelinesPacked = PackParam<ProgramPipelineID *>(pipelines);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGenProgramPipelinesEXT(context, n, pipelinesPacked));
@@ -5907,14 +5902,14 @@
                                               GLchar *infoLog)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetProgramPipelineInfoLogEXT, "glGetProgramPipelineInfoLogEXT",
+    EVENT(context, GLGetProgramPipelineInfoLogEXT,
           "context = %d, pipeline = %u, bufSize = %d, length = 0x%016" PRIxPTR
           ", infoLog = 0x%016" PRIxPTR "",
           CID(context), pipeline, bufSize, (uintptr_t)length, (uintptr_t)infoLog);
 
     if (context)
     {
-        ProgramPipelineID pipelinePacked                      = FromGL<ProgramPipelineID>(pipeline);
+        ProgramPipelineID pipelinePacked = PackParam<ProgramPipelineID>(pipeline);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGetProgramPipelineInfoLogEXT(
@@ -5935,13 +5930,13 @@
 void GL_APIENTRY GetProgramPipelineivEXT(GLuint pipeline, GLenum pname, GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetProgramPipelineivEXT, "glGetProgramPipelineivEXT",
+    EVENT(context, GLGetProgramPipelineivEXT,
           "context = %d, pipeline = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           pipeline, GLenumToString(GLenumGroup::PipelineParameterName, pname), (uintptr_t)params);
 
     if (context)
     {
-        ProgramPipelineID pipelinePacked                      = FromGL<ProgramPipelineID>(pipeline);
+        ProgramPipelineID pipelinePacked = PackParam<ProgramPipelineID>(pipeline);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -5961,13 +5956,12 @@
 GLboolean GL_APIENTRY IsProgramPipelineEXT(GLuint pipeline)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IsProgramPipelineEXT, "glIsProgramPipelineEXT",
-          "context = %d, pipeline = %u", CID(context), pipeline);
+    EVENT(context, GLIsProgramPipelineEXT, "context = %d, pipeline = %u", CID(context), pipeline);
 
     GLboolean returnValue;
     if (context)
     {
-        ProgramPipelineID pipelinePacked                      = FromGL<ProgramPipelineID>(pipeline);
+        ProgramPipelineID pipelinePacked = PackParam<ProgramPipelineID>(pipeline);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateIsProgramPipelineEXT(context, pipelinePacked));
@@ -5977,14 +5971,15 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsProgramPipelineEXT, GLboolean>();
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLIsProgramPipelineEXT, GLboolean>();
         }
         ANGLE_CAPTURE(IsProgramPipelineEXT, isCallValid, context, pipelinePacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::IsProgramPipelineEXT, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsProgramPipelineEXT, GLboolean>();
     }
     return returnValue;
 }
@@ -5992,13 +5987,12 @@
 void GL_APIENTRY ProgramParameteriEXT(GLuint program, GLenum pname, GLint value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramParameteriEXT, "glProgramParameteriEXT",
-          "context = %d, program = %u, pname = %s, value = %d", CID(context), program,
-          GLenumToString(GLenumGroup::ProgramParameterPName, pname), value);
+    EVENT(context, GLProgramParameteriEXT, "context = %d, program = %u, pname = %s, value = %d",
+          CID(context), program, GLenumToString(GLenumGroup::ProgramParameterPName, pname), value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramParameteriEXT(context, programPacked, pname, value));
@@ -6017,14 +6011,13 @@
 void GL_APIENTRY ProgramUniform1fEXT(GLuint program, GLint location, GLfloat v0)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform1fEXT, "glProgramUniform1fEXT",
-          "context = %d, program = %u, location = %d, v0 = %f", CID(context), program, location,
-          v0);
+    EVENT(context, GLProgramUniform1fEXT, "context = %d, program = %u, location = %d, v0 = %f",
+          CID(context), program, location, v0);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -6047,14 +6040,14 @@
                                       const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform1fvEXT, "glProgramUniform1fvEXT",
+    EVENT(context, GLProgramUniform1fvEXT,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -6075,14 +6068,13 @@
 void GL_APIENTRY ProgramUniform1iEXT(GLuint program, GLint location, GLint v0)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform1iEXT, "glProgramUniform1iEXT",
-          "context = %d, program = %u, location = %d, v0 = %d", CID(context), program, location,
-          v0);
+    EVENT(context, GLProgramUniform1iEXT, "context = %d, program = %u, location = %d, v0 = %d",
+          CID(context), program, location, v0);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -6105,14 +6097,14 @@
                                       const GLint *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform1ivEXT, "glProgramUniform1ivEXT",
+    EVENT(context, GLProgramUniform1ivEXT,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -6133,14 +6125,13 @@
 void GL_APIENTRY ProgramUniform1uiEXT(GLuint program, GLint location, GLuint v0)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform1uiEXT, "glProgramUniform1uiEXT",
-          "context = %d, program = %u, location = %d, v0 = %u", CID(context), program, location,
-          v0);
+    EVENT(context, GLProgramUniform1uiEXT, "context = %d, program = %u, location = %d, v0 = %u",
+          CID(context), program, location, v0);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -6164,14 +6155,14 @@
                                        const GLuint *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform1uivEXT, "glProgramUniform1uivEXT",
+    EVENT(context, GLProgramUniform1uivEXT,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -6192,14 +6183,14 @@
 void GL_APIENTRY ProgramUniform2fEXT(GLuint program, GLint location, GLfloat v0, GLfloat v1)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform2fEXT, "glProgramUniform2fEXT",
+    EVENT(context, GLProgramUniform2fEXT,
           "context = %d, program = %u, location = %d, v0 = %f, v1 = %f", CID(context), program,
           location, v0, v1);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -6223,14 +6214,14 @@
                                       const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform2fvEXT, "glProgramUniform2fvEXT",
+    EVENT(context, GLProgramUniform2fvEXT,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -6251,14 +6242,14 @@
 void GL_APIENTRY ProgramUniform2iEXT(GLuint program, GLint location, GLint v0, GLint v1)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform2iEXT, "glProgramUniform2iEXT",
+    EVENT(context, GLProgramUniform2iEXT,
           "context = %d, program = %u, location = %d, v0 = %d, v1 = %d", CID(context), program,
           location, v0, v1);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -6282,14 +6273,14 @@
                                       const GLint *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform2ivEXT, "glProgramUniform2ivEXT",
+    EVENT(context, GLProgramUniform2ivEXT,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -6310,14 +6301,14 @@
 void GL_APIENTRY ProgramUniform2uiEXT(GLuint program, GLint location, GLuint v0, GLuint v1)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform2uiEXT, "glProgramUniform2uiEXT",
+    EVENT(context, GLProgramUniform2uiEXT,
           "context = %d, program = %u, location = %d, v0 = %u, v1 = %u", CID(context), program,
           location, v0, v1);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -6341,14 +6332,14 @@
                                        const GLuint *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform2uivEXT, "glProgramUniform2uivEXT",
+    EVENT(context, GLProgramUniform2uivEXT,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -6370,14 +6361,14 @@
 ProgramUniform3fEXT(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform3fEXT, "glProgramUniform3fEXT",
+    EVENT(context, GLProgramUniform3fEXT,
           "context = %d, program = %u, location = %d, v0 = %f, v1 = %f, v2 = %f", CID(context),
           program, location, v0, v1, v2);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -6401,14 +6392,14 @@
                                       const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform3fvEXT, "glProgramUniform3fvEXT",
+    EVENT(context, GLProgramUniform3fvEXT,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -6429,14 +6420,14 @@
 void GL_APIENTRY ProgramUniform3iEXT(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform3iEXT, "glProgramUniform3iEXT",
+    EVENT(context, GLProgramUniform3iEXT,
           "context = %d, program = %u, location = %d, v0 = %d, v1 = %d, v2 = %d", CID(context),
           program, location, v0, v1, v2);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -6460,14 +6451,14 @@
                                       const GLint *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform3ivEXT, "glProgramUniform3ivEXT",
+    EVENT(context, GLProgramUniform3ivEXT,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -6489,14 +6480,14 @@
 ProgramUniform3uiEXT(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform3uiEXT, "glProgramUniform3uiEXT",
+    EVENT(context, GLProgramUniform3uiEXT,
           "context = %d, program = %u, location = %d, v0 = %u, v1 = %u, v2 = %u", CID(context),
           program, location, v0, v1, v2);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -6520,14 +6511,14 @@
                                        const GLuint *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform3uivEXT, "glProgramUniform3uivEXT",
+    EVENT(context, GLProgramUniform3uivEXT,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -6549,14 +6540,14 @@
 ProgramUniform4fEXT(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform4fEXT, "glProgramUniform4fEXT",
+    EVENT(context, GLProgramUniform4fEXT,
           "context = %d, program = %u, location = %d, v0 = %f, v1 = %f, v2 = %f, v3 = %f",
           CID(context), program, location, v0, v1, v2, v3);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -6580,14 +6571,14 @@
                                       const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform4fvEXT, "glProgramUniform4fvEXT",
+    EVENT(context, GLProgramUniform4fvEXT,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -6609,14 +6600,14 @@
 ProgramUniform4iEXT(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform4iEXT, "glProgramUniform4iEXT",
+    EVENT(context, GLProgramUniform4iEXT,
           "context = %d, program = %u, location = %d, v0 = %d, v1 = %d, v2 = %d, v3 = %d",
           CID(context), program, location, v0, v1, v2, v3);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -6640,14 +6631,14 @@
                                       const GLint *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform4ivEXT, "glProgramUniform4ivEXT",
+    EVENT(context, GLProgramUniform4ivEXT,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -6669,14 +6660,14 @@
 ProgramUniform4uiEXT(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform4uiEXT, "glProgramUniform4uiEXT",
+    EVENT(context, GLProgramUniform4uiEXT,
           "context = %d, program = %u, location = %d, v0 = %u, v1 = %u, v2 = %u, v3 = %u",
           CID(context), program, location, v0, v1, v2, v3);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -6700,14 +6691,14 @@
                                        const GLuint *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniform4uivEXT, "glProgramUniform4uivEXT",
+    EVENT(context, GLProgramUniform4uivEXT,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -6732,15 +6723,15 @@
                                             const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix2fvEXT, "glProgramUniformMatrix2fvEXT",
+    EVENT(context, GLProgramUniformMatrix2fvEXT,
           "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
           "0x%016" PRIxPTR "",
           CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniformMatrix2fvEXT(
@@ -6766,15 +6757,15 @@
                                               const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix2x3fvEXT, "glProgramUniformMatrix2x3fvEXT",
+    EVENT(context, GLProgramUniformMatrix2x3fvEXT,
           "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
           "0x%016" PRIxPTR "",
           CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniformMatrix2x3fvEXT(
@@ -6800,15 +6791,15 @@
                                               const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix2x4fvEXT, "glProgramUniformMatrix2x4fvEXT",
+    EVENT(context, GLProgramUniformMatrix2x4fvEXT,
           "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
           "0x%016" PRIxPTR "",
           CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniformMatrix2x4fvEXT(
@@ -6834,15 +6825,15 @@
                                             const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix3fvEXT, "glProgramUniformMatrix3fvEXT",
+    EVENT(context, GLProgramUniformMatrix3fvEXT,
           "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
           "0x%016" PRIxPTR "",
           CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniformMatrix3fvEXT(
@@ -6868,15 +6859,15 @@
                                               const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix3x2fvEXT, "glProgramUniformMatrix3x2fvEXT",
+    EVENT(context, GLProgramUniformMatrix3x2fvEXT,
           "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
           "0x%016" PRIxPTR "",
           CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniformMatrix3x2fvEXT(
@@ -6902,15 +6893,15 @@
                                               const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix3x4fvEXT, "glProgramUniformMatrix3x4fvEXT",
+    EVENT(context, GLProgramUniformMatrix3x4fvEXT,
           "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
           "0x%016" PRIxPTR "",
           CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniformMatrix3x4fvEXT(
@@ -6936,15 +6927,15 @@
                                             const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix4fvEXT, "glProgramUniformMatrix4fvEXT",
+    EVENT(context, GLProgramUniformMatrix4fvEXT,
           "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
           "0x%016" PRIxPTR "",
           CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniformMatrix4fvEXT(
@@ -6970,15 +6961,15 @@
                                               const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix4x2fvEXT, "glProgramUniformMatrix4x2fvEXT",
+    EVENT(context, GLProgramUniformMatrix4x2fvEXT,
           "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
           "0x%016" PRIxPTR "",
           CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniformMatrix4x2fvEXT(
@@ -7004,15 +6995,15 @@
                                               const GLfloat *value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix4x3fvEXT, "glProgramUniformMatrix4x3fvEXT",
+    EVENT(context, GLProgramUniformMatrix4x3fvEXT,
           "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
           "0x%016" PRIxPTR "",
           CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniformMatrix4x3fvEXT(
@@ -7034,14 +7025,14 @@
 void GL_APIENTRY UseProgramStagesEXT(GLuint pipeline, GLbitfield stages, GLuint program)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::UseProgramStagesEXT, "glUseProgramStagesEXT",
-          "context = %d, pipeline = %u, stages = %s, program = %u", CID(context), pipeline,
+    EVENT(context, GLUseProgramStagesEXT, "context = %d, pipeline = %u, stages = %s, program = %u",
+          CID(context), pipeline,
           GLbitfieldToString(GLenumGroup::UseProgramStageMask, stages).c_str(), program);
 
     if (context)
     {
-        ProgramPipelineID pipelinePacked                      = FromGL<ProgramPipelineID>(pipeline);
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ProgramPipelineID pipelinePacked = PackParam<ProgramPipelineID>(pipeline);
+        ShaderProgramID programPacked    = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -7062,12 +7053,12 @@
 void GL_APIENTRY ValidateProgramPipelineEXT(GLuint pipeline)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ValidateProgramPipelineEXT, "glValidateProgramPipelineEXT",
-          "context = %d, pipeline = %u", CID(context), pipeline);
+    EVENT(context, GLValidateProgramPipelineEXT, "context = %d, pipeline = %u", CID(context),
+          pipeline);
 
     if (context)
     {
-        ProgramPipelineID pipelinePacked                      = FromGL<ProgramPipelineID>(pipeline);
+        ProgramPipelineID pipelinePacked = PackParam<ProgramPipelineID>(pipeline);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateValidateProgramPipelineEXT(context, pipelinePacked));
@@ -7083,12 +7074,13 @@
     }
 }
 
+// GL_EXT_shader_io_blocks
+
 // GL_EXT_tessellation_shader
 void GL_APIENTRY PatchParameteriEXT(GLenum pname, GLint value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PatchParameteriEXT, "glPatchParameteriEXT",
-          "context = %d, pname = %s, value = %d", CID(context),
+    EVENT(context, GLPatchParameteriEXT, "context = %d, pname = %s, value = %d", CID(context),
           GLenumToString(GLenumGroup::PatchParameterName, pname), value);
 
     if (context)
@@ -7112,15 +7104,14 @@
 void GL_APIENTRY TexBufferEXT(GLenum target, GLenum internalformat, GLuint buffer)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexBufferEXT, "glTexBufferEXT",
-          "context = %d, target = %s, internalformat = %s, buffer = %u", CID(context),
-          GLenumToString(GLenumGroup::TextureTarget, target),
+    EVENT(context, GLTexBufferEXT, "context = %d, target = %s, internalformat = %s, buffer = %u",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::InternalFormat, internalformat), buffer);
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -7145,7 +7136,7 @@
                                    GLsizeiptr size)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexBufferRangeEXT, "glTexBufferRangeEXT",
+    EVENT(context, GLTexBufferRangeEXT,
           "context = %d, target = %s, internalformat = %s, buffer = %u, offset = %llu, size = %llu",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::InternalFormat, internalformat), buffer,
@@ -7153,8 +7144,8 @@
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexBufferRangeEXT(context, targetPacked, internalformat,
@@ -7197,7 +7188,7 @@
                                  GLsizei width)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexStorage1DEXT, "glTexStorage1DEXT",
+    EVENT(context, GLTexStorage1DEXT,
           "context = %d, target = %s, levels = %d, internalformat = %s, width = %d", CID(context),
           GLenumToString(GLenumGroup::TextureTarget, target), levels,
           GLenumToString(GLenumGroup::InternalFormat, internalformat), width);
@@ -7224,14 +7215,14 @@
 TexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexStorage2DEXT, "glTexStorage2DEXT",
+    EVENT(context, GLTexStorage2DEXT,
           "context = %d, target = %s, levels = %d, internalformat = %s, width = %d, height = %d",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), levels,
           GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height);
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -7257,7 +7248,7 @@
                                  GLsizei depth)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexStorage3DEXT, "glTexStorage3DEXT",
+    EVENT(context, GLTexStorage3DEXT,
           "context = %d, target = %s, levels = %d, internalformat = %s, width = %d, height = %d, "
           "depth = %d",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), levels,
@@ -7265,7 +7256,7 @@
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexStorage3DEXT(context, targetPacked, levels, internalformat,
@@ -7287,7 +7278,7 @@
 void GL_APIENTRY DebugMessageCallbackKHR(GLDEBUGPROCKHR callback, const void *userParam)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DebugMessageCallbackKHR, "glDebugMessageCallbackKHR",
+    EVENT(context, GLDebugMessageCallbackKHR,
           "context = %d, callback = 0x%016" PRIxPTR ", userParam = 0x%016" PRIxPTR "", CID(context),
           (uintptr_t)callback, (uintptr_t)userParam);
 
@@ -7316,7 +7307,7 @@
                                         GLboolean enabled)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DebugMessageControlKHR, "glDebugMessageControlKHR",
+    EVENT(context, GLDebugMessageControlKHR,
           "context = %d, source = %s, type = %s, severity = %s, count = %d, ids = 0x%016" PRIxPTR
           ", enabled = %s",
           CID(context), GLenumToString(GLenumGroup::DebugSource, source),
@@ -7351,7 +7342,7 @@
                                        const GLchar *buf)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DebugMessageInsertKHR, "glDebugMessageInsertKHR",
+    EVENT(context, GLDebugMessageInsertKHR,
           "context = %d, source = %s, type = %s, id = %u, severity = %s, length = %d, buf = "
           "0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DebugSource, source),
@@ -7387,7 +7378,7 @@
                                          GLchar *messageLog)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetDebugMessageLogKHR, "glGetDebugMessageLogKHR",
+    EVENT(context, GLGetDebugMessageLogKHR,
           "context = %d, count = %u, bufSize = %d, sources = 0x%016" PRIxPTR
           ", types = 0x%016" PRIxPTR ", ids = 0x%016" PRIxPTR ", severities = 0x%016" PRIxPTR
           ", lengths = 0x%016" PRIxPTR ", messageLog = 0x%016" PRIxPTR "",
@@ -7408,7 +7399,8 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetDebugMessageLogKHR, GLuint>();
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLGetDebugMessageLogKHR, GLuint>();
         }
         ANGLE_CAPTURE(GetDebugMessageLogKHR, isCallValid, context, count, bufSize, sources, types,
                       ids, severities, lengths, messageLog, returnValue);
@@ -7416,7 +7408,7 @@
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::GetDebugMessageLogKHR, GLuint>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetDebugMessageLogKHR, GLuint>();
     }
     return returnValue;
 }
@@ -7425,7 +7417,7 @@
 GetObjectLabelKHR(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetObjectLabelKHR, "glGetObjectLabelKHR",
+    EVENT(context, GLGetObjectLabelKHR,
           "context = %d, identifier = %s, name = %u, bufSize = %d, length = 0x%016" PRIxPTR
           ", label = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, identifier), name, bufSize,
@@ -7456,7 +7448,7 @@
                                       GLchar *label)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetObjectPtrLabelKHR, "glGetObjectPtrLabelKHR",
+    EVENT(context, GLGetObjectPtrLabelKHR,
           "context = %d, ptr = 0x%016" PRIxPTR ", bufSize = %d, length = 0x%016" PRIxPTR
           ", label = 0x%016" PRIxPTR "",
           CID(context), (uintptr_t)ptr, bufSize, (uintptr_t)length, (uintptr_t)label);
@@ -7481,9 +7473,8 @@
 void GL_APIENTRY GetPointervKHR(GLenum pname, void **params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetPointervKHR, "glGetPointervKHR",
-          "context = %d, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
+    EVENT(context, GLGetPointervKHR, "context = %d, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
 
     if (context)
     {
@@ -7505,7 +7496,7 @@
 void GL_APIENTRY ObjectLabelKHR(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ObjectLabelKHR, "glObjectLabelKHR",
+    EVENT(context, GLObjectLabelKHR,
           "context = %d, identifier = %s, name = %u, length = %d, label = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::ObjectIdentifier, identifier), name, length,
           (uintptr_t)label);
@@ -7530,7 +7521,7 @@
 void GL_APIENTRY ObjectPtrLabelKHR(const void *ptr, GLsizei length, const GLchar *label)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ObjectPtrLabelKHR, "glObjectPtrLabelKHR",
+    EVENT(context, GLObjectPtrLabelKHR,
           "context = %d, ptr = 0x%016" PRIxPTR ", length = %d, label = 0x%016" PRIxPTR "",
           CID(context), (uintptr_t)ptr, length, (uintptr_t)label);
 
@@ -7554,8 +7545,7 @@
 void GL_APIENTRY PopDebugGroupKHR()
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PopDebugGroupKHR, "glPopDebugGroupKHR", "context = %d",
-          CID(context));
+    EVENT(context, GLPopDebugGroupKHR, "context = %d", CID(context));
 
     if (context)
     {
@@ -7576,7 +7566,7 @@
 void GL_APIENTRY PushDebugGroupKHR(GLenum source, GLuint id, GLsizei length, const GLchar *message)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PushDebugGroupKHR, "glPushDebugGroupKHR",
+    EVENT(context, GLPushDebugGroupKHR,
           "context = %d, source = %s, id = %u, length = %d, message = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DebugSource, source), id, length,
           (uintptr_t)message);
@@ -7602,8 +7592,7 @@
 void GL_APIENTRY MaxShaderCompilerThreadsKHR(GLuint count)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MaxShaderCompilerThreadsKHR, "glMaxShaderCompilerThreadsKHR",
-          "context = %d, count = %u", CID(context), count);
+    EVENT(context, GLMaxShaderCompilerThreadsKHR, "context = %d, count = %u", CID(context), count);
 
     if (context)
     {
@@ -7626,12 +7615,12 @@
 void GL_APIENTRY DeleteFencesNV(GLsizei n, const GLuint *fences)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DeleteFencesNV, "glDeleteFencesNV",
-          "context = %d, n = %d, fences = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)fences);
+    EVENT(context, GLDeleteFencesNV, "context = %d, n = %d, fences = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)fences);
 
     if (context)
     {
-        const FenceNVID *fencesPacked                         = FromGL<const FenceNVID *>(fences);
+        const FenceNVID *fencesPacked = PackParam<const FenceNVID *>(fences);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateDeleteFencesNV(context, n, fencesPacked));
@@ -7650,12 +7639,11 @@
 void GL_APIENTRY FinishFenceNV(GLuint fence)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::FinishFenceNV, "glFinishFenceNV", "context = %d, fence = %u",
-          CID(context), fence);
+    EVENT(context, GLFinishFenceNV, "context = %d, fence = %u", CID(context), fence);
 
     if (context)
     {
-        FenceNVID fencePacked                                 = FromGL<FenceNVID>(fence);
+        FenceNVID fencePacked                                 = PackParam<FenceNVID>(fence);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateFinishFenceNV(context, fencePacked));
@@ -7674,12 +7662,12 @@
 void GL_APIENTRY GenFencesNV(GLsizei n, GLuint *fences)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GenFencesNV, "glGenFencesNV",
-          "context = %d, n = %d, fences = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)fences);
+    EVENT(context, GLGenFencesNV, "context = %d, n = %d, fences = 0x%016" PRIxPTR "", CID(context),
+          n, (uintptr_t)fences);
 
     if (context)
     {
-        FenceNVID *fencesPacked                               = FromGL<FenceNVID *>(fences);
+        FenceNVID *fencesPacked                               = PackParam<FenceNVID *>(fences);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGenFencesNV(context, n, fencesPacked));
@@ -7698,13 +7686,13 @@
 void GL_APIENTRY GetFenceivNV(GLuint fence, GLenum pname, GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetFenceivNV, "glGetFenceivNV",
+    EVENT(context, GLGetFenceivNV,
           "context = %d, fence = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), fence,
           GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
 
     if (context)
     {
-        FenceNVID fencePacked                                 = FromGL<FenceNVID>(fence);
+        FenceNVID fencePacked                                 = PackParam<FenceNVID>(fence);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetFenceivNV(context, fencePacked, pname, params));
@@ -7723,13 +7711,12 @@
 GLboolean GL_APIENTRY IsFenceNV(GLuint fence)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IsFenceNV, "glIsFenceNV", "context = %d, fence = %u",
-          CID(context), fence);
+    EVENT(context, GLIsFenceNV, "context = %d, fence = %u", CID(context), fence);
 
     GLboolean returnValue;
     if (context)
     {
-        FenceNVID fencePacked                                 = FromGL<FenceNVID>(fence);
+        FenceNVID fencePacked                                 = PackParam<FenceNVID>(fence);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateIsFenceNV(context, fencePacked));
         if (isCallValid)
@@ -7738,14 +7725,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsFenceNV, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsFenceNV, GLboolean>();
         }
         ANGLE_CAPTURE(IsFenceNV, isCallValid, context, fencePacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::IsFenceNV, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsFenceNV, GLboolean>();
     }
     return returnValue;
 }
@@ -7753,13 +7740,12 @@
 void GL_APIENTRY SetFenceNV(GLuint fence, GLenum condition)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SetFenceNV, "glSetFenceNV",
-          "context = %d, fence = %u, condition = %s", CID(context), fence,
+    EVENT(context, GLSetFenceNV, "context = %d, fence = %u, condition = %s", CID(context), fence,
           GLenumToString(GLenumGroup::DefaultGroup, condition));
 
     if (context)
     {
-        FenceNVID fencePacked                                 = FromGL<FenceNVID>(fence);
+        FenceNVID fencePacked                                 = PackParam<FenceNVID>(fence);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateSetFenceNV(context, fencePacked, condition));
@@ -7778,13 +7764,12 @@
 GLboolean GL_APIENTRY TestFenceNV(GLuint fence)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TestFenceNV, "glTestFenceNV", "context = %d, fence = %u",
-          CID(context), fence);
+    EVENT(context, GLTestFenceNV, "context = %d, fence = %u", CID(context), fence);
 
     GLboolean returnValue;
     if (context)
     {
-        FenceNVID fencePacked                                 = FromGL<FenceNVID>(fence);
+        FenceNVID fencePacked                                 = PackParam<FenceNVID>(fence);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateTestFenceNV(context, fencePacked));
         if (isCallValid)
@@ -7793,14 +7778,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::TestFenceNV, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLTestFenceNV, GLboolean>();
         }
         ANGLE_CAPTURE(TestFenceNV, isCallValid, context, fencePacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::TestFenceNV, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLTestFenceNV, GLboolean>();
     }
     return returnValue;
 }
@@ -7809,8 +7794,7 @@
 void GL_APIENTRY EGLImageTargetRenderbufferStorageOES(GLenum target, GLeglImageOES image)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::EGLImageTargetRenderbufferStorageOES,
-          "glEGLImageTargetRenderbufferStorageOES",
+    EVENT(context, GLEGLImageTargetRenderbufferStorageOES,
           "context = %d, target = %s, image = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::DefaultGroup, target), (uintptr_t)image);
 
@@ -7834,13 +7818,13 @@
 void GL_APIENTRY EGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::EGLImageTargetTexture2DOES, "glEGLImageTargetTexture2DOES",
+    EVENT(context, GLEGLImageTargetTexture2DOES,
           "context = %d, target = %s, image = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::DefaultGroup, target), (uintptr_t)image);
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateEGLImageTargetTexture2DOES(context, targetPacked, image));
@@ -7876,7 +7860,7 @@
                                      GLsizei srcDepth)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CopyImageSubDataOES, "glCopyImageSubDataOES",
+    EVENT(context, GLCopyImageSubDataOES,
           "context = %d, srcName = %u, srcTarget = %s, srcLevel = %d, srcX = %d, srcY = %d, srcZ = "
           "%d, dstName = %u, dstTarget = %s, dstLevel = %d, dstX = %d, dstY = %d, dstZ = %d, "
           "srcWidth = %d, srcHeight = %d, srcDepth = %d",
@@ -7915,7 +7899,7 @@
 void GL_APIENTRY BlendEquationSeparateiOES(GLuint buf, GLenum modeRGB, GLenum modeAlpha)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BlendEquationSeparateiOES, "glBlendEquationSeparateiOES",
+    EVENT(context, GLBlendEquationSeparateiOES,
           "context = %d, buf = %u, modeRGB = %s, modeAlpha = %s", CID(context), buf,
           GLenumToString(GLenumGroup::BlendEquationModeEXT, modeRGB),
           GLenumToString(GLenumGroup::BlendEquationModeEXT, modeAlpha));
@@ -7940,8 +7924,7 @@
 void GL_APIENTRY BlendEquationiOES(GLuint buf, GLenum mode)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BlendEquationiOES, "glBlendEquationiOES",
-          "context = %d, buf = %u, mode = %s", CID(context), buf,
+    EVENT(context, GLBlendEquationiOES, "context = %d, buf = %u, mode = %s", CID(context), buf,
           GLenumToString(GLenumGroup::BlendEquationModeEXT, mode));
 
     if (context)
@@ -7965,7 +7948,7 @@
 BlendFuncSeparateiOES(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BlendFuncSeparateiOES, "glBlendFuncSeparateiOES",
+    EVENT(context, GLBlendFuncSeparateiOES,
           "context = %d, buf = %u, srcRGB = %s, dstRGB = %s, srcAlpha = %s, dstAlpha = %s",
           CID(context), buf, GLenumToString(GLenumGroup::BlendingFactor, srcRGB),
           GLenumToString(GLenumGroup::BlendingFactor, dstRGB),
@@ -7994,8 +7977,7 @@
 void GL_APIENTRY BlendFunciOES(GLuint buf, GLenum src, GLenum dst)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BlendFunciOES, "glBlendFunciOES",
-          "context = %d, buf = %u, src = %s, dst = %s", CID(context), buf,
+    EVENT(context, GLBlendFunciOES, "context = %d, buf = %u, src = %s, dst = %s", CID(context), buf,
           GLenumToString(GLenumGroup::BlendingFactor, src),
           GLenumToString(GLenumGroup::BlendingFactor, dst));
 
@@ -8019,9 +8001,9 @@
 void GL_APIENTRY ColorMaskiOES(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ColorMaskiOES, "glColorMaskiOES",
-          "context = %d, index = %u, r = %s, g = %s, b = %s, a = %s", CID(context), index,
-          GLbooleanToString(r), GLbooleanToString(g), GLbooleanToString(b), GLbooleanToString(a));
+    EVENT(context, GLColorMaskiOES, "context = %d, index = %u, r = %s, g = %s, b = %s, a = %s",
+          CID(context), index, GLbooleanToString(r), GLbooleanToString(g), GLbooleanToString(b),
+          GLbooleanToString(a));
 
     if (context)
     {
@@ -8043,8 +8025,7 @@
 void GL_APIENTRY DisableiOES(GLenum target, GLuint index)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DisableiOES, "glDisableiOES",
-          "context = %d, target = %s, index = %u", CID(context),
+    EVENT(context, GLDisableiOES, "context = %d, target = %s, index = %u", CID(context),
           GLenumToString(GLenumGroup::EnableCap, target), index);
 
     if (context)
@@ -8067,8 +8048,7 @@
 void GL_APIENTRY EnableiOES(GLenum target, GLuint index)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::EnableiOES, "glEnableiOES",
-          "context = %d, target = %s, index = %u", CID(context),
+    EVENT(context, GLEnableiOES, "context = %d, target = %s, index = %u", CID(context),
           GLenumToString(GLenumGroup::EnableCap, target), index);
 
     if (context)
@@ -8091,8 +8071,7 @@
 GLboolean GL_APIENTRY IsEnablediOES(GLenum target, GLuint index)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IsEnablediOES, "glIsEnablediOES",
-          "context = %d, target = %s, index = %u", CID(context),
+    EVENT(context, GLIsEnablediOES, "context = %d, target = %s, index = %u", CID(context),
           GLenumToString(GLenumGroup::EnableCap, target), index);
 
     GLboolean returnValue;
@@ -8107,14 +8086,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsEnablediOES, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsEnablediOES, GLboolean>();
         }
         ANGLE_CAPTURE(IsEnablediOES, isCallValid, context, target, index, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::IsEnablediOES, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsEnablediOES, GLboolean>();
     }
     return returnValue;
 }
@@ -8127,7 +8106,7 @@
                                            GLint basevertex)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawElementsBaseVertexOES, "glDrawElementsBaseVertexOES",
+    EVENT(context, GLDrawElementsBaseVertexOES,
           "context = %d, mode = %s, count = %d, type = %s, indices = 0x%016" PRIxPTR
           ", basevertex = %d",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), count,
@@ -8135,8 +8114,8 @@
 
     if (context)
     {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateDrawElementsBaseVertexOES(context, modePacked, count,
@@ -8162,8 +8141,7 @@
                                                     GLint basevertex)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawElementsInstancedBaseVertexOES,
-          "glDrawElementsInstancedBaseVertexOES",
+    EVENT(context, GLDrawElementsInstancedBaseVertexOES,
           "context = %d, mode = %s, count = %d, type = %s, indices = 0x%016" PRIxPTR
           ", instancecount = %d, basevertex = %d",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), count,
@@ -8172,8 +8150,8 @@
 
     if (context)
     {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateDrawElementsInstancedBaseVertexOES(
                                                              context, modePacked, count, typePacked,
@@ -8201,8 +8179,7 @@
                                                 GLint basevertex)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawRangeElementsBaseVertexOES,
-          "glDrawRangeElementsBaseVertexOES",
+    EVENT(context, GLDrawRangeElementsBaseVertexOES,
           "context = %d, mode = %s, start = %u, end = %u, count = %d, type = %s, indices = "
           "0x%016" PRIxPTR ", basevertex = %d",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), start, end, count,
@@ -8210,8 +8187,8 @@
 
     if (context)
     {
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateDrawRangeElementsBaseVertexOES(
                                                              context, modePacked, start, end, count,
@@ -8236,9 +8213,8 @@
 void GL_APIENTRY DrawTexfOES(GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawTexfOES, "glDrawTexfOES",
-          "context = %d, x = %f, y = %f, z = %f, width = %f, height = %f", CID(context), x, y, z,
-          width, height);
+    EVENT(context, GLDrawTexfOES, "context = %d, x = %f, y = %f, z = %f, width = %f, height = %f",
+          CID(context), x, y, z, width, height);
 
     if (context)
     {
@@ -8260,8 +8236,8 @@
 void GL_APIENTRY DrawTexfvOES(const GLfloat *coords)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawTexfvOES, "glDrawTexfvOES",
-          "context = %d, coords = 0x%016" PRIxPTR "", CID(context), (uintptr_t)coords);
+    EVENT(context, GLDrawTexfvOES, "context = %d, coords = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)coords);
 
     if (context)
     {
@@ -8282,9 +8258,8 @@
 void GL_APIENTRY DrawTexiOES(GLint x, GLint y, GLint z, GLint width, GLint height)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawTexiOES, "glDrawTexiOES",
-          "context = %d, x = %d, y = %d, z = %d, width = %d, height = %d", CID(context), x, y, z,
-          width, height);
+    EVENT(context, GLDrawTexiOES, "context = %d, x = %d, y = %d, z = %d, width = %d, height = %d",
+          CID(context), x, y, z, width, height);
 
     if (context)
     {
@@ -8306,8 +8281,8 @@
 void GL_APIENTRY DrawTexivOES(const GLint *coords)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawTexivOES, "glDrawTexivOES",
-          "context = %d, coords = 0x%016" PRIxPTR "", CID(context), (uintptr_t)coords);
+    EVENT(context, GLDrawTexivOES, "context = %d, coords = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)coords);
 
     if (context)
     {
@@ -8328,9 +8303,8 @@
 void GL_APIENTRY DrawTexsOES(GLshort x, GLshort y, GLshort z, GLshort width, GLshort height)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawTexsOES, "glDrawTexsOES",
-          "context = %d, x = %d, y = %d, z = %d, width = %d, height = %d", CID(context), x, y, z,
-          width, height);
+    EVENT(context, GLDrawTexsOES, "context = %d, x = %d, y = %d, z = %d, width = %d, height = %d",
+          CID(context), x, y, z, width, height);
 
     if (context)
     {
@@ -8352,8 +8326,8 @@
 void GL_APIENTRY DrawTexsvOES(const GLshort *coords)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawTexsvOES, "glDrawTexsvOES",
-          "context = %d, coords = 0x%016" PRIxPTR "", CID(context), (uintptr_t)coords);
+    EVENT(context, GLDrawTexsvOES, "context = %d, coords = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)coords);
 
     if (context)
     {
@@ -8374,7 +8348,7 @@
 void GL_APIENTRY DrawTexxOES(GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawTexxOES, "glDrawTexxOES",
+    EVENT(context, GLDrawTexxOES,
           "context = %d, x = 0x%X, y = 0x%X, z = 0x%X, width = 0x%X, height = 0x%X", CID(context),
           x, y, z, width, height);
 
@@ -8398,8 +8372,8 @@
 void GL_APIENTRY DrawTexxvOES(const GLfixed *coords)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DrawTexxvOES, "glDrawTexxvOES",
-          "context = %d, coords = 0x%016" PRIxPTR "", CID(context), (uintptr_t)coords);
+    EVENT(context, GLDrawTexxvOES, "context = %d, coords = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)coords);
 
     if (context)
     {
@@ -8421,13 +8395,12 @@
 void GL_APIENTRY BindFramebufferOES(GLenum target, GLuint framebuffer)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindFramebufferOES, "glBindFramebufferOES",
-          "context = %d, target = %s, framebuffer = %u", CID(context),
-          GLenumToString(GLenumGroup::FramebufferTarget, target), framebuffer);
+    EVENT(context, GLBindFramebufferOES, "context = %d, target = %s, framebuffer = %u",
+          CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target), framebuffer);
 
     if (context)
     {
-        FramebufferID framebufferPacked                       = FromGL<FramebufferID>(framebuffer);
+        FramebufferID framebufferPacked = PackParam<FramebufferID>(framebuffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateBindFramebufferOES(context, target, framebufferPacked));
@@ -8446,13 +8419,12 @@
 void GL_APIENTRY BindRenderbufferOES(GLenum target, GLuint renderbuffer)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindRenderbufferOES, "glBindRenderbufferOES",
-          "context = %d, target = %s, renderbuffer = %u", CID(context),
-          GLenumToString(GLenumGroup::RenderbufferTarget, target), renderbuffer);
+    EVENT(context, GLBindRenderbufferOES, "context = %d, target = %s, renderbuffer = %u",
+          CID(context), GLenumToString(GLenumGroup::RenderbufferTarget, target), renderbuffer);
 
     if (context)
     {
-        RenderbufferID renderbufferPacked = FromGL<RenderbufferID>(renderbuffer);
+        RenderbufferID renderbufferPacked = PackParam<RenderbufferID>(renderbuffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateBindRenderbufferOES(context, target, renderbufferPacked));
@@ -8471,8 +8443,7 @@
 GLenum GL_APIENTRY CheckFramebufferStatusOES(GLenum target)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CheckFramebufferStatusOES, "glCheckFramebufferStatusOES",
-          "context = %d, target = %s", CID(context),
+    EVENT(context, GLCheckFramebufferStatusOES, "context = %d, target = %s", CID(context),
           GLenumToString(GLenumGroup::FramebufferTarget, target));
 
     GLenum returnValue;
@@ -8487,14 +8458,16 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::CheckFramebufferStatusOES, GLenum>();
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLCheckFramebufferStatusOES, GLenum>();
         }
         ANGLE_CAPTURE(CheckFramebufferStatusOES, isCallValid, context, target, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::CheckFramebufferStatusOES, GLenum>();
+        returnValue =
+            GetDefaultReturnValue<angle::EntryPoint::GLCheckFramebufferStatusOES, GLenum>();
     }
     return returnValue;
 }
@@ -8502,13 +8475,13 @@
 void GL_APIENTRY DeleteFramebuffersOES(GLsizei n, const GLuint *framebuffers)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DeleteFramebuffersOES, "glDeleteFramebuffersOES",
+    EVENT(context, GLDeleteFramebuffersOES,
           "context = %d, n = %d, framebuffers = 0x%016" PRIxPTR "", CID(context), n,
           (uintptr_t)framebuffers);
 
     if (context)
     {
-        const FramebufferID *framebuffersPacked = FromGL<const FramebufferID *>(framebuffers);
+        const FramebufferID *framebuffersPacked = PackParam<const FramebufferID *>(framebuffers);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateDeleteFramebuffersOES(context, n, framebuffersPacked));
@@ -8527,13 +8500,14 @@
 void GL_APIENTRY DeleteRenderbuffersOES(GLsizei n, const GLuint *renderbuffers)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DeleteRenderbuffersOES, "glDeleteRenderbuffersOES",
+    EVENT(context, GLDeleteRenderbuffersOES,
           "context = %d, n = %d, renderbuffers = 0x%016" PRIxPTR "", CID(context), n,
           (uintptr_t)renderbuffers);
 
     if (context)
     {
-        const RenderbufferID *renderbuffersPacked = FromGL<const RenderbufferID *>(renderbuffers);
+        const RenderbufferID *renderbuffersPacked =
+            PackParam<const RenderbufferID *>(renderbuffers);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateDeleteRenderbuffersOES(context, n, renderbuffersPacked));
@@ -8555,7 +8529,7 @@
                                             GLuint renderbuffer)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::FramebufferRenderbufferOES, "glFramebufferRenderbufferOES",
+    EVENT(context, GLFramebufferRenderbufferOES,
           "context = %d, target = %s, attachment = %s, renderbuffertarget = %s, renderbuffer = %u",
           CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target),
           GLenumToString(GLenumGroup::FramebufferAttachment, attachment),
@@ -8563,7 +8537,7 @@
 
     if (context)
     {
-        RenderbufferID renderbufferPacked = FromGL<RenderbufferID>(renderbuffer);
+        RenderbufferID renderbufferPacked = PackParam<RenderbufferID>(renderbuffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -8590,7 +8564,7 @@
                                          GLint level)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::FramebufferTexture2DOES, "glFramebufferTexture2DOES",
+    EVENT(context, GLFramebufferTexture2DOES,
           "context = %d, target = %s, attachment = %s, textarget = %s, texture = %u, level = %d",
           CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target),
           GLenumToString(GLenumGroup::FramebufferAttachment, attachment),
@@ -8598,8 +8572,8 @@
 
     if (context)
     {
-        TextureTarget textargetPacked                         = FromGL<TextureTarget>(textarget);
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
+        TextureTarget textargetPacked                         = PackParam<TextureTarget>(textarget);
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateFramebufferTexture2DOES(context, target, attachment,
@@ -8621,13 +8595,12 @@
 void GL_APIENTRY GenFramebuffersOES(GLsizei n, GLuint *framebuffers)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GenFramebuffersOES, "glGenFramebuffersOES",
-          "context = %d, n = %d, framebuffers = 0x%016" PRIxPTR "", CID(context), n,
-          (uintptr_t)framebuffers);
+    EVENT(context, GLGenFramebuffersOES, "context = %d, n = %d, framebuffers = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)framebuffers);
 
     if (context)
     {
-        FramebufferID *framebuffersPacked = FromGL<FramebufferID *>(framebuffers);
+        FramebufferID *framebuffersPacked = PackParam<FramebufferID *>(framebuffers);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGenFramebuffersOES(context, n, framebuffersPacked));
@@ -8646,13 +8619,12 @@
 void GL_APIENTRY GenRenderbuffersOES(GLsizei n, GLuint *renderbuffers)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GenRenderbuffersOES, "glGenRenderbuffersOES",
-          "context = %d, n = %d, renderbuffers = 0x%016" PRIxPTR "", CID(context), n,
-          (uintptr_t)renderbuffers);
+    EVENT(context, GLGenRenderbuffersOES, "context = %d, n = %d, renderbuffers = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)renderbuffers);
 
     if (context)
     {
-        RenderbufferID *renderbuffersPacked = FromGL<RenderbufferID *>(renderbuffers);
+        RenderbufferID *renderbuffersPacked = PackParam<RenderbufferID *>(renderbuffers);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGenRenderbuffersOES(context, n, renderbuffersPacked));
@@ -8671,13 +8643,12 @@
 void GL_APIENTRY GenerateMipmapOES(GLenum target)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GenerateMipmapOES, "glGenerateMipmapOES",
-          "context = %d, target = %s", CID(context),
+    EVENT(context, GLGenerateMipmapOES, "context = %d, target = %s", CID(context),
           GLenumToString(GLenumGroup::TextureTarget, target));
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGenerateMipmapOES(context, targetPacked));
@@ -8699,8 +8670,7 @@
                                                         GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetFramebufferAttachmentParameterivOES,
-          "glGetFramebufferAttachmentParameterivOES",
+    EVENT(context, GLGetFramebufferAttachmentParameterivOES,
           "context = %d, target = %s, attachment = %s, pname = %s, params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target),
           GLenumToString(GLenumGroup::FramebufferAttachment, attachment),
@@ -8729,7 +8699,7 @@
 void GL_APIENTRY GetRenderbufferParameterivOES(GLenum target, GLenum pname, GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetRenderbufferParameterivOES, "glGetRenderbufferParameterivOES",
+    EVENT(context, GLGetRenderbufferParameterivOES,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::RenderbufferTarget, target),
           GLenumToString(GLenumGroup::RenderbufferParameterName, pname), (uintptr_t)params);
@@ -8754,13 +8724,12 @@
 GLboolean GL_APIENTRY IsFramebufferOES(GLuint framebuffer)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IsFramebufferOES, "glIsFramebufferOES",
-          "context = %d, framebuffer = %u", CID(context), framebuffer);
+    EVENT(context, GLIsFramebufferOES, "context = %d, framebuffer = %u", CID(context), framebuffer);
 
     GLboolean returnValue;
     if (context)
     {
-        FramebufferID framebufferPacked                       = FromGL<FramebufferID>(framebuffer);
+        FramebufferID framebufferPacked = PackParam<FramebufferID>(framebuffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateIsFramebufferOES(context, framebufferPacked));
@@ -8770,14 +8739,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsFramebufferOES, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsFramebufferOES, GLboolean>();
         }
         ANGLE_CAPTURE(IsFramebufferOES, isCallValid, context, framebufferPacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::IsFramebufferOES, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsFramebufferOES, GLboolean>();
     }
     return returnValue;
 }
@@ -8785,13 +8754,13 @@
 GLboolean GL_APIENTRY IsRenderbufferOES(GLuint renderbuffer)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IsRenderbufferOES, "glIsRenderbufferOES",
-          "context = %d, renderbuffer = %u", CID(context), renderbuffer);
+    EVENT(context, GLIsRenderbufferOES, "context = %d, renderbuffer = %u", CID(context),
+          renderbuffer);
 
     GLboolean returnValue;
     if (context)
     {
-        RenderbufferID renderbufferPacked = FromGL<RenderbufferID>(renderbuffer);
+        RenderbufferID renderbufferPacked = PackParam<RenderbufferID>(renderbuffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateIsRenderbufferOES(context, renderbufferPacked));
@@ -8801,14 +8770,15 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsRenderbufferOES, GLboolean>();
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLIsRenderbufferOES, GLboolean>();
         }
         ANGLE_CAPTURE(IsRenderbufferOES, isCallValid, context, renderbufferPacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::IsRenderbufferOES, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsRenderbufferOES, GLboolean>();
     }
     return returnValue;
 }
@@ -8819,7 +8789,7 @@
                                         GLsizei height)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::RenderbufferStorageOES, "glRenderbufferStorageOES",
+    EVENT(context, GLRenderbufferStorageOES,
           "context = %d, target = %s, internalformat = %s, width = %d, height = %d", CID(context),
           GLenumToString(GLenumGroup::RenderbufferTarget, target),
           GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height);
@@ -8851,7 +8821,7 @@
                                      void *binary)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetProgramBinaryOES, "glGetProgramBinaryOES",
+    EVENT(context, GLGetProgramBinaryOES,
           "context = %d, program = %u, bufSize = %d, length = 0x%016" PRIxPTR
           ", binaryFormat = 0x%016" PRIxPTR ", binary = 0x%016" PRIxPTR "",
           CID(context), program, bufSize, (uintptr_t)length, (uintptr_t)binaryFormat,
@@ -8859,7 +8829,7 @@
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetProgramBinaryOES(context, programPacked, bufSize, length,
@@ -8883,14 +8853,14 @@
                                   GLint length)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::ProgramBinaryOES, "glProgramBinaryOES",
+    EVENT(context, GLProgramBinaryOES,
           "context = %d, program = %u, binaryFormat = %s, binary = 0x%016" PRIxPTR ", length = %d",
           CID(context), program, GLenumToString(GLenumGroup::DefaultGroup, binaryFormat),
           (uintptr_t)binary, length);
 
     if (context)
     {
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -8912,14 +8882,14 @@
 void GL_APIENTRY GetBufferPointervOES(GLenum target, GLenum pname, void **params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetBufferPointervOES, "glGetBufferPointervOES",
+    EVENT(context, GLGetBufferPointervOES,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::BufferTargetARB, target),
           GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
 
     if (context)
     {
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetBufferPointervOES(context, targetPacked, pname, params));
@@ -8938,15 +8908,14 @@
 void *GL_APIENTRY MapBufferOES(GLenum target, GLenum access)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MapBufferOES, "glMapBufferOES",
-          "context = %d, target = %s, access = %s", CID(context),
+    EVENT(context, GLMapBufferOES, "context = %d, target = %s, access = %s", CID(context),
           GLenumToString(GLenumGroup::BufferTargetARB, target),
           GLenumToString(GLenumGroup::BufferAccessARB, access));
 
     void *returnValue;
     if (context)
     {
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateMapBufferOES(context, targetPacked, access));
@@ -8956,14 +8925,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::MapBufferOES, void *>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLMapBufferOES, void *>();
         }
         ANGLE_CAPTURE(MapBufferOES, isCallValid, context, targetPacked, access, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::MapBufferOES, void *>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLMapBufferOES, void *>();
     }
     return returnValue;
 }
@@ -8971,13 +8940,13 @@
 GLboolean GL_APIENTRY UnmapBufferOES(GLenum target)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::UnmapBufferOES, "glUnmapBufferOES", "context = %d, target = %s",
-          CID(context), GLenumToString(GLenumGroup::DefaultGroup, target));
+    EVENT(context, GLUnmapBufferOES, "context = %d, target = %s", CID(context),
+          GLenumToString(GLenumGroup::DefaultGroup, target));
 
     GLboolean returnValue;
     if (context)
     {
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateUnmapBufferOES(context, targetPacked));
@@ -8987,14 +8956,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::UnmapBufferOES, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLUnmapBufferOES, GLboolean>();
         }
         ANGLE_CAPTURE(UnmapBufferOES, isCallValid, context, targetPacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::UnmapBufferOES, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLUnmapBufferOES, GLboolean>();
     }
     return returnValue;
 }
@@ -9003,8 +8972,8 @@
 void GL_APIENTRY CurrentPaletteMatrixOES(GLuint matrixpaletteindex)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CurrentPaletteMatrixOES, "glCurrentPaletteMatrixOES",
-          "context = %d, matrixpaletteindex = %u", CID(context), matrixpaletteindex);
+    EVENT(context, GLCurrentPaletteMatrixOES, "context = %d, matrixpaletteindex = %u", CID(context),
+          matrixpaletteindex);
 
     if (context)
     {
@@ -9026,8 +8995,7 @@
 void GL_APIENTRY LoadPaletteFromModelViewMatrixOES()
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::LoadPaletteFromModelViewMatrixOES,
-          "glLoadPaletteFromModelViewMatrixOES", "context = %d", CID(context));
+    EVENT(context, GLLoadPaletteFromModelViewMatrixOES, "context = %d", CID(context));
 
     if (context)
     {
@@ -9049,7 +9017,7 @@
 void GL_APIENTRY MatrixIndexPointerOES(GLint size, GLenum type, GLsizei stride, const void *pointer)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MatrixIndexPointerOES, "glMatrixIndexPointerOES",
+    EVENT(context, GLMatrixIndexPointerOES,
           "context = %d, size = %d, type = %s, stride = %d, pointer = 0x%016" PRIxPTR "",
           CID(context), size, GLenumToString(GLenumGroup::DefaultGroup, type), stride,
           (uintptr_t)pointer);
@@ -9074,7 +9042,7 @@
 void GL_APIENTRY WeightPointerOES(GLint size, GLenum type, GLsizei stride, const void *pointer)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::WeightPointerOES, "glWeightPointerOES",
+    EVENT(context, GLWeightPointerOES,
           "context = %d, size = %d, type = %s, stride = %d, pointer = 0x%016" PRIxPTR "",
           CID(context), size, GLenumToString(GLenumGroup::DefaultGroup, type), stride,
           (uintptr_t)pointer);
@@ -9100,13 +9068,13 @@
 void GL_APIENTRY PointSizePointerOES(GLenum type, GLsizei stride, const void *pointer)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::PointSizePointerOES, "glPointSizePointerOES",
+    EVENT(context, GLPointSizePointerOES,
           "context = %d, type = %s, stride = %d, pointer = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::DefaultGroup, type), stride, (uintptr_t)pointer);
 
     if (context)
     {
-        VertexAttribType typePacked                           = FromGL<VertexAttribType>(type);
+        VertexAttribType typePacked                           = PackParam<VertexAttribType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidatePointSizePointerOES(context, typePacked, stride, pointer));
@@ -9126,7 +9094,7 @@
 GLbitfield GL_APIENTRY QueryMatrixxOES(GLfixed *mantissa, GLint *exponent)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::QueryMatrixxOES, "glQueryMatrixxOES",
+    EVENT(context, GLQueryMatrixxOES,
           "context = %d, mantissa = 0x%016" PRIxPTR ", exponent = 0x%016" PRIxPTR "", CID(context),
           (uintptr_t)mantissa, (uintptr_t)exponent);
 
@@ -9142,14 +9110,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::QueryMatrixxOES, GLbitfield>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLQueryMatrixxOES, GLbitfield>();
         }
         ANGLE_CAPTURE(QueryMatrixxOES, isCallValid, context, mantissa, exponent, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::QueryMatrixxOES, GLbitfield>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLQueryMatrixxOES, GLbitfield>();
     }
     return returnValue;
 }
@@ -9158,8 +9126,7 @@
 void GL_APIENTRY MinSampleShadingOES(GLfloat value)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::MinSampleShadingOES, "glMinSampleShadingOES",
-          "context = %d, value = %f", CID(context), value);
+    EVENT(context, GLMinSampleShadingOES, "context = %d, value = %f", CID(context), value);
 
     if (context)
     {
@@ -9178,6 +9145,8 @@
     }
 }
 
+// GL_OES_shader_io_blocks
+
 // GL_OES_texture_3D
 void GL_APIENTRY CompressedTexImage3DOES(GLenum target,
                                          GLint level,
@@ -9190,7 +9159,7 @@
                                          const void *data)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CompressedTexImage3DOES, "glCompressedTexImage3DOES",
+    EVENT(context, GLCompressedTexImage3DOES,
           "context = %d, target = %s, level = %d, internalformat = %s, width = %d, height = %d, "
           "depth = %d, border = %d, imageSize = %d, data = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level,
@@ -9199,7 +9168,7 @@
 
     if (context)
     {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -9232,7 +9201,7 @@
                                             const void *data)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CompressedTexSubImage3DOES, "glCompressedTexSubImage3DOES",
+    EVENT(context, GLCompressedTexSubImage3DOES,
           "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, width "
           "= %d, height = %d, depth = %d, format = %s, imageSize = %d, data = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, xoffset, yoffset,
@@ -9241,7 +9210,7 @@
 
     if (context)
     {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateCompressedTexSubImage3DOES(
@@ -9272,7 +9241,7 @@
                                       GLsizei height)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::CopyTexSubImage3DOES, "glCopyTexSubImage3DOES",
+    EVENT(context, GLCopyTexSubImage3DOES,
           "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, x = "
           "%d, y = %d, width = %d, height = %d",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target), level, xoffset, yoffset,
@@ -9280,7 +9249,7 @@
 
     if (context)
     {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateCopyTexSubImage3DOES(context, targetPacked, level, xoffset,
@@ -9307,7 +9276,7 @@
                                          GLint zoffset)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::FramebufferTexture3DOES, "glFramebufferTexture3DOES",
+    EVENT(context, GLFramebufferTexture3DOES,
           "context = %d, target = %s, attachment = %s, textarget = %s, texture = %u, level = %d, "
           "zoffset = %d",
           CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target),
@@ -9316,8 +9285,8 @@
 
     if (context)
     {
-        TextureTarget textargetPacked                         = FromGL<TextureTarget>(textarget);
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
+        TextureTarget textargetPacked                         = PackParam<TextureTarget>(textarget);
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -9349,7 +9318,7 @@
                                const void *pixels)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexImage3DOES, "glTexImage3DOES",
+    EVENT(context, GLTexImage3DOES,
           "context = %d, target = %s, level = %d, internalformat = %s, width = %d, height = %d, "
           "depth = %d, border = %d, format = %s, type = %s, pixels = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level,
@@ -9359,7 +9328,7 @@
 
     if (context)
     {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -9392,7 +9361,7 @@
                                   const void *pixels)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexSubImage3DOES, "glTexSubImage3DOES",
+    EVENT(context, GLTexSubImage3DOES,
           "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, width "
           "= %d, height = %d, depth = %d, format = %s, type = %s, pixels = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, xoffset, yoffset,
@@ -9401,7 +9370,7 @@
 
     if (context)
     {
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -9425,13 +9394,13 @@
 void GL_APIENTRY GetSamplerParameterIivOES(GLuint sampler, GLenum pname, GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetSamplerParameterIivOES, "glGetSamplerParameterIivOES",
+    EVENT(context, GLGetSamplerParameterIivOES,
           "context = %d, sampler = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)params);
 
     if (context)
     {
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -9452,13 +9421,13 @@
 void GL_APIENTRY GetSamplerParameterIuivOES(GLuint sampler, GLenum pname, GLuint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetSamplerParameterIuivOES, "glGetSamplerParameterIuivOES",
+    EVENT(context, GLGetSamplerParameterIuivOES,
           "context = %d, sampler = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)params);
 
     if (context)
     {
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -9479,14 +9448,14 @@
 void GL_APIENTRY GetTexParameterIivOES(GLenum target, GLenum pname, GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTexParameterIivOES, "glGetTexParameterIivOES",
+    EVENT(context, GLGetTexParameterIivOES,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetTexParameterIivOES(context, targetPacked, pname, params));
@@ -9505,14 +9474,14 @@
 void GL_APIENTRY GetTexParameterIuivOES(GLenum target, GLenum pname, GLuint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTexParameterIuivOES, "glGetTexParameterIuivOES",
+    EVENT(context, GLGetTexParameterIuivOES,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetTexParameterIuivOES(context, targetPacked, pname, params));
@@ -9531,13 +9500,13 @@
 void GL_APIENTRY SamplerParameterIivOES(GLuint sampler, GLenum pname, const GLint *param)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SamplerParameterIivOES, "glSamplerParameterIivOES",
+    EVENT(context, GLSamplerParameterIivOES,
           "context = %d, sampler = %u, pname = %s, param = 0x%016" PRIxPTR "", CID(context),
           sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)param);
 
     if (context)
     {
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateSamplerParameterIivOES(context, samplerPacked, pname, param));
@@ -9556,13 +9525,13 @@
 void GL_APIENTRY SamplerParameterIuivOES(GLuint sampler, GLenum pname, const GLuint *param)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::SamplerParameterIuivOES, "glSamplerParameterIuivOES",
+    EVENT(context, GLSamplerParameterIuivOES,
           "context = %d, sampler = %u, pname = %s, param = 0x%016" PRIxPTR "", CID(context),
           sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)param);
 
     if (context)
     {
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateSamplerParameterIuivOES(context, samplerPacked, pname, param));
@@ -9581,14 +9550,14 @@
 void GL_APIENTRY TexParameterIivOES(GLenum target, GLenum pname, const GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexParameterIivOES, "glTexParameterIivOES",
+    EVENT(context, GLTexParameterIivOES,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::TextureParameterName, pname), (uintptr_t)params);
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexParameterIivOES(context, targetPacked, pname, params));
@@ -9607,14 +9576,14 @@
 void GL_APIENTRY TexParameterIuivOES(GLenum target, GLenum pname, const GLuint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexParameterIuivOES, "glTexParameterIuivOES",
+    EVENT(context, GLTexParameterIuivOES,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::TextureParameterName, pname), (uintptr_t)params);
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexParameterIuivOES(context, targetPacked, pname, params));
@@ -9634,15 +9603,14 @@
 void GL_APIENTRY TexBufferOES(GLenum target, GLenum internalformat, GLuint buffer)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexBufferOES, "glTexBufferOES",
-          "context = %d, target = %s, internalformat = %s, buffer = %u", CID(context),
-          GLenumToString(GLenumGroup::TextureTarget, target),
+    EVENT(context, GLTexBufferOES, "context = %d, target = %s, internalformat = %s, buffer = %u",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::InternalFormat, internalformat), buffer);
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -9667,7 +9635,7 @@
                                    GLsizeiptr size)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexBufferRangeOES, "glTexBufferRangeOES",
+    EVENT(context, GLTexBufferRangeOES,
           "context = %d, target = %s, internalformat = %s, buffer = %u, offset = %llu, size = %llu",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::InternalFormat, internalformat), buffer,
@@ -9675,8 +9643,8 @@
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexBufferRangeOES(context, targetPacked, internalformat,
@@ -9698,7 +9666,7 @@
 void GL_APIENTRY GetTexGenfvOES(GLenum coord, GLenum pname, GLfloat *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTexGenfvOES, "glGetTexGenfvOES",
+    EVENT(context, GLGetTexGenfvOES,
           "context = %d, coord = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureCoordName, coord),
           GLenumToString(GLenumGroup::TextureGenParameter, pname), (uintptr_t)params);
@@ -9723,7 +9691,7 @@
 void GL_APIENTRY GetTexGenivOES(GLenum coord, GLenum pname, GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTexGenivOES, "glGetTexGenivOES",
+    EVENT(context, GLGetTexGenivOES,
           "context = %d, coord = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureCoordName, coord),
           GLenumToString(GLenumGroup::TextureGenParameter, pname), (uintptr_t)params);
@@ -9748,7 +9716,7 @@
 void GL_APIENTRY GetTexGenxvOES(GLenum coord, GLenum pname, GLfixed *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GetTexGenxvOES, "glGetTexGenxvOES",
+    EVENT(context, GLGetTexGenxvOES,
           "context = %d, coord = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureCoordName, coord),
           GLenumToString(GLenumGroup::TextureGenParameter, pname), (uintptr_t)params);
@@ -9773,8 +9741,7 @@
 void GL_APIENTRY TexGenfOES(GLenum coord, GLenum pname, GLfloat param)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexGenfOES, "glTexGenfOES",
-          "context = %d, coord = %s, pname = %s, param = %f", CID(context),
+    EVENT(context, GLTexGenfOES, "context = %d, coord = %s, pname = %s, param = %f", CID(context),
           GLenumToString(GLenumGroup::TextureCoordName, coord),
           GLenumToString(GLenumGroup::TextureGenParameter, pname), param);
 
@@ -9798,7 +9765,7 @@
 void GL_APIENTRY TexGenfvOES(GLenum coord, GLenum pname, const GLfloat *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexGenfvOES, "glTexGenfvOES",
+    EVENT(context, GLTexGenfvOES,
           "context = %d, coord = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureCoordName, coord),
           GLenumToString(GLenumGroup::TextureGenParameter, pname), (uintptr_t)params);
@@ -9823,8 +9790,7 @@
 void GL_APIENTRY TexGeniOES(GLenum coord, GLenum pname, GLint param)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexGeniOES, "glTexGeniOES",
-          "context = %d, coord = %s, pname = %s, param = %d", CID(context),
+    EVENT(context, GLTexGeniOES, "context = %d, coord = %s, pname = %s, param = %d", CID(context),
           GLenumToString(GLenumGroup::TextureCoordName, coord),
           GLenumToString(GLenumGroup::TextureGenParameter, pname), param);
 
@@ -9848,7 +9814,7 @@
 void GL_APIENTRY TexGenivOES(GLenum coord, GLenum pname, const GLint *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexGenivOES, "glTexGenivOES",
+    EVENT(context, GLTexGenivOES,
           "context = %d, coord = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureCoordName, coord),
           GLenumToString(GLenumGroup::TextureGenParameter, pname), (uintptr_t)params);
@@ -9873,8 +9839,7 @@
 void GL_APIENTRY TexGenxOES(GLenum coord, GLenum pname, GLfixed param)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexGenxOES, "glTexGenxOES",
-          "context = %d, coord = %s, pname = %s, param = 0x%X", CID(context),
+    EVENT(context, GLTexGenxOES, "context = %d, coord = %s, pname = %s, param = 0x%X", CID(context),
           GLenumToString(GLenumGroup::TextureCoordName, coord),
           GLenumToString(GLenumGroup::TextureGenParameter, pname), param);
 
@@ -9898,7 +9863,7 @@
 void GL_APIENTRY TexGenxvOES(GLenum coord, GLenum pname, const GLfixed *params)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexGenxvOES, "glTexGenxvOES",
+    EVENT(context, GLTexGenxvOES,
           "context = %d, coord = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureCoordName, coord),
           GLenumToString(GLenumGroup::TextureGenParameter, pname), (uintptr_t)params);
@@ -9936,7 +9901,7 @@
                                             GLboolean fixedsamplelocations)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::TexStorage3DMultisampleOES, "glTexStorage3DMultisampleOES",
+    EVENT(context, GLTexStorage3DMultisampleOES,
           "context = %d, target = %s, samples = %d, internalformat = %s, width = %d, height = %d, "
           "depth = %d, fixedsamplelocations = %s",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), samples,
@@ -9945,7 +9910,7 @@
 
     if (context)
     {
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -9969,12 +9934,11 @@
 void GL_APIENTRY BindVertexArrayOES(GLuint array)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::BindVertexArrayOES, "glBindVertexArrayOES",
-          "context = %d, array = %u", CID(context), array);
+    EVENT(context, GLBindVertexArrayOES, "context = %d, array = %u", CID(context), array);
 
     if (context)
     {
-        VertexArrayID arrayPacked                             = FromGL<VertexArrayID>(array);
+        VertexArrayID arrayPacked                             = PackParam<VertexArrayID>(array);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateBindVertexArrayOES(context, arrayPacked));
@@ -9993,12 +9957,12 @@
 void GL_APIENTRY DeleteVertexArraysOES(GLsizei n, const GLuint *arrays)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::DeleteVertexArraysOES, "glDeleteVertexArraysOES",
-          "context = %d, n = %d, arrays = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)arrays);
+    EVENT(context, GLDeleteVertexArraysOES, "context = %d, n = %d, arrays = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)arrays);
 
     if (context)
     {
-        const VertexArrayID *arraysPacked = FromGL<const VertexArrayID *>(arrays);
+        const VertexArrayID *arraysPacked = PackParam<const VertexArrayID *>(arrays);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateDeleteVertexArraysOES(context, n, arraysPacked));
@@ -10017,12 +9981,12 @@
 void GL_APIENTRY GenVertexArraysOES(GLsizei n, GLuint *arrays)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::GenVertexArraysOES, "glGenVertexArraysOES",
-          "context = %d, n = %d, arrays = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)arrays);
+    EVENT(context, GLGenVertexArraysOES, "context = %d, n = %d, arrays = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)arrays);
 
     if (context)
     {
-        VertexArrayID *arraysPacked                           = FromGL<VertexArrayID *>(arrays);
+        VertexArrayID *arraysPacked                           = PackParam<VertexArrayID *>(arrays);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGenVertexArraysOES(context, n, arraysPacked));
@@ -10041,13 +10005,12 @@
 GLboolean GL_APIENTRY IsVertexArrayOES(GLuint array)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::IsVertexArrayOES, "glIsVertexArrayOES",
-          "context = %d, array = %u", CID(context), array);
+    EVENT(context, GLIsVertexArrayOES, "context = %d, array = %u", CID(context), array);
 
     GLboolean returnValue;
     if (context)
     {
-        VertexArrayID arrayPacked                             = FromGL<VertexArrayID>(array);
+        VertexArrayID arrayPacked                             = PackParam<VertexArrayID>(array);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateIsVertexArrayOES(context, arrayPacked));
@@ -10057,14 +10020,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsVertexArrayOES, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsVertexArrayOES, GLboolean>();
         }
         ANGLE_CAPTURE(IsVertexArrayOES, isCallValid, context, arrayPacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnCurrentGlobalContext();
-        returnValue = GetDefaultReturnValue<EntryPoint::IsVertexArrayOES, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsVertexArrayOES, GLboolean>();
     }
     return returnValue;
 }
@@ -10078,8 +10041,7 @@
                                                 GLsizei numViews)
 {
     Context *context = GetValidGlobalContext();
-    EVENT(context, gl::EntryPoint::FramebufferTextureMultiviewOVR,
-          "glFramebufferTextureMultiviewOVR",
+    EVENT(context, GLFramebufferTextureMultiviewOVR,
           "context = %d, target = %s, attachment = %s, texture = %u, level = %d, baseViewIndex = "
           "%d, numViews = %d",
           CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target),
@@ -10088,7 +10050,7 @@
 
     if (context)
     {
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -10114,14 +10076,14 @@
 void GL_APIENTRY ActiveShaderProgramContextANGLE(GLeglContext ctx, GLuint pipeline, GLuint program)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ActiveShaderProgram, "glActiveShaderProgram",
-          "context = %d, pipeline = %u, program = %u", CID(context), pipeline, program);
+    EVENT(context, GLActiveShaderProgram, "context = %d, pipeline = %u, program = %u", CID(context),
+          pipeline, program);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ProgramPipelineID pipelinePacked                      = FromGL<ProgramPipelineID>(pipeline);
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ProgramPipelineID pipelinePacked = PackParam<ProgramPipelineID>(pipeline);
+        ShaderProgramID programPacked    = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateActiveShaderProgram(context, pipelinePacked, programPacked));
@@ -10142,14 +10104,14 @@
                                                     GLuint program)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ActiveShaderProgramEXT, "glActiveShaderProgramEXT",
-          "context = %d, pipeline = %u, program = %u", CID(context), pipeline, program);
+    EVENT(context, GLActiveShaderProgramEXT, "context = %d, pipeline = %u, program = %u",
+          CID(context), pipeline, program);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ProgramPipelineID pipelinePacked                      = FromGL<ProgramPipelineID>(pipeline);
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ProgramPipelineID pipelinePacked = PackParam<ProgramPipelineID>(pipeline);
+        ShaderProgramID programPacked    = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateActiveShaderProgramEXT(context, pipelinePacked, programPacked));
@@ -10168,8 +10130,8 @@
 void GL_APIENTRY ActiveTextureContextANGLE(GLeglContext ctx, GLenum texture)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ActiveTexture, "glActiveTexture", "context = %d, texture = %s",
-          CID(context), GLenumToString(GLenumGroup::TextureUnit, texture));
+    EVENT(context, GLActiveTexture, "context = %d, texture = %s", CID(context),
+          GLenumToString(GLenumGroup::TextureUnit, texture));
 
     if (context && !context->isContextLost())
     {
@@ -10191,13 +10153,13 @@
 void GL_APIENTRY AlphaFuncContextANGLE(GLeglContext ctx, GLenum func, GLfloat ref)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::AlphaFunc, "glAlphaFunc", "context = %d, func = %s, ref = %f",
-          CID(context), GLenumToString(GLenumGroup::AlphaFunction, func), ref);
+    EVENT(context, GLAlphaFunc, "context = %d, func = %s, ref = %f", CID(context),
+          GLenumToString(GLenumGroup::AlphaFunction, func), ref);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        AlphaTestFunc funcPacked                              = FromGL<AlphaTestFunc>(func);
+        AlphaTestFunc funcPacked                              = PackParam<AlphaTestFunc>(func);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateAlphaFunc(context, funcPacked, ref));
@@ -10216,14 +10178,13 @@
 void GL_APIENTRY AlphaFuncxContextANGLE(GLeglContext ctx, GLenum func, GLfixed ref)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::AlphaFuncx, "glAlphaFuncx",
-          "context = %d, func = %s, ref = 0x%X", CID(context),
+    EVENT(context, GLAlphaFuncx, "context = %d, func = %s, ref = 0x%X", CID(context),
           GLenumToString(GLenumGroup::AlphaFunction, func), ref);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        AlphaTestFunc funcPacked                              = FromGL<AlphaTestFunc>(func);
+        AlphaTestFunc funcPacked                              = PackParam<AlphaTestFunc>(func);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateAlphaFuncx(context, funcPacked, ref));
@@ -10242,14 +10203,14 @@
 void GL_APIENTRY AttachShaderContextANGLE(GLeglContext ctx, GLuint program, GLuint shader)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::AttachShader, "glAttachShader",
-          "context = %d, program = %u, shader = %u", CID(context), program, shader);
+    EVENT(context, GLAttachShader, "context = %d, program = %u, shader = %u", CID(context), program,
+          shader);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        ShaderProgramID shaderPacked                          = FromGL<ShaderProgramID>(shader);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
+        ShaderProgramID shaderPacked                          = PackParam<ShaderProgramID>(shader);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateAttachShader(context, programPacked, shaderPacked));
@@ -10268,14 +10229,14 @@
 void GL_APIENTRY BeginQueryContextANGLE(GLeglContext ctx, GLenum target, GLuint id)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BeginQuery, "glBeginQuery", "context = %d, target = %s, id = %u",
-          CID(context), GLenumToString(GLenumGroup::QueryTarget, target), id);
+    EVENT(context, GLBeginQuery, "context = %d, target = %s, id = %u", CID(context),
+          GLenumToString(GLenumGroup::QueryTarget, target), id);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        QueryType targetPacked                                = FromGL<QueryType>(target);
-        QueryID idPacked                                      = FromGL<QueryID>(id);
+        QueryType targetPacked                                = PackParam<QueryType>(target);
+        QueryID idPacked                                      = PackParam<QueryID>(id);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateBeginQuery(context, targetPacked, idPacked));
@@ -10294,15 +10255,14 @@
 void GL_APIENTRY BeginQueryEXTContextANGLE(GLeglContext ctx, GLenum target, GLuint id)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BeginQueryEXT, "glBeginQueryEXT",
-          "context = %d, target = %s, id = %u", CID(context),
+    EVENT(context, GLBeginQueryEXT, "context = %d, target = %s, id = %u", CID(context),
           GLenumToString(GLenumGroup::QueryTarget, target), id);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        QueryType targetPacked                                = FromGL<QueryType>(target);
-        QueryID idPacked                                      = FromGL<QueryID>(id);
+        QueryType targetPacked                                = PackParam<QueryType>(target);
+        QueryID idPacked                                      = PackParam<QueryID>(id);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateBeginQueryEXT(context, targetPacked, idPacked));
@@ -10321,14 +10281,13 @@
 void GL_APIENTRY BeginTransformFeedbackContextANGLE(GLeglContext ctx, GLenum primitiveMode)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BeginTransformFeedback, "glBeginTransformFeedback",
-          "context = %d, primitiveMode = %s", CID(context),
+    EVENT(context, GLBeginTransformFeedback, "context = %d, primitiveMode = %s", CID(context),
           GLenumToString(GLenumGroup::PrimitiveType, primitiveMode));
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        PrimitiveMode primitiveModePacked = FromGL<PrimitiveMode>(primitiveMode);
+        PrimitiveMode primitiveModePacked = PackParam<PrimitiveMode>(primitiveMode);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateBeginTransformFeedback(context, primitiveModePacked));
@@ -10350,14 +10309,14 @@
                                                 const GLchar *name)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BindAttribLocation, "glBindAttribLocation",
+    EVENT(context, GLBindAttribLocation,
           "context = %d, program = %u, index = %u, name = 0x%016" PRIxPTR "", CID(context), program,
           index, (uintptr_t)name);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateBindAttribLocation(context, programPacked, index, name));
@@ -10376,15 +10335,14 @@
 void GL_APIENTRY BindBufferContextANGLE(GLeglContext ctx, GLenum target, GLuint buffer)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BindBuffer, "glBindBuffer",
-          "context = %d, target = %s, buffer = %u", CID(context),
+    EVENT(context, GLBindBuffer, "context = %d, target = %s, buffer = %u", CID(context),
           GLenumToString(GLenumGroup::BufferTargetARB, target), buffer);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateBindBuffer(context, targetPacked, bufferPacked));
@@ -10406,15 +10364,14 @@
                                             GLuint buffer)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BindBufferBase, "glBindBufferBase",
-          "context = %d, target = %s, index = %u, buffer = %u", CID(context),
-          GLenumToString(GLenumGroup::BufferTargetARB, target), index, buffer);
+    EVENT(context, GLBindBufferBase, "context = %d, target = %s, index = %u, buffer = %u",
+          CID(context), GLenumToString(GLenumGroup::BufferTargetARB, target), index, buffer);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateBindBufferBase(context, targetPacked, index, bufferPacked));
@@ -10438,7 +10395,7 @@
                                              GLsizeiptr size)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BindBufferRange, "glBindBufferRange",
+    EVENT(context, GLBindBufferRange,
           "context = %d, target = %s, index = %u, buffer = %u, offset = %llu, size = %llu",
           CID(context), GLenumToString(GLenumGroup::BufferTargetARB, target), index, buffer,
           static_cast<unsigned long long>(offset), static_cast<unsigned long long>(size));
@@ -10446,8 +10403,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -10471,14 +10428,14 @@
                                                      const GLchar *name)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BindFragDataLocationEXT, "glBindFragDataLocationEXT",
+    EVENT(context, GLBindFragDataLocationEXT,
           "context = %d, program = %u, color = %u, name = 0x%016" PRIxPTR "", CID(context), program,
           color, (uintptr_t)name);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateBindFragDataLocationEXT(context, programPacked, color, name));
@@ -10501,15 +10458,14 @@
                                                             const GLchar *name)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BindFragDataLocationIndexedEXT,
-          "glBindFragDataLocationIndexedEXT",
+    EVENT(context, GLBindFragDataLocationIndexedEXT,
           "context = %d, program = %u, colorNumber = %u, index = %u, name = 0x%016" PRIxPTR "",
           CID(context), program, colorNumber, index, (uintptr_t)name);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateBindFragDataLocationIndexedEXT(
@@ -10530,14 +10486,13 @@
 void GL_APIENTRY BindFramebufferContextANGLE(GLeglContext ctx, GLenum target, GLuint framebuffer)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BindFramebuffer, "glBindFramebuffer",
-          "context = %d, target = %s, framebuffer = %u", CID(context),
+    EVENT(context, GLBindFramebuffer, "context = %d, target = %s, framebuffer = %u", CID(context),
           GLenumToString(GLenumGroup::FramebufferTarget, target), framebuffer);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        FramebufferID framebufferPacked                       = FromGL<FramebufferID>(framebuffer);
+        FramebufferID framebufferPacked = PackParam<FramebufferID>(framebuffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateBindFramebuffer(context, target, framebufferPacked));
@@ -10556,14 +10511,13 @@
 void GL_APIENTRY BindFramebufferOESContextANGLE(GLeglContext ctx, GLenum target, GLuint framebuffer)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BindFramebufferOES, "glBindFramebufferOES",
-          "context = %d, target = %s, framebuffer = %u", CID(context),
-          GLenumToString(GLenumGroup::FramebufferTarget, target), framebuffer);
+    EVENT(context, GLBindFramebufferOES, "context = %d, target = %s, framebuffer = %u",
+          CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target), framebuffer);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        FramebufferID framebufferPacked                       = FromGL<FramebufferID>(framebuffer);
+        FramebufferID framebufferPacked = PackParam<FramebufferID>(framebuffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateBindFramebufferOES(context, target, framebufferPacked));
@@ -10589,7 +10543,7 @@
                                               GLenum format)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BindImageTexture, "glBindImageTexture",
+    EVENT(context, GLBindImageTexture,
           "context = %d, unit = %u, texture = %u, level = %d, layered = %s, layer = %d, access = "
           "%s, format = %s",
           CID(context), unit, texture, level, GLbooleanToString(layered), layer,
@@ -10599,7 +10553,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateBindImageTexture(context, unit, texturePacked, level, layered,
@@ -10620,13 +10574,12 @@
 void GL_APIENTRY BindProgramPipelineContextANGLE(GLeglContext ctx, GLuint pipeline)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BindProgramPipeline, "glBindProgramPipeline",
-          "context = %d, pipeline = %u", CID(context), pipeline);
+    EVENT(context, GLBindProgramPipeline, "context = %d, pipeline = %u", CID(context), pipeline);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ProgramPipelineID pipelinePacked                      = FromGL<ProgramPipelineID>(pipeline);
+        ProgramPipelineID pipelinePacked = PackParam<ProgramPipelineID>(pipeline);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateBindProgramPipeline(context, pipelinePacked));
@@ -10645,13 +10598,12 @@
 void GL_APIENTRY BindProgramPipelineEXTContextANGLE(GLeglContext ctx, GLuint pipeline)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BindProgramPipelineEXT, "glBindProgramPipelineEXT",
-          "context = %d, pipeline = %u", CID(context), pipeline);
+    EVENT(context, GLBindProgramPipelineEXT, "context = %d, pipeline = %u", CID(context), pipeline);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ProgramPipelineID pipelinePacked                      = FromGL<ProgramPipelineID>(pipeline);
+        ProgramPipelineID pipelinePacked = PackParam<ProgramPipelineID>(pipeline);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateBindProgramPipelineEXT(context, pipelinePacked));
@@ -10670,14 +10622,13 @@
 void GL_APIENTRY BindRenderbufferContextANGLE(GLeglContext ctx, GLenum target, GLuint renderbuffer)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BindRenderbuffer, "glBindRenderbuffer",
-          "context = %d, target = %s, renderbuffer = %u", CID(context),
+    EVENT(context, GLBindRenderbuffer, "context = %d, target = %s, renderbuffer = %u", CID(context),
           GLenumToString(GLenumGroup::RenderbufferTarget, target), renderbuffer);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        RenderbufferID renderbufferPacked = FromGL<RenderbufferID>(renderbuffer);
+        RenderbufferID renderbufferPacked = PackParam<RenderbufferID>(renderbuffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateBindRenderbuffer(context, target, renderbufferPacked));
@@ -10698,14 +10649,13 @@
                                                  GLuint renderbuffer)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BindRenderbufferOES, "glBindRenderbufferOES",
-          "context = %d, target = %s, renderbuffer = %u", CID(context),
-          GLenumToString(GLenumGroup::RenderbufferTarget, target), renderbuffer);
+    EVENT(context, GLBindRenderbufferOES, "context = %d, target = %s, renderbuffer = %u",
+          CID(context), GLenumToString(GLenumGroup::RenderbufferTarget, target), renderbuffer);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        RenderbufferID renderbufferPacked = FromGL<RenderbufferID>(renderbuffer);
+        RenderbufferID renderbufferPacked = PackParam<RenderbufferID>(renderbuffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateBindRenderbufferOES(context, target, renderbufferPacked));
@@ -10724,13 +10674,13 @@
 void GL_APIENTRY BindSamplerContextANGLE(GLeglContext ctx, GLuint unit, GLuint sampler)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BindSampler, "glBindSampler",
-          "context = %d, unit = %u, sampler = %u", CID(context), unit, sampler);
+    EVENT(context, GLBindSampler, "context = %d, unit = %u, sampler = %u", CID(context), unit,
+          sampler);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateBindSampler(context, unit, samplerPacked));
@@ -10749,15 +10699,14 @@
 void GL_APIENTRY BindTextureContextANGLE(GLeglContext ctx, GLenum target, GLuint texture)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BindTexture, "glBindTexture",
-          "context = %d, target = %s, texture = %u", CID(context),
+    EVENT(context, GLBindTexture, "context = %d, target = %s, texture = %u", CID(context),
           GLenumToString(GLenumGroup::TextureTarget, target), texture);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateBindTexture(context, targetPacked, texturePacked));
@@ -10776,14 +10725,13 @@
 void GL_APIENTRY BindTransformFeedbackContextANGLE(GLeglContext ctx, GLenum target, GLuint id)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BindTransformFeedback, "glBindTransformFeedback",
-          "context = %d, target = %s, id = %u", CID(context),
+    EVENT(context, GLBindTransformFeedback, "context = %d, target = %s, id = %u", CID(context),
           GLenumToString(GLenumGroup::BindTransformFeedbackTarget, target), id);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TransformFeedbackID idPacked                          = FromGL<TransformFeedbackID>(id);
+        TransformFeedbackID idPacked                          = PackParam<TransformFeedbackID>(id);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateBindTransformFeedback(context, target, idPacked));
@@ -10802,13 +10750,12 @@
 void GL_APIENTRY BindVertexArrayContextANGLE(GLeglContext ctx, GLuint array)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BindVertexArray, "glBindVertexArray", "context = %d, array = %u",
-          CID(context), array);
+    EVENT(context, GLBindVertexArray, "context = %d, array = %u", CID(context), array);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        VertexArrayID arrayPacked                             = FromGL<VertexArrayID>(array);
+        VertexArrayID arrayPacked                             = PackParam<VertexArrayID>(array);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateBindVertexArray(context, arrayPacked));
@@ -10827,13 +10774,12 @@
 void GL_APIENTRY BindVertexArrayOESContextANGLE(GLeglContext ctx, GLuint array)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BindVertexArrayOES, "glBindVertexArrayOES",
-          "context = %d, array = %u", CID(context), array);
+    EVENT(context, GLBindVertexArrayOES, "context = %d, array = %u", CID(context), array);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        VertexArrayID arrayPacked                             = FromGL<VertexArrayID>(array);
+        VertexArrayID arrayPacked                             = PackParam<VertexArrayID>(array);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateBindVertexArrayOES(context, arrayPacked));
@@ -10856,14 +10802,14 @@
                                               GLsizei stride)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BindVertexBuffer, "glBindVertexBuffer",
+    EVENT(context, GLBindVertexBuffer,
           "context = %d, bindingindex = %u, buffer = %u, offset = %llu, stride = %d", CID(context),
           bindingindex, buffer, static_cast<unsigned long long>(offset), stride);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -10884,7 +10830,7 @@
 void GL_APIENTRY BlendBarrierContextANGLE(GLeglContext ctx)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BlendBarrier, "glBlendBarrier", "context = %d", CID(context));
+    EVENT(context, GLBlendBarrier, "context = %d", CID(context));
 
     if (context && !context->isContextLost())
     {
@@ -10907,9 +10853,8 @@
 BlendColorContextANGLE(GLeglContext ctx, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BlendColor, "glBlendColor",
-          "context = %d, red = %f, green = %f, blue = %f, alpha = %f", CID(context), red, green,
-          blue, alpha);
+    EVENT(context, GLBlendColor, "context = %d, red = %f, green = %f, blue = %f, alpha = %f",
+          CID(context), red, green, blue, alpha);
 
     if (context && !context->isContextLost())
     {
@@ -10932,8 +10877,8 @@
 void GL_APIENTRY BlendEquationContextANGLE(GLeglContext ctx, GLenum mode)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BlendEquation, "glBlendEquation", "context = %d, mode = %s",
-          CID(context), GLenumToString(GLenumGroup::BlendEquationModeEXT, mode));
+    EVENT(context, GLBlendEquation, "context = %d, mode = %s", CID(context),
+          GLenumToString(GLenumGroup::BlendEquationModeEXT, mode));
 
     if (context && !context->isContextLost())
     {
@@ -10957,9 +10902,8 @@
                                                    GLenum modeAlpha)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BlendEquationSeparate, "glBlendEquationSeparate",
-          "context = %d, modeRGB = %s, modeAlpha = %s", CID(context),
-          GLenumToString(GLenumGroup::BlendEquationModeEXT, modeRGB),
+    EVENT(context, GLBlendEquationSeparate, "context = %d, modeRGB = %s, modeAlpha = %s",
+          CID(context), GLenumToString(GLenumGroup::BlendEquationModeEXT, modeRGB),
           GLenumToString(GLenumGroup::BlendEquationModeEXT, modeAlpha));
 
     if (context && !context->isContextLost())
@@ -10986,9 +10930,8 @@
                                                     GLenum modeAlpha)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BlendEquationSeparatei, "glBlendEquationSeparatei",
-          "context = %d, buf = %u, modeRGB = %s, modeAlpha = %s", CID(context), buf,
-          GLenumToString(GLenumGroup::BlendEquationModeEXT, modeRGB),
+    EVENT(context, GLBlendEquationSeparatei, "context = %d, buf = %u, modeRGB = %s, modeAlpha = %s",
+          CID(context), buf, GLenumToString(GLenumGroup::BlendEquationModeEXT, modeRGB),
           GLenumToString(GLenumGroup::BlendEquationModeEXT, modeAlpha));
 
     if (context && !context->isContextLost())
@@ -11015,7 +10958,7 @@
                                                        GLenum modeAlpha)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BlendEquationSeparateiEXT, "glBlendEquationSeparateiEXT",
+    EVENT(context, GLBlendEquationSeparateiEXT,
           "context = %d, buf = %u, modeRGB = %s, modeAlpha = %s", CID(context), buf,
           GLenumToString(GLenumGroup::BlendEquationModeEXT, modeRGB),
           GLenumToString(GLenumGroup::BlendEquationModeEXT, modeAlpha));
@@ -11044,7 +10987,7 @@
                                                        GLenum modeAlpha)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BlendEquationSeparateiOES, "glBlendEquationSeparateiOES",
+    EVENT(context, GLBlendEquationSeparateiOES,
           "context = %d, buf = %u, modeRGB = %s, modeAlpha = %s", CID(context), buf,
           GLenumToString(GLenumGroup::BlendEquationModeEXT, modeRGB),
           GLenumToString(GLenumGroup::BlendEquationModeEXT, modeAlpha));
@@ -11070,8 +11013,7 @@
 void GL_APIENTRY BlendEquationiContextANGLE(GLeglContext ctx, GLuint buf, GLenum mode)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BlendEquationi, "glBlendEquationi",
-          "context = %d, buf = %u, mode = %s", CID(context), buf,
+    EVENT(context, GLBlendEquationi, "context = %d, buf = %u, mode = %s", CID(context), buf,
           GLenumToString(GLenumGroup::BlendEquationModeEXT, mode));
 
     if (context && !context->isContextLost())
@@ -11095,8 +11037,7 @@
 void GL_APIENTRY BlendEquationiEXTContextANGLE(GLeglContext ctx, GLuint buf, GLenum mode)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BlendEquationiEXT, "glBlendEquationiEXT",
-          "context = %d, buf = %u, mode = %s", CID(context), buf,
+    EVENT(context, GLBlendEquationiEXT, "context = %d, buf = %u, mode = %s", CID(context), buf,
           GLenumToString(GLenumGroup::BlendEquationModeEXT, mode));
 
     if (context && !context->isContextLost())
@@ -11120,8 +11061,7 @@
 void GL_APIENTRY BlendEquationiOESContextANGLE(GLeglContext ctx, GLuint buf, GLenum mode)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BlendEquationiOES, "glBlendEquationiOES",
-          "context = %d, buf = %u, mode = %s", CID(context), buf,
+    EVENT(context, GLBlendEquationiOES, "context = %d, buf = %u, mode = %s", CID(context), buf,
           GLenumToString(GLenumGroup::BlendEquationModeEXT, mode));
 
     if (context && !context->isContextLost())
@@ -11145,8 +11085,7 @@
 void GL_APIENTRY BlendFuncContextANGLE(GLeglContext ctx, GLenum sfactor, GLenum dfactor)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BlendFunc, "glBlendFunc",
-          "context = %d, sfactor = %s, dfactor = %s", CID(context),
+    EVENT(context, GLBlendFunc, "context = %d, sfactor = %s, dfactor = %s", CID(context),
           GLenumToString(GLenumGroup::BlendingFactor, sfactor),
           GLenumToString(GLenumGroup::BlendingFactor, dfactor));
 
@@ -11175,7 +11114,7 @@
                                                GLenum dfactorAlpha)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BlendFuncSeparate, "glBlendFuncSeparate",
+    EVENT(context, GLBlendFuncSeparate,
           "context = %d, sfactorRGB = %s, dfactorRGB = %s, sfactorAlpha = %s, dfactorAlpha = %s",
           CID(context), GLenumToString(GLenumGroup::BlendingFactor, sfactorRGB),
           GLenumToString(GLenumGroup::BlendingFactor, dfactorRGB),
@@ -11210,7 +11149,7 @@
                                                 GLenum dstAlpha)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BlendFuncSeparatei, "glBlendFuncSeparatei",
+    EVENT(context, GLBlendFuncSeparatei,
           "context = %d, buf = %u, srcRGB = %s, dstRGB = %s, srcAlpha = %s, dstAlpha = %s",
           CID(context), buf, GLenumToString(GLenumGroup::BlendingFactor, srcRGB),
           GLenumToString(GLenumGroup::BlendingFactor, dstRGB),
@@ -11245,7 +11184,7 @@
                                                    GLenum dstAlpha)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BlendFuncSeparateiEXT, "glBlendFuncSeparateiEXT",
+    EVENT(context, GLBlendFuncSeparateiEXT,
           "context = %d, buf = %u, srcRGB = %s, dstRGB = %s, srcAlpha = %s, dstAlpha = %s",
           CID(context), buf, GLenumToString(GLenumGroup::BlendingFactor, srcRGB),
           GLenumToString(GLenumGroup::BlendingFactor, dstRGB),
@@ -11280,7 +11219,7 @@
                                                    GLenum dstAlpha)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BlendFuncSeparateiOES, "glBlendFuncSeparateiOES",
+    EVENT(context, GLBlendFuncSeparateiOES,
           "context = %d, buf = %u, srcRGB = %s, dstRGB = %s, srcAlpha = %s, dstAlpha = %s",
           CID(context), buf, GLenumToString(GLenumGroup::BlendingFactor, srcRGB),
           GLenumToString(GLenumGroup::BlendingFactor, dstRGB),
@@ -11310,8 +11249,7 @@
 void GL_APIENTRY BlendFunciContextANGLE(GLeglContext ctx, GLuint buf, GLenum src, GLenum dst)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BlendFunci, "glBlendFunci",
-          "context = %d, buf = %u, src = %s, dst = %s", CID(context), buf,
+    EVENT(context, GLBlendFunci, "context = %d, buf = %u, src = %s, dst = %s", CID(context), buf,
           GLenumToString(GLenumGroup::BlendingFactor, src),
           GLenumToString(GLenumGroup::BlendingFactor, dst));
 
@@ -11336,8 +11274,7 @@
 void GL_APIENTRY BlendFunciEXTContextANGLE(GLeglContext ctx, GLuint buf, GLenum src, GLenum dst)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BlendFunciEXT, "glBlendFunciEXT",
-          "context = %d, buf = %u, src = %s, dst = %s", CID(context), buf,
+    EVENT(context, GLBlendFunciEXT, "context = %d, buf = %u, src = %s, dst = %s", CID(context), buf,
           GLenumToString(GLenumGroup::BlendingFactor, src),
           GLenumToString(GLenumGroup::BlendingFactor, dst));
 
@@ -11362,8 +11299,7 @@
 void GL_APIENTRY BlendFunciOESContextANGLE(GLeglContext ctx, GLuint buf, GLenum src, GLenum dst)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BlendFunciOES, "glBlendFunciOES",
-          "context = %d, buf = %u, src = %s, dst = %s", CID(context), buf,
+    EVENT(context, GLBlendFunciOES, "context = %d, buf = %u, src = %s, dst = %s", CID(context), buf,
           GLenumToString(GLenumGroup::BlendingFactor, src),
           GLenumToString(GLenumGroup::BlendingFactor, dst));
 
@@ -11398,7 +11334,7 @@
                                              GLenum filter)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BlitFramebuffer, "glBlitFramebuffer",
+    EVENT(context, GLBlitFramebuffer,
           "context = %d, srcX0 = %d, srcY0 = %d, srcX1 = %d, srcY1 = %d, dstX0 = %d, dstY0 = %d, "
           "dstX1 = %d, dstY1 = %d, mask = %s, filter = %s",
           CID(context), srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
@@ -11439,7 +11375,7 @@
                                                   GLenum filter)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BlitFramebufferANGLE, "glBlitFramebufferANGLE",
+    EVENT(context, GLBlitFramebufferANGLE,
           "context = %d, srcX0 = %d, srcY0 = %d, srcX1 = %d, srcY1 = %d, dstX0 = %d, dstY0 = %d, "
           "dstX1 = %d, dstY1 = %d, mask = %s, filter = %s",
           CID(context), srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
@@ -11474,7 +11410,7 @@
                                         GLenum usage)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BufferData, "glBufferData",
+    EVENT(context, GLBufferData,
           "context = %d, target = %s, size = %llu, data = 0x%016" PRIxPTR ", usage = %s",
           CID(context), GLenumToString(GLenumGroup::BufferTargetARB, target),
           static_cast<unsigned long long>(size), (uintptr_t)data,
@@ -11483,8 +11419,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
-        BufferUsage usagePacked                               = FromGL<BufferUsage>(usage);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
+        BufferUsage usagePacked                               = PackParam<BufferUsage>(usage);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateBufferData(context, targetPacked, size, data, usagePacked));
@@ -11507,7 +11443,7 @@
                                               GLbitfield flags)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BufferStorageEXT, "glBufferStorageEXT",
+    EVENT(context, GLBufferStorageEXT,
           "context = %d, target = %s, size = %llu, data = 0x%016" PRIxPTR ", flags = %s",
           CID(context), GLenumToString(GLenumGroup::BufferStorageTarget, target),
           static_cast<unsigned long long>(size), (uintptr_t)data,
@@ -11516,7 +11452,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateBufferStorageEXT(context, targetPacked, size, data, flags));
@@ -11540,7 +11476,7 @@
                                                       GLbitfield flags)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BufferStorageExternalEXT, "glBufferStorageExternalEXT",
+    EVENT(context, GLBufferStorageExternalEXT,
           "context = %d, target = %s, offset = %llu, size = %llu, clientBuffer = 0x%016" PRIxPTR
           ", flags = %s",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target),
@@ -11551,7 +11487,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateBufferStorageExternalEXT(context, targetPacked, offset, size,
@@ -11576,7 +11512,7 @@
                                                  GLuint64 offset)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BufferStorageMemEXT, "glBufferStorageMemEXT",
+    EVENT(context, GLBufferStorageMemEXT,
           "context = %d, target = %s, size = %llu, memory = %u, offset = %llu", CID(context),
           GLenumToString(GLenumGroup::BufferTargetARB, target),
           static_cast<unsigned long long>(size), memory, static_cast<unsigned long long>(offset));
@@ -11584,8 +11520,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        MemoryObjectID memoryPacked                           = FromGL<MemoryObjectID>(memory);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        MemoryObjectID memoryPacked                           = PackParam<MemoryObjectID>(memory);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -11610,7 +11546,7 @@
                                            const void *data)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BufferSubData, "glBufferSubData",
+    EVENT(context, GLBufferSubData,
           "context = %d, target = %s, offset = %llu, size = %llu, data = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::BufferTargetARB, target),
           static_cast<unsigned long long>(offset), static_cast<unsigned long long>(size),
@@ -11619,7 +11555,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateBufferSubData(context, targetPacked, offset, size, data));
@@ -11638,8 +11574,7 @@
 GLenum GL_APIENTRY CheckFramebufferStatusContextANGLE(GLeglContext ctx, GLenum target)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::CheckFramebufferStatus, "glCheckFramebufferStatus",
-          "context = %d, target = %s", CID(context),
+    EVENT(context, GLCheckFramebufferStatus, "context = %d, target = %s", CID(context),
           GLenumToString(GLenumGroup::FramebufferTarget, target));
 
     GLenum returnValue;
@@ -11655,14 +11590,15 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::CheckFramebufferStatus, GLenum>();
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLCheckFramebufferStatus, GLenum>();
         }
         ANGLE_CAPTURE(CheckFramebufferStatus, isCallValid, context, target, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::CheckFramebufferStatus, GLenum>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLCheckFramebufferStatus, GLenum>();
     }
     return returnValue;
 }
@@ -11670,8 +11606,7 @@
 GLenum GL_APIENTRY CheckFramebufferStatusOESContextANGLE(GLeglContext ctx, GLenum target)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::CheckFramebufferStatusOES, "glCheckFramebufferStatusOES",
-          "context = %d, target = %s", CID(context),
+    EVENT(context, GLCheckFramebufferStatusOES, "context = %d, target = %s", CID(context),
           GLenumToString(GLenumGroup::FramebufferTarget, target));
 
     GLenum returnValue;
@@ -11687,14 +11622,16 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::CheckFramebufferStatusOES, GLenum>();
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLCheckFramebufferStatusOES, GLenum>();
         }
         ANGLE_CAPTURE(CheckFramebufferStatusOES, isCallValid, context, target, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::CheckFramebufferStatusOES, GLenum>();
+        returnValue =
+            GetDefaultReturnValue<angle::EntryPoint::GLCheckFramebufferStatusOES, GLenum>();
     }
     return returnValue;
 }
@@ -11702,7 +11639,7 @@
 void GL_APIENTRY ClearContextANGLE(GLeglContext ctx, GLbitfield mask)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Clear, "glClear", "context = %d, mask = %s", CID(context),
+    EVENT(context, GLClear, "context = %d, mask = %s", CID(context),
           GLbitfieldToString(GLenumGroup::ClearBufferMask, mask).c_str());
 
     if (context && !context->isContextLost())
@@ -11729,7 +11666,7 @@
                                            GLint stencil)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ClearBufferfi, "glClearBufferfi",
+    EVENT(context, GLClearBufferfi,
           "context = %d, buffer = %s, drawbuffer = %d, depth = %f, stencil = %d", CID(context),
           GLenumToString(GLenumGroup::Buffer, buffer), drawbuffer, depth, stencil);
 
@@ -11757,7 +11694,7 @@
                                            const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ClearBufferfv, "glClearBufferfv",
+    EVENT(context, GLClearBufferfv,
           "context = %d, buffer = %s, drawbuffer = %d, value = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::Buffer, buffer), drawbuffer, (uintptr_t)value);
 
@@ -11785,7 +11722,7 @@
                                            const GLint *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ClearBufferiv, "glClearBufferiv",
+    EVENT(context, GLClearBufferiv,
           "context = %d, buffer = %s, drawbuffer = %d, value = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::Buffer, buffer), drawbuffer, (uintptr_t)value);
 
@@ -11813,7 +11750,7 @@
                                             const GLuint *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ClearBufferuiv, "glClearBufferuiv",
+    EVENT(context, GLClearBufferuiv,
           "context = %d, buffer = %s, drawbuffer = %d, value = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::Buffer, buffer), drawbuffer, (uintptr_t)value);
 
@@ -11839,9 +11776,8 @@
 ClearColorContextANGLE(GLeglContext ctx, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ClearColor, "glClearColor",
-          "context = %d, red = %f, green = %f, blue = %f, alpha = %f", CID(context), red, green,
-          blue, alpha);
+    EVENT(context, GLClearColor, "context = %d, red = %f, green = %f, blue = %f, alpha = %f",
+          CID(context), red, green, blue, alpha);
 
     if (context && !context->isContextLost())
     {
@@ -11865,7 +11801,7 @@
 ClearColorxContextANGLE(GLeglContext ctx, GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ClearColorx, "glClearColorx",
+    EVENT(context, GLClearColorx,
           "context = %d, red = 0x%X, green = 0x%X, blue = 0x%X, alpha = 0x%X", CID(context), red,
           green, blue, alpha);
 
@@ -11890,8 +11826,7 @@
 void GL_APIENTRY ClearDepthfContextANGLE(GLeglContext ctx, GLfloat d)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ClearDepthf, "glClearDepthf", "context = %d, d = %f",
-          CID(context), d);
+    EVENT(context, GLClearDepthf, "context = %d, d = %f", CID(context), d);
 
     if (context && !context->isContextLost())
     {
@@ -11913,8 +11848,7 @@
 void GL_APIENTRY ClearDepthxContextANGLE(GLeglContext ctx, GLfixed depth)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ClearDepthx, "glClearDepthx", "context = %d, depth = 0x%X",
-          CID(context), depth);
+    EVENT(context, GLClearDepthx, "context = %d, depth = 0x%X", CID(context), depth);
 
     if (context && !context->isContextLost())
     {
@@ -11936,8 +11870,7 @@
 void GL_APIENTRY ClearStencilContextANGLE(GLeglContext ctx, GLint s)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ClearStencil, "glClearStencil", "context = %d, s = %d",
-          CID(context), s);
+    EVENT(context, GLClearStencil, "context = %d, s = %d", CID(context), s);
 
     if (context && !context->isContextLost())
     {
@@ -11959,8 +11892,7 @@
 void GL_APIENTRY ClientActiveTextureContextANGLE(GLeglContext ctx, GLenum texture)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ClientActiveTexture, "glClientActiveTexture",
-          "context = %d, texture = %s", CID(context),
+    EVENT(context, GLClientActiveTexture, "context = %d, texture = %s", CID(context),
           GLenumToString(GLenumGroup::TextureUnit, texture));
 
     if (context && !context->isContextLost())
@@ -11987,7 +11919,7 @@
                                               GLuint64 timeout)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ClientWaitSync, "glClientWaitSync",
+    EVENT(context, GLClientWaitSync,
           "context = %d, sync = 0x%016" PRIxPTR ", flags = %s, timeout = %llu", CID(context),
           (uintptr_t)sync, GLbitfieldToString(GLenumGroup::SyncObjectMask, flags).c_str(),
           static_cast<unsigned long long>(timeout));
@@ -12005,14 +11937,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::ClientWaitSync, GLenum>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLClientWaitSync, GLenum>();
         }
         ANGLE_CAPTURE(ClientWaitSync, isCallValid, context, sync, flags, timeout, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::ClientWaitSync, GLenum>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLClientWaitSync, GLenum>();
     }
     return returnValue;
 }
@@ -12020,8 +11952,7 @@
 void GL_APIENTRY ClipPlanefContextANGLE(GLeglContext ctx, GLenum p, const GLfloat *eqn)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ClipPlanef, "glClipPlanef",
-          "context = %d, p = %s, eqn = 0x%016" PRIxPTR "", CID(context),
+    EVENT(context, GLClipPlanef, "context = %d, p = %s, eqn = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::ClipPlaneName, p), (uintptr_t)eqn);
 
     if (context && !context->isContextLost())
@@ -12044,9 +11975,8 @@
 void GL_APIENTRY ClipPlanexContextANGLE(GLeglContext ctx, GLenum plane, const GLfixed *equation)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ClipPlanex, "glClipPlanex",
-          "context = %d, plane = %s, equation = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::ClipPlaneName, plane), (uintptr_t)equation);
+    EVENT(context, GLClipPlanex, "context = %d, plane = %s, equation = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::ClipPlaneName, plane), (uintptr_t)equation);
 
     if (context && !context->isContextLost())
     {
@@ -12070,9 +12000,8 @@
 Color4fContextANGLE(GLeglContext ctx, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Color4f, "glColor4f",
-          "context = %d, red = %f, green = %f, blue = %f, alpha = %f", CID(context), red, green,
-          blue, alpha);
+    EVENT(context, GLColor4f, "context = %d, red = %f, green = %f, blue = %f, alpha = %f",
+          CID(context), red, green, blue, alpha);
 
     if (context && !context->isContextLost())
     {
@@ -12096,9 +12025,8 @@
 Color4ubContextANGLE(GLeglContext ctx, GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Color4ub, "glColor4ub",
-          "context = %d, red = %d, green = %d, blue = %d, alpha = %d", CID(context), red, green,
-          blue, alpha);
+    EVENT(context, GLColor4ub, "context = %d, red = %d, green = %d, blue = %d, alpha = %d",
+          CID(context), red, green, blue, alpha);
 
     if (context && !context->isContextLost())
     {
@@ -12122,9 +12050,8 @@
 Color4xContextANGLE(GLeglContext ctx, GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Color4x, "glColor4x",
-          "context = %d, red = 0x%X, green = 0x%X, blue = 0x%X, alpha = 0x%X", CID(context), red,
-          green, blue, alpha);
+    EVENT(context, GLColor4x, "context = %d, red = 0x%X, green = 0x%X, blue = 0x%X, alpha = 0x%X",
+          CID(context), red, green, blue, alpha);
 
     if (context && !context->isContextLost())
     {
@@ -12151,9 +12078,8 @@
                                        GLboolean alpha)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ColorMask, "glColorMask",
-          "context = %d, red = %s, green = %s, blue = %s, alpha = %s", CID(context),
-          GLbooleanToString(red), GLbooleanToString(green), GLbooleanToString(blue),
+    EVENT(context, GLColorMask, "context = %d, red = %s, green = %s, blue = %s, alpha = %s",
+          CID(context), GLbooleanToString(red), GLbooleanToString(green), GLbooleanToString(blue),
           GLbooleanToString(alpha));
 
     if (context && !context->isContextLost())
@@ -12182,9 +12108,9 @@
                                         GLboolean a)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ColorMaski, "glColorMaski",
-          "context = %d, index = %u, r = %s, g = %s, b = %s, a = %s", CID(context), index,
-          GLbooleanToString(r), GLbooleanToString(g), GLbooleanToString(b), GLbooleanToString(a));
+    EVENT(context, GLColorMaski, "context = %d, index = %u, r = %s, g = %s, b = %s, a = %s",
+          CID(context), index, GLbooleanToString(r), GLbooleanToString(g), GLbooleanToString(b),
+          GLbooleanToString(a));
 
     if (context && !context->isContextLost())
     {
@@ -12212,9 +12138,9 @@
                                            GLboolean a)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ColorMaskiEXT, "glColorMaskiEXT",
-          "context = %d, index = %u, r = %s, g = %s, b = %s, a = %s", CID(context), index,
-          GLbooleanToString(r), GLbooleanToString(g), GLbooleanToString(b), GLbooleanToString(a));
+    EVENT(context, GLColorMaskiEXT, "context = %d, index = %u, r = %s, g = %s, b = %s, a = %s",
+          CID(context), index, GLbooleanToString(r), GLbooleanToString(g), GLbooleanToString(b),
+          GLbooleanToString(a));
 
     if (context && !context->isContextLost())
     {
@@ -12242,9 +12168,9 @@
                                            GLboolean a)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ColorMaskiOES, "glColorMaskiOES",
-          "context = %d, index = %u, r = %s, g = %s, b = %s, a = %s", CID(context), index,
-          GLbooleanToString(r), GLbooleanToString(g), GLbooleanToString(b), GLbooleanToString(a));
+    EVENT(context, GLColorMaskiOES, "context = %d, index = %u, r = %s, g = %s, b = %s, a = %s",
+          CID(context), index, GLbooleanToString(r), GLbooleanToString(g), GLbooleanToString(b),
+          GLbooleanToString(a));
 
     if (context && !context->isContextLost())
     {
@@ -12271,7 +12197,7 @@
                                           const void *pointer)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ColorPointer, "glColorPointer",
+    EVENT(context, GLColorPointer,
           "context = %d, size = %d, type = %s, stride = %d, pointer = 0x%016" PRIxPTR "",
           CID(context), size, GLenumToString(GLenumGroup::ColorPointerType, type), stride,
           (uintptr_t)pointer);
@@ -12279,7 +12205,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        VertexAttribType typePacked                           = FromGL<VertexAttribType>(type);
+        VertexAttribType typePacked                           = PackParam<VertexAttribType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateColorPointer(context, size, typePacked, stride, pointer));
@@ -12298,13 +12224,12 @@
 void GL_APIENTRY CompileShaderContextANGLE(GLeglContext ctx, GLuint shader)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::CompileShader, "glCompileShader", "context = %d, shader = %u",
-          CID(context), shader);
+    EVENT(context, GLCompileShader, "context = %d, shader = %u", CID(context), shader);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID shaderPacked                          = FromGL<ShaderProgramID>(shader);
+        ShaderProgramID shaderPacked                          = PackParam<ShaderProgramID>(shader);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateCompileShader(context, shaderPacked));
@@ -12331,7 +12256,7 @@
                                                   const void *data)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::CompressedTexImage2D, "glCompressedTexImage2D",
+    EVENT(context, GLCompressedTexImage2D,
           "context = %d, target = %s, level = %d, internalformat = %s, width = %d, height = %d, "
           "border = %d, imageSize = %d, data = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level,
@@ -12341,7 +12266,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -12373,7 +12298,7 @@
                                                   const void *data)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::CompressedTexImage3D, "glCompressedTexImage3D",
+    EVENT(context, GLCompressedTexImage3D,
           "context = %d, target = %s, level = %d, internalformat = %s, width = %d, height = %d, "
           "depth = %d, border = %d, imageSize = %d, data = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level,
@@ -12383,7 +12308,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -12415,7 +12340,7 @@
                                                      const void *data)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::CompressedTexImage3DOES, "glCompressedTexImage3DOES",
+    EVENT(context, GLCompressedTexImage3DOES,
           "context = %d, target = %s, level = %d, internalformat = %s, width = %d, height = %d, "
           "depth = %d, border = %d, imageSize = %d, data = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level,
@@ -12425,7 +12350,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -12457,7 +12382,7 @@
                                                      const void *data)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::CompressedTexSubImage2D, "glCompressedTexSubImage2D",
+    EVENT(context, GLCompressedTexSubImage2D,
           "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, width = %d, height = "
           "%d, format = %s, imageSize = %d, data = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, xoffset, yoffset,
@@ -12467,7 +12392,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -12501,7 +12426,7 @@
                                                      const void *data)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::CompressedTexSubImage3D, "glCompressedTexSubImage3D",
+    EVENT(context, GLCompressedTexSubImage3D,
           "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, width "
           "= %d, height = %d, depth = %d, format = %s, imageSize = %d, data = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, xoffset, yoffset,
@@ -12511,7 +12436,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateCompressedTexSubImage3D(context, targetPacked, level, xoffset,
@@ -12545,7 +12470,7 @@
                                                         const void *data)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::CompressedTexSubImage3DOES, "glCompressedTexSubImage3DOES",
+    EVENT(context, GLCompressedTexSubImage3DOES,
           "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, width "
           "= %d, height = %d, depth = %d, format = %s, imageSize = %d, data = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, xoffset, yoffset,
@@ -12555,7 +12480,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateCompressedTexSubImage3DOES(
@@ -12583,7 +12508,7 @@
                                                GLsizeiptr size)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::CopyBufferSubData, "glCopyBufferSubData",
+    EVENT(context, GLCopyBufferSubData,
           "context = %d, readTarget = %s, writeTarget = %s, readOffset = %llu, writeOffset = %llu, "
           "size = %llu",
           CID(context), GLenumToString(GLenumGroup::CopyBufferSubDataTarget, readTarget),
@@ -12594,8 +12519,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        BufferBinding readTargetPacked                        = FromGL<BufferBinding>(readTarget);
-        BufferBinding writeTargetPacked                       = FromGL<BufferBinding>(writeTarget);
+        BufferBinding readTargetPacked  = PackParam<BufferBinding>(readTarget);
+        BufferBinding writeTargetPacked = PackParam<BufferBinding>(writeTarget);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateCopyBufferSubData(context, readTargetPacked, writeTargetPacked,
@@ -12632,7 +12557,7 @@
                                               GLsizei srcDepth)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::CopyImageSubData, "glCopyImageSubData",
+    EVENT(context, GLCopyImageSubData,
           "context = %d, srcName = %u, srcTarget = %s, srcLevel = %d, srcX = %d, srcY = %d, srcZ = "
           "%d, dstName = %u, dstTarget = %s, dstLevel = %d, dstX = %d, dstY = %d, dstZ = %d, "
           "srcWidth = %d, srcHeight = %d, srcDepth = %d",
@@ -12683,7 +12608,7 @@
                                                  GLsizei srcDepth)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::CopyImageSubDataEXT, "glCopyImageSubDataEXT",
+    EVENT(context, GLCopyImageSubDataEXT,
           "context = %d, srcName = %u, srcTarget = %s, srcLevel = %d, srcX = %d, srcY = %d, srcZ = "
           "%d, dstName = %u, dstTarget = %s, dstLevel = %d, dstX = %d, dstY = %d, dstZ = %d, "
           "srcWidth = %d, srcHeight = %d, srcDepth = %d",
@@ -12735,7 +12660,7 @@
                                                  GLsizei srcDepth)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::CopyImageSubDataOES, "glCopyImageSubDataOES",
+    EVENT(context, GLCopyImageSubDataOES,
           "context = %d, srcName = %u, srcTarget = %s, srcLevel = %d, srcX = %d, srcY = %d, srcZ = "
           "%d, dstName = %u, dstTarget = %s, dstLevel = %d, dstX = %d, dstY = %d, dstZ = %d, "
           "srcWidth = %d, srcHeight = %d, srcDepth = %d",
@@ -12780,7 +12705,7 @@
                                             GLint border)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::CopyTexImage2D, "glCopyTexImage2D",
+    EVENT(context, GLCopyTexImage2D,
           "context = %d, target = %s, level = %d, internalformat = %s, x = %d, y = %d, width = %d, "
           "height = %d, border = %d",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level,
@@ -12789,7 +12714,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateCopyTexImage2D(context, targetPacked, level, internalformat, x,
@@ -12819,7 +12744,7 @@
                                                GLsizei height)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::CopyTexSubImage2D, "glCopyTexSubImage2D",
+    EVENT(context, GLCopyTexSubImage2D,
           "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, x = %d, y = %d, "
           "width = %d, height = %d",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, xoffset, yoffset,
@@ -12828,7 +12753,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateCopyTexSubImage2D(context, targetPacked, level, xoffset,
@@ -12858,7 +12783,7 @@
                                                GLsizei height)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::CopyTexSubImage3D, "glCopyTexSubImage3D",
+    EVENT(context, GLCopyTexSubImage3D,
           "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, x = "
           "%d, y = %d, width = %d, height = %d",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, xoffset, yoffset,
@@ -12867,7 +12792,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateCopyTexSubImage3D(context, targetPacked, level, xoffset,
@@ -12898,7 +12823,7 @@
                                                   GLsizei height)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::CopyTexSubImage3DOES, "glCopyTexSubImage3DOES",
+    EVENT(context, GLCopyTexSubImage3DOES,
           "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, x = "
           "%d, y = %d, width = %d, height = %d",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target), level, xoffset, yoffset,
@@ -12907,7 +12832,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateCopyTexSubImage3DOES(context, targetPacked, level, xoffset,
@@ -12931,14 +12856,14 @@
                                                     GLuint *memoryObjects)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::CreateMemoryObjectsEXT, "glCreateMemoryObjectsEXT",
+    EVENT(context, GLCreateMemoryObjectsEXT,
           "context = %d, n = %d, memoryObjects = 0x%016" PRIxPTR "", CID(context), n,
           (uintptr_t)memoryObjects);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        MemoryObjectID *memoryObjectsPacked = FromGL<MemoryObjectID *>(memoryObjects);
+        MemoryObjectID *memoryObjectsPacked = PackParam<MemoryObjectID *>(memoryObjects);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateCreateMemoryObjectsEXT(context, n, memoryObjectsPacked));
@@ -12957,7 +12882,7 @@
 GLuint GL_APIENTRY CreateProgramContextANGLE(GLeglContext ctx)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::CreateProgram, "glCreateProgram", "context = %d", CID(context));
+    EVENT(context, GLCreateProgram, "context = %d", CID(context));
 
     GLuint returnValue;
     if (context && !context->isContextLost())
@@ -12971,14 +12896,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::CreateProgram, GLuint>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLCreateProgram, GLuint>();
         }
         ANGLE_CAPTURE(CreateProgram, isCallValid, context, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::CreateProgram, GLuint>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLCreateProgram, GLuint>();
     }
     return returnValue;
 }
@@ -12986,14 +12911,14 @@
 GLuint GL_APIENTRY CreateShaderContextANGLE(GLeglContext ctx, GLenum type)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::CreateShader, "glCreateShader", "context = %d, type = %s",
-          CID(context), GLenumToString(GLenumGroup::ShaderType, type));
+    EVENT(context, GLCreateShader, "context = %d, type = %s", CID(context),
+          GLenumToString(GLenumGroup::ShaderType, type));
 
     GLuint returnValue;
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderType typePacked                                 = FromGL<ShaderType>(type);
+        ShaderType typePacked                                 = PackParam<ShaderType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateCreateShader(context, typePacked));
         if (isCallValid)
@@ -13002,14 +12927,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::CreateShader, GLuint>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLCreateShader, GLuint>();
         }
         ANGLE_CAPTURE(CreateShader, isCallValid, context, typePacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::CreateShader, GLuint>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLCreateShader, GLuint>();
     }
     return returnValue;
 }
@@ -13020,7 +12945,7 @@
                                                     const GLchar *const *strings)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::CreateShaderProgramv, "glCreateShaderProgramv",
+    EVENT(context, GLCreateShaderProgramv,
           "context = %d, type = %s, count = %d, strings = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::ShaderType, type), count, (uintptr_t)strings);
 
@@ -13028,7 +12953,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderType typePacked                                 = FromGL<ShaderType>(type);
+        ShaderType typePacked                                 = PackParam<ShaderType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateCreateShaderProgramv(context, typePacked, count, strings));
@@ -13038,7 +12963,8 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::CreateShaderProgramv, GLuint>();
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLCreateShaderProgramv, GLuint>();
         }
         ANGLE_CAPTURE(CreateShaderProgramv, isCallValid, context, typePacked, count, strings,
                       returnValue);
@@ -13046,7 +12972,7 @@
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::CreateShaderProgramv, GLuint>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLCreateShaderProgramv, GLuint>();
     }
     return returnValue;
 }
@@ -13057,7 +12983,7 @@
                                                        const GLchar **strings)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::CreateShaderProgramvEXT, "glCreateShaderProgramvEXT",
+    EVENT(context, GLCreateShaderProgramvEXT,
           "context = %d, type = %s, count = %d, strings = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::ShaderType, type), count, (uintptr_t)strings);
 
@@ -13065,7 +12991,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderType typePacked                                 = FromGL<ShaderType>(type);
+        ShaderType typePacked                                 = PackParam<ShaderType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateCreateShaderProgramvEXT(context, typePacked, count, strings));
@@ -13075,7 +13001,8 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::CreateShaderProgramvEXT, GLuint>();
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLCreateShaderProgramvEXT, GLuint>();
         }
         ANGLE_CAPTURE(CreateShaderProgramvEXT, isCallValid, context, typePacked, count, strings,
                       returnValue);
@@ -13083,7 +13010,7 @@
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::CreateShaderProgramvEXT, GLuint>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLCreateShaderProgramvEXT, GLuint>();
     }
     return returnValue;
 }
@@ -13091,13 +13018,13 @@
 void GL_APIENTRY CullFaceContextANGLE(GLeglContext ctx, GLenum mode)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::CullFace, "glCullFace", "context = %d, mode = %s", CID(context),
+    EVENT(context, GLCullFace, "context = %d, mode = %s", CID(context),
           GLenumToString(GLenumGroup::CullFaceMode, mode));
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        CullFaceMode modePacked                               = FromGL<CullFaceMode>(mode);
+        CullFaceMode modePacked                               = PackParam<CullFaceMode>(mode);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateCullFace(context, modePacked));
         if (isCallValid)
@@ -13115,8 +13042,8 @@
 void GL_APIENTRY CurrentPaletteMatrixOESContextANGLE(GLeglContext ctx, GLuint matrixpaletteindex)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::CurrentPaletteMatrixOES, "glCurrentPaletteMatrixOES",
-          "context = %d, matrixpaletteindex = %u", CID(context), matrixpaletteindex);
+    EVENT(context, GLCurrentPaletteMatrixOES, "context = %d, matrixpaletteindex = %u", CID(context),
+          matrixpaletteindex);
 
     if (context && !context->isContextLost())
     {
@@ -13141,7 +13068,7 @@
                                                   const void *userParam)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DebugMessageCallback, "glDebugMessageCallback",
+    EVENT(context, GLDebugMessageCallback,
           "context = %d, callback = 0x%016" PRIxPTR ", userParam = 0x%016" PRIxPTR "", CID(context),
           (uintptr_t)callback, (uintptr_t)userParam);
 
@@ -13168,7 +13095,7 @@
                                                      const void *userParam)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DebugMessageCallbackKHR, "glDebugMessageCallbackKHR",
+    EVENT(context, GLDebugMessageCallbackKHR,
           "context = %d, callback = 0x%016" PRIxPTR ", userParam = 0x%016" PRIxPTR "", CID(context),
           (uintptr_t)callback, (uintptr_t)userParam);
 
@@ -13199,7 +13126,7 @@
                                                  GLboolean enabled)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DebugMessageControl, "glDebugMessageControl",
+    EVENT(context, GLDebugMessageControl,
           "context = %d, source = %s, type = %s, severity = %s, count = %d, ids = 0x%016" PRIxPTR
           ", enabled = %s",
           CID(context), GLenumToString(GLenumGroup::DebugSource, source),
@@ -13236,7 +13163,7 @@
                                                     GLboolean enabled)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DebugMessageControlKHR, "glDebugMessageControlKHR",
+    EVENT(context, GLDebugMessageControlKHR,
           "context = %d, source = %s, type = %s, severity = %s, count = %d, ids = 0x%016" PRIxPTR
           ", enabled = %s",
           CID(context), GLenumToString(GLenumGroup::DebugSource, source),
@@ -13273,7 +13200,7 @@
                                                 const GLchar *buf)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DebugMessageInsert, "glDebugMessageInsert",
+    EVENT(context, GLDebugMessageInsert,
           "context = %d, source = %s, type = %s, id = %u, severity = %s, length = %d, buf = "
           "0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DebugSource, source),
@@ -13309,7 +13236,7 @@
                                                    const GLchar *buf)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DebugMessageInsertKHR, "glDebugMessageInsertKHR",
+    EVENT(context, GLDebugMessageInsertKHR,
           "context = %d, source = %s, type = %s, id = %u, severity = %s, length = %d, buf = "
           "0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DebugSource, source),
@@ -13339,13 +13266,13 @@
 void GL_APIENTRY DeleteBuffersContextANGLE(GLeglContext ctx, GLsizei n, const GLuint *buffers)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DeleteBuffers, "glDeleteBuffers",
-          "context = %d, n = %d, buffers = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)buffers);
+    EVENT(context, GLDeleteBuffers, "context = %d, n = %d, buffers = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)buffers);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        const BufferID *buffersPacked                         = FromGL<const BufferID *>(buffers);
+        const BufferID *buffersPacked = PackParam<const BufferID *>(buffers);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateDeleteBuffers(context, n, buffersPacked));
@@ -13364,13 +13291,13 @@
 void GL_APIENTRY DeleteFencesNVContextANGLE(GLeglContext ctx, GLsizei n, const GLuint *fences)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DeleteFencesNV, "glDeleteFencesNV",
-          "context = %d, n = %d, fences = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)fences);
+    EVENT(context, GLDeleteFencesNV, "context = %d, n = %d, fences = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)fences);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        const FenceNVID *fencesPacked                         = FromGL<const FenceNVID *>(fences);
+        const FenceNVID *fencesPacked = PackParam<const FenceNVID *>(fences);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateDeleteFencesNV(context, n, fencesPacked));
@@ -13391,14 +13318,13 @@
                                                 const GLuint *framebuffers)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DeleteFramebuffers, "glDeleteFramebuffers",
-          "context = %d, n = %d, framebuffers = 0x%016" PRIxPTR "", CID(context), n,
-          (uintptr_t)framebuffers);
+    EVENT(context, GLDeleteFramebuffers, "context = %d, n = %d, framebuffers = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)framebuffers);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        const FramebufferID *framebuffersPacked = FromGL<const FramebufferID *>(framebuffers);
+        const FramebufferID *framebuffersPacked = PackParam<const FramebufferID *>(framebuffers);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateDeleteFramebuffers(context, n, framebuffersPacked));
@@ -13419,14 +13345,14 @@
                                                    const GLuint *framebuffers)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DeleteFramebuffersOES, "glDeleteFramebuffersOES",
+    EVENT(context, GLDeleteFramebuffersOES,
           "context = %d, n = %d, framebuffers = 0x%016" PRIxPTR "", CID(context), n,
           (uintptr_t)framebuffers);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        const FramebufferID *framebuffersPacked = FromGL<const FramebufferID *>(framebuffers);
+        const FramebufferID *framebuffersPacked = PackParam<const FramebufferID *>(framebuffers);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateDeleteFramebuffersOES(context, n, framebuffersPacked));
@@ -13447,14 +13373,15 @@
                                                     const GLuint *memoryObjects)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DeleteMemoryObjectsEXT, "glDeleteMemoryObjectsEXT",
+    EVENT(context, GLDeleteMemoryObjectsEXT,
           "context = %d, n = %d, memoryObjects = 0x%016" PRIxPTR "", CID(context), n,
           (uintptr_t)memoryObjects);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        const MemoryObjectID *memoryObjectsPacked = FromGL<const MemoryObjectID *>(memoryObjects);
+        const MemoryObjectID *memoryObjectsPacked =
+            PackParam<const MemoryObjectID *>(memoryObjects);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateDeleteMemoryObjectsEXT(context, n, memoryObjectsPacked));
@@ -13473,13 +13400,12 @@
 void GL_APIENTRY DeleteProgramContextANGLE(GLeglContext ctx, GLuint program)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DeleteProgram, "glDeleteProgram", "context = %d, program = %u",
-          CID(context), program);
+    EVENT(context, GLDeleteProgram, "context = %d, program = %u", CID(context), program);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateDeleteProgram(context, programPacked));
@@ -13500,14 +13426,13 @@
                                                     const GLuint *pipelines)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DeleteProgramPipelines, "glDeleteProgramPipelines",
-          "context = %d, n = %d, pipelines = 0x%016" PRIxPTR "", CID(context), n,
-          (uintptr_t)pipelines);
+    EVENT(context, GLDeleteProgramPipelines, "context = %d, n = %d, pipelines = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)pipelines);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        const ProgramPipelineID *pipelinesPacked = FromGL<const ProgramPipelineID *>(pipelines);
+        const ProgramPipelineID *pipelinesPacked = PackParam<const ProgramPipelineID *>(pipelines);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateDeleteProgramPipelines(context, n, pipelinesPacked));
@@ -13528,14 +13453,14 @@
                                                        const GLuint *pipelines)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DeleteProgramPipelinesEXT, "glDeleteProgramPipelinesEXT",
+    EVENT(context, GLDeleteProgramPipelinesEXT,
           "context = %d, n = %d, pipelines = 0x%016" PRIxPTR "", CID(context), n,
           (uintptr_t)pipelines);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        const ProgramPipelineID *pipelinesPacked = FromGL<const ProgramPipelineID *>(pipelines);
+        const ProgramPipelineID *pipelinesPacked = PackParam<const ProgramPipelineID *>(pipelines);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateDeleteProgramPipelinesEXT(context, n, pipelinesPacked));
@@ -13554,13 +13479,13 @@
 void GL_APIENTRY DeleteQueriesContextANGLE(GLeglContext ctx, GLsizei n, const GLuint *ids)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DeleteQueries, "glDeleteQueries",
-          "context = %d, n = %d, ids = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)ids);
+    EVENT(context, GLDeleteQueries, "context = %d, n = %d, ids = 0x%016" PRIxPTR "", CID(context),
+          n, (uintptr_t)ids);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        const QueryID *idsPacked                              = FromGL<const QueryID *>(ids);
+        const QueryID *idsPacked                              = PackParam<const QueryID *>(ids);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateDeleteQueries(context, n, idsPacked));
@@ -13579,13 +13504,13 @@
 void GL_APIENTRY DeleteQueriesEXTContextANGLE(GLeglContext ctx, GLsizei n, const GLuint *ids)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DeleteQueriesEXT, "glDeleteQueriesEXT",
-          "context = %d, n = %d, ids = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)ids);
+    EVENT(context, GLDeleteQueriesEXT, "context = %d, n = %d, ids = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)ids);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        const QueryID *idsPacked                              = FromGL<const QueryID *>(ids);
+        const QueryID *idsPacked                              = PackParam<const QueryID *>(ids);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateDeleteQueriesEXT(context, n, idsPacked));
@@ -13606,14 +13531,14 @@
                                                  const GLuint *renderbuffers)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DeleteRenderbuffers, "glDeleteRenderbuffers",
-          "context = %d, n = %d, renderbuffers = 0x%016" PRIxPTR "", CID(context), n,
-          (uintptr_t)renderbuffers);
+    EVENT(context, GLDeleteRenderbuffers, "context = %d, n = %d, renderbuffers = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)renderbuffers);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        const RenderbufferID *renderbuffersPacked = FromGL<const RenderbufferID *>(renderbuffers);
+        const RenderbufferID *renderbuffersPacked =
+            PackParam<const RenderbufferID *>(renderbuffers);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateDeleteRenderbuffers(context, n, renderbuffersPacked));
@@ -13634,14 +13559,15 @@
                                                     const GLuint *renderbuffers)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DeleteRenderbuffersOES, "glDeleteRenderbuffersOES",
+    EVENT(context, GLDeleteRenderbuffersOES,
           "context = %d, n = %d, renderbuffers = 0x%016" PRIxPTR "", CID(context), n,
           (uintptr_t)renderbuffers);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        const RenderbufferID *renderbuffersPacked = FromGL<const RenderbufferID *>(renderbuffers);
+        const RenderbufferID *renderbuffersPacked =
+            PackParam<const RenderbufferID *>(renderbuffers);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateDeleteRenderbuffersOES(context, n, renderbuffersPacked));
@@ -13660,14 +13586,13 @@
 void GL_APIENTRY DeleteSamplersContextANGLE(GLeglContext ctx, GLsizei count, const GLuint *samplers)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DeleteSamplers, "glDeleteSamplers",
-          "context = %d, count = %d, samplers = 0x%016" PRIxPTR "", CID(context), count,
-          (uintptr_t)samplers);
+    EVENT(context, GLDeleteSamplers, "context = %d, count = %d, samplers = 0x%016" PRIxPTR "",
+          CID(context), count, (uintptr_t)samplers);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        const SamplerID *samplersPacked                       = FromGL<const SamplerID *>(samplers);
+        const SamplerID *samplersPacked = PackParam<const SamplerID *>(samplers);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateDeleteSamplers(context, count, samplersPacked));
@@ -13688,14 +13613,13 @@
                                                  const GLuint *semaphores)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DeleteSemaphoresEXT, "glDeleteSemaphoresEXT",
-          "context = %d, n = %d, semaphores = 0x%016" PRIxPTR "", CID(context), n,
-          (uintptr_t)semaphores);
+    EVENT(context, GLDeleteSemaphoresEXT, "context = %d, n = %d, semaphores = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)semaphores);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        const SemaphoreID *semaphoresPacked = FromGL<const SemaphoreID *>(semaphores);
+        const SemaphoreID *semaphoresPacked = PackParam<const SemaphoreID *>(semaphores);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateDeleteSemaphoresEXT(context, n, semaphoresPacked));
@@ -13714,13 +13638,12 @@
 void GL_APIENTRY DeleteShaderContextANGLE(GLeglContext ctx, GLuint shader)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DeleteShader, "glDeleteShader", "context = %d, shader = %u",
-          CID(context), shader);
+    EVENT(context, GLDeleteShader, "context = %d, shader = %u", CID(context), shader);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID shaderPacked                          = FromGL<ShaderProgramID>(shader);
+        ShaderProgramID shaderPacked                          = PackParam<ShaderProgramID>(shader);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateDeleteShader(context, shaderPacked));
@@ -13739,8 +13662,8 @@
 void GL_APIENTRY DeleteSyncContextANGLE(GLeglContext ctx, GLsync sync)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DeleteSync, "glDeleteSync",
-          "context = %d, sync = 0x%016" PRIxPTR "", CID(context), (uintptr_t)sync);
+    EVENT(context, GLDeleteSync, "context = %d, sync = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)sync);
 
     if (context && !context->isContextLost())
     {
@@ -13762,14 +13685,13 @@
 void GL_APIENTRY DeleteTexturesContextANGLE(GLeglContext ctx, GLsizei n, const GLuint *textures)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DeleteTextures, "glDeleteTextures",
-          "context = %d, n = %d, textures = 0x%016" PRIxPTR "", CID(context), n,
-          (uintptr_t)textures);
+    EVENT(context, GLDeleteTextures, "context = %d, n = %d, textures = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)textures);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        const TextureID *texturesPacked                       = FromGL<const TextureID *>(textures);
+        const TextureID *texturesPacked = PackParam<const TextureID *>(textures);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateDeleteTextures(context, n, texturesPacked));
@@ -13790,13 +13712,13 @@
                                                       const GLuint *ids)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DeleteTransformFeedbacks, "glDeleteTransformFeedbacks",
-          "context = %d, n = %d, ids = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)ids);
+    EVENT(context, GLDeleteTransformFeedbacks, "context = %d, n = %d, ids = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)ids);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        const TransformFeedbackID *idsPacked = FromGL<const TransformFeedbackID *>(ids);
+        const TransformFeedbackID *idsPacked = PackParam<const TransformFeedbackID *>(ids);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateDeleteTransformFeedbacks(context, n, idsPacked));
@@ -13815,13 +13737,13 @@
 void GL_APIENTRY DeleteVertexArraysContextANGLE(GLeglContext ctx, GLsizei n, const GLuint *arrays)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DeleteVertexArrays, "glDeleteVertexArrays",
-          "context = %d, n = %d, arrays = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)arrays);
+    EVENT(context, GLDeleteVertexArrays, "context = %d, n = %d, arrays = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)arrays);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        const VertexArrayID *arraysPacked = FromGL<const VertexArrayID *>(arrays);
+        const VertexArrayID *arraysPacked = PackParam<const VertexArrayID *>(arrays);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateDeleteVertexArrays(context, n, arraysPacked));
@@ -13842,13 +13764,13 @@
                                                    const GLuint *arrays)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DeleteVertexArraysOES, "glDeleteVertexArraysOES",
-          "context = %d, n = %d, arrays = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)arrays);
+    EVENT(context, GLDeleteVertexArraysOES, "context = %d, n = %d, arrays = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)arrays);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        const VertexArrayID *arraysPacked = FromGL<const VertexArrayID *>(arrays);
+        const VertexArrayID *arraysPacked = PackParam<const VertexArrayID *>(arrays);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateDeleteVertexArraysOES(context, n, arraysPacked));
@@ -13867,8 +13789,8 @@
 void GL_APIENTRY DepthFuncContextANGLE(GLeglContext ctx, GLenum func)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DepthFunc, "glDepthFunc", "context = %d, func = %s",
-          CID(context), GLenumToString(GLenumGroup::DepthFunction, func));
+    EVENT(context, GLDepthFunc, "context = %d, func = %s", CID(context),
+          GLenumToString(GLenumGroup::DepthFunction, func));
 
     if (context && !context->isContextLost())
     {
@@ -13890,8 +13812,7 @@
 void GL_APIENTRY DepthMaskContextANGLE(GLeglContext ctx, GLboolean flag)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DepthMask, "glDepthMask", "context = %d, flag = %s",
-          CID(context), GLbooleanToString(flag));
+    EVENT(context, GLDepthMask, "context = %d, flag = %s", CID(context), GLbooleanToString(flag));
 
     if (context && !context->isContextLost())
     {
@@ -13913,8 +13834,7 @@
 void GL_APIENTRY DepthRangefContextANGLE(GLeglContext ctx, GLfloat n, GLfloat f)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DepthRangef, "glDepthRangef", "context = %d, n = %f, f = %f",
-          CID(context), n, f);
+    EVENT(context, GLDepthRangef, "context = %d, n = %f, f = %f", CID(context), n, f);
 
     if (context && !context->isContextLost())
     {
@@ -13936,8 +13856,7 @@
 void GL_APIENTRY DepthRangexContextANGLE(GLeglContext ctx, GLfixed n, GLfixed f)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DepthRangex, "glDepthRangex", "context = %d, n = 0x%X, f = 0x%X",
-          CID(context), n, f);
+    EVENT(context, GLDepthRangex, "context = %d, n = 0x%X, f = 0x%X", CID(context), n, f);
 
     if (context && !context->isContextLost())
     {
@@ -13959,14 +13878,14 @@
 void GL_APIENTRY DetachShaderContextANGLE(GLeglContext ctx, GLuint program, GLuint shader)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DetachShader, "glDetachShader",
-          "context = %d, program = %u, shader = %u", CID(context), program, shader);
+    EVENT(context, GLDetachShader, "context = %d, program = %u, shader = %u", CID(context), program,
+          shader);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        ShaderProgramID shaderPacked                          = FromGL<ShaderProgramID>(shader);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
+        ShaderProgramID shaderPacked                          = PackParam<ShaderProgramID>(shader);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateDetachShader(context, programPacked, shaderPacked));
@@ -13985,7 +13904,7 @@
 void GL_APIENTRY DisableContextANGLE(GLeglContext ctx, GLenum cap)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Disable, "glDisable", "context = %d, cap = %s", CID(context),
+    EVENT(context, GLDisable, "context = %d, cap = %s", CID(context),
           GLenumToString(GLenumGroup::EnableCap, cap));
 
     if (context && !context->isContextLost())
@@ -14008,13 +13927,13 @@
 void GL_APIENTRY DisableClientStateContextANGLE(GLeglContext ctx, GLenum array)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DisableClientState, "glDisableClientState",
-          "context = %d, array = %s", CID(context), GLenumToString(GLenumGroup::EnableCap, array));
+    EVENT(context, GLDisableClientState, "context = %d, array = %s", CID(context),
+          GLenumToString(GLenumGroup::EnableCap, array));
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ClientVertexArrayType arrayPacked = FromGL<ClientVertexArrayType>(array);
+        ClientVertexArrayType arrayPacked = PackParam<ClientVertexArrayType>(array);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateDisableClientState(context, arrayPacked));
@@ -14033,8 +13952,7 @@
 void GL_APIENTRY DisableVertexAttribArrayContextANGLE(GLeglContext ctx, GLuint index)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DisableVertexAttribArray, "glDisableVertexAttribArray",
-          "context = %d, index = %u", CID(context), index);
+    EVENT(context, GLDisableVertexAttribArray, "context = %d, index = %u", CID(context), index);
 
     if (context && !context->isContextLost())
     {
@@ -14057,8 +13975,8 @@
 void GL_APIENTRY DisableiContextANGLE(GLeglContext ctx, GLenum target, GLuint index)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Disablei, "glDisablei", "context = %d, target = %s, index = %u",
-          CID(context), GLenumToString(GLenumGroup::EnableCap, target), index);
+    EVENT(context, GLDisablei, "context = %d, target = %s, index = %u", CID(context),
+          GLenumToString(GLenumGroup::EnableCap, target), index);
 
     if (context && !context->isContextLost())
     {
@@ -14080,8 +13998,7 @@
 void GL_APIENTRY DisableiEXTContextANGLE(GLeglContext ctx, GLenum target, GLuint index)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DisableiEXT, "glDisableiEXT",
-          "context = %d, target = %s, index = %u", CID(context),
+    EVENT(context, GLDisableiEXT, "context = %d, target = %s, index = %u", CID(context),
           GLenumToString(GLenumGroup::EnableCap, target), index);
 
     if (context && !context->isContextLost())
@@ -14105,8 +14022,7 @@
 void GL_APIENTRY DisableiOESContextANGLE(GLeglContext ctx, GLenum target, GLuint index)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DisableiOES, "glDisableiOES",
-          "context = %d, target = %s, index = %u", CID(context),
+    EVENT(context, GLDisableiOES, "context = %d, target = %s, index = %u", CID(context),
           GLenumToString(GLenumGroup::EnableCap, target), index);
 
     if (context && !context->isContextLost())
@@ -14133,7 +14049,7 @@
                                                    const GLenum *attachments)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DiscardFramebufferEXT, "glDiscardFramebufferEXT",
+    EVENT(context, GLDiscardFramebufferEXT,
           "context = %d, target = %s, numAttachments = %d, attachments = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target), numAttachments,
           (uintptr_t)attachments);
@@ -14164,7 +14080,7 @@
                                              GLuint num_groups_z)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DispatchCompute, "glDispatchCompute",
+    EVENT(context, GLDispatchCompute,
           "context = %d, num_groups_x = %u, num_groups_y = %u, num_groups_z = %u", CID(context),
           num_groups_x, num_groups_y, num_groups_z);
 
@@ -14191,8 +14107,8 @@
 void GL_APIENTRY DispatchComputeIndirectContextANGLE(GLeglContext ctx, GLintptr indirect)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DispatchComputeIndirect, "glDispatchComputeIndirect",
-          "context = %d, indirect = %llu", CID(context), static_cast<unsigned long long>(indirect));
+    EVENT(context, GLDispatchComputeIndirect, "context = %d, indirect = %llu", CID(context),
+          static_cast<unsigned long long>(indirect));
 
     if (context && !context->isContextLost())
     {
@@ -14215,14 +14131,13 @@
 void GL_APIENTRY DrawArraysContextANGLE(GLeglContext ctx, GLenum mode, GLint first, GLsizei count)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DrawArrays, "glDrawArrays",
-          "context = %d, mode = %s, first = %d, count = %d", CID(context),
+    EVENT(context, GLDrawArrays, "context = %d, mode = %s, first = %d, count = %d", CID(context),
           GLenumToString(GLenumGroup::PrimitiveType, mode), first, count);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateDrawArrays(context, modePacked, first, count));
@@ -14241,14 +14156,13 @@
 void GL_APIENTRY DrawArraysIndirectContextANGLE(GLeglContext ctx, GLenum mode, const void *indirect)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DrawArraysIndirect, "glDrawArraysIndirect",
-          "context = %d, mode = %s, indirect = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::PrimitiveType, mode), (uintptr_t)indirect);
+    EVENT(context, GLDrawArraysIndirect, "context = %d, mode = %s, indirect = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), (uintptr_t)indirect);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateDrawArraysIndirect(context, modePacked, indirect));
@@ -14271,14 +14185,14 @@
                                                  GLsizei instancecount)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DrawArraysInstanced, "glDrawArraysInstanced",
+    EVENT(context, GLDrawArraysInstanced,
           "context = %d, mode = %s, first = %d, count = %d, instancecount = %d", CID(context),
           GLenumToString(GLenumGroup::PrimitiveType, mode), first, count, instancecount);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -14303,14 +14217,14 @@
                                                       GLsizei primcount)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DrawArraysInstancedANGLE, "glDrawArraysInstancedANGLE",
+    EVENT(context, GLDrawArraysInstancedANGLE,
           "context = %d, mode = %s, first = %d, count = %d, primcount = %d", CID(context),
           GLenumToString(GLenumGroup::PrimitiveType, mode), first, count, primcount);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -14335,14 +14249,14 @@
                                                     GLsizei primcount)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DrawArraysInstancedEXT, "glDrawArraysInstancedEXT",
+    EVENT(context, GLDrawArraysInstancedEXT,
           "context = %d, mode = %s, start = %d, count = %d, primcount = %d", CID(context),
           GLenumToString(GLenumGroup::PrimitiveType, mode), start, count, primcount);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -14363,8 +14277,8 @@
 void GL_APIENTRY DrawBuffersContextANGLE(GLeglContext ctx, GLsizei n, const GLenum *bufs)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DrawBuffers, "glDrawBuffers",
-          "context = %d, n = %d, bufs = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)bufs);
+    EVENT(context, GLDrawBuffers, "context = %d, n = %d, bufs = 0x%016" PRIxPTR "", CID(context), n,
+          (uintptr_t)bufs);
 
     if (context && !context->isContextLost())
     {
@@ -14386,8 +14300,8 @@
 void GL_APIENTRY DrawBuffersEXTContextANGLE(GLeglContext ctx, GLsizei n, const GLenum *bufs)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DrawBuffersEXT, "glDrawBuffersEXT",
-          "context = %d, n = %d, bufs = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)bufs);
+    EVENT(context, GLDrawBuffersEXT, "context = %d, n = %d, bufs = 0x%016" PRIxPTR "", CID(context),
+          n, (uintptr_t)bufs);
 
     if (context && !context->isContextLost())
     {
@@ -14413,7 +14327,7 @@
                                           const void *indices)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DrawElements, "glDrawElements",
+    EVENT(context, GLDrawElements,
           "context = %d, mode = %s, count = %d, type = %s, indices = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), count,
           GLenumToString(GLenumGroup::DrawElementsType, type), (uintptr_t)indices);
@@ -14421,8 +14335,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateDrawElements(context, modePacked, count, typePacked, indices));
@@ -14446,7 +14360,7 @@
                                                     GLint basevertex)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DrawElementsBaseVertex, "glDrawElementsBaseVertex",
+    EVENT(context, GLDrawElementsBaseVertex,
           "context = %d, mode = %s, count = %d, type = %s, indices = 0x%016" PRIxPTR
           ", basevertex = %d",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), count,
@@ -14455,8 +14369,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateDrawElementsBaseVertex(context, modePacked, count, typePacked,
@@ -14482,7 +14396,7 @@
                                                        GLint basevertex)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DrawElementsBaseVertexEXT, "glDrawElementsBaseVertexEXT",
+    EVENT(context, GLDrawElementsBaseVertexEXT,
           "context = %d, mode = %s, count = %d, type = %s, indices = 0x%016" PRIxPTR
           ", basevertex = %d",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), count,
@@ -14491,8 +14405,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateDrawElementsBaseVertexEXT(context, modePacked, count,
@@ -14518,7 +14432,7 @@
                                                        GLint basevertex)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DrawElementsBaseVertexOES, "glDrawElementsBaseVertexOES",
+    EVENT(context, GLDrawElementsBaseVertexOES,
           "context = %d, mode = %s, count = %d, type = %s, indices = 0x%016" PRIxPTR
           ", basevertex = %d",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), count,
@@ -14527,8 +14441,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateDrawElementsBaseVertexOES(context, modePacked, count,
@@ -14552,7 +14466,7 @@
                                                   const void *indirect)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DrawElementsIndirect, "glDrawElementsIndirect",
+    EVENT(context, GLDrawElementsIndirect,
           "context = %d, mode = %s, type = %s, indirect = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::PrimitiveType, mode),
           GLenumToString(GLenumGroup::DrawElementsType, type), (uintptr_t)indirect);
@@ -14560,8 +14474,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -14586,7 +14500,7 @@
                                                    GLsizei instancecount)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DrawElementsInstanced, "glDrawElementsInstanced",
+    EVENT(context, GLDrawElementsInstanced,
           "context = %d, mode = %s, count = %d, type = %s, indices = 0x%016" PRIxPTR
           ", instancecount = %d",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), count,
@@ -14595,8 +14509,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateDrawElementsInstanced(context, modePacked, count, typePacked,
@@ -14622,7 +14536,7 @@
                                                         GLsizei primcount)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DrawElementsInstancedANGLE, "glDrawElementsInstancedANGLE",
+    EVENT(context, GLDrawElementsInstancedANGLE,
           "context = %d, mode = %s, count = %d, type = %s, indices = 0x%016" PRIxPTR
           ", primcount = %d",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), count,
@@ -14631,8 +14545,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateDrawElementsInstancedANGLE(context, modePacked, count,
@@ -14659,8 +14573,7 @@
                                                              GLint basevertex)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DrawElementsInstancedBaseVertex,
-          "glDrawElementsInstancedBaseVertex",
+    EVENT(context, GLDrawElementsInstancedBaseVertex,
           "context = %d, mode = %s, count = %d, type = %s, indices = 0x%016" PRIxPTR
           ", instancecount = %d, basevertex = %d",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), count,
@@ -14670,8 +14583,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateDrawElementsInstancedBaseVertex(
                                                              context, modePacked, count, typePacked,
@@ -14699,8 +14612,7 @@
                                                                 GLint basevertex)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DrawElementsInstancedBaseVertexEXT,
-          "glDrawElementsInstancedBaseVertexEXT",
+    EVENT(context, GLDrawElementsInstancedBaseVertexEXT,
           "context = %d, mode = %s, count = %d, type = %s, indices = 0x%016" PRIxPTR
           ", instancecount = %d, basevertex = %d",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), count,
@@ -14710,8 +14622,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateDrawElementsInstancedBaseVertexEXT(
                                                              context, modePacked, count, typePacked,
@@ -14739,8 +14651,7 @@
                                                                 GLint basevertex)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DrawElementsInstancedBaseVertexOES,
-          "glDrawElementsInstancedBaseVertexOES",
+    EVENT(context, GLDrawElementsInstancedBaseVertexOES,
           "context = %d, mode = %s, count = %d, type = %s, indices = 0x%016" PRIxPTR
           ", instancecount = %d, basevertex = %d",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), count,
@@ -14750,8 +14661,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateDrawElementsInstancedBaseVertexOES(
                                                              context, modePacked, count, typePacked,
@@ -14778,7 +14689,7 @@
                                                       GLsizei primcount)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DrawElementsInstancedEXT, "glDrawElementsInstancedEXT",
+    EVENT(context, GLDrawElementsInstancedEXT,
           "context = %d, mode = %s, count = %d, type = %s, indices = 0x%016" PRIxPTR
           ", primcount = %d",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), count,
@@ -14787,8 +14698,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateDrawElementsInstancedEXT(context, modePacked, count, typePacked,
@@ -14815,7 +14726,7 @@
                                                const void *indices)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DrawRangeElements, "glDrawRangeElements",
+    EVENT(context, GLDrawRangeElements,
           "context = %d, mode = %s, start = %u, end = %u, count = %d, type = %s, indices = "
           "0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), start, end, count,
@@ -14824,8 +14735,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateDrawRangeElements(context, modePacked, start, end,
@@ -14853,7 +14764,7 @@
                                                          GLint basevertex)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DrawRangeElementsBaseVertex, "glDrawRangeElementsBaseVertex",
+    EVENT(context, GLDrawRangeElementsBaseVertex,
           "context = %d, mode = %s, start = %u, end = %u, count = %d, type = %s, indices = "
           "0x%016" PRIxPTR ", basevertex = %d",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), start, end, count,
@@ -14862,8 +14773,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateDrawRangeElementsBaseVertex(
                                                              context, modePacked, start, end, count,
@@ -14892,8 +14803,7 @@
                                                             GLint basevertex)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DrawRangeElementsBaseVertexEXT,
-          "glDrawRangeElementsBaseVertexEXT",
+    EVENT(context, GLDrawRangeElementsBaseVertexEXT,
           "context = %d, mode = %s, start = %u, end = %u, count = %d, type = %s, indices = "
           "0x%016" PRIxPTR ", basevertex = %d",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), start, end, count,
@@ -14902,8 +14812,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateDrawRangeElementsBaseVertexEXT(
                                                              context, modePacked, start, end, count,
@@ -14932,8 +14842,7 @@
                                                             GLint basevertex)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DrawRangeElementsBaseVertexOES,
-          "glDrawRangeElementsBaseVertexOES",
+    EVENT(context, GLDrawRangeElementsBaseVertexOES,
           "context = %d, mode = %s, start = %u, end = %u, count = %d, type = %s, indices = "
           "0x%016" PRIxPTR ", basevertex = %d",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), start, end, count,
@@ -14942,8 +14851,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateDrawRangeElementsBaseVertexOES(
                                                              context, modePacked, start, end, count,
@@ -14970,9 +14879,8 @@
                                          GLfloat height)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DrawTexfOES, "glDrawTexfOES",
-          "context = %d, x = %f, y = %f, z = %f, width = %f, height = %f", CID(context), x, y, z,
-          width, height);
+    EVENT(context, GLDrawTexfOES, "context = %d, x = %f, y = %f, z = %f, width = %f, height = %f",
+          CID(context), x, y, z, width, height);
 
     if (context && !context->isContextLost())
     {
@@ -14995,8 +14903,8 @@
 void GL_APIENTRY DrawTexfvOESContextANGLE(GLeglContext ctx, const GLfloat *coords)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DrawTexfvOES, "glDrawTexfvOES",
-          "context = %d, coords = 0x%016" PRIxPTR "", CID(context), (uintptr_t)coords);
+    EVENT(context, GLDrawTexfvOES, "context = %d, coords = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)coords);
 
     if (context && !context->isContextLost())
     {
@@ -15019,9 +14927,8 @@
 DrawTexiOESContextANGLE(GLeglContext ctx, GLint x, GLint y, GLint z, GLint width, GLint height)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DrawTexiOES, "glDrawTexiOES",
-          "context = %d, x = %d, y = %d, z = %d, width = %d, height = %d", CID(context), x, y, z,
-          width, height);
+    EVENT(context, GLDrawTexiOES, "context = %d, x = %d, y = %d, z = %d, width = %d, height = %d",
+          CID(context), x, y, z, width, height);
 
     if (context && !context->isContextLost())
     {
@@ -15044,8 +14951,8 @@
 void GL_APIENTRY DrawTexivOESContextANGLE(GLeglContext ctx, const GLint *coords)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DrawTexivOES, "glDrawTexivOES",
-          "context = %d, coords = 0x%016" PRIxPTR "", CID(context), (uintptr_t)coords);
+    EVENT(context, GLDrawTexivOES, "context = %d, coords = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)coords);
 
     if (context && !context->isContextLost())
     {
@@ -15072,9 +14979,8 @@
                                          GLshort height)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DrawTexsOES, "glDrawTexsOES",
-          "context = %d, x = %d, y = %d, z = %d, width = %d, height = %d", CID(context), x, y, z,
-          width, height);
+    EVENT(context, GLDrawTexsOES, "context = %d, x = %d, y = %d, z = %d, width = %d, height = %d",
+          CID(context), x, y, z, width, height);
 
     if (context && !context->isContextLost())
     {
@@ -15097,8 +15003,8 @@
 void GL_APIENTRY DrawTexsvOESContextANGLE(GLeglContext ctx, const GLshort *coords)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DrawTexsvOES, "glDrawTexsvOES",
-          "context = %d, coords = 0x%016" PRIxPTR "", CID(context), (uintptr_t)coords);
+    EVENT(context, GLDrawTexsvOES, "context = %d, coords = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)coords);
 
     if (context && !context->isContextLost())
     {
@@ -15125,7 +15031,7 @@
                                          GLfixed height)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DrawTexxOES, "glDrawTexxOES",
+    EVENT(context, GLDrawTexxOES,
           "context = %d, x = 0x%X, y = 0x%X, z = 0x%X, width = 0x%X, height = 0x%X", CID(context),
           x, y, z, width, height);
 
@@ -15150,8 +15056,8 @@
 void GL_APIENTRY DrawTexxvOESContextANGLE(GLeglContext ctx, const GLfixed *coords)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DrawTexxvOES, "glDrawTexxvOES",
-          "context = %d, coords = 0x%016" PRIxPTR "", CID(context), (uintptr_t)coords);
+    EVENT(context, GLDrawTexxvOES, "context = %d, coords = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)coords);
 
     if (context && !context->isContextLost())
     {
@@ -15175,8 +15081,7 @@
                                                                   GLeglImageOES image)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::EGLImageTargetRenderbufferStorageOES,
-          "glEGLImageTargetRenderbufferStorageOES",
+    EVENT(context, GLEGLImageTargetRenderbufferStorageOES,
           "context = %d, target = %s, image = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::DefaultGroup, target), (uintptr_t)image);
 
@@ -15203,14 +15108,14 @@
                                                         GLeglImageOES image)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::EGLImageTargetTexture2DOES, "glEGLImageTargetTexture2DOES",
+    EVENT(context, GLEGLImageTargetTexture2DOES,
           "context = %d, target = %s, image = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::DefaultGroup, target), (uintptr_t)image);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateEGLImageTargetTexture2DOES(context, targetPacked, image));
@@ -15229,7 +15134,7 @@
 void GL_APIENTRY EnableContextANGLE(GLeglContext ctx, GLenum cap)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Enable, "glEnable", "context = %d, cap = %s", CID(context),
+    EVENT(context, GLEnable, "context = %d, cap = %s", CID(context),
           GLenumToString(GLenumGroup::EnableCap, cap));
 
     if (context && !context->isContextLost())
@@ -15252,13 +15157,13 @@
 void GL_APIENTRY EnableClientStateContextANGLE(GLeglContext ctx, GLenum array)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::EnableClientState, "glEnableClientState",
-          "context = %d, array = %s", CID(context), GLenumToString(GLenumGroup::EnableCap, array));
+    EVENT(context, GLEnableClientState, "context = %d, array = %s", CID(context),
+          GLenumToString(GLenumGroup::EnableCap, array));
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ClientVertexArrayType arrayPacked = FromGL<ClientVertexArrayType>(array);
+        ClientVertexArrayType arrayPacked = PackParam<ClientVertexArrayType>(array);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateEnableClientState(context, arrayPacked));
@@ -15277,8 +15182,7 @@
 void GL_APIENTRY EnableVertexAttribArrayContextANGLE(GLeglContext ctx, GLuint index)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::EnableVertexAttribArray, "glEnableVertexAttribArray",
-          "context = %d, index = %u", CID(context), index);
+    EVENT(context, GLEnableVertexAttribArray, "context = %d, index = %u", CID(context), index);
 
     if (context && !context->isContextLost())
     {
@@ -15301,8 +15205,8 @@
 void GL_APIENTRY EnableiContextANGLE(GLeglContext ctx, GLenum target, GLuint index)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Enablei, "glEnablei", "context = %d, target = %s, index = %u",
-          CID(context), GLenumToString(GLenumGroup::EnableCap, target), index);
+    EVENT(context, GLEnablei, "context = %d, target = %s, index = %u", CID(context),
+          GLenumToString(GLenumGroup::EnableCap, target), index);
 
     if (context && !context->isContextLost())
     {
@@ -15324,8 +15228,7 @@
 void GL_APIENTRY EnableiEXTContextANGLE(GLeglContext ctx, GLenum target, GLuint index)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::EnableiEXT, "glEnableiEXT",
-          "context = %d, target = %s, index = %u", CID(context),
+    EVENT(context, GLEnableiEXT, "context = %d, target = %s, index = %u", CID(context),
           GLenumToString(GLenumGroup::EnableCap, target), index);
 
     if (context && !context->isContextLost())
@@ -15349,8 +15252,7 @@
 void GL_APIENTRY EnableiOESContextANGLE(GLeglContext ctx, GLenum target, GLuint index)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::EnableiOES, "glEnableiOES",
-          "context = %d, target = %s, index = %u", CID(context),
+    EVENT(context, GLEnableiOES, "context = %d, target = %s, index = %u", CID(context),
           GLenumToString(GLenumGroup::EnableCap, target), index);
 
     if (context && !context->isContextLost())
@@ -15374,13 +15276,13 @@
 void GL_APIENTRY EndQueryContextANGLE(GLeglContext ctx, GLenum target)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::EndQuery, "glEndQuery", "context = %d, target = %s",
-          CID(context), GLenumToString(GLenumGroup::QueryTarget, target));
+    EVENT(context, GLEndQuery, "context = %d, target = %s", CID(context),
+          GLenumToString(GLenumGroup::QueryTarget, target));
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        QueryType targetPacked                                = FromGL<QueryType>(target);
+        QueryType targetPacked                                = PackParam<QueryType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateEndQuery(context, targetPacked));
         if (isCallValid)
@@ -15398,13 +15300,13 @@
 void GL_APIENTRY EndQueryEXTContextANGLE(GLeglContext ctx, GLenum target)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::EndQueryEXT, "glEndQueryEXT", "context = %d, target = %s",
-          CID(context), GLenumToString(GLenumGroup::QueryTarget, target));
+    EVENT(context, GLEndQueryEXT, "context = %d, target = %s", CID(context),
+          GLenumToString(GLenumGroup::QueryTarget, target));
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        QueryType targetPacked                                = FromGL<QueryType>(target);
+        QueryType targetPacked                                = PackParam<QueryType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateEndQueryEXT(context, targetPacked));
@@ -15423,8 +15325,7 @@
 void GL_APIENTRY EndTransformFeedbackContextANGLE(GLeglContext ctx)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::EndTransformFeedback, "glEndTransformFeedback", "context = %d",
-          CID(context));
+    EVENT(context, GLEndTransformFeedback, "context = %d", CID(context));
 
     if (context && !context->isContextLost())
     {
@@ -15446,8 +15347,7 @@
 GLsync GL_APIENTRY FenceSyncContextANGLE(GLeglContext ctx, GLenum condition, GLbitfield flags)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::FenceSync, "glFenceSync",
-          "context = %d, condition = %s, flags = %s", CID(context),
+    EVENT(context, GLFenceSync, "context = %d, condition = %s, flags = %s", CID(context),
           GLenumToString(GLenumGroup::SyncCondition, condition),
           GLbitfieldToString(GLenumGroup::DefaultGroup, flags).c_str());
 
@@ -15464,14 +15364,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::FenceSync, GLsync>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLFenceSync, GLsync>();
         }
         ANGLE_CAPTURE(FenceSync, isCallValid, context, condition, flags, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::FenceSync, GLsync>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLFenceSync, GLsync>();
     }
     return returnValue;
 }
@@ -15479,7 +15379,7 @@
 void GL_APIENTRY FinishContextANGLE(GLeglContext ctx)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Finish, "glFinish", "context = %d", CID(context));
+    EVENT(context, GLFinish, "context = %d", CID(context));
 
     if (context && !context->isContextLost())
     {
@@ -15501,13 +15401,12 @@
 void GL_APIENTRY FinishFenceNVContextANGLE(GLeglContext ctx, GLuint fence)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::FinishFenceNV, "glFinishFenceNV", "context = %d, fence = %u",
-          CID(context), fence);
+    EVENT(context, GLFinishFenceNV, "context = %d, fence = %u", CID(context), fence);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        FenceNVID fencePacked                                 = FromGL<FenceNVID>(fence);
+        FenceNVID fencePacked                                 = PackParam<FenceNVID>(fence);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateFinishFenceNV(context, fencePacked));
@@ -15526,7 +15425,7 @@
 void GL_APIENTRY FlushContextANGLE(GLeglContext ctx)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Flush, "glFlush", "context = %d", CID(context));
+    EVENT(context, GLFlush, "context = %d", CID(context));
 
     if (context && !context->isContextLost())
     {
@@ -15551,7 +15450,7 @@
                                                     GLsizeiptr length)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::FlushMappedBufferRange, "glFlushMappedBufferRange",
+    EVENT(context, GLFlushMappedBufferRange,
           "context = %d, target = %s, offset = %llu, length = %llu", CID(context),
           GLenumToString(GLenumGroup::BufferTargetARB, target),
           static_cast<unsigned long long>(offset), static_cast<unsigned long long>(length));
@@ -15559,7 +15458,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateFlushMappedBufferRange(context, targetPacked, offset, length));
@@ -15581,7 +15480,7 @@
                                                        GLsizeiptr length)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::FlushMappedBufferRangeEXT, "glFlushMappedBufferRangeEXT",
+    EVENT(context, GLFlushMappedBufferRangeEXT,
           "context = %d, target = %s, offset = %llu, length = %llu", CID(context),
           GLenumToString(GLenumGroup::BufferTargetARB, target),
           static_cast<unsigned long long>(offset), static_cast<unsigned long long>(length));
@@ -15589,7 +15488,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -15610,8 +15509,8 @@
 void GL_APIENTRY FogfContextANGLE(GLeglContext ctx, GLenum pname, GLfloat param)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Fogf, "glFogf", "context = %d, pname = %s, param = %f",
-          CID(context), GLenumToString(GLenumGroup::FogParameter, pname), param);
+    EVENT(context, GLFogf, "context = %d, pname = %s, param = %f", CID(context),
+          GLenumToString(GLenumGroup::FogParameter, pname), param);
 
     if (context && !context->isContextLost())
     {
@@ -15633,8 +15532,7 @@
 void GL_APIENTRY FogfvContextANGLE(GLeglContext ctx, GLenum pname, const GLfloat *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Fogfv, "glFogfv",
-          "context = %d, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
+    EVENT(context, GLFogfv, "context = %d, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::FogParameter, pname), (uintptr_t)params);
 
     if (context && !context->isContextLost())
@@ -15657,8 +15555,8 @@
 void GL_APIENTRY FogxContextANGLE(GLeglContext ctx, GLenum pname, GLfixed param)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Fogx, "glFogx", "context = %d, pname = %s, param = 0x%X",
-          CID(context), GLenumToString(GLenumGroup::FogPName, pname), param);
+    EVENT(context, GLFogx, "context = %d, pname = %s, param = 0x%X", CID(context),
+          GLenumToString(GLenumGroup::FogPName, pname), param);
 
     if (context && !context->isContextLost())
     {
@@ -15680,8 +15578,7 @@
 void GL_APIENTRY FogxvContextANGLE(GLeglContext ctx, GLenum pname, const GLfixed *param)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Fogxv, "glFogxv",
-          "context = %d, pname = %s, param = 0x%016" PRIxPTR "", CID(context),
+    EVENT(context, GLFogxv, "context = %d, pname = %s, param = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::FogPName, pname), (uintptr_t)param);
 
     if (context && !context->isContextLost())
@@ -15707,9 +15604,8 @@
                                                    GLint param)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::FramebufferParameteri, "glFramebufferParameteri",
-          "context = %d, target = %s, pname = %s, param = %d", CID(context),
-          GLenumToString(GLenumGroup::FramebufferTarget, target),
+    EVENT(context, GLFramebufferParameteri, "context = %d, target = %s, pname = %s, param = %d",
+          CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target),
           GLenumToString(GLenumGroup::FramebufferParameterName, pname), param);
 
     if (context && !context->isContextLost())
@@ -15737,7 +15633,7 @@
                                                      GLuint renderbuffer)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::FramebufferRenderbuffer, "glFramebufferRenderbuffer",
+    EVENT(context, GLFramebufferRenderbuffer,
           "context = %d, target = %s, attachment = %s, renderbuffertarget = %s, renderbuffer = %u",
           CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target),
           GLenumToString(GLenumGroup::FramebufferAttachment, attachment),
@@ -15746,7 +15642,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        RenderbufferID renderbufferPacked = FromGL<RenderbufferID>(renderbuffer);
+        RenderbufferID renderbufferPacked = PackParam<RenderbufferID>(renderbuffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -15773,7 +15669,7 @@
                                                         GLuint renderbuffer)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::FramebufferRenderbufferOES, "glFramebufferRenderbufferOES",
+    EVENT(context, GLFramebufferRenderbufferOES,
           "context = %d, target = %s, attachment = %s, renderbuffertarget = %s, renderbuffer = %u",
           CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target),
           GLenumToString(GLenumGroup::FramebufferAttachment, attachment),
@@ -15782,7 +15678,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        RenderbufferID renderbufferPacked = FromGL<RenderbufferID>(renderbuffer);
+        RenderbufferID renderbufferPacked = PackParam<RenderbufferID>(renderbuffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -15809,7 +15705,7 @@
                                                 GLint level)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::FramebufferTexture, "glFramebufferTexture",
+    EVENT(context, GLFramebufferTexture,
           "context = %d, target = %s, attachment = %s, texture = %u, level = %d", CID(context),
           GLenumToString(GLenumGroup::FramebufferTarget, target),
           GLenumToString(GLenumGroup::FramebufferAttachment, attachment), texture, level);
@@ -15817,7 +15713,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -15843,7 +15739,7 @@
                                                   GLint level)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::FramebufferTexture2D, "glFramebufferTexture2D",
+    EVENT(context, GLFramebufferTexture2D,
           "context = %d, target = %s, attachment = %s, textarget = %s, texture = %u, level = %d",
           CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target),
           GLenumToString(GLenumGroup::FramebufferAttachment, attachment),
@@ -15852,8 +15748,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureTarget textargetPacked                         = FromGL<TextureTarget>(textarget);
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
+        TextureTarget textargetPacked                         = PackParam<TextureTarget>(textarget);
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateFramebufferTexture2D(context, target, attachment,
@@ -15881,8 +15777,7 @@
                                                                 GLsizei samples)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::FramebufferTexture2DMultisampleEXT,
-          "glFramebufferTexture2DMultisampleEXT",
+    EVENT(context, GLFramebufferTexture2DMultisampleEXT,
           "context = %d, target = %s, attachment = %s, textarget = %s, texture = %u, level = %d, "
           "samples = %d",
           CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target),
@@ -15892,8 +15787,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureTarget textargetPacked                         = FromGL<TextureTarget>(textarget);
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
+        TextureTarget textargetPacked                         = PackParam<TextureTarget>(textarget);
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -15921,7 +15816,7 @@
                                                      GLint level)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::FramebufferTexture2DOES, "glFramebufferTexture2DOES",
+    EVENT(context, GLFramebufferTexture2DOES,
           "context = %d, target = %s, attachment = %s, textarget = %s, texture = %u, level = %d",
           CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target),
           GLenumToString(GLenumGroup::FramebufferAttachment, attachment),
@@ -15930,8 +15825,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureTarget textargetPacked                         = FromGL<TextureTarget>(textarget);
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
+        TextureTarget textargetPacked                         = PackParam<TextureTarget>(textarget);
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateFramebufferTexture2DOES(context, target, attachment,
@@ -15959,7 +15854,7 @@
                                                      GLint zoffset)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::FramebufferTexture3DOES, "glFramebufferTexture3DOES",
+    EVENT(context, GLFramebufferTexture3DOES,
           "context = %d, target = %s, attachment = %s, textarget = %s, texture = %u, level = %d, "
           "zoffset = %d",
           CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target),
@@ -15969,8 +15864,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureTarget textargetPacked                         = FromGL<TextureTarget>(textarget);
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
+        TextureTarget textargetPacked                         = PackParam<TextureTarget>(textarget);
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -15997,7 +15892,7 @@
                                                    GLint level)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::FramebufferTextureEXT, "glFramebufferTextureEXT",
+    EVENT(context, GLFramebufferTextureEXT,
           "context = %d, target = %s, attachment = %s, texture = %u, level = %d", CID(context),
           GLenumToString(GLenumGroup::FramebufferTarget, target),
           GLenumToString(GLenumGroup::FramebufferAttachment, attachment), texture, level);
@@ -16005,7 +15900,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -16031,7 +15926,7 @@
                                                      GLint layer)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::FramebufferTextureLayer, "glFramebufferTextureLayer",
+    EVENT(context, GLFramebufferTextureLayer,
           "context = %d, target = %s, attachment = %s, texture = %u, level = %d, layer = %d",
           CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target),
           GLenumToString(GLenumGroup::FramebufferAttachment, attachment), texture, level, layer);
@@ -16039,7 +15934,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateFramebufferTextureLayer(context, target, attachment,
@@ -16066,8 +15961,7 @@
                                                             GLsizei numViews)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::FramebufferTextureMultiviewOVR,
-          "glFramebufferTextureMultiviewOVR",
+    EVENT(context, GLFramebufferTextureMultiviewOVR,
           "context = %d, target = %s, attachment = %s, texture = %u, level = %d, baseViewIndex = "
           "%d, numViews = %d",
           CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target),
@@ -16077,7 +15971,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -16100,8 +15994,8 @@
 void GL_APIENTRY FrontFaceContextANGLE(GLeglContext ctx, GLenum mode)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::FrontFace, "glFrontFace", "context = %d, mode = %s",
-          CID(context), GLenumToString(GLenumGroup::FrontFaceDirection, mode));
+    EVENT(context, GLFrontFace, "context = %d, mode = %s", CID(context),
+          GLenumToString(GLenumGroup::FrontFaceDirection, mode));
 
     if (context && !context->isContextLost())
     {
@@ -16129,9 +16023,8 @@
                                       GLfloat f)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Frustumf, "glFrustumf",
-          "context = %d, l = %f, r = %f, b = %f, t = %f, n = %f, f = %f", CID(context), l, r, b, t,
-          n, f);
+    EVENT(context, GLFrustumf, "context = %d, l = %f, r = %f, b = %f, t = %f, n = %f, f = %f",
+          CID(context), l, r, b, t, n, f);
 
     if (context && !context->isContextLost())
     {
@@ -16160,7 +16053,7 @@
                                       GLfixed f)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Frustumx, "glFrustumx",
+    EVENT(context, GLFrustumx,
           "context = %d, l = 0x%X, r = 0x%X, b = 0x%X, t = 0x%X, n = 0x%X, f = 0x%X", CID(context),
           l, r, b, t, n, f);
 
@@ -16185,13 +16078,13 @@
 void GL_APIENTRY GenBuffersContextANGLE(GLeglContext ctx, GLsizei n, GLuint *buffers)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GenBuffers, "glGenBuffers",
-          "context = %d, n = %d, buffers = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)buffers);
+    EVENT(context, GLGenBuffers, "context = %d, n = %d, buffers = 0x%016" PRIxPTR "", CID(context),
+          n, (uintptr_t)buffers);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        BufferID *buffersPacked                               = FromGL<BufferID *>(buffers);
+        BufferID *buffersPacked                               = PackParam<BufferID *>(buffers);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGenBuffers(context, n, buffersPacked));
@@ -16210,13 +16103,13 @@
 void GL_APIENTRY GenFencesNVContextANGLE(GLeglContext ctx, GLsizei n, GLuint *fences)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GenFencesNV, "glGenFencesNV",
-          "context = %d, n = %d, fences = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)fences);
+    EVENT(context, GLGenFencesNV, "context = %d, n = %d, fences = 0x%016" PRIxPTR "", CID(context),
+          n, (uintptr_t)fences);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        FenceNVID *fencesPacked                               = FromGL<FenceNVID *>(fences);
+        FenceNVID *fencesPacked                               = PackParam<FenceNVID *>(fences);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGenFencesNV(context, n, fencesPacked));
@@ -16235,14 +16128,13 @@
 void GL_APIENTRY GenFramebuffersContextANGLE(GLeglContext ctx, GLsizei n, GLuint *framebuffers)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GenFramebuffers, "glGenFramebuffers",
-          "context = %d, n = %d, framebuffers = 0x%016" PRIxPTR "", CID(context), n,
-          (uintptr_t)framebuffers);
+    EVENT(context, GLGenFramebuffers, "context = %d, n = %d, framebuffers = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)framebuffers);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        FramebufferID *framebuffersPacked = FromGL<FramebufferID *>(framebuffers);
+        FramebufferID *framebuffersPacked = PackParam<FramebufferID *>(framebuffers);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGenFramebuffers(context, n, framebuffersPacked));
@@ -16261,14 +16153,13 @@
 void GL_APIENTRY GenFramebuffersOESContextANGLE(GLeglContext ctx, GLsizei n, GLuint *framebuffers)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GenFramebuffersOES, "glGenFramebuffersOES",
-          "context = %d, n = %d, framebuffers = 0x%016" PRIxPTR "", CID(context), n,
-          (uintptr_t)framebuffers);
+    EVENT(context, GLGenFramebuffersOES, "context = %d, n = %d, framebuffers = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)framebuffers);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        FramebufferID *framebuffersPacked = FromGL<FramebufferID *>(framebuffers);
+        FramebufferID *framebuffersPacked = PackParam<FramebufferID *>(framebuffers);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGenFramebuffersOES(context, n, framebuffersPacked));
@@ -16287,14 +16178,13 @@
 void GL_APIENTRY GenProgramPipelinesContextANGLE(GLeglContext ctx, GLsizei n, GLuint *pipelines)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GenProgramPipelines, "glGenProgramPipelines",
-          "context = %d, n = %d, pipelines = 0x%016" PRIxPTR "", CID(context), n,
-          (uintptr_t)pipelines);
+    EVENT(context, GLGenProgramPipelines, "context = %d, n = %d, pipelines = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)pipelines);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ProgramPipelineID *pipelinesPacked = FromGL<ProgramPipelineID *>(pipelines);
+        ProgramPipelineID *pipelinesPacked = PackParam<ProgramPipelineID *>(pipelines);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGenProgramPipelines(context, n, pipelinesPacked));
@@ -16313,14 +16203,13 @@
 void GL_APIENTRY GenProgramPipelinesEXTContextANGLE(GLeglContext ctx, GLsizei n, GLuint *pipelines)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GenProgramPipelinesEXT, "glGenProgramPipelinesEXT",
-          "context = %d, n = %d, pipelines = 0x%016" PRIxPTR "", CID(context), n,
-          (uintptr_t)pipelines);
+    EVENT(context, GLGenProgramPipelinesEXT, "context = %d, n = %d, pipelines = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)pipelines);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ProgramPipelineID *pipelinesPacked = FromGL<ProgramPipelineID *>(pipelines);
+        ProgramPipelineID *pipelinesPacked = PackParam<ProgramPipelineID *>(pipelines);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGenProgramPipelinesEXT(context, n, pipelinesPacked));
@@ -16339,13 +16228,13 @@
 void GL_APIENTRY GenQueriesContextANGLE(GLeglContext ctx, GLsizei n, GLuint *ids)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GenQueries, "glGenQueries",
-          "context = %d, n = %d, ids = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)ids);
+    EVENT(context, GLGenQueries, "context = %d, n = %d, ids = 0x%016" PRIxPTR "", CID(context), n,
+          (uintptr_t)ids);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        QueryID *idsPacked                                    = FromGL<QueryID *>(ids);
+        QueryID *idsPacked                                    = PackParam<QueryID *>(ids);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateGenQueries(context, n, idsPacked));
         if (isCallValid)
@@ -16363,13 +16252,13 @@
 void GL_APIENTRY GenQueriesEXTContextANGLE(GLeglContext ctx, GLsizei n, GLuint *ids)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GenQueriesEXT, "glGenQueriesEXT",
-          "context = %d, n = %d, ids = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)ids);
+    EVENT(context, GLGenQueriesEXT, "context = %d, n = %d, ids = 0x%016" PRIxPTR "", CID(context),
+          n, (uintptr_t)ids);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        QueryID *idsPacked                                    = FromGL<QueryID *>(ids);
+        QueryID *idsPacked                                    = PackParam<QueryID *>(ids);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGenQueriesEXT(context, n, idsPacked));
@@ -16388,14 +16277,13 @@
 void GL_APIENTRY GenRenderbuffersContextANGLE(GLeglContext ctx, GLsizei n, GLuint *renderbuffers)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GenRenderbuffers, "glGenRenderbuffers",
-          "context = %d, n = %d, renderbuffers = 0x%016" PRIxPTR "", CID(context), n,
-          (uintptr_t)renderbuffers);
+    EVENT(context, GLGenRenderbuffers, "context = %d, n = %d, renderbuffers = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)renderbuffers);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        RenderbufferID *renderbuffersPacked = FromGL<RenderbufferID *>(renderbuffers);
+        RenderbufferID *renderbuffersPacked = PackParam<RenderbufferID *>(renderbuffers);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGenRenderbuffers(context, n, renderbuffersPacked));
@@ -16414,14 +16302,13 @@
 void GL_APIENTRY GenRenderbuffersOESContextANGLE(GLeglContext ctx, GLsizei n, GLuint *renderbuffers)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GenRenderbuffersOES, "glGenRenderbuffersOES",
-          "context = %d, n = %d, renderbuffers = 0x%016" PRIxPTR "", CID(context), n,
-          (uintptr_t)renderbuffers);
+    EVENT(context, GLGenRenderbuffersOES, "context = %d, n = %d, renderbuffers = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)renderbuffers);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        RenderbufferID *renderbuffersPacked = FromGL<RenderbufferID *>(renderbuffers);
+        RenderbufferID *renderbuffersPacked = PackParam<RenderbufferID *>(renderbuffers);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGenRenderbuffersOES(context, n, renderbuffersPacked));
@@ -16440,14 +16327,13 @@
 void GL_APIENTRY GenSamplersContextANGLE(GLeglContext ctx, GLsizei count, GLuint *samplers)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GenSamplers, "glGenSamplers",
-          "context = %d, count = %d, samplers = 0x%016" PRIxPTR "", CID(context), count,
-          (uintptr_t)samplers);
+    EVENT(context, GLGenSamplers, "context = %d, count = %d, samplers = 0x%016" PRIxPTR "",
+          CID(context), count, (uintptr_t)samplers);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        SamplerID *samplersPacked                             = FromGL<SamplerID *>(samplers);
+        SamplerID *samplersPacked                             = PackParam<SamplerID *>(samplers);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGenSamplers(context, count, samplersPacked));
@@ -16466,14 +16352,13 @@
 void GL_APIENTRY GenSemaphoresEXTContextANGLE(GLeglContext ctx, GLsizei n, GLuint *semaphores)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GenSemaphoresEXT, "glGenSemaphoresEXT",
-          "context = %d, n = %d, semaphores = 0x%016" PRIxPTR "", CID(context), n,
-          (uintptr_t)semaphores);
+    EVENT(context, GLGenSemaphoresEXT, "context = %d, n = %d, semaphores = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)semaphores);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        SemaphoreID *semaphoresPacked                         = FromGL<SemaphoreID *>(semaphores);
+        SemaphoreID *semaphoresPacked = PackParam<SemaphoreID *>(semaphores);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGenSemaphoresEXT(context, n, semaphoresPacked));
@@ -16492,14 +16377,13 @@
 void GL_APIENTRY GenTexturesContextANGLE(GLeglContext ctx, GLsizei n, GLuint *textures)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GenTextures, "glGenTextures",
-          "context = %d, n = %d, textures = 0x%016" PRIxPTR "", CID(context), n,
-          (uintptr_t)textures);
+    EVENT(context, GLGenTextures, "context = %d, n = %d, textures = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)textures);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureID *texturesPacked                             = FromGL<TextureID *>(textures);
+        TextureID *texturesPacked                             = PackParam<TextureID *>(textures);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGenTextures(context, n, texturesPacked));
@@ -16518,13 +16402,13 @@
 void GL_APIENTRY GenTransformFeedbacksContextANGLE(GLeglContext ctx, GLsizei n, GLuint *ids)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GenTransformFeedbacks, "glGenTransformFeedbacks",
-          "context = %d, n = %d, ids = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)ids);
+    EVENT(context, GLGenTransformFeedbacks, "context = %d, n = %d, ids = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)ids);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TransformFeedbackID *idsPacked                        = FromGL<TransformFeedbackID *>(ids);
+        TransformFeedbackID *idsPacked = PackParam<TransformFeedbackID *>(ids);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGenTransformFeedbacks(context, n, idsPacked));
@@ -16543,13 +16427,13 @@
 void GL_APIENTRY GenVertexArraysContextANGLE(GLeglContext ctx, GLsizei n, GLuint *arrays)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GenVertexArrays, "glGenVertexArrays",
-          "context = %d, n = %d, arrays = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)arrays);
+    EVENT(context, GLGenVertexArrays, "context = %d, n = %d, arrays = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)arrays);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        VertexArrayID *arraysPacked                           = FromGL<VertexArrayID *>(arrays);
+        VertexArrayID *arraysPacked                           = PackParam<VertexArrayID *>(arrays);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGenVertexArrays(context, n, arraysPacked));
@@ -16568,13 +16452,13 @@
 void GL_APIENTRY GenVertexArraysOESContextANGLE(GLeglContext ctx, GLsizei n, GLuint *arrays)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GenVertexArraysOES, "glGenVertexArraysOES",
-          "context = %d, n = %d, arrays = 0x%016" PRIxPTR "", CID(context), n, (uintptr_t)arrays);
+    EVENT(context, GLGenVertexArraysOES, "context = %d, n = %d, arrays = 0x%016" PRIxPTR "",
+          CID(context), n, (uintptr_t)arrays);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        VertexArrayID *arraysPacked                           = FromGL<VertexArrayID *>(arrays);
+        VertexArrayID *arraysPacked                           = PackParam<VertexArrayID *>(arrays);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGenVertexArraysOES(context, n, arraysPacked));
@@ -16593,13 +16477,13 @@
 void GL_APIENTRY GenerateMipmapContextANGLE(GLeglContext ctx, GLenum target)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GenerateMipmap, "glGenerateMipmap", "context = %d, target = %s",
-          CID(context), GLenumToString(GLenumGroup::TextureTarget, target));
+    EVENT(context, GLGenerateMipmap, "context = %d, target = %s", CID(context),
+          GLenumToString(GLenumGroup::TextureTarget, target));
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGenerateMipmap(context, targetPacked));
@@ -16618,14 +16502,13 @@
 void GL_APIENTRY GenerateMipmapOESContextANGLE(GLeglContext ctx, GLenum target)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GenerateMipmapOES, "glGenerateMipmapOES",
-          "context = %d, target = %s", CID(context),
+    EVENT(context, GLGenerateMipmapOES, "context = %d, target = %s", CID(context),
           GLenumToString(GLenumGroup::TextureTarget, target));
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGenerateMipmapOES(context, targetPacked));
@@ -16651,7 +16534,7 @@
                                              GLchar *name)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetActiveAttrib, "glGetActiveAttrib",
+    EVENT(context, GLGetActiveAttrib,
           "context = %d, program = %u, index = %u, bufSize = %d, length = 0x%016" PRIxPTR
           ", size = 0x%016" PRIxPTR ", type = 0x%016" PRIxPTR ", name = 0x%016" PRIxPTR "",
           CID(context), program, index, bufSize, (uintptr_t)length, (uintptr_t)size,
@@ -16660,7 +16543,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetActiveAttrib(context, programPacked, index, bufSize, length,
@@ -16688,7 +16571,7 @@
                                               GLchar *name)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetActiveUniform, "glGetActiveUniform",
+    EVENT(context, GLGetActiveUniform,
           "context = %d, program = %u, index = %u, bufSize = %d, length = 0x%016" PRIxPTR
           ", size = 0x%016" PRIxPTR ", type = 0x%016" PRIxPTR ", name = 0x%016" PRIxPTR "",
           CID(context), program, index, bufSize, (uintptr_t)length, (uintptr_t)size,
@@ -16697,7 +16580,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetActiveUniform(context, programPacked, index, bufSize, length,
@@ -16724,7 +16607,7 @@
 {
     Context *context = static_cast<gl::Context *>(ctx);
     EVENT(
-        context, gl::EntryPoint::GetActiveUniformBlockName, "glGetActiveUniformBlockName",
+        context, GLGetActiveUniformBlockName,
         "context = %d, program = %u, uniformBlockIndex = %u, bufSize = %d, length = 0x%016" PRIxPTR
         ", uniformBlockName = 0x%016" PRIxPTR "",
         CID(context), program, uniformBlockIndex, bufSize, (uintptr_t)length,
@@ -16733,7 +16616,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -16760,7 +16643,7 @@
                                                      GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetActiveUniformBlockiv, "glGetActiveUniformBlockiv",
+    EVENT(context, GLGetActiveUniformBlockiv,
           "context = %d, program = %u, uniformBlockIndex = %u, pname = %s, params = 0x%016" PRIxPTR
           "",
           CID(context), program, uniformBlockIndex,
@@ -16769,7 +16652,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetActiveUniformBlockiv(context, programPacked,
@@ -16795,7 +16678,7 @@
                                                  GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetActiveUniformsiv, "glGetActiveUniformsiv",
+    EVENT(context, GLGetActiveUniformsiv,
           "context = %d, program = %u, uniformCount = %d, uniformIndices = 0x%016" PRIxPTR
           ", pname = %s, params = 0x%016" PRIxPTR "",
           CID(context), program, uniformCount, (uintptr_t)uniformIndices,
@@ -16804,7 +16687,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetActiveUniformsiv(context, programPacked, uniformCount,
@@ -16830,7 +16713,7 @@
                                                 GLuint *shaders)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetAttachedShaders, "glGetAttachedShaders",
+    EVENT(context, GLGetAttachedShaders,
           "context = %d, program = %u, maxCount = %d, count = 0x%016" PRIxPTR
           ", shaders = 0x%016" PRIxPTR "",
           CID(context), program, maxCount, (uintptr_t)count, (uintptr_t)shaders);
@@ -16838,8 +16721,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        ShaderProgramID *shadersPacked                        = FromGL<ShaderProgramID *>(shaders);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        ShaderProgramID *shadersPacked = PackParam<ShaderProgramID *>(shaders);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -16862,15 +16745,14 @@
                                                 const GLchar *name)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetAttribLocation, "glGetAttribLocation",
-          "context = %d, program = %u, name = 0x%016" PRIxPTR "", CID(context), program,
-          (uintptr_t)name);
+    EVENT(context, GLGetAttribLocation, "context = %d, program = %u, name = 0x%016" PRIxPTR "",
+          CID(context), program, (uintptr_t)name);
 
     GLint returnValue;
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGetAttribLocation(context, programPacked, name));
@@ -16880,14 +16762,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetAttribLocation, GLint>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetAttribLocation, GLint>();
         }
         ANGLE_CAPTURE(GetAttribLocation, isCallValid, context, programPacked, name, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::GetAttribLocation, GLint>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetAttribLocation, GLint>();
     }
     return returnValue;
 }
@@ -16898,7 +16780,7 @@
                                            GLboolean *data)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetBooleani_v, "glGetBooleani_v",
+    EVENT(context, GLGetBooleani_v,
           "context = %d, target = %s, index = %u, data = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::BufferTargetARB, target), index, (uintptr_t)data);
 
@@ -16923,9 +16805,8 @@
 void GL_APIENTRY GetBooleanvContextANGLE(GLeglContext ctx, GLenum pname, GLboolean *data)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetBooleanv, "glGetBooleanv",
-          "context = %d, pname = %s, data = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::GetPName, pname), (uintptr_t)data);
+    EVENT(context, GLGetBooleanv, "context = %d, pname = %s, data = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::GetPName, pname), (uintptr_t)data);
 
     if (context && !context->isContextLost())
     {
@@ -16950,7 +16831,7 @@
                                                     GLint64 *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetBufferParameteri64v, "glGetBufferParameteri64v",
+    EVENT(context, GLGetBufferParameteri64v,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::BufferTargetARB, target),
           GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
@@ -16958,7 +16839,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetBufferParameteri64v(context, targetPacked, pname, params));
@@ -16980,7 +16861,7 @@
                                                   GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetBufferParameteriv, "glGetBufferParameteriv",
+    EVENT(context, GLGetBufferParameteriv,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::BufferTargetARB, target),
           GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
@@ -16988,7 +16869,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetBufferParameteriv(context, targetPacked, pname, params));
@@ -17010,7 +16891,7 @@
                                                void **params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetBufferPointerv, "glGetBufferPointerv",
+    EVENT(context, GLGetBufferPointerv,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::BufferTargetARB, target),
           GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
@@ -17018,7 +16899,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetBufferPointerv(context, targetPacked, pname, params));
@@ -17040,7 +16921,7 @@
                                                   void **params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetBufferPointervOES, "glGetBufferPointervOES",
+    EVENT(context, GLGetBufferPointervOES,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::BufferTargetARB, target),
           GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
@@ -17048,7 +16929,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetBufferPointervOES(context, targetPacked, pname, params));
@@ -17067,9 +16948,8 @@
 void GL_APIENTRY GetClipPlanefContextANGLE(GLeglContext ctx, GLenum plane, GLfloat *equation)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetClipPlanef, "glGetClipPlanef",
-          "context = %d, plane = %s, equation = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::ClipPlaneName, plane), (uintptr_t)equation);
+    EVENT(context, GLGetClipPlanef, "context = %d, plane = %s, equation = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::ClipPlaneName, plane), (uintptr_t)equation);
 
     if (context && !context->isContextLost())
     {
@@ -17092,9 +16972,8 @@
 void GL_APIENTRY GetClipPlanexContextANGLE(GLeglContext ctx, GLenum plane, GLfixed *equation)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetClipPlanex, "glGetClipPlanex",
-          "context = %d, plane = %s, equation = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::ClipPlaneName, plane), (uintptr_t)equation);
+    EVENT(context, GLGetClipPlanex, "context = %d, plane = %s, equation = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::ClipPlaneName, plane), (uintptr_t)equation);
 
     if (context && !context->isContextLost())
     {
@@ -17125,7 +17004,7 @@
                                                   GLchar *messageLog)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetDebugMessageLog, "glGetDebugMessageLog",
+    EVENT(context, GLGetDebugMessageLog,
           "context = %d, count = %u, bufSize = %d, sources = 0x%016" PRIxPTR
           ", types = 0x%016" PRIxPTR ", ids = 0x%016" PRIxPTR ", severities = 0x%016" PRIxPTR
           ", lengths = 0x%016" PRIxPTR ", messageLog = 0x%016" PRIxPTR "",
@@ -17147,7 +17026,7 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetDebugMessageLog, GLuint>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetDebugMessageLog, GLuint>();
         }
         ANGLE_CAPTURE(GetDebugMessageLog, isCallValid, context, count, bufSize, sources, types, ids,
                       severities, lengths, messageLog, returnValue);
@@ -17155,7 +17034,7 @@
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::GetDebugMessageLog, GLuint>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetDebugMessageLog, GLuint>();
     }
     return returnValue;
 }
@@ -17171,7 +17050,7 @@
                                                      GLchar *messageLog)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetDebugMessageLogKHR, "glGetDebugMessageLogKHR",
+    EVENT(context, GLGetDebugMessageLogKHR,
           "context = %d, count = %u, bufSize = %d, sources = 0x%016" PRIxPTR
           ", types = 0x%016" PRIxPTR ", ids = 0x%016" PRIxPTR ", severities = 0x%016" PRIxPTR
           ", lengths = 0x%016" PRIxPTR ", messageLog = 0x%016" PRIxPTR "",
@@ -17193,7 +17072,8 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetDebugMessageLogKHR, GLuint>();
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLGetDebugMessageLogKHR, GLuint>();
         }
         ANGLE_CAPTURE(GetDebugMessageLogKHR, isCallValid, context, count, bufSize, sources, types,
                       ids, severities, lengths, messageLog, returnValue);
@@ -17201,7 +17081,7 @@
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::GetDebugMessageLogKHR, GLuint>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetDebugMessageLogKHR, GLuint>();
     }
     return returnValue;
 }
@@ -17209,7 +17089,7 @@
 GLenum GL_APIENTRY GetErrorContextANGLE(GLeglContext ctx)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetError, "glGetError", "context = %d", CID(context));
+    EVENT(context, GLGetError, "context = %d", CID(context));
 
     GLenum returnValue;
     if (context)
@@ -17223,14 +17103,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetError, GLenum>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetError, GLenum>();
         }
         ANGLE_CAPTURE(GetError, isCallValid, context, returnValue);
     }
     else
     {
 
-        returnValue = GetDefaultReturnValue<EntryPoint::GetError, GLenum>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetError, GLenum>();
     }
     return returnValue;
 }
@@ -17241,14 +17121,14 @@
                                           GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetFenceivNV, "glGetFenceivNV",
+    EVENT(context, GLGetFenceivNV,
           "context = %d, fence = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), fence,
           GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        FenceNVID fencePacked                                 = FromGL<FenceNVID>(fence);
+        FenceNVID fencePacked                                 = PackParam<FenceNVID>(fence);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetFenceivNV(context, fencePacked, pname, params));
@@ -17267,9 +17147,8 @@
 void GL_APIENTRY GetFixedvContextANGLE(GLeglContext ctx, GLenum pname, GLfixed *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetFixedv, "glGetFixedv",
-          "context = %d, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::GetPName, pname), (uintptr_t)params);
+    EVENT(context, GLGetFixedv, "context = %d, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::GetPName, pname), (uintptr_t)params);
 
     if (context && !context->isContextLost())
     {
@@ -17291,8 +17170,7 @@
 void GL_APIENTRY GetFloatvContextANGLE(GLeglContext ctx, GLenum pname, GLfloat *data)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetFloatv, "glGetFloatv",
-          "context = %d, pname = %s, data = 0x%016" PRIxPTR "", CID(context),
+    EVENT(context, GLGetFloatv, "context = %d, pname = %s, data = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::GetPName, pname), (uintptr_t)data);
 
     if (context && !context->isContextLost())
@@ -17317,15 +17195,14 @@
                                                   const GLchar *name)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetFragDataIndexEXT, "glGetFragDataIndexEXT",
-          "context = %d, program = %u, name = 0x%016" PRIxPTR "", CID(context), program,
-          (uintptr_t)name);
+    EVENT(context, GLGetFragDataIndexEXT, "context = %d, program = %u, name = 0x%016" PRIxPTR "",
+          CID(context), program, (uintptr_t)name);
 
     GLint returnValue;
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetFragDataIndexEXT(context, programPacked, name));
@@ -17335,14 +17212,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetFragDataIndexEXT, GLint>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetFragDataIndexEXT, GLint>();
         }
         ANGLE_CAPTURE(GetFragDataIndexEXT, isCallValid, context, programPacked, name, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::GetFragDataIndexEXT, GLint>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetFragDataIndexEXT, GLint>();
     }
     return returnValue;
 }
@@ -17352,15 +17229,14 @@
                                                   const GLchar *name)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetFragDataLocation, "glGetFragDataLocation",
-          "context = %d, program = %u, name = 0x%016" PRIxPTR "", CID(context), program,
-          (uintptr_t)name);
+    EVENT(context, GLGetFragDataLocation, "context = %d, program = %u, name = 0x%016" PRIxPTR "",
+          CID(context), program, (uintptr_t)name);
 
     GLint returnValue;
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetFragDataLocation(context, programPacked, name));
@@ -17370,14 +17246,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetFragDataLocation, GLint>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetFragDataLocation, GLint>();
         }
         ANGLE_CAPTURE(GetFragDataLocation, isCallValid, context, programPacked, name, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::GetFragDataLocation, GLint>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetFragDataLocation, GLint>();
     }
     return returnValue;
 }
@@ -17389,8 +17265,7 @@
                                                                  GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetFramebufferAttachmentParameteriv,
-          "glGetFramebufferAttachmentParameteriv",
+    EVENT(context, GLGetFramebufferAttachmentParameteriv,
           "context = %d, target = %s, attachment = %s, pname = %s, params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target),
           GLenumToString(GLenumGroup::FramebufferAttachment, attachment),
@@ -17424,8 +17299,7 @@
                                                                     GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetFramebufferAttachmentParameterivOES,
-          "glGetFramebufferAttachmentParameterivOES",
+    EVENT(context, GLGetFramebufferAttachmentParameterivOES,
           "context = %d, target = %s, attachment = %s, pname = %s, params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target),
           GLenumToString(GLenumGroup::FramebufferAttachment, attachment),
@@ -17458,7 +17332,7 @@
                                                        GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetFramebufferParameteriv, "glGetFramebufferParameteriv",
+    EVENT(context, GLGetFramebufferParameteriv,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::FramebufferTarget, target),
           GLenumToString(GLenumGroup::FramebufferAttachmentParameterName, pname),
@@ -17485,8 +17359,7 @@
 GLenum GL_APIENTRY GetGraphicsResetStatusContextANGLE(GLeglContext ctx)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetGraphicsResetStatus, "glGetGraphicsResetStatus",
-          "context = %d", CID(context));
+    EVENT(context, GLGetGraphicsResetStatus, "context = %d", CID(context));
 
     GLenum returnValue;
     if (context)
@@ -17500,14 +17373,15 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetGraphicsResetStatus, GLenum>();
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLGetGraphicsResetStatus, GLenum>();
         }
         ANGLE_CAPTURE(GetGraphicsResetStatus, isCallValid, context, returnValue);
     }
     else
     {
 
-        returnValue = GetDefaultReturnValue<EntryPoint::GetGraphicsResetStatus, GLenum>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetGraphicsResetStatus, GLenum>();
     }
     return returnValue;
 }
@@ -17515,8 +17389,7 @@
 GLenum GL_APIENTRY GetGraphicsResetStatusEXTContextANGLE(GLeglContext ctx)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetGraphicsResetStatusEXT, "glGetGraphicsResetStatusEXT",
-          "context = %d", CID(context));
+    EVENT(context, GLGetGraphicsResetStatusEXT, "context = %d", CID(context));
 
     GLenum returnValue;
     if (context)
@@ -17531,14 +17404,16 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetGraphicsResetStatusEXT, GLenum>();
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLGetGraphicsResetStatusEXT, GLenum>();
         }
         ANGLE_CAPTURE(GetGraphicsResetStatusEXT, isCallValid, context, returnValue);
     }
     else
     {
 
-        returnValue = GetDefaultReturnValue<EntryPoint::GetGraphicsResetStatusEXT, GLenum>();
+        returnValue =
+            GetDefaultReturnValue<angle::EntryPoint::GLGetGraphicsResetStatusEXT, GLenum>();
     }
     return returnValue;
 }
@@ -17549,7 +17424,7 @@
                                              GLint64 *data)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetInteger64i_v, "glGetInteger64i_v",
+    EVENT(context, GLGetInteger64i_v,
           "context = %d, target = %s, index = %u, data = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TypeEnum, target), index, (uintptr_t)data);
 
@@ -17574,9 +17449,8 @@
 void GL_APIENTRY GetInteger64vContextANGLE(GLeglContext ctx, GLenum pname, GLint64 *data)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetInteger64v, "glGetInteger64v",
-          "context = %d, pname = %s, data = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::GetPName, pname), (uintptr_t)data);
+    EVENT(context, GLGetInteger64v, "context = %d, pname = %s, data = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::GetPName, pname), (uintptr_t)data);
 
     if (context && !context->isContextLost())
     {
@@ -17599,9 +17473,8 @@
 void GL_APIENTRY GetInteger64vEXTContextANGLE(GLeglContext ctx, GLenum pname, GLint64 *data)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetInteger64vEXT, "glGetInteger64vEXT",
-          "context = %d, pname = %s, data = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::GetPName, pname), (uintptr_t)data);
+    EVENT(context, GLGetInteger64vEXT, "context = %d, pname = %s, data = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::GetPName, pname), (uintptr_t)data);
 
     if (context && !context->isContextLost())
     {
@@ -17627,7 +17500,7 @@
                                            GLint *data)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetIntegeri_v, "glGetIntegeri_v",
+    EVENT(context, GLGetIntegeri_v,
           "context = %d, target = %s, index = %u, data = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TypeEnum, target), index, (uintptr_t)data);
 
@@ -17652,9 +17525,8 @@
 void GL_APIENTRY GetIntegervContextANGLE(GLeglContext ctx, GLenum pname, GLint *data)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetIntegerv, "glGetIntegerv",
-          "context = %d, pname = %s, data = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::GetPName, pname), (uintptr_t)data);
+    EVENT(context, GLGetIntegerv, "context = %d, pname = %s, data = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::GetPName, pname), (uintptr_t)data);
 
     if (context && !context->isContextLost())
     {
@@ -17681,7 +17553,7 @@
                                                  GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetInternalformativ, "glGetInternalformativ",
+    EVENT(context, GLGetInternalformativ,
           "context = %d, target = %s, internalformat = %s, pname = %s, bufSize = %d, params = "
           "0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target),
@@ -17714,15 +17586,14 @@
                                         GLfloat *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetLightfv, "glGetLightfv",
-          "context = %d, light = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::LightName, light),
+    EVENT(context, GLGetLightfv, "context = %d, light = %s, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::LightName, light),
           GLenumToString(GLenumGroup::LightParameter, pname), (uintptr_t)params);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        LightParameter pnamePacked                            = FromGL<LightParameter>(pname);
+        LightParameter pnamePacked                            = PackParam<LightParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGetLightfv(context, light, pnamePacked, params));
@@ -17744,15 +17615,14 @@
                                         GLfixed *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetLightxv, "glGetLightxv",
-          "context = %d, light = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::LightName, light),
+    EVENT(context, GLGetLightxv, "context = %d, light = %s, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::LightName, light),
           GLenumToString(GLenumGroup::LightParameter, pname), (uintptr_t)params);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        LightParameter pnamePacked                            = FromGL<LightParameter>(pname);
+        LightParameter pnamePacked                            = PackParam<LightParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGetLightxv(context, light, pnamePacked, params));
@@ -17774,7 +17644,7 @@
                                            GLfloat *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetMaterialfv, "glGetMaterialfv",
+    EVENT(context, GLGetMaterialfv,
           "context = %d, face = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::MaterialFace, face),
           GLenumToString(GLenumGroup::MaterialParameter, pname), (uintptr_t)params);
@@ -17782,7 +17652,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        MaterialParameter pnamePacked                         = FromGL<MaterialParameter>(pname);
+        MaterialParameter pnamePacked                         = PackParam<MaterialParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetMaterialfv(context, face, pnamePacked, params));
@@ -17804,7 +17674,7 @@
                                            GLfixed *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetMaterialxv, "glGetMaterialxv",
+    EVENT(context, GLGetMaterialxv,
           "context = %d, face = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::MaterialFace, face),
           GLenumToString(GLenumGroup::MaterialParameter, pname), (uintptr_t)params);
@@ -17812,7 +17682,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        MaterialParameter pnamePacked                         = FromGL<MaterialParameter>(pname);
+        MaterialParameter pnamePacked                         = PackParam<MaterialParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetMaterialxv(context, face, pnamePacked, params));
@@ -17834,7 +17704,7 @@
                                                            GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetMemoryObjectParameterivEXT, "glGetMemoryObjectParameterivEXT",
+    EVENT(context, GLGetMemoryObjectParameterivEXT,
           "context = %d, memoryObject = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           memoryObject, GLenumToString(GLenumGroup::MemoryObjectParameterName, pname),
           (uintptr_t)params);
@@ -17842,7 +17712,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        MemoryObjectID memoryObjectPacked = FromGL<MemoryObjectID>(memoryObject);
+        MemoryObjectID memoryObjectPacked = PackParam<MemoryObjectID>(memoryObject);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -17866,7 +17736,7 @@
                                               GLfloat *val)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetMultisamplefv, "glGetMultisamplefv",
+    EVENT(context, GLGetMultisamplefv,
           "context = %d, pname = %s, index = %u, val = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::DefaultGroup, pname), index, (uintptr_t)val);
 
@@ -17896,7 +17766,7 @@
                                             GLchar *label)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetObjectLabel, "glGetObjectLabel",
+    EVENT(context, GLGetObjectLabel,
           "context = %d, identifier = %s, name = %u, bufSize = %d, length = 0x%016" PRIxPTR
           ", label = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, identifier), name, bufSize,
@@ -17922,6 +17792,40 @@
     }
 }
 
+void GL_APIENTRY GetObjectLabelEXTContextANGLE(GLeglContext ctx,
+                                               GLenum type,
+                                               GLuint object,
+                                               GLsizei bufSize,
+                                               GLsizei *length,
+                                               GLchar *label)
+{
+    Context *context = static_cast<gl::Context *>(ctx);
+    EVENT(context, GLGetObjectLabelEXT,
+          "context = %d, type = %s, object = %u, bufSize = %d, length = 0x%016" PRIxPTR
+          ", label = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::DefaultGroup, type), object, bufSize,
+          (uintptr_t)length, (uintptr_t)label);
+
+    if (context && !context->isContextLost())
+    {
+        ASSERT(context == GetValidGlobalContext());
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid =
+            (context->skipValidation() ||
+             ValidateGetObjectLabelEXT(context, type, object, bufSize, length, label));
+        if (isCallValid)
+        {
+            context->getObjectLabel(type, object, bufSize, length, label);
+        }
+        ANGLE_CAPTURE(GetObjectLabelEXT, isCallValid, context, type, object, bufSize, length,
+                      label);
+    }
+    else
+    {
+        GenerateContextLostErrorOnContext(context);
+    }
+}
+
 void GL_APIENTRY GetObjectLabelKHRContextANGLE(GLeglContext ctx,
                                                GLenum identifier,
                                                GLuint name,
@@ -17930,7 +17834,7 @@
                                                GLchar *label)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetObjectLabelKHR, "glGetObjectLabelKHR",
+    EVENT(context, GLGetObjectLabelKHR,
           "context = %d, identifier = %s, name = %u, bufSize = %d, length = 0x%016" PRIxPTR
           ", label = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, identifier), name, bufSize,
@@ -17963,7 +17867,7 @@
                                                GLchar *label)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetObjectPtrLabel, "glGetObjectPtrLabel",
+    EVENT(context, GLGetObjectPtrLabel,
           "context = %d, ptr = 0x%016" PRIxPTR ", bufSize = %d, length = 0x%016" PRIxPTR
           ", label = 0x%016" PRIxPTR "",
           CID(context), (uintptr_t)ptr, bufSize, (uintptr_t)length, (uintptr_t)label);
@@ -17993,7 +17897,7 @@
                                                   GLchar *label)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetObjectPtrLabelKHR, "glGetObjectPtrLabelKHR",
+    EVENT(context, GLGetObjectPtrLabelKHR,
           "context = %d, ptr = 0x%016" PRIxPTR ", bufSize = %d, length = 0x%016" PRIxPTR
           ", label = 0x%016" PRIxPTR "",
           CID(context), (uintptr_t)ptr, bufSize, (uintptr_t)length, (uintptr_t)label);
@@ -18019,9 +17923,8 @@
 void GL_APIENTRY GetPointervContextANGLE(GLeglContext ctx, GLenum pname, void **params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetPointerv, "glGetPointerv",
-          "context = %d, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::GetPointervPName, pname), (uintptr_t)params);
+    EVENT(context, GLGetPointerv, "context = %d, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::GetPointervPName, pname), (uintptr_t)params);
 
     if (context && !context->isContextLost())
     {
@@ -18044,9 +17947,8 @@
 void GL_APIENTRY GetPointervKHRContextANGLE(GLeglContext ctx, GLenum pname, void **params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetPointervKHR, "glGetPointervKHR",
-          "context = %d, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
+    EVENT(context, GLGetPointervKHR, "context = %d, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
 
     if (context && !context->isContextLost())
     {
@@ -18074,7 +17976,7 @@
                                               void *binary)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetProgramBinary, "glGetProgramBinary",
+    EVENT(context, GLGetProgramBinary,
           "context = %d, program = %u, bufSize = %d, length = 0x%016" PRIxPTR
           ", binaryFormat = 0x%016" PRIxPTR ", binary = 0x%016" PRIxPTR "",
           CID(context), program, bufSize, (uintptr_t)length, (uintptr_t)binaryFormat,
@@ -18083,7 +17985,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGetProgramBinary(context, programPacked, bufSize,
@@ -18109,7 +18011,7 @@
                                                  void *binary)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetProgramBinaryOES, "glGetProgramBinaryOES",
+    EVENT(context, GLGetProgramBinaryOES,
           "context = %d, program = %u, bufSize = %d, length = 0x%016" PRIxPTR
           ", binaryFormat = 0x%016" PRIxPTR ", binary = 0x%016" PRIxPTR "",
           CID(context), program, bufSize, (uintptr_t)length, (uintptr_t)binaryFormat,
@@ -18118,7 +18020,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetProgramBinaryOES(context, programPacked, bufSize, length,
@@ -18143,7 +18045,7 @@
                                                GLchar *infoLog)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetProgramInfoLog, "glGetProgramInfoLog",
+    EVENT(context, GLGetProgramInfoLog,
           "context = %d, program = %u, bufSize = %d, length = 0x%016" PRIxPTR
           ", infoLog = 0x%016" PRIxPTR "",
           CID(context), program, bufSize, (uintptr_t)length, (uintptr_t)infoLog);
@@ -18151,7 +18053,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -18176,7 +18078,7 @@
                                                    GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetProgramInterfaceiv, "glGetProgramInterfaceiv",
+    EVENT(context, GLGetProgramInterfaceiv,
           "context = %d, program = %u, programInterface = %s, pname = %s, params = 0x%016" PRIxPTR
           "",
           CID(context), program, GLenumToString(GLenumGroup::ProgramInterface, programInterface),
@@ -18185,7 +18087,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetProgramInterfaceiv(context, programPacked, programInterface,
@@ -18210,7 +18112,7 @@
                                                        GLchar *infoLog)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetProgramPipelineInfoLog, "glGetProgramPipelineInfoLog",
+    EVENT(context, GLGetProgramPipelineInfoLog,
           "context = %d, pipeline = %u, bufSize = %d, length = 0x%016" PRIxPTR
           ", infoLog = 0x%016" PRIxPTR "",
           CID(context), pipeline, bufSize, (uintptr_t)length, (uintptr_t)infoLog);
@@ -18218,7 +18120,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ProgramPipelineID pipelinePacked                      = FromGL<ProgramPipelineID>(pipeline);
+        ProgramPipelineID pipelinePacked = PackParam<ProgramPipelineID>(pipeline);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -18243,7 +18145,7 @@
                                                           GLchar *infoLog)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetProgramPipelineInfoLogEXT, "glGetProgramPipelineInfoLogEXT",
+    EVENT(context, GLGetProgramPipelineInfoLogEXT,
           "context = %d, pipeline = %u, bufSize = %d, length = 0x%016" PRIxPTR
           ", infoLog = 0x%016" PRIxPTR "",
           CID(context), pipeline, bufSize, (uintptr_t)length, (uintptr_t)infoLog);
@@ -18251,7 +18153,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ProgramPipelineID pipelinePacked                      = FromGL<ProgramPipelineID>(pipeline);
+        ProgramPipelineID pipelinePacked = PackParam<ProgramPipelineID>(pipeline);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGetProgramPipelineInfoLogEXT(
@@ -18275,14 +18177,14 @@
                                                   GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetProgramPipelineiv, "glGetProgramPipelineiv",
+    EVENT(context, GLGetProgramPipelineiv,
           "context = %d, pipeline = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           pipeline, GLenumToString(GLenumGroup::PipelineParameterName, pname), (uintptr_t)params);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ProgramPipelineID pipelinePacked                      = FromGL<ProgramPipelineID>(pipeline);
+        ProgramPipelineID pipelinePacked = PackParam<ProgramPipelineID>(pipeline);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetProgramPipelineiv(context, pipelinePacked, pname, params));
@@ -18304,14 +18206,14 @@
                                                      GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetProgramPipelineivEXT, "glGetProgramPipelineivEXT",
+    EVENT(context, GLGetProgramPipelineivEXT,
           "context = %d, pipeline = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           pipeline, GLenumToString(GLenumGroup::PipelineParameterName, pname), (uintptr_t)params);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ProgramPipelineID pipelinePacked                      = FromGL<ProgramPipelineID>(pipeline);
+        ProgramPipelineID pipelinePacked = PackParam<ProgramPipelineID>(pipeline);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -18334,7 +18236,7 @@
                                                        const GLchar *name)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetProgramResourceIndex, "glGetProgramResourceIndex",
+    EVENT(context, GLGetProgramResourceIndex,
           "context = %d, program = %u, programInterface = %s, name = 0x%016" PRIxPTR "",
           CID(context), program, GLenumToString(GLenumGroup::ProgramInterface, programInterface),
           (uintptr_t)name);
@@ -18343,7 +18245,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -18354,7 +18256,8 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetProgramResourceIndex, GLuint>();
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLGetProgramResourceIndex, GLuint>();
         }
         ANGLE_CAPTURE(GetProgramResourceIndex, isCallValid, context, programPacked,
                       programInterface, name, returnValue);
@@ -18362,7 +18265,7 @@
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::GetProgramResourceIndex, GLuint>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetProgramResourceIndex, GLuint>();
     }
     return returnValue;
 }
@@ -18373,7 +18276,7 @@
                                                          const GLchar *name)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetProgramResourceLocation, "glGetProgramResourceLocation",
+    EVENT(context, GLGetProgramResourceLocation,
           "context = %d, program = %u, programInterface = %s, name = 0x%016" PRIxPTR "",
           CID(context), program, GLenumToString(GLenumGroup::ProgramInterface, programInterface),
           (uintptr_t)name);
@@ -18382,7 +18285,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -18394,7 +18297,8 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetProgramResourceLocation, GLint>();
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLGetProgramResourceLocation, GLint>();
         }
         ANGLE_CAPTURE(GetProgramResourceLocation, isCallValid, context, programPacked,
                       programInterface, name, returnValue);
@@ -18402,7 +18306,8 @@
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::GetProgramResourceLocation, GLint>();
+        returnValue =
+            GetDefaultReturnValue<angle::EntryPoint::GLGetProgramResourceLocation, GLint>();
     }
     return returnValue;
 }
@@ -18413,8 +18318,7 @@
                                                                  const GLchar *name)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetProgramResourceLocationIndexEXT,
-          "glGetProgramResourceLocationIndexEXT",
+    EVENT(context, GLGetProgramResourceLocationIndexEXT,
           "context = %d, program = %u, programInterface = %s, name = 0x%016" PRIxPTR "",
           CID(context), program, GLenumToString(GLenumGroup::ProgramInterface, programInterface),
           (uintptr_t)name);
@@ -18423,7 +18327,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGetProgramResourceLocationIndexEXT(
@@ -18436,7 +18340,8 @@
         else
         {
             returnValue =
-                GetDefaultReturnValue<EntryPoint::GetProgramResourceLocationIndexEXT, GLint>();
+                GetDefaultReturnValue<angle::EntryPoint::GLGetProgramResourceLocationIndexEXT,
+                                      GLint>();
         }
         ANGLE_CAPTURE(GetProgramResourceLocationIndexEXT, isCallValid, context, programPacked,
                       programInterface, name, returnValue);
@@ -18445,7 +18350,7 @@
     {
         GenerateContextLostErrorOnContext(context);
         returnValue =
-            GetDefaultReturnValue<EntryPoint::GetProgramResourceLocationIndexEXT, GLint>();
+            GetDefaultReturnValue<angle::EntryPoint::GLGetProgramResourceLocationIndexEXT, GLint>();
     }
     return returnValue;
 }
@@ -18459,7 +18364,7 @@
                                                     GLchar *name)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetProgramResourceName, "glGetProgramResourceName",
+    EVENT(context, GLGetProgramResourceName,
           "context = %d, program = %u, programInterface = %s, index = %u, bufSize = %d, length = "
           "0x%016" PRIxPTR ", name = 0x%016" PRIxPTR "",
           CID(context), program, GLenumToString(GLenumGroup::ProgramInterface, programInterface),
@@ -18468,7 +18373,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetProgramResourceName(context, programPacked, programInterface,
@@ -18498,7 +18403,7 @@
                                                   GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetProgramResourceiv, "glGetProgramResourceiv",
+    EVENT(context, GLGetProgramResourceiv,
           "context = %d, program = %u, programInterface = %s, index = %u, propCount = %d, props = "
           "0x%016" PRIxPTR ", bufSize = %d, length = 0x%016" PRIxPTR ", params = 0x%016" PRIxPTR "",
           CID(context), program, GLenumToString(GLenumGroup::ProgramInterface, programInterface),
@@ -18507,7 +18412,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -18533,14 +18438,14 @@
                                           GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetProgramiv, "glGetProgramiv",
+    EVENT(context, GLGetProgramiv,
           "context = %d, program = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           program, GLenumToString(GLenumGroup::ProgramPropertyARB, pname), (uintptr_t)params);
 
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetProgramiv(context, programPacked, pname, params));
@@ -18560,14 +18465,14 @@
                                                    GLint64 *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetQueryObjecti64vEXT, "glGetQueryObjecti64vEXT",
+    EVENT(context, GLGetQueryObjecti64vEXT,
           "context = %d, id = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), id,
           GLenumToString(GLenumGroup::QueryObjectParameterName, pname), (uintptr_t)params);
 
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
-        QueryID idPacked                                      = FromGL<QueryID>(id);
+        QueryID idPacked                                      = PackParam<QueryID>(id);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetQueryObjecti64vEXT(context, idPacked, pname, params));
@@ -18587,14 +18492,14 @@
                                                  GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetQueryObjectivEXT, "glGetQueryObjectivEXT",
+    EVENT(context, GLGetQueryObjectivEXT,
           "context = %d, id = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), id,
           GLenumToString(GLenumGroup::QueryObjectParameterName, pname), (uintptr_t)params);
 
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
-        QueryID idPacked                                      = FromGL<QueryID>(id);
+        QueryID idPacked                                      = PackParam<QueryID>(id);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetQueryObjectivEXT(context, idPacked, pname, params));
@@ -18614,14 +18519,14 @@
                                                     GLuint64 *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetQueryObjectui64vEXT, "glGetQueryObjectui64vEXT",
+    EVENT(context, GLGetQueryObjectui64vEXT,
           "context = %d, id = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), id,
           GLenumToString(GLenumGroup::QueryObjectParameterName, pname), (uintptr_t)params);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        QueryID idPacked                                      = FromGL<QueryID>(id);
+        QueryID idPacked                                      = PackParam<QueryID>(id);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetQueryObjectui64vEXT(context, idPacked, pname, params));
@@ -18643,14 +18548,14 @@
                                                GLuint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetQueryObjectuiv, "glGetQueryObjectuiv",
+    EVENT(context, GLGetQueryObjectuiv,
           "context = %d, id = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), id,
           GLenumToString(GLenumGroup::QueryObjectParameterName, pname), (uintptr_t)params);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        QueryID idPacked                                      = FromGL<QueryID>(id);
+        QueryID idPacked                                      = PackParam<QueryID>(id);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetQueryObjectuiv(context, idPacked, pname, params));
@@ -18672,14 +18577,14 @@
                                                   GLuint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetQueryObjectuivEXT, "glGetQueryObjectuivEXT",
+    EVENT(context, GLGetQueryObjectuivEXT,
           "context = %d, id = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), id,
           GLenumToString(GLenumGroup::QueryObjectParameterName, pname), (uintptr_t)params);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        QueryID idPacked                                      = FromGL<QueryID>(id);
+        QueryID idPacked                                      = PackParam<QueryID>(id);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetQueryObjectuivEXT(context, idPacked, pname, params));
@@ -18701,7 +18606,7 @@
                                         GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetQueryiv, "glGetQueryiv",
+    EVENT(context, GLGetQueryiv,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::QueryTarget, target),
           GLenumToString(GLenumGroup::QueryParameterName, pname), (uintptr_t)params);
@@ -18709,7 +18614,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        QueryType targetPacked                                = FromGL<QueryType>(target);
+        QueryType targetPacked                                = PackParam<QueryType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGetQueryiv(context, targetPacked, pname, params));
@@ -18731,7 +18636,7 @@
                                            GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetQueryivEXT, "glGetQueryivEXT",
+    EVENT(context, GLGetQueryivEXT,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::QueryTarget, target),
           GLenumToString(GLenumGroup::QueryParameterName, pname), (uintptr_t)params);
@@ -18739,7 +18644,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        QueryType targetPacked                                = FromGL<QueryType>(target);
+        QueryType targetPacked                                = PackParam<QueryType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetQueryivEXT(context, targetPacked, pname, params));
@@ -18761,7 +18666,7 @@
                                                         GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetRenderbufferParameteriv, "glGetRenderbufferParameteriv",
+    EVENT(context, GLGetRenderbufferParameteriv,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::RenderbufferTarget, target),
           GLenumToString(GLenumGroup::RenderbufferParameterName, pname), (uintptr_t)params);
@@ -18790,7 +18695,7 @@
                                                            GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetRenderbufferParameterivOES, "glGetRenderbufferParameterivOES",
+    EVENT(context, GLGetRenderbufferParameterivOES,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::RenderbufferTarget, target),
           GLenumToString(GLenumGroup::RenderbufferParameterName, pname), (uintptr_t)params);
@@ -18819,14 +18724,14 @@
                                                     GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetSamplerParameterIiv, "glGetSamplerParameterIiv",
+    EVENT(context, GLGetSamplerParameterIiv,
           "context = %d, sampler = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)params);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetSamplerParameterIiv(context, samplerPacked, pname, params));
@@ -18848,14 +18753,14 @@
                                                        GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetSamplerParameterIivOES, "glGetSamplerParameterIivOES",
+    EVENT(context, GLGetSamplerParameterIivOES,
           "context = %d, sampler = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)params);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -18879,14 +18784,14 @@
                                                      GLuint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetSamplerParameterIuiv, "glGetSamplerParameterIuiv",
+    EVENT(context, GLGetSamplerParameterIuiv,
           "context = %d, sampler = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)params);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetSamplerParameterIuiv(context, samplerPacked, pname, params));
@@ -18908,14 +18813,14 @@
                                                         GLuint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetSamplerParameterIuivOES, "glGetSamplerParameterIuivOES",
+    EVENT(context, GLGetSamplerParameterIuivOES,
           "context = %d, sampler = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)params);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -18939,14 +18844,14 @@
                                                    GLfloat *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetSamplerParameterfv, "glGetSamplerParameterfv",
+    EVENT(context, GLGetSamplerParameterfv,
           "context = %d, sampler = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)params);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetSamplerParameterfv(context, samplerPacked, pname, params));
@@ -18968,14 +18873,14 @@
                                                    GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetSamplerParameteriv, "glGetSamplerParameteriv",
+    EVENT(context, GLGetSamplerParameteriv,
           "context = %d, sampler = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)params);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetSamplerParameteriv(context, samplerPacked, pname, params));
@@ -18997,14 +18902,14 @@
                                                            GLuint64 *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetSemaphoreParameterui64vEXT, "glGetSemaphoreParameterui64vEXT",
+    EVENT(context, GLGetSemaphoreParameterui64vEXT,
           "context = %d, semaphore = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           semaphore, GLenumToString(GLenumGroup::SemaphoreParameterName, pname), (uintptr_t)params);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        SemaphoreID semaphorePacked                           = FromGL<SemaphoreID>(semaphore);
+        SemaphoreID semaphorePacked                           = PackParam<SemaphoreID>(semaphore);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -19029,7 +18934,7 @@
                                               GLchar *infoLog)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetShaderInfoLog, "glGetShaderInfoLog",
+    EVENT(context, GLGetShaderInfoLog,
           "context = %d, shader = %u, bufSize = %d, length = 0x%016" PRIxPTR
           ", infoLog = 0x%016" PRIxPTR "",
           CID(context), shader, bufSize, (uintptr_t)length, (uintptr_t)infoLog);
@@ -19037,7 +18942,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID shaderPacked                          = FromGL<ShaderProgramID>(shader);
+        ShaderProgramID shaderPacked                          = PackParam<ShaderProgramID>(shader);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -19062,7 +18967,7 @@
                                                       GLint *precision)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetShaderPrecisionFormat, "glGetShaderPrecisionFormat",
+    EVENT(context, GLGetShaderPrecisionFormat,
           "context = %d, shadertype = %s, precisiontype = %s, range = 0x%016" PRIxPTR
           ", precision = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::ShaderType, shadertype),
@@ -19096,7 +19001,7 @@
                                              GLchar *source)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetShaderSource, "glGetShaderSource",
+    EVENT(context, GLGetShaderSource,
           "context = %d, shader = %u, bufSize = %d, length = 0x%016" PRIxPTR
           ", source = 0x%016" PRIxPTR "",
           CID(context), shader, bufSize, (uintptr_t)length, (uintptr_t)source);
@@ -19104,7 +19009,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID shaderPacked                          = FromGL<ShaderProgramID>(shader);
+        ShaderProgramID shaderPacked                          = PackParam<ShaderProgramID>(shader);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -19127,14 +19032,14 @@
                                          GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetShaderiv, "glGetShaderiv",
+    EVENT(context, GLGetShaderiv,
           "context = %d, shader = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), shader,
           GLenumToString(GLenumGroup::ShaderParameterName, pname), (uintptr_t)params);
 
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID shaderPacked                          = FromGL<ShaderProgramID>(shader);
+        ShaderProgramID shaderPacked                          = PackParam<ShaderProgramID>(shader);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetShaderiv(context, shaderPacked, pname, params));
@@ -19151,8 +19056,8 @@
 const GLubyte *GL_APIENTRY GetStringContextANGLE(GLeglContext ctx, GLenum name)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetString, "glGetString", "context = %d, name = %s",
-          CID(context), GLenumToString(GLenumGroup::StringName, name));
+    EVENT(context, GLGetString, "context = %d, name = %s", CID(context),
+          GLenumToString(GLenumGroup::StringName, name));
 
     const GLubyte *returnValue;
     if (context && !context->isContextLost())
@@ -19166,14 +19071,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetString, const GLubyte *>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetString, const GLubyte *>();
         }
         ANGLE_CAPTURE(GetString, isCallValid, context, name, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::GetString, const GLubyte *>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetString, const GLubyte *>();
     }
     return returnValue;
 }
@@ -19181,8 +19086,7 @@
 const GLubyte *GL_APIENTRY GetStringiContextANGLE(GLeglContext ctx, GLenum name, GLuint index)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetStringi, "glGetStringi",
-          "context = %d, name = %s, index = %u", CID(context),
+    EVENT(context, GLGetStringi, "context = %d, name = %s, index = %u", CID(context),
           GLenumToString(GLenumGroup::StringName, name), index);
 
     const GLubyte *returnValue;
@@ -19197,14 +19101,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetStringi, const GLubyte *>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetStringi, const GLubyte *>();
         }
         ANGLE_CAPTURE(GetStringi, isCallValid, context, name, index, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::GetStringi, const GLubyte *>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetStringi, const GLubyte *>();
     }
     return returnValue;
 }
@@ -19217,7 +19121,7 @@
                                        GLint *values)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetSynciv, "glGetSynciv",
+    EVENT(context, GLGetSynciv,
           "context = %d, sync = 0x%016" PRIxPTR
           ", pname = %s, bufSize = %d, length = 0x%016" PRIxPTR ", values = 0x%016" PRIxPTR "",
           CID(context), (uintptr_t)sync, GLenumToString(GLenumGroup::SyncParameterName, pname),
@@ -19245,7 +19149,7 @@
                                          GLfloat *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetTexEnvfv, "glGetTexEnvfv",
+    EVENT(context, GLGetTexEnvfv,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureEnvTarget, target),
           GLenumToString(GLenumGroup::TextureEnvParameter, pname), (uintptr_t)params);
@@ -19253,8 +19157,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureEnvTarget targetPacked                         = FromGL<TextureEnvTarget>(target);
-        TextureEnvParameter pnamePacked                       = FromGL<TextureEnvParameter>(pname);
+        TextureEnvTarget targetPacked   = PackParam<TextureEnvTarget>(target);
+        TextureEnvParameter pnamePacked = PackParam<TextureEnvParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetTexEnvfv(context, targetPacked, pnamePacked, params));
@@ -19276,7 +19180,7 @@
                                          GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetTexEnviv, "glGetTexEnviv",
+    EVENT(context, GLGetTexEnviv,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureEnvTarget, target),
           GLenumToString(GLenumGroup::TextureEnvParameter, pname), (uintptr_t)params);
@@ -19284,8 +19188,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureEnvTarget targetPacked                         = FromGL<TextureEnvTarget>(target);
-        TextureEnvParameter pnamePacked                       = FromGL<TextureEnvParameter>(pname);
+        TextureEnvTarget targetPacked   = PackParam<TextureEnvTarget>(target);
+        TextureEnvParameter pnamePacked = PackParam<TextureEnvParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetTexEnviv(context, targetPacked, pnamePacked, params));
@@ -19307,7 +19211,7 @@
                                          GLfixed *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetTexEnvxv, "glGetTexEnvxv",
+    EVENT(context, GLGetTexEnvxv,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureEnvTarget, target),
           GLenumToString(GLenumGroup::TextureEnvParameter, pname), (uintptr_t)params);
@@ -19315,8 +19219,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureEnvTarget targetPacked                         = FromGL<TextureEnvTarget>(target);
-        TextureEnvParameter pnamePacked                       = FromGL<TextureEnvParameter>(pname);
+        TextureEnvTarget targetPacked   = PackParam<TextureEnvTarget>(target);
+        TextureEnvParameter pnamePacked = PackParam<TextureEnvParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetTexEnvxv(context, targetPacked, pnamePacked, params));
@@ -19338,7 +19242,7 @@
                                             GLfloat *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetTexGenfvOES, "glGetTexGenfvOES",
+    EVENT(context, GLGetTexGenfvOES,
           "context = %d, coord = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureCoordName, coord),
           GLenumToString(GLenumGroup::TextureGenParameter, pname), (uintptr_t)params);
@@ -19367,7 +19271,7 @@
                                             GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetTexGenivOES, "glGetTexGenivOES",
+    EVENT(context, GLGetTexGenivOES,
           "context = %d, coord = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureCoordName, coord),
           GLenumToString(GLenumGroup::TextureGenParameter, pname), (uintptr_t)params);
@@ -19396,7 +19300,7 @@
                                             GLfixed *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetTexGenxvOES, "glGetTexGenxvOES",
+    EVENT(context, GLGetTexGenxvOES,
           "context = %d, coord = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureCoordName, coord),
           GLenumToString(GLenumGroup::TextureGenParameter, pname), (uintptr_t)params);
@@ -19426,7 +19330,7 @@
                                                     GLfloat *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetTexLevelParameterfv, "glGetTexLevelParameterfv",
+    EVENT(context, GLGetTexLevelParameterfv,
           "context = %d, target = %s, level = %d, pname = %s, params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level,
           GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
@@ -19434,7 +19338,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -19459,7 +19363,7 @@
                                                     GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetTexLevelParameteriv, "glGetTexLevelParameteriv",
+    EVENT(context, GLGetTexLevelParameteriv,
           "context = %d, target = %s, level = %d, pname = %s, params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level,
           GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
@@ -19467,7 +19371,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -19491,7 +19395,7 @@
                                                 GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetTexParameterIiv, "glGetTexParameterIiv",
+    EVENT(context, GLGetTexParameterIiv,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
@@ -19499,7 +19403,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetTexParameterIiv(context, targetPacked, pname, params));
@@ -19521,7 +19425,7 @@
                                                    GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetTexParameterIivOES, "glGetTexParameterIivOES",
+    EVENT(context, GLGetTexParameterIivOES,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
@@ -19529,7 +19433,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetTexParameterIivOES(context, targetPacked, pname, params));
@@ -19551,7 +19455,7 @@
                                                  GLuint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetTexParameterIuiv, "glGetTexParameterIuiv",
+    EVENT(context, GLGetTexParameterIuiv,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
@@ -19559,7 +19463,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetTexParameterIuiv(context, targetPacked, pname, params));
@@ -19581,7 +19485,7 @@
                                                     GLuint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetTexParameterIuivOES, "glGetTexParameterIuivOES",
+    EVENT(context, GLGetTexParameterIuivOES,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
@@ -19589,7 +19493,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetTexParameterIuivOES(context, targetPacked, pname, params));
@@ -19611,7 +19515,7 @@
                                                GLfloat *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetTexParameterfv, "glGetTexParameterfv",
+    EVENT(context, GLGetTexParameterfv,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
@@ -19619,7 +19523,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetTexParameterfv(context, targetPacked, pname, params));
@@ -19641,7 +19545,7 @@
                                                GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetTexParameteriv, "glGetTexParameteriv",
+    EVENT(context, GLGetTexParameteriv,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
@@ -19649,7 +19553,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetTexParameteriv(context, targetPacked, pname, params));
@@ -19671,7 +19575,7 @@
                                                GLfixed *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetTexParameterxv, "glGetTexParameterxv",
+    EVENT(context, GLGetTexParameterxv,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
@@ -19679,7 +19583,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetTexParameterxv(context, targetPacked, pname, params));
@@ -19705,7 +19609,7 @@
                                                          GLchar *name)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetTransformFeedbackVarying, "glGetTransformFeedbackVarying",
+    EVENT(context, GLGetTransformFeedbackVarying,
           "context = %d, program = %u, index = %u, bufSize = %d, length = 0x%016" PRIxPTR
           ", size = 0x%016" PRIxPTR ", type = 0x%016" PRIxPTR ", name = 0x%016" PRIxPTR "",
           CID(context), program, index, bufSize, (uintptr_t)length, (uintptr_t)size,
@@ -19714,7 +19618,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetTransformFeedbackVarying(context, programPacked, index,
@@ -19740,8 +19644,7 @@
                                                             GLchar *source)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetTranslatedShaderSourceANGLE,
-          "glGetTranslatedShaderSourceANGLE",
+    EVENT(context, GLGetTranslatedShaderSourceANGLE,
           "context = %d, shader = %u, bufsize = %d, length = 0x%016" PRIxPTR
           ", source = 0x%016" PRIxPTR "",
           CID(context), shader, bufsize, (uintptr_t)length, (uintptr_t)source);
@@ -19749,7 +19652,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID shaderPacked                          = FromGL<ShaderProgramID>(shader);
+        ShaderProgramID shaderPacked                          = PackParam<ShaderProgramID>(shader);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGetTranslatedShaderSourceANGLE(
@@ -19772,7 +19675,7 @@
                                                     const GLchar *uniformBlockName)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetUniformBlockIndex, "glGetUniformBlockIndex",
+    EVENT(context, GLGetUniformBlockIndex,
           "context = %d, program = %u, uniformBlockName = 0x%016" PRIxPTR "", CID(context), program,
           (uintptr_t)uniformBlockName);
 
@@ -19780,7 +19683,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetUniformBlockIndex(context, programPacked, uniformBlockName));
@@ -19790,7 +19693,8 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetUniformBlockIndex, GLuint>();
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLGetUniformBlockIndex, GLuint>();
         }
         ANGLE_CAPTURE(GetUniformBlockIndex, isCallValid, context, programPacked, uniformBlockName,
                       returnValue);
@@ -19798,7 +19702,7 @@
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::GetUniformBlockIndex, GLuint>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetUniformBlockIndex, GLuint>();
     }
     return returnValue;
 }
@@ -19810,7 +19714,7 @@
                                                GLuint *uniformIndices)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetUniformIndices, "glGetUniformIndices",
+    EVENT(context, GLGetUniformIndices,
           "context = %d, program = %u, uniformCount = %d, uniformNames = 0x%016" PRIxPTR
           ", uniformIndices = 0x%016" PRIxPTR "",
           CID(context), program, uniformCount, (uintptr_t)uniformNames, (uintptr_t)uniformIndices);
@@ -19818,7 +19722,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetUniformIndices(context, programPacked, uniformCount,
@@ -19841,15 +19745,14 @@
                                                  const GLchar *name)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetUniformLocation, "glGetUniformLocation",
-          "context = %d, program = %u, name = 0x%016" PRIxPTR "", CID(context), program,
-          (uintptr_t)name);
+    EVENT(context, GLGetUniformLocation, "context = %d, program = %u, name = 0x%016" PRIxPTR "",
+          CID(context), program, (uintptr_t)name);
 
     GLint returnValue;
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGetUniformLocation(context, programPacked, name));
@@ -19859,14 +19762,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::GetUniformLocation, GLint>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetUniformLocation, GLint>();
         }
         ANGLE_CAPTURE(GetUniformLocation, isCallValid, context, programPacked, name, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::GetUniformLocation, GLint>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetUniformLocation, GLint>();
     }
     return returnValue;
 }
@@ -19877,15 +19780,15 @@
                                           GLfloat *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetUniformfv, "glGetUniformfv",
+    EVENT(context, GLGetUniformfv,
           "context = %d, program = %u, location = %d, params = 0x%016" PRIxPTR "", CID(context),
           program, location, (uintptr_t)params);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetUniformfv(context, programPacked, locationPacked, params));
@@ -19907,15 +19810,15 @@
                                           GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetUniformiv, "glGetUniformiv",
+    EVENT(context, GLGetUniformiv,
           "context = %d, program = %u, location = %d, params = 0x%016" PRIxPTR "", CID(context),
           program, location, (uintptr_t)params);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetUniformiv(context, programPacked, locationPacked, params));
@@ -19937,15 +19840,15 @@
                                            GLuint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetUniformuiv, "glGetUniformuiv",
+    EVENT(context, GLGetUniformuiv,
           "context = %d, program = %u, location = %d, params = 0x%016" PRIxPTR "", CID(context),
           program, location, (uintptr_t)params);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetUniformuiv(context, programPacked, locationPacked, params));
@@ -19964,9 +19867,8 @@
 void GL_APIENTRY GetUnsignedBytevEXTContextANGLE(GLeglContext ctx, GLenum pname, GLubyte *data)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetUnsignedBytevEXT, "glGetUnsignedBytevEXT",
-          "context = %d, pname = %s, data = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::GetPName, pname), (uintptr_t)data);
+    EVENT(context, GLGetUnsignedBytevEXT, "context = %d, pname = %s, data = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::GetPName, pname), (uintptr_t)data);
 
     if (context && !context->isContextLost())
     {
@@ -19992,7 +19894,7 @@
                                                    GLubyte *data)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetUnsignedBytei_vEXT, "glGetUnsignedBytei_vEXT",
+    EVENT(context, GLGetUnsignedBytei_vEXT,
           "context = %d, target = %s, index = %u, data = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::DefaultGroup, target), index, (uintptr_t)data);
 
@@ -20020,7 +19922,7 @@
                                                 GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetVertexAttribIiv, "glGetVertexAttribIiv",
+    EVENT(context, GLGetVertexAttribIiv,
           "context = %d, index = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), index,
           GLenumToString(GLenumGroup::VertexAttribEnum, pname), (uintptr_t)params);
 
@@ -20048,7 +19950,7 @@
                                                  GLuint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetVertexAttribIuiv, "glGetVertexAttribIuiv",
+    EVENT(context, GLGetVertexAttribIuiv,
           "context = %d, index = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), index,
           GLenumToString(GLenumGroup::VertexAttribEnum, pname), (uintptr_t)params);
 
@@ -20076,7 +19978,7 @@
                                                      void **pointer)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetVertexAttribPointerv, "glGetVertexAttribPointerv",
+    EVENT(context, GLGetVertexAttribPointerv,
           "context = %d, index = %u, pname = %s, pointer = 0x%016" PRIxPTR "", CID(context), index,
           GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)pointer);
 
@@ -20104,7 +20006,7 @@
                                                GLfloat *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetVertexAttribfv, "glGetVertexAttribfv",
+    EVENT(context, GLGetVertexAttribfv,
           "context = %d, index = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), index,
           GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
 
@@ -20132,7 +20034,7 @@
                                                GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetVertexAttribiv, "glGetVertexAttribiv",
+    EVENT(context, GLGetVertexAttribiv,
           "context = %d, index = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), index,
           GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
 
@@ -20161,15 +20063,15 @@
                                            GLfloat *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetnUniformfv, "glGetnUniformfv",
+    EVENT(context, GLGetnUniformfv,
           "context = %d, program = %u, location = %d, bufSize = %d, params = 0x%016" PRIxPTR "",
           CID(context), program, location, bufSize, (uintptr_t)params);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -20194,15 +20096,15 @@
                                               GLfloat *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetnUniformfvEXT, "glGetnUniformfvEXT",
+    EVENT(context, GLGetnUniformfvEXT,
           "context = %d, program = %u, location = %d, bufSize = %d, params = 0x%016" PRIxPTR "",
           CID(context), program, location, bufSize, (uintptr_t)params);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -20227,15 +20129,15 @@
                                            GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetnUniformiv, "glGetnUniformiv",
+    EVENT(context, GLGetnUniformiv,
           "context = %d, program = %u, location = %d, bufSize = %d, params = 0x%016" PRIxPTR "",
           CID(context), program, location, bufSize, (uintptr_t)params);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -20260,15 +20162,15 @@
                                               GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetnUniformivEXT, "glGetnUniformivEXT",
+    EVENT(context, GLGetnUniformivEXT,
           "context = %d, program = %u, location = %d, bufSize = %d, params = 0x%016" PRIxPTR "",
           CID(context), program, location, bufSize, (uintptr_t)params);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -20293,15 +20195,15 @@
                                             GLuint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetnUniformuiv, "glGetnUniformuiv",
+    EVENT(context, GLGetnUniformuiv,
           "context = %d, program = %u, location = %d, bufSize = %d, params = 0x%016" PRIxPTR "",
           CID(context), program, location, bufSize, (uintptr_t)params);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -20322,8 +20224,8 @@
 void GL_APIENTRY HintContextANGLE(GLeglContext ctx, GLenum target, GLenum mode)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Hint, "glHint", "context = %d, target = %s, mode = %s",
-          CID(context), GLenumToString(GLenumGroup::HintTarget, target),
+    EVENT(context, GLHint, "context = %d, target = %s, mode = %s", CID(context),
+          GLenumToString(GLenumGroup::HintTarget, target),
           GLenumToString(GLenumGroup::HintMode, mode));
 
     if (context && !context->isContextLost())
@@ -20350,7 +20252,7 @@
                                                GLint fd)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ImportMemoryFdEXT, "glImportMemoryFdEXT",
+    EVENT(context, GLImportMemoryFdEXT,
           "context = %d, memory = %u, size = %llu, handleType = %s, fd = %d", CID(context), memory,
           static_cast<unsigned long long>(size),
           GLenumToString(GLenumGroup::ExternalHandleType, handleType), fd);
@@ -20358,8 +20260,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        MemoryObjectID memoryPacked                           = FromGL<MemoryObjectID>(memory);
-        HandleType handleTypePacked                           = FromGL<HandleType>(handleType);
+        MemoryObjectID memoryPacked                           = PackParam<MemoryObjectID>(memory);
+        HandleType handleTypePacked                           = PackParam<HandleType>(handleType);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -20383,15 +20285,14 @@
                                                   GLint fd)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ImportSemaphoreFdEXT, "glImportSemaphoreFdEXT",
-          "context = %d, semaphore = %u, handleType = %s, fd = %d", CID(context), semaphore,
-          GLenumToString(GLenumGroup::ExternalHandleType, handleType), fd);
+    EVENT(context, GLImportSemaphoreFdEXT, "context = %d, semaphore = %u, handleType = %s, fd = %d",
+          CID(context), semaphore, GLenumToString(GLenumGroup::ExternalHandleType, handleType), fd);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        SemaphoreID semaphorePacked                           = FromGL<SemaphoreID>(semaphore);
-        HandleType handleTypePacked                           = FromGL<HandleType>(handleType);
+        SemaphoreID semaphorePacked                           = PackParam<SemaphoreID>(semaphore);
+        HandleType handleTypePacked                           = PackParam<HandleType>(handleType);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -20416,8 +20317,8 @@
     Context *context = static_cast<gl::Context *>(ctx);
     // Don't run the EVENT() macro on the EXT_debug_marker entry points.
     // It can interfere with the debug events being set by the caller.
-    // EVENT(context, gl::EntryPoint::InsertEventMarkerEXT, "glInsertEventMarkerEXT", "context = %d,
-    // length = %d, marker = 0x%016" PRIxPTR "", CID(context), length, (uintptr_t)marker);
+    // EVENT(context, GLInsertEventMarkerEXT, "context = %d, length = %d, marker = 0x%016" PRIxPTR
+    // "", CID(context), length, (uintptr_t)marker);
 
     if (context && !context->isContextLost())
     {
@@ -20443,7 +20344,7 @@
                                                    const GLenum *attachments)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::InvalidateFramebuffer, "glInvalidateFramebuffer",
+    EVENT(context, GLInvalidateFramebuffer,
           "context = %d, target = %s, numAttachments = %d, attachments = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::FramebufferTarget, target), numAttachments,
           (uintptr_t)attachments);
@@ -20478,7 +20379,7 @@
                                                       GLsizei height)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::InvalidateSubFramebuffer, "glInvalidateSubFramebuffer",
+    EVENT(context, GLInvalidateSubFramebuffer,
           "context = %d, target = %s, numAttachments = %d, attachments = 0x%016" PRIxPTR
           ", x = %d, y = %d, width = %d, height = %d",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target), numAttachments,
@@ -20508,14 +20409,13 @@
 GLboolean GL_APIENTRY IsBufferContextANGLE(GLeglContext ctx, GLuint buffer)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::IsBuffer, "glIsBuffer", "context = %d, buffer = %u",
-          CID(context), buffer);
+    EVENT(context, GLIsBuffer, "context = %d, buffer = %u", CID(context), buffer);
 
     GLboolean returnValue;
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateIsBuffer(context, bufferPacked));
         if (isCallValid)
@@ -20524,14 +20424,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsBuffer, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsBuffer, GLboolean>();
         }
         ANGLE_CAPTURE(IsBuffer, isCallValid, context, bufferPacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::IsBuffer, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsBuffer, GLboolean>();
     }
     return returnValue;
 }
@@ -20539,7 +20439,7 @@
 GLboolean GL_APIENTRY IsEnabledContextANGLE(GLeglContext ctx, GLenum cap)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::IsEnabled, "glIsEnabled", "context = %d, cap = %s", CID(context),
+    EVENT(context, GLIsEnabled, "context = %d, cap = %s", CID(context),
           GLenumToString(GLenumGroup::EnableCap, cap));
 
     GLboolean returnValue;
@@ -20554,14 +20454,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsEnabled, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsEnabled, GLboolean>();
         }
         ANGLE_CAPTURE(IsEnabled, isCallValid, context, cap, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::IsEnabled, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsEnabled, GLboolean>();
     }
     return returnValue;
 }
@@ -20569,8 +20469,7 @@
 GLboolean GL_APIENTRY IsEnablediContextANGLE(GLeglContext ctx, GLenum target, GLuint index)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::IsEnabledi, "glIsEnabledi",
-          "context = %d, target = %s, index = %u", CID(context),
+    EVENT(context, GLIsEnabledi, "context = %d, target = %s, index = %u", CID(context),
           GLenumToString(GLenumGroup::EnableCap, target), index);
 
     GLboolean returnValue;
@@ -20586,14 +20485,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsEnabledi, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsEnabledi, GLboolean>();
         }
         ANGLE_CAPTURE(IsEnabledi, isCallValid, context, target, index, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::IsEnabledi, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsEnabledi, GLboolean>();
     }
     return returnValue;
 }
@@ -20601,8 +20500,7 @@
 GLboolean GL_APIENTRY IsEnablediEXTContextANGLE(GLeglContext ctx, GLenum target, GLuint index)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::IsEnablediEXT, "glIsEnablediEXT",
-          "context = %d, target = %s, index = %u", CID(context),
+    EVENT(context, GLIsEnablediEXT, "context = %d, target = %s, index = %u", CID(context),
           GLenumToString(GLenumGroup::EnableCap, target), index);
 
     GLboolean returnValue;
@@ -20618,14 +20516,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsEnablediEXT, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsEnablediEXT, GLboolean>();
         }
         ANGLE_CAPTURE(IsEnablediEXT, isCallValid, context, target, index, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::IsEnablediEXT, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsEnablediEXT, GLboolean>();
     }
     return returnValue;
 }
@@ -20633,8 +20531,7 @@
 GLboolean GL_APIENTRY IsEnablediOESContextANGLE(GLeglContext ctx, GLenum target, GLuint index)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::IsEnablediOES, "glIsEnablediOES",
-          "context = %d, target = %s, index = %u", CID(context),
+    EVENT(context, GLIsEnablediOES, "context = %d, target = %s, index = %u", CID(context),
           GLenumToString(GLenumGroup::EnableCap, target), index);
 
     GLboolean returnValue;
@@ -20650,14 +20547,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsEnablediOES, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsEnablediOES, GLboolean>();
         }
         ANGLE_CAPTURE(IsEnablediOES, isCallValid, context, target, index, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::IsEnablediOES, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsEnablediOES, GLboolean>();
     }
     return returnValue;
 }
@@ -20665,14 +20562,13 @@
 GLboolean GL_APIENTRY IsFenceNVContextANGLE(GLeglContext ctx, GLuint fence)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::IsFenceNV, "glIsFenceNV", "context = %d, fence = %u",
-          CID(context), fence);
+    EVENT(context, GLIsFenceNV, "context = %d, fence = %u", CID(context), fence);
 
     GLboolean returnValue;
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        FenceNVID fencePacked                                 = FromGL<FenceNVID>(fence);
+        FenceNVID fencePacked                                 = PackParam<FenceNVID>(fence);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateIsFenceNV(context, fencePacked));
         if (isCallValid)
@@ -20681,14 +20577,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsFenceNV, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsFenceNV, GLboolean>();
         }
         ANGLE_CAPTURE(IsFenceNV, isCallValid, context, fencePacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::IsFenceNV, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsFenceNV, GLboolean>();
     }
     return returnValue;
 }
@@ -20696,14 +20592,13 @@
 GLboolean GL_APIENTRY IsFramebufferContextANGLE(GLeglContext ctx, GLuint framebuffer)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::IsFramebuffer, "glIsFramebuffer",
-          "context = %d, framebuffer = %u", CID(context), framebuffer);
+    EVENT(context, GLIsFramebuffer, "context = %d, framebuffer = %u", CID(context), framebuffer);
 
     GLboolean returnValue;
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        FramebufferID framebufferPacked                       = FromGL<FramebufferID>(framebuffer);
+        FramebufferID framebufferPacked = PackParam<FramebufferID>(framebuffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateIsFramebuffer(context, framebufferPacked));
@@ -20713,14 +20608,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsFramebuffer, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsFramebuffer, GLboolean>();
         }
         ANGLE_CAPTURE(IsFramebuffer, isCallValid, context, framebufferPacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::IsFramebuffer, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsFramebuffer, GLboolean>();
     }
     return returnValue;
 }
@@ -20728,14 +20623,13 @@
 GLboolean GL_APIENTRY IsFramebufferOESContextANGLE(GLeglContext ctx, GLuint framebuffer)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::IsFramebufferOES, "glIsFramebufferOES",
-          "context = %d, framebuffer = %u", CID(context), framebuffer);
+    EVENT(context, GLIsFramebufferOES, "context = %d, framebuffer = %u", CID(context), framebuffer);
 
     GLboolean returnValue;
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        FramebufferID framebufferPacked                       = FromGL<FramebufferID>(framebuffer);
+        FramebufferID framebufferPacked = PackParam<FramebufferID>(framebuffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateIsFramebufferOES(context, framebufferPacked));
@@ -20745,14 +20639,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsFramebufferOES, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsFramebufferOES, GLboolean>();
         }
         ANGLE_CAPTURE(IsFramebufferOES, isCallValid, context, framebufferPacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::IsFramebufferOES, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsFramebufferOES, GLboolean>();
     }
     return returnValue;
 }
@@ -20760,14 +20654,14 @@
 GLboolean GL_APIENTRY IsMemoryObjectEXTContextANGLE(GLeglContext ctx, GLuint memoryObject)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::IsMemoryObjectEXT, "glIsMemoryObjectEXT",
-          "context = %d, memoryObject = %u", CID(context), memoryObject);
+    EVENT(context, GLIsMemoryObjectEXT, "context = %d, memoryObject = %u", CID(context),
+          memoryObject);
 
     GLboolean returnValue;
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        MemoryObjectID memoryObjectPacked = FromGL<MemoryObjectID>(memoryObject);
+        MemoryObjectID memoryObjectPacked = PackParam<MemoryObjectID>(memoryObject);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateIsMemoryObjectEXT(context, memoryObjectPacked));
@@ -20777,14 +20671,15 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsMemoryObjectEXT, GLboolean>();
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLIsMemoryObjectEXT, GLboolean>();
         }
         ANGLE_CAPTURE(IsMemoryObjectEXT, isCallValid, context, memoryObjectPacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::IsMemoryObjectEXT, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsMemoryObjectEXT, GLboolean>();
     }
     return returnValue;
 }
@@ -20792,14 +20687,13 @@
 GLboolean GL_APIENTRY IsProgramContextANGLE(GLeglContext ctx, GLuint program)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::IsProgram, "glIsProgram", "context = %d, program = %u",
-          CID(context), program);
+    EVENT(context, GLIsProgram, "context = %d, program = %u", CID(context), program);
 
     GLboolean returnValue;
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateIsProgram(context, programPacked));
         if (isCallValid)
@@ -20808,14 +20702,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsProgram, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsProgram, GLboolean>();
         }
         ANGLE_CAPTURE(IsProgram, isCallValid, context, programPacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::IsProgram, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsProgram, GLboolean>();
     }
     return returnValue;
 }
@@ -20823,14 +20717,13 @@
 GLboolean GL_APIENTRY IsProgramPipelineContextANGLE(GLeglContext ctx, GLuint pipeline)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::IsProgramPipeline, "glIsProgramPipeline",
-          "context = %d, pipeline = %u", CID(context), pipeline);
+    EVENT(context, GLIsProgramPipeline, "context = %d, pipeline = %u", CID(context), pipeline);
 
     GLboolean returnValue;
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ProgramPipelineID pipelinePacked                      = FromGL<ProgramPipelineID>(pipeline);
+        ProgramPipelineID pipelinePacked = PackParam<ProgramPipelineID>(pipeline);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateIsProgramPipeline(context, pipelinePacked));
@@ -20840,14 +20733,15 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsProgramPipeline, GLboolean>();
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLIsProgramPipeline, GLboolean>();
         }
         ANGLE_CAPTURE(IsProgramPipeline, isCallValid, context, pipelinePacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::IsProgramPipeline, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsProgramPipeline, GLboolean>();
     }
     return returnValue;
 }
@@ -20855,14 +20749,13 @@
 GLboolean GL_APIENTRY IsProgramPipelineEXTContextANGLE(GLeglContext ctx, GLuint pipeline)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::IsProgramPipelineEXT, "glIsProgramPipelineEXT",
-          "context = %d, pipeline = %u", CID(context), pipeline);
+    EVENT(context, GLIsProgramPipelineEXT, "context = %d, pipeline = %u", CID(context), pipeline);
 
     GLboolean returnValue;
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ProgramPipelineID pipelinePacked                      = FromGL<ProgramPipelineID>(pipeline);
+        ProgramPipelineID pipelinePacked = PackParam<ProgramPipelineID>(pipeline);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateIsProgramPipelineEXT(context, pipelinePacked));
@@ -20872,14 +20765,15 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsProgramPipelineEXT, GLboolean>();
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLIsProgramPipelineEXT, GLboolean>();
         }
         ANGLE_CAPTURE(IsProgramPipelineEXT, isCallValid, context, pipelinePacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::IsProgramPipelineEXT, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsProgramPipelineEXT, GLboolean>();
     }
     return returnValue;
 }
@@ -20887,13 +20781,13 @@
 GLboolean GL_APIENTRY IsQueryContextANGLE(GLeglContext ctx, GLuint id)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::IsQuery, "glIsQuery", "context = %d, id = %u", CID(context), id);
+    EVENT(context, GLIsQuery, "context = %d, id = %u", CID(context), id);
 
     GLboolean returnValue;
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        QueryID idPacked                                      = FromGL<QueryID>(id);
+        QueryID idPacked                                      = PackParam<QueryID>(id);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateIsQuery(context, idPacked));
         if (isCallValid)
@@ -20902,14 +20796,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsQuery, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsQuery, GLboolean>();
         }
         ANGLE_CAPTURE(IsQuery, isCallValid, context, idPacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::IsQuery, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsQuery, GLboolean>();
     }
     return returnValue;
 }
@@ -20917,14 +20811,13 @@
 GLboolean GL_APIENTRY IsQueryEXTContextANGLE(GLeglContext ctx, GLuint id)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::IsQueryEXT, "glIsQueryEXT", "context = %d, id = %u",
-          CID(context), id);
+    EVENT(context, GLIsQueryEXT, "context = %d, id = %u", CID(context), id);
 
     GLboolean returnValue;
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        QueryID idPacked                                      = FromGL<QueryID>(id);
+        QueryID idPacked                                      = PackParam<QueryID>(id);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateIsQueryEXT(context, idPacked));
         if (isCallValid)
@@ -20933,14 +20826,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsQueryEXT, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsQueryEXT, GLboolean>();
         }
         ANGLE_CAPTURE(IsQueryEXT, isCallValid, context, idPacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::IsQueryEXT, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsQueryEXT, GLboolean>();
     }
     return returnValue;
 }
@@ -20948,14 +20841,13 @@
 GLboolean GL_APIENTRY IsRenderbufferContextANGLE(GLeglContext ctx, GLuint renderbuffer)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::IsRenderbuffer, "glIsRenderbuffer",
-          "context = %d, renderbuffer = %u", CID(context), renderbuffer);
+    EVENT(context, GLIsRenderbuffer, "context = %d, renderbuffer = %u", CID(context), renderbuffer);
 
     GLboolean returnValue;
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        RenderbufferID renderbufferPacked = FromGL<RenderbufferID>(renderbuffer);
+        RenderbufferID renderbufferPacked = PackParam<RenderbufferID>(renderbuffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateIsRenderbuffer(context, renderbufferPacked));
@@ -20965,14 +20857,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsRenderbuffer, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsRenderbuffer, GLboolean>();
         }
         ANGLE_CAPTURE(IsRenderbuffer, isCallValid, context, renderbufferPacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::IsRenderbuffer, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsRenderbuffer, GLboolean>();
     }
     return returnValue;
 }
@@ -20980,14 +20872,14 @@
 GLboolean GL_APIENTRY IsRenderbufferOESContextANGLE(GLeglContext ctx, GLuint renderbuffer)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::IsRenderbufferOES, "glIsRenderbufferOES",
-          "context = %d, renderbuffer = %u", CID(context), renderbuffer);
+    EVENT(context, GLIsRenderbufferOES, "context = %d, renderbuffer = %u", CID(context),
+          renderbuffer);
 
     GLboolean returnValue;
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        RenderbufferID renderbufferPacked = FromGL<RenderbufferID>(renderbuffer);
+        RenderbufferID renderbufferPacked = PackParam<RenderbufferID>(renderbuffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateIsRenderbufferOES(context, renderbufferPacked));
@@ -20997,14 +20889,15 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsRenderbufferOES, GLboolean>();
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLIsRenderbufferOES, GLboolean>();
         }
         ANGLE_CAPTURE(IsRenderbufferOES, isCallValid, context, renderbufferPacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::IsRenderbufferOES, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsRenderbufferOES, GLboolean>();
     }
     return returnValue;
 }
@@ -21012,14 +20905,13 @@
 GLboolean GL_APIENTRY IsSemaphoreEXTContextANGLE(GLeglContext ctx, GLuint semaphore)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::IsSemaphoreEXT, "glIsSemaphoreEXT",
-          "context = %d, semaphore = %u", CID(context), semaphore);
+    EVENT(context, GLIsSemaphoreEXT, "context = %d, semaphore = %u", CID(context), semaphore);
 
     GLboolean returnValue;
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        SemaphoreID semaphorePacked                           = FromGL<SemaphoreID>(semaphore);
+        SemaphoreID semaphorePacked                           = PackParam<SemaphoreID>(semaphore);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateIsSemaphoreEXT(context, semaphorePacked));
@@ -21029,14 +20921,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsSemaphoreEXT, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsSemaphoreEXT, GLboolean>();
         }
         ANGLE_CAPTURE(IsSemaphoreEXT, isCallValid, context, semaphorePacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::IsSemaphoreEXT, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsSemaphoreEXT, GLboolean>();
     }
     return returnValue;
 }
@@ -21044,14 +20936,13 @@
 GLboolean GL_APIENTRY IsSamplerContextANGLE(GLeglContext ctx, GLuint sampler)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::IsSampler, "glIsSampler", "context = %d, sampler = %u",
-          CID(context), sampler);
+    EVENT(context, GLIsSampler, "context = %d, sampler = %u", CID(context), sampler);
 
     GLboolean returnValue;
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateIsSampler(context, samplerPacked));
         if (isCallValid)
@@ -21060,14 +20951,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsSampler, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsSampler, GLboolean>();
         }
         ANGLE_CAPTURE(IsSampler, isCallValid, context, samplerPacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::IsSampler, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsSampler, GLboolean>();
     }
     return returnValue;
 }
@@ -21075,14 +20966,13 @@
 GLboolean GL_APIENTRY IsShaderContextANGLE(GLeglContext ctx, GLuint shader)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::IsShader, "glIsShader", "context = %d, shader = %u",
-          CID(context), shader);
+    EVENT(context, GLIsShader, "context = %d, shader = %u", CID(context), shader);
 
     GLboolean returnValue;
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID shaderPacked                          = FromGL<ShaderProgramID>(shader);
+        ShaderProgramID shaderPacked                          = PackParam<ShaderProgramID>(shader);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateIsShader(context, shaderPacked));
         if (isCallValid)
@@ -21091,14 +20981,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsShader, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsShader, GLboolean>();
         }
         ANGLE_CAPTURE(IsShader, isCallValid, context, shaderPacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::IsShader, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsShader, GLboolean>();
     }
     return returnValue;
 }
@@ -21106,8 +20996,8 @@
 GLboolean GL_APIENTRY IsSyncContextANGLE(GLeglContext ctx, GLsync sync)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::IsSync, "glIsSync", "context = %d, sync = 0x%016" PRIxPTR "",
-          CID(context), (uintptr_t)sync);
+    EVENT(context, GLIsSync, "context = %d, sync = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)sync);
 
     GLboolean returnValue;
     if (context && !context->isContextLost())
@@ -21121,14 +21011,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsSync, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsSync, GLboolean>();
         }
         ANGLE_CAPTURE(IsSync, isCallValid, context, sync, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::IsSync, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsSync, GLboolean>();
     }
     return returnValue;
 }
@@ -21136,14 +21026,13 @@
 GLboolean GL_APIENTRY IsTextureContextANGLE(GLeglContext ctx, GLuint texture)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::IsTexture, "glIsTexture", "context = %d, texture = %u",
-          CID(context), texture);
+    EVENT(context, GLIsTexture, "context = %d, texture = %u", CID(context), texture);
 
     GLboolean returnValue;
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureID texturePacked                               = FromGL<TextureID>(texture);
+        TextureID texturePacked                               = PackParam<TextureID>(texture);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateIsTexture(context, texturePacked));
         if (isCallValid)
@@ -21152,14 +21041,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsTexture, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsTexture, GLboolean>();
         }
         ANGLE_CAPTURE(IsTexture, isCallValid, context, texturePacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::IsTexture, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsTexture, GLboolean>();
     }
     return returnValue;
 }
@@ -21167,14 +21056,13 @@
 GLboolean GL_APIENTRY IsTransformFeedbackContextANGLE(GLeglContext ctx, GLuint id)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::IsTransformFeedback, "glIsTransformFeedback",
-          "context = %d, id = %u", CID(context), id);
+    EVENT(context, GLIsTransformFeedback, "context = %d, id = %u", CID(context), id);
 
     GLboolean returnValue;
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TransformFeedbackID idPacked                          = FromGL<TransformFeedbackID>(id);
+        TransformFeedbackID idPacked                          = PackParam<TransformFeedbackID>(id);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateIsTransformFeedback(context, idPacked));
@@ -21184,14 +21072,15 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsTransformFeedback, GLboolean>();
+            returnValue =
+                GetDefaultReturnValue<angle::EntryPoint::GLIsTransformFeedback, GLboolean>();
         }
         ANGLE_CAPTURE(IsTransformFeedback, isCallValid, context, idPacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::IsTransformFeedback, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsTransformFeedback, GLboolean>();
     }
     return returnValue;
 }
@@ -21199,14 +21088,13 @@
 GLboolean GL_APIENTRY IsVertexArrayContextANGLE(GLeglContext ctx, GLuint array)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::IsVertexArray, "glIsVertexArray", "context = %d, array = %u",
-          CID(context), array);
+    EVENT(context, GLIsVertexArray, "context = %d, array = %u", CID(context), array);
 
     GLboolean returnValue;
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        VertexArrayID arrayPacked                             = FromGL<VertexArrayID>(array);
+        VertexArrayID arrayPacked                             = PackParam<VertexArrayID>(array);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateIsVertexArray(context, arrayPacked));
@@ -21216,14 +21104,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsVertexArray, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsVertexArray, GLboolean>();
         }
         ANGLE_CAPTURE(IsVertexArray, isCallValid, context, arrayPacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::IsVertexArray, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsVertexArray, GLboolean>();
     }
     return returnValue;
 }
@@ -21231,14 +21119,13 @@
 GLboolean GL_APIENTRY IsVertexArrayOESContextANGLE(GLeglContext ctx, GLuint array)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::IsVertexArrayOES, "glIsVertexArrayOES",
-          "context = %d, array = %u", CID(context), array);
+    EVENT(context, GLIsVertexArrayOES, "context = %d, array = %u", CID(context), array);
 
     GLboolean returnValue;
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        VertexArrayID arrayPacked                             = FromGL<VertexArrayID>(array);
+        VertexArrayID arrayPacked                             = PackParam<VertexArrayID>(array);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateIsVertexArrayOES(context, arrayPacked));
@@ -21248,23 +21135,52 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::IsVertexArrayOES, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsVertexArrayOES, GLboolean>();
         }
         ANGLE_CAPTURE(IsVertexArrayOES, isCallValid, context, arrayPacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::IsVertexArrayOES, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsVertexArrayOES, GLboolean>();
     }
     return returnValue;
 }
 
+void GL_APIENTRY LabelObjectEXTContextANGLE(GLeglContext ctx,
+                                            GLenum type,
+                                            GLuint object,
+                                            GLsizei length,
+                                            const GLchar *label)
+{
+    Context *context = static_cast<gl::Context *>(ctx);
+    EVENT(context, GLLabelObjectEXT,
+          "context = %d, type = %s, object = %u, length = %d, label = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::DefaultGroup, type), object, length,
+          (uintptr_t)label);
+
+    if (context && !context->isContextLost())
+    {
+        ASSERT(context == GetValidGlobalContext());
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
+        bool isCallValid                                      = (context->skipValidation() ||
+                            ValidateLabelObjectEXT(context, type, object, length, label));
+        if (isCallValid)
+        {
+            context->labelObject(type, object, length, label);
+        }
+        ANGLE_CAPTURE(LabelObjectEXT, isCallValid, context, type, object, length, label);
+    }
+    else
+    {
+        GenerateContextLostErrorOnContext(context);
+    }
+}
+
 void GL_APIENTRY LightModelfContextANGLE(GLeglContext ctx, GLenum pname, GLfloat param)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::LightModelf, "glLightModelf",
-          "context = %d, pname = %s, param = %f", CID(context),
+    EVENT(context, GLLightModelf, "context = %d, pname = %s, param = %f", CID(context),
           GLenumToString(GLenumGroup::LightModelParameter, pname), param);
 
     if (context && !context->isContextLost())
@@ -21288,9 +21204,8 @@
 void GL_APIENTRY LightModelfvContextANGLE(GLeglContext ctx, GLenum pname, const GLfloat *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::LightModelfv, "glLightModelfv",
-          "context = %d, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::LightModelParameter, pname), (uintptr_t)params);
+    EVENT(context, GLLightModelfv, "context = %d, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::LightModelParameter, pname), (uintptr_t)params);
 
     if (context && !context->isContextLost())
     {
@@ -21313,8 +21228,7 @@
 void GL_APIENTRY LightModelxContextANGLE(GLeglContext ctx, GLenum pname, GLfixed param)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::LightModelx, "glLightModelx",
-          "context = %d, pname = %s, param = 0x%X", CID(context),
+    EVENT(context, GLLightModelx, "context = %d, pname = %s, param = 0x%X", CID(context),
           GLenumToString(GLenumGroup::LightModelParameter, pname), param);
 
     if (context && !context->isContextLost())
@@ -21338,9 +21252,8 @@
 void GL_APIENTRY LightModelxvContextANGLE(GLeglContext ctx, GLenum pname, const GLfixed *param)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::LightModelxv, "glLightModelxv",
-          "context = %d, pname = %s, param = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::LightModelParameter, pname), (uintptr_t)param);
+    EVENT(context, GLLightModelxv, "context = %d, pname = %s, param = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::LightModelParameter, pname), (uintptr_t)param);
 
     if (context && !context->isContextLost())
     {
@@ -21363,15 +21276,14 @@
 void GL_APIENTRY LightfContextANGLE(GLeglContext ctx, GLenum light, GLenum pname, GLfloat param)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Lightf, "glLightf",
-          "context = %d, light = %s, pname = %s, param = %f", CID(context),
+    EVENT(context, GLLightf, "context = %d, light = %s, pname = %s, param = %f", CID(context),
           GLenumToString(GLenumGroup::LightName, light),
           GLenumToString(GLenumGroup::LightParameter, pname), param);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        LightParameter pnamePacked                            = FromGL<LightParameter>(pname);
+        LightParameter pnamePacked                            = PackParam<LightParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateLightf(context, light, pnamePacked, param));
@@ -21393,15 +21305,14 @@
                                      const GLfloat *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Lightfv, "glLightfv",
-          "context = %d, light = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::LightName, light),
+    EVENT(context, GLLightfv, "context = %d, light = %s, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::LightName, light),
           GLenumToString(GLenumGroup::LightParameter, pname), (uintptr_t)params);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        LightParameter pnamePacked                            = FromGL<LightParameter>(pname);
+        LightParameter pnamePacked                            = PackParam<LightParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateLightfv(context, light, pnamePacked, params));
@@ -21420,15 +21331,14 @@
 void GL_APIENTRY LightxContextANGLE(GLeglContext ctx, GLenum light, GLenum pname, GLfixed param)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Lightx, "glLightx",
-          "context = %d, light = %s, pname = %s, param = 0x%X", CID(context),
+    EVENT(context, GLLightx, "context = %d, light = %s, pname = %s, param = 0x%X", CID(context),
           GLenumToString(GLenumGroup::LightName, light),
           GLenumToString(GLenumGroup::LightParameter, pname), param);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        LightParameter pnamePacked                            = FromGL<LightParameter>(pname);
+        LightParameter pnamePacked                            = PackParam<LightParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateLightx(context, light, pnamePacked, param));
@@ -21450,15 +21360,14 @@
                                      const GLfixed *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Lightxv, "glLightxv",
-          "context = %d, light = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::LightName, light),
+    EVENT(context, GLLightxv, "context = %d, light = %s, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::LightName, light),
           GLenumToString(GLenumGroup::LightParameter, pname), (uintptr_t)params);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        LightParameter pnamePacked                            = FromGL<LightParameter>(pname);
+        LightParameter pnamePacked                            = PackParam<LightParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateLightxv(context, light, pnamePacked, params));
@@ -21477,8 +21386,7 @@
 void GL_APIENTRY LineWidthContextANGLE(GLeglContext ctx, GLfloat width)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::LineWidth, "glLineWidth", "context = %d, width = %f",
-          CID(context), width);
+    EVENT(context, GLLineWidth, "context = %d, width = %f", CID(context), width);
 
     if (context && !context->isContextLost())
     {
@@ -21500,8 +21408,7 @@
 void GL_APIENTRY LineWidthxContextANGLE(GLeglContext ctx, GLfixed width)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::LineWidthx, "glLineWidthx", "context = %d, width = 0x%X",
-          CID(context), width);
+    EVENT(context, GLLineWidthx, "context = %d, width = 0x%X", CID(context), width);
 
     if (context && !context->isContextLost())
     {
@@ -21523,13 +21430,12 @@
 void GL_APIENTRY LinkProgramContextANGLE(GLeglContext ctx, GLuint program)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::LinkProgram, "glLinkProgram", "context = %d, program = %u",
-          CID(context), program);
+    EVENT(context, GLLinkProgram, "context = %d, program = %u", CID(context), program);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateLinkProgram(context, programPacked));
@@ -21548,7 +21454,7 @@
 void GL_APIENTRY LoadIdentityContextANGLE(GLeglContext ctx)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::LoadIdentity, "glLoadIdentity", "context = %d", CID(context));
+    EVENT(context, GLLoadIdentity, "context = %d", CID(context));
 
     if (context && !context->isContextLost())
     {
@@ -21570,8 +21476,8 @@
 void GL_APIENTRY LoadMatrixfContextANGLE(GLeglContext ctx, const GLfloat *m)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::LoadMatrixf, "glLoadMatrixf",
-          "context = %d, m = 0x%016" PRIxPTR "", CID(context), (uintptr_t)m);
+    EVENT(context, GLLoadMatrixf, "context = %d, m = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)m);
 
     if (context && !context->isContextLost())
     {
@@ -21593,8 +21499,8 @@
 void GL_APIENTRY LoadMatrixxContextANGLE(GLeglContext ctx, const GLfixed *m)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::LoadMatrixx, "glLoadMatrixx",
-          "context = %d, m = 0x%016" PRIxPTR "", CID(context), (uintptr_t)m);
+    EVENT(context, GLLoadMatrixx, "context = %d, m = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)m);
 
     if (context && !context->isContextLost())
     {
@@ -21616,8 +21522,7 @@
 void GL_APIENTRY LoadPaletteFromModelViewMatrixOESContextANGLE(GLeglContext ctx)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::LoadPaletteFromModelViewMatrixOES,
-          "glLoadPaletteFromModelViewMatrixOES", "context = %d", CID(context));
+    EVENT(context, GLLoadPaletteFromModelViewMatrixOES, "context = %d", CID(context));
 
     if (context && !context->isContextLost())
     {
@@ -21640,13 +21545,13 @@
 void GL_APIENTRY LogicOpContextANGLE(GLeglContext ctx, GLenum opcode)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::LogicOp, "glLogicOp", "context = %d, opcode = %s", CID(context),
+    EVENT(context, GLLogicOp, "context = %d, opcode = %s", CID(context),
           GLenumToString(GLenumGroup::LogicOp, opcode));
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        LogicalOperation opcodePacked                         = FromGL<LogicalOperation>(opcode);
+        LogicalOperation opcodePacked                         = PackParam<LogicalOperation>(opcode);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateLogicOp(context, opcodePacked));
         if (isCallValid)
@@ -21664,8 +21569,7 @@
 void *GL_APIENTRY MapBufferOESContextANGLE(GLeglContext ctx, GLenum target, GLenum access)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::MapBufferOES, "glMapBufferOES",
-          "context = %d, target = %s, access = %s", CID(context),
+    EVENT(context, GLMapBufferOES, "context = %d, target = %s, access = %s", CID(context),
           GLenumToString(GLenumGroup::BufferTargetARB, target),
           GLenumToString(GLenumGroup::BufferAccessARB, access));
 
@@ -21673,7 +21577,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateMapBufferOES(context, targetPacked, access));
@@ -21683,14 +21587,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::MapBufferOES, void *>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLMapBufferOES, void *>();
         }
         ANGLE_CAPTURE(MapBufferOES, isCallValid, context, targetPacked, access, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::MapBufferOES, void *>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLMapBufferOES, void *>();
     }
     return returnValue;
 }
@@ -21702,7 +21606,7 @@
                                              GLbitfield access)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::MapBufferRange, "glMapBufferRange",
+    EVENT(context, GLMapBufferRange,
           "context = %d, target = %s, offset = %llu, length = %llu, access = %s", CID(context),
           GLenumToString(GLenumGroup::BufferTargetARB, target),
           static_cast<unsigned long long>(offset), static_cast<unsigned long long>(length),
@@ -21712,7 +21616,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateMapBufferRange(context, targetPacked, offset, length, access));
@@ -21722,7 +21626,7 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::MapBufferRange, void *>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLMapBufferRange, void *>();
         }
         ANGLE_CAPTURE(MapBufferRange, isCallValid, context, targetPacked, offset, length, access,
                       returnValue);
@@ -21730,7 +21634,7 @@
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::MapBufferRange, void *>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLMapBufferRange, void *>();
     }
     return returnValue;
 }
@@ -21742,7 +21646,7 @@
                                                 GLbitfield access)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::MapBufferRangeEXT, "glMapBufferRangeEXT",
+    EVENT(context, GLMapBufferRangeEXT,
           "context = %d, target = %s, offset = %llu, length = %llu, access = %s", CID(context),
           GLenumToString(GLenumGroup::BufferTargetARB, target),
           static_cast<unsigned long long>(offset), static_cast<unsigned long long>(length),
@@ -21752,7 +21656,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -21763,7 +21667,7 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::MapBufferRangeEXT, void *>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLMapBufferRangeEXT, void *>();
         }
         ANGLE_CAPTURE(MapBufferRangeEXT, isCallValid, context, targetPacked, offset, length, access,
                       returnValue);
@@ -21771,7 +21675,7 @@
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::MapBufferRangeEXT, void *>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLMapBufferRangeEXT, void *>();
     }
     return returnValue;
 }
@@ -21779,15 +21683,14 @@
 void GL_APIENTRY MaterialfContextANGLE(GLeglContext ctx, GLenum face, GLenum pname, GLfloat param)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Materialf, "glMaterialf",
-          "context = %d, face = %s, pname = %s, param = %f", CID(context),
+    EVENT(context, GLMaterialf, "context = %d, face = %s, pname = %s, param = %f", CID(context),
           GLenumToString(GLenumGroup::MaterialFace, face),
           GLenumToString(GLenumGroup::MaterialParameter, pname), param);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        MaterialParameter pnamePacked                         = FromGL<MaterialParameter>(pname);
+        MaterialParameter pnamePacked                         = PackParam<MaterialParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateMaterialf(context, face, pnamePacked, param));
@@ -21809,15 +21712,14 @@
                                         const GLfloat *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Materialfv, "glMaterialfv",
-          "context = %d, face = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::MaterialFace, face),
+    EVENT(context, GLMaterialfv, "context = %d, face = %s, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::MaterialFace, face),
           GLenumToString(GLenumGroup::MaterialParameter, pname), (uintptr_t)params);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        MaterialParameter pnamePacked                         = FromGL<MaterialParameter>(pname);
+        MaterialParameter pnamePacked                         = PackParam<MaterialParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateMaterialfv(context, face, pnamePacked, params));
@@ -21836,15 +21738,14 @@
 void GL_APIENTRY MaterialxContextANGLE(GLeglContext ctx, GLenum face, GLenum pname, GLfixed param)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Materialx, "glMaterialx",
-          "context = %d, face = %s, pname = %s, param = 0x%X", CID(context),
+    EVENT(context, GLMaterialx, "context = %d, face = %s, pname = %s, param = 0x%X", CID(context),
           GLenumToString(GLenumGroup::MaterialFace, face),
           GLenumToString(GLenumGroup::MaterialParameter, pname), param);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        MaterialParameter pnamePacked                         = FromGL<MaterialParameter>(pname);
+        MaterialParameter pnamePacked                         = PackParam<MaterialParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateMaterialx(context, face, pnamePacked, param));
@@ -21866,15 +21767,14 @@
                                         const GLfixed *param)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Materialxv, "glMaterialxv",
-          "context = %d, face = %s, pname = %s, param = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::MaterialFace, face),
+    EVENT(context, GLMaterialxv, "context = %d, face = %s, pname = %s, param = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::MaterialFace, face),
           GLenumToString(GLenumGroup::MaterialParameter, pname), (uintptr_t)param);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        MaterialParameter pnamePacked                         = FromGL<MaterialParameter>(pname);
+        MaterialParameter pnamePacked                         = PackParam<MaterialParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateMaterialxv(context, face, pnamePacked, param));
@@ -21897,7 +21797,7 @@
                                                    const void *pointer)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::MatrixIndexPointerOES, "glMatrixIndexPointerOES",
+    EVENT(context, GLMatrixIndexPointerOES,
           "context = %d, size = %d, type = %s, stride = %d, pointer = 0x%016" PRIxPTR "",
           CID(context), size, GLenumToString(GLenumGroup::DefaultGroup, type), stride,
           (uintptr_t)pointer);
@@ -21923,13 +21823,13 @@
 void GL_APIENTRY MatrixModeContextANGLE(GLeglContext ctx, GLenum mode)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::MatrixMode, "glMatrixMode", "context = %d, mode = %s",
-          CID(context), GLenumToString(GLenumGroup::MatrixMode, mode));
+    EVENT(context, GLMatrixMode, "context = %d, mode = %s", CID(context),
+          GLenumToString(GLenumGroup::MatrixMode, mode));
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        MatrixType modePacked                                 = FromGL<MatrixType>(mode);
+        MatrixType modePacked                                 = PackParam<MatrixType>(mode);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateMatrixMode(context, modePacked));
         if (isCallValid)
@@ -21947,8 +21847,7 @@
 void GL_APIENTRY MaxShaderCompilerThreadsKHRContextANGLE(GLeglContext ctx, GLuint count)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::MaxShaderCompilerThreadsKHR, "glMaxShaderCompilerThreadsKHR",
-          "context = %d, count = %u", CID(context), count);
+    EVENT(context, GLMaxShaderCompilerThreadsKHR, "context = %d, count = %u", CID(context), count);
 
     if (context && !context->isContextLost())
     {
@@ -21971,8 +21870,8 @@
 void GL_APIENTRY MemoryBarrierContextANGLE(GLeglContext ctx, GLbitfield barriers)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::MemoryBarrier, "glMemoryBarrier", "context = %d, barriers = %s",
-          CID(context), GLbitfieldToString(GLenumGroup::MemoryBarrierMask, barriers).c_str());
+    EVENT(context, GLMemoryBarrier, "context = %d, barriers = %s", CID(context),
+          GLbitfieldToString(GLenumGroup::MemoryBarrierMask, barriers).c_str());
 
     if (context && !context->isContextLost())
     {
@@ -21994,8 +21893,7 @@
 void GL_APIENTRY MemoryBarrierByRegionContextANGLE(GLeglContext ctx, GLbitfield barriers)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::MemoryBarrierByRegion, "glMemoryBarrierByRegion",
-          "context = %d, barriers = %s", CID(context),
+    EVENT(context, GLMemoryBarrierByRegion, "context = %d, barriers = %s", CID(context),
           GLbitfieldToString(GLenumGroup::MemoryBarrierMask, barriers).c_str());
 
     if (context && !context->isContextLost())
@@ -22022,7 +21920,7 @@
                                                         const GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::MemoryObjectParameterivEXT, "glMemoryObjectParameterivEXT",
+    EVENT(context, GLMemoryObjectParameterivEXT,
           "context = %d, memoryObject = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           memoryObject, GLenumToString(GLenumGroup::MemoryObjectParameterName, pname),
           (uintptr_t)params);
@@ -22030,7 +21928,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        MemoryObjectID memoryObjectPacked = FromGL<MemoryObjectID>(memoryObject);
+        MemoryObjectID memoryObjectPacked = PackParam<MemoryObjectID>(memoryObject);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -22051,8 +21949,7 @@
 void GL_APIENTRY MinSampleShadingContextANGLE(GLeglContext ctx, GLfloat value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::MinSampleShading, "glMinSampleShading",
-          "context = %d, value = %f", CID(context), value);
+    EVENT(context, GLMinSampleShading, "context = %d, value = %f", CID(context), value);
 
     if (context && !context->isContextLost())
     {
@@ -22074,8 +21971,7 @@
 void GL_APIENTRY MinSampleShadingOESContextANGLE(GLeglContext ctx, GLfloat value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::MinSampleShadingOES, "glMinSampleShadingOES",
-          "context = %d, value = %f", CID(context), value);
+    EVENT(context, GLMinSampleShadingOES, "context = %d, value = %f", CID(context), value);
 
     if (context && !context->isContextLost())
     {
@@ -22098,8 +21994,8 @@
 void GL_APIENTRY MultMatrixfContextANGLE(GLeglContext ctx, const GLfloat *m)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::MultMatrixf, "glMultMatrixf",
-          "context = %d, m = 0x%016" PRIxPTR "", CID(context), (uintptr_t)m);
+    EVENT(context, GLMultMatrixf, "context = %d, m = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)m);
 
     if (context && !context->isContextLost())
     {
@@ -22121,8 +22017,8 @@
 void GL_APIENTRY MultMatrixxContextANGLE(GLeglContext ctx, const GLfixed *m)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::MultMatrixx, "glMultMatrixx",
-          "context = %d, m = 0x%016" PRIxPTR "", CID(context), (uintptr_t)m);
+    EVENT(context, GLMultMatrixx, "context = %d, m = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)m);
 
     if (context && !context->isContextLost())
     {
@@ -22150,8 +22046,7 @@
                                                             const GLint *basevertex)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::MultiDrawElementsBaseVertexEXT,
-          "glMultiDrawElementsBaseVertexEXT",
+    EVENT(context, GLMultiDrawElementsBaseVertexEXT,
           "context = %d, mode = %s, count = 0x%016" PRIxPTR ", type = %s, indices = 0x%016" PRIxPTR
           ", primcount = %d, basevertex = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), (uintptr_t)count,
@@ -22161,8 +22056,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateMultiDrawElementsBaseVertexEXT(
                                                              context, modePacked, count, typePacked,
@@ -22189,9 +22084,8 @@
                                              GLfloat q)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::MultiTexCoord4f, "glMultiTexCoord4f",
-          "context = %d, target = %s, s = %f, t = %f, r = %f, q = %f", CID(context),
-          GLenumToString(GLenumGroup::TextureUnit, target), s, t, r, q);
+    EVENT(context, GLMultiTexCoord4f, "context = %d, target = %s, s = %f, t = %f, r = %f, q = %f",
+          CID(context), GLenumToString(GLenumGroup::TextureUnit, target), s, t, r, q);
 
     if (context && !context->isContextLost())
     {
@@ -22219,7 +22113,7 @@
                                              GLfixed q)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::MultiTexCoord4x, "glMultiTexCoord4x",
+    EVENT(context, GLMultiTexCoord4x,
           "context = %d, texture = %s, s = 0x%X, t = 0x%X, r = 0x%X, q = 0x%X", CID(context),
           GLenumToString(GLenumGroup::TextureUnit, texture), s, t, r, q);
 
@@ -22249,7 +22143,7 @@
                                                            GLbitfield flags)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::NamedBufferStorageExternalEXT, "glNamedBufferStorageExternalEXT",
+    EVENT(context, GLNamedBufferStorageExternalEXT,
           "context = %d, buffer = %u, offset = %llu, size = %llu, clientBuffer = 0x%016" PRIxPTR
           ", flags = %s",
           CID(context), buffer, static_cast<unsigned long long>(offset),
@@ -22279,8 +22173,7 @@
 void GL_APIENTRY Normal3fContextANGLE(GLeglContext ctx, GLfloat nx, GLfloat ny, GLfloat nz)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Normal3f, "glNormal3f",
-          "context = %d, nx = %f, ny = %f, nz = %f", CID(context), nx, ny, nz);
+    EVENT(context, GLNormal3f, "context = %d, nx = %f, ny = %f, nz = %f", CID(context), nx, ny, nz);
 
     if (context && !context->isContextLost())
     {
@@ -22302,8 +22195,8 @@
 void GL_APIENTRY Normal3xContextANGLE(GLeglContext ctx, GLfixed nx, GLfixed ny, GLfixed nz)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Normal3x, "glNormal3x",
-          "context = %d, nx = 0x%X, ny = 0x%X, nz = 0x%X", CID(context), nx, ny, nz);
+    EVENT(context, GLNormal3x, "context = %d, nx = 0x%X, ny = 0x%X, nz = 0x%X", CID(context), nx,
+          ny, nz);
 
     if (context && !context->isContextLost())
     {
@@ -22328,14 +22221,14 @@
                                            const void *pointer)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::NormalPointer, "glNormalPointer",
+    EVENT(context, GLNormalPointer,
           "context = %d, type = %s, stride = %d, pointer = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::NormalPointerType, type), stride, (uintptr_t)pointer);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        VertexAttribType typePacked                           = FromGL<VertexAttribType>(type);
+        VertexAttribType typePacked                           = PackParam<VertexAttribType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateNormalPointer(context, typePacked, stride, pointer));
@@ -22358,7 +22251,7 @@
                                          const GLchar *label)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ObjectLabel, "glObjectLabel",
+    EVENT(context, GLObjectLabel,
           "context = %d, identifier = %s, name = %u, length = %d, label = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::ObjectIdentifier, identifier), name, length,
           (uintptr_t)label);
@@ -22388,7 +22281,7 @@
                                             const GLchar *label)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ObjectLabelKHR, "glObjectLabelKHR",
+    EVENT(context, GLObjectLabelKHR,
           "context = %d, identifier = %s, name = %u, length = %d, label = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::ObjectIdentifier, identifier), name, length,
           (uintptr_t)label);
@@ -22417,7 +22310,7 @@
                                             const GLchar *label)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ObjectPtrLabel, "glObjectPtrLabel",
+    EVENT(context, GLObjectPtrLabel,
           "context = %d, ptr = 0x%016" PRIxPTR ", length = %d, label = 0x%016" PRIxPTR "",
           CID(context), (uintptr_t)ptr, length, (uintptr_t)label);
 
@@ -22445,7 +22338,7 @@
                                                const GLchar *label)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ObjectPtrLabelKHR, "glObjectPtrLabelKHR",
+    EVENT(context, GLObjectPtrLabelKHR,
           "context = %d, ptr = 0x%016" PRIxPTR ", length = %d, label = 0x%016" PRIxPTR "",
           CID(context), (uintptr_t)ptr, length, (uintptr_t)label);
 
@@ -22476,9 +22369,8 @@
                                     GLfloat f)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Orthof, "glOrthof",
-          "context = %d, l = %f, r = %f, b = %f, t = %f, n = %f, f = %f", CID(context), l, r, b, t,
-          n, f);
+    EVENT(context, GLOrthof, "context = %d, l = %f, r = %f, b = %f, t = %f, n = %f, f = %f",
+          CID(context), l, r, b, t, n, f);
 
     if (context && !context->isContextLost())
     {
@@ -22506,7 +22398,7 @@
                                     GLfixed f)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Orthox, "glOrthox",
+    EVENT(context, GLOrthox,
           "context = %d, l = 0x%X, r = 0x%X, b = 0x%X, t = 0x%X, n = 0x%X, f = 0x%X", CID(context),
           l, r, b, t, n, f);
 
@@ -22530,8 +22422,7 @@
 void GL_APIENTRY PatchParameteriContextANGLE(GLeglContext ctx, GLenum pname, GLint value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::PatchParameteri, "glPatchParameteri",
-          "context = %d, pname = %s, value = %d", CID(context),
+    EVENT(context, GLPatchParameteri, "context = %d, pname = %s, value = %d", CID(context),
           GLenumToString(GLenumGroup::PatchParameterName, pname), value);
 
     if (context && !context->isContextLost())
@@ -22555,8 +22446,7 @@
 void GL_APIENTRY PatchParameteriEXTContextANGLE(GLeglContext ctx, GLenum pname, GLint value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::PatchParameteriEXT, "glPatchParameteriEXT",
-          "context = %d, pname = %s, value = %d", CID(context),
+    EVENT(context, GLPatchParameteriEXT, "context = %d, pname = %s, value = %d", CID(context),
           GLenumToString(GLenumGroup::PatchParameterName, pname), value);
 
     if (context && !context->isContextLost())
@@ -22580,8 +22470,7 @@
 void GL_APIENTRY PauseTransformFeedbackContextANGLE(GLeglContext ctx)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::PauseTransformFeedback, "glPauseTransformFeedback",
-          "context = %d", CID(context));
+    EVENT(context, GLPauseTransformFeedback, "context = %d", CID(context));
 
     if (context && !context->isContextLost())
     {
@@ -22603,8 +22492,7 @@
 void GL_APIENTRY PixelStoreiContextANGLE(GLeglContext ctx, GLenum pname, GLint param)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::PixelStorei, "glPixelStorei",
-          "context = %d, pname = %s, param = %d", CID(context),
+    EVENT(context, GLPixelStorei, "context = %d, pname = %s, param = %d", CID(context),
           GLenumToString(GLenumGroup::PixelStoreParameter, pname), param);
 
     if (context && !context->isContextLost())
@@ -22628,14 +22516,13 @@
 void GL_APIENTRY PointParameterfContextANGLE(GLeglContext ctx, GLenum pname, GLfloat param)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::PointParameterf, "glPointParameterf",
-          "context = %d, pname = %s, param = %f", CID(context),
+    EVENT(context, GLPointParameterf, "context = %d, pname = %s, param = %f", CID(context),
           GLenumToString(GLenumGroup::DefaultGroup, pname), param);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        PointParameter pnamePacked                            = FromGL<PointParameter>(pname);
+        PointParameter pnamePacked                            = PackParam<PointParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidatePointParameterf(context, pnamePacked, param));
@@ -22654,14 +22541,13 @@
 void GL_APIENTRY PointParameterfvContextANGLE(GLeglContext ctx, GLenum pname, const GLfloat *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::PointParameterfv, "glPointParameterfv",
-          "context = %d, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
+    EVENT(context, GLPointParameterfv, "context = %d, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        PointParameter pnamePacked                            = FromGL<PointParameter>(pname);
+        PointParameter pnamePacked                            = PackParam<PointParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidatePointParameterfv(context, pnamePacked, params));
@@ -22680,14 +22566,13 @@
 void GL_APIENTRY PointParameterxContextANGLE(GLeglContext ctx, GLenum pname, GLfixed param)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::PointParameterx, "glPointParameterx",
-          "context = %d, pname = %s, param = 0x%X", CID(context),
+    EVENT(context, GLPointParameterx, "context = %d, pname = %s, param = 0x%X", CID(context),
           GLenumToString(GLenumGroup::DefaultGroup, pname), param);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        PointParameter pnamePacked                            = FromGL<PointParameter>(pname);
+        PointParameter pnamePacked                            = PackParam<PointParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidatePointParameterx(context, pnamePacked, param));
@@ -22706,14 +22591,13 @@
 void GL_APIENTRY PointParameterxvContextANGLE(GLeglContext ctx, GLenum pname, const GLfixed *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::PointParameterxv, "glPointParameterxv",
-          "context = %d, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
+    EVENT(context, GLPointParameterxv, "context = %d, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        PointParameter pnamePacked                            = FromGL<PointParameter>(pname);
+        PointParameter pnamePacked                            = PackParam<PointParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidatePointParameterxv(context, pnamePacked, params));
@@ -22732,8 +22616,7 @@
 void GL_APIENTRY PointSizeContextANGLE(GLeglContext ctx, GLfloat size)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::PointSize, "glPointSize", "context = %d, size = %f",
-          CID(context), size);
+    EVENT(context, GLPointSize, "context = %d, size = %f", CID(context), size);
 
     if (context && !context->isContextLost())
     {
@@ -22758,14 +22641,14 @@
                                                  const void *pointer)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::PointSizePointerOES, "glPointSizePointerOES",
+    EVENT(context, GLPointSizePointerOES,
           "context = %d, type = %s, stride = %d, pointer = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::DefaultGroup, type), stride, (uintptr_t)pointer);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        VertexAttribType typePacked                           = FromGL<VertexAttribType>(type);
+        VertexAttribType typePacked                           = PackParam<VertexAttribType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidatePointSizePointerOES(context, typePacked, stride, pointer));
@@ -22784,8 +22667,7 @@
 void GL_APIENTRY PointSizexContextANGLE(GLeglContext ctx, GLfixed size)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::PointSizex, "glPointSizex", "context = %d, size = 0x%X",
-          CID(context), size);
+    EVENT(context, GLPointSizex, "context = %d, size = 0x%X", CID(context), size);
 
     if (context && !context->isContextLost())
     {
@@ -22807,8 +22689,8 @@
 void GL_APIENTRY PolygonOffsetContextANGLE(GLeglContext ctx, GLfloat factor, GLfloat units)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::PolygonOffset, "glPolygonOffset",
-          "context = %d, factor = %f, units = %f", CID(context), factor, units);
+    EVENT(context, GLPolygonOffset, "context = %d, factor = %f, units = %f", CID(context), factor,
+          units);
 
     if (context && !context->isContextLost())
     {
@@ -22831,8 +22713,8 @@
 void GL_APIENTRY PolygonOffsetxContextANGLE(GLeglContext ctx, GLfixed factor, GLfixed units)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::PolygonOffsetx, "glPolygonOffsetx",
-          "context = %d, factor = 0x%X, units = 0x%X", CID(context), factor, units);
+    EVENT(context, GLPolygonOffsetx, "context = %d, factor = 0x%X, units = 0x%X", CID(context),
+          factor, units);
 
     if (context && !context->isContextLost())
     {
@@ -22855,7 +22737,7 @@
 void GL_APIENTRY PopDebugGroupContextANGLE(GLeglContext ctx)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::PopDebugGroup, "glPopDebugGroup", "context = %d", CID(context));
+    EVENT(context, GLPopDebugGroup, "context = %d", CID(context));
 
     if (context && !context->isContextLost())
     {
@@ -22877,8 +22759,7 @@
 void GL_APIENTRY PopDebugGroupKHRContextANGLE(GLeglContext ctx)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::PopDebugGroupKHR, "glPopDebugGroupKHR", "context = %d",
-          CID(context));
+    EVENT(context, GLPopDebugGroupKHR, "context = %d", CID(context));
 
     if (context && !context->isContextLost())
     {
@@ -22902,8 +22783,7 @@
     Context *context = static_cast<gl::Context *>(ctx);
     // Don't run the EVENT() macro on the EXT_debug_marker entry points.
     // It can interfere with the debug events being set by the caller.
-    // EVENT(context, gl::EntryPoint::PopGroupMarkerEXT, "glPopGroupMarkerEXT", "context = %d",
-    // CID(context));
+    // EVENT(context, GLPopGroupMarkerEXT, "context = %d", CID(context));
 
     if (context && !context->isContextLost())
     {
@@ -22925,7 +22805,7 @@
 void GL_APIENTRY PopMatrixContextANGLE(GLeglContext ctx)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::PopMatrix, "glPopMatrix", "context = %d", CID(context));
+    EVENT(context, GLPopMatrix, "context = %d", CID(context));
 
     if (context && !context->isContextLost())
     {
@@ -22955,7 +22835,7 @@
                                                   GLfloat maxW)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::PrimitiveBoundingBox, "glPrimitiveBoundingBox",
+    EVENT(context, GLPrimitiveBoundingBox,
           "context = %d, minX = %f, minY = %f, minZ = %f, minW = %f, maxX = %f, maxY = %f, maxZ = "
           "%f, maxW = %f",
           CID(context), minX, minY, minZ, minW, maxX, maxY, maxZ, maxW);
@@ -22987,7 +22867,7 @@
                                            GLsizei length)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramBinary, "glProgramBinary",
+    EVENT(context, GLProgramBinary,
           "context = %d, program = %u, binaryFormat = %s, binary = 0x%016" PRIxPTR ", length = %d",
           CID(context), program, GLenumToString(GLenumGroup::DefaultGroup, binaryFormat),
           (uintptr_t)binary, length);
@@ -22995,7 +22875,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -23020,7 +22900,7 @@
                                               GLint length)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramBinaryOES, "glProgramBinaryOES",
+    EVENT(context, GLProgramBinaryOES,
           "context = %d, program = %u, binaryFormat = %s, binary = 0x%016" PRIxPTR ", length = %d",
           CID(context), program, GLenumToString(GLenumGroup::DefaultGroup, binaryFormat),
           (uintptr_t)binary, length);
@@ -23028,7 +22908,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -23052,14 +22932,13 @@
                                                GLint value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramParameteri, "glProgramParameteri",
-          "context = %d, program = %u, pname = %s, value = %d", CID(context), program,
-          GLenumToString(GLenumGroup::ProgramParameterPName, pname), value);
+    EVENT(context, GLProgramParameteri, "context = %d, program = %u, pname = %s, value = %d",
+          CID(context), program, GLenumToString(GLenumGroup::ProgramParameterPName, pname), value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramParameteri(context, programPacked, pname, value));
@@ -23081,14 +22960,13 @@
                                                   GLint value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramParameteriEXT, "glProgramParameteriEXT",
-          "context = %d, program = %u, pname = %s, value = %d", CID(context), program,
-          GLenumToString(GLenumGroup::ProgramParameterPName, pname), value);
+    EVENT(context, GLProgramParameteriEXT, "context = %d, program = %u, pname = %s, value = %d",
+          CID(context), program, GLenumToString(GLenumGroup::ProgramParameterPName, pname), value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramParameteriEXT(context, programPacked, pname, value));
@@ -23110,15 +22988,14 @@
                                               GLfloat v0)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform1f, "glProgramUniform1f",
-          "context = %d, program = %u, location = %d, v0 = %f", CID(context), program, location,
-          v0);
+    EVENT(context, GLProgramUniform1f, "context = %d, program = %u, location = %d, v0 = %f",
+          CID(context), program, location, v0);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniform1f(context, programPacked, locationPacked, v0));
@@ -23140,15 +23017,14 @@
                                                  GLfloat v0)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform1fEXT, "glProgramUniform1fEXT",
-          "context = %d, program = %u, location = %d, v0 = %f", CID(context), program, location,
-          v0);
+    EVENT(context, GLProgramUniform1fEXT, "context = %d, program = %u, location = %d, v0 = %f",
+          CID(context), program, location, v0);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -23172,15 +23048,15 @@
                                                const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform1fv, "glProgramUniform1fv",
+    EVENT(context, GLProgramUniform1fv,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -23205,15 +23081,15 @@
                                                   const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform1fvEXT, "glProgramUniform1fvEXT",
+    EVENT(context, GLProgramUniform1fvEXT,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -23237,15 +23113,14 @@
                                               GLint v0)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform1i, "glProgramUniform1i",
-          "context = %d, program = %u, location = %d, v0 = %d", CID(context), program, location,
-          v0);
+    EVENT(context, GLProgramUniform1i, "context = %d, program = %u, location = %d, v0 = %d",
+          CID(context), program, location, v0);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniform1i(context, programPacked, locationPacked, v0));
@@ -23267,15 +23142,14 @@
                                                  GLint v0)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform1iEXT, "glProgramUniform1iEXT",
-          "context = %d, program = %u, location = %d, v0 = %d", CID(context), program, location,
-          v0);
+    EVENT(context, GLProgramUniform1iEXT, "context = %d, program = %u, location = %d, v0 = %d",
+          CID(context), program, location, v0);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -23299,15 +23173,15 @@
                                                const GLint *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform1iv, "glProgramUniform1iv",
+    EVENT(context, GLProgramUniform1iv,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -23332,15 +23206,15 @@
                                                   const GLint *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform1ivEXT, "glProgramUniform1ivEXT",
+    EVENT(context, GLProgramUniform1ivEXT,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -23364,15 +23238,14 @@
                                                GLuint v0)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform1ui, "glProgramUniform1ui",
-          "context = %d, program = %u, location = %d, v0 = %u", CID(context), program, location,
-          v0);
+    EVENT(context, GLProgramUniform1ui, "context = %d, program = %u, location = %d, v0 = %u",
+          CID(context), program, location, v0);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniform1ui(context, programPacked, locationPacked, v0));
@@ -23394,15 +23267,14 @@
                                                   GLuint v0)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform1uiEXT, "glProgramUniform1uiEXT",
-          "context = %d, program = %u, location = %d, v0 = %u", CID(context), program, location,
-          v0);
+    EVENT(context, GLProgramUniform1uiEXT, "context = %d, program = %u, location = %d, v0 = %u",
+          CID(context), program, location, v0);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -23427,15 +23299,15 @@
                                                 const GLuint *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform1uiv, "glProgramUniform1uiv",
+    EVENT(context, GLProgramUniform1uiv,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -23460,15 +23332,15 @@
                                                    const GLuint *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform1uivEXT, "glProgramUniform1uivEXT",
+    EVENT(context, GLProgramUniform1uivEXT,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -23493,15 +23365,15 @@
                                               GLfloat v1)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform2f, "glProgramUniform2f",
+    EVENT(context, GLProgramUniform2f,
           "context = %d, program = %u, location = %d, v0 = %f, v1 = %f", CID(context), program,
           location, v0, v1);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -23526,15 +23398,15 @@
                                                  GLfloat v1)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform2fEXT, "glProgramUniform2fEXT",
+    EVENT(context, GLProgramUniform2fEXT,
           "context = %d, program = %u, location = %d, v0 = %f, v1 = %f", CID(context), program,
           location, v0, v1);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -23559,15 +23431,15 @@
                                                const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform2fv, "glProgramUniform2fv",
+    EVENT(context, GLProgramUniform2fv,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -23592,15 +23464,15 @@
                                                   const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform2fvEXT, "glProgramUniform2fvEXT",
+    EVENT(context, GLProgramUniform2fvEXT,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -23622,15 +23494,15 @@
 ProgramUniform2iContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLint v0, GLint v1)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform2i, "glProgramUniform2i",
+    EVENT(context, GLProgramUniform2i,
           "context = %d, program = %u, location = %d, v0 = %d, v1 = %d", CID(context), program,
           location, v0, v1);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -23655,15 +23527,15 @@
                                                  GLint v1)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform2iEXT, "glProgramUniform2iEXT",
+    EVENT(context, GLProgramUniform2iEXT,
           "context = %d, program = %u, location = %d, v0 = %d, v1 = %d", CID(context), program,
           location, v0, v1);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -23688,15 +23560,15 @@
                                                const GLint *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform2iv, "glProgramUniform2iv",
+    EVENT(context, GLProgramUniform2iv,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -23721,15 +23593,15 @@
                                                   const GLint *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform2ivEXT, "glProgramUniform2ivEXT",
+    EVENT(context, GLProgramUniform2ivEXT,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -23754,15 +23626,15 @@
                                                GLuint v1)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform2ui, "glProgramUniform2ui",
+    EVENT(context, GLProgramUniform2ui,
           "context = %d, program = %u, location = %d, v0 = %u, v1 = %u", CID(context), program,
           location, v0, v1);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -23787,15 +23659,15 @@
                                                   GLuint v1)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform2uiEXT, "glProgramUniform2uiEXT",
+    EVENT(context, GLProgramUniform2uiEXT,
           "context = %d, program = %u, location = %d, v0 = %u, v1 = %u", CID(context), program,
           location, v0, v1);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -23820,15 +23692,15 @@
                                                 const GLuint *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform2uiv, "glProgramUniform2uiv",
+    EVENT(context, GLProgramUniform2uiv,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -23853,15 +23725,15 @@
                                                    const GLuint *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform2uivEXT, "glProgramUniform2uivEXT",
+    EVENT(context, GLProgramUniform2uivEXT,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -23887,15 +23759,15 @@
                                               GLfloat v2)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform3f, "glProgramUniform3f",
+    EVENT(context, GLProgramUniform3f,
           "context = %d, program = %u, location = %d, v0 = %f, v1 = %f, v2 = %f", CID(context),
           program, location, v0, v1, v2);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -23921,15 +23793,15 @@
                                                  GLfloat v2)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform3fEXT, "glProgramUniform3fEXT",
+    EVENT(context, GLProgramUniform3fEXT,
           "context = %d, program = %u, location = %d, v0 = %f, v1 = %f, v2 = %f", CID(context),
           program, location, v0, v1, v2);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -23954,15 +23826,15 @@
                                                const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform3fv, "glProgramUniform3fv",
+    EVENT(context, GLProgramUniform3fv,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -23987,15 +23859,15 @@
                                                   const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform3fvEXT, "glProgramUniform3fvEXT",
+    EVENT(context, GLProgramUniform3fvEXT,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -24021,15 +23893,15 @@
                                               GLint v2)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform3i, "glProgramUniform3i",
+    EVENT(context, GLProgramUniform3i,
           "context = %d, program = %u, location = %d, v0 = %d, v1 = %d, v2 = %d", CID(context),
           program, location, v0, v1, v2);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -24055,15 +23927,15 @@
                                                  GLint v2)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform3iEXT, "glProgramUniform3iEXT",
+    EVENT(context, GLProgramUniform3iEXT,
           "context = %d, program = %u, location = %d, v0 = %d, v1 = %d, v2 = %d", CID(context),
           program, location, v0, v1, v2);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -24088,15 +23960,15 @@
                                                const GLint *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform3iv, "glProgramUniform3iv",
+    EVENT(context, GLProgramUniform3iv,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -24121,15 +23993,15 @@
                                                   const GLint *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform3ivEXT, "glProgramUniform3ivEXT",
+    EVENT(context, GLProgramUniform3ivEXT,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -24155,15 +24027,15 @@
                                                GLuint v2)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform3ui, "glProgramUniform3ui",
+    EVENT(context, GLProgramUniform3ui,
           "context = %d, program = %u, location = %d, v0 = %u, v1 = %u, v2 = %u", CID(context),
           program, location, v0, v1, v2);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -24189,15 +24061,15 @@
                                                   GLuint v2)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform3uiEXT, "glProgramUniform3uiEXT",
+    EVENT(context, GLProgramUniform3uiEXT,
           "context = %d, program = %u, location = %d, v0 = %u, v1 = %u, v2 = %u", CID(context),
           program, location, v0, v1, v2);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -24222,15 +24094,15 @@
                                                 const GLuint *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform3uiv, "glProgramUniform3uiv",
+    EVENT(context, GLProgramUniform3uiv,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -24255,15 +24127,15 @@
                                                    const GLuint *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform3uivEXT, "glProgramUniform3uivEXT",
+    EVENT(context, GLProgramUniform3uivEXT,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -24290,15 +24162,15 @@
                                               GLfloat v3)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform4f, "glProgramUniform4f",
+    EVENT(context, GLProgramUniform4f,
           "context = %d, program = %u, location = %d, v0 = %f, v1 = %f, v2 = %f, v3 = %f",
           CID(context), program, location, v0, v1, v2, v3);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -24325,15 +24197,15 @@
                                                  GLfloat v3)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform4fEXT, "glProgramUniform4fEXT",
+    EVENT(context, GLProgramUniform4fEXT,
           "context = %d, program = %u, location = %d, v0 = %f, v1 = %f, v2 = %f, v3 = %f",
           CID(context), program, location, v0, v1, v2, v3);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -24358,15 +24230,15 @@
                                                const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform4fv, "glProgramUniform4fv",
+    EVENT(context, GLProgramUniform4fv,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -24391,15 +24263,15 @@
                                                   const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform4fvEXT, "glProgramUniform4fvEXT",
+    EVENT(context, GLProgramUniform4fvEXT,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -24426,15 +24298,15 @@
                                               GLint v3)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform4i, "glProgramUniform4i",
+    EVENT(context, GLProgramUniform4i,
           "context = %d, program = %u, location = %d, v0 = %d, v1 = %d, v2 = %d, v3 = %d",
           CID(context), program, location, v0, v1, v2, v3);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -24461,15 +24333,15 @@
                                                  GLint v3)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform4iEXT, "glProgramUniform4iEXT",
+    EVENT(context, GLProgramUniform4iEXT,
           "context = %d, program = %u, location = %d, v0 = %d, v1 = %d, v2 = %d, v3 = %d",
           CID(context), program, location, v0, v1, v2, v3);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -24494,15 +24366,15 @@
                                                const GLint *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform4iv, "glProgramUniform4iv",
+    EVENT(context, GLProgramUniform4iv,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -24527,15 +24399,15 @@
                                                   const GLint *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform4ivEXT, "glProgramUniform4ivEXT",
+    EVENT(context, GLProgramUniform4ivEXT,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -24562,15 +24434,15 @@
                                                GLuint v3)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform4ui, "glProgramUniform4ui",
+    EVENT(context, GLProgramUniform4ui,
           "context = %d, program = %u, location = %d, v0 = %u, v1 = %u, v2 = %u, v3 = %u",
           CID(context), program, location, v0, v1, v2, v3);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -24597,15 +24469,15 @@
                                                   GLuint v3)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform4uiEXT, "glProgramUniform4uiEXT",
+    EVENT(context, GLProgramUniform4uiEXT,
           "context = %d, program = %u, location = %d, v0 = %u, v1 = %u, v2 = %u, v3 = %u",
           CID(context), program, location, v0, v1, v2, v3);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -24630,15 +24502,15 @@
                                                 const GLuint *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform4uiv, "glProgramUniform4uiv",
+    EVENT(context, GLProgramUniform4uiv,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -24663,15 +24535,15 @@
                                                    const GLuint *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniform4uivEXT, "glProgramUniform4uivEXT",
+    EVENT(context, GLProgramUniform4uivEXT,
           "context = %d, program = %u, location = %d, count = %d, value = 0x%016" PRIxPTR "",
           CID(context), program, location, count, (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -24697,7 +24569,7 @@
                                                      const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix2fv, "glProgramUniformMatrix2fv",
+    EVENT(context, GLProgramUniformMatrix2fv,
           "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
           "0x%016" PRIxPTR "",
           CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
@@ -24705,8 +24577,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniformMatrix2fv(context, programPacked, locationPacked,
@@ -24733,7 +24605,7 @@
                                                         const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix2fvEXT, "glProgramUniformMatrix2fvEXT",
+    EVENT(context, GLProgramUniformMatrix2fvEXT,
           "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
           "0x%016" PRIxPTR "",
           CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
@@ -24741,8 +24613,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniformMatrix2fvEXT(
@@ -24769,7 +24641,7 @@
                                                        const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix2x3fv, "glProgramUniformMatrix2x3fv",
+    EVENT(context, GLProgramUniformMatrix2x3fv,
           "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
           "0x%016" PRIxPTR "",
           CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
@@ -24777,8 +24649,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniformMatrix2x3fv(
@@ -24805,7 +24677,7 @@
                                                           const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix2x3fvEXT, "glProgramUniformMatrix2x3fvEXT",
+    EVENT(context, GLProgramUniformMatrix2x3fvEXT,
           "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
           "0x%016" PRIxPTR "",
           CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
@@ -24813,8 +24685,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniformMatrix2x3fvEXT(
@@ -24841,7 +24713,7 @@
                                                        const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix2x4fv, "glProgramUniformMatrix2x4fv",
+    EVENT(context, GLProgramUniformMatrix2x4fv,
           "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
           "0x%016" PRIxPTR "",
           CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
@@ -24849,8 +24721,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniformMatrix2x4fv(
@@ -24877,7 +24749,7 @@
                                                           const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix2x4fvEXT, "glProgramUniformMatrix2x4fvEXT",
+    EVENT(context, GLProgramUniformMatrix2x4fvEXT,
           "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
           "0x%016" PRIxPTR "",
           CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
@@ -24885,8 +24757,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniformMatrix2x4fvEXT(
@@ -24913,7 +24785,7 @@
                                                      const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix3fv, "glProgramUniformMatrix3fv",
+    EVENT(context, GLProgramUniformMatrix3fv,
           "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
           "0x%016" PRIxPTR "",
           CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
@@ -24921,8 +24793,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniformMatrix3fv(context, programPacked, locationPacked,
@@ -24949,7 +24821,7 @@
                                                         const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix3fvEXT, "glProgramUniformMatrix3fvEXT",
+    EVENT(context, GLProgramUniformMatrix3fvEXT,
           "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
           "0x%016" PRIxPTR "",
           CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
@@ -24957,8 +24829,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniformMatrix3fvEXT(
@@ -24985,7 +24857,7 @@
                                                        const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix3x2fv, "glProgramUniformMatrix3x2fv",
+    EVENT(context, GLProgramUniformMatrix3x2fv,
           "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
           "0x%016" PRIxPTR "",
           CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
@@ -24993,8 +24865,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniformMatrix3x2fv(
@@ -25021,7 +24893,7 @@
                                                           const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix3x2fvEXT, "glProgramUniformMatrix3x2fvEXT",
+    EVENT(context, GLProgramUniformMatrix3x2fvEXT,
           "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
           "0x%016" PRIxPTR "",
           CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
@@ -25029,8 +24901,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniformMatrix3x2fvEXT(
@@ -25057,7 +24929,7 @@
                                                        const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix3x4fv, "glProgramUniformMatrix3x4fv",
+    EVENT(context, GLProgramUniformMatrix3x4fv,
           "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
           "0x%016" PRIxPTR "",
           CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
@@ -25065,8 +24937,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniformMatrix3x4fv(
@@ -25093,7 +24965,7 @@
                                                           const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix3x4fvEXT, "glProgramUniformMatrix3x4fvEXT",
+    EVENT(context, GLProgramUniformMatrix3x4fvEXT,
           "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
           "0x%016" PRIxPTR "",
           CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
@@ -25101,8 +24973,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniformMatrix3x4fvEXT(
@@ -25129,7 +25001,7 @@
                                                      const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix4fv, "glProgramUniformMatrix4fv",
+    EVENT(context, GLProgramUniformMatrix4fv,
           "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
           "0x%016" PRIxPTR "",
           CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
@@ -25137,8 +25009,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniformMatrix4fv(context, programPacked, locationPacked,
@@ -25165,7 +25037,7 @@
                                                         const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix4fvEXT, "glProgramUniformMatrix4fvEXT",
+    EVENT(context, GLProgramUniformMatrix4fvEXT,
           "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
           "0x%016" PRIxPTR "",
           CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
@@ -25173,8 +25045,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniformMatrix4fvEXT(
@@ -25201,7 +25073,7 @@
                                                        const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix4x2fv, "glProgramUniformMatrix4x2fv",
+    EVENT(context, GLProgramUniformMatrix4x2fv,
           "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
           "0x%016" PRIxPTR "",
           CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
@@ -25209,8 +25081,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniformMatrix4x2fv(
@@ -25237,7 +25109,7 @@
                                                           const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix4x2fvEXT, "glProgramUniformMatrix4x2fvEXT",
+    EVENT(context, GLProgramUniformMatrix4x2fvEXT,
           "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
           "0x%016" PRIxPTR "",
           CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
@@ -25245,8 +25117,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniformMatrix4x2fvEXT(
@@ -25273,7 +25145,7 @@
                                                        const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix4x3fv, "glProgramUniformMatrix4x3fv",
+    EVENT(context, GLProgramUniformMatrix4x3fv,
           "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
           "0x%016" PRIxPTR "",
           CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
@@ -25281,8 +25153,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniformMatrix4x3fv(
@@ -25309,7 +25181,7 @@
                                                           const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProgramUniformMatrix4x3fvEXT, "glProgramUniformMatrix4x3fvEXT",
+    EVENT(context, GLProgramUniformMatrix4x3fvEXT,
           "context = %d, program = %u, location = %d, count = %d, transpose = %s, value = "
           "0x%016" PRIxPTR "",
           CID(context), program, location, count, GLbooleanToString(transpose), (uintptr_t)value);
@@ -25317,8 +25189,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateProgramUniformMatrix4x3fvEXT(
@@ -25344,7 +25216,7 @@
                                             const GLchar *message)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::PushDebugGroup, "glPushDebugGroup",
+    EVENT(context, GLPushDebugGroup,
           "context = %d, source = %s, id = %u, length = %d, message = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DebugSource, source), id, length,
           (uintptr_t)message);
@@ -25374,7 +25246,7 @@
                                                const GLchar *message)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::PushDebugGroupKHR, "glPushDebugGroupKHR",
+    EVENT(context, GLPushDebugGroupKHR,
           "context = %d, source = %s, id = %u, length = %d, message = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DebugSource, source), id, length,
           (uintptr_t)message);
@@ -25404,8 +25276,8 @@
     Context *context = static_cast<gl::Context *>(ctx);
     // Don't run the EVENT() macro on the EXT_debug_marker entry points.
     // It can interfere with the debug events being set by the caller.
-    // EVENT(context, gl::EntryPoint::PushGroupMarkerEXT, "glPushGroupMarkerEXT", "context = %d,
-    // length = %d, marker = 0x%016" PRIxPTR "", CID(context), length, (uintptr_t)marker);
+    // EVENT(context, GLPushGroupMarkerEXT, "context = %d, length = %d, marker = 0x%016" PRIxPTR "",
+    // CID(context), length, (uintptr_t)marker);
 
     if (context && !context->isContextLost())
     {
@@ -25428,7 +25300,7 @@
 void GL_APIENTRY PushMatrixContextANGLE(GLeglContext ctx)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::PushMatrix, "glPushMatrix", "context = %d", CID(context));
+    EVENT(context, GLPushMatrix, "context = %d", CID(context));
 
     if (context && !context->isContextLost())
     {
@@ -25450,15 +25322,14 @@
 void GL_APIENTRY QueryCounterEXTContextANGLE(GLeglContext ctx, GLuint id, GLenum target)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::QueryCounterEXT, "glQueryCounterEXT",
-          "context = %d, id = %u, target = %s", CID(context), id,
+    EVENT(context, GLQueryCounterEXT, "context = %d, id = %u, target = %s", CID(context), id,
           GLenumToString(GLenumGroup::QueryTarget, target));
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        QueryID idPacked                                      = FromGL<QueryID>(id);
-        QueryType targetPacked                                = FromGL<QueryType>(target);
+        QueryID idPacked                                      = PackParam<QueryID>(id);
+        QueryType targetPacked                                = PackParam<QueryType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateQueryCounterEXT(context, idPacked, targetPacked));
@@ -25479,7 +25350,7 @@
                                                    GLint *exponent)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::QueryMatrixxOES, "glQueryMatrixxOES",
+    EVENT(context, GLQueryMatrixxOES,
           "context = %d, mantissa = 0x%016" PRIxPTR ", exponent = 0x%016" PRIxPTR "", CID(context),
           (uintptr_t)mantissa, (uintptr_t)exponent);
 
@@ -25496,14 +25367,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::QueryMatrixxOES, GLbitfield>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLQueryMatrixxOES, GLbitfield>();
         }
         ANGLE_CAPTURE(QueryMatrixxOES, isCallValid, context, mantissa, exponent, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::QueryMatrixxOES, GLbitfield>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLQueryMatrixxOES, GLbitfield>();
     }
     return returnValue;
 }
@@ -25511,8 +25382,8 @@
 void GL_APIENTRY ReadBufferContextANGLE(GLeglContext ctx, GLenum src)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ReadBuffer, "glReadBuffer", "context = %d, src = %s",
-          CID(context), GLenumToString(GLenumGroup::ReadBufferMode, src));
+    EVENT(context, GLReadBuffer, "context = %d, src = %s", CID(context),
+          GLenumToString(GLenumGroup::ReadBufferMode, src));
 
     if (context && !context->isContextLost())
     {
@@ -25541,7 +25412,7 @@
                                         void *pixels)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ReadPixels, "glReadPixels",
+    EVENT(context, GLReadPixels,
           "context = %d, x = %d, y = %d, width = %d, height = %d, format = %s, type = %s, pixels = "
           "0x%016" PRIxPTR "",
           CID(context), x, y, width, height, GLenumToString(GLenumGroup::PixelFormat, format),
@@ -25576,7 +25447,7 @@
                                          void *data)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ReadnPixels, "glReadnPixels",
+    EVENT(context, GLReadnPixels,
           "context = %d, x = %d, y = %d, width = %d, height = %d, format = %s, type = %s, bufSize "
           "= %d, data = 0x%016" PRIxPTR "",
           CID(context), x, y, width, height, GLenumToString(GLenumGroup::PixelFormat, format),
@@ -25613,7 +25484,7 @@
                                             void *data)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ReadnPixelsEXT, "glReadnPixelsEXT",
+    EVENT(context, GLReadnPixelsEXT,
           "context = %d, x = %d, y = %d, width = %d, height = %d, format = %s, type = %s, bufSize "
           "= %d, data = 0x%016" PRIxPTR "",
           CID(context), x, y, width, height, GLenumToString(GLenumGroup::PixelFormat, format),
@@ -25642,8 +25513,7 @@
 void GL_APIENTRY ReleaseShaderCompilerContextANGLE(GLeglContext ctx)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ReleaseShaderCompiler, "glReleaseShaderCompiler", "context = %d",
-          CID(context));
+    EVENT(context, GLReleaseShaderCompiler, "context = %d", CID(context));
 
     if (context && !context->isContextLost())
     {
@@ -25669,7 +25539,7 @@
                                                  GLsizei height)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::RenderbufferStorage, "glRenderbufferStorage",
+    EVENT(context, GLRenderbufferStorage,
           "context = %d, target = %s, internalformat = %s, width = %d, height = %d", CID(context),
           GLenumToString(GLenumGroup::RenderbufferTarget, target),
           GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height);
@@ -25702,8 +25572,7 @@
                                                             GLsizei height)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::RenderbufferStorageMultisample,
-          "glRenderbufferStorageMultisample",
+    EVENT(context, GLRenderbufferStorageMultisample,
           "context = %d, target = %s, samples = %d, internalformat = %s, width = %d, height = %d",
           CID(context), GLenumToString(GLenumGroup::RenderbufferTarget, target), samples,
           GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height);
@@ -25736,8 +25605,7 @@
                                                                  GLsizei height)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::RenderbufferStorageMultisampleANGLE,
-          "glRenderbufferStorageMultisampleANGLE",
+    EVENT(context, GLRenderbufferStorageMultisampleANGLE,
           "context = %d, target = %s, samples = %d, internalformat = %s, width = %d, height = %d",
           CID(context), GLenumToString(GLenumGroup::RenderbufferTarget, target), samples,
           GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height);
@@ -25770,8 +25638,7 @@
                                                                GLsizei height)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::RenderbufferStorageMultisampleEXT,
-          "glRenderbufferStorageMultisampleEXT",
+    EVENT(context, GLRenderbufferStorageMultisampleEXT,
           "context = %d, target = %s, samples = %d, internalformat = %s, width = %d, height = %d",
           CID(context), GLenumToString(GLenumGroup::RenderbufferTarget, target), samples,
           GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height);
@@ -25804,7 +25671,7 @@
                                                     GLsizei height)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::RenderbufferStorageOES, "glRenderbufferStorageOES",
+    EVENT(context, GLRenderbufferStorageOES,
           "context = %d, target = %s, internalformat = %s, width = %d, height = %d", CID(context),
           GLenumToString(GLenumGroup::RenderbufferTarget, target),
           GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height);
@@ -25832,8 +25699,7 @@
 void GL_APIENTRY ResumeTransformFeedbackContextANGLE(GLeglContext ctx)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ResumeTransformFeedback, "glResumeTransformFeedback",
-          "context = %d", CID(context));
+    EVENT(context, GLResumeTransformFeedback, "context = %d", CID(context));
 
     if (context && !context->isContextLost())
     {
@@ -25856,8 +25722,8 @@
 RotatefContextANGLE(GLeglContext ctx, GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Rotatef, "glRotatef",
-          "context = %d, angle = %f, x = %f, y = %f, z = %f", CID(context), angle, x, y, z);
+    EVENT(context, GLRotatef, "context = %d, angle = %f, x = %f, y = %f, z = %f", CID(context),
+          angle, x, y, z);
 
     if (context && !context->isContextLost())
     {
@@ -25880,8 +25746,8 @@
 RotatexContextANGLE(GLeglContext ctx, GLfixed angle, GLfixed x, GLfixed y, GLfixed z)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Rotatex, "glRotatex",
-          "context = %d, angle = 0x%X, x = 0x%X, y = 0x%X, z = 0x%X", CID(context), angle, x, y, z);
+    EVENT(context, GLRotatex, "context = %d, angle = 0x%X, x = 0x%X, y = 0x%X, z = 0x%X",
+          CID(context), angle, x, y, z);
 
     if (context && !context->isContextLost())
     {
@@ -25903,8 +25769,8 @@
 void GL_APIENTRY SampleCoverageContextANGLE(GLeglContext ctx, GLfloat value, GLboolean invert)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::SampleCoverage, "glSampleCoverage",
-          "context = %d, value = %f, invert = %s", CID(context), value, GLbooleanToString(invert));
+    EVENT(context, GLSampleCoverage, "context = %d, value = %f, invert = %s", CID(context), value,
+          GLbooleanToString(invert));
 
     if (context && !context->isContextLost())
     {
@@ -25927,9 +25793,8 @@
 void GL_APIENTRY SampleCoveragexContextANGLE(GLeglContext ctx, GLclampx value, GLboolean invert)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::SampleCoveragex, "glSampleCoveragex",
-          "context = %d, value = 0x%X, invert = %s", CID(context), value,
-          GLbooleanToString(invert));
+    EVENT(context, GLSampleCoveragex, "context = %d, value = 0x%X, invert = %s", CID(context),
+          value, GLbooleanToString(invert));
 
     if (context && !context->isContextLost())
     {
@@ -25952,9 +25817,8 @@
 void GL_APIENTRY SampleMaskiContextANGLE(GLeglContext ctx, GLuint maskNumber, GLbitfield mask)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::SampleMaski, "glSampleMaski",
-          "context = %d, maskNumber = %u, mask = %s", CID(context), maskNumber,
-          GLbitfieldToString(GLenumGroup::DefaultGroup, mask).c_str());
+    EVENT(context, GLSampleMaski, "context = %d, maskNumber = %u, mask = %s", CID(context),
+          maskNumber, GLbitfieldToString(GLenumGroup::DefaultGroup, mask).c_str());
 
     if (context && !context->isContextLost())
     {
@@ -25980,14 +25844,14 @@
                                                  const GLint *param)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::SamplerParameterIiv, "glSamplerParameterIiv",
+    EVENT(context, GLSamplerParameterIiv,
           "context = %d, sampler = %u, pname = %s, param = 0x%016" PRIxPTR "", CID(context),
           sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)param);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateSamplerParameterIiv(context, samplerPacked, pname, param));
@@ -26009,14 +25873,14 @@
                                                     const GLint *param)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::SamplerParameterIivOES, "glSamplerParameterIivOES",
+    EVENT(context, GLSamplerParameterIivOES,
           "context = %d, sampler = %u, pname = %s, param = 0x%016" PRIxPTR "", CID(context),
           sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)param);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateSamplerParameterIivOES(context, samplerPacked, pname, param));
@@ -26038,14 +25902,14 @@
                                                   const GLuint *param)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::SamplerParameterIuiv, "glSamplerParameterIuiv",
+    EVENT(context, GLSamplerParameterIuiv,
           "context = %d, sampler = %u, pname = %s, param = 0x%016" PRIxPTR "", CID(context),
           sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)param);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateSamplerParameterIuiv(context, samplerPacked, pname, param));
@@ -26067,14 +25931,14 @@
                                                      const GLuint *param)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::SamplerParameterIuivOES, "glSamplerParameterIuivOES",
+    EVENT(context, GLSamplerParameterIuivOES,
           "context = %d, sampler = %u, pname = %s, param = 0x%016" PRIxPTR "", CID(context),
           sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)param);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateSamplerParameterIuivOES(context, samplerPacked, pname, param));
@@ -26096,14 +25960,13 @@
                                                GLfloat param)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::SamplerParameterf, "glSamplerParameterf",
-          "context = %d, sampler = %u, pname = %s, param = %f", CID(context), sampler,
-          GLenumToString(GLenumGroup::SamplerParameterName, pname), param);
+    EVENT(context, GLSamplerParameterf, "context = %d, sampler = %u, pname = %s, param = %f",
+          CID(context), sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), param);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateSamplerParameterf(context, samplerPacked, pname, param));
@@ -26125,14 +25988,14 @@
                                                 const GLfloat *param)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::SamplerParameterfv, "glSamplerParameterfv",
+    EVENT(context, GLSamplerParameterfv,
           "context = %d, sampler = %u, pname = %s, param = 0x%016" PRIxPTR "", CID(context),
           sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)param);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateSamplerParameterfv(context, samplerPacked, pname, param));
@@ -26154,14 +26017,13 @@
                                                GLint param)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::SamplerParameteri, "glSamplerParameteri",
-          "context = %d, sampler = %u, pname = %s, param = %d", CID(context), sampler,
-          GLenumToString(GLenumGroup::SamplerParameterName, pname), param);
+    EVENT(context, GLSamplerParameteri, "context = %d, sampler = %u, pname = %s, param = %d",
+          CID(context), sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), param);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateSamplerParameteri(context, samplerPacked, pname, param));
@@ -26183,14 +26045,14 @@
                                                 const GLint *param)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::SamplerParameteriv, "glSamplerParameteriv",
+    EVENT(context, GLSamplerParameteriv,
           "context = %d, sampler = %u, pname = %s, param = 0x%016" PRIxPTR "", CID(context),
           sampler, GLenumToString(GLenumGroup::SamplerParameterName, pname), (uintptr_t)param);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateSamplerParameteriv(context, samplerPacked, pname, param));
@@ -26209,8 +26071,7 @@
 void GL_APIENTRY ScalefContextANGLE(GLeglContext ctx, GLfloat x, GLfloat y, GLfloat z)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Scalef, "glScalef", "context = %d, x = %f, y = %f, z = %f",
-          CID(context), x, y, z);
+    EVENT(context, GLScalef, "context = %d, x = %f, y = %f, z = %f", CID(context), x, y, z);
 
     if (context && !context->isContextLost())
     {
@@ -26232,8 +26093,7 @@
 void GL_APIENTRY ScalexContextANGLE(GLeglContext ctx, GLfixed x, GLfixed y, GLfixed z)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Scalex, "glScalex", "context = %d, x = 0x%X, y = 0x%X, z = 0x%X",
-          CID(context), x, y, z);
+    EVENT(context, GLScalex, "context = %d, x = 0x%X, y = 0x%X, z = 0x%X", CID(context), x, y, z);
 
     if (context && !context->isContextLost())
     {
@@ -26256,9 +26116,8 @@
 ScissorContextANGLE(GLeglContext ctx, GLint x, GLint y, GLsizei width, GLsizei height)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Scissor, "glScissor",
-          "context = %d, x = %d, y = %d, width = %d, height = %d", CID(context), x, y, width,
-          height);
+    EVENT(context, GLScissor, "context = %d, x = %d, y = %d, width = %d, height = %d", CID(context),
+          x, y, width, height);
 
     if (context && !context->isContextLost())
     {
@@ -26284,14 +26143,14 @@
                                                         const GLuint64 *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::SemaphoreParameterui64vEXT, "glSemaphoreParameterui64vEXT",
+    EVENT(context, GLSemaphoreParameterui64vEXT,
           "context = %d, semaphore = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           semaphore, GLenumToString(GLenumGroup::SemaphoreParameterName, pname), (uintptr_t)params);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        SemaphoreID semaphorePacked                           = FromGL<SemaphoreID>(semaphore);
+        SemaphoreID semaphorePacked                           = PackParam<SemaphoreID>(semaphore);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -26312,14 +26171,13 @@
 void GL_APIENTRY SetFenceNVContextANGLE(GLeglContext ctx, GLuint fence, GLenum condition)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::SetFenceNV, "glSetFenceNV",
-          "context = %d, fence = %u, condition = %s", CID(context), fence,
+    EVENT(context, GLSetFenceNV, "context = %d, fence = %u, condition = %s", CID(context), fence,
           GLenumToString(GLenumGroup::DefaultGroup, condition));
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        FenceNVID fencePacked                                 = FromGL<FenceNVID>(fence);
+        FenceNVID fencePacked                                 = PackParam<FenceNVID>(fence);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateSetFenceNV(context, fencePacked, condition));
@@ -26338,13 +26196,13 @@
 void GL_APIENTRY ShadeModelContextANGLE(GLeglContext ctx, GLenum mode)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ShadeModel, "glShadeModel", "context = %d, mode = %s",
-          CID(context), GLenumToString(GLenumGroup::ShadingModel, mode));
+    EVENT(context, GLShadeModel, "context = %d, mode = %s", CID(context),
+          GLenumToString(GLenumGroup::ShadingModel, mode));
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShadingModel modePacked                               = FromGL<ShadingModel>(mode);
+        ShadingModel modePacked                               = PackParam<ShadingModel>(mode);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateShadeModel(context, modePacked));
         if (isCallValid)
@@ -26367,7 +26225,7 @@
                                           GLsizei length)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ShaderBinary, "glShaderBinary",
+    EVENT(context, GLShaderBinary,
           "context = %d, count = %d, shaders = 0x%016" PRIxPTR
           ", binaryformat = %s, binary = 0x%016" PRIxPTR ", length = %d",
           CID(context), count, (uintptr_t)shaders,
@@ -26376,7 +26234,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        const ShaderProgramID *shadersPacked = FromGL<const ShaderProgramID *>(shaders);
+        const ShaderProgramID *shadersPacked = PackParam<const ShaderProgramID *>(shaders);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -26401,7 +26259,7 @@
                                           const GLint *length)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ShaderSource, "glShaderSource",
+    EVENT(context, GLShaderSource,
           "context = %d, shader = %u, count = %d, string = 0x%016" PRIxPTR
           ", length = 0x%016" PRIxPTR "",
           CID(context), shader, count, (uintptr_t)string, (uintptr_t)length);
@@ -26409,7 +26267,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID shaderPacked                          = FromGL<ShaderProgramID>(shader);
+        ShaderProgramID shaderPacked                          = PackParam<ShaderProgramID>(shader);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateShaderSource(context, shaderPacked, count, string, length));
@@ -26434,7 +26292,7 @@
                                                 const GLenum *dstLayouts)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::SignalSemaphoreEXT, "glSignalSemaphoreEXT",
+    EVENT(context, GLSignalSemaphoreEXT,
           "context = %d, semaphore = %u, numBufferBarriers = %u, buffers = 0x%016" PRIxPTR
           ", numTextureBarriers = %u, textures = 0x%016" PRIxPTR ", dstLayouts = 0x%016" PRIxPTR "",
           CID(context), semaphore, numBufferBarriers, (uintptr_t)buffers, numTextureBarriers,
@@ -26443,9 +26301,9 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        SemaphoreID semaphorePacked                           = FromGL<SemaphoreID>(semaphore);
-        const BufferID *buffersPacked                         = FromGL<const BufferID *>(buffers);
-        const TextureID *texturesPacked                       = FromGL<const TextureID *>(textures);
+        SemaphoreID semaphorePacked     = PackParam<SemaphoreID>(semaphore);
+        const BufferID *buffersPacked   = PackParam<const BufferID *>(buffers);
+        const TextureID *texturesPacked = PackParam<const TextureID *>(textures);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -26468,8 +26326,7 @@
 void GL_APIENTRY StencilFuncContextANGLE(GLeglContext ctx, GLenum func, GLint ref, GLuint mask)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::StencilFunc, "glStencilFunc",
-          "context = %d, func = %s, ref = %d, mask = %u", CID(context),
+    EVENT(context, GLStencilFunc, "context = %d, func = %s, ref = %d, mask = %u", CID(context),
           GLenumToString(GLenumGroup::StencilFunction, func), ref, mask);
 
     if (context && !context->isContextLost())
@@ -26494,9 +26351,8 @@
 StencilFuncSeparateContextANGLE(GLeglContext ctx, GLenum face, GLenum func, GLint ref, GLuint mask)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::StencilFuncSeparate, "glStencilFuncSeparate",
-          "context = %d, face = %s, func = %s, ref = %d, mask = %u", CID(context),
-          GLenumToString(GLenumGroup::StencilFaceDirection, face),
+    EVENT(context, GLStencilFuncSeparate, "context = %d, face = %s, func = %s, ref = %d, mask = %u",
+          CID(context), GLenumToString(GLenumGroup::StencilFaceDirection, face),
           GLenumToString(GLenumGroup::StencilFunction, func), ref, mask);
 
     if (context && !context->isContextLost())
@@ -26520,8 +26376,7 @@
 void GL_APIENTRY StencilMaskContextANGLE(GLeglContext ctx, GLuint mask)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::StencilMask, "glStencilMask", "context = %d, mask = %u",
-          CID(context), mask);
+    EVENT(context, GLStencilMask, "context = %d, mask = %u", CID(context), mask);
 
     if (context && !context->isContextLost())
     {
@@ -26543,8 +26398,7 @@
 void GL_APIENTRY StencilMaskSeparateContextANGLE(GLeglContext ctx, GLenum face, GLuint mask)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::StencilMaskSeparate, "glStencilMaskSeparate",
-          "context = %d, face = %s, mask = %u", CID(context),
+    EVENT(context, GLStencilMaskSeparate, "context = %d, face = %s, mask = %u", CID(context),
           GLenumToString(GLenumGroup::StencilFaceDirection, face), mask);
 
     if (context && !context->isContextLost())
@@ -26568,8 +26422,7 @@
 void GL_APIENTRY StencilOpContextANGLE(GLeglContext ctx, GLenum fail, GLenum zfail, GLenum zpass)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::StencilOp, "glStencilOp",
-          "context = %d, fail = %s, zfail = %s, zpass = %s", CID(context),
+    EVENT(context, GLStencilOp, "context = %d, fail = %s, zfail = %s, zpass = %s", CID(context),
           GLenumToString(GLenumGroup::StencilOp, fail),
           GLenumToString(GLenumGroup::StencilOp, zfail),
           GLenumToString(GLenumGroup::StencilOp, zpass));
@@ -26599,7 +26452,7 @@
                                                GLenum dppass)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::StencilOpSeparate, "glStencilOpSeparate",
+    EVENT(context, GLStencilOpSeparate,
           "context = %d, face = %s, sfail = %s, dpfail = %s, dppass = %s", CID(context),
           GLenumToString(GLenumGroup::StencilFaceDirection, face),
           GLenumToString(GLenumGroup::StencilOp, sfail),
@@ -26627,14 +26480,13 @@
 GLboolean GL_APIENTRY TestFenceNVContextANGLE(GLeglContext ctx, GLuint fence)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TestFenceNV, "glTestFenceNV", "context = %d, fence = %u",
-          CID(context), fence);
+    EVENT(context, GLTestFenceNV, "context = %d, fence = %u", CID(context), fence);
 
     GLboolean returnValue;
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        FenceNVID fencePacked                                 = FromGL<FenceNVID>(fence);
+        FenceNVID fencePacked                                 = PackParam<FenceNVID>(fence);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid = (context->skipValidation() || ValidateTestFenceNV(context, fencePacked));
         if (isCallValid)
@@ -26643,14 +26495,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::TestFenceNV, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLTestFenceNV, GLboolean>();
         }
         ANGLE_CAPTURE(TestFenceNV, isCallValid, context, fencePacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::TestFenceNV, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLTestFenceNV, GLboolean>();
     }
     return returnValue;
 }
@@ -26661,16 +26513,15 @@
                                        GLuint buffer)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexBuffer, "glTexBuffer",
-          "context = %d, target = %s, internalformat = %s, buffer = %u", CID(context),
-          GLenumToString(GLenumGroup::TextureTarget, target),
+    EVENT(context, GLTexBuffer, "context = %d, target = %s, internalformat = %s, buffer = %u",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::InternalFormat, internalformat), buffer);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexBuffer(context, targetPacked, internalformat, bufferPacked));
@@ -26692,16 +26543,15 @@
                                           GLuint buffer)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexBufferEXT, "glTexBufferEXT",
-          "context = %d, target = %s, internalformat = %s, buffer = %u", CID(context),
-          GLenumToString(GLenumGroup::TextureTarget, target),
+    EVENT(context, GLTexBufferEXT, "context = %d, target = %s, internalformat = %s, buffer = %u",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::InternalFormat, internalformat), buffer);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -26725,16 +26575,15 @@
                                           GLuint buffer)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexBufferOES, "glTexBufferOES",
-          "context = %d, target = %s, internalformat = %s, buffer = %u", CID(context),
-          GLenumToString(GLenumGroup::TextureTarget, target),
+    EVENT(context, GLTexBufferOES, "context = %d, target = %s, internalformat = %s, buffer = %u",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::InternalFormat, internalformat), buffer);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -26760,7 +26609,7 @@
                                             GLsizeiptr size)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexBufferRange, "glTexBufferRange",
+    EVENT(context, GLTexBufferRange,
           "context = %d, target = %s, internalformat = %s, buffer = %u, offset = %llu, size = %llu",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::InternalFormat, internalformat), buffer,
@@ -26769,8 +26618,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexBufferRange(context, targetPacked, internalformat,
@@ -26796,7 +26645,7 @@
                                                GLsizeiptr size)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexBufferRangeEXT, "glTexBufferRangeEXT",
+    EVENT(context, GLTexBufferRangeEXT,
           "context = %d, target = %s, internalformat = %s, buffer = %u, offset = %llu, size = %llu",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::InternalFormat, internalformat), buffer,
@@ -26805,8 +26654,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexBufferRangeEXT(context, targetPacked, internalformat,
@@ -26832,7 +26681,7 @@
                                                GLsizeiptr size)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexBufferRangeOES, "glTexBufferRangeOES",
+    EVENT(context, GLTexBufferRangeOES,
           "context = %d, target = %s, internalformat = %s, buffer = %u, offset = %llu, size = %llu",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::InternalFormat, internalformat), buffer,
@@ -26841,8 +26690,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        BufferID bufferPacked                                 = FromGL<BufferID>(buffer);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        BufferID bufferPacked                                 = PackParam<BufferID>(buffer);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexBufferRangeOES(context, targetPacked, internalformat,
@@ -26867,7 +26716,7 @@
                                              const void *pointer)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexCoordPointer, "glTexCoordPointer",
+    EVENT(context, GLTexCoordPointer,
           "context = %d, size = %d, type = %s, stride = %d, pointer = 0x%016" PRIxPTR "",
           CID(context), size, GLenumToString(GLenumGroup::TexCoordPointerType, type), stride,
           (uintptr_t)pointer);
@@ -26875,7 +26724,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        VertexAttribType typePacked                           = FromGL<VertexAttribType>(type);
+        VertexAttribType typePacked                           = PackParam<VertexAttribType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexCoordPointer(context, size, typePacked, stride, pointer));
@@ -26894,16 +26743,15 @@
 void GL_APIENTRY TexEnvfContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLfloat param)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexEnvf, "glTexEnvf",
-          "context = %d, target = %s, pname = %s, param = %f", CID(context),
+    EVENT(context, GLTexEnvf, "context = %d, target = %s, pname = %s, param = %f", CID(context),
           GLenumToString(GLenumGroup::TextureEnvTarget, target),
           GLenumToString(GLenumGroup::TextureEnvParameter, pname), param);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureEnvTarget targetPacked                         = FromGL<TextureEnvTarget>(target);
-        TextureEnvParameter pnamePacked                       = FromGL<TextureEnvParameter>(pname);
+        TextureEnvTarget targetPacked   = PackParam<TextureEnvTarget>(target);
+        TextureEnvParameter pnamePacked = PackParam<TextureEnvParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexEnvf(context, targetPacked, pnamePacked, param));
@@ -26925,16 +26773,15 @@
                                       const GLfloat *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexEnvfv, "glTexEnvfv",
-          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureEnvTarget, target),
+    EVENT(context, GLTexEnvfv, "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureEnvTarget, target),
           GLenumToString(GLenumGroup::TextureEnvParameter, pname), (uintptr_t)params);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureEnvTarget targetPacked                         = FromGL<TextureEnvTarget>(target);
-        TextureEnvParameter pnamePacked                       = FromGL<TextureEnvParameter>(pname);
+        TextureEnvTarget targetPacked   = PackParam<TextureEnvTarget>(target);
+        TextureEnvParameter pnamePacked = PackParam<TextureEnvParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexEnvfv(context, targetPacked, pnamePacked, params));
@@ -26953,16 +26800,15 @@
 void GL_APIENTRY TexEnviContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLint param)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexEnvi, "glTexEnvi",
-          "context = %d, target = %s, pname = %s, param = %d", CID(context),
+    EVENT(context, GLTexEnvi, "context = %d, target = %s, pname = %s, param = %d", CID(context),
           GLenumToString(GLenumGroup::TextureEnvTarget, target),
           GLenumToString(GLenumGroup::TextureEnvParameter, pname), param);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureEnvTarget targetPacked                         = FromGL<TextureEnvTarget>(target);
-        TextureEnvParameter pnamePacked                       = FromGL<TextureEnvParameter>(pname);
+        TextureEnvTarget targetPacked   = PackParam<TextureEnvTarget>(target);
+        TextureEnvParameter pnamePacked = PackParam<TextureEnvParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexEnvi(context, targetPacked, pnamePacked, param));
@@ -26984,16 +26830,15 @@
                                       const GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexEnviv, "glTexEnviv",
-          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureEnvTarget, target),
+    EVENT(context, GLTexEnviv, "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureEnvTarget, target),
           GLenumToString(GLenumGroup::TextureEnvParameter, pname), (uintptr_t)params);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureEnvTarget targetPacked                         = FromGL<TextureEnvTarget>(target);
-        TextureEnvParameter pnamePacked                       = FromGL<TextureEnvParameter>(pname);
+        TextureEnvTarget targetPacked   = PackParam<TextureEnvTarget>(target);
+        TextureEnvParameter pnamePacked = PackParam<TextureEnvParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexEnviv(context, targetPacked, pnamePacked, params));
@@ -27012,16 +26857,15 @@
 void GL_APIENTRY TexEnvxContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLfixed param)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexEnvx, "glTexEnvx",
-          "context = %d, target = %s, pname = %s, param = 0x%X", CID(context),
+    EVENT(context, GLTexEnvx, "context = %d, target = %s, pname = %s, param = 0x%X", CID(context),
           GLenumToString(GLenumGroup::TextureEnvTarget, target),
           GLenumToString(GLenumGroup::TextureEnvParameter, pname), param);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureEnvTarget targetPacked                         = FromGL<TextureEnvTarget>(target);
-        TextureEnvParameter pnamePacked                       = FromGL<TextureEnvParameter>(pname);
+        TextureEnvTarget targetPacked   = PackParam<TextureEnvTarget>(target);
+        TextureEnvParameter pnamePacked = PackParam<TextureEnvParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexEnvx(context, targetPacked, pnamePacked, param));
@@ -27043,16 +26887,15 @@
                                       const GLfixed *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexEnvxv, "glTexEnvxv",
-          "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
-          GLenumToString(GLenumGroup::TextureEnvTarget, target),
+    EVENT(context, GLTexEnvxv, "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::TextureEnvTarget, target),
           GLenumToString(GLenumGroup::TextureEnvParameter, pname), (uintptr_t)params);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureEnvTarget targetPacked                         = FromGL<TextureEnvTarget>(target);
-        TextureEnvParameter pnamePacked                       = FromGL<TextureEnvParameter>(pname);
+        TextureEnvTarget targetPacked   = PackParam<TextureEnvTarget>(target);
+        TextureEnvParameter pnamePacked = PackParam<TextureEnvParameter>(pname);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexEnvxv(context, targetPacked, pnamePacked, params));
@@ -27071,8 +26914,7 @@
 void GL_APIENTRY TexGenfOESContextANGLE(GLeglContext ctx, GLenum coord, GLenum pname, GLfloat param)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexGenfOES, "glTexGenfOES",
-          "context = %d, coord = %s, pname = %s, param = %f", CID(context),
+    EVENT(context, GLTexGenfOES, "context = %d, coord = %s, pname = %s, param = %f", CID(context),
           GLenumToString(GLenumGroup::TextureCoordName, coord),
           GLenumToString(GLenumGroup::TextureGenParameter, pname), param);
 
@@ -27100,7 +26942,7 @@
                                          const GLfloat *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexGenfvOES, "glTexGenfvOES",
+    EVENT(context, GLTexGenfvOES,
           "context = %d, coord = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureCoordName, coord),
           GLenumToString(GLenumGroup::TextureGenParameter, pname), (uintptr_t)params);
@@ -27126,8 +26968,7 @@
 void GL_APIENTRY TexGeniOESContextANGLE(GLeglContext ctx, GLenum coord, GLenum pname, GLint param)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexGeniOES, "glTexGeniOES",
-          "context = %d, coord = %s, pname = %s, param = %d", CID(context),
+    EVENT(context, GLTexGeniOES, "context = %d, coord = %s, pname = %s, param = %d", CID(context),
           GLenumToString(GLenumGroup::TextureCoordName, coord),
           GLenumToString(GLenumGroup::TextureGenParameter, pname), param);
 
@@ -27155,7 +26996,7 @@
                                          const GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexGenivOES, "glTexGenivOES",
+    EVENT(context, GLTexGenivOES,
           "context = %d, coord = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureCoordName, coord),
           GLenumToString(GLenumGroup::TextureGenParameter, pname), (uintptr_t)params);
@@ -27181,8 +27022,7 @@
 void GL_APIENTRY TexGenxOESContextANGLE(GLeglContext ctx, GLenum coord, GLenum pname, GLfixed param)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexGenxOES, "glTexGenxOES",
-          "context = %d, coord = %s, pname = %s, param = 0x%X", CID(context),
+    EVENT(context, GLTexGenxOES, "context = %d, coord = %s, pname = %s, param = 0x%X", CID(context),
           GLenumToString(GLenumGroup::TextureCoordName, coord),
           GLenumToString(GLenumGroup::TextureGenParameter, pname), param);
 
@@ -27210,7 +27050,7 @@
                                          const GLfixed *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexGenxvOES, "glTexGenxvOES",
+    EVENT(context, GLTexGenxvOES,
           "context = %d, coord = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureCoordName, coord),
           GLenumToString(GLenumGroup::TextureGenParameter, pname), (uintptr_t)params);
@@ -27245,7 +27085,7 @@
                                         const void *pixels)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexImage2D, "glTexImage2D",
+    EVENT(context, GLTexImage2D,
           "context = %d, target = %s, level = %d, internalformat = %d, width = %d, height = %d, "
           "border = %d, format = %s, type = %s, pixels = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, internalformat,
@@ -27255,7 +27095,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexImage2D(context, targetPacked, level, internalformat, width,
@@ -27287,7 +27127,7 @@
                                         const void *pixels)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexImage3D, "glTexImage3D",
+    EVENT(context, GLTexImage3D,
           "context = %d, target = %s, level = %d, internalformat = %d, width = %d, height = %d, "
           "depth = %d, border = %d, format = %s, type = %s, pixels = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, internalformat,
@@ -27297,7 +27137,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexImage3D(context, targetPacked, level, internalformat, width,
@@ -27329,7 +27169,7 @@
                                            const void *pixels)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexImage3DOES, "glTexImage3DOES",
+    EVENT(context, GLTexImage3DOES,
           "context = %d, target = %s, level = %d, internalformat = %s, width = %d, height = %d, "
           "depth = %d, border = %d, format = %s, type = %s, pixels = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level,
@@ -27340,7 +27180,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -27366,7 +27206,7 @@
                                              const GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexParameterIiv, "glTexParameterIiv",
+    EVENT(context, GLTexParameterIiv,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::TextureParameterName, pname), (uintptr_t)params);
@@ -27374,7 +27214,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexParameterIiv(context, targetPacked, pname, params));
@@ -27396,7 +27236,7 @@
                                                 const GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexParameterIivOES, "glTexParameterIivOES",
+    EVENT(context, GLTexParameterIivOES,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::TextureParameterName, pname), (uintptr_t)params);
@@ -27404,7 +27244,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexParameterIivOES(context, targetPacked, pname, params));
@@ -27426,7 +27266,7 @@
                                               const GLuint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexParameterIuiv, "glTexParameterIuiv",
+    EVENT(context, GLTexParameterIuiv,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::TextureParameterName, pname), (uintptr_t)params);
@@ -27434,7 +27274,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexParameterIuiv(context, targetPacked, pname, params));
@@ -27456,7 +27296,7 @@
                                                  const GLuint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexParameterIuivOES, "glTexParameterIuivOES",
+    EVENT(context, GLTexParameterIuivOES,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::TextureParameterName, pname), (uintptr_t)params);
@@ -27464,7 +27304,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexParameterIuivOES(context, targetPacked, pname, params));
@@ -27486,15 +27326,14 @@
                                            GLfloat param)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexParameterf, "glTexParameterf",
-          "context = %d, target = %s, pname = %s, param = %f", CID(context),
-          GLenumToString(GLenumGroup::TextureTarget, target),
+    EVENT(context, GLTexParameterf, "context = %d, target = %s, pname = %s, param = %f",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::TextureParameterName, pname), param);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexParameterf(context, targetPacked, pname, param));
@@ -27516,7 +27355,7 @@
                                             const GLfloat *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexParameterfv, "glTexParameterfv",
+    EVENT(context, GLTexParameterfv,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::TextureParameterName, pname), (uintptr_t)params);
@@ -27524,7 +27363,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexParameterfv(context, targetPacked, pname, params));
@@ -27546,15 +27385,14 @@
                                            GLint param)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexParameteri, "glTexParameteri",
-          "context = %d, target = %s, pname = %s, param = %d", CID(context),
-          GLenumToString(GLenumGroup::TextureTarget, target),
+    EVENT(context, GLTexParameteri, "context = %d, target = %s, pname = %s, param = %d",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::TextureParameterName, pname), param);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexParameteri(context, targetPacked, pname, param));
@@ -27576,7 +27414,7 @@
                                             const GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexParameteriv, "glTexParameteriv",
+    EVENT(context, GLTexParameteriv,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::TextureParameterName, pname), (uintptr_t)params);
@@ -27584,7 +27422,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexParameteriv(context, targetPacked, pname, params));
@@ -27606,15 +27444,14 @@
                                            GLfixed param)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexParameterx, "glTexParameterx",
-          "context = %d, target = %s, pname = %s, param = 0x%X", CID(context),
-          GLenumToString(GLenumGroup::TextureTarget, target),
+    EVENT(context, GLTexParameterx, "context = %d, target = %s, pname = %s, param = 0x%X",
+          CID(context), GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::GetTextureParameter, pname), param);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexParameterx(context, targetPacked, pname, param));
@@ -27636,7 +27473,7 @@
                                             const GLfixed *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexParameterxv, "glTexParameterxv",
+    EVENT(context, GLTexParameterxv,
           "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::TextureTarget, target),
           GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
@@ -27644,7 +27481,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexParameterxv(context, targetPacked, pname, params));
@@ -27667,7 +27504,7 @@
                                              GLsizei width)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexStorage1DEXT, "glTexStorage1DEXT",
+    EVENT(context, GLTexStorage1DEXT,
           "context = %d, target = %s, levels = %d, internalformat = %s, width = %d", CID(context),
           GLenumToString(GLenumGroup::TextureTarget, target), levels,
           GLenumToString(GLenumGroup::InternalFormat, internalformat), width);
@@ -27699,7 +27536,7 @@
                                           GLsizei height)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexStorage2D, "glTexStorage2D",
+    EVENT(context, GLTexStorage2D,
           "context = %d, target = %s, levels = %d, internalformat = %s, width = %d, height = %d",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), levels,
           GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height);
@@ -27707,7 +27544,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -27733,7 +27570,7 @@
                                              GLsizei height)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexStorage2DEXT, "glTexStorage2DEXT",
+    EVENT(context, GLTexStorage2DEXT,
           "context = %d, target = %s, levels = %d, internalformat = %s, width = %d, height = %d",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), levels,
           GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height);
@@ -27741,7 +27578,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -27768,7 +27605,7 @@
                                                      GLboolean fixedsamplelocations)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexStorage2DMultisample, "glTexStorage2DMultisample",
+    EVENT(context, GLTexStorage2DMultisample,
           "context = %d, target = %s, samples = %d, internalformat = %s, width = %d, height = %d, "
           "fixedsamplelocations = %s",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), samples,
@@ -27778,7 +27615,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -27807,7 +27644,7 @@
                                           GLsizei depth)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexStorage3D, "glTexStorage3D",
+    EVENT(context, GLTexStorage3D,
           "context = %d, target = %s, levels = %d, internalformat = %s, width = %d, height = %d, "
           "depth = %d",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), levels,
@@ -27816,7 +27653,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexStorage3D(context, targetPacked, levels, internalformat,
@@ -27843,7 +27680,7 @@
                                              GLsizei depth)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexStorage3DEXT, "glTexStorage3DEXT",
+    EVENT(context, GLTexStorage3DEXT,
           "context = %d, target = %s, levels = %d, internalformat = %s, width = %d, height = %d, "
           "depth = %d",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), levels,
@@ -27852,7 +27689,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexStorage3DEXT(context, targetPacked, levels, internalformat,
@@ -27880,7 +27717,7 @@
                                                      GLboolean fixedsamplelocations)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexStorage3DMultisample, "glTexStorage3DMultisample",
+    EVENT(context, GLTexStorage3DMultisample,
           "context = %d, target = %s, samples = %d, internalformat = %s, width = %d, height = %d, "
           "depth = %d, fixedsamplelocations = %s",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), samples,
@@ -27890,7 +27727,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -27920,7 +27757,7 @@
                                                         GLboolean fixedsamplelocations)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexStorage3DMultisampleOES, "glTexStorage3DMultisampleOES",
+    EVENT(context, GLTexStorage3DMultisampleOES,
           "context = %d, target = %s, samples = %d, internalformat = %s, width = %d, height = %d, "
           "depth = %d, fixedsamplelocations = %s",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), samples,
@@ -27930,7 +27767,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -27960,7 +27797,7 @@
                                                 GLuint64 offset)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexStorageMem2DEXT, "glTexStorageMem2DEXT",
+    EVENT(context, GLTexStorageMem2DEXT,
           "context = %d, target = %s, levels = %d, internalFormat = %s, width = %d, height = %d, "
           "memory = %u, offset = %llu",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), levels,
@@ -27970,8 +27807,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        MemoryObjectID memoryPacked                           = FromGL<MemoryObjectID>(memory);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        MemoryObjectID memoryPacked                           = PackParam<MemoryObjectID>(memory);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -28002,7 +27839,7 @@
                                                            GLuint64 offset)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexStorageMem2DMultisampleEXT, "glTexStorageMem2DMultisampleEXT",
+    EVENT(context, GLTexStorageMem2DMultisampleEXT,
           "context = %d, target = %s, samples = %d, internalFormat = %s, width = %d, height = %d, "
           "fixedSampleLocations = %s, memory = %u, offset = %llu",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), samples,
@@ -28012,8 +27849,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        MemoryObjectID memoryPacked                           = FromGL<MemoryObjectID>(memory);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        MemoryObjectID memoryPacked                           = PackParam<MemoryObjectID>(memory);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateTexStorageMem2DMultisampleEXT(
@@ -28044,7 +27881,7 @@
                                                 GLuint64 offset)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexStorageMem3DEXT, "glTexStorageMem3DEXT",
+    EVENT(context, GLTexStorageMem3DEXT,
           "context = %d, target = %s, levels = %d, internalFormat = %s, width = %d, height = %d, "
           "depth = %d, memory = %u, offset = %llu",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), levels,
@@ -28054,8 +27891,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        MemoryObjectID memoryPacked                           = FromGL<MemoryObjectID>(memory);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        MemoryObjectID memoryPacked                           = PackParam<MemoryObjectID>(memory);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -28087,7 +27924,7 @@
                                                            GLuint64 offset)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexStorageMem3DMultisampleEXT, "glTexStorageMem3DMultisampleEXT",
+    EVENT(context, GLTexStorageMem3DMultisampleEXT,
           "context = %d, target = %s, samples = %d, internalFormat = %s, width = %d, height = %d, "
           "depth = %d, fixedSampleLocations = %s, memory = %u, offset = %llu",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), samples,
@@ -28097,8 +27934,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        MemoryObjectID memoryPacked                           = FromGL<MemoryObjectID>(memory);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        MemoryObjectID memoryPacked                           = PackParam<MemoryObjectID>(memory);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexStorageMem3DMultisampleEXT(
@@ -28132,7 +27969,7 @@
                                            const void *pixels)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexSubImage2D, "glTexSubImage2D",
+    EVENT(context, GLTexSubImage2D,
           "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, width = %d, height = "
           "%d, format = %s, type = %s, pixels = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, xoffset, yoffset,
@@ -28142,7 +27979,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexSubImage2D(context, targetPacked, level, xoffset, yoffset,
@@ -28175,7 +28012,7 @@
                                            const void *pixels)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexSubImage3D, "glTexSubImage3D",
+    EVENT(context, GLTexSubImage3D,
           "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, width "
           "= %d, height = %d, depth = %d, format = %s, type = %s, pixels = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, xoffset, yoffset,
@@ -28185,7 +28022,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -28219,7 +28056,7 @@
                                               const void *pixels)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexSubImage3DOES, "glTexSubImage3DOES",
+    EVENT(context, GLTexSubImage3DOES,
           "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, width "
           "= %d, height = %d, depth = %d, format = %s, type = %s, pixels = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, xoffset, yoffset,
@@ -28229,7 +28066,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -28256,7 +28093,7 @@
                                                        GLenum bufferMode)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TransformFeedbackVaryings, "glTransformFeedbackVaryings",
+    EVENT(context, GLTransformFeedbackVaryings,
           "context = %d, program = %u, count = %d, varyings = 0x%016" PRIxPTR ", bufferMode = %s",
           CID(context), program, count, (uintptr_t)varyings,
           GLenumToString(GLenumGroup::DefaultGroup, bufferMode));
@@ -28264,7 +28101,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateTransformFeedbackVaryings(
@@ -28285,8 +28122,7 @@
 void GL_APIENTRY TranslatefContextANGLE(GLeglContext ctx, GLfloat x, GLfloat y, GLfloat z)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Translatef, "glTranslatef",
-          "context = %d, x = %f, y = %f, z = %f", CID(context), x, y, z);
+    EVENT(context, GLTranslatef, "context = %d, x = %f, y = %f, z = %f", CID(context), x, y, z);
 
     if (context && !context->isContextLost())
     {
@@ -28308,8 +28144,8 @@
 void GL_APIENTRY TranslatexContextANGLE(GLeglContext ctx, GLfixed x, GLfixed y, GLfixed z)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Translatex, "glTranslatex",
-          "context = %d, x = 0x%X, y = 0x%X, z = 0x%X", CID(context), x, y, z);
+    EVENT(context, GLTranslatex, "context = %d, x = 0x%X, y = 0x%X, z = 0x%X", CID(context), x, y,
+          z);
 
     if (context && !context->isContextLost())
     {
@@ -28331,13 +28167,12 @@
 void GL_APIENTRY Uniform1fContextANGLE(GLeglContext ctx, GLint location, GLfloat v0)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Uniform1f, "glUniform1f", "context = %d, location = %d, v0 = %f",
-          CID(context), location, v0);
+    EVENT(context, GLUniform1f, "context = %d, location = %d, v0 = %f", CID(context), location, v0);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateUniform1f(context, locationPacked, v0));
@@ -28359,14 +28194,14 @@
                                         const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Uniform1fv, "glUniform1fv",
+    EVENT(context, GLUniform1fv,
           "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
           location, count, (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform1fv(context, locationPacked, count, value));
@@ -28385,13 +28220,12 @@
 void GL_APIENTRY Uniform1iContextANGLE(GLeglContext ctx, GLint location, GLint v0)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Uniform1i, "glUniform1i", "context = %d, location = %d, v0 = %d",
-          CID(context), location, v0);
+    EVENT(context, GLUniform1i, "context = %d, location = %d, v0 = %d", CID(context), location, v0);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateUniform1i(context, locationPacked, v0));
@@ -28413,14 +28247,14 @@
                                         const GLint *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Uniform1iv, "glUniform1iv",
+    EVENT(context, GLUniform1iv,
           "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
           location, count, (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform1iv(context, locationPacked, count, value));
@@ -28439,13 +28273,13 @@
 void GL_APIENTRY Uniform1uiContextANGLE(GLeglContext ctx, GLint location, GLuint v0)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Uniform1ui, "glUniform1ui",
-          "context = %d, location = %d, v0 = %u", CID(context), location, v0);
+    EVENT(context, GLUniform1ui, "context = %d, location = %d, v0 = %u", CID(context), location,
+          v0);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateUniform1ui(context, locationPacked, v0));
@@ -28467,14 +28301,14 @@
                                          const GLuint *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Uniform1uiv, "glUniform1uiv",
+    EVENT(context, GLUniform1uiv,
           "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
           location, count, (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform1uiv(context, locationPacked, count, value));
@@ -28493,13 +28327,13 @@
 void GL_APIENTRY Uniform2fContextANGLE(GLeglContext ctx, GLint location, GLfloat v0, GLfloat v1)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Uniform2f, "glUniform2f",
-          "context = %d, location = %d, v0 = %f, v1 = %f", CID(context), location, v0, v1);
+    EVENT(context, GLUniform2f, "context = %d, location = %d, v0 = %f, v1 = %f", CID(context),
+          location, v0, v1);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateUniform2f(context, locationPacked, v0, v1));
@@ -28521,14 +28355,14 @@
                                         const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Uniform2fv, "glUniform2fv",
+    EVENT(context, GLUniform2fv,
           "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
           location, count, (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform2fv(context, locationPacked, count, value));
@@ -28547,13 +28381,13 @@
 void GL_APIENTRY Uniform2iContextANGLE(GLeglContext ctx, GLint location, GLint v0, GLint v1)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Uniform2i, "glUniform2i",
-          "context = %d, location = %d, v0 = %d, v1 = %d", CID(context), location, v0, v1);
+    EVENT(context, GLUniform2i, "context = %d, location = %d, v0 = %d, v1 = %d", CID(context),
+          location, v0, v1);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateUniform2i(context, locationPacked, v0, v1));
@@ -28575,14 +28409,14 @@
                                         const GLint *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Uniform2iv, "glUniform2iv",
+    EVENT(context, GLUniform2iv,
           "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
           location, count, (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform2iv(context, locationPacked, count, value));
@@ -28601,13 +28435,13 @@
 void GL_APIENTRY Uniform2uiContextANGLE(GLeglContext ctx, GLint location, GLuint v0, GLuint v1)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Uniform2ui, "glUniform2ui",
-          "context = %d, location = %d, v0 = %u, v1 = %u", CID(context), location, v0, v1);
+    EVENT(context, GLUniform2ui, "context = %d, location = %d, v0 = %u, v1 = %u", CID(context),
+          location, v0, v1);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateUniform2ui(context, locationPacked, v0, v1));
@@ -28629,14 +28463,14 @@
                                          const GLuint *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Uniform2uiv, "glUniform2uiv",
+    EVENT(context, GLUniform2uiv,
           "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
           location, count, (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform2uiv(context, locationPacked, count, value));
@@ -28656,14 +28490,13 @@
 Uniform3fContextANGLE(GLeglContext ctx, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Uniform3f, "glUniform3f",
-          "context = %d, location = %d, v0 = %f, v1 = %f, v2 = %f", CID(context), location, v0, v1,
-          v2);
+    EVENT(context, GLUniform3f, "context = %d, location = %d, v0 = %f, v1 = %f, v2 = %f",
+          CID(context), location, v0, v1, v2);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateUniform3f(context, locationPacked, v0, v1, v2));
@@ -28685,14 +28518,14 @@
                                         const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Uniform3fv, "glUniform3fv",
+    EVENT(context, GLUniform3fv,
           "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
           location, count, (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform3fv(context, locationPacked, count, value));
@@ -28712,14 +28545,13 @@
 Uniform3iContextANGLE(GLeglContext ctx, GLint location, GLint v0, GLint v1, GLint v2)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Uniform3i, "glUniform3i",
-          "context = %d, location = %d, v0 = %d, v1 = %d, v2 = %d", CID(context), location, v0, v1,
-          v2);
+    EVENT(context, GLUniform3i, "context = %d, location = %d, v0 = %d, v1 = %d, v2 = %d",
+          CID(context), location, v0, v1, v2);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateUniform3i(context, locationPacked, v0, v1, v2));
@@ -28741,14 +28573,14 @@
                                         const GLint *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Uniform3iv, "glUniform3iv",
+    EVENT(context, GLUniform3iv,
           "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
           location, count, (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform3iv(context, locationPacked, count, value));
@@ -28768,14 +28600,13 @@
 Uniform3uiContextANGLE(GLeglContext ctx, GLint location, GLuint v0, GLuint v1, GLuint v2)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Uniform3ui, "glUniform3ui",
-          "context = %d, location = %d, v0 = %u, v1 = %u, v2 = %u", CID(context), location, v0, v1,
-          v2);
+    EVENT(context, GLUniform3ui, "context = %d, location = %d, v0 = %u, v1 = %u, v2 = %u",
+          CID(context), location, v0, v1, v2);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateUniform3ui(context, locationPacked, v0, v1, v2));
@@ -28797,14 +28628,14 @@
                                          const GLuint *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Uniform3uiv, "glUniform3uiv",
+    EVENT(context, GLUniform3uiv,
           "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
           location, count, (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform3uiv(context, locationPacked, count, value));
@@ -28828,14 +28659,13 @@
                                        GLfloat v3)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Uniform4f, "glUniform4f",
-          "context = %d, location = %d, v0 = %f, v1 = %f, v2 = %f, v3 = %f", CID(context), location,
-          v0, v1, v2, v3);
+    EVENT(context, GLUniform4f, "context = %d, location = %d, v0 = %f, v1 = %f, v2 = %f, v3 = %f",
+          CID(context), location, v0, v1, v2, v3);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform4f(context, locationPacked, v0, v1, v2, v3));
@@ -28857,14 +28687,14 @@
                                         const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Uniform4fv, "glUniform4fv",
+    EVENT(context, GLUniform4fv,
           "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
           location, count, (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform4fv(context, locationPacked, count, value));
@@ -28884,14 +28714,13 @@
 Uniform4iContextANGLE(GLeglContext ctx, GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Uniform4i, "glUniform4i",
-          "context = %d, location = %d, v0 = %d, v1 = %d, v2 = %d, v3 = %d", CID(context), location,
-          v0, v1, v2, v3);
+    EVENT(context, GLUniform4i, "context = %d, location = %d, v0 = %d, v1 = %d, v2 = %d, v3 = %d",
+          CID(context), location, v0, v1, v2, v3);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform4i(context, locationPacked, v0, v1, v2, v3));
@@ -28913,14 +28742,14 @@
                                         const GLint *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Uniform4iv, "glUniform4iv",
+    EVENT(context, GLUniform4iv,
           "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
           location, count, (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform4iv(context, locationPacked, count, value));
@@ -28940,14 +28769,13 @@
 Uniform4uiContextANGLE(GLeglContext ctx, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Uniform4ui, "glUniform4ui",
-          "context = %d, location = %d, v0 = %u, v1 = %u, v2 = %u, v3 = %u", CID(context), location,
-          v0, v1, v2, v3);
+    EVENT(context, GLUniform4ui, "context = %d, location = %d, v0 = %u, v1 = %u, v2 = %u, v3 = %u",
+          CID(context), location, v0, v1, v2, v3);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform4ui(context, locationPacked, v0, v1, v2, v3));
@@ -28969,14 +28797,14 @@
                                          const GLuint *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Uniform4uiv, "glUniform4uiv",
+    EVENT(context, GLUniform4uiv,
           "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
           location, count, (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniform4uiv(context, locationPacked, count, value));
@@ -28998,14 +28826,14 @@
                                                  GLuint uniformBlockBinding)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::UniformBlockBinding, "glUniformBlockBinding",
+    EVENT(context, GLUniformBlockBinding,
           "context = %d, program = %u, uniformBlockIndex = %u, uniformBlockBinding = %u",
           CID(context), program, uniformBlockIndex, uniformBlockBinding);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateUniformBlockBinding(context, programPacked, uniformBlockIndex,
@@ -29030,14 +28858,14 @@
                                               const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::UniformMatrix2fv, "glUniformMatrix2fv",
+    EVENT(context, GLUniformMatrix2fv,
           "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
           CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -29062,14 +28890,14 @@
                                                 const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::UniformMatrix2x3fv, "glUniformMatrix2x3fv",
+    EVENT(context, GLUniformMatrix2x3fv,
           "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
           CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -29094,14 +28922,14 @@
                                                 const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::UniformMatrix2x4fv, "glUniformMatrix2x4fv",
+    EVENT(context, GLUniformMatrix2x4fv,
           "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
           CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -29126,14 +28954,14 @@
                                               const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::UniformMatrix3fv, "glUniformMatrix3fv",
+    EVENT(context, GLUniformMatrix3fv,
           "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
           CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -29158,14 +28986,14 @@
                                                 const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::UniformMatrix3x2fv, "glUniformMatrix3x2fv",
+    EVENT(context, GLUniformMatrix3x2fv,
           "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
           CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -29190,14 +29018,14 @@
                                                 const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::UniformMatrix3x4fv, "glUniformMatrix3x4fv",
+    EVENT(context, GLUniformMatrix3x4fv,
           "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
           CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -29222,14 +29050,14 @@
                                               const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::UniformMatrix4fv, "glUniformMatrix4fv",
+    EVENT(context, GLUniformMatrix4fv,
           "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
           CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -29254,14 +29082,14 @@
                                                 const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::UniformMatrix4x2fv, "glUniformMatrix4x2fv",
+    EVENT(context, GLUniformMatrix4x2fv,
           "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
           CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -29286,14 +29114,14 @@
                                                 const GLfloat *value)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::UniformMatrix4x3fv, "glUniformMatrix4x3fv",
+    EVENT(context, GLUniformMatrix4x3fv,
           "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
           CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -29314,14 +29142,14 @@
 GLboolean GL_APIENTRY UnmapBufferContextANGLE(GLeglContext ctx, GLenum target)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::UnmapBuffer, "glUnmapBuffer", "context = %d, target = %s",
-          CID(context), GLenumToString(GLenumGroup::BufferTargetARB, target));
+    EVENT(context, GLUnmapBuffer, "context = %d, target = %s", CID(context),
+          GLenumToString(GLenumGroup::BufferTargetARB, target));
 
     GLboolean returnValue;
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateUnmapBuffer(context, targetPacked));
@@ -29331,14 +29159,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::UnmapBuffer, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLUnmapBuffer, GLboolean>();
         }
         ANGLE_CAPTURE(UnmapBuffer, isCallValid, context, targetPacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::UnmapBuffer, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLUnmapBuffer, GLboolean>();
     }
     return returnValue;
 }
@@ -29346,14 +29174,14 @@
 GLboolean GL_APIENTRY UnmapBufferOESContextANGLE(GLeglContext ctx, GLenum target)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::UnmapBufferOES, "glUnmapBufferOES", "context = %d, target = %s",
-          CID(context), GLenumToString(GLenumGroup::DefaultGroup, target));
+    EVENT(context, GLUnmapBufferOES, "context = %d, target = %s", CID(context),
+          GLenumToString(GLenumGroup::DefaultGroup, target));
 
     GLboolean returnValue;
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateUnmapBufferOES(context, targetPacked));
@@ -29363,14 +29191,14 @@
         }
         else
         {
-            returnValue = GetDefaultReturnValue<EntryPoint::UnmapBufferOES, GLboolean>();
+            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLUnmapBufferOES, GLboolean>();
         }
         ANGLE_CAPTURE(UnmapBufferOES, isCallValid, context, targetPacked, returnValue);
     }
     else
     {
         GenerateContextLostErrorOnContext(context);
-        returnValue = GetDefaultReturnValue<EntryPoint::UnmapBufferOES, GLboolean>();
+        returnValue = GetDefaultReturnValue<angle::EntryPoint::GLUnmapBufferOES, GLboolean>();
     }
     return returnValue;
 }
@@ -29378,13 +29206,12 @@
 void GL_APIENTRY UseProgramContextANGLE(GLeglContext ctx, GLuint program)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::UseProgram, "glUseProgram", "context = %d, program = %u",
-          CID(context), program);
+    EVENT(context, GLUseProgram, "context = %d, program = %u", CID(context), program);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateUseProgram(context, programPacked));
@@ -29406,15 +29233,15 @@
                                               GLuint program)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::UseProgramStages, "glUseProgramStages",
-          "context = %d, pipeline = %u, stages = %s, program = %u", CID(context), pipeline,
+    EVENT(context, GLUseProgramStages, "context = %d, pipeline = %u, stages = %s, program = %u",
+          CID(context), pipeline,
           GLbitfieldToString(GLenumGroup::UseProgramStageMask, stages).c_str(), program);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ProgramPipelineID pipelinePacked                      = FromGL<ProgramPipelineID>(pipeline);
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ProgramPipelineID pipelinePacked = PackParam<ProgramPipelineID>(pipeline);
+        ShaderProgramID programPacked    = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -29438,15 +29265,15 @@
                                                  GLuint program)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::UseProgramStagesEXT, "glUseProgramStagesEXT",
-          "context = %d, pipeline = %u, stages = %s, program = %u", CID(context), pipeline,
+    EVENT(context, GLUseProgramStagesEXT, "context = %d, pipeline = %u, stages = %s, program = %u",
+          CID(context), pipeline,
           GLbitfieldToString(GLenumGroup::UseProgramStageMask, stages).c_str(), program);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ProgramPipelineID pipelinePacked                      = FromGL<ProgramPipelineID>(pipeline);
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ProgramPipelineID pipelinePacked = PackParam<ProgramPipelineID>(pipeline);
+        ShaderProgramID programPacked    = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -29467,13 +29294,12 @@
 void GL_APIENTRY ValidateProgramContextANGLE(GLeglContext ctx, GLuint program)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ValidateProgram, "glValidateProgram",
-          "context = %d, program = %u", CID(context), program);
+    EVENT(context, GLValidateProgram, "context = %d, program = %u", CID(context), program);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateValidateProgram(context, programPacked));
@@ -29492,13 +29318,13 @@
 void GL_APIENTRY ValidateProgramPipelineContextANGLE(GLeglContext ctx, GLuint pipeline)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ValidateProgramPipeline, "glValidateProgramPipeline",
-          "context = %d, pipeline = %u", CID(context), pipeline);
+    EVENT(context, GLValidateProgramPipeline, "context = %d, pipeline = %u", CID(context),
+          pipeline);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ProgramPipelineID pipelinePacked                      = FromGL<ProgramPipelineID>(pipeline);
+        ProgramPipelineID pipelinePacked = PackParam<ProgramPipelineID>(pipeline);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateValidateProgramPipeline(context, pipelinePacked));
@@ -29517,13 +29343,13 @@
 void GL_APIENTRY ValidateProgramPipelineEXTContextANGLE(GLeglContext ctx, GLuint pipeline)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ValidateProgramPipelineEXT, "glValidateProgramPipelineEXT",
-          "context = %d, pipeline = %u", CID(context), pipeline);
+    EVENT(context, GLValidateProgramPipelineEXT, "context = %d, pipeline = %u", CID(context),
+          pipeline);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ProgramPipelineID pipelinePacked                      = FromGL<ProgramPipelineID>(pipeline);
+        ProgramPipelineID pipelinePacked = PackParam<ProgramPipelineID>(pipeline);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateValidateProgramPipelineEXT(context, pipelinePacked));
@@ -29542,8 +29368,7 @@
 void GL_APIENTRY VertexAttrib1fContextANGLE(GLeglContext ctx, GLuint index, GLfloat x)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::VertexAttrib1f, "glVertexAttrib1f",
-          "context = %d, index = %u, x = %f", CID(context), index, x);
+    EVENT(context, GLVertexAttrib1f, "context = %d, index = %u, x = %f", CID(context), index, x);
 
     if (context && !context->isContextLost())
     {
@@ -29565,8 +29390,8 @@
 void GL_APIENTRY VertexAttrib1fvContextANGLE(GLeglContext ctx, GLuint index, const GLfloat *v)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::VertexAttrib1fv, "glVertexAttrib1fv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
+    EVENT(context, GLVertexAttrib1fv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
 
     if (context && !context->isContextLost())
     {
@@ -29589,8 +29414,8 @@
 void GL_APIENTRY VertexAttrib2fContextANGLE(GLeglContext ctx, GLuint index, GLfloat x, GLfloat y)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::VertexAttrib2f, "glVertexAttrib2f",
-          "context = %d, index = %u, x = %f, y = %f", CID(context), index, x, y);
+    EVENT(context, GLVertexAttrib2f, "context = %d, index = %u, x = %f, y = %f", CID(context),
+          index, x, y);
 
     if (context && !context->isContextLost())
     {
@@ -29613,8 +29438,8 @@
 void GL_APIENTRY VertexAttrib2fvContextANGLE(GLeglContext ctx, GLuint index, const GLfloat *v)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::VertexAttrib2fv, "glVertexAttrib2fv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
+    EVENT(context, GLVertexAttrib2fv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
 
     if (context && !context->isContextLost())
     {
@@ -29638,8 +29463,8 @@
 VertexAttrib3fContextANGLE(GLeglContext ctx, GLuint index, GLfloat x, GLfloat y, GLfloat z)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::VertexAttrib3f, "glVertexAttrib3f",
-          "context = %d, index = %u, x = %f, y = %f, z = %f", CID(context), index, x, y, z);
+    EVENT(context, GLVertexAttrib3f, "context = %d, index = %u, x = %f, y = %f, z = %f",
+          CID(context), index, x, y, z);
 
     if (context && !context->isContextLost())
     {
@@ -29662,8 +29487,8 @@
 void GL_APIENTRY VertexAttrib3fvContextANGLE(GLeglContext ctx, GLuint index, const GLfloat *v)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::VertexAttrib3fv, "glVertexAttrib3fv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
+    EVENT(context, GLVertexAttrib3fv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
 
     if (context && !context->isContextLost())
     {
@@ -29691,9 +29516,8 @@
                                             GLfloat w)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::VertexAttrib4f, "glVertexAttrib4f",
-          "context = %d, index = %u, x = %f, y = %f, z = %f, w = %f", CID(context), index, x, y, z,
-          w);
+    EVENT(context, GLVertexAttrib4f, "context = %d, index = %u, x = %f, y = %f, z = %f, w = %f",
+          CID(context), index, x, y, z, w);
 
     if (context && !context->isContextLost())
     {
@@ -29716,8 +29540,8 @@
 void GL_APIENTRY VertexAttrib4fvContextANGLE(GLeglContext ctx, GLuint index, const GLfloat *v)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::VertexAttrib4fv, "glVertexAttrib4fv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
+    EVENT(context, GLVertexAttrib4fv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
 
     if (context && !context->isContextLost())
     {
@@ -29742,9 +29566,8 @@
                                                  GLuint bindingindex)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::VertexAttribBinding, "glVertexAttribBinding",
-          "context = %d, attribindex = %u, bindingindex = %u", CID(context), attribindex,
-          bindingindex);
+    EVENT(context, GLVertexAttribBinding, "context = %d, attribindex = %u, bindingindex = %u",
+          CID(context), attribindex, bindingindex);
 
     if (context && !context->isContextLost())
     {
@@ -29767,8 +29590,8 @@
 void GL_APIENTRY VertexAttribDivisorContextANGLE(GLeglContext ctx, GLuint index, GLuint divisor)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::VertexAttribDivisor, "glVertexAttribDivisor",
-          "context = %d, index = %u, divisor = %u", CID(context), index, divisor);
+    EVENT(context, GLVertexAttribDivisor, "context = %d, index = %u, divisor = %u", CID(context),
+          index, divisor);
 
     if (context && !context->isContextLost())
     {
@@ -29793,8 +29616,8 @@
                                                       GLuint divisor)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::VertexAttribDivisorANGLE, "glVertexAttribDivisorANGLE",
-          "context = %d, index = %u, divisor = %u", CID(context), index, divisor);
+    EVENT(context, GLVertexAttribDivisorANGLE, "context = %d, index = %u, divisor = %u",
+          CID(context), index, divisor);
 
     if (context && !context->isContextLost())
     {
@@ -29817,8 +29640,8 @@
 void GL_APIENTRY VertexAttribDivisorEXTContextANGLE(GLeglContext ctx, GLuint index, GLuint divisor)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::VertexAttribDivisorEXT, "glVertexAttribDivisorEXT",
-          "context = %d, index = %u, divisor = %u", CID(context), index, divisor);
+    EVENT(context, GLVertexAttribDivisorEXT, "context = %d, index = %u, divisor = %u", CID(context),
+          index, divisor);
 
     if (context && !context->isContextLost())
     {
@@ -29846,7 +29669,7 @@
                                                 GLuint relativeoffset)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::VertexAttribFormat, "glVertexAttribFormat",
+    EVENT(context, GLVertexAttribFormat,
           "context = %d, attribindex = %u, size = %d, type = %s, normalized = %s, relativeoffset = "
           "%u",
           CID(context), attribindex, size, GLenumToString(GLenumGroup::DefaultGroup, type),
@@ -29855,7 +29678,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        VertexAttribType typePacked                           = FromGL<VertexAttribType>(type);
+        VertexAttribType typePacked                           = PackParam<VertexAttribType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateVertexAttribFormat(context, attribindex, size, typePacked,
@@ -29877,9 +29700,8 @@
 VertexAttribI4iContextANGLE(GLeglContext ctx, GLuint index, GLint x, GLint y, GLint z, GLint w)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::VertexAttribI4i, "glVertexAttribI4i",
-          "context = %d, index = %u, x = %d, y = %d, z = %d, w = %d", CID(context), index, x, y, z,
-          w);
+    EVENT(context, GLVertexAttribI4i, "context = %d, index = %u, x = %d, y = %d, z = %d, w = %d",
+          CID(context), index, x, y, z, w);
 
     if (context && !context->isContextLost())
     {
@@ -29902,8 +29724,8 @@
 void GL_APIENTRY VertexAttribI4ivContextANGLE(GLeglContext ctx, GLuint index, const GLint *v)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::VertexAttribI4iv, "glVertexAttribI4iv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
+    EVENT(context, GLVertexAttribI4iv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
 
     if (context && !context->isContextLost())
     {
@@ -29927,9 +29749,8 @@
 VertexAttribI4uiContextANGLE(GLeglContext ctx, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::VertexAttribI4ui, "glVertexAttribI4ui",
-          "context = %d, index = %u, x = %u, y = %u, z = %u, w = %u", CID(context), index, x, y, z,
-          w);
+    EVENT(context, GLVertexAttribI4ui, "context = %d, index = %u, x = %u, y = %u, z = %u, w = %u",
+          CID(context), index, x, y, z, w);
 
     if (context && !context->isContextLost())
     {
@@ -29952,8 +29773,8 @@
 void GL_APIENTRY VertexAttribI4uivContextANGLE(GLeglContext ctx, GLuint index, const GLuint *v)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::VertexAttribI4uiv, "glVertexAttribI4uiv",
-          "context = %d, index = %u, v = 0x%016" PRIxPTR "", CID(context), index, (uintptr_t)v);
+    EVENT(context, GLVertexAttribI4uiv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
+          CID(context), index, (uintptr_t)v);
 
     if (context && !context->isContextLost())
     {
@@ -29980,14 +29801,14 @@
                                                  GLuint relativeoffset)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::VertexAttribIFormat, "glVertexAttribIFormat",
+    EVENT(context, GLVertexAttribIFormat,
           "context = %d, attribindex = %u, size = %d, type = %s, relativeoffset = %u", CID(context),
           attribindex, size, GLenumToString(GLenumGroup::DefaultGroup, type), relativeoffset);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        VertexAttribType typePacked                           = FromGL<VertexAttribType>(type);
+        VertexAttribType typePacked                           = PackParam<VertexAttribType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -30013,7 +29834,7 @@
                                                   const void *pointer)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::VertexAttribIPointer, "glVertexAttribIPointer",
+    EVENT(context, GLVertexAttribIPointer,
           "context = %d, index = %u, size = %d, type = %s, stride = %d, pointer = 0x%016" PRIxPTR
           "",
           CID(context), index, size, GLenumToString(GLenumGroup::VertexAttribPointerType, type),
@@ -30022,7 +29843,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        VertexAttribType typePacked                           = FromGL<VertexAttribType>(type);
+        VertexAttribType typePacked                           = PackParam<VertexAttribType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -30049,7 +29870,7 @@
                                                  const void *pointer)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::VertexAttribPointer, "glVertexAttribPointer",
+    EVENT(context, GLVertexAttribPointer,
           "context = %d, index = %u, size = %d, type = %s, normalized = %s, stride = %d, pointer = "
           "0x%016" PRIxPTR "",
           CID(context), index, size, GLenumToString(GLenumGroup::VertexAttribPointerType, type),
@@ -30058,7 +29879,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        VertexAttribType typePacked                           = FromGL<VertexAttribType>(type);
+        VertexAttribType typePacked                           = PackParam<VertexAttribType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateVertexAttribPointer(context, index, size, typePacked,
@@ -30081,8 +29902,8 @@
                                                   GLuint divisor)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::VertexBindingDivisor, "glVertexBindingDivisor",
-          "context = %d, bindingindex = %u, divisor = %u", CID(context), bindingindex, divisor);
+    EVENT(context, GLVertexBindingDivisor, "context = %d, bindingindex = %u, divisor = %u",
+          CID(context), bindingindex, divisor);
 
     if (context && !context->isContextLost())
     {
@@ -30109,7 +29930,7 @@
                                            const void *pointer)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::VertexPointer, "glVertexPointer",
+    EVENT(context, GLVertexPointer,
           "context = %d, size = %d, type = %s, stride = %d, pointer = 0x%016" PRIxPTR "",
           CID(context), size, GLenumToString(GLenumGroup::VertexPointerType, type), stride,
           (uintptr_t)pointer);
@@ -30117,7 +29938,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        VertexAttribType typePacked                           = FromGL<VertexAttribType>(type);
+        VertexAttribType typePacked                           = PackParam<VertexAttribType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateVertexPointer(context, size, typePacked, stride, pointer));
@@ -30137,9 +29958,8 @@
 ViewportContextANGLE(GLeglContext ctx, GLint x, GLint y, GLsizei width, GLsizei height)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::Viewport, "glViewport",
-          "context = %d, x = %d, y = %d, width = %d, height = %d", CID(context), x, y, width,
-          height);
+    EVENT(context, GLViewport, "context = %d, x = %d, y = %d, width = %d, height = %d",
+          CID(context), x, y, width, height);
 
     if (context && !context->isContextLost())
     {
@@ -30168,7 +29988,7 @@
                                               const GLenum *srcLayouts)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::WaitSemaphoreEXT, "glWaitSemaphoreEXT",
+    EVENT(context, GLWaitSemaphoreEXT,
           "context = %d, semaphore = %u, numBufferBarriers = %u, buffers = 0x%016" PRIxPTR
           ", numTextureBarriers = %u, textures = 0x%016" PRIxPTR ", srcLayouts = 0x%016" PRIxPTR "",
           CID(context), semaphore, numBufferBarriers, (uintptr_t)buffers, numTextureBarriers,
@@ -30177,9 +29997,9 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        SemaphoreID semaphorePacked                           = FromGL<SemaphoreID>(semaphore);
-        const BufferID *buffersPacked                         = FromGL<const BufferID *>(buffers);
-        const TextureID *texturesPacked                       = FromGL<const TextureID *>(textures);
+        SemaphoreID semaphorePacked     = PackParam<SemaphoreID>(semaphore);
+        const BufferID *buffersPacked   = PackParam<const BufferID *>(buffers);
+        const TextureID *texturesPacked = PackParam<const TextureID *>(textures);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -30205,9 +30025,9 @@
                                       GLuint64 timeout)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::WaitSync, "glWaitSync",
-          "context = %d, sync = 0x%016" PRIxPTR ", flags = %s, timeout = %llu", CID(context),
-          (uintptr_t)sync, GLbitfieldToString(GLenumGroup::DefaultGroup, flags).c_str(),
+    EVENT(context, GLWaitSync, "context = %d, sync = 0x%016" PRIxPTR ", flags = %s, timeout = %llu",
+          CID(context), (uintptr_t)sync,
+          GLbitfieldToString(GLenumGroup::DefaultGroup, flags).c_str(),
           static_cast<unsigned long long>(timeout));
 
     if (context && !context->isContextLost())
@@ -30235,7 +30055,7 @@
                                               const void *pointer)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::WeightPointerOES, "glWeightPointerOES",
+    EVENT(context, GLWeightPointerOES,
           "context = %d, size = %d, type = %s, stride = %d, pointer = 0x%016" PRIxPTR "",
           CID(context), size, GLenumToString(GLenumGroup::DefaultGroup, type), stride,
           (uintptr_t)pointer);
@@ -30264,15 +30084,15 @@
                                                          const GLchar *name)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::BindUniformLocationCHROMIUM, "glBindUniformLocationCHROMIUM",
+    EVENT(context, GLBindUniformLocationCHROMIUM,
           "context = %d, program = %u, location = %d, name = 0x%016" PRIxPTR "", CID(context),
           program, location, (uintptr_t)name);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -30293,8 +30113,7 @@
 void GL_APIENTRY CoverageModulationCHROMIUMContextANGLE(GLeglContext ctx, GLenum components)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::CoverageModulationCHROMIUM, "glCoverageModulationCHROMIUM",
-          "context = %d, components = %s", CID(context),
+    EVENT(context, GLCoverageModulationCHROMIUM, "context = %d, components = %s", CID(context),
           GLenumToString(GLenumGroup::DefaultGroup, components));
 
     if (context && !context->isContextLost())
@@ -30328,7 +30147,7 @@
                                                  GLboolean unpackUnmultiplyAlpha)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::CopyTextureCHROMIUM, "glCopyTextureCHROMIUM",
+    EVENT(context, GLCopyTextureCHROMIUM,
           "context = %d, sourceId = %u, sourceLevel = %d, destTarget = %s, destId = %u, destLevel "
           "= %d, internalFormat = %d, destType = %s, unpackFlipY = %s, unpackPremultiplyAlpha = "
           "%s, unpackUnmultiplyAlpha = %s",
@@ -30340,9 +30159,9 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureID sourceIdPacked                              = FromGL<TextureID>(sourceId);
-        TextureTarget destTargetPacked                        = FromGL<TextureTarget>(destTarget);
-        TextureID destIdPacked                                = FromGL<TextureID>(destId);
+        TextureID sourceIdPacked       = PackParam<TextureID>(sourceId);
+        TextureTarget destTargetPacked = PackParam<TextureTarget>(destTarget);
+        TextureID destIdPacked         = PackParam<TextureID>(destId);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateCopyTextureCHROMIUM(
@@ -30382,7 +30201,7 @@
                                                     GLboolean unpackUnmultiplyAlpha)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::CopySubTextureCHROMIUM, "glCopySubTextureCHROMIUM",
+    EVENT(context, GLCopySubTextureCHROMIUM,
           "context = %d, sourceId = %u, sourceLevel = %d, destTarget = %s, destId = %u, destLevel "
           "= %d, xoffset = %d, yoffset = %d, x = %d, y = %d, width = %d, height = %d, unpackFlipY "
           "= %s, unpackPremultiplyAlpha = %s, unpackUnmultiplyAlpha = %s",
@@ -30394,9 +30213,9 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureID sourceIdPacked                              = FromGL<TextureID>(sourceId);
-        TextureTarget destTargetPacked                        = FromGL<TextureTarget>(destTarget);
-        TextureID destIdPacked                                = FromGL<TextureID>(destId);
+        TextureID sourceIdPacked       = PackParam<TextureID>(sourceId);
+        TextureTarget destTargetPacked = PackParam<TextureTarget>(destTarget);
+        TextureID destIdPacked         = PackParam<TextureID>(destId);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateCopySubTextureCHROMIUM(
@@ -30424,14 +30243,14 @@
                                                            GLuint destId)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::CompressedCopyTextureCHROMIUM, "glCompressedCopyTextureCHROMIUM",
-          "context = %d, sourceId = %u, destId = %u", CID(context), sourceId, destId);
+    EVENT(context, GLCompressedCopyTextureCHROMIUM, "context = %d, sourceId = %u, destId = %u",
+          CID(context), sourceId, destId);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureID sourceIdPacked                              = FromGL<TextureID>(sourceId);
-        TextureID destIdPacked                                = FromGL<TextureID>(destId);
+        TextureID sourceIdPacked                              = PackParam<TextureID>(sourceId);
+        TextureID destIdPacked                                = PackParam<TextureID>(destId);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -30452,8 +30271,8 @@
 void GL_APIENTRY RequestExtensionANGLEContextANGLE(GLeglContext ctx, const GLchar *name)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::RequestExtensionANGLE, "glRequestExtensionANGLE",
-          "context = %d, name = 0x%016" PRIxPTR "", CID(context), (uintptr_t)name);
+    EVENT(context, GLRequestExtensionANGLE, "context = %d, name = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)name);
 
     if (context && !context->isContextLost())
     {
@@ -30476,8 +30295,8 @@
 void GL_APIENTRY DisableExtensionANGLEContextANGLE(GLeglContext ctx, const GLchar *name)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DisableExtensionANGLE, "glDisableExtensionANGLE",
-          "context = %d, name = 0x%016" PRIxPTR "", CID(context), (uintptr_t)name);
+    EVENT(context, GLDisableExtensionANGLE, "context = %d, name = 0x%016" PRIxPTR "", CID(context),
+          (uintptr_t)name);
 
     if (context && !context->isContextLost())
     {
@@ -30504,7 +30323,7 @@
                                                     GLboolean *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetBooleanvRobustANGLE, "glGetBooleanvRobustANGLE",
+    EVENT(context, GLGetBooleanvRobustANGLE,
           "context = %d, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -30537,8 +30356,7 @@
                                                              GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetBufferParameterivRobustANGLE,
-          "glGetBufferParameterivRobustANGLE",
+    EVENT(context, GLGetBufferParameterivRobustANGLE,
           "context = %d, target = %s, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target),
@@ -30548,7 +30366,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetBufferParameterivRobustANGLE(context, targetPacked, pname,
@@ -30573,7 +30391,7 @@
                                                   GLfloat *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetFloatvRobustANGLE, "glGetFloatvRobustANGLE",
+    EVENT(context, GLGetFloatvRobustANGLE,
           "context = %d, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -30606,8 +30424,7 @@
                                                                             GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetFramebufferAttachmentParameterivRobustANGLE,
-          "glGetFramebufferAttachmentParameterivRobustANGLE",
+    EVENT(context, GLGetFramebufferAttachmentParameterivRobustANGLE,
           "context = %d, target = %s, attachment = %s, pname = %s, bufSize = %d, length = "
           "0x%016" PRIxPTR ", params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target),
@@ -30643,7 +30460,7 @@
                                                     GLint *data)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetIntegervRobustANGLE, "glGetIntegervRobustANGLE",
+    EVENT(context, GLGetIntegervRobustANGLE,
           "context = %d, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", data = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -30675,7 +30492,7 @@
                                                      GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetProgramivRobustANGLE, "glGetProgramivRobustANGLE",
+    EVENT(context, GLGetProgramivRobustANGLE,
           "context = %d, program = %u, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), program, GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -30684,7 +30501,7 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetProgramivRobustANGLE(context, programPacked, pname, bufSize,
@@ -30708,8 +30525,7 @@
                                                                    GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetRenderbufferParameterivRobustANGLE,
-          "glGetRenderbufferParameterivRobustANGLE",
+    EVENT(context, GLGetRenderbufferParameterivRobustANGLE,
           "context = %d, target = %s, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target),
@@ -30744,7 +30560,7 @@
                                                     GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetShaderivRobustANGLE, "glGetShaderivRobustANGLE",
+    EVENT(context, GLGetShaderivRobustANGLE,
           "context = %d, shader = %u, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), shader, GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -30753,7 +30569,7 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID shaderPacked                          = FromGL<ShaderProgramID>(shader);
+        ShaderProgramID shaderPacked                          = PackParam<ShaderProgramID>(shader);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -30777,7 +30593,7 @@
                                                           GLfloat *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetTexParameterfvRobustANGLE, "glGetTexParameterfvRobustANGLE",
+    EVENT(context, GLGetTexParameterfvRobustANGLE,
           "context = %d, target = %s, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target),
@@ -30787,7 +30603,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetTexParameterfvRobustANGLE(context, targetPacked, pname,
@@ -30813,7 +30629,7 @@
                                                           GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetTexParameterivRobustANGLE, "glGetTexParameterivRobustANGLE",
+    EVENT(context, GLGetTexParameterivRobustANGLE,
           "context = %d, target = %s, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target),
@@ -30823,7 +30639,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetTexParameterivRobustANGLE(context, targetPacked, pname,
@@ -30849,7 +30665,7 @@
                                                      GLfloat *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetUniformfvRobustANGLE, "glGetUniformfvRobustANGLE",
+    EVENT(context, GLGetUniformfvRobustANGLE,
           "context = %d, program = %u, location = %d, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), program, location, bufSize, (uintptr_t)length, (uintptr_t)params);
@@ -30857,8 +30673,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetUniformfvRobustANGLE(context, programPacked, locationPacked,
@@ -30884,7 +30700,7 @@
                                                      GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetUniformivRobustANGLE, "glGetUniformivRobustANGLE",
+    EVENT(context, GLGetUniformivRobustANGLE,
           "context = %d, program = %u, location = %d, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), program, location, bufSize, (uintptr_t)length, (uintptr_t)params);
@@ -30892,8 +30708,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetUniformivRobustANGLE(context, programPacked, locationPacked,
@@ -30919,7 +30735,7 @@
                                                           GLfloat *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetVertexAttribfvRobustANGLE, "glGetVertexAttribfvRobustANGLE",
+    EVENT(context, GLGetVertexAttribfvRobustANGLE,
           "context = %d, index = %u, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), index, GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -30953,7 +30769,7 @@
                                                           GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetVertexAttribivRobustANGLE, "glGetVertexAttribivRobustANGLE",
+    EVENT(context, GLGetVertexAttribivRobustANGLE,
           "context = %d, index = %u, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), index, GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -30987,8 +30803,7 @@
                                                                 void **pointer)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetVertexAttribPointervRobustANGLE,
-          "glGetVertexAttribPointervRobustANGLE",
+    EVENT(context, GLGetVertexAttribPointervRobustANGLE,
           "context = %d, index = %u, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", pointer = 0x%016" PRIxPTR "",
           CID(context), index, GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -31028,7 +30843,7 @@
                                                    void *pixels)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ReadPixelsRobustANGLE, "glReadPixelsRobustANGLE",
+    EVENT(context, GLReadPixelsRobustANGLE,
           "context = %d, x = %d, y = %d, width = %d, height = %d, format = %s, type = %s, bufSize "
           "= %d, length = 0x%016" PRIxPTR ", columns = 0x%016" PRIxPTR ", rows = 0x%016" PRIxPTR
           ", pixels = 0x%016" PRIxPTR "",
@@ -31071,7 +30886,7 @@
                                                    const void *pixels)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexImage2DRobustANGLE, "glTexImage2DRobustANGLE",
+    EVENT(context, GLTexImage2DRobustANGLE,
           "context = %d, target = %s, level = %d, internalformat = %d, width = %d, height = %d, "
           "border = %d, format = %s, type = %s, bufSize = %d, pixels = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target), level, internalformat,
@@ -31081,7 +30896,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -31108,7 +30923,7 @@
                                                        const GLfloat *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexParameterfvRobustANGLE, "glTexParameterfvRobustANGLE",
+    EVENT(context, GLTexParameterfvRobustANGLE,
           "context = %d, target = %s, pname = %s, bufSize = %d, params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target),
           GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize, (uintptr_t)params);
@@ -31116,7 +30931,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -31141,7 +30956,7 @@
                                                        const GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexParameterivRobustANGLE, "glTexParameterivRobustANGLE",
+    EVENT(context, GLTexParameterivRobustANGLE,
           "context = %d, target = %s, pname = %s, bufSize = %d, params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target),
           GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize, (uintptr_t)params);
@@ -31149,7 +30964,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -31180,7 +30995,7 @@
                                                       const void *pixels)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexSubImage2DRobustANGLE, "glTexSubImage2DRobustANGLE",
+    EVENT(context, GLTexSubImage2DRobustANGLE,
           "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, width = %d, height = "
           "%d, format = %s, type = %s, bufSize = %d, pixels = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target), level, xoffset, yoffset,
@@ -31190,7 +31005,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -31224,7 +31039,7 @@
                                                    const void *pixels)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexImage3DRobustANGLE, "glTexImage3DRobustANGLE",
+    EVENT(context, GLTexImage3DRobustANGLE,
           "context = %d, target = %s, level = %d, internalformat = %d, width = %d, height = %d, "
           "depth = %d, border = %d, format = %s, type = %s, bufSize = %d, pixels = 0x%016" PRIxPTR
           "",
@@ -31235,7 +31050,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -31271,7 +31086,7 @@
 {
     Context *context = static_cast<gl::Context *>(ctx);
     EVENT(
-        context, gl::EntryPoint::TexSubImage3DRobustANGLE, "glTexSubImage3DRobustANGLE",
+        context, GLTexSubImage3DRobustANGLE,
         "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, width = "
         "%d, height = %d, depth = %d, format = %s, type = %s, bufSize = %d, pixels = 0x%016" PRIxPTR
         "",
@@ -31282,7 +31097,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexSubImage3DRobustANGLE(context, targetPacked, level, xoffset,
@@ -31314,8 +31129,7 @@
                                                              const GLvoid *data)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::CompressedTexImage2DRobustANGLE,
-          "glCompressedTexImage2DRobustANGLE",
+    EVENT(context, GLCompressedTexImage2DRobustANGLE,
           "context = %d, target = %s, level = %d, internalformat = %s, width = %d, height = %d, "
           "border = %d, imageSize = %d, dataSize = %d, data = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target), level,
@@ -31325,7 +31139,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateCompressedTexImage2DRobustANGLE(
@@ -31358,8 +31172,7 @@
                                                                 const GLvoid *data)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::CompressedTexSubImage2DRobustANGLE,
-          "glCompressedTexSubImage2DRobustANGLE",
+    EVENT(context, GLCompressedTexSubImage2DRobustANGLE,
           "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, width = %d, height = "
           "%d, format = %s, imageSize = %d, dataSize = %d, data = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target), level, xoffset, yoffset,
@@ -31369,7 +31182,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateCompressedTexSubImage2DRobustANGLE(
@@ -31402,8 +31215,7 @@
                                                              const GLvoid *data)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::CompressedTexImage3DRobustANGLE,
-          "glCompressedTexImage3DRobustANGLE",
+    EVENT(context, GLCompressedTexImage3DRobustANGLE,
           "context = %d, target = %s, level = %d, internalformat = %s, width = %d, height = %d, "
           "depth = %d, border = %d, imageSize = %d, dataSize = %d, data = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target), level,
@@ -31413,7 +31225,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateCompressedTexImage3DRobustANGLE(
@@ -31448,8 +31260,7 @@
                                                                 const GLvoid *data)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::CompressedTexSubImage3DRobustANGLE,
-          "glCompressedTexSubImage3DRobustANGLE",
+    EVENT(context, GLCompressedTexSubImage3DRobustANGLE,
           "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, width "
           "= %d, height = %d, depth = %d, format = %s, imageSize = %d, dataSize = %d, data = "
           "0x%016" PRIxPTR "",
@@ -31460,7 +31271,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateCompressedTexSubImage3DRobustANGLE(
@@ -31490,7 +31301,7 @@
                                                    GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetQueryivRobustANGLE, "glGetQueryivRobustANGLE",
+    EVENT(context, GLGetQueryivRobustANGLE,
           "context = %d, target = %s, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target),
@@ -31500,7 +31311,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        QueryType targetPacked                                = FromGL<QueryType>(target);
+        QueryType targetPacked                                = PackParam<QueryType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -31526,7 +31337,7 @@
                                                           GLuint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetQueryObjectuivRobustANGLE, "glGetQueryObjectuivRobustANGLE",
+    EVENT(context, GLGetQueryObjectuivRobustANGLE,
           "context = %d, id = %u, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), id, GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -31535,7 +31346,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        QueryID idPacked                                      = FromGL<QueryID>(id);
+        QueryID idPacked                                      = PackParam<QueryID>(id);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGetQueryObjectuivRobustANGLE(
@@ -31561,7 +31372,7 @@
                                                           void **params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetBufferPointervRobustANGLE, "glGetBufferPointervRobustANGLE",
+    EVENT(context, GLGetBufferPointervRobustANGLE,
           "context = %d, target = %s, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target),
@@ -31571,7 +31382,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetBufferPointervRobustANGLE(context, targetPacked, pname,
@@ -31597,7 +31408,7 @@
                                                       GLint *data)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetIntegeri_vRobustANGLE, "glGetIntegeri_vRobustANGLE",
+    EVENT(context, GLGetIntegeri_vRobustANGLE,
           "context = %d, target = %s, index = %u, bufSize = %d, length = 0x%016" PRIxPTR
           ", data = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target), index, bufSize,
@@ -31632,8 +31443,7 @@
                                                             GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetInternalformativRobustANGLE,
-          "glGetInternalformativRobustANGLE",
+    EVENT(context, GLGetInternalformativRobustANGLE,
           "context = %d, target = %s, internalformat = %s, pname = %s, bufSize = %d, length = "
           "0x%016" PRIxPTR ", params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target),
@@ -31670,7 +31480,7 @@
                                                            GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetVertexAttribIivRobustANGLE, "glGetVertexAttribIivRobustANGLE",
+    EVENT(context, GLGetVertexAttribIivRobustANGLE,
           "context = %d, index = %u, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), index, GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -31704,8 +31514,7 @@
                                                             GLuint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetVertexAttribIuivRobustANGLE,
-          "glGetVertexAttribIuivRobustANGLE",
+    EVENT(context, GLGetVertexAttribIuivRobustANGLE,
           "context = %d, index = %u, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), index, GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -31739,7 +31548,7 @@
                                                       GLuint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetUniformuivRobustANGLE, "glGetUniformuivRobustANGLE",
+    EVENT(context, GLGetUniformuivRobustANGLE,
           "context = %d, program = %u, location = %d, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), program, location, bufSize, (uintptr_t)length, (uintptr_t)params);
@@ -31747,8 +31556,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetUniformuivRobustANGLE(context, programPacked, locationPacked,
@@ -31775,8 +31584,7 @@
                                                                 GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetActiveUniformBlockivRobustANGLE,
-          "glGetActiveUniformBlockivRobustANGLE",
+    EVENT(context, GLGetActiveUniformBlockivRobustANGLE,
           "context = %d, program = %u, uniformBlockIndex = %u, pname = %s, bufSize = %d, length = "
           "0x%016" PRIxPTR ", params = 0x%016" PRIxPTR "",
           CID(context), program, uniformBlockIndex,
@@ -31786,7 +31594,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -31813,7 +31621,7 @@
                                                       GLint64 *data)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetInteger64vRobustANGLE, "glGetInteger64vRobustANGLE",
+    EVENT(context, GLGetInteger64vRobustANGLE,
           "context = %d, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", data = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -31846,7 +31654,7 @@
                                                         GLint64 *data)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetInteger64i_vRobustANGLE, "glGetInteger64i_vRobustANGLE",
+    EVENT(context, GLGetInteger64i_vRobustANGLE,
           "context = %d, target = %s, index = %u, bufSize = %d, length = 0x%016" PRIxPTR
           ", data = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target), index, bufSize,
@@ -31880,8 +31688,7 @@
                                                                GLint64 *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetBufferParameteri64vRobustANGLE,
-          "glGetBufferParameteri64vRobustANGLE",
+    EVENT(context, GLGetBufferParameteri64vRobustANGLE,
           "context = %d, target = %s, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target),
@@ -31891,7 +31698,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        BufferBinding targetPacked                            = FromGL<BufferBinding>(target);
+        BufferBinding targetPacked                            = PackParam<BufferBinding>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetBufferParameteri64vRobustANGLE(context, targetPacked, pname,
@@ -31916,14 +31723,14 @@
                                                            const GLint *param)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::SamplerParameterivRobustANGLE, "glSamplerParameterivRobustANGLE",
+    EVENT(context, GLSamplerParameterivRobustANGLE,
           "context = %d, sampler = %u, pname = %u, bufSize = %d, param = 0x%016" PRIxPTR "",
           CID(context), sampler, pname, bufSize, (uintptr_t)param);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -31948,7 +31755,7 @@
                                                            const GLfloat *param)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::SamplerParameterfvRobustANGLE, "glSamplerParameterfvRobustANGLE",
+    EVENT(context, GLSamplerParameterfvRobustANGLE,
           "context = %d, sampler = %u, pname = %s, bufSize = %d, param = 0x%016" PRIxPTR "",
           CID(context), sampler, GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
           (uintptr_t)param);
@@ -31956,7 +31763,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -31982,8 +31789,7 @@
                                                               GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetSamplerParameterivRobustANGLE,
-          "glGetSamplerParameterivRobustANGLE",
+    EVENT(context, GLGetSamplerParameterivRobustANGLE,
           "context = %d, sampler = %u, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), sampler, GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -31992,7 +31798,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetSamplerParameterivRobustANGLE(context, samplerPacked, pname,
@@ -32018,8 +31824,7 @@
                                                               GLfloat *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetSamplerParameterfvRobustANGLE,
-          "glGetSamplerParameterfvRobustANGLE",
+    EVENT(context, GLGetSamplerParameterfvRobustANGLE,
           "context = %d, sampler = %u, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), sampler, GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -32028,7 +31833,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetSamplerParameterfvRobustANGLE(context, samplerPacked, pname,
@@ -32054,8 +31859,7 @@
                                                                   GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetFramebufferParameterivRobustANGLE,
-          "glGetFramebufferParameterivRobustANGLE",
+    EVENT(context, GLGetFramebufferParameterivRobustANGLE,
           "context = %d, target = %s, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target),
@@ -32091,8 +31895,7 @@
                                                               GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetProgramInterfaceivRobustANGLE,
-          "glGetProgramInterfaceivRobustANGLE",
+    EVENT(context, GLGetProgramInterfaceivRobustANGLE,
           "context = %d, program = %u, programInterface = %s, pname = %s, bufSize = %d, length = "
           "0x%016" PRIxPTR ", params = 0x%016" PRIxPTR "",
           CID(context), program, GLenumToString(GLenumGroup::DefaultGroup, programInterface),
@@ -32102,7 +31905,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
+        ShaderProgramID programPacked                         = PackParam<ShaderProgramID>(program);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -32130,7 +31933,7 @@
                                                       GLboolean *data)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetBooleani_vRobustANGLE, "glGetBooleani_vRobustANGLE",
+    EVENT(context, GLGetBooleani_vRobustANGLE,
           "context = %d, target = %s, index = %u, bufSize = %d, length = 0x%016" PRIxPTR
           ", data = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target), index, bufSize,
@@ -32164,7 +31967,7 @@
                                                          GLfloat *val)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetMultisamplefvRobustANGLE, "glGetMultisamplefvRobustANGLE",
+    EVENT(context, GLGetMultisamplefvRobustANGLE,
           "context = %d, pname = %s, index = %u, bufSize = %d, length = 0x%016" PRIxPTR
           ", val = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, pname), index, bufSize,
@@ -32199,8 +32002,7 @@
                                                                GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetTexLevelParameterivRobustANGLE,
-          "glGetTexLevelParameterivRobustANGLE",
+    EVENT(context, GLGetTexLevelParameterivRobustANGLE,
           "context = %d, target = %s, level = %d, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target), level,
@@ -32210,7 +32012,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetTexLevelParameterivRobustANGLE(
@@ -32238,8 +32040,7 @@
                                                                GLfloat *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetTexLevelParameterfvRobustANGLE,
-          "glGetTexLevelParameterfvRobustANGLE",
+    EVENT(context, GLGetTexLevelParameterfvRobustANGLE,
           "context = %d, target = %s, level = %d, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target), level,
@@ -32249,7 +32050,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetTexLevelParameterfvRobustANGLE(
@@ -32275,8 +32076,7 @@
                                                                void **params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetPointervRobustANGLERobustANGLE,
-          "glGetPointervRobustANGLERobustANGLE",
+    EVENT(context, GLGetPointervRobustANGLERobustANGLE,
           "context = %d, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -32316,7 +32116,7 @@
                                                     void *data)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ReadnPixelsRobustANGLE, "glReadnPixelsRobustANGLE",
+    EVENT(context, GLReadnPixelsRobustANGLE,
           "context = %d, x = %d, y = %d, width = %d, height = %d, format = %s, type = %s, bufSize "
           "= %d, length = 0x%016" PRIxPTR ", columns = 0x%016" PRIxPTR ", rows = 0x%016" PRIxPTR
           ", data = 0x%016" PRIxPTR "",
@@ -32354,7 +32154,7 @@
                                                       GLfloat *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetnUniformfvRobustANGLE, "glGetnUniformfvRobustANGLE",
+    EVENT(context, GLGetnUniformfvRobustANGLE,
           "context = %d, program = %u, location = %d, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), program, location, bufSize, (uintptr_t)length, (uintptr_t)params);
@@ -32362,8 +32162,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetnUniformfvRobustANGLE(context, programPacked, locationPacked,
@@ -32389,7 +32189,7 @@
                                                       GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetnUniformivRobustANGLE, "glGetnUniformivRobustANGLE",
+    EVENT(context, GLGetnUniformivRobustANGLE,
           "context = %d, program = %u, location = %d, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), program, location, bufSize, (uintptr_t)length, (uintptr_t)params);
@@ -32397,8 +32197,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetnUniformivRobustANGLE(context, programPacked, locationPacked,
@@ -32424,7 +32224,7 @@
                                                        GLuint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetnUniformuivRobustANGLE, "glGetnUniformuivRobustANGLE",
+    EVENT(context, GLGetnUniformuivRobustANGLE,
           "context = %d, program = %u, location = %d, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), program, location, bufSize, (uintptr_t)length, (uintptr_t)params);
@@ -32432,8 +32232,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ShaderProgramID programPacked                         = FromGL<ShaderProgramID>(program);
-        UniformLocation locationPacked                        = FromGL<UniformLocation>(location);
+        ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
+        UniformLocation locationPacked = PackParam<UniformLocation>(location);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetnUniformuivRobustANGLE(
@@ -32458,7 +32258,7 @@
                                                         const GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexParameterIivRobustANGLE, "glTexParameterIivRobustANGLE",
+    EVENT(context, GLTexParameterIivRobustANGLE,
           "context = %d, target = %s, pname = %s, bufSize = %d, params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target),
           GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize, (uintptr_t)params);
@@ -32466,7 +32266,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -32491,7 +32291,7 @@
                                                          const GLuint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexParameterIuivRobustANGLE, "glTexParameterIuivRobustANGLE",
+    EVENT(context, GLTexParameterIuivRobustANGLE,
           "context = %d, target = %s, pname = %s, bufSize = %d, params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target),
           GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize, (uintptr_t)params);
@@ -32499,7 +32299,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -32525,7 +32325,7 @@
                                                            GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetTexParameterIivRobustANGLE, "glGetTexParameterIivRobustANGLE",
+    EVENT(context, GLGetTexParameterIivRobustANGLE,
           "context = %d, target = %s, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target),
@@ -32535,7 +32335,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetTexParameterIivRobustANGLE(context, targetPacked, pname,
@@ -32561,8 +32361,7 @@
                                                             GLuint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetTexParameterIuivRobustANGLE,
-          "glGetTexParameterIuivRobustANGLE",
+    EVENT(context, GLGetTexParameterIuivRobustANGLE,
           "context = %d, target = %s, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target),
@@ -32572,7 +32371,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetTexParameterIuivRobustANGLE(context, targetPacked, pname,
@@ -32597,8 +32396,7 @@
                                                             const GLint *param)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::SamplerParameterIivRobustANGLE,
-          "glSamplerParameterIivRobustANGLE",
+    EVENT(context, GLSamplerParameterIivRobustANGLE,
           "context = %d, sampler = %u, pname = %s, bufSize = %d, param = 0x%016" PRIxPTR "",
           CID(context), sampler, GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
           (uintptr_t)param);
@@ -32606,7 +32404,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -32631,8 +32429,7 @@
                                                              const GLuint *param)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::SamplerParameterIuivRobustANGLE,
-          "glSamplerParameterIuivRobustANGLE",
+    EVENT(context, GLSamplerParameterIuivRobustANGLE,
           "context = %d, sampler = %u, pname = %s, bufSize = %d, param = 0x%016" PRIxPTR "",
           CID(context), sampler, GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
           (uintptr_t)param);
@@ -32640,7 +32437,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateSamplerParameterIuivRobustANGLE(
@@ -32666,8 +32463,7 @@
                                                                GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetSamplerParameterIivRobustANGLE,
-          "glGetSamplerParameterIivRobustANGLE",
+    EVENT(context, GLGetSamplerParameterIivRobustANGLE,
           "context = %d, sampler = %u, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), sampler, GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -32676,7 +32472,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetSamplerParameterIivRobustANGLE(context, samplerPacked, pname,
@@ -32702,8 +32498,7 @@
                                                                 GLuint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetSamplerParameterIuivRobustANGLE,
-          "glGetSamplerParameterIuivRobustANGLE",
+    EVENT(context, GLGetSamplerParameterIuivRobustANGLE,
           "context = %d, sampler = %u, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), sampler, GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -32712,7 +32507,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        SamplerID samplerPacked                               = FromGL<SamplerID>(sampler);
+        SamplerID samplerPacked                               = PackParam<SamplerID>(sampler);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateGetSamplerParameterIuivRobustANGLE(
@@ -32738,7 +32533,7 @@
                                                          GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetQueryObjectivRobustANGLE, "glGetQueryObjectivRobustANGLE",
+    EVENT(context, GLGetQueryObjectivRobustANGLE,
           "context = %d, id = %u, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), id, GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -32747,7 +32542,7 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
-        QueryID idPacked                                      = FromGL<QueryID>(id);
+        QueryID idPacked                                      = PackParam<QueryID>(id);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGetQueryObjectivRobustANGLE(
@@ -32771,7 +32566,7 @@
                                                            GLint64 *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetQueryObjecti64vRobustANGLE, "glGetQueryObjecti64vRobustANGLE",
+    EVENT(context, GLGetQueryObjecti64vRobustANGLE,
           "context = %d, id = %u, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), id, GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -32780,7 +32575,7 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
-        QueryID idPacked                                      = FromGL<QueryID>(id);
+        QueryID idPacked                                      = PackParam<QueryID>(id);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGetQueryObjecti64vRobustANGLE(
@@ -32804,8 +32599,7 @@
                                                             GLuint64 *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetQueryObjectui64vRobustANGLE,
-          "glGetQueryObjectui64vRobustANGLE",
+    EVENT(context, GLGetQueryObjectui64vRobustANGLE,
           "context = %d, id = %u, pname = %s, bufSize = %d, length = 0x%016" PRIxPTR
           ", params = 0x%016" PRIxPTR "",
           CID(context), id, GLenumToString(GLenumGroup::DefaultGroup, pname), bufSize,
@@ -32814,7 +32608,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        QueryID idPacked                                      = FromGL<QueryID>(id);
+        QueryID idPacked                                      = PackParam<QueryID>(id);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateGetQueryObjectui64vRobustANGLE(
@@ -32845,7 +32639,7 @@
                                                 GLboolean unpackUnmultiplyAlpha)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::CopyTexture3DANGLE, "glCopyTexture3DANGLE",
+    EVENT(context, GLCopyTexture3DANGLE,
           "context = %d, sourceId = %u, sourceLevel = %d, destTarget = %s, destId = %u, destLevel "
           "= %d, internalFormat = %d, destType = %s, unpackFlipY = %s, unpackPremultiplyAlpha = "
           "%s, unpackUnmultiplyAlpha = %s",
@@ -32857,9 +32651,9 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureID sourceIdPacked                              = FromGL<TextureID>(sourceId);
-        TextureTarget destTargetPacked                        = FromGL<TextureTarget>(destTarget);
-        TextureID destIdPacked                                = FromGL<TextureID>(destId);
+        TextureID sourceIdPacked       = PackParam<TextureID>(sourceId);
+        TextureTarget destTargetPacked = PackParam<TextureTarget>(destTarget);
+        TextureID destIdPacked         = PackParam<TextureID>(destId);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateCopyTexture3DANGLE(
@@ -32902,7 +32696,7 @@
                                                    GLboolean unpackUnmultiplyAlpha)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::CopySubTexture3DANGLE, "glCopySubTexture3DANGLE",
+    EVENT(context, GLCopySubTexture3DANGLE,
           "context = %d, sourceId = %u, sourceLevel = %d, destTarget = %s, destId = %u, destLevel "
           "= %d, xoffset = %d, yoffset = %d, zoffset = %d, x = %d, y = %d, z = %d, width = %d, "
           "height = %d, depth = %d, unpackFlipY = %s, unpackPremultiplyAlpha = %s, "
@@ -32915,9 +32709,9 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureID sourceIdPacked                              = FromGL<TextureID>(sourceId);
-        TextureTarget destTargetPacked                        = FromGL<TextureTarget>(destTarget);
-        TextureID destIdPacked                                = FromGL<TextureID>(destId);
+        TextureID sourceIdPacked       = PackParam<TextureID>(sourceId);
+        TextureTarget destTargetPacked = PackParam<TextureTarget>(destTarget);
+        TextureID destIdPacked         = PackParam<TextureID>(destId);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -32952,7 +32746,7 @@
                                                           GLboolean fixedsamplelocations)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexStorage2DMultisampleANGLE, "glTexStorage2DMultisampleANGLE",
+    EVENT(context, GLTexStorage2DMultisampleANGLE,
           "context = %d, target = %s, samples = %d, internalformat = %s, width = %d, height = %d, "
           "fixedsamplelocations = %s",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target), samples,
@@ -32962,7 +32756,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -32989,7 +32783,7 @@
                                                          GLint *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetTexLevelParameterivANGLE, "glGetTexLevelParameterivANGLE",
+    EVENT(context, GLGetTexLevelParameterivANGLE,
           "context = %d, target = %s, level = %d, pname = %s, params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target), level,
           GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
@@ -32997,7 +32791,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -33022,7 +32816,7 @@
                                                          GLfloat *params)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetTexLevelParameterfvANGLE, "glGetTexLevelParameterfvANGLE",
+    EVENT(context, GLGetTexLevelParameterfvANGLE,
           "context = %d, target = %s, level = %d, pname = %s, params = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::DefaultGroup, target), level,
           GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
@@ -33030,7 +32824,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -33055,7 +32849,7 @@
                                                   GLsizei drawcount)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::MultiDrawArraysANGLE, "glMultiDrawArraysANGLE",
+    EVENT(context, GLMultiDrawArraysANGLE,
           "context = %d, mode = %s, firsts = 0x%016" PRIxPTR ", counts = 0x%016" PRIxPTR
           ", drawcount = %d",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), (uintptr_t)firsts,
@@ -33064,7 +32858,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -33090,7 +32884,7 @@
                                                            GLsizei drawcount)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::MultiDrawArraysInstancedANGLE, "glMultiDrawArraysInstancedANGLE",
+    EVENT(context, GLMultiDrawArraysInstancedANGLE,
           "context = %d, mode = %s, firsts = 0x%016" PRIxPTR ", counts = 0x%016" PRIxPTR
           ", instanceCounts = 0x%016" PRIxPTR ", drawcount = %d",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), (uintptr_t)firsts,
@@ -33099,7 +32893,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateMultiDrawArraysInstancedANGLE(
@@ -33126,7 +32920,7 @@
                                                     GLsizei drawcount)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::MultiDrawElementsANGLE, "glMultiDrawElementsANGLE",
+    EVENT(context, GLMultiDrawElementsANGLE,
           "context = %d, mode = %s, counts = 0x%016" PRIxPTR ", type = %s, indices = 0x%016" PRIxPTR
           ", drawcount = %d",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), (uintptr_t)counts,
@@ -33135,8 +32929,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateMultiDrawElementsANGLE(context, modePacked, counts, typePacked,
@@ -33163,8 +32957,7 @@
                                                              GLsizei drawcount)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::MultiDrawElementsInstancedANGLE,
-          "glMultiDrawElementsInstancedANGLE",
+    EVENT(context, GLMultiDrawElementsInstancedANGLE,
           "context = %d, mode = %s, counts = 0x%016" PRIxPTR ", type = %s, indices = 0x%016" PRIxPTR
           ", instanceCounts = 0x%016" PRIxPTR ", drawcount = %d",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), (uintptr_t)counts,
@@ -33174,8 +32967,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -33203,8 +32996,7 @@
                                                                   GLuint baseInstance)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DrawArraysInstancedBaseInstanceANGLE,
-          "glDrawArraysInstancedBaseInstanceANGLE",
+    EVENT(context, GLDrawArraysInstancedBaseInstanceANGLE,
           "context = %d, mode = %s, first = %d, count = %d, instanceCount = %d, baseInstance = %u",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), first, count,
           instanceCount, baseInstance);
@@ -33212,7 +33004,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateDrawArraysInstancedBaseInstanceANGLE(
@@ -33242,8 +33034,7 @@
                                                              GLuint baseInstance)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::DrawElementsInstancedBaseVertexBaseInstanceANGLE,
-          "glDrawElementsInstancedBaseVertexBaseInstanceANGLE",
+    EVENT(context, GLDrawElementsInstancedBaseVertexBaseInstanceANGLE,
           "context = %d, mode = %s, count = %d, type = %s, indices = 0x%016" PRIxPTR
           ", instanceCounts = %d, baseVertex = %d, baseInstance = %u",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), count,
@@ -33253,8 +33044,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateDrawElementsInstancedBaseVertexBaseInstanceANGLE(
@@ -33285,8 +33076,7 @@
                                                       GLsizei drawcount)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::MultiDrawArraysInstancedBaseInstanceANGLE,
-          "glMultiDrawArraysInstancedBaseInstanceANGLE",
+    EVENT(context, GLMultiDrawArraysInstancedBaseInstanceANGLE,
           "context = %d, mode = %s, firsts = 0x%016" PRIxPTR ", counts = 0x%016" PRIxPTR
           ", instanceCounts = 0x%016" PRIxPTR ", baseInstances = 0x%016" PRIxPTR ", drawcount = %d",
           CID(context), GLenumToString(GLenumGroup::PrimitiveType, mode), (uintptr_t)firsts,
@@ -33295,7 +33085,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -33327,8 +33117,7 @@
                                                                   GLsizei drawcount)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::MultiDrawElementsInstancedBaseVertexBaseInstanceANGLE,
-          "glMultiDrawElementsInstancedBaseVertexBaseInstanceANGLE",
+    EVENT(context, GLMultiDrawElementsInstancedBaseVertexBaseInstanceANGLE,
           "context = %d, mode = %s, counts = 0x%016" PRIxPTR ", type = %s, indices = 0x%016" PRIxPTR
           ", instanceCounts = 0x%016" PRIxPTR ", baseVertices = 0x%016" PRIxPTR
           ", baseInstances = 0x%016" PRIxPTR ", drawcount = %d",
@@ -33339,8 +33128,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        PrimitiveMode modePacked                              = FromGL<PrimitiveMode>(mode);
-        DrawElementsType typePacked                           = FromGL<DrawElementsType>(type);
+        PrimitiveMode modePacked                              = PackParam<PrimitiveMode>(mode);
+        DrawElementsType typePacked                           = PackParam<DrawElementsType>(type);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateMultiDrawElementsInstancedBaseVertexBaseInstanceANGLE(
@@ -33368,7 +33157,7 @@
                                                    GLfloat *val)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetMultisamplefvANGLE, "glGetMultisamplefvANGLE",
+    EVENT(context, GLGetMultisamplefvANGLE,
           "context = %d, pname = %s, index = %u, val = 0x%016" PRIxPTR "", CID(context),
           GLenumToString(GLenumGroup::DefaultGroup, pname), index, (uintptr_t)val);
 
@@ -33393,9 +33182,8 @@
 void GL_APIENTRY SampleMaskiANGLEContextANGLE(GLeglContext ctx, GLuint maskNumber, GLbitfield mask)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::SampleMaskiANGLE, "glSampleMaskiANGLE",
-          "context = %d, maskNumber = %u, mask = %s", CID(context), maskNumber,
-          GLbitfieldToString(GLenumGroup::DefaultGroup, mask).c_str());
+    EVENT(context, GLSampleMaskiANGLE, "context = %d, maskNumber = %u, mask = %s", CID(context),
+          maskNumber, GLbitfieldToString(GLenumGroup::DefaultGroup, mask).c_str());
 
     if (context && !context->isContextLost())
     {
@@ -33418,14 +33206,13 @@
 void GL_APIENTRY ProvokingVertexANGLEContextANGLE(GLeglContext ctx, GLenum mode)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ProvokingVertexANGLE, "glProvokingVertexANGLE",
-          "context = %d, mode = %s", CID(context),
+    EVENT(context, GLProvokingVertexANGLE, "context = %d, mode = %s", CID(context),
           GLenumToString(GLenumGroup::VertexProvokingMode, mode));
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        ProvokingVertexConvention modePacked = FromGL<ProvokingVertexConvention>(mode);
+        ProvokingVertexConvention modePacked = PackParam<ProvokingVertexConvention>(mode);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateProvokingVertexANGLE(context, modePacked));
@@ -33444,16 +33231,15 @@
 void GL_APIENTRY LoseContextCHROMIUMContextANGLE(GLeglContext ctx, GLenum current, GLenum other)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::LoseContextCHROMIUM, "glLoseContextCHROMIUM",
-          "context = %d, current = %s, other = %s", CID(context),
+    EVENT(context, GLLoseContextCHROMIUM, "context = %d, current = %s, other = %s", CID(context),
           GLenumToString(GLenumGroup::GraphicsResetStatus, current),
           GLenumToString(GLenumGroup::GraphicsResetStatus, other));
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        GraphicsResetStatus currentPacked = FromGL<GraphicsResetStatus>(current);
-        GraphicsResetStatus otherPacked   = FromGL<GraphicsResetStatus>(other);
+        GraphicsResetStatus currentPacked = PackParam<GraphicsResetStatus>(current);
+        GraphicsResetStatus otherPacked   = PackParam<GraphicsResetStatus>(other);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateLoseContextCHROMIUM(context, currentPacked, otherPacked));
@@ -33480,7 +33266,7 @@
                                                      GLenum type)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexImage2DExternalANGLE, "glTexImage2DExternalANGLE",
+    EVENT(context, GLTexImage2DExternalANGLE,
           "context = %d, target = %s, level = %d, internalformat = %d, width = %d, height = %d, "
           "border = %d, format = %s, type = %s",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level, internalformat,
@@ -33490,7 +33276,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -33513,14 +33299,13 @@
 void GL_APIENTRY InvalidateTextureANGLEContextANGLE(GLeglContext ctx, GLenum target)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::InvalidateTextureANGLE, "glInvalidateTextureANGLE",
-          "context = %d, target = %s", CID(context),
+    EVENT(context, GLInvalidateTextureANGLE, "context = %d, target = %s", CID(context),
           GLenumToString(GLenumGroup::TextureTarget, target));
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateInvalidateTextureANGLE(context, targetPacked));
@@ -33544,7 +33329,7 @@
                                               void *pixels)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetTexImageANGLE, "glGetTexImageANGLE",
+    EVENT(context, GLGetTexImageANGLE,
           "context = %d, target = %s, level = %d, format = %s, type = %s, pixels = 0x%016" PRIxPTR
           "",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), level,
@@ -33554,7 +33339,7 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureTarget targetPacked                            = FromGL<TextureTarget>(target);
+        TextureTarget targetPacked                            = PackParam<TextureTarget>(target);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -33579,7 +33364,7 @@
                                                        void *pixels)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::GetRenderbufferImageANGLE, "glGetRenderbufferImageANGLE",
+    EVENT(context, GLGetRenderbufferImageANGLE,
           "context = %d, target = %s, format = %s, type = %s, pixels = 0x%016" PRIxPTR "",
           CID(context), GLenumToString(GLenumGroup::RenderbufferTarget, target),
           GLenumToString(GLenumGroup::PixelFormat, format),
@@ -33617,7 +33402,7 @@
                                                        GLbitfield usageFlags)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexStorageMemFlags2DANGLE, "glTexStorageMemFlags2DANGLE",
+    EVENT(context, GLTexStorageMemFlags2DANGLE,
           "context = %d, target = %s, levels = %d, internalFormat = %s, width = %d, height = %d, "
           "memory = %u, offset = %llu, createFlags = %s, usageFlags = %s",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), levels,
@@ -33629,8 +33414,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        MemoryObjectID memoryPacked                           = FromGL<MemoryObjectID>(memory);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        MemoryObjectID memoryPacked                           = PackParam<MemoryObjectID>(memory);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexStorageMemFlags2DANGLE(
@@ -33664,8 +33449,7 @@
 {
     Context *context = static_cast<gl::Context *>(ctx);
     EVENT(
-        context, gl::EntryPoint::TexStorageMemFlags2DMultisampleANGLE,
-        "glTexStorageMemFlags2DMultisampleANGLE",
+        context, GLTexStorageMemFlags2DMultisampleANGLE,
         "context = %d, target = %s, samples = %d, internalFormat = %s, width = %d, height = %d, "
         "fixedSampleLocations = %s, memory = %u, offset = %llu, createFlags = %s, usageFlags = %s",
         CID(context), GLenumToString(GLenumGroup::TextureTarget, target), samples,
@@ -33677,8 +33461,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        MemoryObjectID memoryPacked                           = FromGL<MemoryObjectID>(memory);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        MemoryObjectID memoryPacked                           = PackParam<MemoryObjectID>(memory);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -33714,7 +33498,7 @@
                                                        GLbitfield usageFlags)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexStorageMemFlags3DANGLE, "glTexStorageMemFlags3DANGLE",
+    EVENT(context, GLTexStorageMemFlags3DANGLE,
           "context = %d, target = %s, levels = %d, internalFormat = %s, width = %d, height = %d, "
           "depth = %d, memory = %u, offset = %llu, createFlags = %s, usageFlags = %s",
           CID(context), GLenumToString(GLenumGroup::TextureTarget, target), levels,
@@ -33726,8 +33510,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        MemoryObjectID memoryPacked                           = FromGL<MemoryObjectID>(memory);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        MemoryObjectID memoryPacked                           = PackParam<MemoryObjectID>(memory);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateTexStorageMemFlags3DANGLE(
@@ -33762,8 +33546,7 @@
                                                                   GLbitfield usageFlags)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::TexStorageMemFlags3DMultisampleANGLE,
-          "glTexStorageMemFlags3DMultisampleANGLE",
+    EVENT(context, GLTexStorageMemFlags3DMultisampleANGLE,
           "context = %d, target = %s, samples = %d, internalFormat = %s, width = %d, height = %d, "
           "depth = %d, fixedSampleLocations = %s, memory = %u, offset = %llu, createFlags = %s, "
           "usageFlags = %s",
@@ -33776,8 +33559,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        TextureType targetPacked                              = FromGL<TextureType>(target);
-        MemoryObjectID memoryPacked                           = FromGL<MemoryObjectID>(memory);
+        TextureType targetPacked                              = PackParam<TextureType>(target);
+        MemoryObjectID memoryPacked                           = PackParam<MemoryObjectID>(memory);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() ||
@@ -33807,7 +33590,7 @@
                                                            GLuint handle)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ImportMemoryZirconHandleANGLE, "glImportMemoryZirconHandleANGLE",
+    EVENT(context, GLImportMemoryZirconHandleANGLE,
           "context = %d, memory = %u, size = %llu, handleType = %s, handle = %u", CID(context),
           memory, static_cast<unsigned long long>(size),
           GLenumToString(GLenumGroup::ExternalHandleType, handleType), handle);
@@ -33815,8 +33598,8 @@
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        MemoryObjectID memoryPacked                           = FromGL<MemoryObjectID>(memory);
-        HandleType handleTypePacked                           = FromGL<HandleType>(handleType);
+        MemoryObjectID memoryPacked                           = PackParam<MemoryObjectID>(memory);
+        HandleType handleTypePacked                           = PackParam<HandleType>(handleType);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid                                      = (context->skipValidation() ||
                             ValidateImportMemoryZirconHandleANGLE(context, memoryPacked, size,
@@ -33840,16 +33623,15 @@
                                                               GLuint handle)
 {
     Context *context = static_cast<gl::Context *>(ctx);
-    EVENT(context, gl::EntryPoint::ImportSemaphoreZirconHandleANGLE,
-          "glImportSemaphoreZirconHandleANGLE",
+    EVENT(context, GLImportSemaphoreZirconHandleANGLE,
           "context = %d, semaphore = %u, handleType = %s, handle = %u", CID(context), semaphore,
           GLenumToString(GLenumGroup::ExternalHandleType, handleType), handle);
 
     if (context && !context->isContextLost())
     {
         ASSERT(context == GetValidGlobalContext());
-        SemaphoreID semaphorePacked                           = FromGL<SemaphoreID>(semaphore);
-        HandleType handleTypePacked                           = FromGL<HandleType>(handleType);
+        SemaphoreID semaphorePacked                           = PackParam<SemaphoreID>(semaphore);
+        HandleType handleTypePacked                           = PackParam<HandleType>(handleType);
         std::unique_lock<angle::GlobalMutex> shareContextLock = GetShareGroupLock(context);
         bool isCallValid =
             (context->skipValidation() || ValidateImportSemaphoreZirconHandleANGLE(
diff --git a/src/libGLESv2/entry_points_gles_ext_autogen.h b/src/libGLESv2/entry_points_gles_ext_autogen.h
index 5a5c488..c75804f 100644
--- a/src/libGLESv2/entry_points_gles_ext_autogen.h
+++ b/src/libGLESv2/entry_points_gles_ext_autogen.h
@@ -689,6 +689,14 @@
                                                   GLsizei srcHeight,
                                                   GLsizei srcDepth);
 
+// GL_EXT_debug_label
+ANGLE_EXPORT void GL_APIENTRY
+GetObjectLabelEXT(GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label);
+ANGLE_EXPORT void GL_APIENTRY LabelObjectEXT(GLenum type,
+                                             GLuint object,
+                                             GLsizei length,
+                                             const GLchar *label);
+
 // GL_EXT_debug_marker
 ANGLE_EXPORT void GL_APIENTRY InsertEventMarkerEXT(GLsizei length, const GLchar *marker);
 ANGLE_EXPORT void GL_APIENTRY PopGroupMarkerEXT();
@@ -1054,6 +1062,8 @@
                                                   GLuint program);
 ANGLE_EXPORT void GL_APIENTRY ValidateProgramPipelineEXT(GLuint pipeline);
 
+// GL_EXT_shader_io_blocks
+
 // GL_EXT_tessellation_shader
 ANGLE_EXPORT void GL_APIENTRY PatchParameteriEXT(GLenum pname, GLint value);
 
@@ -1297,6 +1307,8 @@
 // GL_OES_sample_shading
 ANGLE_EXPORT void GL_APIENTRY MinSampleShadingOES(GLfloat value);
 
+// GL_OES_shader_io_blocks
+
 // GL_OES_texture_3D
 ANGLE_EXPORT void GL_APIENTRY CompressedTexImage3DOES(GLenum target,
                                                       GLint level,
@@ -2455,6 +2467,12 @@
                                                          GLsizei bufSize,
                                                          GLsizei *length,
                                                          GLchar *label);
+ANGLE_EXPORT void GL_APIENTRY GetObjectLabelEXTContextANGLE(GLeglContext ctx,
+                                                            GLenum type,
+                                                            GLuint object,
+                                                            GLsizei bufSize,
+                                                            GLsizei *length,
+                                                            GLchar *label);
 ANGLE_EXPORT void GL_APIENTRY GetObjectLabelKHRContextANGLE(GLeglContext ctx,
                                                             GLenum identifier,
                                                             GLuint name,
@@ -2853,6 +2871,11 @@
 ANGLE_EXPORT GLboolean GL_APIENTRY IsTransformFeedbackContextANGLE(GLeglContext ctx, GLuint id);
 ANGLE_EXPORT GLboolean GL_APIENTRY IsVertexArrayContextANGLE(GLeglContext ctx, GLuint array);
 ANGLE_EXPORT GLboolean GL_APIENTRY IsVertexArrayOESContextANGLE(GLeglContext ctx, GLuint array);
+ANGLE_EXPORT void GL_APIENTRY LabelObjectEXTContextANGLE(GLeglContext ctx,
+                                                         GLenum type,
+                                                         GLuint object,
+                                                         GLsizei length,
+                                                         const GLchar *label);
 ANGLE_EXPORT void GL_APIENTRY LightModelfContextANGLE(GLeglContext ctx,
                                                       GLenum pname,
                                                       GLfloat param);
diff --git a/src/libGLESv2/global_state.cpp b/src/libGLESv2/global_state.cpp
index 976f853..7fea908 100644
--- a/src/libGLESv2/global_state.cpp
+++ b/src/libGLESv2/global_state.cpp
@@ -12,6 +12,7 @@
 #include "common/platform.h"
 #include "common/system_utils.h"
 #include "libANGLE/ErrorStrings.h"
+#include "libANGLE/Thread.h"
 #include "libGLESv2/resource.h"
 
 #include <atomic>
@@ -20,8 +21,6 @@
 {
 namespace
 {
-Debug *g_Debug = nullptr;
-
 ANGLE_REQUIRE_CONSTANT_INIT std::atomic<angle::GlobalMutex *> g_Mutex(nullptr);
 static_assert(std::is_trivially_destructible<decltype(g_Mutex)>::value,
               "global mutex is not trivially destructible");
@@ -38,7 +37,11 @@
 
 Thread *AllocateCurrentThread()
 {
-    gCurrentThread = new Thread();
+    {
+        // Global thread intentionally leaked
+        ANGLE_SCOPED_DISABLE_LSAN();
+        gCurrentThread = new Thread();
+    }
 
     // Initialize fast TLS slot
     SetContextToAndroidOpenGLTLSSlot(nullptr);
@@ -47,15 +50,6 @@
     return gCurrentThread;
 }
 
-void AllocateDebug()
-{
-    // All EGL calls use a global lock, this is thread safe
-    if (g_Debug == nullptr)
-    {
-        g_Debug = new Debug();
-    }
-}
-
 void AllocateMutex()
 {
     if (g_Mutex == nullptr)
@@ -85,12 +79,6 @@
     return (current ? current : AllocateCurrentThread());
 }
 
-Debug *GetDebug()
-{
-    AllocateDebug();
-    return g_Debug;
-}
-
 void SetContextCurrent(Thread *thread, gl::Context *context)
 {
     ASSERT(gCurrentThread);
@@ -122,17 +110,11 @@
 
 namespace
 {
-
 void DeallocateCurrentThread()
 {
     SafeDelete(gCurrentThread);
 }
 
-void DeallocateDebug()
-{
-    SafeDelete(g_Debug);
-}
-
 void DeallocateMutex()
 {
     angle::GlobalMutex *mutex = g_Mutex.exchange(nullptr);
@@ -145,8 +127,7 @@
 
 bool InitializeProcess()
 {
-    ASSERT(g_Debug == nullptr);
-    AllocateDebug();
+    EnsureDebugAllocated();
     AllocateMutex();
     return AllocateCurrentThread() != nullptr;
 }
diff --git a/src/libGLESv2/libGLESv2_autogen.cpp b/src/libGLESv2/libGLESv2_autogen.cpp
index ba89274..a69c97c 100644
--- a/src/libGLESv2/libGLESv2_autogen.cpp
+++ b/src/libGLESv2/libGLESv2_autogen.cpp
@@ -5,7 +5,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// libGLESv2.cpp: Implements the exported OpenGL ES functions.
+// libGLESv2_autogen.cpp: Implements the exported OpenGL ES functions.
 
 #include "angle_gl.h"
 
@@ -3832,6 +3832,18 @@
                                    srcDepth);
 }
 
+// GL_EXT_debug_label
+void GL_APIENTRY
+glGetObjectLabelEXT(GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label)
+{
+    return gl::GetObjectLabelEXT(type, object, bufSize, length, label);
+}
+
+void GL_APIENTRY glLabelObjectEXT(GLenum type, GLuint object, GLsizei length, const GLchar *label)
+{
+    return gl::LabelObjectEXT(type, object, length, label);
+}
+
 // GL_EXT_debug_marker
 void GL_APIENTRY glInsertEventMarkerEXT(GLsizei length, const GLchar *marker)
 {
@@ -4594,6 +4606,8 @@
     return gl::ValidateProgramPipelineEXT(pipeline);
 }
 
+// GL_EXT_shader_io_blocks
+
 // GL_EXT_tessellation_shader
 void GL_APIENTRY glPatchParameteriEXT(GLenum pname, GLint value)
 {
@@ -5104,6 +5118,8 @@
     return gl::MinSampleShadingOES(value);
 }
 
+// GL_OES_shader_io_blocks
+
 // GL_OES_texture_3D
 void GL_APIENTRY glCompressedTexImage3DOES(GLenum target,
                                            GLint level,
@@ -7368,6 +7384,16 @@
     return gl::GetObjectLabelContextANGLE(ctx, identifier, name, bufSize, length, label);
 }
 
+void GL_APIENTRY glGetObjectLabelEXTContextANGLE(GLeglContext ctx,
+                                                 GLenum type,
+                                                 GLuint object,
+                                                 GLsizei bufSize,
+                                                 GLsizei *length,
+                                                 GLchar *label)
+{
+    return gl::GetObjectLabelEXTContextANGLE(ctx, type, object, bufSize, length, label);
+}
+
 void GL_APIENTRY glGetObjectLabelKHRContextANGLE(GLeglContext ctx,
                                                  GLenum identifier,
                                                  GLuint name,
@@ -8180,6 +8206,15 @@
     return gl::IsVertexArrayOESContextANGLE(ctx, array);
 }
 
+void GL_APIENTRY glLabelObjectEXTContextANGLE(GLeglContext ctx,
+                                              GLenum type,
+                                              GLuint object,
+                                              GLsizei length,
+                                              const GLchar *label)
+{
+    return gl::LabelObjectEXTContextANGLE(ctx, type, object, length, label);
+}
+
 void GL_APIENTRY glLightModelfContextANGLE(GLeglContext ctx, GLenum pname, GLfloat param)
 {
     return gl::LightModelfContextANGLE(ctx, pname, param);
diff --git a/src/libGLESv2/libGLESv2_autogen.def b/src/libGLESv2/libGLESv2_autogen.def
index f1d08bd..bb732a7 100644
--- a/src/libGLESv2/libGLESv2_autogen.def
+++ b/src/libGLESv2/libGLESv2_autogen.def
@@ -626,6 +626,10 @@
     ; GL_EXT_copy_image
     glCopyImageSubDataEXT
 
+    ; GL_EXT_debug_label
+    glGetObjectLabelEXT
+    glLabelObjectEXT
+
     ; GL_EXT_debug_marker
     glInsertEventMarkerEXT
     glPopGroupMarkerEXT
@@ -774,6 +778,8 @@
     glUseProgramStagesEXT
     glValidateProgramPipelineEXT
 
+    ; GL_EXT_shader_io_blocks
+
     ; GL_EXT_tessellation_shader
     glPatchParameteriEXT
 
@@ -906,6 +912,8 @@
     ; GL_OES_sample_shading
     glMinSampleShadingOES
 
+    ; GL_OES_shader_io_blocks
+
     ; GL_OES_texture_3D
     glCompressedTexImage3DOES
     glCompressedTexSubImage3DOES
@@ -1253,6 +1261,7 @@
     glGetMultisamplefvANGLEContextANGLE
     glGetMultisamplefvRobustANGLEContextANGLE
     glGetObjectLabelContextANGLE
+    glGetObjectLabelEXTContextANGLE
     glGetObjectLabelKHRContextANGLE
     glGetObjectPtrLabelContextANGLE
     glGetObjectPtrLabelKHRContextANGLE
@@ -1398,6 +1407,7 @@
     glIsTransformFeedbackContextANGLE
     glIsVertexArrayContextANGLE
     glIsVertexArrayOESContextANGLE
+    glLabelObjectEXTContextANGLE
     glLightModelfContextANGLE
     glLightModelfvContextANGLE
     glLightModelxContextANGLE
diff --git a/src/libGLESv2/libGLESv2_no_capture_autogen.def b/src/libGLESv2/libGLESv2_no_capture_autogen.def
index 35a43a9..e4c1fff 100644
--- a/src/libGLESv2/libGLESv2_no_capture_autogen.def
+++ b/src/libGLESv2/libGLESv2_no_capture_autogen.def
@@ -626,6 +626,10 @@
     ; GL_EXT_copy_image
     glCopyImageSubDataEXT
 
+    ; GL_EXT_debug_label
+    glGetObjectLabelEXT
+    glLabelObjectEXT
+
     ; GL_EXT_debug_marker
     glInsertEventMarkerEXT
     glPopGroupMarkerEXT
@@ -774,6 +778,8 @@
     glUseProgramStagesEXT
     glValidateProgramPipelineEXT
 
+    ; GL_EXT_shader_io_blocks
+
     ; GL_EXT_tessellation_shader
     glPatchParameteriEXT
 
@@ -906,6 +912,8 @@
     ; GL_OES_sample_shading
     glMinSampleShadingOES
 
+    ; GL_OES_shader_io_blocks
+
     ; GL_OES_texture_3D
     glCompressedTexImage3DOES
     glCompressedTexSubImage3DOES
@@ -1253,6 +1261,7 @@
     glGetMultisamplefvANGLEContextANGLE
     glGetMultisamplefvRobustANGLEContextANGLE
     glGetObjectLabelContextANGLE
+    glGetObjectLabelEXTContextANGLE
     glGetObjectLabelKHRContextANGLE
     glGetObjectPtrLabelContextANGLE
     glGetObjectPtrLabelKHRContextANGLE
@@ -1398,6 +1407,7 @@
     glIsTransformFeedbackContextANGLE
     glIsVertexArrayContextANGLE
     glIsVertexArrayOESContextANGLE
+    glLabelObjectEXTContextANGLE
     glLightModelfContextANGLE
     glLightModelfvContextANGLE
     glLightModelxContextANGLE
diff --git a/src/libGLESv2/libGLESv2_with_capture_autogen.def b/src/libGLESv2/libGLESv2_with_capture_autogen.def
index 8bcc17c..e515623 100644
--- a/src/libGLESv2/libGLESv2_with_capture_autogen.def
+++ b/src/libGLESv2/libGLESv2_with_capture_autogen.def
@@ -626,6 +626,10 @@
     ; GL_EXT_copy_image
     glCopyImageSubDataEXT
 
+    ; GL_EXT_debug_label
+    glGetObjectLabelEXT
+    glLabelObjectEXT
+
     ; GL_EXT_debug_marker
     glInsertEventMarkerEXT
     glPopGroupMarkerEXT
@@ -774,6 +778,8 @@
     glUseProgramStagesEXT
     glValidateProgramPipelineEXT
 
+    ; GL_EXT_shader_io_blocks
+
     ; GL_EXT_tessellation_shader
     glPatchParameteriEXT
 
@@ -906,6 +912,8 @@
     ; GL_OES_sample_shading
     glMinSampleShadingOES
 
+    ; GL_OES_shader_io_blocks
+
     ; GL_OES_texture_3D
     glCompressedTexImage3DOES
     glCompressedTexSubImage3DOES
@@ -1253,6 +1261,7 @@
     glGetMultisamplefvANGLEContextANGLE
     glGetMultisamplefvRobustANGLEContextANGLE
     glGetObjectLabelContextANGLE
+    glGetObjectLabelEXTContextANGLE
     glGetObjectLabelKHRContextANGLE
     glGetObjectPtrLabelContextANGLE
     glGetObjectPtrLabelKHRContextANGLE
@@ -1398,6 +1407,7 @@
     glIsTransformFeedbackContextANGLE
     glIsVertexArrayContextANGLE
     glIsVertexArrayOESContextANGLE
+    glLabelObjectEXTContextANGLE
     glLightModelfContextANGLE
     glLightModelfvContextANGLE
     glLightModelxContextANGLE
diff --git a/src/libGLESv2/proc_table_egl_autogen.cpp b/src/libGLESv2/proc_table_egl_autogen.cpp
index f53657a..753ab81 100644
--- a/src/libGLESv2/proc_table_egl_autogen.cpp
+++ b/src/libGLESv2/proc_table_egl_autogen.cpp
@@ -12,8 +12,8 @@
 
 #include "libGLESv2/proc_table_egl.h"
 
-#include "libGLESv2/entry_points_egl.h"
-#include "libGLESv2/entry_points_egl_ext.h"
+#include "libGLESv2/entry_points_egl_autogen.h"
+#include "libGLESv2/entry_points_egl_ext_autogen.h"
 #include "libGLESv2/entry_points_gles_1_0_autogen.h"
 #include "libGLESv2/entry_points_gles_2_0_autogen.h"
 #include "libGLESv2/entry_points_gles_3_0_autogen.h"
@@ -742,6 +742,8 @@
     {"glGetMultisamplefvRobustANGLEContextANGLE", P(gl::GetMultisamplefvRobustANGLEContextANGLE)},
     {"glGetObjectLabel", P(gl::GetObjectLabel)},
     {"glGetObjectLabelContextANGLE", P(gl::GetObjectLabelContextANGLE)},
+    {"glGetObjectLabelEXT", P(gl::GetObjectLabelEXT)},
+    {"glGetObjectLabelEXTContextANGLE", P(gl::GetObjectLabelEXTContextANGLE)},
     {"glGetObjectLabelKHR", P(gl::GetObjectLabelKHR)},
     {"glGetObjectLabelKHRContextANGLE", P(gl::GetObjectLabelKHRContextANGLE)},
     {"glGetObjectPtrLabel", P(gl::GetObjectPtrLabel)},
@@ -1054,6 +1056,8 @@
     {"glIsVertexArrayContextANGLE", P(gl::IsVertexArrayContextANGLE)},
     {"glIsVertexArrayOES", P(gl::IsVertexArrayOES)},
     {"glIsVertexArrayOESContextANGLE", P(gl::IsVertexArrayOESContextANGLE)},
+    {"glLabelObjectEXT", P(gl::LabelObjectEXT)},
+    {"glLabelObjectEXTContextANGLE", P(gl::LabelObjectEXTContextANGLE)},
     {"glLightModelf", P(gl::LightModelf)},
     {"glLightModelfContextANGLE", P(gl::LightModelfContextANGLE)},
     {"glLightModelfv", P(gl::LightModelfv)},
@@ -1731,5 +1735,5 @@
     {"glWeightPointerOES", P(gl::WeightPointerOES)},
     {"glWeightPointerOESContextANGLE", P(gl::WeightPointerOESContextANGLE)}};
 
-const size_t g_numProcs = 1633;
+const size_t g_numProcs = 1637;
 }  // namespace egl
diff --git a/src/tests/BUILD.gn b/src/tests/BUILD.gn
index 80156aa..fa62a90 100644
--- a/src/tests/BUILD.gn
+++ b/src/tests/BUILD.gn
@@ -12,8 +12,8 @@
   build_angle_deqp_tests = false
   build_angle_gles1_conform_tests = false
   build_angle_trace_perf_tests = false
-  build_angle_perftests =
-      is_win || is_linux || is_chromeos || is_android || is_mac || is_fuchsia
+  build_angle_perftests = is_win || is_linux || is_chromeos || is_android ||
+                          is_mac || is_fuchsia || is_ios
 }
 
 angle_test("test_utils_unittest_helper") {
@@ -80,7 +80,7 @@
       "test_utils/angle_test_platform.h",
       "test_utils/gl_raii.h",
     ]
-    if (is_mac) {
+    if (is_mac || is_ios) {
       sources += [
         "test_utils/angle_test_instantiate_apple.h",
         "test_utils/angle_test_instantiate_apple.mm",
@@ -135,7 +135,8 @@
   }
 }
 
-if (is_win || is_linux || is_chromeos || is_mac || is_android || is_fuchsia) {
+if (is_win || is_linux || is_chromeos || is_mac || is_android || is_fuchsia ||
+    is_ios) {
   import("angle_end2end_tests.gni")
 
   angle_test("angle_end2end_tests") {
@@ -144,7 +145,7 @@
     sources = angle_end2end_tests_sources + [ "angle_end2end_tests_main.cpp" ]
     libs = []
 
-    if (is_mac) {
+    if (is_mac || (is_ios && target_environment != "simulator")) {
       sources += angle_end2end_tests_mac_sources
       frameworks = [
         "CoreFoundation.framework",
@@ -191,7 +192,7 @@
   }
 }
 
-if (is_win || is_linux || is_chromeos || is_mac || is_android) {
+if (is_win || is_linux || is_chromeos || is_mac || is_android || is_ios) {
   import("angle_white_box_tests.gni")
 
   angle_test("angle_white_box_tests") {
@@ -265,7 +266,7 @@
   test_utils = ":angle_common_test_utils_static"
 }
 
-if (is_win || is_linux || is_chromeos || is_android || is_mac) {
+if (is_win || is_linux || is_chromeos || is_android || is_mac || is_ios) {
   import("angle_perftests.gni")
 
   # This test suite is for perf tests that use ANGLE's internals in some direct way.
@@ -283,7 +284,7 @@
 
     # These tests depend on vulkan_command_buffer_utils, which is
     # not yet compatible with mac
-    if (angle_enable_vulkan && !is_mac) {
+    if (angle_enable_vulkan && !is_mac && !is_ios) {
       sources += angle_white_box_perf_tests_vulkan_sources
       deps += [
         "$angle_glslang_dir:glslang_lib_sources",
@@ -383,7 +384,7 @@
     ]
 
     # This is used by the tests to typedef uint32_t. For some reason only needed on mac.
-    if (is_mac) {
+    if (is_mac || is_ios) {
       defines += [ "__linux" ]
     }
 
@@ -584,7 +585,7 @@
     ]
   }
 
-  if (!is_win && !is_mac) {
+  if (!is_win && !is_mac && !is_ios) {
     source_set("angle_gles1_covgl_no_gtest") {
       configs += [
         ":angle_gles1_conform_support",
@@ -886,7 +887,7 @@
       # This has to be GNU_SOURCE as on Linux dEQP uses syscall()
       defines += [ "_GNU_SOURCE" ]
     }
-    if (is_android || is_mac) {
+    if (is_android || is_mac || is_ios) {
       # _XOPEN_SOURCE=600 is what is used in deqp/src/Android.mk
       defines += [ "_XOPEN_SOURCE=600" ]
     }
@@ -1017,7 +1018,7 @@
     if (is_win) {
       sources += deqp_framework_delibs_sources_win
     }
-    if (is_linux || is_chromeos || is_android || is_mac) {
+    if (is_linux || is_chromeos || is_android || is_mac || is_ios) {
       sources += deqp_framework_delibs_sources_unix
     }
 
@@ -1455,7 +1456,7 @@
       ":angle_gles1_covegl_no_gtest",
       ":angle_gles1_primtest_tests",
     ]
-    if (!is_win && !is_mac) {
+    if (!is_win && !is_mac && !is_ios) {
       deps += [ ":angle_gles1_covgl_tests" ]
     }
   }
diff --git a/src/tests/angle_end2end_tests.gni b/src/tests/angle_end2end_tests.gni
index c887518..6e4ba33 100644
--- a/src/tests/angle_end2end_tests.gni
+++ b/src/tests/angle_end2end_tests.gni
@@ -155,6 +155,7 @@
   "gl_tests/gles1/CurrentTextureCoordsTest.cpp",
   "gl_tests/gles1/DrawTextureTest.cpp",
   "gl_tests/gles1/FogTest.cpp",
+  "gl_tests/gles1/FramebufferObjectTest.cpp",
   "gl_tests/gles1/LightsTest.cpp",
   "gl_tests/gles1/MaterialsTest.cpp",
   "gl_tests/gles1/MatrixBuiltinsTest.cpp",
diff --git a/src/tests/compiler_tests/CollectVariables_test.cpp b/src/tests/compiler_tests/CollectVariables_test.cpp
index 8da5f62..14148e8 100644
--- a/src/tests/compiler_tests/CollectVariables_test.cpp
+++ b/src/tests/compiler_tests/CollectVariables_test.cpp
@@ -1038,26 +1038,26 @@
     compile(shaderString);
 
     EXPECT_EQ(1u, mTranslator->getOutputVaryings().size());
-    EXPECT_TRUE(mTranslator->getInputVaryings().empty());
 
-    const auto &inBlocks = mTranslator->getInBlocks();
-    ASSERT_EQ(1u, inBlocks.size());
+    const std::vector<ShaderVariable> &inVaryings = mTranslator->getInputVaryings();
+    ASSERT_EQ(1u, inVaryings.size());
 
-    const InterfaceBlock *inBlock = &inBlocks[0];
-    EXPECT_EQ("gl_PerVertex", inBlock->name);
-    EXPECT_EQ("gl_in", inBlock->instanceName);
-    EXPECT_TRUE(inBlock->staticUse);
-    EXPECT_TRUE(inBlock->active);
-    EXPECT_TRUE(inBlock->isBuiltIn());
+    const ShaderVariable &glIn = inVaryings[0];
+    EXPECT_EQ("gl_in", glIn.name);
+    EXPECT_EQ("gl_PerVertex", glIn.structName);
+    EXPECT_TRUE(glIn.staticUse);
+    EXPECT_TRUE(glIn.active);
+    EXPECT_TRUE(glIn.isBuiltIn());
 
-    ASSERT_EQ(1u, inBlock->fields.size());
+    ASSERT_EQ(1u, glIn.fields.size());
 
-    const ShaderVariable &glPositionField = inBlock->fields[0];
+    const ShaderVariable &glPositionField = glIn.fields[0];
     EXPECT_EQ("gl_Position", glPositionField.name);
     EXPECT_FALSE(glPositionField.isArray());
     EXPECT_FALSE(glPositionField.isStruct());
     EXPECT_TRUE(glPositionField.staticUse);
-    EXPECT_TRUE(glPositionField.active);
+    // Tracking for "active" not set up currently.
+    // EXPECT_TRUE(glPositionField.active);
     EXPECT_TRUE(glPositionField.isBuiltIn());
     EXPECT_GLENUM_EQ(GL_HIGH_FLOAT, glPositionField.precision);
     EXPECT_GLENUM_EQ(GL_FLOAT_VEC4, glPositionField.type);
@@ -1081,12 +1081,12 @@
     {
         compileGeometryShaderWithInputPrimitive(kInputPrimitives[i], "", functionBody);
 
-        const auto &inBlocks = mTranslator->getInBlocks();
-        ASSERT_EQ(1u, inBlocks.size());
+        const std::vector<ShaderVariable> &inVaryings = mTranslator->getInputVaryings();
+        ASSERT_EQ(1u, inVaryings.size());
 
-        const InterfaceBlock *inBlock = &inBlocks[0];
-        ASSERT_EQ("gl_in", inBlock->instanceName);
-        EXPECT_EQ(kArraySizeForInputPrimitives[i], inBlock->arraySize);
+        const ShaderVariable &glIn = inVaryings[0];
+        ASSERT_EQ("gl_in", glIn.name);
+        EXPECT_EQ(kArraySizeForInputPrimitives[i], glIn.arraySizes[0]);
     }
 }
 
@@ -1107,20 +1107,19 @@
     compile(shaderString);
 
     EXPECT_EQ(1u, mTranslator->getOutputVaryings().size());
-    ASSERT_TRUE(mTranslator->getInBlocks().empty());
 
-    const auto &inputVaryings = mTranslator->getInputVaryings();
+    const std::vector<ShaderVariable> &inputVaryings = mTranslator->getInputVaryings();
     ASSERT_EQ(1u, inputVaryings.size());
 
-    const ShaderVariable *varying = &inputVaryings[0];
-    EXPECT_EQ("gl_PrimitiveIDIn", varying->name);
-    EXPECT_FALSE(varying->isArray());
-    EXPECT_FALSE(varying->isStruct());
-    EXPECT_TRUE(varying->staticUse);
-    EXPECT_TRUE(varying->active);
-    EXPECT_TRUE(varying->isBuiltIn());
-    EXPECT_GLENUM_EQ(GL_HIGH_INT, varying->precision);
-    EXPECT_GLENUM_EQ(GL_INT, varying->type);
+    const ShaderVariable &varying = inputVaryings[0];
+    EXPECT_EQ("gl_PrimitiveIDIn", varying.name);
+    EXPECT_FALSE(varying.isArray());
+    EXPECT_FALSE(varying.isStruct());
+    EXPECT_TRUE(varying.staticUse);
+    EXPECT_TRUE(varying.active);
+    EXPECT_TRUE(varying.isBuiltIn());
+    EXPECT_GLENUM_EQ(GL_HIGH_INT, varying.precision);
+    EXPECT_GLENUM_EQ(GL_INT, varying.type);
 }
 
 // Test collecting gl_InvocationID in a geometry shader.
@@ -1140,20 +1139,19 @@
     compile(shaderString);
 
     EXPECT_EQ(1u, mTranslator->getOutputVaryings().size());
-    ASSERT_TRUE(mTranslator->getInBlocks().empty());
 
-    const auto &inputVaryings = mTranslator->getInputVaryings();
+    const std::vector<ShaderVariable> &inputVaryings = mTranslator->getInputVaryings();
     ASSERT_EQ(1u, inputVaryings.size());
 
-    const ShaderVariable *varying = &inputVaryings[0];
-    EXPECT_EQ("gl_InvocationID", varying->name);
-    EXPECT_FALSE(varying->isArray());
-    EXPECT_FALSE(varying->isStruct());
-    EXPECT_TRUE(varying->staticUse);
-    EXPECT_TRUE(varying->active);
-    EXPECT_TRUE(varying->isBuiltIn());
-    EXPECT_GLENUM_EQ(GL_HIGH_INT, varying->precision);
-    EXPECT_GLENUM_EQ(GL_INT, varying->type);
+    const ShaderVariable &varying = inputVaryings[0];
+    EXPECT_EQ("gl_InvocationID", varying.name);
+    EXPECT_FALSE(varying.isArray());
+    EXPECT_FALSE(varying.isStruct());
+    EXPECT_TRUE(varying.staticUse);
+    EXPECT_TRUE(varying.active);
+    EXPECT_TRUE(varying.isBuiltIn());
+    EXPECT_GLENUM_EQ(GL_HIGH_INT, varying.precision);
+    EXPECT_GLENUM_EQ(GL_INT, varying.type);
 }
 
 // Test collecting gl_in in a geometry shader when gl_in is indexed by an expression.
@@ -1174,16 +1172,28 @@
 
     EXPECT_EQ(1u, mTranslator->getOutputVaryings().size());
 
-    const auto &inBlocks = mTranslator->getInBlocks();
-    ASSERT_EQ(1u, inBlocks.size());
-    const InterfaceBlock *inBlock = &inBlocks[0];
-    EXPECT_EQ("gl_PerVertex", inBlock->name);
-    EXPECT_EQ("gl_in", inBlock->instanceName);
+    const std::vector<ShaderVariable> &inVaryings = mTranslator->getInputVaryings();
+    ASSERT_EQ(2u, inVaryings.size());
 
-    const auto &inputVaryings = mTranslator->getInputVaryings();
-    ASSERT_EQ(1u, inputVaryings.size());
-    const ShaderVariable *glInvocationID = &inputVaryings[0];
-    EXPECT_EQ("gl_InvocationID", glInvocationID->name);
+    bool foundGLIn         = false;
+    bool foundInvocationID = false;
+
+    for (const ShaderVariable &varying : inVaryings)
+    {
+        if (varying.name == "gl_in")
+        {
+            foundGLIn = true;
+            EXPECT_TRUE(varying.isShaderIOBlock);
+            EXPECT_EQ("gl_PerVertex", varying.structName);
+        }
+        else if (varying.name == "gl_InvocationID")
+        {
+            foundInvocationID = true;
+        }
+    }
+
+    EXPECT_TRUE(foundGLIn);
+    EXPECT_TRUE(foundInvocationID);
 }
 
 // Test collecting gl_Position in a geometry shader.
@@ -1202,20 +1212,19 @@
     compile(shaderString);
 
     ASSERT_TRUE(mTranslator->getInputVaryings().empty());
-    ASSERT_TRUE(mTranslator->getInBlocks().empty());
 
-    const auto &outputVaryings = mTranslator->getOutputVaryings();
+    const std::vector<ShaderVariable> &outputVaryings = mTranslator->getOutputVaryings();
     ASSERT_EQ(1u, outputVaryings.size());
 
-    const ShaderVariable *varying = &outputVaryings[0];
-    EXPECT_EQ("gl_Position", varying->name);
-    EXPECT_FALSE(varying->isArray());
-    EXPECT_FALSE(varying->isStruct());
-    EXPECT_TRUE(varying->staticUse);
-    EXPECT_TRUE(varying->active);
-    EXPECT_TRUE(varying->isBuiltIn());
-    EXPECT_GLENUM_EQ(GL_HIGH_FLOAT, varying->precision);
-    EXPECT_GLENUM_EQ(GL_FLOAT_VEC4, varying->type);
+    const ShaderVariable &varying = outputVaryings[0];
+    EXPECT_EQ("gl_Position", varying.name);
+    EXPECT_FALSE(varying.isArray());
+    EXPECT_FALSE(varying.isStruct());
+    EXPECT_TRUE(varying.staticUse);
+    EXPECT_TRUE(varying.active);
+    EXPECT_TRUE(varying.isBuiltIn());
+    EXPECT_GLENUM_EQ(GL_HIGH_FLOAT, varying.precision);
+    EXPECT_GLENUM_EQ(GL_FLOAT_VEC4, varying.type);
 }
 
 // Test collecting gl_PrimitiveID in a geometry shader.
@@ -1234,20 +1243,19 @@
     compile(shaderString);
 
     ASSERT_TRUE(mTranslator->getInputVaryings().empty());
-    ASSERT_TRUE(mTranslator->getInBlocks().empty());
 
-    const auto &OutputVaryings = mTranslator->getOutputVaryings();
-    ASSERT_EQ(1u, OutputVaryings.size());
+    const std::vector<ShaderVariable> &outputVaryings = mTranslator->getOutputVaryings();
+    ASSERT_EQ(1u, outputVaryings.size());
 
-    const ShaderVariable *varying = &OutputVaryings[0];
-    EXPECT_EQ("gl_PrimitiveID", varying->name);
-    EXPECT_FALSE(varying->isArray());
-    EXPECT_FALSE(varying->isStruct());
-    EXPECT_TRUE(varying->staticUse);
-    EXPECT_TRUE(varying->active);
-    EXPECT_TRUE(varying->isBuiltIn());
-    EXPECT_GLENUM_EQ(GL_HIGH_INT, varying->precision);
-    EXPECT_GLENUM_EQ(GL_INT, varying->type);
+    const ShaderVariable &varying = outputVaryings[0];
+    EXPECT_EQ("gl_PrimitiveID", varying.name);
+    EXPECT_FALSE(varying.isArray());
+    EXPECT_FALSE(varying.isStruct());
+    EXPECT_TRUE(varying.staticUse);
+    EXPECT_TRUE(varying.active);
+    EXPECT_TRUE(varying.isBuiltIn());
+    EXPECT_GLENUM_EQ(GL_HIGH_INT, varying.precision);
+    EXPECT_GLENUM_EQ(GL_INT, varying.type);
 }
 
 // Test collecting gl_Layer in a geometry shader.
@@ -1266,20 +1274,19 @@
     compile(shaderString);
 
     ASSERT_TRUE(mTranslator->getInputVaryings().empty());
-    ASSERT_TRUE(mTranslator->getInBlocks().empty());
 
-    const auto &OutputVaryings = mTranslator->getOutputVaryings();
-    ASSERT_EQ(1u, OutputVaryings.size());
+    const auto &outputVaryings = mTranslator->getOutputVaryings();
+    ASSERT_EQ(1u, outputVaryings.size());
 
-    const ShaderVariable *varying = &OutputVaryings[0];
-    EXPECT_EQ("gl_Layer", varying->name);
-    EXPECT_FALSE(varying->isArray());
-    EXPECT_FALSE(varying->isStruct());
-    EXPECT_TRUE(varying->staticUse);
-    EXPECT_TRUE(varying->active);
-    EXPECT_TRUE(varying->isBuiltIn());
-    EXPECT_GLENUM_EQ(GL_HIGH_INT, varying->precision);
-    EXPECT_GLENUM_EQ(GL_INT, varying->type);
+    const ShaderVariable &varying = outputVaryings[0];
+    EXPECT_EQ("gl_Layer", varying.name);
+    EXPECT_FALSE(varying.isArray());
+    EXPECT_FALSE(varying.isStruct());
+    EXPECT_TRUE(varying.staticUse);
+    EXPECT_TRUE(varying.active);
+    EXPECT_TRUE(varying.isBuiltIn());
+    EXPECT_GLENUM_EQ(GL_HIGH_INT, varying.precision);
+    EXPECT_GLENUM_EQ(GL_INT, varying.type);
 }
 
 // Test collecting gl_PrimitiveID in a fragment shader.
diff --git a/src/tests/deqp_support/deqp_gles2_test_expectations.txt b/src/tests/deqp_support/deqp_gles2_test_expectations.txt
index 4f89e79..719e80a 100644
--- a/src/tests/deqp_support/deqp_gles2_test_expectations.txt
+++ b/src/tests/deqp_support/deqp_gles2_test_expectations.txt
@@ -359,12 +359,6 @@
 4344 VULKAN ANDROID : dEQP-GLES2.functional.fragment_ops.random.62 = FAIL
 4344 VULKAN ANDROID : dEQP-GLES2.functional.fragment_ops.random.78 = FAIL
 
-// Failing on the Pixel2.
-172932466 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.shaders.indexing.tmp_array.float_const_write_dynamic_read_vertex = FAIL
-172932466 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.shaders.indexing.tmp_array.vec2_const_write_dynamic_read_vertex = FAIL
-172932466 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.shaders.indexing.tmp_array.vec3_const_write_dynamic_read_vertex = FAIL
-172932466 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.shaders.indexing.tmp_array.vec4_const_write_dynamic_read_vertex = FAIL
-
 // These tests also fail on AMD windows driver as it is not allowed to use emulation due to errors.
 3243 VULKAN WIN AMD : dEQP-GLES2.functional.shaders.texture_functions.vertex.texturecubelod = FAIL
 3243 VULKAN WIN AMD : dEQP-GLES2.functional.texture.mipmap.cube.basic.linear_nearest = FAIL
diff --git a/src/tests/deqp_support/deqp_gles31_test_expectations.txt b/src/tests/deqp_support/deqp_gles31_test_expectations.txt
index 51100b1..254c2dd 100644
--- a/src/tests/deqp_support/deqp_gles31_test_expectations.txt
+++ b/src/tests/deqp_support/deqp_gles31_test_expectations.txt
@@ -177,15 +177,26 @@
 //// General Vulkan expectations
 ////
 
-// Block name matching failure:
-3459 VULKAN : dEQP-GLES31.functional.shaders.linkage.es31.shader_storage_block.mismatch_with_and_without_instance_name = FAIL
-
 // Tessellation geometry interaction:
 3572 VULKAN : dEQP-GLES31.functional.tessellation_geometry_interaction.* = FAIL
 
 // Cannot create 2D (array) view of 3D texture.
 3886 VULKAN : dEQP-GLES31.functional.image_load_store.3d.*layer = FAIL
 
+// Geometry shader support:
+5430 VULKAN : dEQP-GLES31.functional.geometry_shading.query.primitives_generated_* = FAIL
+5407 VULKAN : dEQP-GLES31.functional.geometry_shading.layered.* = SKIP
+5407 VULKAN : dEQP-GLES31.functional.geometry_shading.instanced.invocation_per_layer* = SKIP
+5407 VULKAN : dEQP-GLES31.functional.geometry_shading.instanced.multiple_layers_per_invocation* = SKIP
+3571 VULKAN : dEQP-GLES31.functional.geometry_shading.*transform_feedback* = SKIP
+3571 VULKAN : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.*geo* = SKIP
+
+// Shader I/O blocks:
+// Missing matching of block names with unnamed SSBOs with the same member variable
+3580 VULKAN : dEQP-GLES31.functional.shaders.linkage.es31.shader_storage_block.ambiguous_variable_name_3 = FAIL
+// Missing matching of struct name in member fields of matching nameless I/O blocks
+3580 VULKAN : dEQP-GLES31.functional.separate_shader.validation.es31.io_blocks.mismatch_different_member_struct_names = FAIL
+
 ////
 //// AMD Vulkan expectations
 ////
@@ -336,10 +347,6 @@
 5370 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.copy_image.non_compressed.*rgba8ui_srgb8_alpha8.*to_renderbuffer = FAIL
 5370 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.copy_image.non_compressed.*srgb8_alpha8_rgba8.*to_renderbuffer = FAIL
 
-// Skip on Pixel2 to reduce the bots test time so that it won't timeout
-172936025 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.*.* = SKIP
-172936025 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.copy_image.compressed.viewclass_astc*.*.* = SKIP
-
 // Cannot support a seperate set of fragment shader input when per-sample shading:
 3588 VULKAN ANDROID : dEQP-GLES31.functional.shaders.sample_variables.sample_pos.correctness.multisample_*_1 = FAIL
 3588 VULKAN ANDROID : dEQP-GLES31.functional.shaders.sample_variables.sample_pos.correctness.multisample_*_2 = FAIL
diff --git a/src/tests/deqp_support/deqp_gles3_test_expectations.txt b/src/tests/deqp_support/deqp_gles3_test_expectations.txt
index 0022a59..bb0826d 100644
--- a/src/tests/deqp_support/deqp_gles3_test_expectations.txt
+++ b/src/tests/deqp_support/deqp_gles3_test_expectations.txt
@@ -533,14 +533,16 @@
 3677 VULKAN : dEQP-GLES3.functional.fragment_out.random.* = FAIL
 
 // NVIDIA Depth/Stencil textures:
-3970 VULKAN NVIDIA : dEQP-GLES3.functional.fbo.depth.depth_write_clamp.depth_component32f = FAIL
-3970 VULKAN NVIDIA : dEQP-GLES3.functional.fbo.depth.depth_write_clamp.depth32f_stencil8 = FAIL
-3970 VULKAN NVIDIA : dEQP-GLES3.functional.fbo.depth.depth_test_clamp.depth_component32f = FAIL
-3970 VULKAN NVIDIA : dEQP-GLES3.functional.fbo.depth.depth_test_clamp.depth32f_stencil8 = FAIL
+// Fails on Quadro P400, driver 418.56, Linux
+3970 VULKAN NVIDIA LINUX : dEQP-GLES3.functional.fbo.depth.depth_write_clamp.depth_component32f = FAIL
+3970 VULKAN NVIDIA LINUX : dEQP-GLES3.functional.fbo.depth.depth_write_clamp.depth32f_stencil8 = FAIL
+3970 VULKAN NVIDIA LINUX : dEQP-GLES3.functional.fbo.depth.depth_test_clamp.depth_component32f = FAIL
+3970 VULKAN NVIDIA LINUX : dEQP-GLES3.functional.fbo.depth.depth_test_clamp.depth32f_stencil8 = FAIL
 
 // Polygon offset:
-3970 VULKAN NVIDIA : dEQP-GLES3.functional.polygon_offset.float32_result_depth_clamp = FAIL
-3970 VULKAN NVIDIA : dEQP-GLES3.functional.polygon_offset.float32_factor_1_slope = FAIL
+// Fails on Quadro P400, driver 418.56, Linux
+3970 VULKAN NVIDIA LINUX : dEQP-GLES3.functional.polygon_offset.float32_result_depth_clamp = FAIL
+3970 VULKAN NVIDIA LINUX : dEQP-GLES3.functional.polygon_offset.float32_factor_1_slope = FAIL
 
 // Transform Feedback
 4666 VULKAN NVIDIA : dEQP-GLES3.functional.transform_feedback.array_element.interleaved.* = SKIP
@@ -642,14 +644,6 @@
 // 161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.35 = FAIL
 4344 VULKAN ANDROID : dEQP-GLES3.functional.fragment_ops.random.73 = FAIL
 
-// Failing on the Pixel2.
-172932466 VULKAN PIXEL2ORXL : dEQP-GLES3.functional.shaders.large_constant_arrays.indexing.float_128_vertex = FAIL
-172932466 VULKAN PIXEL2ORXL : dEQP-GLES3.functional.shaders.large_constant_arrays.indexing.float_64_vertex = FAIL
-172932466 VULKAN PIXEL2ORXL : dEQP-GLES3.functional.shaders.large_constant_arrays.indexing.vec4_128_vertex = FAIL
-172932466 VULKAN PIXEL2ORXL : dEQP-GLES3.functional.shaders.large_constant_arrays.indexing.vec4_16_vertex = FAIL
-172932466 VULKAN PIXEL2ORXL : dEQP-GLES3.functional.shaders.large_constant_arrays.indexing.vec4_32_vertex = FAIL
-172932466 VULKAN PIXEL2ORXL : dEQP-GLES3.functional.shaders.large_constant_arrays.indexing.vec4_64_vertex = FAIL
-
 // Fails only with SwiftShader:
 
 // These only fail for a 565 config
diff --git a/src/tests/deqp_support/deqp_khr_gles31_test_expectations.txt b/src/tests/deqp_support/deqp_khr_gles31_test_expectations.txt
index 6458bc3..a04a076 100644
--- a/src/tests/deqp_support/deqp_khr_gles31_test_expectations.txt
+++ b/src/tests/deqp_support/deqp_khr_gles31_test_expectations.txt
@@ -59,12 +59,12 @@
 4723 VULKAN NVIDIA : KHR-GLES31.core.shader_image_size.advanced-nonMS-vs-uint = SKIP
 4723 VULKAN NVIDIA : KHR-GLES31.core.program_interface_query.transform-feedback-types = SKIP
 
-// Cannot support incomplete multisample texture:
-3588 VULKAN : KHR-GLES31.core.sample_variables*samples_0* = SKIP
-
-// These test are failed, but the fault about incomplete multisample texture, these tests need to be SKIP.
 // Incompatible between incomplete texture and sampler format (isampler2D or usampler2D):
-3588 VULKAN : KHR-GLES31.core.sample_variables.mask.rgba8*i.* = SKIP
+3588 VULKAN : KHR-GLES31.core.sample_variables.mask.rgba8*i.* = FAIL
+
+// Geometry shader support
+5406 VULKAN : KHR-GLES31.core.draw_indirect.basic-mode-*adjacency = SKIP
+3571 VULKAN : KHR-GLES31.core.draw_indirect.negative-xfb = SKIP
 
 ////
 //// Desktop Vulkan expectations
@@ -102,8 +102,7 @@
 4159 VULKAN PIXEL2ORXL : KHR-GLES31.core.draw_indirect.advanced-twoPass-transformFeedback-arrays = FAIL
 
 // Fails to link the shader program on Pixel2 and Pixel2 XL
-// These test are failed, but the fault about incomplete multisample texture, these tests need to be SKIP.
-3588 VULKAN PIXEL2ORXL : KHR-GLES31.core.sample_variables.mask.rgba8.samples_*.mask_* = SKIP
+3588 VULKAN PIXEL2ORXL : KHR-GLES31.core.sample_variables.mask.rgba8.samples_*.mask_* = FAIL
 
 // Android uses "old" sampler rewrite that doesn't support array of arrays
 2703 VULKAN ANDROID : KHR-GLES31.core.arrays_of_arrays.* = SKIP
diff --git a/src/tests/deqp_support/deqp_khr_gles32_test_expectations.txt b/src/tests/deqp_support/deqp_khr_gles32_test_expectations.txt
index 276a3c2..2716c94 100644
--- a/src/tests/deqp_support/deqp_khr_gles32_test_expectations.txt
+++ b/src/tests/deqp_support/deqp_khr_gles32_test_expectations.txt
@@ -6,4 +6,84 @@
 
 // For now we only log Vulkan test expectations. More back-ends can follow as we need them.
 
-3523 VULKAN : * = SKIP
+// Geometry shader support
+3571 VULKAN : KHR-GLES32.core.geometry_shader.* = SKIP
+3571 VULKAN : KHR-GLES32.core.texture_cube_map_array.*geometry* = SKIP
+3571 VULKAN : KHR-GLES32.core.constant_expressions.*geometry = SKIP
+3571 VULKAN : KHR-GLES32.core.separable_programs_tf.geometry_active = SKIP
+3571 VULKAN : KHR-GLES32.core.shader_macros.fragment_precision_high_geometry = SKIP
+3571 VULKAN : KHR-GLES32.core.texture_cube_map_array.color_depth_attachments = SKIP
+3571 VULKAN : KHR-GLES32.core.texture_cube_map_array.stencil_attachments_*mutable_layered = SKIP
+3571 VULKAN : KHR-GLES32.core.texture_cube_map_array.fbo_incompleteness = FAIL
+
+// Tessellation shader support
+3572 VULKAN : KHR-GLES32.core.tessellation_shader.* = SKIP
+3572 VULKAN : KHR-GLES32.core.texture_cube_map_array.*tessellation* = SKIP
+3572 VULKAN : KHR-GLES32.core.texture_cube_map_array.*tesselation* = SKIP
+3572 VULKAN : KHR-GLES32.core.constant_expressions.*tess_control = SKIP
+3572 VULKAN : KHR-GLES32.core.constant_expressions.*tess_eval = SKIP
+3572 VULKAN : KHR-GLES32.core.separable_programs_tf.tessellation_active = SKIP
+3572 VULKAN : KHR-GLES32.core.shader_macros.fragment_precision_high_tess_* = SKIP
+3572 VULKAN : KHR-GLES32.core.texture_cube_map_array.sampling = SKIP
+
+// Texture border clamp support
+3577 VULKAN : KHR-GLES32.core.texture_border_clamp.* = SKIP
+3577 VULKAN : KHR-GLES32.core.gpu_shader5.*clamp*_border = SKIP
+3577 VULKAN : KHR-GLES32.core.gpu_shader5.*clamp*_edge = SKIP
+
+// Validation error from EXT_gpu_shader5
+5361 VULKAN : KHR-GLES32.core.gpu_shader5.precise_qualifier = FAIL
+
+// Constant propagaion error with textureGatherOffsets
+5362 VULKAN : KHR-GLES32.core.gpu_shader5.texture_gather_offsets_color = FAIL
+5362 VULKAN : KHR-GLES32.core.gpu_shader5.texture_gather_offsets_depth = FAIL
+
+// Validation error from EXT_copy_image
+5363 VULKAN : KHR-GLES32.core.copy_image.r32i_texture = FAIL
+5363 VULKAN : KHR-GLES32.core.copy_image.r32ui_texture = FAIL
+
+// No known implementation supports STORAGE_TEXEL_BUFFER support for RGB32 formats
+3573 VULKAN : KHR-GLES32.core.texture_buffer.texture_buffer_texture_buffer_range = SKIP
+
+// Incorrect dependency to VK_EXT_shader_atomic_float
+5342 VULKAN : KHR-GLES32.core.texture_buffer.texture_buffer_atomic_functions = FAIL
+
+// Desktop cards without native etc support
+5276 AMD VULKAN : KHR-GLES32.core.texture_cube_map_array.etc2_texture = FAIL
+5276 NVIDIA VULKAN : KHR-GLES32.core.texture_cube_map_array.etc2_texture = FAIL
+
+// Android failures
+
+// Dynamic indexing features not supported on Qualcomm
+2703 VULKAN ANDROID : KHR-GLES32.core.gpu_shader5.atomic_counters_array_indexing = FAIL
+2703 VULKAN ANDROID : KHR-GLES32.core.gpu_shader5.images_array_indexing = FAIL
+
+// Texture buffer failures
+5392 VULKAN ANDROID : KHR-GLES32.core.texture_buffer.texture_buffer_active_uniform_validation_compute_shader = FAIL
+5392 VULKAN ANDROID : KHR-GLES32.core.texture_buffer.texture_buffer_active_uniform_validation_fragment_shader = FAIL
+5392 VULKAN ANDROID : KHR-GLES32.core.texture_buffer.texture_buffer_conv_int_to_float = FAIL
+5392 VULKAN ANDROID : KHR-GLES32.core.texture_buffer.texture_buffer_errors = FAIL
+5392 VULKAN ANDROID : KHR-GLES32.core.texture_buffer.texture_buffer_max_size = FAIL
+5392 VULKAN ANDROID : KHR-GLES32.core.texture_buffer.texture_buffer_operations_buffer_load = FAIL
+5392 VULKAN ANDROID : KHR-GLES32.core.texture_buffer.texture_buffer_operations_cpu_writes = FAIL
+5392 VULKAN ANDROID : KHR-GLES32.core.texture_buffer.texture_buffer_operations_framebuffer_readback = FAIL
+5392 VULKAN ANDROID : KHR-GLES32.core.texture_buffer.texture_buffer_operations_image_store = FAIL
+5392 VULKAN ANDROID : KHR-GLES32.core.texture_buffer.texture_buffer_operations_ssbo_writes = FAIL
+5392 VULKAN ANDROID : KHR-GLES32.core.texture_buffer.texture_buffer_operations_transform_feedback = FAIL
+5392 VULKAN ANDROID : KHR-GLES32.core.texture_buffer.texture_buffer_parameters = FAIL
+
+// Cube map array failures
+5393 VULKAN ANDROID : KHR-GLES32.core.texture_cube_map_array.etc2_texture = FAIL
+5393 VULKAN ANDROID : KHR-GLES32.core.texture_cube_map_array.generate_mip_map_filterable_internalformat_immutable = FAIL
+5393 VULKAN ANDROID : KHR-GLES32.core.texture_cube_map_array.generate_mip_map_filterable_internalformat_mutable = FAIL
+5393 VULKAN ANDROID : KHR-GLES32.core.texture_cube_map_array.generate_mip_map_non_filterable_immutable_storage = FAIL
+5393 VULKAN ANDROID : KHR-GLES32.core.texture_cube_map_array.generate_mip_map_non_filterable_mutable_storage = FAIL
+5393 VULKAN ANDROID : KHR-GLES32.core.texture_cube_map_array.getter_calls = FAIL
+5393 VULKAN ANDROID : KHR-GLES32.core.texture_cube_map_array.image_op_compute_sh = FAIL
+5393 VULKAN ANDROID : KHR-GLES32.core.texture_cube_map_array.stencil_attachments_immutable_nonlayered = FAIL
+5393 VULKAN ANDROID : KHR-GLES32.core.texture_cube_map_array.stencil_attachments_mutable_nonlayered = FAIL
+5393 VULKAN ANDROID : KHR-GLES32.core.texture_cube_map_array.subimage3D = FAIL
+5393 VULKAN ANDROID : KHR-GLES32.core.texture_cube_map_array.tex3D_validation = FAIL
+5393 VULKAN ANDROID : KHR-GLES32.core.texture_cube_map_array.texture_size_compute_sh = FAIL
+5393 VULKAN ANDROID : KHR-GLES32.core.texture_cube_map_array.texture_size_fragment_sh = FAIL
+5393 VULKAN ANDROID : KHR-GLES32.core.texture_cube_map_array.texture_size_vertex_sh = FAIL
diff --git a/src/tests/deqp_support/tcuANGLENativeDisplayFactory.cpp b/src/tests/deqp_support/tcuANGLENativeDisplayFactory.cpp
index 2a90deb..4196506 100644
--- a/src/tests/deqp_support/tcuANGLENativeDisplayFactory.cpp
+++ b/src/tests/deqp_support/tcuANGLENativeDisplayFactory.cpp
@@ -428,25 +428,24 @@
             continue;
         }
 
-        const char **preRotationFeatures =
+        const char **enabledFeatures =
             reinterpret_cast<const char **>(mPlatformAttributes[attrIndex + 1]);
-        DE_ASSERT(preRotationFeatures != nullptr && preRotationFeatures[0] != nullptr);
+        DE_ASSERT(enabledFeatures != nullptr && *enabledFeatures != nullptr);
 
-        if (strcmp(preRotationFeatures[0], "emulatedPrerotation90") == 0)
+        for (; *enabledFeatures; ++enabledFeatures)
         {
-            preRotation = 90;
-        }
-        else if (strcmp(preRotationFeatures[0], "emulatedPrerotation180") == 0)
-        {
-            preRotation = 180;
-        }
-        else if (strcmp(preRotationFeatures[0], "emulatedPrerotation270") == 0)
-        {
-            preRotation = 270;
-        }
-        else
-        {
-            DE_ASSERT(DE_FALSE);
+            if (strcmp(enabledFeatures[0], "emulatedPrerotation90") == 0)
+            {
+                preRotation = 90;
+            }
+            else if (strcmp(enabledFeatures[0], "emulatedPrerotation180") == 0)
+            {
+                preRotation = 180;
+            }
+            else if (strcmp(enabledFeatures[0], "emulatedPrerotation270") == 0)
+            {
+                preRotation = 270;
+            }
         }
         break;
     }
diff --git a/src/tests/deqp_support/tcuANGLEPlatform.cpp b/src/tests/deqp_support/tcuANGLEPlatform.cpp
index 9d3e346..25bc280 100644
--- a/src/tests/deqp_support/tcuANGLEPlatform.cpp
+++ b/src/tests/deqp_support/tcuANGLEPlatform.cpp
@@ -38,6 +38,10 @@
 
     mPlatformMethods.logError = logErrorFunc;
 
+    // Enable non-conformant ES versions and extensions for testing.  Our test expectations would
+    // suppress failing tests, but allowing continuous testing of the pieces that are implemented.
+    mEnableFeatureOverrides.push_back("exposeNonConformantExtensionsAndVersions");
+
     // Create pre-rotation attributes.
     switch (preRotation)
     {
@@ -53,10 +57,8 @@
         default:
             break;
     }
-    if (!mEnableFeatureOverrides.empty())
-    {
-        mEnableFeatureOverrides.push_back(nullptr);
-    }
+
+    mEnableFeatureOverrides.push_back(nullptr);
 
 #if (DE_OS == DE_OS_WIN32)
     {
diff --git a/src/tests/egl_tests/EGLDebugTest.cpp b/src/tests/egl_tests/EGLDebugTest.cpp
index e9a303c..bfa3edc 100644
--- a/src/tests/egl_tests/EGLDebugTest.cpp
+++ b/src/tests/egl_tests/EGLDebugTest.cpp
@@ -153,26 +153,29 @@
 {
     ANGLE_SKIP_TEST_IF(!hasExtension());
 
+    EGLDisplay display = getEGLWindow()->getDisplay();
+    EGLSurface surface = getEGLWindow()->getSurface();
+
     EXPECT_EQ(static_cast<EGLint>(EGL_SUCCESS), eglDebugMessageControlKHR(nullptr, nullptr));
 
     // Display display and object must be equal when setting a display label
-    EXPECT_EQ(static_cast<EGLint>(EGL_SUCCESS),
-              eglLabelObjectKHR(getEGLWindow()->getDisplay(), EGL_OBJECT_DISPLAY_KHR,
-                                getEGLWindow()->getDisplay(), const_cast<char *>("Display")));
+    EXPECT_EQ(
+        static_cast<EGLint>(EGL_SUCCESS),
+        eglLabelObjectKHR(display, EGL_OBJECT_DISPLAY_KHR, display, const_cast<char *>("Display")));
     EXPECT_NE(static_cast<EGLint>(EGL_SUCCESS),
               eglLabelObjectKHR(nullptr, EGL_OBJECT_DISPLAY_KHR, getEGLWindow()->getDisplay(),
                                 const_cast<char *>("Display")));
 
     //  Set a surface label
-    EXPECT_EQ(static_cast<EGLint>(EGL_SUCCESS),
-              eglLabelObjectKHR(getEGLWindow()->getDisplay(), EGL_OBJECT_SURFACE_KHR,
-                                getEGLWindow()->getSurface(), const_cast<char *>("Surface")));
+    EXPECT_EQ(
+        static_cast<EGLint>(EGL_SUCCESS),
+        eglLabelObjectKHR(display, EGL_OBJECT_SURFACE_KHR, surface, const_cast<char *>("Surface")));
     EXPECT_EGL_ERROR(EGL_SUCCESS);
 
     // Provide a surface but use an image label type
-    EXPECT_EQ(static_cast<EGLint>(EGL_BAD_PARAMETER),
-              eglLabelObjectKHR(getEGLWindow()->getDisplay(), EGL_OBJECT_IMAGE_KHR,
-                                getEGLWindow()->getSurface(), const_cast<char *>("Image")));
+    EXPECT_EQ(
+        static_cast<EGLint>(EGL_BAD_PARAMETER),
+        eglLabelObjectKHR(display, EGL_OBJECT_IMAGE_KHR, surface, const_cast<char *>("Image")));
     EXPECT_EGL_ERROR(EGL_BAD_PARAMETER);
 }
 
diff --git a/src/tests/egl_tests/EGLFeatureControlTest.cpp b/src/tests/egl_tests/EGLFeatureControlTest.cpp
index 907c0c8..83264fb 100644
--- a/src/tests/egl_tests/EGLFeatureControlTest.cpp
+++ b/src/tests/egl_tests/EGLFeatureControlTest.cpp
@@ -16,16 +16,7 @@
 class EGLFeatureControlTest : public ANGLETest
 {
   public:
-    void testSetUp() override
-    {
-        // All tests are skipped on old AMD Linux Vulkan driver. See http://crbug.com/1097750
-        if (IsLinux() && IsAMD() && IsVulkan())
-        {
-            GTEST_SKIP();
-        }
-
-        mDisplay = EGL_NO_DISPLAY;
-    }
+    void testSetUp() override { mDisplay = EGL_NO_DISPLAY; }
 
     void testTearDown() override
     {
diff --git a/src/tests/egl_tests/EGLPresentPathD3D11Test.cpp b/src/tests/egl_tests/EGLPresentPathD3D11Test.cpp
index 042a202..fafdd22 100644
--- a/src/tests/egl_tests/EGLPresentPathD3D11Test.cpp
+++ b/src/tests/egl_tests/EGLPresentPathD3D11Test.cpp
@@ -88,9 +88,7 @@
         EGLAttrib device      = 0;
         EGLAttrib angleDevice = 0;
 
-        const char *extensionString =
-            static_cast<const char *>(eglQueryString(mDisplay, EGL_EXTENSIONS));
-        EXPECT_TRUE(strstr(extensionString, "EGL_EXT_device_query"));
+        EXPECT_TRUE(IsEGLClientExtensionEnabled("EGL_EXT_device_query"));
 
         ASSERT_EGL_TRUE(eglQueryDisplayAttribEXT(mDisplay, EGL_DEVICE_EXT, &angleDevice));
         ASSERT_EGL_TRUE(eglQueryDeviceAttribEXT(reinterpret_cast<EGLDeviceEXT>(angleDevice),
diff --git a/src/tests/egl_tests/EGLPrintEGLinfoTest.cpp b/src/tests/egl_tests/EGLPrintEGLinfoTest.cpp
index 76b7548..5a9b075 100644
--- a/src/tests/egl_tests/EGLPrintEGLinfoTest.cpp
+++ b/src/tests/egl_tests/EGLPrintEGLinfoTest.cpp
@@ -252,6 +252,9 @@
 
 static void LogGles32Capabilities(std::ostream &stream)
 {
+    // Most of these capabilities are not implemented yet.
+    ANGLE_SKIP_TEST_IF(IsVulkan());
+
     QUERY_AND_LOG_CAPABILITY(GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS, stream);
     QUERY_AND_LOG_CAPABILITY(GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS, stream);
     QUERY_AND_LOG_CAPABILITY(GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS, stream);
@@ -483,4 +486,4 @@
     }
 }
 
-ANGLE_INSTANTIATE_TEST(EGLPrintEGLinfoTest, ES2_VULKAN(), ES3_VULKAN());
+ANGLE_INSTANTIATE_TEST(EGLPrintEGLinfoTest, ES2_VULKAN(), ES3_VULKAN(), ES32_VULKAN());
diff --git a/src/tests/egl_tests/EGLSyncTest.cpp b/src/tests/egl_tests/EGLSyncTest.cpp
index e2221c2..c24978d 100644
--- a/src/tests/egl_tests/EGLSyncTest.cpp
+++ b/src/tests/egl_tests/EGLSyncTest.cpp
@@ -479,14 +479,4 @@
     EXPECT_EGL_TRUE(eglDestroySyncKHR(display, syncWithGeneratedFD));
 }
 
-ANGLE_INSTANTIATE_TEST(EGLSyncTest,
-                       ES2_D3D9(),
-                       ES2_D3D11(),
-                       ES2_METAL(),
-                       ES3_D3D11(),
-                       ES2_OPENGL(),
-                       ES3_OPENGL(),
-                       ES2_OPENGLES(),
-                       ES3_OPENGLES(),
-                       ES2_VULKAN(),
-                       ES3_VULKAN());
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(EGLSyncTest);
diff --git a/src/tests/gl_tests/BlitFramebufferANGLETest.cpp b/src/tests/gl_tests/BlitFramebufferANGLETest.cpp
index 0649303..b30efce 100644
--- a/src/tests/gl_tests/BlitFramebufferANGLETest.cpp
+++ b/src/tests/gl_tests/BlitFramebufferANGLETest.cpp
@@ -921,6 +921,9 @@
     // http://anglebug.com/4919
     ANGLE_SKIP_TEST_IF(IsIntel() && IsMetal());
 
+    // http://anglebug.com/5396
+    ANGLE_SKIP_TEST_IF(IsAMD() && IsD3D9());
+
     glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
 
     glClearColor(0.0, 1.0, 0.0, 1.0);
diff --git a/src/tests/gl_tests/ClearTest.cpp b/src/tests/gl_tests/ClearTest.cpp
index b221c8c..a2ae026 100644
--- a/src/tests/gl_tests/ClearTest.cpp
+++ b/src/tests/gl_tests/ClearTest.cpp
@@ -1897,6 +1897,8 @@
 {
     // http://anglebug.com/4612
     ANGLE_SKIP_TEST_IF(IsOSX() && IsDesktopOpenGL());
+    // http://anglebug.com/5397
+    ANGLE_SKIP_TEST_IF(IsAMD() && IsD3D11());
 
     constexpr GLsizei kSize = 16;
 
diff --git a/src/tests/gl_tests/ComputeShaderTest.cpp b/src/tests/gl_tests/ComputeShaderTest.cpp
index 50e1148..aa63f17 100644
--- a/src/tests/gl_tests/ComputeShaderTest.cpp
+++ b/src/tests/gl_tests/ComputeShaderTest.cpp
@@ -3507,8 +3507,8 @@
     // http://anglebug.com/5072
     ANGLE_SKIP_TEST_IF(IsIntel() && IsLinux() && IsOpenGL());
 
-    // Fails on Intel and AMD windows drivers.  http://anglebug.com/3871
-    ANGLE_SKIP_TEST_IF(IsWindows() && (IsIntel() || IsAMD()) && IsVulkan());
+    // Fails on AMD windows drivers.  http://anglebug.com/3871
+    ANGLE_SKIP_TEST_IF(IsWindows() && IsAMD() && IsVulkan());
 
     const char kCSSource[] = R"(#version 310 es
 layout(local_size_x=1, local_size_y=1, local_size_z=1) in;
diff --git a/src/tests/gl_tests/D3DTextureTest.cpp b/src/tests/gl_tests/D3DTextureTest.cpp
index 8142182..6d76d9e 100644
--- a/src/tests/gl_tests/D3DTextureTest.cpp
+++ b/src/tests/gl_tests/D3DTextureTest.cpp
@@ -80,37 +80,30 @@
         PFN_D3D11_CREATE_DEVICE createDeviceFunc = reinterpret_cast<PFN_D3D11_CREATE_DEVICE>(
             GetProcAddress(mD3D11Module, "D3D11CreateDevice"));
 
-        EGLWindow *window  = getEGLWindow();
-        EGLDisplay display = window->getDisplay();
-        if (IsEGLDisplayExtensionEnabled(display, "EGL_EXT_device_query"))
+        EGLWindow *window   = getEGLWindow();
+        EGLDisplay display  = window->getDisplay();
+        EGLDeviceEXT device = EGL_NO_DEVICE_EXT;
+        if (IsEGLClientExtensionEnabled("EGL_EXT_device_query"))
         {
-            PFNEGLQUERYDISPLAYATTRIBEXTPROC eglQueryDisplayAttribEXT =
-                reinterpret_cast<PFNEGLQUERYDISPLAYATTRIBEXTPROC>(
-                    eglGetProcAddress("eglQueryDisplayAttribEXT"));
-            PFNEGLQUERYDEVICEATTRIBEXTPROC eglQueryDeviceAttribEXT =
-                reinterpret_cast<PFNEGLQUERYDEVICEATTRIBEXTPROC>(
-                    eglGetProcAddress("eglQueryDeviceAttribEXT"));
+            EGLAttrib result = 0;
+            EXPECT_EGL_TRUE(eglQueryDisplayAttribEXT(display, EGL_DEVICE_EXT, &result));
+            device = reinterpret_cast<EGLDeviceEXT>(result);
+        }
 
-            EGLDeviceEXT device = 0;
+        ASSERT_NE(EGL_NO_DEVICE_EXT, device);
+
+        if (IsEGLDeviceExtensionEnabled(device, "EGL_ANGLE_device_d3d"))
+        {
+            EGLAttrib result = 0;
+            if (eglQueryDeviceAttribEXT(device, EGL_D3D11_DEVICE_ANGLE, &result))
             {
-                EGLAttrib result = 0;
-                EXPECT_EGL_TRUE(eglQueryDisplayAttribEXT(display, EGL_DEVICE_EXT, &result));
-                device = reinterpret_cast<EGLDeviceEXT>(result);
+                mD3D11Device = reinterpret_cast<ID3D11Device *>(result);
+                mD3D11Device->AddRef();
             }
-
-            if (IsEGLDeviceExtensionEnabled(device, "EGL_ANGLE_device_d3d"))
+            else if (eglQueryDeviceAttribEXT(device, EGL_D3D9_DEVICE_ANGLE, &result))
             {
-                EGLAttrib result = 0;
-                if (eglQueryDeviceAttribEXT(device, EGL_D3D11_DEVICE_ANGLE, &result))
-                {
-                    mD3D11Device = reinterpret_cast<ID3D11Device *>(result);
-                    mD3D11Device->AddRef();
-                }
-                else if (eglQueryDeviceAttribEXT(device, EGL_D3D9_DEVICE_ANGLE, &result))
-                {
-                    mD3D9Device = reinterpret_cast<IDirect3DDevice9 *>(result);
-                    mD3D9Device->AddRef();
-                }
+                mD3D9Device = reinterpret_cast<IDirect3DDevice9 *>(result);
+                mD3D9Device->AddRef();
             }
         }
         else
diff --git a/src/tests/gl_tests/DebugTest.cpp b/src/tests/gl_tests/DebugTest.cpp
index 53cfd20..a322fc0 100644
--- a/src/tests/gl_tests/DebugTest.cpp
+++ b/src/tests/gl_tests/DebugTest.cpp
@@ -6,10 +6,20 @@
 
 // DebugTest.cpp : Tests of the GL_KHR_debug extension
 
+#include "common/debug.h"
 #include "test_utils/ANGLETest.h"
 
 namespace angle
 {
+constexpr char kBufferObjLabel[]          = "buffer";
+constexpr char kShaderObjLabel[]          = "shader";
+constexpr char kProgramObjLabel[]         = "program";
+constexpr char kVertexArrayObjLabel[]     = "vertexarray";
+constexpr char kQueryObjLabel[]           = "query";
+constexpr char kProgramPipelineObjLabel[] = "programpipeline";
+constexpr GLenum kObjectTypes[]           = {GL_BUFFER_OBJECT_EXT,           GL_SHADER_OBJECT_EXT,
+                                   GL_PROGRAM_OBJECT_EXT,          GL_QUERY_OBJECT_EXT,
+                                   GL_PROGRAM_PIPELINE_OBJECT_EXT, GL_VERTEX_ARRAY_OBJECT_EXT};
 
 class DebugTest : public ANGLETest
 {
@@ -38,6 +48,146 @@
     bool mDebugExtensionAvailable;
 };
 
+void createGLObjectAndLabel(GLenum identifier, GLuint &object, const char **label)
+{
+    switch (identifier)
+    {
+        case GL_BUFFER_OBJECT_EXT:
+            glGenBuffers(1, &object);
+            glBindBuffer(GL_ARRAY_BUFFER, object);
+            *label = kBufferObjLabel;
+            break;
+        case GL_SHADER_OBJECT_EXT:
+            object = glCreateShader(GL_VERTEX_SHADER);
+            *label = kShaderObjLabel;
+            break;
+        case GL_PROGRAM_OBJECT_EXT:
+            object = glCreateProgram();
+            *label = kProgramObjLabel;
+            break;
+        case GL_VERTEX_ARRAY_OBJECT_EXT:
+            glGenVertexArrays(1, &object);
+            glBindVertexArray(object);
+            *label = kVertexArrayObjLabel;
+            break;
+        case GL_QUERY_OBJECT_EXT:
+            glGenQueries(1, &object);
+            glBeginQuery(GL_ANY_SAMPLES_PASSED, object);
+            *label = kQueryObjLabel;
+            break;
+        case GL_PROGRAM_PIPELINE_OBJECT_EXT:
+            glGenProgramPipelines(1, &object);
+            glBindProgramPipeline(object);
+            *label = kProgramPipelineObjLabel;
+            break;
+        default:
+            UNREACHABLE();
+            break;
+    }
+}
+
+void deleteGLObject(GLenum identifier, GLuint &object)
+{
+    switch (identifier)
+    {
+        case GL_BUFFER_OBJECT_EXT:
+            glDeleteBuffers(1, &object);
+            break;
+        case GL_SHADER_OBJECT_EXT:
+            glDeleteShader(object);
+            break;
+        case GL_PROGRAM_OBJECT_EXT:
+            glDeleteProgram(object);
+            break;
+        case GL_VERTEX_ARRAY_OBJECT_EXT:
+            glDeleteVertexArrays(1, &object);
+            break;
+        case GL_QUERY_OBJECT_EXT:
+            glEndQuery(GL_ANY_SAMPLES_PASSED);
+            glDeleteQueries(1, &object);
+            break;
+        case GL_PROGRAM_PIPELINE_OBJECT_EXT:
+            glDeleteProgramPipelines(1, &object);
+            break;
+        default:
+            UNREACHABLE();
+            break;
+    }
+}
+
+// Test basic usage of setting and getting labels using GL_EXT_debug_label
+TEST_P(DebugTest, ObjectLabelsEXT)
+{
+    ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_debug_label"));
+
+    for (const GLenum identifier : kObjectTypes)
+    {
+        bool skip = false;
+        switch (identifier)
+        {
+            case GL_PROGRAM_PIPELINE_OBJECT_EXT:
+                if (!(getClientMajorVersion() >= 3 && getClientMinorVersion() >= 1) ||
+                    !IsGLExtensionEnabled("GL_EXT_separate_shader_objects"))
+                {
+                    skip = true;
+                }
+                break;
+            case GL_QUERY_OBJECT_EXT:
+                // GLES3 context is required for glGenQueries()
+                if (getClientMajorVersion() < 3 ||
+                    !IsGLExtensionEnabled("GL_EXT_occlusion_query_boolean"))
+                {
+                    skip = true;
+                }
+                break;
+            case GL_VERTEX_ARRAY_OBJECT_EXT:
+                if (getClientMajorVersion() < 3)
+                {
+                    skip = true;
+                }
+                break;
+            default:
+                break;
+        }
+
+        // if object enum is not supported, move on to the next object type
+        if (skip)
+        {
+            continue;
+        }
+
+        GLuint object;
+        const char *label;
+        createGLObjectAndLabel(identifier, object, &label);
+
+        glLabelObjectEXT(identifier, object, 0, label);
+        ASSERT_GL_NO_ERROR();
+
+        std::vector<char> labelBuf(strlen(label) + 1);
+        GLsizei labelLengthBuf = 0;
+        glGetObjectLabelEXT(identifier, object, static_cast<GLsizei>(labelBuf.size()),
+                            &labelLengthBuf, labelBuf.data());
+        ASSERT_GL_NO_ERROR();
+
+        EXPECT_EQ(static_cast<GLsizei>(strlen(label)), labelLengthBuf);
+        EXPECT_STREQ(label, labelBuf.data());
+
+        ASSERT_GL_NO_ERROR();
+
+        deleteGLObject(identifier, object);
+
+        glLabelObjectEXT(identifier, object, 0, label);
+        EXPECT_GL_ERROR(GL_INVALID_OPERATION);
+
+        glGetObjectLabelEXT(identifier, object, static_cast<GLsizei>(labelBuf.size()),
+                            &labelLengthBuf, labelBuf.data());
+        EXPECT_GL_ERROR(GL_INVALID_OPERATION);
+    }
+}
+
+class DebugTestES3 : public DebugTest
+{};
+
 struct Message
 {
     GLenum source;
@@ -63,13 +213,13 @@
 }
 
 // Test that all ANGLE back-ends have GL_KHR_debug enabled
-TEST_P(DebugTest, Enabled)
+TEST_P(DebugTestES3, Enabled)
 {
     ASSERT_TRUE(mDebugExtensionAvailable);
 }
 
 // Test that when debug output is disabled, no message are outputted
-TEST_P(DebugTest, DisabledOutput)
+TEST_P(DebugTestES3, DisabledOutput)
 {
     ANGLE_SKIP_TEST_IF(!mDebugExtensionAvailable);
 
@@ -90,7 +240,7 @@
 }
 
 // Test a basic flow of inserting a message and reading it back
-TEST_P(DebugTest, InsertMessage)
+TEST_P(DebugTestES3, InsertMessage)
 {
     ANGLE_SKIP_TEST_IF(!mDebugExtensionAvailable);
 
@@ -134,7 +284,7 @@
 }
 
 // Test inserting multiple messages
-TEST_P(DebugTest, InsertMessageMultiple)
+TEST_P(DebugTestES3, InsertMessageMultiple)
 {
     ANGLE_SKIP_TEST_IF(!mDebugExtensionAvailable);
 
@@ -192,7 +342,7 @@
 }
 
 // Test using a debug callback
-TEST_P(DebugTest, DebugCallback)
+TEST_P(DebugTestES3, DebugCallback)
 {
     ANGLE_SKIP_TEST_IF(!mDebugExtensionAvailable);
 
@@ -226,7 +376,7 @@
 }
 
 // Test the glGetPointervKHR entry point
-TEST_P(DebugTest, GetPointer)
+TEST_P(DebugTestES3, GetPointer)
 {
     ANGLE_SKIP_TEST_IF(!mDebugExtensionAvailable);
 
@@ -244,7 +394,7 @@
 }
 
 // Test usage of message control.  Example taken from GL_KHR_debug spec.
-TEST_P(DebugTest, MessageControl1)
+TEST_P(DebugTestES3, MessageControl1)
 {
     ANGLE_SKIP_TEST_IF(!mDebugExtensionAvailable);
 
@@ -292,7 +442,7 @@
 }
 
 // Test usage of message control.  Example taken from GL_KHR_debug spec.
-TEST_P(DebugTest, MessageControl2)
+TEST_P(DebugTestES3, MessageControl2)
 {
     ANGLE_SKIP_TEST_IF(!mDebugExtensionAvailable);
 
@@ -340,7 +490,7 @@
 }
 
 // Test basic usage of setting and getting labels
-TEST_P(DebugTest, ObjectLabels)
+TEST_P(DebugTestES3, ObjectLabels)
 {
     ANGLE_SKIP_TEST_IF(!mDebugExtensionAvailable);
 
@@ -372,9 +522,9 @@
 }
 
 // Test basic usage of setting and getting labels
-TEST_P(DebugTest, ObjectPtrLabels)
+TEST_P(DebugTestES3, ObjectPtrLabels)
 {
-    ANGLE_SKIP_TEST_IF(!mDebugExtensionAvailable || getClientMajorVersion() < 3);
+    ANGLE_SKIP_TEST_IF(!mDebugExtensionAvailable);
 
     GLsync sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
 
@@ -403,6 +553,10 @@
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
-ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(DebugTest);
-
+ANGLE_INSTANTIATE_TEST_ES3(DebugTestES3);
+ANGLE_INSTANTIATE_TEST(DebugTest,
+                       ANGLE_ALL_TEST_PLATFORMS_ES1,
+                       ANGLE_ALL_TEST_PLATFORMS_ES2,
+                       ANGLE_ALL_TEST_PLATFORMS_ES3,
+                       ANGLE_ALL_TEST_PLATFORMS_ES31);
 }  // namespace angle
diff --git a/src/tests/gl_tests/FramebufferTest.cpp b/src/tests/gl_tests/FramebufferTest.cpp
index 5eba78d..c49faae 100644
--- a/src/tests/gl_tests/FramebufferTest.cpp
+++ b/src/tests/gl_tests/FramebufferTest.cpp
@@ -1313,10 +1313,12 @@
     ASSERT_GL_NO_ERROR();
 
     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO);
-    EXPECT_PIXEL_NEAR(0, 0, 0, 0, 0, 255, 1.0);                      // Black
-    EXPECT_PIXEL_NEAR(kSize - 1, 1, 239, 0, 0, 255, 1.0);            // Red
-    EXPECT_PIXEL_NEAR(0, kSize - 1, 0, 239, 0, 255, 1.0);            // Green
-    EXPECT_PIXEL_NEAR(kSize - 1, kSize - 1, 239, 239, 0, 255, 1.0);  // Yellow
+    constexpr uint8_t kHalfPixelGradient = 256 / kSize / 2;
+    EXPECT_PIXEL_NEAR(0, 0, kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
+    EXPECT_PIXEL_NEAR(kSize - 1, 0, 255 - kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
+    EXPECT_PIXEL_NEAR(0, kSize - 1, kHalfPixelGradient, 255 - kHalfPixelGradient, 0, 255, 1.0);
+    EXPECT_PIXEL_NEAR(kSize - 1, kSize - 1, 255 - kHalfPixelGradient, 255 - kHalfPixelGradient, 0,
+                      255, 1.0);
 }
 
 // Test resolving a multisampled texture with blit to a different format
@@ -1359,10 +1361,12 @@
     ASSERT_GL_NO_ERROR();
 
     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO);
-    EXPECT_PIXEL_NEAR(0, 0, 0, 0, 0, 255, 1.0);                      // Black
-    EXPECT_PIXEL_NEAR(kSize - 1, 1, 239, 0, 0, 255, 1.0);            // Red
-    EXPECT_PIXEL_NEAR(0, kSize - 1, 0, 239, 0, 255, 1.0);            // Green
-    EXPECT_PIXEL_NEAR(kSize - 1, kSize - 1, 239, 239, 0, 255, 1.0);  // Yellow
+    constexpr uint8_t kHalfPixelGradient = 256 / kSize / 2;
+    EXPECT_PIXEL_NEAR(0, 0, kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
+    EXPECT_PIXEL_NEAR(kSize - 1, 0, 255 - kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
+    EXPECT_PIXEL_NEAR(0, kSize - 1, kHalfPixelGradient, 255 - kHalfPixelGradient, 0, 255, 1.0);
+    EXPECT_PIXEL_NEAR(kSize - 1, kSize - 1, 255 - kHalfPixelGradient, 255 - kHalfPixelGradient, 0,
+                      255, 1.0);
 }
 
 // Test resolving a multisampled texture with blit after drawing to mulitiple FBOs.
@@ -1546,10 +1550,12 @@
 
     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO);
     glReadBuffer(GL_COLOR_ATTACHMENT1);
-    EXPECT_PIXEL_NEAR(0, 0, 0, 0, 0, 255, 1.0);                      // Black
-    EXPECT_PIXEL_NEAR(kSize - 1, 1, 239, 0, 0, 255, 1.0);            // Red
-    EXPECT_PIXEL_NEAR(0, kSize - 1, 0, 239, 0, 255, 1.0);            // Green
-    EXPECT_PIXEL_NEAR(kSize - 1, kSize - 1, 239, 239, 0, 255, 1.0);  // Yellow
+    constexpr uint8_t kHalfPixelGradient = 256 / kSize / 2;
+    EXPECT_PIXEL_NEAR(0, 0, kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
+    EXPECT_PIXEL_NEAR(kSize - 1, 0, 255 - kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
+    EXPECT_PIXEL_NEAR(0, kSize - 1, kHalfPixelGradient, 255 - kHalfPixelGradient, 0, 255, 1.0);
+    EXPECT_PIXEL_NEAR(kSize - 1, kSize - 1, 255 - kHalfPixelGradient, 255 - kHalfPixelGradient, 0,
+                      255, 1.0);
 }
 
 // Test resolving a multisampled texture into a mipmaped texture with blit
@@ -1598,10 +1604,12 @@
     ASSERT_GL_NO_ERROR();
 
     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO);
-    EXPECT_PIXEL_NEAR(0, 0, 0, 0, 0, 255, 1.0);                      // Black
-    EXPECT_PIXEL_NEAR(kSize - 1, 1, 251, 0, 0, 255, 1.0);            // Red
-    EXPECT_PIXEL_NEAR(0, kSize - 1, 0, 251, 0, 255, 1.0);            // Green
-    EXPECT_PIXEL_NEAR(kSize - 1, kSize - 1, 251, 251, 0, 255, 1.0);  // Yellow
+    constexpr uint8_t kHalfPixelGradient = 256 / kSize / 2;
+    EXPECT_PIXEL_NEAR(0, 0, kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
+    EXPECT_PIXEL_NEAR(kSize - 1, 0, 255 - kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
+    EXPECT_PIXEL_NEAR(0, kSize - 1, kHalfPixelGradient, 255 - kHalfPixelGradient, 0, 255, 1.0);
+    EXPECT_PIXEL_NEAR(kSize - 1, kSize - 1, 255 - kHalfPixelGradient, 255 - kHalfPixelGradient, 0,
+                      255, 1.0);
 }
 
 // Test resolving a multisampled texture with blit after drawing to multiple FBOs.
@@ -1802,10 +1810,12 @@
     ASSERT_GL_NO_ERROR();
 
     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO);
-    EXPECT_PIXEL_NEAR(0, 0, 0, 0, 0, 255, 1.0);                      // Black
-    EXPECT_PIXEL_NEAR(kSize - 1, 1, 239, 0, 0, 255, 1.0);            // Red
-    EXPECT_PIXEL_NEAR(0, kSize - 1, 0, 239, 0, 255, 1.0);            // Green
-    EXPECT_PIXEL_NEAR(kSize - 1, kSize - 1, 239, 239, 0, 255, 1.0);  // Yellow
+    constexpr uint8_t kHalfPixelGradient = 256 / kSize / 2;
+    EXPECT_PIXEL_NEAR(0, 0, kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
+    EXPECT_PIXEL_NEAR(kSize - 1, 0, 255 - kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
+    EXPECT_PIXEL_NEAR(0, kSize - 1, kHalfPixelGradient, 255 - kHalfPixelGradient, 0, 255, 1.0);
+    EXPECT_PIXEL_NEAR(kSize - 1, kSize - 1, 255 - kHalfPixelGradient, 255 - kHalfPixelGradient, 0,
+                      255, 1.0);
 
     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, msaaFBO);
     ANGLE_GL_PROGRAM(blueProgram, essl3_shaders::vs::Passthrough(), essl3_shaders::fs::Blue());
@@ -1813,10 +1823,11 @@
     ASSERT_GL_NO_ERROR();
 
     // The resolved FBO should be unaffected by the last draw call.
-    EXPECT_PIXEL_NEAR(0, 0, 0, 0, 0, 255, 1.0);                      // Black
-    EXPECT_PIXEL_NEAR(kSize - 1, 1, 239, 0, 0, 255, 1.0);            // Red
-    EXPECT_PIXEL_NEAR(0, kSize - 1, 0, 239, 0, 255, 1.0);            // Green
-    EXPECT_PIXEL_NEAR(kSize - 1, kSize - 1, 239, 239, 0, 255, 1.0);  // Yellow
+    EXPECT_PIXEL_NEAR(0, 0, kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
+    EXPECT_PIXEL_NEAR(kSize - 1, 0, 255 - kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
+    EXPECT_PIXEL_NEAR(0, kSize - 1, kHalfPixelGradient, 255 - kHalfPixelGradient, 0, 255, 1.0);
+    EXPECT_PIXEL_NEAR(kSize - 1, kSize - 1, 255 - kHalfPixelGradient, 255 - kHalfPixelGradient, 0,
+                      255, 1.0);
 }
 
 // Test resolving a multisampled texture with blit, then drawing multisampled again.  The latter
@@ -1927,10 +1938,12 @@
     ASSERT_GL_NO_ERROR();
 
     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO);
-    EXPECT_PIXEL_NEAR(0, 0, 0, 0, 0, 255, 1.0);                      // Black
-    EXPECT_PIXEL_NEAR(kSize - 1, 1, 239, 0, 0, 255, 1.0);            // Red
-    EXPECT_PIXEL_NEAR(0, kSize - 1, 0, 239, 0, 255, 1.0);            // Green
-    EXPECT_PIXEL_NEAR(kSize - 1, kSize - 1, 239, 239, 0, 255, 1.0);  // Yellow
+    constexpr uint8_t kHalfPixelGradient = 256 / kSize / 2;
+    EXPECT_PIXEL_NEAR(0, 0, kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
+    EXPECT_PIXEL_NEAR(kSize - 1, 0, 255 - kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
+    EXPECT_PIXEL_NEAR(0, kSize - 1, kHalfPixelGradient, 255 - kHalfPixelGradient, 0, 255, 1.0);
+    EXPECT_PIXEL_NEAR(kSize - 1, kSize - 1, 255 - kHalfPixelGradient, 255 - kHalfPixelGradient, 0,
+                      255, 1.0);
 
     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, msaaFBO);
     ANGLE_GL_PROGRAM(blueProgram, essl3_shaders::vs::Passthrough(), essl3_shaders::fs::Blue());
@@ -1988,10 +2001,12 @@
     ASSERT_GL_NO_ERROR();
 
     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO1);
-    EXPECT_PIXEL_NEAR(0, 0, 0, 0, 0, 255, 1.0);                      // Black
-    EXPECT_PIXEL_NEAR(kSize - 1, 1, 239, 0, 0, 255, 1.0);            // Red
-    EXPECT_PIXEL_NEAR(0, kSize - 1, 0, 239, 0, 255, 1.0);            // Green
-    EXPECT_PIXEL_NEAR(kSize - 1, kSize - 1, 239, 239, 0, 255, 1.0);  // Yellow
+    constexpr uint8_t kHalfPixelGradient = 256 / kSize / 2;
+    EXPECT_PIXEL_NEAR(0, 0, kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
+    EXPECT_PIXEL_NEAR(kSize - 1, 0, 255 - kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
+    EXPECT_PIXEL_NEAR(0, kSize - 1, kHalfPixelGradient, 255 - kHalfPixelGradient, 0, 255, 1.0);
+    EXPECT_PIXEL_NEAR(kSize - 1, kSize - 1, 255 - kHalfPixelGradient, 255 - kHalfPixelGradient, 0,
+                      255, 1.0);
 
     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, msaaFBO);
     ANGLE_GL_PROGRAM(blueProgram, essl3_shaders::vs::Passthrough(), essl3_shaders::fs::Blue());
@@ -2021,10 +2036,11 @@
 
     // The first resolve FBO should be untouched.
     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO1);
-    EXPECT_PIXEL_NEAR(0, 0, 0, 0, 0, 255, 1.0);                      // Black
-    EXPECT_PIXEL_NEAR(kSize - 1, 1, 239, 0, 0, 255, 1.0);            // Red
-    EXPECT_PIXEL_NEAR(0, kSize - 1, 0, 239, 0, 255, 1.0);            // Green
-    EXPECT_PIXEL_NEAR(kSize - 1, kSize - 1, 239, 239, 0, 255, 1.0);  // Yellow
+    EXPECT_PIXEL_NEAR(0, 0, kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
+    EXPECT_PIXEL_NEAR(kSize - 1, 0, 255 - kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
+    EXPECT_PIXEL_NEAR(0, kSize - 1, kHalfPixelGradient, 255 - kHalfPixelGradient, 0, 255, 1.0);
+    EXPECT_PIXEL_NEAR(kSize - 1, kSize - 1, 255 - kHalfPixelGradient, 255 - kHalfPixelGradient, 0,
+                      255, 1.0);
 }
 
 // If there are no attachments, rendering will be limited to a rectangle having a lower left of
diff --git a/src/tests/gl_tests/GLSLTest.cpp b/src/tests/gl_tests/GLSLTest.cpp
index 6f38a4f..99213e6 100644
--- a/src/tests/gl_tests/GLSLTest.cpp
+++ b/src/tests/gl_tests/GLSLTest.cpp
@@ -8441,6 +8441,8 @@
 
     // Fails on windows AMD on GL: http://anglebug.com/3838
     ANGLE_SKIP_TEST_IF(IsWindows() && IsOpenGL() && IsAMD());
+    // http://anglebug.com/5384
+    ANGLE_SKIP_TEST_IF(IsLinux() && IsAMD() && IsDesktopOpenGL());
 
     // Fails on D3D due to mistranslation: http://anglebug.com/3841
     ANGLE_SKIP_TEST_IF(IsD3D11());
@@ -8523,6 +8525,8 @@
 {
     // Fails on windows AMD on GL: http://anglebug.com/3838
     ANGLE_SKIP_TEST_IF(IsWindows() && IsOpenGL() && IsAMD());
+    // http://anglebug.com/5384
+    ANGLE_SKIP_TEST_IF(IsLinux() && IsAMD() && IsDesktopOpenGL());
 
     // Fails on D3D due to mistranslation: http://anglebug.com/3841
     ANGLE_SKIP_TEST_IF(IsD3D11());
@@ -8774,6 +8778,209 @@
     program = CompileProgram(kVSStaticUse, kFSStaticUse);
     EXPECT_EQ(0u, program);
 }
+
+// Verify I/O block array locations
+TEST_P(GLSLTest_ES31, IOBlockLocations)
+{
+    ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_io_blocks"));
+    ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_geometry_shader"));
+
+    // http://anglebug.com/5444
+    ANGLE_SKIP_TEST_IF(IsIntel() && IsOpenGL() && IsWindows());
+
+    constexpr char kVS[] = R"(#version 310 es
+#extension GL_EXT_shader_io_blocks : require
+
+in highp vec4 position;
+
+layout(location = 0) out vec4 aOut;
+
+layout(location = 6) out VSBlock
+{
+    vec4 b;     // location 6
+    vec4 c;     // location 7
+    layout(location = 1) vec4 d;
+    vec4 e;     // location 2
+    vec4 f[2];  // locations 3 and 4
+} blockOut;
+
+layout(location = 5) out vec4 gOut;
+
+void main()
+{
+    aOut = vec4(0.03, 0.06, 0.09, 0.12);
+    blockOut.b = vec4(0.15, 0.18, 0.21, 0.24);
+    blockOut.c = vec4(0.27, 0.30, 0.33, 0.36);
+    blockOut.d = vec4(0.39, 0.42, 0.45, 0.48);
+    blockOut.e = vec4(0.51, 0.54, 0.57, 0.6);
+    blockOut.f[0] = vec4(0.63, 0.66, 0.66, 0.69);
+    blockOut.f[1] = vec4(0.72, 0.75, 0.78, 0.81);
+    gOut = vec4(0.84, 0.87, 0.9, 0.93);
+    gl_Position = position;
+})";
+
+    constexpr char kGS[] = R"(#version 310 es
+#extension GL_EXT_geometry_shader : require
+layout (invocations = 3, triangles) in;
+layout (triangle_strip, max_vertices = 3) out;
+
+// Input varyings
+layout(location = 0) in vec4 aIn[];
+
+layout(location = 6) in VSBlock
+{
+    vec4 b;
+    vec4 c;
+    layout(location = 1) vec4 d;
+    vec4 e;
+    vec4 f[2];
+} blockIn[];
+
+layout(location = 5) in vec4 gIn[];
+
+// Output varyings
+layout(location = 1) out vec4 aOut;
+
+layout(location = 0) out GSBlock
+{
+    vec4 b;     // location 0
+    layout(location = 3) vec4 c;
+    layout(location = 7) vec4 d;
+    layout(location = 5) vec4 e[2];
+    layout(location = 4) vec4 f;
+} blockOut;
+
+layout(location = 2) out vec4 gOut;
+
+void main()
+{
+    int n;
+    for (n = 0; n < gl_in.length(); n++)
+    {
+        gl_Position = gl_in[n].gl_Position;
+
+        aOut = aIn[n];
+        blockOut.b = blockIn[n].b;
+        blockOut.c = blockIn[n].c;
+        blockOut.d = blockIn[n].d;
+        blockOut.e[0] = blockIn[n].e;
+        blockOut.e[1] = blockIn[n].f[0];
+        blockOut.f = blockIn[n].f[1];
+        gOut = gIn[n];
+
+        EmitVertex();
+    }
+    EndPrimitive();
+})";
+
+    constexpr char kFS[] = R"(#version 310 es
+#extension GL_EXT_shader_io_blocks : require
+precision mediump float;
+
+layout(location = 0) out mediump vec4 color;
+
+layout(location = 1) in vec4 aIn;
+
+layout(location = 0) in GSBlock
+{
+    vec4 b;
+    layout(location = 3) vec4 c;
+    layout(location = 7) vec4 d;
+    layout(location = 5) vec4 e[2];
+    layout(location = 4) vec4 f;
+} blockIn;
+
+layout(location = 2) in vec4 gIn;
+
+bool isEq(vec4 a, vec4 b) { return all(lessThan(abs(a-b), vec4(0.001))); }
+
+void main()
+{
+    bool passR = isEq(aIn, vec4(0.03, 0.06, 0.09, 0.12));
+    bool passG = isEq(blockIn.b, vec4(0.15, 0.18, 0.21, 0.24)) &&
+                 isEq(blockIn.c, vec4(0.27, 0.30, 0.33, 0.36)) &&
+                 isEq(blockIn.d, vec4(0.39, 0.42, 0.45, 0.48)) &&
+                 isEq(blockIn.e[0], vec4(0.51, 0.54, 0.57, 0.6)) &&
+                 isEq(blockIn.e[1], vec4(0.63, 0.66, 0.66, 0.69)) &&
+                 isEq(blockIn.f, vec4(0.72, 0.75, 0.78, 0.81));
+    bool passB = isEq(gIn, vec4(0.84, 0.87, 0.9, 0.93));
+
+    color = vec4(passR, passG, passB, 1.0);
+})";
+
+    ANGLE_GL_PROGRAM_WITH_GS(program, kVS, kGS, kFS);
+    EXPECT_GL_NO_ERROR();
+}
+
+// Test varying packing in presence of multiple I/O blocks
+TEST_P(GLSLTest_ES31, MultipleIOBlocks)
+{
+    ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_io_blocks"));
+
+    constexpr char kVS[] = R"(#version 310 es
+#extension GL_EXT_shader_io_blocks : require
+
+in highp vec4 position;
+
+out VSBlock1
+{
+    vec4 a;
+    vec4 b[2];
+} blockOut1;
+
+out VSBlock2
+{
+    vec4 c[2];
+    vec4 d;
+} blockOut2;
+
+void main()
+{
+    blockOut1.a = vec4(0.15, 0.18, 0.21, 0.24);
+    blockOut1.b[0] = vec4(0.27, 0.30, 0.33, 0.36);
+    blockOut1.b[1] = vec4(0.39, 0.42, 0.45, 0.48);
+    blockOut2.c[0] = vec4(0.51, 0.54, 0.57, 0.6);
+    blockOut2.c[1] = vec4(0.63, 0.66, 0.66, 0.69);
+    blockOut2.d = vec4(0.72, 0.75, 0.78, 0.81);
+    gl_Position = position;
+})";
+
+    constexpr char kFS[] = R"(#version 310 es
+#extension GL_EXT_shader_io_blocks : require
+precision mediump float;
+
+layout(location = 0) out mediump vec4 color;
+
+in VSBlock1
+{
+    vec4 a;
+    vec4 b[2];
+} blockIn1;
+
+in VSBlock2
+{
+    vec4 c[2];
+    vec4 d;
+} blockIn2;
+
+bool isEq(vec4 a, vec4 b) { return all(lessThan(abs(a-b), vec4(0.001))); }
+
+void main()
+{
+    bool passR = isEq(blockIn1.a, vec4(0.15, 0.18, 0.21, 0.24));
+    bool passG = isEq(blockIn1.b[0], vec4(0.27, 0.30, 0.33, 0.36)) &&
+                 isEq(blockIn1.b[1], vec4(0.39, 0.42, 0.45, 0.48));
+    bool passB = isEq(blockIn2.c[0], vec4(0.51, 0.54, 0.57, 0.6)) &&
+                 isEq(blockIn2.c[1], vec4(0.63, 0.66, 0.66, 0.69));
+    bool passA = isEq(blockIn2.d, vec4(0.72, 0.75, 0.78, 0.81));
+
+    color = vec4(passR, passG, passB, passA);
+})";
+
+    ANGLE_GL_PROGRAM(program, kVS, kFS);
+    EXPECT_GL_NO_ERROR();
+}
+
 }  // anonymous namespace
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
diff --git a/src/tests/gl_tests/GeometryShaderTest.cpp b/src/tests/gl_tests/GeometryShaderTest.cpp
index a753672..f0463ef 100644
--- a/src/tests/gl_tests/GeometryShaderTest.cpp
+++ b/src/tests/gl_tests/GeometryShaderTest.cpp
@@ -819,6 +819,42 @@
     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT, status);
 }
 
+// Verify that we can use default interpolation in the GS.
+TEST_P(GeometryShaderTest, FlatQualifierNotRequired)
+{
+    ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_geometry_shader"));
+
+    constexpr char kGS[] = R"(#version 310 es
+#extension GL_EXT_geometry_shader : require
+layout(points) in;
+layout(points, max_vertices=1) out;
+
+in highp int target[];
+highp uniform vec4 dummyZero; // Default value is vec4(0.0).
+
+void main()
+{
+    highp vec4 retValue = dummyZero;
+    retValue += vec4(float(target[0]));
+    retValue += gl_in[0].gl_Position;
+    gl_Position = retValue;
+    EmitVertex();
+})";
+
+    GLuint geometryShader = CompileShader(GL_GEOMETRY_SHADER_EXT, kGS);
+
+    EXPECT_NE(0u, geometryShader);
+
+    GLuint programID = glCreateProgram();
+    glAttachShader(programID, geometryShader);
+
+    glDetachShader(programID, geometryShader);
+    glDeleteShader(geometryShader);
+    glDeleteProgram(programID);
+
+    EXPECT_GL_NO_ERROR();
+}
+
 ANGLE_INSTANTIATE_TEST_ES3(GeometryShaderTestES3);
 ANGLE_INSTANTIATE_TEST_ES31(GeometryShaderTest);
 }  // namespace
diff --git a/src/tests/gl_tests/ImageTest.cpp b/src/tests/gl_tests/ImageTest.cpp
index 4d7c7fc..e63142e 100644
--- a/src/tests/gl_tests/ImageTest.cpp
+++ b/src/tests/gl_tests/ImageTest.cpp
@@ -2027,21 +2027,19 @@
     SourceAHBTargetExternalESSL3_helper(kDefaultAttribs);
 }
 
-// Test sampling from a YUV AHB with a regular external sampler
-TEST_P(ImageTest, SourceYUVAHBTargetExternalRGBSample)
+// Test sampling from a YUV AHB with a regular external sampler and pre-initialized data
+TEST_P(ImageTest, SourceYUVAHBTargetExternalRGBSampleInitData)
 {
 #ifndef ANGLE_AHARDWARE_BUFFER_LOCK_PLANES_SUPPORT
     std::cout << "Test skipped: !ANGLE_AHARDWARE_BUFFER_LOCK_PLANES_SUPPORT." << std::endl;
     return;
 #else
-    // Multiple issues sampling AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420 in the Vulkan backend:
-    // http://issuetracker.google.com/172649538
-    ANGLE_SKIP_TEST_IF(IsVulkan());
-
     EGLWindow *window = getEGLWindow();
 
     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
+    // http://issuetracker.google.com/175021871
+    ANGLE_SKIP_TEST_IF(IsPixel2() || IsPixel2XL());
 
     // 3 planes of data
     GLubyte dataY[4] = {7, 51, 197, 231};
@@ -2073,6 +2071,49 @@
 #endif
 }
 
+// Test sampling from a YUV AHB with a regular external sampler without data. This gives coverage of
+// sampling even if we can't verify the results.
+TEST_P(ImageTest, SourceYUVAHBTargetExternalRGBSampleNoData)
+{
+    // Multiple issues sampling AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420 in the Vulkan backend:
+    // http://issuetracker.google.com/172649538
+    ANGLE_SKIP_TEST_IF(IsVulkan());
+
+    EGLWindow *window = getEGLWindow();
+
+    ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
+    ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
+
+    // Create the Image without data so we don't need ANGLE_AHARDWARE_BUFFER_LOCK_PLANES_SUPPORT
+    AHardwareBuffer *source;
+    EGLImageKHR image;
+    createEGLImageAndroidHardwareBufferSource(2, 2, 1, AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420,
+                                              kDefaultAttribs, {}, &source, &image);
+
+    // Create a texture target to bind the egl image
+    GLuint target;
+    createEGLImageTargetTextureExternal(image, &target);
+
+    glUseProgram(mTextureExternalProgram);
+    glBindTexture(GL_TEXTURE_EXTERNAL_OES, target);
+    glUniform1i(mTextureExternalUniformLocation, 0);
+
+    // Sample from the YUV texture with a nearest sampler
+    glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+    glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+    drawQuad(mTextureExternalProgram, "position", 0.5f);
+
+    // Sample from the YUV texture with a linear sampler
+    glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+    glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+    drawQuad(mTextureExternalProgram, "position", 0.5f);
+
+    // Clean up
+    glDeleteTextures(1, &target);
+    eglDestroyImageKHR(window->getDisplay(), image);
+    destroyAndroidHardwareBuffer(source);
+}
+
 // Test sampling from a YUV AHB using EXT_yuv_target
 TEST_P(ImageTestES3, SourceYUVAHBTargetExternalYUVSample)
 {
diff --git a/src/tests/gl_tests/IndexBufferOffsetTest.cpp b/src/tests/gl_tests/IndexBufferOffsetTest.cpp
index 262999e..1441444 100644
--- a/src/tests/gl_tests/IndexBufferOffsetTest.cpp
+++ b/src/tests/gl_tests/IndexBufferOffsetTest.cpp
@@ -122,11 +122,6 @@
 // Test using an offset for an UInt16 index buffer
 TEST_P(IndexBufferOffsetTest, UInt16Index)
 {
-    // TODO(jie.a.chen@intel.com): Re-enable the test once the driver fix is
-    // available in public release.
-    // http://anglebug.com/2663
-    ANGLE_SKIP_TEST_IF(IsIntel() && IsVulkan());
-
     GLushort indexData[] = {0, 1, 2, 1, 2, 3};
     runTest(GL_UNSIGNED_SHORT, 2, indexData);
 }
diff --git a/src/tests/gl_tests/MemoryObjectTest.cpp b/src/tests/gl_tests/MemoryObjectTest.cpp
index 6e8d019..c6cb6ce 100644
--- a/src/tests/gl_tests/MemoryObjectTest.cpp
+++ b/src/tests/gl_tests/MemoryObjectTest.cpp
@@ -32,6 +32,9 @@
 {
     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_memory_object"));
 
+    // http://anglebug.com/5381
+    ANGLE_SKIP_TEST_IF(IsLinux() && IsAMD() && IsDesktopOpenGL());
+
     constexpr GLsizei kMemoryObjectCount = 2;
     GLuint memoryObjects[kMemoryObjectCount];
     glCreateMemoryObjectsEXT(kMemoryObjectCount, memoryObjects);
@@ -53,6 +56,9 @@
 {
     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_memory_object_fd"));
 
+    // http://anglebug.com/5381
+    ANGLE_SKIP_TEST_IF(IsLinux() && IsAMD() && IsDesktopOpenGL());
+
     {
         GLMemoryObject memoryObject;
         GLsizei deviceMemorySize = 1;
@@ -69,6 +75,9 @@
 {
     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_memory_object"));
 
+    // http://anglebug.com/5381
+    ANGLE_SKIP_TEST_IF(IsLinux() && IsAMD() && IsDesktopOpenGL());
+
     GLMemoryObject memoryObject;
 
     // Validate that the initial state of GL_DEDICATED_MEMORY_OBJECT_EXT is GL_FALSE
diff --git a/src/tests/gl_tests/MultisampledRenderToTextureTest.cpp b/src/tests/gl_tests/MultisampledRenderToTextureTest.cpp
index 81551ea..1c96cea 100644
--- a/src/tests/gl_tests/MultisampledRenderToTextureTest.cpp
+++ b/src/tests/gl_tests/MultisampledRenderToTextureTest.cpp
@@ -587,6 +587,10 @@
 TEST_P(MultisampledRenderToTextureTest, 2DColorDepthMultisampleDrawTest)
 {
     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
+
+    // http://anglebug.com/5380
+    ANGLE_SKIP_TEST_IF(IsLinux() && IsAMD() && IsVulkan());
+
     constexpr GLsizei kSize = 6;
     // create complete framebuffer with depth buffer
     GLTexture texture;
@@ -1139,6 +1143,10 @@
        RenderbufferClearDrawCopyThenBlendWithDepthStencilSameProgram)
 {
     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
+
+    // http://anglebug.com/5380
+    ANGLE_SKIP_TEST_IF(IsLinux() && IsAMD() && IsVulkan());
+
     constexpr GLsizei kSize = 64;
 
     setupCopyTexProgram();
@@ -1846,6 +1854,9 @@
     // http://anglebug.com/5096
     ANGLE_SKIP_TEST_IF(IsLinux() && IsIntel() && IsVulkan());
 
+    // http://anglebug.com/5380
+    ANGLE_SKIP_TEST_IF(IsLinux() && IsAMD() && IsVulkan());
+
     constexpr GLsizei kSize = 64;
 
     setupCopyTexProgram();
@@ -1938,6 +1949,9 @@
     // http://anglebug.com/5096
     ANGLE_SKIP_TEST_IF(IsLinux() && IsIntel() && IsVulkan());
 
+    // http://anglebug.com/5380
+    ANGLE_SKIP_TEST_IF(IsLinux() && IsAMD() && IsVulkan());
+
     constexpr GLsizei kSize = 64;
 
     setupCopyTexProgram();
@@ -2433,6 +2447,10 @@
 TEST_P(MultisampledRenderToTextureTest, DepthReadWriteToggleWithStartedRenderPass)
 {
     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
+
+    // http://anglebug.com/5380
+    ANGLE_SKIP_TEST_IF(IsLinux() && IsAMD() && IsVulkan());
+
     constexpr GLsizei kSize = 64;
 
     setupCopyTexProgram();
@@ -3399,6 +3417,9 @@
     // http://anglebug.com/5096
     ANGLE_SKIP_TEST_IF(IsLinux() && IsIntel() && IsVulkan());
 
+    // http://anglebug.com/5380
+    ANGLE_SKIP_TEST_IF(IsLinux() && IsAMD() && IsVulkan());
+
     constexpr GLsizei kSize = 64;
 
     setupCopyTexProgram();
diff --git a/src/tests/gl_tests/MultithreadingTest.cpp b/src/tests/gl_tests/MultithreadingTest.cpp
index d49b0be..c545a79 100644
--- a/src/tests/gl_tests/MultithreadingTest.cpp
+++ b/src/tests/gl_tests/MultithreadingTest.cpp
@@ -627,6 +627,9 @@
 // application.
 TEST_P(MultithreadingTestES3, MultithreadFenceDraw)
 {
+    // http://anglebug.com/5418
+    ANGLE_SKIP_TEST_IF(IsLinux() && IsIntel() && IsVulkan());
+
     // Have the secondary thread use glDrawArrays()
     mainThreadDraw(true);
 }
@@ -635,6 +638,12 @@
 // glDrawArrays.
 TEST_P(MultithreadingTestES3, MultithreadFenceTexImage)
 {
+    // http://anglebug.com/5418
+    ANGLE_SKIP_TEST_IF(IsLinux() && IsIntel() && IsVulkan());
+
+    // http://anglebug.com/5439
+    ANGLE_SKIP_TEST_IF(IsLinux() && isSwiftshader());
+
     // Have the secondary thread use glTexImage2D()
     mainThreadDraw(false);
 }
diff --git a/src/tests/gl_tests/OcclusionQueriesTest.cpp b/src/tests/gl_tests/OcclusionQueriesTest.cpp
index 97ad237..3d12670 100644
--- a/src/tests/gl_tests/OcclusionQueriesTest.cpp
+++ b/src/tests/gl_tests/OcclusionQueriesTest.cpp
@@ -46,6 +46,9 @@
     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 &&
                        !IsGLExtensionEnabled("GL_EXT_occlusion_query_boolean"));
 
+    // http://anglebug.com/5400
+    ANGLE_SKIP_TEST_IF(IsOSX() && IsMetal());
+
     glDepthMask(GL_TRUE);
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
 
@@ -57,8 +60,7 @@
 
     EXPECT_GL_NO_ERROR();
 
-    GLuint query = 0;
-    glGenQueriesEXT(1, &query);
+    GLQueryEXT query;
     glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_EXT, query);
     drawQuad(mProgram, essl1_shaders::PositionAttrib(),
              0.8f);  // this quad should be occluded by first quad
@@ -80,8 +82,6 @@
 
     EXPECT_GL_NO_ERROR();
 
-    glDeleteQueriesEXT(1, &query);
-
     EXPECT_GL_FALSE(result);
 }
 
@@ -94,13 +94,15 @@
     // AMD/Windows misbehaving in this test.  http://anglebug.com/3286
     ANGLE_SKIP_TEST_IF(IsWindows() && IsAMD() && IsVulkan());
 
+    // http://anglebug.com/5400
+    ANGLE_SKIP_TEST_IF(IsOSX() && IsMetal());
+
     glDepthMask(GL_TRUE);
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
 
     EXPECT_GL_NO_ERROR();
 
-    GLuint query = 0;
-    glGenQueriesEXT(1, &query);
+    GLQueryEXT query;
     glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_EXT, query);
     drawQuad(mProgram, essl1_shaders::PositionAttrib(), 0.8f);  // this quad should not be occluded
     glEndQueryEXT(GL_ANY_SAMPLES_PASSED_EXT);
@@ -114,8 +116,6 @@
 
     EXPECT_GL_NO_ERROR();
 
-    glDeleteQueriesEXT(1, &query);
-
     EXPECT_GL_TRUE(result);
 }
 
@@ -140,8 +140,7 @@
 
     EXPECT_GL_NO_ERROR();
 
-    GLuint query[2] = {0};
-    glGenQueriesEXT(2, query);
+    GLQueryEXT query[2];
 
     // First query
     glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_EXT, query[0]);
@@ -192,8 +191,6 @@
                            &result[1]);  // will block waiting for result
     EXPECT_GL_NO_ERROR();
 
-    glDeleteQueriesEXT(2, query);
-
     EXPECT_GL_FALSE(result[0]);
     EXPECT_GL_TRUE(result[1]);
 }
@@ -207,8 +204,7 @@
     // http://anglebug.com/4925
     ANGLE_SKIP_TEST_IF(IsD3D());
 
-    GLuint query = 0;
-    glGenQueriesEXT(1, &query);
+    GLQueryEXT query;
 
     // Masked clear
     glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_EXT, query);
@@ -224,8 +220,6 @@
                            &result);  // will block waiting for result
     EXPECT_GL_NO_ERROR();
 
-    glDeleteQueriesEXT(1, &query);
-
     EXPECT_GL_FALSE(result);
 }
 
@@ -241,8 +235,7 @@
     // http://anglebug.com/5100
     ANGLE_SKIP_TEST_IF(IsMetal() && IsNVIDIA());
 
-    GLuint query = 0;
-    glGenQueriesEXT(1, &query);
+    GLQueryEXT query;
 
     // Unrelated draw before the query starts.
     drawQuad(mProgram, essl1_shaders::PositionAttrib(), 0.8f, 0.5f);
@@ -262,8 +255,6 @@
                            &result);  // will block waiting for result
     EXPECT_GL_NO_ERROR();
 
-    glDeleteQueriesEXT(1, &query);
-
     EXPECT_GL_FALSE(result);
 }
 
@@ -276,6 +267,9 @@
     // http://anglebug.com/5101
     ANGLE_SKIP_TEST_IF(IsWindows() && IsAMD() && IsVulkan());
 
+    // http://anglebug.com/5443
+    ANGLE_SKIP_TEST_IF(IsOSX() && IsMetal() && IsNVIDIA());
+
     constexpr GLuint kSize = 64;
 
     GLFramebuffer srcFbo;
@@ -294,8 +288,7 @@
     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, kSize, kSize, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
     glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, dstTex, 0);
 
-    GLuint query = 0;
-    glGenQueriesEXT(1, &query);
+    GLQueryEXT query;
 
     // Unrelated draw before the query starts.
     drawQuad(mProgram, essl1_shaders::PositionAttrib(), 0.8f, 0.5f);
@@ -313,8 +306,6 @@
                            &result);  // will block waiting for result
     EXPECT_GL_NO_ERROR();
 
-    glDeleteQueriesEXT(1, &query);
-
     EXPECT_GL_FALSE(result);
 }
 
@@ -354,8 +345,7 @@
     glBindTexture(GL_TEXTURE_2D, texture);
     glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, kSize, kSize, 0);
 
-    GLuint query = 0;
-    glGenQueriesEXT(1, &query);
+    GLQueryEXT query;
 
     // Make a draw call that will fail the depth test, and therefore shouldn't contribute to
     // occlusion query.
@@ -373,11 +363,61 @@
                            &result);  // will block waiting for result
     EXPECT_GL_NO_ERROR();
 
-    glDeleteQueriesEXT(1, &query);
-
     EXPECT_GL_FALSE(result);
 }
 
+// Test that changing framebuffers work
+TEST_P(OcclusionQueriesTest, FramebufferBindingChange)
+{
+    ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 &&
+                       !IsGLExtensionEnabled("GL_EXT_occlusion_query_boolean"));
+
+    constexpr GLsizei kSize = 4;
+
+    // Create two framebuffers, and make sure they are synced.
+    GLFramebuffer fbo[2];
+    GLTexture color[2];
+
+    for (size_t index = 0; index < 2; ++index)
+    {
+        glBindTexture(GL_TEXTURE_2D, color[index]);
+        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
+                     nullptr);
+
+        glBindFramebuffer(GL_FRAMEBUFFER, fbo[index]);
+        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color[index],
+                               0);
+
+        glClearColor(0, index, 1 - index, 1);
+        glClear(GL_COLOR_BUFFER_BIT);
+
+        EXPECT_PIXEL_COLOR_EQ(0, 0, index ? GLColor::green : GLColor::blue);
+    }
+    EXPECT_GL_NO_ERROR();
+
+    glViewport(0, 0, kSize, kSize);
+
+    // Start an occlusion query and issue a draw call to each framebuffer.
+    GLQueryEXT query;
+
+    glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_EXT, query);
+
+    for (size_t index = 0; index < 2; ++index)
+    {
+        glBindFramebuffer(GL_FRAMEBUFFER, fbo[index]);
+        drawQuad(mProgram, essl1_shaders::PositionAttrib(), 0.5f);
+    }
+
+    glEndQueryEXT(GL_ANY_SAMPLES_PASSED_EXT);
+    EXPECT_GL_NO_ERROR();
+
+    GLuint result = GL_FALSE;
+    glGetQueryObjectuivEXT(query, GL_QUERY_RESULT_EXT, &result);
+    EXPECT_GL_NO_ERROR();
+
+    EXPECT_GL_TRUE(result);
+}
+
 // Test multiple occlusion queries.
 TEST_P(OcclusionQueriesTest, MultiQueries)
 {
@@ -392,14 +432,14 @@
     ANGLE_SKIP_TEST_IF(IsOpenGL() || IsD3D11());
 
     // http://anglebug.com/4925
-    ANGLE_SKIP_TEST_IF(IsMetal() && IsNVIDIA());
+    // http://anglebug.com/5400
+    ANGLE_SKIP_TEST_IF(IsOSX() && IsMetal());
 
     // TODO(anglebug.com/5360): Failing on ARM-based Apple DTKs.
     ANGLE_SKIP_TEST_IF(IsOSX() && IsARM64() && IsDesktopOpenGL());
     ANGLE_SKIP_TEST_IF(IsOSX() && IsARM64() && IsMetal());
 
-    GLuint query[5] = {};
-    glGenQueriesEXT(5, query);
+    GLQueryEXT query[5];
 
     // First query
     glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_EXT, query[0]);
@@ -497,8 +537,6 @@
                            &result);  // will block waiting for result
     EXPECT_GL_NO_ERROR();
     EXPECT_GL_TRUE(result);
-
-    glDeleteQueriesEXT(5, query);
 }
 
 TEST_P(OcclusionQueriesTest, Errors)
@@ -576,12 +614,12 @@
     ANGLE_SKIP_TEST_IF(IsWindows() && IsNVIDIA() && IsVulkan());
 
     // Test skipped because the D3D backends cannot support simultaneous queries on multiple
-    // contexts yet.  Same with the Vulkan backend.
+    // contexts yet.
     ANGLE_SKIP_TEST_IF(GetParam() == ES2_D3D9() || GetParam() == ES2_D3D11() ||
-                       GetParam() == ES3_D3D11() || GetParam() == ES2_VULKAN());
+                       GetParam() == ES3_D3D11());
 
-    // http://anglebug.com/4092
-    ANGLE_SKIP_TEST_IF(IsVulkan());
+    // http://anglebug.com/5400
+    ANGLE_SKIP_TEST_IF(IsOSX() && IsMetal());
 
     glDepthMask(GL_TRUE);
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
diff --git a/src/tests/gl_tests/PixmapTest.cpp b/src/tests/gl_tests/PixmapTest.cpp
index 3713df5..89d8c13 100644
--- a/src/tests/gl_tests/PixmapTest.cpp
+++ b/src/tests/gl_tests/PixmapTest.cpp
@@ -152,6 +152,8 @@
 
     // This test fails flakily on Linux intel when run with many other tests.
     ANGLE_SKIP_TEST_IF(IsLinux() && IsIntel());
+    // http://anglebug.com/5385
+    ANGLE_SKIP_TEST_IF(IsLinux() && IsAMD() && IsDesktopOpenGL());
 
     EGLWindow *window = getEGLWindow();
 
diff --git a/src/tests/gl_tests/ReadPixelsTest.cpp b/src/tests/gl_tests/ReadPixelsTest.cpp
index 8862ae7..86379bc 100644
--- a/src/tests/gl_tests/ReadPixelsTest.cpp
+++ b/src/tests/gl_tests/ReadPixelsTest.cpp
@@ -125,6 +125,8 @@
 
     // http://anglebug.com/5022
     ANGLE_SKIP_TEST_IF(IsWindows() && IsDesktopOpenGL());
+    // http://anglebug.com/5386
+    ANGLE_SKIP_TEST_IF(IsLinux() && IsAMD() && IsDesktopOpenGL());
 
     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
     glClear(GL_COLOR_BUFFER_BIT);
diff --git a/src/tests/gl_tests/RobustResourceInitTest.cpp b/src/tests/gl_tests/RobustResourceInitTest.cpp
index e94bb4d..6009dac 100644
--- a/src/tests/gl_tests/RobustResourceInitTest.cpp
+++ b/src/tests/gl_tests/RobustResourceInitTest.cpp
@@ -940,6 +940,8 @@
 
     // http://anglebug.com/2407
     ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES());
+    // http://anglebug.com/5398
+    ANGLE_SKIP_TEST_IF(IsAMD() && IsD3D11());
 
     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
 
@@ -1112,6 +1114,9 @@
 TEST_P(RobustResourceInitTestES3, TextureInit_UIntRGB8)
 {
     ANGLE_SKIP_TEST_IF(!hasGLExtension());
+    // http://anglebug.com/5398
+    ANGLE_SKIP_TEST_IF(IsAMD() && IsD3D11());
+
     testIntegerTextureInit<uint8_t>("u", GL_RGBA8UI, GL_RGB8UI, GL_UNSIGNED_BYTE);
 }
 
@@ -1124,6 +1129,9 @@
 TEST_P(RobustResourceInitTestES3, TextureInit_IntRGB8)
 {
     ANGLE_SKIP_TEST_IF(!hasGLExtension());
+    // http://anglebug.com/5398
+    ANGLE_SKIP_TEST_IF(IsAMD() && IsD3D11());
+
     testIntegerTextureInit<int8_t>("i", GL_RGBA8I, GL_RGB8I, GL_BYTE);
 }
 
@@ -1476,6 +1484,8 @@
 
     // http://anglebug.com/2407
     ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES());
+    // http://anglebug.com/5398
+    ANGLE_SKIP_TEST_IF(IsAMD() && IsD3D11());
 
     auto clearFunc = [](float depth) {
         glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
@@ -1493,6 +1503,8 @@
 
     // http://anglebug.com/2407
     ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES());
+    // http://anglebug.com/5398
+    ANGLE_SKIP_TEST_IF(IsAMD() && IsD3D11());
 
     auto clearFunc = [](float depth) {
         glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
@@ -2099,6 +2111,9 @@
     ANGLE_SKIP_TEST_IF(!hasGLExtension());
     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_CHROMIUM_copy_texture"));
 
+    // http://anglebug.com/5398
+    ANGLE_SKIP_TEST_IF(IsAMD() && IsD3D11());
+
     // Call glCopyTextureCHROMIUM to set destTexture as the color attachment of the internal
     // framebuffer mScratchFBO.
     GLTexture sourceTexture;
diff --git a/src/tests/gl_tests/StateChangeTest.cpp b/src/tests/gl_tests/StateChangeTest.cpp
index 439d239..aebf38c 100644
--- a/src/tests/gl_tests/StateChangeTest.cpp
+++ b/src/tests/gl_tests/StateChangeTest.cpp
@@ -387,6 +387,8 @@
     // glTransformFeedbackVaryings for program2 returns GL_INVALID_OPERATION on both Linux and
     // windows.  http://anglebug.com/4265
     ANGLE_SKIP_TEST_IF(IsIntel() && IsOpenGL());
+    // http://anglebug.com/5388
+    ANGLE_SKIP_TEST_IF(IsLinux() && IsAMD() && IsDesktopOpenGL());
 
     std::vector<std::string> tfVaryings = {"gl_Position"};
     ANGLE_GL_PROGRAM_TRANSFORM_FEEDBACK(program1, essl1_shaders::vs::Simple(),
@@ -792,9 +794,6 @@
 // Tests that gl_DepthRange syncs correctly after a change.
 TEST_P(StateChangeRenderTest, DepthRangeUpdates)
 {
-    // http://anglebug.com/2598: Seems to be an Intel driver bug.
-    ANGLE_SKIP_TEST_IF(IsIntel() && IsOpenGL() && IsWindows());
-
     constexpr char kFragCoordShader[] = R"(void main()
 {
     if (gl_DepthRange.near == 0.2)
@@ -891,11 +890,6 @@
 // Tests that D3D11 dirty bit updates don't forget about BufferSubData attrib updates.
 TEST_P(StateChangeTest, VertexBufferUpdatedAfterDraw)
 {
-    // TODO(jie.a.chen@intel.com): Re-enable the test once the driver fix is
-    // available in public release.
-    // http://anglebug.com/2664.
-    ANGLE_SKIP_TEST_IF(IsVulkan() && IsIntel());
-
     constexpr char kVS[] =
         "attribute vec2 position;\n"
         "attribute vec4 color;\n"
@@ -2751,6 +2745,8 @@
 {
     // Fails on AMD OpenGL Windows. This configuration isn't maintained.
     ANGLE_SKIP_TEST_IF(IsWindows() && IsAMD() && IsOpenGL());
+    // http://anglebug.com/5387
+    ANGLE_SKIP_TEST_IF(IsLinux() && IsAMD() && IsDesktopOpenGL());
 
     constexpr char kCS[] = R"(#version 310 es
 layout(local_size_x=1, local_size_y=1) in;
@@ -5273,6 +5269,9 @@
 // binding back to the previous buffer.
 TEST_P(SimpleStateChangeTest, RebindTranslatedAttribute)
 {
+    // http://anglebug.com/5379
+    ANGLE_SKIP_TEST_IF(IsLinux() && IsAMD() && IsVulkan());
+
     constexpr char kVS[] = R"(attribute vec4 a_position;
 attribute float a_attrib;
 varying float v_attrib;
diff --git a/src/tests/gl_tests/SwizzleTest.cpp b/src/tests/gl_tests/SwizzleTest.cpp
index 2362536..fa3eb71 100644
--- a/src/tests/gl_tests/SwizzleTest.cpp
+++ b/src/tests/gl_tests/SwizzleTest.cpp
@@ -306,7 +306,6 @@
 {
     ANGLE_SKIP_TEST_IF(!isTextureSwizzleAvailable());
 
-    ANGLE_SKIP_TEST_IF(IsVulkan());  // anglebug.com/2898 - float textures
     GLfloat data[] = {0.1f, 0.2f, 0.3f};
     init2DTexture(GL_RGB32F, GL_RGB, GL_FLOAT, data);
     runTest2D();
diff --git a/src/tests/gl_tests/TextureMultisampleTest.cpp b/src/tests/gl_tests/TextureMultisampleTest.cpp
index bdf2634..4fdb9cb 100644
--- a/src/tests/gl_tests/TextureMultisampleTest.cpp
+++ b/src/tests/gl_tests/TextureMultisampleTest.cpp
@@ -1068,7 +1068,122 @@
     }
 }
 
+class TextureSampleShadingTest : public ANGLETest
+{
+  protected:
+    TextureSampleShadingTest() {}
+};
+
+// Test that sample shading actually produces different interpolations per sample.  Note that
+// variables such as gl_SampleID and gl_SamplePosition are avoided, as well as the |sample|
+// qualifier as they automatically enable sample shading.
+TEST_P(TextureSampleShadingTest, Basic)
+{
+    ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_sample_shading"));
+
+    // http://anglebug.com/5410
+    ANGLE_SKIP_TEST_IF(IsWindows() && IsIntel() && IsVulkan());
+    // http://anglebug.com/5412
+    ANGLE_SKIP_TEST_IF(IsAMD() && IsVulkan());
+
+    constexpr GLsizei kSize        = 1;
+    constexpr GLsizei kSampleCount = 4;
+
+    // Create a multisampled texture and framebuffer.
+    GLFramebuffer msaaFBO;
+    glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
+
+    GLTexture msaaTexture;
+    glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, msaaTexture);
+    glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, kSampleCount, GL_RGBA8, kSize, kSize,
+                              false);
+    ASSERT_GL_NO_ERROR();
+    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
+                           msaaTexture, 0);
+    ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
+
+    // Enable sample shading and draw a gradient.
+    glEnable(GL_SAMPLE_SHADING_OES);
+    glMinSampleShadingOES(1.0f);
+
+    ANGLE_GL_PROGRAM(gradientProgram, essl31_shaders::vs::Passthrough(),
+                     essl31_shaders::fs::RedGreenGradient());
+    glViewport(0, 0, kSize, kSize);
+    drawQuad(gradientProgram, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true);
+    ASSERT_GL_NO_ERROR();
+
+    // Create a buffer for verification.
+    constexpr GLsizei kPixelChannels = 4;
+    constexpr GLsizei kBufferSize =
+        kSize * kSize * kSampleCount * kPixelChannels * sizeof(uint32_t);
+    GLBuffer buffer;
+    glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer);
+    glBufferData(GL_SHADER_STORAGE_BUFFER, kBufferSize, nullptr, GL_STATIC_DRAW);
+    glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, buffer);
+
+    // Issue a dispatch call that copies the multisampled texture into a buffer.
+    constexpr char kCS[] = R"(#version 310 es
+layout(local_size_x=4, local_size_y=1, local_size_z=1) in;
+
+uniform highp sampler2DMS imageIn;
+layout(std430, binding = 0) buffer dataOut {
+    uint data[];
+};
+
+void main()
+{
+    int sampleIndex = int(gl_GlobalInvocationID.x) % 4;
+
+    vec4 color = texelFetch(imageIn, ivec2(0), sampleIndex);
+    uvec4 unnormalized = uvec4(color * 255.0);
+
+    int outIndex = sampleIndex * 4;
+
+    data[outIndex    ] = unnormalized.r;
+    data[outIndex + 1] = unnormalized.g;
+    data[outIndex + 2] = unnormalized.b;
+    data[outIndex + 3] = unnormalized.a;
+})";
+
+    ANGLE_GL_COMPUTE_PROGRAM(program, kCS);
+    glUseProgram(program);
+
+    // Bind the multisampled texture as sampler.
+    GLint imageLocation = glGetUniformLocation(program, "imageIn");
+    ASSERT_GE(imageLocation, 0);
+
+    glActiveTexture(GL_TEXTURE0);
+    glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, msaaTexture);
+    glUniform1i(imageLocation, 0);
+
+    glDispatchCompute(1, 1, 1);
+    EXPECT_GL_NO_ERROR();
+
+    // Verify that the buffer has correct data.
+    glMemoryBarrier(GL_BUFFER_UPDATE_BARRIER_BIT);
+
+    const uint32_t *ptr = reinterpret_cast<uint32_t *>(
+        glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, kBufferSize, GL_MAP_READ_BIT));
+    constexpr GLColor kExpectedColors[4] = {
+        GLColor(96, 32, 0, 255),
+        GLColor(223, 96, 0, 255),
+        GLColor(32, 159, 0, 255),
+        GLColor(159, 223, 0, 255),
+    };
+    for (GLsizei pixel = 0; pixel < kSampleCount; ++pixel)
+    {
+        for (GLsizei channel = 0; channel < kPixelChannels; ++channel)
+        {
+            EXPECT_NEAR(ptr[pixel * kPixelChannels + channel], kExpectedColors[pixel][channel], 1)
+                << pixel << " " << channel;
+        }
+    }
+
+    glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
+}
+
 ANGLE_INSTANTIATE_TEST_ES3_AND_ES31(TextureMultisampleTest);
 ANGLE_INSTANTIATE_TEST_ES3(NegativeTextureMultisampleTest);
 ANGLE_INSTANTIATE_TEST_ES31(TextureMultisampleArrayWebGLTest);
+ANGLE_INSTANTIATE_TEST_ES31(TextureSampleShadingTest);
 }  // anonymous namespace
diff --git a/src/tests/gl_tests/TextureTest.cpp b/src/tests/gl_tests/TextureTest.cpp
index 71edb18..48084c3 100644
--- a/src/tests/gl_tests/TextureTest.cpp
+++ b/src/tests/gl_tests/TextureTest.cpp
@@ -8619,6 +8619,79 @@
     }
 }
 
+class CopyImageTestES31 : public ANGLETest
+{
+  protected:
+    CopyImageTestES31() {}
+};
+
+// Test that copies between RGB formats doesn't affect the emulated alpha channel, if any.
+TEST_P(CopyImageTestES31, PreserveEmulatedAlpha)
+{
+    ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_copy_image"));
+
+    constexpr GLsizei kSize = 1;
+
+    GLTexture src, dst;
+
+    // Set up the textures
+    glBindTexture(GL_TEXTURE_2D, src);
+    glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGB8, kSize, kSize);
+
+    const GLColor kInitColor(50, 100, 150, 200);
+    glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kSize, kSize, GL_RGB, GL_UNSIGNED_BYTE, &kInitColor);
+
+    glBindTexture(GL_TEXTURE_2D, dst);
+    glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGB8UI, kSize, kSize);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+    // Copy from src to dst
+    glCopyImageSubDataEXT(src, GL_TEXTURE_2D, 0, 0, 0, 0, dst, GL_TEXTURE_2D, 0, 0, 0, 0, kSize,
+                          kSize, 1);
+
+    // Bind dst as image
+    glBindImageTexture(0, dst, 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA8UI);
+
+    // Create a buffer for output
+    constexpr GLsizei kBufferSize = kSize * kSize * sizeof(uint32_t) * 4;
+    GLBuffer buffer;
+    glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer);
+    glBufferData(GL_SHADER_STORAGE_BUFFER, kBufferSize, nullptr, GL_STATIC_DRAW);
+    glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, buffer);
+
+    constexpr char kCS[] = R"(#version 310 es
+layout(local_size_x=1, local_size_y=1, local_size_z=1) in;
+layout(rgba8ui, binding = 0) readonly uniform highp uimage2D imageIn;
+ layout(std140, binding = 1) buffer dataOut {
+     uvec4 data[];
+ };
+void main()
+{
+    uvec4 color = imageLoad(imageIn, ivec2(0));
+    data[0] = color;
+})";
+
+    ANGLE_GL_COMPUTE_PROGRAM(program, kCS);
+    glUseProgram(program);
+    glDispatchCompute(1, 1, 1);
+    EXPECT_GL_NO_ERROR();
+
+    glMemoryBarrier(GL_BUFFER_UPDATE_BARRIER_BIT);
+
+    const uint32_t *ptr = reinterpret_cast<uint32_t *>(
+        glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, kBufferSize, GL_MAP_READ_BIT));
+
+    EXPECT_EQ(ptr[0], kInitColor.R);
+    EXPECT_EQ(ptr[1], kInitColor.G);
+    EXPECT_EQ(ptr[2], kInitColor.B);
+
+    // Expect alpha to be 1, even if the RGB format is emulated with RGBA.
+    EXPECT_EQ(ptr[3], 1u);
+
+    glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
+}
+
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
 #define ES2_EMULATE_COPY_TEX_IMAGE()                          \
@@ -8673,5 +8746,6 @@
 ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(PBOCompressedTextureTest);
 ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(ETC1CompressedTextureTest);
 ANGLE_INSTANTIATE_TEST_ES31(TextureBufferTestES31);
+ANGLE_INSTANTIATE_TEST_ES31(CopyImageTestES31);
 
 }  // anonymous namespace
diff --git a/src/tests/gl_tests/TransformFeedbackTest.cpp b/src/tests/gl_tests/TransformFeedbackTest.cpp
index 7807d48..6c37e0c 100644
--- a/src/tests/gl_tests/TransformFeedbackTest.cpp
+++ b/src/tests/gl_tests/TransformFeedbackTest.cpp
@@ -9,6 +9,7 @@
 #include "util/EGLWindow.h"
 #include "util/gles_loader_autogen.h"
 #include "util/random_utils.h"
+#include "util/test_utils.h"
 
 using namespace angle;
 
@@ -81,6 +82,8 @@
     }
 
     void setupOverrunTest(const std::vector<GLfloat> &vertices);
+
+    void midRecordOpDoesNotContributeTest(std::function<void()> op);
 };
 
 TEST_P(TransformFeedbackTest, ZeroSizedViewport)
@@ -100,8 +103,7 @@
     glBeginTransformFeedback(GL_TRIANGLES);
 
     // Create a query to check how many primitives were written
-    GLuint primitivesWrittenQuery = 0;
-    glGenQueries(1, &primitivesWrittenQuery);
+    GLQuery primitivesWrittenQuery;
     glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, primitivesWrittenQuery);
 
     // Set a viewport that would result in no pixels being written to the framebuffer and draw
@@ -148,8 +150,7 @@
                  GL_STATIC_DRAW);
 
     // Create a query to check how many primitives were written
-    GLuint primitivesWrittenQuery = 0;
-    glGenQueries(1, &primitivesWrittenQuery);
+    GLQuery primitivesWrittenQuery;
     glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, primitivesWrittenQuery);
 
     const float finalZ = 0.95f;
@@ -241,8 +242,7 @@
     glBeginTransformFeedback(GL_POINTS);
 
     // Create a query to check how many primitives were written
-    GLuint primitivesWrittenQuery = 0;
-    glGenQueries(1, &primitivesWrittenQuery);
+    GLQuery primitivesWrittenQuery;
     glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, primitivesWrittenQuery);
 
     glDrawArrays(GL_POINTS, 0, 6);
@@ -280,6 +280,289 @@
     EXPECT_GL_NO_ERROR();
 }
 
+// Test that transform feedback can cover multiple render passes.
+TEST_P(TransformFeedbackTest, SpanMultipleRenderPasses)
+{
+    // TODO(anglebug.com/4533) This fails after the upgrade to the 26.20.100.7870 driver.
+    ANGLE_SKIP_TEST_IF(IsWindows() && IsIntel() && IsVulkan());
+
+    // Fails on Mac GL drivers. http://anglebug.com/4992
+    ANGLE_SKIP_TEST_IF(IsOpenGL() && IsOSX());
+
+    // anglebug.com/5428
+    ANGLE_SKIP_TEST_IF(IsLinux() && IsIntel() && IsVulkan());
+
+    // anglebug.com/5429
+    ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES());
+
+    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+    glClear(GL_COLOR_BUFFER_BIT);
+
+    // Set the program's transform feedback varyings (just gl_Position)
+    std::vector<std::string> tfVaryings;
+    tfVaryings.push_back("gl_Position");
+    compileDefaultProgram(tfVaryings, GL_INTERLEAVED_ATTRIBS);
+
+    glUseProgram(mProgram);
+
+    GLint positionLocation = glGetAttribLocation(mProgram, essl1_shaders::PositionAttrib());
+
+    const GLfloat vertices[] = {
+        -0.5f, 0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f,
+        -0.5f, 0.5f, 0.5f, 0.5f,  -0.5f, 0.5f, 0.5f, 0.5f,  0.5f,
+    };
+
+    glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, vertices);
+    glEnableVertexAttribArray(positionLocation);
+
+    // Bind the buffer for transform feedback output and start transform feedback
+    glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, mTransformFeedbackBuffer);
+    glBeginTransformFeedback(GL_POINTS);
+
+    // Create a query to check how many primitives were written
+    GLQuery primitivesWrittenQuery;
+    glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, primitivesWrittenQuery);
+
+    // Draw the first set of three points
+    glDrawArrays(GL_POINTS, 0, 3);
+
+    // Break the render pass
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
+
+    // Draw the second set of three points
+    glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, vertices + 9);
+    glDrawArrays(GL_POINTS, 0, 3);
+
+    glDisableVertexAttribArray(positionLocation);
+    glVertexAttribPointer(positionLocation, 4, GL_FLOAT, GL_FALSE, 0, nullptr);
+    // End the query and transform feedback
+    glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);
+    glEndTransformFeedback();
+
+    glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, 0);
+
+    // Verify the number of primitives written
+    GLuint primitivesWritten = 0;
+    glGetQueryObjectuiv(primitivesWrittenQuery, GL_QUERY_RESULT_EXT, &primitivesWritten);
+    EXPECT_GL_NO_ERROR();
+
+    EXPECT_EQ(6u, primitivesWritten);
+
+    // Verify the captured buffer.
+
+    glBindBuffer(GL_ARRAY_BUFFER, mTransformFeedbackBuffer);
+    glVertexAttribPointer(positionLocation, 4, GL_FLOAT, GL_FALSE, 0, 0);
+    glEnableVertexAttribArray(positionLocation);
+
+    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+    glClear(GL_COLOR_BUFFER_BIT);
+    glDrawArrays(GL_TRIANGLES, 0, 6);
+
+    const int w = getWindowWidth();
+    const int h = getWindowHeight();
+
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
+    EXPECT_PIXEL_COLOR_EQ(w - 1, 0, GLColor::black);
+    EXPECT_PIXEL_COLOR_EQ(0, h - 1, GLColor::black);
+    EXPECT_PIXEL_COLOR_EQ(w - 1, h - 1, GLColor::black);
+
+    EXPECT_PIXEL_COLOR_EQ(w / 4 + 1, h / 4 + 1, GLColor::red);
+    EXPECT_PIXEL_COLOR_EQ(3 * w / 4 - 1, h / 4 + 1, GLColor::red);
+    EXPECT_PIXEL_COLOR_EQ(w / 4 + 1, 3 * h / 4 - 1, GLColor::red);
+    EXPECT_PIXEL_COLOR_EQ(3 * w / 4 - 1, 3 * h / 4 - 1, GLColor::red);
+
+    EXPECT_PIXEL_COLOR_EQ(w / 2, h / 2, GLColor::red);
+
+    EXPECT_GL_NO_ERROR();
+}
+
+void TransformFeedbackTest::midRecordOpDoesNotContributeTest(std::function<void()> op)
+{
+    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+    glClear(GL_COLOR_BUFFER_BIT);
+
+    // Set the program's transform feedback varyings (just gl_Position)
+    std::vector<std::string> tfVaryings;
+    tfVaryings.push_back("gl_Position");
+    compileDefaultProgram(tfVaryings, GL_INTERLEAVED_ATTRIBS);
+
+    glUseProgram(mProgram);
+
+    GLint positionLocation = glGetAttribLocation(mProgram, essl1_shaders::PositionAttrib());
+
+    const GLfloat vertices[] = {
+        -0.5f, 0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f,
+        -0.5f, 0.5f, 0.5f, 0.5f,  -0.5f, 0.5f, 0.5f, 0.5f,  0.5f,
+    };
+
+    glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, vertices);
+    glEnableVertexAttribArray(positionLocation);
+
+    // Bind the buffer for transform feedback output and start transform feedback
+    glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, mTransformFeedbackBuffer);
+    glBeginTransformFeedback(GL_POINTS);
+
+    // Create a query to check how many primitives were written
+    GLQuery primitivesWrittenQuery;
+    glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, primitivesWrittenQuery);
+
+    // Draw the first set of three points
+    glDrawArrays(GL_POINTS, 0, 3);
+
+    // Perform the operation in the middle of recording
+    op();
+
+    // Draw the second set of three points
+    glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, vertices + 9);
+    glDrawArrays(GL_POINTS, 0, 3);
+
+    glDisableVertexAttribArray(positionLocation);
+    glVertexAttribPointer(positionLocation, 4, GL_FLOAT, GL_FALSE, 0, nullptr);
+    // End the query and transform feedback
+    glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);
+    glEndTransformFeedback();
+
+    glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, 0);
+
+    // Verify the number of primitives written
+    GLuint primitivesWritten = 0;
+    glGetQueryObjectuiv(primitivesWrittenQuery, GL_QUERY_RESULT_EXT, &primitivesWritten);
+    EXPECT_GL_NO_ERROR();
+
+    EXPECT_EQ(6u, primitivesWritten);
+
+    // Verify the captured buffer.
+    glBindBuffer(GL_ARRAY_BUFFER, mTransformFeedbackBuffer);
+    glVertexAttribPointer(positionLocation, 4, GL_FLOAT, GL_FALSE, 0, 0);
+    glEnableVertexAttribArray(positionLocation);
+
+    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+    glClear(GL_COLOR_BUFFER_BIT);
+    glDrawArrays(GL_TRIANGLES, 0, 6);
+}
+
+// Test that draw-based clear between draws does not contribute to transform feedback.
+TEST_P(TransformFeedbackTest, ClearWhileRecordingDoesNotContribute)
+{
+    // TODO(anglebug.com/4533) This fails after the upgrade to the 26.20.100.7870 driver.
+    ANGLE_SKIP_TEST_IF(IsWindows() && IsIntel() && IsVulkan());
+
+    // Fails on Mac GL drivers. http://anglebug.com/4992
+    ANGLE_SKIP_TEST_IF(IsOpenGL() && IsOSX());
+
+    // anglebug.com/5434
+    ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES());
+
+    auto clear = []() {
+        glColorMask(GL_FALSE, GL_FALSE, GL_TRUE, GL_FALSE);
+        glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
+        glClear(GL_COLOR_BUFFER_BIT);
+        glColorMask(GL_TRUE, GL_TRUE, GL_FALSE, GL_TRUE);
+    };
+
+    midRecordOpDoesNotContributeTest(clear);
+
+    const int w = getWindowWidth();
+    const int h = getWindowHeight();
+
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
+    EXPECT_PIXEL_COLOR_EQ(w - 1, 0, GLColor::blue);
+    EXPECT_PIXEL_COLOR_EQ(0, h - 1, GLColor::blue);
+    EXPECT_PIXEL_COLOR_EQ(w - 1, h - 1, GLColor::blue);
+
+    EXPECT_PIXEL_COLOR_EQ(w / 4 + 1, h / 4 + 1, GLColor::magenta);
+    EXPECT_PIXEL_COLOR_EQ(3 * w / 4 - 1, h / 4 + 1, GLColor::magenta);
+    EXPECT_PIXEL_COLOR_EQ(w / 4 + 1, 3 * h / 4 - 1, GLColor::magenta);
+    EXPECT_PIXEL_COLOR_EQ(3 * w / 4 - 1, 3 * h / 4 - 1, GLColor::magenta);
+
+    EXPECT_PIXEL_COLOR_EQ(w / 2, h / 2, GLColor::magenta);
+
+    EXPECT_GL_NO_ERROR();
+}
+
+// Test that copy in the middle of rendering doesn't contribute to transform feedback.
+TEST_P(TransformFeedbackTest, CopyWhileRecordingDoesNotContribute)
+{
+    // TODO(anglebug.com/4533) This fails after the upgrade to the 26.20.100.7870 driver.
+    ANGLE_SKIP_TEST_IF(IsWindows() && IsIntel() && IsVulkan());
+
+    // Fails on Mac GL drivers. http://anglebug.com/4992
+    ANGLE_SKIP_TEST_IF(IsOpenGL() && IsOSX());
+
+    // anglebug.com/5434
+    ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES());
+
+    auto copy = []() {
+        GLTexture texture;
+        glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 1, 1, 0);
+    };
+
+    midRecordOpDoesNotContributeTest(copy);
+
+    const int w = getWindowWidth();
+    const int h = getWindowHeight();
+
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
+    EXPECT_PIXEL_COLOR_EQ(w - 1, 0, GLColor::black);
+    EXPECT_PIXEL_COLOR_EQ(0, h - 1, GLColor::black);
+    EXPECT_PIXEL_COLOR_EQ(w - 1, h - 1, GLColor::black);
+
+    EXPECT_PIXEL_COLOR_EQ(w / 4 + 1, h / 4 + 1, GLColor::red);
+    EXPECT_PIXEL_COLOR_EQ(3 * w / 4 - 1, h / 4 + 1, GLColor::red);
+    EXPECT_PIXEL_COLOR_EQ(w / 4 + 1, 3 * h / 4 - 1, GLColor::red);
+    EXPECT_PIXEL_COLOR_EQ(3 * w / 4 - 1, 3 * h / 4 - 1, GLColor::red);
+
+    EXPECT_PIXEL_COLOR_EQ(w / 2, h / 2, GLColor::red);
+
+    EXPECT_GL_NO_ERROR();
+}
+
+// Test that blit in the middle of rendering doesn't contribute to transform feedback.
+TEST_P(TransformFeedbackTest, BlitWhileRecordingDoesNotContribute)
+{
+    // TODO(anglebug.com/4533) This fails after the upgrade to the 26.20.100.7870 driver.
+    ANGLE_SKIP_TEST_IF(IsWindows() && IsIntel() && IsVulkan());
+
+    // Fails on Mac GL drivers. http://anglebug.com/4992
+    ANGLE_SKIP_TEST_IF(IsOpenGL() && IsOSX());
+
+    // anglebug.com/5434
+    ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES());
+
+    auto blit = []() {
+        GLFramebuffer dstFbo;
+        glBindFramebuffer(GL_DRAW_FRAMEBUFFER, dstFbo);
+
+        GLTexture dstTex;
+        glBindTexture(GL_TEXTURE_2D, dstTex);
+        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
+        glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, dstTex, 0);
+
+        glBlitFramebuffer(0, 0, 1, 1, 1, 1, 0, 0, GL_COLOR_BUFFER_BIT, GL_LINEAR);
+
+        glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
+    };
+
+    midRecordOpDoesNotContributeTest(blit);
+
+    const int w = getWindowWidth();
+    const int h = getWindowHeight();
+
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
+    EXPECT_PIXEL_COLOR_EQ(w - 1, 0, GLColor::black);
+    EXPECT_PIXEL_COLOR_EQ(0, h - 1, GLColor::black);
+    EXPECT_PIXEL_COLOR_EQ(w - 1, h - 1, GLColor::black);
+
+    EXPECT_PIXEL_COLOR_EQ(w / 4 + 1, h / 4 + 1, GLColor::red);
+    EXPECT_PIXEL_COLOR_EQ(3 * w / 4 - 1, h / 4 + 1, GLColor::red);
+    EXPECT_PIXEL_COLOR_EQ(w / 4 + 1, 3 * h / 4 - 1, GLColor::red);
+    EXPECT_PIXEL_COLOR_EQ(3 * w / 4 - 1, 3 * h / 4 - 1, GLColor::red);
+
+    EXPECT_PIXEL_COLOR_EQ(w / 2, h / 2, GLColor::red);
+
+    EXPECT_GL_NO_ERROR();
+}
+
 // Test that XFB does not allow writing more vertices than fit in the bound buffers.
 // TODO(jmadill): Enable this test after fixing the last case where the buffer size changes after
 // calling glBeginTransformFeedback.
@@ -2246,8 +2529,7 @@
     glBeginTransformFeedback(GL_POINTS);
 
     // Create a query to check how many primitives were written
-    GLuint primitivesWrittenQuery = 0;
-    glGenQueries(1, &primitivesWrittenQuery);
+    GLQuery primitivesWrittenQuery;
     glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, primitivesWrittenQuery);
 
     glDrawArrays(GL_POINTS, 0, 3);
@@ -2324,8 +2606,7 @@
     glBeginTransformFeedback(GL_POINTS);
 
     // Create a query to check how many primitives were written
-    GLuint primitivesWrittenQuery = 0;
-    glGenQueries(1, &primitivesWrittenQuery);
+    GLQuery primitivesWrittenQuery;
     glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, primitivesWrittenQuery);
 
     glDrawArrays(GL_POINTS, 0, 3);
@@ -2361,11 +2642,170 @@
     EXPECT_GL_NO_ERROR();
 }
 
+class TransformFeedbackTestES32 : public TransformFeedbackTest
+{};
+
+// Test that simultaneous use of transform feedback primitives written and primitives generated
+// queries works.
+TEST_P(TransformFeedbackTestES32, PrimitivesWrittenAndGenerated)
+{
+    // TODO(anglebug.com/4533) This fails after the upgrade to the 26.20.100.7870 driver.
+    ANGLE_SKIP_TEST_IF(IsWindows() && IsIntel() && IsVulkan());
+
+    // No ES3.2 support on out bots.  http://anglebug.com/5435
+    ANGLE_SKIP_TEST_IF(IsPixel2() && IsVulkan());
+
+    // No VK_EXT_transform_feedback support on the following configurations.
+    // http://anglebug.com/5435
+    ANGLE_SKIP_TEST_IF(IsVulkan() && IsAMD() && IsWindows());
+    ANGLE_SKIP_TEST_IF(IsVulkan() && IsNVIDIA() && IsWindows7());
+
+    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+    glClear(GL_COLOR_BUFFER_BIT);
+
+    // Set the program's transform feedback varyings (just gl_Position)
+    std::vector<std::string> tfVaryings;
+    tfVaryings.push_back("gl_Position");
+    compileDefaultProgram(tfVaryings, GL_INTERLEAVED_ATTRIBS);
+
+    glUseProgram(mProgram);
+
+    GLint positionLocation = glGetAttribLocation(mProgram, essl1_shaders::PositionAttrib());
+
+    glEnable(GL_RASTERIZER_DISCARD);
+
+    const GLfloat vertices[] = {
+        -1.0f, 1.0f,  0.5f, -1.0f, -1.0f, 0.5f, 1.0f,  -1.0f, 0.5f, -1.0f, 1.0f,  0.5f,
+        1.0f,  -1.0f, 0.5f, 1.0f,  1.0f,  0.5f, -1.0f, 1.0f,  0.5f, -1.0f, -1.0f, 0.5f,
+        1.0f,  -1.0f, 0.5f, -1.0f, 1.0f,  0.5f, 1.0f,  -1.0f, 0.5f, 1.0f,  1.0f,  0.5f,
+    };
+
+    glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, vertices);
+    glEnableVertexAttribArray(positionLocation);
+
+    // Bind the buffer for transform feedback output and start transform feedback
+    glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, mTransformFeedbackBuffer);
+    glBeginTransformFeedback(GL_POINTS);
+    EXPECT_GL_NO_ERROR();
+
+    // Create a number of queries.  The test overview is as follows (PW = PrimitivesWritten, PG =
+    // Primitives Generated):
+    //
+    //           PW0 begin
+    // - Draw 3
+    //                      PG0 begin
+    // - Draw 4
+    //           PW0 end
+    // - Draw 5
+    // - Copy
+    // - Draw 6
+    //                                 PW1 begin
+    // - Draw 7
+    // - Copy
+    // - Draw 8
+    //                      PG0 end
+    //                                            PG1 begin
+    // - Draw 9
+    // - Copy
+    //                                 PW1 end
+    // - Draw 10
+    // - Copy
+    //                                            PG1 end
+    //                                                        PW2 begin
+    //                                                                   PG2 begin
+    // - Draw 11
+    // - Copy
+    // - Draw 12
+    //                                                                   PG2 end
+    //                                                        PW2 end
+    //
+    // This tests a variety of scenarios where either of PW or PG is active or not when the other
+    // begins or ends, as well as testing render pass restarts with the queries active and begin and
+    // end of queries outside or mid render pass.
+    constexpr size_t kQueryCount = 3;
+    GLQuery primitivesWrittenQueries[kQueryCount];
+    GLQuery primitivesGeneratedQueries[kQueryCount];
+
+    GLTexture texture;
+    glBindTexture(GL_TEXTURE_2D, texture);
+
+    /* PG PW */
+    /*     / */ glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, primitivesWrittenQueries[0]);
+    /*    |  */ glDrawArrays(GL_POINTS, 0, 3);
+    /*  / 0  */ glBeginQuery(GL_PRIMITIVES_GENERATED, primitivesGeneratedQueries[0]);
+    /* |  |  */ glDrawArrays(GL_POINTS, 0, 4);
+    /* |   \ */ glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);
+    /* |     */ glDrawArrays(GL_POINTS, 0, 5);
+    /* |     */ glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 1, 1, 0);
+    /* 0     */ glDrawArrays(GL_POINTS, 0, 6);
+    /* |   / */ glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, primitivesWrittenQueries[1]);
+    /* |  |  */ glDrawArrays(GL_POINTS, 0, 7);
+    /* |  |  */ glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 1, 1, 0);
+    /* |  |  */ glDrawArrays(GL_POINTS, 0, 8);
+    /*  \ 1  */ glEndQuery(GL_PRIMITIVES_GENERATED);
+    /*  / |  */ glBeginQuery(GL_PRIMITIVES_GENERATED, primitivesGeneratedQueries[1]);
+    /* |  |  */ glDrawArrays(GL_POINTS, 0, 9);
+    /* |  |  */ glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 1, 1, 0);
+    /* 1   \ */ glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);
+    /* |     */ glDrawArrays(GL_POINTS, 0, 10);
+    /* |     */ glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 1, 1, 0);
+    /*  \    */ glEndQuery(GL_PRIMITIVES_GENERATED);
+    /*     / */ glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, primitivesWrittenQueries[2]);
+    /*  / |  */ glBeginQuery(GL_PRIMITIVES_GENERATED, primitivesGeneratedQueries[2]);
+    /* |  |  */ glDrawArrays(GL_POINTS, 0, 11);
+    /* 2  2  */ glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 1, 1, 0);
+    /* |  |  */ glDrawArrays(GL_POINTS, 0, 12);
+    /*  \ |  */ glEndQuery(GL_PRIMITIVES_GENERATED);
+    /*     \ */ glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);
+
+    glEndTransformFeedback();
+    EXPECT_GL_NO_ERROR();
+
+    // Check that the queries have correct results.  Verify the first of each query with
+    // GL_QUERY_RESULT_AVAILABLE for no particular reason other than testing different paths.
+    GLuint readyPW = GL_FALSE;
+    GLuint readyPG = GL_FALSE;
+    while (readyPW == GL_FALSE || readyPG == GL_FALSE)
+    {
+        angle::Sleep(0);
+        glGetQueryObjectuiv(primitivesWrittenQueries[0], GL_QUERY_RESULT_AVAILABLE, &readyPW);
+        glGetQueryObjectuiv(primitivesGeneratedQueries[0], GL_QUERY_RESULT_AVAILABLE, &readyPG);
+    }
+    EXPECT_GL_NO_ERROR();
+
+    constexpr GLuint kPrimitivesWrittenExpected[kQueryCount] = {
+        3 + 4,
+        7 + 8 + 9,
+        11 + 12,
+    };
+    constexpr GLuint kPrimitivesGeneratedExpected[kQueryCount] = {
+        4 + 5 + 6 + 7 + 8,
+        9 + 10,
+        11 + 12,
+    };
+
+    for (size_t queryIndex = 0; queryIndex < kQueryCount; ++queryIndex)
+    {
+        GLuint primitivesWritten = 0;
+        glGetQueryObjectuiv(primitivesWrittenQueries[queryIndex], GL_QUERY_RESULT,
+                            &primitivesWritten);
+
+        GLuint primitivesGenerated = 0;
+        glGetQueryObjectuiv(primitivesGeneratedQueries[queryIndex], GL_QUERY_RESULT,
+                            &primitivesGenerated);
+        EXPECT_GL_NO_ERROR();
+
+        EXPECT_EQ(primitivesWritten, kPrimitivesWrittenExpected[queryIndex]) << queryIndex;
+        EXPECT_EQ(primitivesGenerated, kPrimitivesGeneratedExpected[queryIndex]) << queryIndex;
+    }
+}
+
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
 ANGLE_INSTANTIATE_TEST_ES3(TransformFeedbackTest);
 ANGLE_INSTANTIATE_TEST_ES3(TransformFeedbackLifetimeTest);
 ANGLE_INSTANTIATE_TEST_ES31(TransformFeedbackTestES31);
+ANGLE_INSTANTIATE_TEST_ES32(TransformFeedbackTestES32);
 
 ANGLE_INSTANTIATE_TEST(TransformFeedbackWithDepthBufferTest, ES3_METAL());
 
diff --git a/src/tests/gl_tests/UniformBufferTest.cpp b/src/tests/gl_tests/UniformBufferTest.cpp
index 2c882ca..a0f6e54 100644
--- a/src/tests/gl_tests/UniformBufferTest.cpp
+++ b/src/tests/gl_tests/UniformBufferTest.cpp
@@ -1520,6 +1520,8 @@
 {
     // Test crashes on Windows AMD OpenGL
     ANGLE_SKIP_TEST_IF(IsAMD() && IsWindows() && IsOpenGL());
+    // http://anglebug.com/5382
+    ANGLE_SKIP_TEST_IF(IsLinux() && IsAMD() && IsDesktopOpenGL());
 
     ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), kFragmentShader);
 
@@ -3000,19 +3002,25 @@
 // Test to transfer a uniform block large array member as an actual parameter to a function.
 TEST_P(UniformBlockWithOneLargeArrayMemberTest, MemberAsActualParameter)
 {
+    ANGLE_SKIP_TEST_IF(IsAdreno());
+
     constexpr char kVS[] = R"(#version 300 es
 layout(location=0) in vec3 a_position;
 
-uniform UBO{
-    mat4x4 buf[90];
+layout(std140) uniform UBO1{
+    mat4x4 buf1[90];
 } instance;
 
-vec4 test(mat4x4[90] para, vec3 pos){
-    return para[0] * vec4(pos, 1.0);
+layout(std140) uniform UBO2{
+    mat4x4 buf2[90];
+};
+
+vec4 test(mat4x4[90] para1, mat4x4[90] para2, vec3 pos){
+    return para1[0] * para2[0] * vec4(pos, 1.0);
 }
 
 void main(void){
-    gl_Position = test(instance.buf, a_position);
+    gl_Position = test(instance.buf1, buf2, a_position);
 })";
 
     constexpr char kFS[] = R"(#version 300 es
@@ -3037,15 +3045,15 @@
     constexpr char kVS[] = R"(#version 300 es
 layout(location=0) in vec3 a_position;
 
-uniform UBO1{
+layout(std140) uniform UBO1{
     mat4x4 buf1[90];
 };
 
-uniform UBO2{
+layout(std140) uniform UBO2{
     mat4x4 buf2[90];
 };
 
-uniform UBO3{
+layout(std140) uniform UBO3{
     mat4x4 buf[90];
 } instance;
 
@@ -3085,6 +3093,51 @@
     EXPECT_GL_NO_ERROR();
 }
 
+// Test to throw a warning if a uniform block with a large array member
+// fails to hit the optimization on D3D backend.
+TEST_P(UniformBlockWithOneLargeArrayMemberTest, ThrowPerfWarningInD3D)
+{
+    constexpr char kFS[] = R"(#version 300 es
+precision highp float;
+
+struct S1 {
+    vec2 a[2];
+};
+
+struct S2 {
+    mat2x4 b;
+};
+
+layout(std140, row_major) uniform UBO1{
+    mat3x2 buf1[128];
+};
+
+layout(std140, row_major) uniform UBO2{
+    mat4x3 buf2[128];
+} instance1;
+
+layout(std140, row_major) uniform UBO3{
+    S1 buf3[128];
+};
+
+layout(std140, row_major) uniform UBO4{
+    S2 buf4[128];
+} instance2[2];
+
+out vec4 my_FragColor;
+
+void main(void){
+    uvec2 coord = uvec2(floor(gl_FragCoord.xy));
+    uint x = coord.x % 64u;
+    uint y = coord.y;
+    my_FragColor = vec4(buf1[y]*instance1.buf2[y]*instance2[0].buf4[y].b*buf3[y].a[x], 0.0f, 1.0);
+
+})";
+
+    ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), kFS);
+    EXPECT_GL_NO_ERROR();
+}
+
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
 ANGLE_INSTANTIATE_TEST_ES3(UniformBufferTest);
diff --git a/src/tests/gl_tests/VertexAttributeTest.cpp b/src/tests/gl_tests/VertexAttributeTest.cpp
index 4d48248..578b89e 100644
--- a/src/tests/gl_tests/VertexAttributeTest.cpp
+++ b/src/tests/gl_tests/VertexAttributeTest.cpp
@@ -1429,6 +1429,9 @@
 // draw.
 TEST_P(VertexAttributeTest, DrawArraysWithShortBufferOffsetNotMultipleOf4)
 {
+    // http://anglebug.com/5399
+    ANGLE_SKIP_TEST_IF(IsWindows() && IsAMD() && IsVulkan());
+
     initBasicProgram();
     glUseProgram(mProgram);
 
diff --git a/src/tests/gl_tests/VulkanExternalImageTest.cpp b/src/tests/gl_tests/VulkanExternalImageTest.cpp
index 45da3c5..cde955d 100644
--- a/src/tests/gl_tests/VulkanExternalImageTest.cpp
+++ b/src/tests/gl_tests/VulkanExternalImageTest.cpp
@@ -761,6 +761,8 @@
 
     // http://issuetracker.google.com/173004081
     ANGLE_SKIP_TEST_IF(IsVulkan() && IsIntel() && IsLinux() && isAsyncCommandQueueFeatureEnabled());
+    // http://anglebug.com/5383
+    ANGLE_SKIP_TEST_IF(IsLinux() && IsAMD() && IsDesktopOpenGL());
 
     RunShouldClearWithSemaphoresTest<OpaqueFdTraits>(false, kDefaultImageCreateFlags,
                                                      kDefaultImageUsageFlags, isSwiftshader(),
@@ -997,6 +999,8 @@
 
     // http://issuetracker.google.com/173004081
     ANGLE_SKIP_TEST_IF(IsVulkan() && IsIntel() && IsLinux() && isAsyncCommandQueueFeatureEnabled());
+    // http://anglebug.com/5383
+    ANGLE_SKIP_TEST_IF(IsLinux() && IsAMD() && IsDesktopOpenGL());
 
     runShouldDrawTest<OpaqueFdTraits>(isSwiftshader(), enableDebugLayers());
 }
@@ -1166,6 +1170,8 @@
 
     // http://issuetracker.google.com/173004081
     ANGLE_SKIP_TEST_IF(IsVulkan() && IsIntel() && IsLinux() && isAsyncCommandQueueFeatureEnabled());
+    // http://anglebug.com/5383
+    ANGLE_SKIP_TEST_IF(IsLinux() && IsAMD() && IsDesktopOpenGL());
 
     runWaitSemaphoresRetainsContentTest<OpaqueFdTraits>(isSwiftshader(), enableDebugLayers());
 }
diff --git a/src/tests/gl_tests/VulkanPerformanceCounterTest.cpp b/src/tests/gl_tests/VulkanPerformanceCounterTest.cpp
index 9b10faa..2f60d09 100644
--- a/src/tests/gl_tests/VulkanPerformanceCounterTest.cpp
+++ b/src/tests/gl_tests/VulkanPerformanceCounterTest.cpp
@@ -444,10 +444,12 @@
     EXPECT_EQ(counters.resolveImageCommands, 0u);
 
     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO);
-    EXPECT_PIXEL_NEAR(0, 0, 0, 0, 0, 255, 1.0);                      // Black
-    EXPECT_PIXEL_NEAR(kSize - 1, 1, 239, 0, 0, 255, 1.0);            // Red
-    EXPECT_PIXEL_NEAR(0, kSize - 1, 0, 239, 0, 255, 1.0);            // Green
-    EXPECT_PIXEL_NEAR(kSize - 1, kSize - 1, 239, 239, 0, 255, 1.0);  // Yellow
+    constexpr uint8_t kHalfPixelGradient = 256 / kSize / 2;
+    EXPECT_PIXEL_NEAR(0, 0, kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
+    EXPECT_PIXEL_NEAR(kSize - 1, 0, 255 - kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
+    EXPECT_PIXEL_NEAR(0, kSize - 1, kHalfPixelGradient, 255 - kHalfPixelGradient, 0, 255, 1.0);
+    EXPECT_PIXEL_NEAR(kSize - 1, kSize - 1, 255 - kHalfPixelGradient, 255 - kHalfPixelGradient, 0,
+                      255, 1.0);
 }
 
 // Ensures a read-only depth-stencil feedback loop works in a single RenderPass.
@@ -2083,6 +2085,8 @@
 {
     // http://anglebug.com/5083
     ANGLE_SKIP_TEST_IF(IsWindows() && IsAMD() && IsVulkan());
+    // http://anglebug.com/5380
+    ANGLE_SKIP_TEST_IF(IsLinux() && IsAMD() && IsVulkan());
 
     // http://crbug.com/1134286
     ANGLE_SKIP_TEST_IF(IsWindows7() && IsNVIDIA() && IsVulkan());
diff --git a/src/tests/gl_tests/WebGLCompatibilityTest.cpp b/src/tests/gl_tests/WebGLCompatibilityTest.cpp
index 4270eb3..e35d348 100644
--- a/src/tests/gl_tests/WebGLCompatibilityTest.cpp
+++ b/src/tests/gl_tests/WebGLCompatibilityTest.cpp
@@ -3234,9 +3234,6 @@
 
 TEST_P(WebGLCompatibilityTest, RGB32FTextures)
 {
-    // TODO(syoussefi): Missing format support.  http://anglebug.com/2898
-    ANGLE_SKIP_TEST_IF(IsVulkan());
-
     constexpr float data[] = {1000.0f, -500.0f, 10.0f, 1.0f};
 
     for (auto extension : FloatingPointTextureExtensions)
@@ -3271,8 +3268,8 @@
 
 TEST_P(WebGLCompatibilityTest, RGBA32FTextures)
 {
-    // TODO(syoussefi): Missing format support.  http://anglebug.com/2898
-    ANGLE_SKIP_TEST_IF(IsVulkan());
+    // http://anglebug.com/5357
+    ANGLE_SKIP_TEST_IF(IsOpenGL() && IsOSX());
 
     constexpr float data[] = {7000.0f, 100.0f, 33.0f, -1.0f};
 
@@ -3591,6 +3588,9 @@
 
 TEST_P(WebGLCompatibilityTest, R16FTextures)
 {
+    // http://anglebug.com/5357
+    ANGLE_SKIP_TEST_IF(IsOpenGL() && IsOSX());
+
     constexpr float readPixelsData[] = {-5000.0f, 0.0f, 0.0f, 1.0f};
     const GLushort textureData[]     = {
         gl::float32ToFloat16(readPixelsData[0]), gl::float32ToFloat16(readPixelsData[1]),
@@ -3648,6 +3648,9 @@
 
 TEST_P(WebGLCompatibilityTest, RG16FTextures)
 {
+    // http://anglebug.com/5357
+    ANGLE_SKIP_TEST_IF(IsOpenGL() && IsOSX());
+
     constexpr float readPixelsData[] = {7108.0f, -10.0f, 0.0f, 1.0f};
     const GLushort textureData[]     = {
         gl::float32ToFloat16(readPixelsData[0]), gl::float32ToFloat16(readPixelsData[1]),
@@ -3705,8 +3708,8 @@
 
 TEST_P(WebGLCompatibilityTest, RGB16FTextures)
 {
-    // TODO(syoussefi): Missing format support.  http://anglebug.com/2898
-    ANGLE_SKIP_TEST_IF(IsVulkan());
+    // http://anglebug.com/5357
+    ANGLE_SKIP_TEST_IF(IsOpenGL() && IsOSX());
 
     ANGLE_SKIP_TEST_IF(IsOzone() && IsIntel());
 
@@ -3767,6 +3770,9 @@
 
 TEST_P(WebGLCompatibilityTest, RGBA16FTextures)
 {
+    // http://anglebug.com/5357
+    ANGLE_SKIP_TEST_IF(IsOpenGL() && IsOSX());
+
     ANGLE_SKIP_TEST_IF(IsOzone() && IsIntel());
 
     constexpr float readPixelsData[] = {7000.0f, 100.0f, 33.0f, -1.0f};
diff --git a/src/tests/gl_tests/gles1/FramebufferObjectTest.cpp b/src/tests/gl_tests/gles1/FramebufferObjectTest.cpp
new file mode 100644
index 0000000..abe285b
--- /dev/null
+++ b/src/tests/gl_tests/gles1/FramebufferObjectTest.cpp
@@ -0,0 +1,121 @@
+//
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// FramebufferObjectTest.cpp: Tests basic usage of OES_framebuffer_object extension.
+
+#include "test_utils/ANGLETest.h"
+#include "test_utils/gl_raii.h"
+
+using namespace angle;
+
+class FramebufferObjectTest : public ANGLETest
+{
+  protected:
+    FramebufferObjectTest()
+    {
+        setWindowWidth(32);
+        setWindowHeight(32);
+        setConfigRedBits(8);
+        setConfigGreenBits(8);
+        setConfigBlueBits(8);
+        setConfigAlphaBits(8);
+        setConfigDepthBits(24);
+    }
+
+    void testSetUp() override
+    {
+        mTexture.reset(new GLTexture());
+        glEnable(GL_TEXTURE_2D);
+        glBindTexture(GL_TEXTURE_2D, mTexture->get());
+    }
+
+    void testTearDown() override { mTexture.reset(); }
+
+    std::unique_ptr<GLTexture> mTexture;
+};
+
+// Checks that framebuffer object can be used without GL errors.
+TEST_P(FramebufferObjectTest, FramebufferObject)
+{
+    GLuint fboId;
+    GLint params;
+
+    glGenFramebuffersOES(1, &fboId);
+    EXPECT_GL_NO_ERROR();
+    glIsFramebufferOES(fboId);
+    EXPECT_GL_NO_ERROR();
+    glBindFramebufferOES(GL_FRAMEBUFFER, fboId);
+    EXPECT_GL_NO_ERROR();
+
+    glCheckFramebufferStatusOES(GL_FRAMEBUFFER);
+    EXPECT_GL_NO_ERROR();
+    glGetFramebufferAttachmentParameterivOES(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
+                                             GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &params);
+    EXPECT_GL_NO_ERROR();
+
+    glBindFramebuffer(GL_FRAMEBUFFER, 0);
+    glDeleteFramebuffersOES(1, &fboId);
+    EXPECT_GL_NO_ERROR();
+}
+
+// Checks that texture object can be bound for framebuffer object.
+TEST_P(FramebufferObjectTest, TextureObject)
+{
+    GLuint fboId;
+
+    glGenFramebuffers(1, &fboId);
+    glBindFramebuffer(GL_FRAMEBUFFER, fboId);
+    glFramebufferTexture2DOES(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTexture->get(),
+                              0);
+    EXPECT_GL_NO_ERROR();
+
+    glBindFramebuffer(GL_FRAMEBUFFER, 0);
+    glDeleteFramebuffers(1, &fboId);
+}
+
+// Checks that renderbuffer object can be used and can be bound for framebuffer object.
+TEST_P(FramebufferObjectTest, RenderbufferObject)
+{
+    GLuint fboId;
+    GLuint rboId;
+    GLint params;
+
+    glGenFramebuffers(1, &fboId);
+    glBindFramebuffer(GL_FRAMEBUFFER, fboId);
+
+    glGenRenderbuffersOES(1, &rboId);
+    EXPECT_GL_NO_ERROR();
+    glIsRenderbufferOES(rboId);
+    EXPECT_GL_NO_ERROR();
+    glBindRenderbufferOES(GL_RENDERBUFFER, rboId);
+    EXPECT_GL_NO_ERROR();
+    glRenderbufferStorageOES(GL_RENDERBUFFER, GL_RGBA8, 32, 32);
+    EXPECT_GL_NO_ERROR();
+
+    glFramebufferRenderbufferOES(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rboId);
+    EXPECT_GL_NO_ERROR();
+    glGetRenderbufferParameterivOES(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &params);
+    EXPECT_GL_NO_ERROR();
+
+    glBindFramebuffer(GL_FRAMEBUFFER, 0);
+    glDeleteFramebuffers(1, &fboId);
+    glDeleteRenderbuffersOES(1, &rboId);
+    EXPECT_GL_NO_ERROR();
+}
+
+// Checks that generateMipmap can be called without GL errors.
+TEST_P(FramebufferObjectTest, GenerateMipmap)
+{
+    constexpr uint32_t kSize = 32;
+    std::vector<unsigned char> pixelData(kSize * kSize * 4, 0);
+
+    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixelData.data());
+
+    glGenerateMipmapOES(GL_TEXTURE_2D);
+    EXPECT_GL_NO_ERROR();
+}
+
+ANGLE_INSTANTIATE_TEST_ES1(FramebufferObjectTest);
\ No newline at end of file
diff --git a/src/tests/perf_tests/MultisampledRenderToTexturePerf.cpp b/src/tests/perf_tests/MultisampledRenderToTexturePerf.cpp
index bcc1440..64e53c3 100644
--- a/src/tests/perf_tests/MultisampledRenderToTexturePerf.cpp
+++ b/src/tests/perf_tests/MultisampledRenderToTexturePerf.cpp
@@ -112,6 +112,14 @@
     {
         mSkipTest = true;
     }
+
+    // http://anglebug.com/5380
+    if (IsLinux() && IsAMD() &&
+        GetParam().eglParameters.renderer == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE &&
+        GetParam().multiplePasses && GetParam().withDepthStencil)
+    {
+        mSkipTest = true;
+    }
 }
 
 void MultisampledRenderToTextureBenchmark::initializeBenchmark()
diff --git a/src/tests/restricted_traces/.gitignore b/src/tests/restricted_traces/.gitignore
index be72bcd..1a7fb7a 100644
--- a/src/tests/restricted_traces/.gitignore
+++ b/src/tests/restricted_traces/.gitignore
@@ -40,5 +40,7 @@
 temple_run_300/
 trex_200.tar.gz
 trex_200/
+whatsapp.tar.gz
+whatsapp/
 world_of_tanks_blitz.tar.gz
 world_of_tanks_blitz/
\ No newline at end of file
diff --git a/src/tests/restricted_traces/restricted_traces.json b/src/tests/restricted_traces/restricted_traces.json
index 998df59..6b72308 100644
--- a/src/tests/restricted_traces/restricted_traces.json
+++ b/src/tests/restricted_traces/restricted_traces.json
@@ -28,6 +28,7 @@
     "real_commando_secret_mission",
     "temple_run_300",
     "trex_200",
+    "whatsapp",
     "world_of_tanks_blitz"
   ]
 }
diff --git a/src/tests/restricted_traces/restricted_traces_autogen.cpp b/src/tests/restricted_traces/restricted_traces_autogen.cpp
index d6bf930..f42eeb9 100644
--- a/src/tests/restricted_traces/restricted_traces_autogen.cpp
+++ b/src/tests/restricted_traces/restricted_traces_autogen.cpp
@@ -32,6 +32,7 @@
 #include "real_commando_secret_mission/real_commando_secret_mission_capture_context1.h"
 #include "temple_run_300/temple_run_300_capture_context1.h"
 #include "trex_200/trex_200_capture_context1.h"
+#include "whatsapp/whatsapp_capture_context1.h"
 #include "world_of_tanks_blitz/world_of_tanks_blitz_capture_context1.h"
 
 namespace angle
@@ -116,6 +117,9 @@
     {RestrictedTraceID::trex_200,
      {trex_200::kReplayFrameStart, trex_200::kReplayFrameEnd, trex_200::kReplayDrawSurfaceWidth,
       trex_200::kReplayDrawSurfaceHeight, "trex_200"}},
+    {RestrictedTraceID::whatsapp,
+     {whatsapp::kReplayFrameStart, whatsapp::kReplayFrameEnd, whatsapp::kReplayDrawSurfaceWidth,
+      whatsapp::kReplayDrawSurfaceHeight, "whatsapp"}},
     {RestrictedTraceID::world_of_tanks_blitz,
      {world_of_tanks_blitz::kReplayFrameStart, world_of_tanks_blitz::kReplayFrameEnd,
       world_of_tanks_blitz::kReplayDrawSurfaceWidth, world_of_tanks_blitz::kReplayDrawSurfaceHeight,
@@ -194,6 +198,9 @@
         case RestrictedTraceID::trex_200:
             trex_200::ReplayContext1Frame(frameIndex);
             break;
+        case RestrictedTraceID::whatsapp:
+            whatsapp::ReplayContext1Frame(frameIndex);
+            break;
         case RestrictedTraceID::world_of_tanks_blitz:
             world_of_tanks_blitz::ReplayContext1Frame(frameIndex);
             break;
@@ -271,6 +278,9 @@
         case RestrictedTraceID::trex_200:
             trex_200::ResetContext1Replay();
             break;
+        case RestrictedTraceID::whatsapp:
+            whatsapp::ResetContext1Replay();
+            break;
         case RestrictedTraceID::world_of_tanks_blitz:
             world_of_tanks_blitz::ResetContext1Replay();
             break;
@@ -348,6 +358,9 @@
         case RestrictedTraceID::trex_200:
             trex_200::SetupContext1Replay();
             break;
+        case RestrictedTraceID::whatsapp:
+            whatsapp::SetupContext1Replay();
+            break;
         case RestrictedTraceID::world_of_tanks_blitz:
             world_of_tanks_blitz::SetupContext1Replay();
             break;
@@ -425,6 +438,9 @@
         case RestrictedTraceID::trex_200:
             trex_200::SetBinaryDataDir(dataDir);
             break;
+        case RestrictedTraceID::whatsapp:
+            whatsapp::SetBinaryDataDir(dataDir);
+            break;
         case RestrictedTraceID::world_of_tanks_blitz:
             world_of_tanks_blitz::SetBinaryDataDir(dataDir);
             break;
@@ -502,6 +518,9 @@
         case RestrictedTraceID::trex_200:
             trex_200::SetBinaryDataDecompressCallback(callback);
             break;
+        case RestrictedTraceID::whatsapp:
+            whatsapp::SetBinaryDataDecompressCallback(callback);
+            break;
         case RestrictedTraceID::world_of_tanks_blitz:
             world_of_tanks_blitz::SetBinaryDataDecompressCallback(callback);
             break;
diff --git a/src/tests/restricted_traces/restricted_traces_autogen.gni b/src/tests/restricted_traces/restricted_traces_autogen.gni
index f64ee38..23f02a0 100644
--- a/src/tests/restricted_traces/restricted_traces_autogen.gni
+++ b/src/tests/restricted_traces/restricted_traces_autogen.gni
@@ -30,5 +30,6 @@
   "real_commando_secret_mission 1",
   "temple_run_300 1",
   "trex_200 1",
+  "whatsapp 1",
   "world_of_tanks_blitz 1",
 ]
diff --git a/src/tests/restricted_traces/restricted_traces_autogen.h b/src/tests/restricted_traces/restricted_traces_autogen.h
index 74cc87c..285c845 100644
--- a/src/tests/restricted_traces/restricted_traces_autogen.h
+++ b/src/tests/restricted_traces/restricted_traces_autogen.h
@@ -75,6 +75,7 @@
     real_commando_secret_mission,
     temple_run_300,
     trex_200,
+    whatsapp,
     world_of_tanks_blitz,
     InvalidEnum,
     EnumCount = InvalidEnum
diff --git a/src/tests/restricted_traces/trace_gles_loader_autogen.cpp b/src/tests/restricted_traces/trace_gles_loader_autogen.cpp
index a57f1bb..b231446 100644
--- a/src/tests/restricted_traces/trace_gles_loader_autogen.cpp
+++ b/src/tests/restricted_traces/trace_gles_loader_autogen.cpp
@@ -559,6 +559,8 @@
     t_glGetProgramResourceLocationIndexEXT;
 ANGLE_TRACE_LOADER_EXPORT PFNGLBUFFERSTORAGEEXTPROC t_glBufferStorageEXT;
 ANGLE_TRACE_LOADER_EXPORT PFNGLCOPYIMAGESUBDATAEXTPROC t_glCopyImageSubDataEXT;
+ANGLE_TRACE_LOADER_EXPORT PFNGLGETOBJECTLABELEXTPROC t_glGetObjectLabelEXT;
+ANGLE_TRACE_LOADER_EXPORT PFNGLLABELOBJECTEXTPROC t_glLabelObjectEXT;
 ANGLE_TRACE_LOADER_EXPORT PFNGLINSERTEVENTMARKEREXTPROC t_glInsertEventMarkerEXT;
 ANGLE_TRACE_LOADER_EXPORT PFNGLPOPGROUPMARKEREXTPROC t_glPopGroupMarkerEXT;
 ANGLE_TRACE_LOADER_EXPORT PFNGLPUSHGROUPMARKEREXTPROC t_glPushGroupMarkerEXT;
@@ -1506,6 +1508,8 @@
 ANGLE_TRACE_LOADER_EXPORT PFNGLBUFFERSTORAGEEXTCONTEXTANGLEPROC t_glBufferStorageEXTContextANGLE;
 ANGLE_TRACE_LOADER_EXPORT PFNGLCOPYIMAGESUBDATAEXTCONTEXTANGLEPROC
     t_glCopyImageSubDataEXTContextANGLE;
+ANGLE_TRACE_LOADER_EXPORT PFNGLGETOBJECTLABELEXTCONTEXTANGLEPROC t_glGetObjectLabelEXTContextANGLE;
+ANGLE_TRACE_LOADER_EXPORT PFNGLLABELOBJECTEXTCONTEXTANGLEPROC t_glLabelObjectEXTContextANGLE;
 ANGLE_TRACE_LOADER_EXPORT PFNGLINSERTEVENTMARKEREXTCONTEXTANGLEPROC
     t_glInsertEventMarkerEXTContextANGLE;
 ANGLE_TRACE_LOADER_EXPORT PFNGLPOPGROUPMARKEREXTCONTEXTANGLEPROC t_glPopGroupMarkerEXTContextANGLE;
@@ -2673,6 +2677,9 @@
         reinterpret_cast<PFNGLBUFFERSTORAGEEXTPROC>(loadProc("glBufferStorageEXT"));
     t_glCopyImageSubDataEXT =
         reinterpret_cast<PFNGLCOPYIMAGESUBDATAEXTPROC>(loadProc("glCopyImageSubDataEXT"));
+    t_glGetObjectLabelEXT =
+        reinterpret_cast<PFNGLGETOBJECTLABELEXTPROC>(loadProc("glGetObjectLabelEXT"));
+    t_glLabelObjectEXT = reinterpret_cast<PFNGLLABELOBJECTEXTPROC>(loadProc("glLabelObjectEXT"));
     t_glInsertEventMarkerEXT =
         reinterpret_cast<PFNGLINSERTEVENTMARKEREXTPROC>(loadProc("glInsertEventMarkerEXT"));
     t_glPopGroupMarkerEXT =
@@ -4263,6 +4270,10 @@
     t_glCopyImageSubDataEXTContextANGLE =
         reinterpret_cast<PFNGLCOPYIMAGESUBDATAEXTCONTEXTANGLEPROC>(
             loadProc("glCopyImageSubDataEXTContextANGLE"));
+    t_glGetObjectLabelEXTContextANGLE = reinterpret_cast<PFNGLGETOBJECTLABELEXTCONTEXTANGLEPROC>(
+        loadProc("glGetObjectLabelEXTContextANGLE"));
+    t_glLabelObjectEXTContextANGLE = reinterpret_cast<PFNGLLABELOBJECTEXTCONTEXTANGLEPROC>(
+        loadProc("glLabelObjectEXTContextANGLE"));
     t_glInsertEventMarkerEXTContextANGLE =
         reinterpret_cast<PFNGLINSERTEVENTMARKEREXTCONTEXTANGLEPROC>(
             loadProc("glInsertEventMarkerEXTContextANGLE"));
diff --git a/src/tests/restricted_traces/trace_gles_loader_autogen.h b/src/tests/restricted_traces/trace_gles_loader_autogen.h
index 471a594..8a2e7c3 100644
--- a/src/tests/restricted_traces/trace_gles_loader_autogen.h
+++ b/src/tests/restricted_traces/trace_gles_loader_autogen.h
@@ -531,6 +531,8 @@
 #define glGetProgramResourceLocationIndexEXT t_glGetProgramResourceLocationIndexEXT
 #define glBufferStorageEXT t_glBufferStorageEXT
 #define glCopyImageSubDataEXT t_glCopyImageSubDataEXT
+#define glGetObjectLabelEXT t_glGetObjectLabelEXT
+#define glLabelObjectEXT t_glLabelObjectEXT
 #define glInsertEventMarkerEXT t_glInsertEventMarkerEXT
 #define glPopGroupMarkerEXT t_glPopGroupMarkerEXT
 #define glPushGroupMarkerEXT t_glPushGroupMarkerEXT
@@ -1285,6 +1287,8 @@
     t_glGetProgramResourceLocationIndexEXTContextANGLE
 #define glBufferStorageEXTContextANGLE t_glBufferStorageEXTContextANGLE
 #define glCopyImageSubDataEXTContextANGLE t_glCopyImageSubDataEXTContextANGLE
+#define glGetObjectLabelEXTContextANGLE t_glGetObjectLabelEXTContextANGLE
+#define glLabelObjectEXTContextANGLE t_glLabelObjectEXTContextANGLE
 #define glInsertEventMarkerEXTContextANGLE t_glInsertEventMarkerEXTContextANGLE
 #define glPopGroupMarkerEXTContextANGLE t_glPopGroupMarkerEXTContextANGLE
 #define glPushGroupMarkerEXTContextANGLE t_glPushGroupMarkerEXTContextANGLE
@@ -2076,6 +2080,8 @@
     t_glGetProgramResourceLocationIndexEXT;
 ANGLE_TRACE_LOADER_EXPORT extern PFNGLBUFFERSTORAGEEXTPROC t_glBufferStorageEXT;
 ANGLE_TRACE_LOADER_EXPORT extern PFNGLCOPYIMAGESUBDATAEXTPROC t_glCopyImageSubDataEXT;
+ANGLE_TRACE_LOADER_EXPORT extern PFNGLGETOBJECTLABELEXTPROC t_glGetObjectLabelEXT;
+ANGLE_TRACE_LOADER_EXPORT extern PFNGLLABELOBJECTEXTPROC t_glLabelObjectEXT;
 ANGLE_TRACE_LOADER_EXPORT extern PFNGLINSERTEVENTMARKEREXTPROC t_glInsertEventMarkerEXT;
 ANGLE_TRACE_LOADER_EXPORT extern PFNGLPOPGROUPMARKEREXTPROC t_glPopGroupMarkerEXT;
 ANGLE_TRACE_LOADER_EXPORT extern PFNGLPUSHGROUPMARKEREXTPROC t_glPushGroupMarkerEXT;
@@ -3120,6 +3126,9 @@
     t_glBufferStorageEXTContextANGLE;
 ANGLE_TRACE_LOADER_EXPORT extern PFNGLCOPYIMAGESUBDATAEXTCONTEXTANGLEPROC
     t_glCopyImageSubDataEXTContextANGLE;
+ANGLE_TRACE_LOADER_EXPORT extern PFNGLGETOBJECTLABELEXTCONTEXTANGLEPROC
+    t_glGetObjectLabelEXTContextANGLE;
+ANGLE_TRACE_LOADER_EXPORT extern PFNGLLABELOBJECTEXTCONTEXTANGLEPROC t_glLabelObjectEXTContextANGLE;
 ANGLE_TRACE_LOADER_EXPORT extern PFNGLINSERTEVENTMARKEREXTCONTEXTANGLEPROC
     t_glInsertEventMarkerEXTContextANGLE;
 ANGLE_TRACE_LOADER_EXPORT extern PFNGLPOPGROUPMARKEREXTCONTEXTANGLEPROC
diff --git a/src/tests/restricted_traces/whatsapp.tar.gz.sha1 b/src/tests/restricted_traces/whatsapp.tar.gz.sha1
new file mode 100644
index 0000000..c7ceee4
--- /dev/null
+++ b/src/tests/restricted_traces/whatsapp.tar.gz.sha1
@@ -0,0 +1 @@
+b4d1bd0b08bb07e18693e1157f8b02bf168c0a2a
\ No newline at end of file
diff --git a/src/tests/test_utils/angle_test_configs.cpp b/src/tests/test_utils/angle_test_configs.cpp
index fe573b5..14e2b72 100644
--- a/src/tests/test_utils/angle_test_configs.cpp
+++ b/src/tests/test_utils/angle_test_configs.cpp
@@ -795,6 +795,21 @@
     return PlatformParameters(3, 1, egl_platform::VULKAN_SWIFTSHADER());
 }
 
+PlatformParameters ES32_VULKAN()
+{
+    return PlatformParameters(3, 2, egl_platform::VULKAN());
+}
+
+PlatformParameters ES32_VULKAN_NULL()
+{
+    return PlatformParameters(3, 2, egl_platform::VULKAN_NULL());
+}
+
+PlatformParameters ES32_VULKAN_SWIFTSHADER()
+{
+    return PlatformParameters(3, 2, egl_platform::VULKAN_SWIFTSHADER());
+}
+
 PlatformParameters ES1_METAL()
 {
     return PlatformParameters(1, 0, egl_platform::METAL());
diff --git a/src/tests/test_utils/angle_test_configs.h b/src/tests/test_utils/angle_test_configs.h
index dfe2870..40c55e7 100644
--- a/src/tests/test_utils/angle_test_configs.h
+++ b/src/tests/test_utils/angle_test_configs.h
@@ -178,6 +178,9 @@
 PlatformParameters ES31_VULKAN();
 PlatformParameters ES31_VULKAN_NULL();
 PlatformParameters ES31_VULKAN_SWIFTSHADER();
+PlatformParameters ES32_VULKAN();
+PlatformParameters ES32_VULKAN_NULL();
+PlatformParameters ES32_VULKAN_SWIFTSHADER();
 
 PlatformParameters ES1_METAL();
 PlatformParameters ES2_METAL();
diff --git a/src/tests/test_utils/angle_test_instantiate.h b/src/tests/test_utils/angle_test_instantiate.h
index 8b2e1a0..95d68b0 100644
--- a/src/tests/test_utils/angle_test_instantiate.h
+++ b/src/tests/test_utils/angle_test_instantiate.h
@@ -148,6 +148,9 @@
     ES31_D3D11(), ES31_OPENGL(), ES31_OPENGLES(), ES31_VULKAN(), ES31_VULKAN_SWIFTSHADER(), \
         WithAsyncCommandQueueFeatureVulkan(ES31_VULKAN())
 
+#define ANGLE_ALL_TEST_PLATFORMS_ES32 \
+    ES32_VULKAN(), WithAsyncCommandQueueFeatureVulkan(ES32_VULKAN())
+
 #define ANGLE_ALL_TEST_PLATFORMS_NULL ES2_NULL(), ES3_NULL(), ES31_NULL()
 
 // Instantiate the test once for each GLES1 platform
@@ -184,6 +187,17 @@
     INSTANTIATE_TEST_SUITE_P(, testName, ANGLE_INSTANTIATE_TEST_PLATFORMS(testName),            \
                              testing::PrintToStringParamName())
 
+// Instantiate the test once for each GLES32 platform
+#define ANGLE_INSTANTIATE_TEST_ES32(testName)                                        \
+    const PlatformParameters testName##params[] = {ANGLE_ALL_TEST_PLATFORMS_ES32};   \
+    INSTANTIATE_TEST_SUITE_P(, testName, ANGLE_INSTANTIATE_TEST_PLATFORMS(testName), \
+                             testing::PrintToStringParamName())
+
+#define ANGLE_INSTANTIATE_TEST_ES32_AND(testName, ...)                                          \
+    const PlatformParameters testName##params[] = {ANGLE_ALL_TEST_PLATFORMS_ES32, __VA_ARGS__}; \
+    INSTANTIATE_TEST_SUITE_P(, testName, ANGLE_INSTANTIATE_TEST_PLATFORMS(testName),            \
+                             testing::PrintToStringParamName())
+
 // Multiple ES Version macros
 #define ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(testName)                                 \
     const PlatformParameters testName##params[] = {ANGLE_ALL_TEST_PLATFORMS_ES2,     \
diff --git a/src/tests/test_utils/gl_raii.h b/src/tests/test_utils/gl_raii.h
index 77d8c53..a587089 100644
--- a/src/tests/test_utils/gl_raii.h
+++ b/src/tests/test_utils/gl_raii.h
@@ -133,6 +133,7 @@
   public:
     GLQueryEXT() : GLWrapper(&glGenQueriesEXT, &glDeleteQueriesEXT) {}
 };
+using GLQuery = GLQueryEXT;
 
 class GLShader : angle::NonCopyable
 {
diff --git a/src/tests/test_utils/runner/TestSuite.cpp b/src/tests/test_utils/runner/TestSuite.cpp
index 155916e..bfb3185 100644
--- a/src/tests/test_utils/runner/TestSuite.cpp
+++ b/src/tests/test_utils/runner/TestSuite.cpp
@@ -258,16 +258,14 @@
 
         actualResult += ResultTypeToString(result.type);
 
-        std::string expectedResult;
-        if (result.flakyFailures > 0)
+        std::string expectedResult = "PASS";
+
+        // Handle flaky passing tests.
+        if (result.flakyFailures > 0 && result.type == TestResultType::Pass)
         {
             expectedResult = "FAIL PASS";
             jsResult.AddMember("is_flaky", true, allocator);
         }
-        else
-        {
-            expectedResult = "PASS";
-        }
 
         jsResult.AddMember("actual", actualResult, allocator);
         jsResult.AddMember("expected", expectedResult, allocator);
@@ -659,6 +657,8 @@
             if (inputResult.type != TestResultType::Pass &&
                 runCount < static_cast<uint32_t>(flakyRetries))
             {
+                printf("Retrying flaky test: %s.%s.\n", id.testSuiteName.c_str(),
+                       id.testName.c_str());
                 inputResult.type = TestResultType::NoResult;
                 outputResult.flakyFailures++;
             }
@@ -742,7 +742,7 @@
 TestQueue BatchTests(const std::vector<TestIdentifier> &tests, int batchSize)
 {
     // First sort tests by configuration.
-    std::unordered_map<std::string, std::vector<TestIdentifier>> testsSortedByConfig;
+    angle::HashMap<std::string, std::vector<TestIdentifier>> testsSortedByConfig;
     for (const TestIdentifier &id : tests)
     {
         std::string config = GetConfigNameFromTestIdentifier(id);
diff --git a/third_party/abseil-cpp/CMake/AbseilDll.cmake b/third_party/abseil-cpp/CMake/AbseilDll.cmake
index e0ff249..68e28c2 100644
--- a/third_party/abseil-cpp/CMake/AbseilDll.cmake
+++ b/third_party/abseil-cpp/CMake/AbseilDll.cmake
@@ -122,6 +122,8 @@
   "hash/internal/hash.h"
   "hash/internal/hash.cc"
   "hash/internal/spy_hash_state.h"
+  "hash/internal/wyhash.h"
+  "hash/internal/wyhash.cc"
   "memory/memory.h"
   "meta/type_traits.h"
   "numeric/int128.cc"
@@ -191,6 +193,7 @@
   "strings/escaping.cc"
   "strings/escaping.h"
   "strings/internal/cord_internal.h"
+  "strings/internal/cord_rep_flat.h"
   "strings/internal/charconv_bigint.cc"
   "strings/internal/charconv_bigint.h"
   "strings/internal/charconv_parse.cc"
diff --git a/third_party/abseil-cpp/CMake/AbseilHelpers.cmake b/third_party/abseil-cpp/CMake/AbseilHelpers.cmake
index e85deba..e88507d 100644
--- a/third_party/abseil-cpp/CMake/AbseilHelpers.cmake
+++ b/third_party/abseil-cpp/CMake/AbseilHelpers.cmake
@@ -260,6 +260,8 @@
     if(ABSL_ENABLE_INSTALL)
       set_target_properties(${_NAME} PROPERTIES
         OUTPUT_NAME "absl_${_NAME}"
+        # TODO(b/173696973): Figure out how to set SOVERSION for LTS releases.
+        SOVERSION 0
       )
     endif()
   else()
diff --git a/third_party/abseil-cpp/DIR_METADATA b/third_party/abseil-cpp/DIR_METADATA
new file mode 100644
index 0000000..2aaf8e2
--- /dev/null
+++ b/third_party/abseil-cpp/DIR_METADATA
@@ -0,0 +1,3 @@
+monorail {
+  component: "Internals>Core"
+}
diff --git a/third_party/abseil-cpp/README.chromium b/third_party/abseil-cpp/README.chromium
index dbfbd38..77303d8 100644
--- a/third_party/abseil-cpp/README.chromium
+++ b/third_party/abseil-cpp/README.chromium
@@ -4,7 +4,7 @@
 License: Apache 2.0
 License File: LICENSE
 Version: 0
-Revision: 4ae6730677ea3c2984f8bb0e4919bd0d9dd04f73
+Revision: fbdff6f3ae0ba977a69f172e85ecaede535e70f6
 Security Critical: yes
 
 Description:
diff --git a/third_party/abseil-cpp/WORKSPACE b/third_party/abseil-cpp/WORKSPACE
index ed90d2b..258d23b 100644
--- a/third_party/abseil-cpp/WORKSPACE
+++ b/third_party/abseil-cpp/WORKSPACE
@@ -29,9 +29,9 @@
 # Google benchmark.
 http_archive(
     name = "com_github_google_benchmark",
-    urls = ["https://github.com/google/benchmark/archive/16703ff83c1ae6d53e5155df3bb3ab0bc96083be.zip"],
-    strip_prefix = "benchmark-16703ff83c1ae6d53e5155df3bb3ab0bc96083be",
-    sha256 = "59f918c8ccd4d74b6ac43484467b500f1d64b40cc1010daa055375b322a43ba3",
+    urls = ["https://github.com/google/benchmark/archive/bf585a2789e30585b4e3ce6baf11ef2750b54677.zip"],  # 2020-11-26T11:14:03Z
+    strip_prefix = "benchmark-bf585a2789e30585b4e3ce6baf11ef2750b54677",
+    sha256 = "2a778d821997df7d8646c9c59b8edb9a573a6e04c534c01892a40aa524a7b68c",
 )
 
 # C++ rules for Bazel.
diff --git a/third_party/abseil-cpp/absl/base/call_once.h b/third_party/abseil-cpp/absl/base/call_once.h
index 5b468af..96109f5 100644
--- a/third_party/abseil-cpp/absl/base/call_once.h
+++ b/third_party/abseil-cpp/absl/base/call_once.h
@@ -177,15 +177,8 @@
                                   scheduling_mode) == kOnceInit) {
     base_internal::invoke(std::forward<Callable>(fn),
                           std::forward<Args>(args)...);
-    // The call to SpinLockWake below is an optimization, because the waiter
-    // in SpinLockWait is waiting with a short timeout. The atomic load/store
-    // sequence is slightly faster than an atomic exchange:
-    //   old_control = control->exchange(base_internal::kOnceDone,
-    //                                   std::memory_order_release);
-    // We opt for a slightly faster case when there are no waiters, in spite
-    // of longer tail latency when there are waiters.
-    old_control = control->load(std::memory_order_relaxed);
-    control->store(base_internal::kOnceDone, std::memory_order_release);
+    old_control =
+        control->exchange(base_internal::kOnceDone, std::memory_order_release);
     if (old_control == base_internal::kOnceWaiter) {
       base_internal::SpinLockWake(control, true);
     }
diff --git a/third_party/abseil-cpp/absl/base/internal/spinlock.h b/third_party/abseil-cpp/absl/base/internal/spinlock.h
index e6ac9e6..dce1c85 100644
--- a/third_party/abseil-cpp/absl/base/internal/spinlock.h
+++ b/third_party/abseil-cpp/absl/base/internal/spinlock.h
@@ -15,11 +15,8 @@
 //
 
 //  Most users requiring mutual exclusion should use Mutex.
-//  SpinLock is provided for use in three situations:
+//  SpinLock is provided for use in two situations:
 //   - for use in code that Mutex itself depends on
-//   - to get a faster fast-path release under low contention (without an
-//     atomic read-modify-write) In return, SpinLock has worse behaviour under
-//     contention, which is why Mutex is preferred in most situations.
 //   - for async signal safety (see below)
 
 // SpinLock is async signal safe.  If a spinlock is used within a signal
diff --git a/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h b/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h
index 169bc74..c34ce41 100644
--- a/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h
+++ b/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h
@@ -43,18 +43,16 @@
                       const SpinLockWaitTransition trans[],
                       SchedulingMode scheduling_mode);
 
-// If possible, wake some thread that has called SpinLockDelay(w, ...). If
-// "all" is true, wake all such threads.  This call is a hint, and on some
-// systems it may be a no-op; threads calling SpinLockDelay() will always wake
-// eventually even if SpinLockWake() is never called.
+// If possible, wake some thread that has called SpinLockDelay(w, ...). If `all`
+// is true, wake all such threads. On some systems, this may be a no-op; on
+// those systems, threads calling SpinLockDelay() will always wake eventually
+// even if SpinLockWake() is never called.
 void SpinLockWake(std::atomic<uint32_t> *w, bool all);
 
 // Wait for an appropriate spin delay on iteration "loop" of a
 // spin loop on location *w, whose previously observed value was "value".
 // SpinLockDelay() may do nothing, may yield the CPU, may sleep a clock tick,
-// or may wait for a delay that can be truncated by a call to SpinLockWake(w).
-// In all cases, it must return in bounded time even if SpinLockWake() is not
-// called.
+// or may wait for a call to SpinLockWake(w).
 void SpinLockDelay(std::atomic<uint32_t> *w, uint32_t value, int loop,
                    base_internal::SchedulingMode scheduling_mode);
 
diff --git a/third_party/abseil-cpp/absl/base/internal/unaligned_access.h b/third_party/abseil-cpp/absl/base/internal/unaligned_access.h
index 080c197..093dd9b 100644
--- a/third_party/abseil-cpp/absl/base/internal/unaligned_access.h
+++ b/third_party/abseil-cpp/absl/base/internal/unaligned_access.h
@@ -31,70 +31,6 @@
 // The unaligned API is C++ only.  The declarations use C++ features
 // (namespaces, inline) which are absent or incompatible in C.
 #if defined(__cplusplus)
-
-#if defined(ABSL_HAVE_ADDRESS_SANITIZER) || \
-    defined(ABSL_HAVE_THREAD_SANITIZER) || defined(ABSL_HAVE_MEMORY_SANITIZER)
-// Consider we have an unaligned load/store of 4 bytes from address 0x...05.
-// AddressSanitizer will treat it as a 3-byte access to the range 05:07 and
-// will miss a bug if 08 is the first unaddressable byte.
-// ThreadSanitizer will also treat this as a 3-byte access to 05:07 and will
-// miss a race between this access and some other accesses to 08.
-// MemorySanitizer will correctly propagate the shadow on unaligned stores
-// and correctly report bugs on unaligned loads, but it may not properly
-// update and report the origin of the uninitialized memory.
-// For all three tools, replacing an unaligned access with a tool-specific
-// callback solves the problem.
-
-#include <sanitizer/common_interface_defs.h>
-
-namespace absl {
-ABSL_NAMESPACE_BEGIN
-namespace base_internal {
-
-inline uint16_t UnalignedLoad16(const void *p) {
-  return __sanitizer_unaligned_load16(p);
-}
-
-inline uint32_t UnalignedLoad32(const void *p) {
-  return __sanitizer_unaligned_load32(p);
-}
-
-inline uint64_t UnalignedLoad64(const void *p) {
-  return __sanitizer_unaligned_load64(p);
-}
-
-inline void UnalignedStore16(void *p, uint16_t v) {
-  __sanitizer_unaligned_store16(p, v);
-}
-
-inline void UnalignedStore32(void *p, uint32_t v) {
-  __sanitizer_unaligned_store32(p, v);
-}
-
-inline void UnalignedStore64(void *p, uint64_t v) {
-  __sanitizer_unaligned_store64(p, v);
-}
-
-}  // namespace base_internal
-ABSL_NAMESPACE_END
-}  // namespace absl
-
-#define ABSL_INTERNAL_UNALIGNED_LOAD16(_p) \
-  (absl::base_internal::UnalignedLoad16(_p))
-#define ABSL_INTERNAL_UNALIGNED_LOAD32(_p) \
-  (absl::base_internal::UnalignedLoad32(_p))
-#define ABSL_INTERNAL_UNALIGNED_LOAD64(_p) \
-  (absl::base_internal::UnalignedLoad64(_p))
-
-#define ABSL_INTERNAL_UNALIGNED_STORE16(_p, _val) \
-  (absl::base_internal::UnalignedStore16(_p, _val))
-#define ABSL_INTERNAL_UNALIGNED_STORE32(_p, _val) \
-  (absl::base_internal::UnalignedStore32(_p, _val))
-#define ABSL_INTERNAL_UNALIGNED_STORE64(_p, _val) \
-  (absl::base_internal::UnalignedStore64(_p, _val))
-
-#else
-
 namespace absl {
 ABSL_NAMESPACE_BEGIN
 namespace base_internal {
@@ -141,8 +77,6 @@
 #define ABSL_INTERNAL_UNALIGNED_STORE64(_p, _val) \
   (absl::base_internal::UnalignedStore64(_p, _val))
 
-#endif
-
 #endif  // defined(__cplusplus), end of unaligned API
 
 #endif  // ABSL_BASE_INTERNAL_UNALIGNED_ACCESS_H_
diff --git a/third_party/abseil-cpp/absl/base/optimization.h b/third_party/abseil-cpp/absl/base/optimization.h
index 2e31376..393fc3a 100644
--- a/third_party/abseil-cpp/absl/base/optimization.h
+++ b/third_party/abseil-cpp/absl/base/optimization.h
@@ -179,7 +179,7 @@
 #endif
 
 // ABSL_INTERNAL_ASSUME(cond)
-// Informs the compiler than a condition is always true and that it can assume
+// Informs the compiler that a condition is always true and that it can assume
 // it to be true for optimization purposes. The call has undefined behavior if
 // the condition is false.
 // In !NDEBUG mode, the condition is checked with an assert().
diff --git a/third_party/abseil-cpp/absl/container/BUILD.bazel b/third_party/abseil-cpp/absl/container/BUILD.bazel
index 8e72ad0..7097714 100644
--- a/third_party/abseil-cpp/absl/container/BUILD.bazel
+++ b/third_party/abseil-cpp/absl/container/BUILD.bazel
@@ -630,6 +630,45 @@
     ],
 )
 
+cc_binary(
+    name = "raw_hash_set_benchmark",
+    testonly = 1,
+    srcs = ["internal/raw_hash_set_benchmark.cc"],
+    copts = ABSL_TEST_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    tags = ["benchmark"],
+    visibility = ["//visibility:private"],
+    deps = [
+        ":hash_function_defaults",
+        ":raw_hash_set",
+        "//absl/base:raw_logging_internal",
+        "//absl/strings:str_format",
+        "@com_github_google_benchmark//:benchmark_main",
+    ],
+)
+
+cc_binary(
+    name = "raw_hash_set_probe_benchmark",
+    testonly = 1,
+    srcs = ["internal/raw_hash_set_probe_benchmark.cc"],
+    copts = ABSL_TEST_COPTS,
+    linkopts = select({
+        "//conditions:default": [],
+    }) + ABSL_DEFAULT_LINKOPTS,
+    tags = ["benchmark"],
+    visibility = ["//visibility:private"],
+    deps = [
+        ":flat_hash_map",
+        ":hash_function_defaults",
+        ":hashtable_debug",
+        ":raw_hash_set",
+        "//absl/random",
+        "//absl/random:distributions",
+        "//absl/strings",
+        "//absl/strings:str_format",
+    ],
+)
+
 cc_test(
     name = "raw_hash_set_allocator_test",
     size = "small",
@@ -677,6 +716,22 @@
     ],
 )
 
+cc_binary(
+    name = "layout_benchmark",
+    testonly = 1,
+    srcs = ["internal/layout_benchmark.cc"],
+    copts = ABSL_TEST_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    tags = ["benchmark"],
+    visibility = ["//visibility:private"],
+    deps = [
+        ":layout",
+        "//absl/base:core_headers",
+        "//absl/base:raw_logging_internal",
+        "@com_github_google_benchmark//:benchmark_main",
+    ],
+)
+
 cc_library(
     name = "tracked",
     testonly = 1,
diff --git a/third_party/abseil-cpp/absl/container/internal/btree.h b/third_party/abseil-cpp/absl/container/internal/btree.h
index f2fc31d..dad580f 100644
--- a/third_party/abseil-cpp/absl/container/internal/btree.h
+++ b/third_party/abseil-cpp/absl/container/internal/btree.h
@@ -910,6 +910,7 @@
   using key_type = typename Node::key_type;
   using size_type = typename Node::size_type;
   using params_type = typename Node::params_type;
+  using is_map_container = typename params_type::is_map_container;
 
   using node_type = Node;
   using normal_node = typename std::remove_const<Node>::type;
@@ -921,7 +922,7 @@
   using slot_type = typename params_type::slot_type;
 
   using iterator =
-      btree_iterator<normal_node, normal_reference, normal_pointer>;
+     btree_iterator<normal_node, normal_reference, normal_pointer>;
   using const_iterator =
       btree_iterator<const_node, const_reference, const_pointer>;
 
@@ -938,20 +939,19 @@
   btree_iterator(Node *n, int p) : node(n), position(p) {}
 
   // NOTE: this SFINAE allows for implicit conversions from iterator to
-  // const_iterator, but it specifically avoids defining copy constructors so
-  // that btree_iterator can be trivially copyable. This is for performance and
-  // binary size reasons.
+  // const_iterator, but it specifically avoids hiding the copy constructor so
+  // that the trivial one will be used when possible.
   template <typename N, typename R, typename P,
             absl::enable_if_t<
                 std::is_same<btree_iterator<N, R, P>, iterator>::value &&
                     std::is_same<btree_iterator, const_iterator>::value,
                 int> = 0>
-  btree_iterator(const btree_iterator<N, R, P> &other)  // NOLINT
+  btree_iterator(const btree_iterator<N, R, P> other)  // NOLINT
       : node(other.node), position(other.position) {}
 
  private:
   // This SFINAE allows explicit conversions from const_iterator to
-  // iterator, but also avoids defining a copy constructor.
+  // iterator, but also avoids hiding the copy constructor.
   // NOTE: the const_cast is safe because this constructor is only called by
   // non-const methods and the container owns the nodes.
   template <typename N, typename R, typename P,
@@ -959,7 +959,7 @@
                 std::is_same<btree_iterator<N, R, P>, const_iterator>::value &&
                     std::is_same<btree_iterator, iterator>::value,
                 int> = 0>
-  explicit btree_iterator(const btree_iterator<N, R, P> &other)
+  explicit btree_iterator(const btree_iterator<N, R, P> other)
       : node(const_cast<node_type *>(other.node)), position(other.position) {}
 
   // Increment/decrement the iterator.
@@ -1022,6 +1022,8 @@
   }
 
  private:
+  friend iterator;
+  friend const_iterator;
   template <typename Params>
   friend class btree;
   template <typename Tree>
@@ -1032,8 +1034,6 @@
   friend class btree_map_container;
   template <typename Tree>
   friend class btree_multiset_container;
-  template <typename N, typename R, typename P>
-  friend struct btree_iterator;
   template <typename TreeType, typename CheckerType>
   friend class base_checker;
 
@@ -1122,7 +1122,8 @@
   using const_reference = typename Params::const_reference;
   using pointer = typename Params::pointer;
   using const_pointer = typename Params::const_pointer;
-  using iterator = btree_iterator<node_type, reference, pointer>;
+  using iterator =
+      typename btree_iterator<node_type, reference, pointer>::iterator;
   using const_iterator = typename iterator::const_iterator;
   using reverse_iterator = std::reverse_iterator<iterator>;
   using const_reverse_iterator = std::reverse_iterator<const_iterator>;
@@ -1135,7 +1136,11 @@
  private:
   // For use in copy_or_move_values_in_order.
   const value_type &maybe_move_from_iterator(const_iterator it) { return *it; }
-  value_type &&maybe_move_from_iterator(iterator it) { return std::move(*it); }
+  value_type &&maybe_move_from_iterator(iterator it) {
+    // This is a destructive operation on the other container so it's safe for
+    // us to const_cast and move from the keys here even if it's a set.
+    return std::move(const_cast<value_type &>(*it));
+  }
 
   // Copies or moves (depending on the template parameter) the values in
   // other into this btree in their order in other. This btree must be empty
diff --git a/third_party/abseil-cpp/absl/container/internal/inlined_vector.h b/third_party/abseil-cpp/absl/container/internal/inlined_vector.h
index 4d80b72..502ea3d 100644
--- a/third_party/abseil-cpp/absl/container/internal/inlined_vector.h
+++ b/third_party/abseil-cpp/absl/container/internal/inlined_vector.h
@@ -298,9 +298,10 @@
   // Storage Constructors and Destructor
   // ---------------------------------------------------------------------------
 
-  Storage() : metadata_() {}
+  Storage() : metadata_(allocator_type(), /* size and is_allocated */ 0) {}
 
-  explicit Storage(const allocator_type& alloc) : metadata_(alloc, {}) {}
+  explicit Storage(const allocator_type& alloc)
+      : metadata_(alloc, /* size and is_allocated */ 0) {}
 
   ~Storage() {
     pointer data = GetIsAllocated() ? GetAllocatedData() : GetInlinedData();
@@ -462,6 +463,9 @@
     Inlined inlined;
   };
 
+  template <typename... Args>
+  ABSL_ATTRIBUTE_NOINLINE reference EmplaceBackSlow(Args&&... args);
+
   Metadata metadata_;
   Data data_;
 };
@@ -542,48 +546,42 @@
 template <typename ValueAdapter>
 auto Storage<T, N, A>::Resize(ValueAdapter values, size_type new_size) -> void {
   StorageView storage_view = MakeStorageView();
-
-  IteratorValueAdapter<MoveIterator> move_values(
-      MoveIterator(storage_view.data));
-
-  AllocationTransaction allocation_tx(GetAllocPtr());
-  ConstructionTransaction construction_tx(GetAllocPtr());
-
-  absl::Span<value_type> construct_loop;
-  absl::Span<value_type> move_construct_loop;
-  absl::Span<value_type> destroy_loop;
-
-  if (new_size > storage_view.capacity) {
+  auto* const base = storage_view.data;
+  const size_type size = storage_view.size;
+  auto* alloc = GetAllocPtr();
+  if (new_size <= size) {
+    // Destroy extra old elements.
+    inlined_vector_internal::DestroyElements(alloc, base + new_size,
+                                             size - new_size);
+  } else if (new_size <= storage_view.capacity) {
+    // Construct new elements in place.
+    inlined_vector_internal::ConstructElements(alloc, base + size, &values,
+                                               new_size - size);
+  } else {
+    // Steps:
+    //  a. Allocate new backing store.
+    //  b. Construct new elements in new backing store.
+    //  c. Move existing elements from old backing store to now.
+    //  d. Destroy all elements in old backing store.
+    // Use transactional wrappers for the first two steps so we can roll
+    // back if necessary due to exceptions.
+    AllocationTransaction allocation_tx(alloc);
     size_type new_capacity = ComputeCapacity(storage_view.capacity, new_size);
     pointer new_data = allocation_tx.Allocate(new_capacity);
-    construct_loop = {new_data + storage_view.size,
-                      new_size - storage_view.size};
-    move_construct_loop = {new_data, storage_view.size};
-    destroy_loop = {storage_view.data, storage_view.size};
-  } else if (new_size > storage_view.size) {
-    construct_loop = {storage_view.data + storage_view.size,
-                      new_size - storage_view.size};
-  } else {
-    destroy_loop = {storage_view.data + new_size, storage_view.size - new_size};
-  }
 
-  construction_tx.Construct(construct_loop.data(), &values,
-                            construct_loop.size());
+    ConstructionTransaction construction_tx(alloc);
+    construction_tx.Construct(new_data + size, &values, new_size - size);
 
-  inlined_vector_internal::ConstructElements(
-      GetAllocPtr(), move_construct_loop.data(), &move_values,
-      move_construct_loop.size());
+    IteratorValueAdapter<MoveIterator> move_values((MoveIterator(base)));
+    inlined_vector_internal::ConstructElements(alloc, new_data, &move_values,
+                                               size);
 
-  inlined_vector_internal::DestroyElements(GetAllocPtr(), destroy_loop.data(),
-                                           destroy_loop.size());
-
-  construction_tx.Commit();
-  if (allocation_tx.DidAllocate()) {
+    inlined_vector_internal::DestroyElements(alloc, base, size);
+    construction_tx.Commit();
     DeallocateIfAllocated();
     AcquireAllocatedData(&allocation_tx);
     SetIsAllocated();
   }
-
   SetSize(new_size);
 }
 
@@ -684,44 +682,50 @@
 template <typename... Args>
 auto Storage<T, N, A>::EmplaceBack(Args&&... args) -> reference {
   StorageView storage_view = MakeStorageView();
+  const auto n = storage_view.size;
+  if (ABSL_PREDICT_TRUE(n != storage_view.capacity)) {
+    // Fast path; new element fits.
+    pointer last_ptr = storage_view.data + n;
+    AllocatorTraits::construct(*GetAllocPtr(), last_ptr,
+                               std::forward<Args>(args)...);
+    AddSize(1);
+    return *last_ptr;
+  }
+  // TODO(b/173712035): Annotate with musttail attribute to prevent regression.
+  return EmplaceBackSlow(std::forward<Args>(args)...);
+}
 
+template <typename T, size_t N, typename A>
+template <typename... Args>
+auto Storage<T, N, A>::EmplaceBackSlow(Args&&... args) -> reference {
+  StorageView storage_view = MakeStorageView();
   AllocationTransaction allocation_tx(GetAllocPtr());
-
   IteratorValueAdapter<MoveIterator> move_values(
       MoveIterator(storage_view.data));
-
-  pointer construct_data;
-  if (storage_view.size == storage_view.capacity) {
-    size_type new_capacity = NextCapacity(storage_view.capacity);
-    construct_data = allocation_tx.Allocate(new_capacity);
-  } else {
-    construct_data = storage_view.data;
-  }
-
+  size_type new_capacity = NextCapacity(storage_view.capacity);
+  pointer construct_data = allocation_tx.Allocate(new_capacity);
   pointer last_ptr = construct_data + storage_view.size;
 
+  // Construct new element.
   AllocatorTraits::construct(*GetAllocPtr(), last_ptr,
                              std::forward<Args>(args)...);
-
-  if (allocation_tx.DidAllocate()) {
-    ABSL_INTERNAL_TRY {
-      inlined_vector_internal::ConstructElements(
-          GetAllocPtr(), allocation_tx.GetData(), &move_values,
-          storage_view.size);
-    }
-    ABSL_INTERNAL_CATCH_ANY {
-      AllocatorTraits::destroy(*GetAllocPtr(), last_ptr);
-      ABSL_INTERNAL_RETHROW;
-    }
-
-    inlined_vector_internal::DestroyElements(GetAllocPtr(), storage_view.data,
-                                             storage_view.size);
-
-    DeallocateIfAllocated();
-    AcquireAllocatedData(&allocation_tx);
-    SetIsAllocated();
+  // Move elements from old backing store to new backing store.
+  ABSL_INTERNAL_TRY {
+    inlined_vector_internal::ConstructElements(
+        GetAllocPtr(), allocation_tx.GetData(), &move_values,
+        storage_view.size);
   }
+  ABSL_INTERNAL_CATCH_ANY {
+    AllocatorTraits::destroy(*GetAllocPtr(), last_ptr);
+    ABSL_INTERNAL_RETHROW;
+  }
+  // Destroy elements in old backing store.
+  inlined_vector_internal::DestroyElements(GetAllocPtr(), storage_view.data,
+                                           storage_view.size);
 
+  DeallocateIfAllocated();
+  AcquireAllocatedData(&allocation_tx);
+  SetIsAllocated();
   AddSize(1);
   return *last_ptr;
 }
diff --git a/third_party/abseil-cpp/absl/container/internal/layout_benchmark.cc b/third_party/abseil-cpp/absl/container/internal/layout_benchmark.cc
new file mode 100644
index 0000000..d8636e8
--- /dev/null
+++ b/third_party/abseil-cpp/absl/container/internal/layout_benchmark.cc
@@ -0,0 +1,122 @@
+// Copyright 2018 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Every benchmark should have the same performance as the corresponding
+// headroom benchmark.
+
+#include "absl/base/internal/raw_logging.h"
+#include "absl/container/internal/layout.h"
+#include "benchmark/benchmark.h"
+
+namespace absl {
+ABSL_NAMESPACE_BEGIN
+namespace container_internal {
+namespace {
+
+using ::benchmark::DoNotOptimize;
+
+using Int128 = int64_t[2];
+
+// This benchmark provides the upper bound on performance for BM_OffsetConstant.
+template <size_t Offset, class... Ts>
+void BM_OffsetConstantHeadroom(benchmark::State& state) {
+  for (auto _ : state) {
+    DoNotOptimize(Offset);
+  }
+}
+
+template <size_t Offset, class... Ts>
+void BM_OffsetConstant(benchmark::State& state) {
+  using L = Layout<Ts...>;
+  ABSL_RAW_CHECK(L::Partial(3, 5, 7).template Offset<3>() == Offset,
+                 "Invalid offset");
+  for (auto _ : state) {
+    DoNotOptimize(L::Partial(3, 5, 7).template Offset<3>());
+  }
+}
+
+template <class... Ts>
+size_t VariableOffset(size_t n, size_t m, size_t k);
+
+template <>
+size_t VariableOffset<int8_t, int16_t, int32_t, Int128>(size_t n, size_t m,
+                                                        size_t k) {
+  auto Align = [](size_t n, size_t m) { return (n + m - 1) & ~(m - 1); };
+  return Align(Align(Align(n * 1, 2) + m * 2, 4) + k * 4, 8);
+}
+
+template <>
+size_t VariableOffset<Int128, int32_t, int16_t, int8_t>(size_t n, size_t m,
+                                                        size_t k) {
+  // No alignment is necessary.
+  return n * 16 + m * 4 + k * 2;
+}
+
+// This benchmark provides the upper bound on performance for BM_OffsetVariable.
+template <size_t Offset, class... Ts>
+void BM_OffsetVariableHeadroom(benchmark::State& state) {
+  size_t n = 3;
+  size_t m = 5;
+  size_t k = 7;
+  ABSL_RAW_CHECK(VariableOffset<Ts...>(n, m, k) == Offset, "Invalid offset");
+  for (auto _ : state) {
+    DoNotOptimize(n);
+    DoNotOptimize(m);
+    DoNotOptimize(k);
+    DoNotOptimize(VariableOffset<Ts...>(n, m, k));
+  }
+}
+
+template <size_t Offset, class... Ts>
+void BM_OffsetVariable(benchmark::State& state) {
+  using L = Layout<Ts...>;
+  size_t n = 3;
+  size_t m = 5;
+  size_t k = 7;
+  ABSL_RAW_CHECK(L::Partial(n, m, k).template Offset<3>() == Offset,
+                 "Inavlid offset");
+  for (auto _ : state) {
+    DoNotOptimize(n);
+    DoNotOptimize(m);
+    DoNotOptimize(k);
+    DoNotOptimize(L::Partial(n, m, k).template Offset<3>());
+  }
+}
+
+// Run all benchmarks in two modes:
+//
+//   Layout with padding: int8_t[3], int16_t[5], int32_t[7], Int128[?].
+//   Layout without padding: Int128[3], int32_t[5], int16_t[7], int8_t[?].
+
+#define OFFSET_BENCHMARK(NAME, OFFSET, T1, T2, T3, T4) \
+  auto& NAME##_##OFFSET##_##T1##_##T2##_##T3##_##T4 =  \
+      NAME<OFFSET, T1, T2, T3, T4>;                    \
+  BENCHMARK(NAME##_##OFFSET##_##T1##_##T2##_##T3##_##T4)
+
+OFFSET_BENCHMARK(BM_OffsetConstantHeadroom, 48, int8_t, int16_t, int32_t,
+                 Int128);
+OFFSET_BENCHMARK(BM_OffsetConstant, 48, int8_t, int16_t, int32_t, Int128);
+OFFSET_BENCHMARK(BM_OffsetConstantHeadroom, 82, Int128, int32_t, int16_t,
+                 int8_t);
+OFFSET_BENCHMARK(BM_OffsetConstant, 82, Int128, int32_t, int16_t, int8_t);
+OFFSET_BENCHMARK(BM_OffsetVariableHeadroom, 48, int8_t, int16_t, int32_t,
+                 Int128);
+OFFSET_BENCHMARK(BM_OffsetVariable, 48, int8_t, int16_t, int32_t, Int128);
+OFFSET_BENCHMARK(BM_OffsetVariableHeadroom, 82, Int128, int32_t, int16_t,
+                 int8_t);
+OFFSET_BENCHMARK(BM_OffsetVariable, 82, Int128, int32_t, int16_t, int8_t);
+}  // namespace
+}  // namespace container_internal
+ABSL_NAMESPACE_END
+}  // namespace absl
diff --git a/third_party/abseil-cpp/absl/container/internal/raw_hash_set_benchmark.cc b/third_party/abseil-cpp/absl/container/internal/raw_hash_set_benchmark.cc
new file mode 100644
index 0000000..f9be2c5
--- /dev/null
+++ b/third_party/abseil-cpp/absl/container/internal/raw_hash_set_benchmark.cc
@@ -0,0 +1,396 @@
+// Copyright 2018 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/container/internal/raw_hash_set.h"
+
+#include <numeric>
+#include <random>
+
+#include "absl/base/internal/raw_logging.h"
+#include "absl/container/internal/hash_function_defaults.h"
+#include "absl/strings/str_format.h"
+#include "benchmark/benchmark.h"
+
+namespace absl {
+ABSL_NAMESPACE_BEGIN
+namespace container_internal {
+
+struct RawHashSetTestOnlyAccess {
+  template <typename C>
+  static auto GetSlots(const C& c) -> decltype(c.slots_) {
+    return c.slots_;
+  }
+};
+
+namespace {
+
+struct IntPolicy {
+  using slot_type = int64_t;
+  using key_type = int64_t;
+  using init_type = int64_t;
+
+  static void construct(void*, int64_t* slot, int64_t v) { *slot = v; }
+  static void destroy(void*, int64_t*) {}
+  static void transfer(void*, int64_t* new_slot, int64_t* old_slot) {
+    *new_slot = *old_slot;
+  }
+
+  static int64_t& element(slot_type* slot) { return *slot; }
+
+  template <class F>
+  static auto apply(F&& f, int64_t x) -> decltype(std::forward<F>(f)(x, x)) {
+    return std::forward<F>(f)(x, x);
+  }
+};
+
+class StringPolicy {
+  template <class F, class K, class V,
+            class = typename std::enable_if<
+                std::is_convertible<const K&, absl::string_view>::value>::type>
+  decltype(std::declval<F>()(
+      std::declval<const absl::string_view&>(), std::piecewise_construct,
+      std::declval<std::tuple<K>>(),
+      std::declval<V>())) static apply_impl(F&& f,
+                                            std::pair<std::tuple<K>, V> p) {
+    const absl::string_view& key = std::get<0>(p.first);
+    return std::forward<F>(f)(key, std::piecewise_construct, std::move(p.first),
+                              std::move(p.second));
+  }
+
+ public:
+  struct slot_type {
+    struct ctor {};
+
+    template <class... Ts>
+    slot_type(ctor, Ts&&... ts) : pair(std::forward<Ts>(ts)...) {}
+
+    std::pair<std::string, std::string> pair;
+  };
+
+  using key_type = std::string;
+  using init_type = std::pair<std::string, std::string>;
+
+  template <class allocator_type, class... Args>
+  static void construct(allocator_type* alloc, slot_type* slot, Args... args) {
+    std::allocator_traits<allocator_type>::construct(
+        *alloc, slot, typename slot_type::ctor(), std::forward<Args>(args)...);
+  }
+
+  template <class allocator_type>
+  static void destroy(allocator_type* alloc, slot_type* slot) {
+    std::allocator_traits<allocator_type>::destroy(*alloc, slot);
+  }
+
+  template <class allocator_type>
+  static void transfer(allocator_type* alloc, slot_type* new_slot,
+                       slot_type* old_slot) {
+    construct(alloc, new_slot, std::move(old_slot->pair));
+    destroy(alloc, old_slot);
+  }
+
+  static std::pair<std::string, std::string>& element(slot_type* slot) {
+    return slot->pair;
+  }
+
+  template <class F, class... Args>
+  static auto apply(F&& f, Args&&... args)
+      -> decltype(apply_impl(std::forward<F>(f),
+                             PairArgs(std::forward<Args>(args)...))) {
+    return apply_impl(std::forward<F>(f),
+                      PairArgs(std::forward<Args>(args)...));
+  }
+};
+
+struct StringHash : container_internal::hash_default_hash<absl::string_view> {
+  using is_transparent = void;
+};
+struct StringEq : std::equal_to<absl::string_view> {
+  using is_transparent = void;
+};
+
+struct StringTable
+    : raw_hash_set<StringPolicy, StringHash, StringEq, std::allocator<int>> {
+  using Base = typename StringTable::raw_hash_set;
+  StringTable() {}
+  using Base::Base;
+};
+
+struct IntTable
+    : raw_hash_set<IntPolicy, container_internal::hash_default_hash<int64_t>,
+                   std::equal_to<int64_t>, std::allocator<int64_t>> {
+  using Base = typename IntTable::raw_hash_set;
+  IntTable() {}
+  using Base::Base;
+};
+
+struct string_generator {
+  template <class RNG>
+  std::string operator()(RNG& rng) const {
+    std::string res;
+    res.resize(12);
+    std::uniform_int_distribution<uint32_t> printable_ascii(0x20, 0x7E);
+    std::generate(res.begin(), res.end(), [&] { return printable_ascii(rng); });
+    return res;
+  }
+
+  size_t size;
+};
+
+// Model a cache in steady state.
+//
+// On a table of size N, keep deleting the LRU entry and add a random one.
+void BM_CacheInSteadyState(benchmark::State& state) {
+  std::random_device rd;
+  std::mt19937 rng(rd());
+  string_generator gen{12};
+  StringTable t;
+  std::deque<std::string> keys;
+  while (t.size() < state.range(0)) {
+    auto x = t.emplace(gen(rng), gen(rng));
+    if (x.second) keys.push_back(x.first->first);
+  }
+  ABSL_RAW_CHECK(state.range(0) >= 10, "");
+  while (state.KeepRunning()) {
+    // Some cache hits.
+    std::deque<std::string>::const_iterator it;
+    for (int i = 0; i != 90; ++i) {
+      if (i % 10 == 0) it = keys.end();
+      ::benchmark::DoNotOptimize(t.find(*--it));
+    }
+    // Some cache misses.
+    for (int i = 0; i != 10; ++i) ::benchmark::DoNotOptimize(t.find(gen(rng)));
+    ABSL_RAW_CHECK(t.erase(keys.front()), keys.front().c_str());
+    keys.pop_front();
+    while (true) {
+      auto x = t.emplace(gen(rng), gen(rng));
+      if (x.second) {
+        keys.push_back(x.first->first);
+        break;
+      }
+    }
+  }
+  state.SetItemsProcessed(state.iterations());
+  state.SetLabel(absl::StrFormat("load_factor=%.2f", t.load_factor()));
+}
+
+template <typename Benchmark>
+void CacheInSteadyStateArgs(Benchmark* bm) {
+  // The default.
+  const float max_load_factor = 0.875;
+  // When the cache is at the steady state, the probe sequence will equal
+  // capacity if there is no reclamation of deleted slots. Pick a number large
+  // enough to make the benchmark slow for that case.
+  const size_t capacity = 1 << 10;
+
+  // Check N data points to cover load factors in [0.4, 0.8).
+  const size_t kNumPoints = 10;
+  for (size_t i = 0; i != kNumPoints; ++i)
+    bm->Arg(std::ceil(
+        capacity * (max_load_factor + i * max_load_factor / kNumPoints) / 2));
+}
+BENCHMARK(BM_CacheInSteadyState)->Apply(CacheInSteadyStateArgs);
+
+void BM_EndComparison(benchmark::State& state) {
+  std::random_device rd;
+  std::mt19937 rng(rd());
+  string_generator gen{12};
+  StringTable t;
+  while (t.size() < state.range(0)) {
+    t.emplace(gen(rng), gen(rng));
+  }
+
+  for (auto _ : state) {
+    for (auto it = t.begin(); it != t.end(); ++it) {
+      benchmark::DoNotOptimize(it);
+      benchmark::DoNotOptimize(t);
+      benchmark::DoNotOptimize(it != t.end());
+    }
+  }
+}
+BENCHMARK(BM_EndComparison)->Arg(400);
+
+void BM_CopyCtor(benchmark::State& state) {
+  std::random_device rd;
+  std::mt19937 rng(rd());
+  IntTable t;
+  std::uniform_int_distribution<uint64_t> dist(0, ~uint64_t{});
+
+  while (t.size() < state.range(0)) {
+    t.emplace(dist(rng));
+  }
+
+  for (auto _ : state) {
+    IntTable t2 = t;
+    benchmark::DoNotOptimize(t2);
+  }
+}
+BENCHMARK(BM_CopyCtor)->Range(128, 4096);
+
+void BM_CopyAssign(benchmark::State& state) {
+  std::random_device rd;
+  std::mt19937 rng(rd());
+  IntTable t;
+  std::uniform_int_distribution<uint64_t> dist(0, ~uint64_t{});
+  while (t.size() < state.range(0)) {
+    t.emplace(dist(rng));
+  }
+
+  IntTable t2;
+  for (auto _ : state) {
+    t2 = t;
+    benchmark::DoNotOptimize(t2);
+  }
+}
+BENCHMARK(BM_CopyAssign)->Range(128, 4096);
+
+void BM_NoOpReserveIntTable(benchmark::State& state) {
+  IntTable t;
+  t.reserve(100000);
+  for (auto _ : state) {
+    benchmark::DoNotOptimize(t);
+    t.reserve(100000);
+  }
+}
+BENCHMARK(BM_NoOpReserveIntTable);
+
+void BM_NoOpReserveStringTable(benchmark::State& state) {
+  StringTable t;
+  t.reserve(100000);
+  for (auto _ : state) {
+    benchmark::DoNotOptimize(t);
+    t.reserve(100000);
+  }
+}
+BENCHMARK(BM_NoOpReserveStringTable);
+
+void BM_ReserveIntTable(benchmark::State& state) {
+  int reserve_size = state.range(0);
+  for (auto _ : state) {
+    state.PauseTiming();
+    IntTable t;
+    state.ResumeTiming();
+    benchmark::DoNotOptimize(t);
+    t.reserve(reserve_size);
+  }
+}
+BENCHMARK(BM_ReserveIntTable)->Range(128, 4096);
+
+void BM_ReserveStringTable(benchmark::State& state) {
+  int reserve_size = state.range(0);
+  for (auto _ : state) {
+    state.PauseTiming();
+    StringTable t;
+    state.ResumeTiming();
+    benchmark::DoNotOptimize(t);
+    t.reserve(reserve_size);
+  }
+}
+BENCHMARK(BM_ReserveStringTable)->Range(128, 4096);
+
+void BM_Group_Match(benchmark::State& state) {
+  std::array<ctrl_t, Group::kWidth> group;
+  std::iota(group.begin(), group.end(), -4);
+  Group g{group.data()};
+  h2_t h = 1;
+  for (auto _ : state) {
+    ::benchmark::DoNotOptimize(h);
+    ::benchmark::DoNotOptimize(g.Match(h));
+  }
+}
+BENCHMARK(BM_Group_Match);
+
+void BM_Group_MatchEmpty(benchmark::State& state) {
+  std::array<ctrl_t, Group::kWidth> group;
+  std::iota(group.begin(), group.end(), -4);
+  Group g{group.data()};
+  for (auto _ : state) ::benchmark::DoNotOptimize(g.MatchEmpty());
+}
+BENCHMARK(BM_Group_MatchEmpty);
+
+void BM_Group_MatchEmptyOrDeleted(benchmark::State& state) {
+  std::array<ctrl_t, Group::kWidth> group;
+  std::iota(group.begin(), group.end(), -4);
+  Group g{group.data()};
+  for (auto _ : state) ::benchmark::DoNotOptimize(g.MatchEmptyOrDeleted());
+}
+BENCHMARK(BM_Group_MatchEmptyOrDeleted);
+
+void BM_Group_CountLeadingEmptyOrDeleted(benchmark::State& state) {
+  std::array<ctrl_t, Group::kWidth> group;
+  std::iota(group.begin(), group.end(), -2);
+  Group g{group.data()};
+  for (auto _ : state)
+    ::benchmark::DoNotOptimize(g.CountLeadingEmptyOrDeleted());
+}
+BENCHMARK(BM_Group_CountLeadingEmptyOrDeleted);
+
+void BM_Group_MatchFirstEmptyOrDeleted(benchmark::State& state) {
+  std::array<ctrl_t, Group::kWidth> group;
+  std::iota(group.begin(), group.end(), -2);
+  Group g{group.data()};
+  for (auto _ : state) ::benchmark::DoNotOptimize(*g.MatchEmptyOrDeleted());
+}
+BENCHMARK(BM_Group_MatchFirstEmptyOrDeleted);
+
+void BM_DropDeletes(benchmark::State& state) {
+  constexpr size_t capacity = (1 << 20) - 1;
+  std::vector<ctrl_t> ctrl(capacity + 1 + Group::kWidth);
+  ctrl[capacity] = kSentinel;
+  std::vector<ctrl_t> pattern = {kEmpty, 2, kDeleted, 2, kEmpty, 1, kDeleted};
+  for (size_t i = 0; i != capacity; ++i) {
+    ctrl[i] = pattern[i % pattern.size()];
+  }
+  while (state.KeepRunning()) {
+    state.PauseTiming();
+    std::vector<ctrl_t> ctrl_copy = ctrl;
+    state.ResumeTiming();
+    ConvertDeletedToEmptyAndFullToDeleted(ctrl_copy.data(), capacity);
+    ::benchmark::DoNotOptimize(ctrl_copy[capacity]);
+  }
+}
+BENCHMARK(BM_DropDeletes);
+
+}  // namespace
+}  // namespace container_internal
+ABSL_NAMESPACE_END
+}  // namespace absl
+
+// These methods are here to make it easy to examine the assembly for targeted
+// parts of the API.
+auto CodegenAbslRawHashSetInt64Find(absl::container_internal::IntTable* table,
+                                    int64_t key) -> decltype(table->find(key)) {
+  return table->find(key);
+}
+
+bool CodegenAbslRawHashSetInt64FindNeEnd(
+    absl::container_internal::IntTable* table, int64_t key) {
+  return table->find(key) != table->end();
+}
+
+bool CodegenAbslRawHashSetInt64Contains(
+    absl::container_internal::IntTable* table, int64_t key) {
+  return table->contains(key);
+}
+
+void CodegenAbslRawHashSetInt64Iterate(
+    absl::container_internal::IntTable* table) {
+  for (auto x : *table) benchmark::DoNotOptimize(x);
+}
+
+int odr =
+    (::benchmark::DoNotOptimize(std::make_tuple(
+         &CodegenAbslRawHashSetInt64Find, &CodegenAbslRawHashSetInt64FindNeEnd,
+         &CodegenAbslRawHashSetInt64Contains,
+         &CodegenAbslRawHashSetInt64Iterate)),
+     1);
diff --git a/third_party/abseil-cpp/absl/container/internal/raw_hash_set_probe_benchmark.cc b/third_party/abseil-cpp/absl/container/internal/raw_hash_set_probe_benchmark.cc
new file mode 100644
index 0000000..7169a2e
--- /dev/null
+++ b/third_party/abseil-cpp/absl/container/internal/raw_hash_set_probe_benchmark.cc
@@ -0,0 +1,590 @@
+// Copyright 2018 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Generates probe length statistics for many combinations of key types and key
+// distributions, all using the default hash function for swisstable.
+
+#include <memory>
+#include <regex>  // NOLINT
+#include <vector>
+
+#include "absl/container/flat_hash_map.h"
+#include "absl/container/internal/hash_function_defaults.h"
+#include "absl/container/internal/hashtable_debug.h"
+#include "absl/container/internal/raw_hash_set.h"
+#include "absl/random/distributions.h"
+#include "absl/random/random.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/str_format.h"
+#include "absl/strings/string_view.h"
+#include "absl/strings/strip.h"
+
+namespace {
+
+enum class OutputStyle { kRegular, kBenchmark };
+
+// The --benchmark command line flag.
+// This is populated from main().
+// When run in "benchmark" mode, we have different output. This allows
+// A/B comparisons with tools like `benchy`.
+absl::string_view benchmarks;
+
+OutputStyle output() {
+  return !benchmarks.empty() ? OutputStyle::kBenchmark : OutputStyle::kRegular;
+}
+
+template <class T>
+struct Policy {
+  using slot_type = T;
+  using key_type = T;
+  using init_type = T;
+
+  template <class allocator_type, class Arg>
+  static void construct(allocator_type* alloc, slot_type* slot,
+                        const Arg& arg) {
+    std::allocator_traits<allocator_type>::construct(*alloc, slot, arg);
+  }
+
+  template <class allocator_type>
+  static void destroy(allocator_type* alloc, slot_type* slot) {
+    std::allocator_traits<allocator_type>::destroy(*alloc, slot);
+  }
+
+  static slot_type& element(slot_type* slot) { return *slot; }
+
+  template <class F, class... Args>
+  static auto apply(F&& f, const slot_type& arg)
+      -> decltype(std::forward<F>(f)(arg, arg)) {
+    return std::forward<F>(f)(arg, arg);
+  }
+};
+
+absl::BitGen& GlobalBitGen() {
+  static auto* value = new absl::BitGen;
+  return *value;
+}
+
+// Keeps a pool of allocations and randomly gives one out.
+// This introduces more randomization to the addresses given to swisstable and
+// should help smooth out this factor from probe length calculation.
+template <class T>
+class RandomizedAllocator {
+ public:
+  using value_type = T;
+
+  RandomizedAllocator() = default;
+  template <typename U>
+  RandomizedAllocator(RandomizedAllocator<U>) {}  // NOLINT
+
+  static T* allocate(size_t n) {
+    auto& pointers = GetPointers(n);
+    // Fill the pool
+    while (pointers.size() < kRandomPool) {
+      pointers.push_back(std::allocator<T>{}.allocate(n));
+    }
+
+    // Choose a random one.
+    size_t i = absl::Uniform<size_t>(GlobalBitGen(), 0, pointers.size());
+    T* result = pointers[i];
+    pointers[i] = pointers.back();
+    pointers.pop_back();
+    return result;
+  }
+
+  static void deallocate(T* p, size_t n) {
+    // Just put it back on the pool. No need to release the memory.
+    GetPointers(n).push_back(p);
+  }
+
+ private:
+  // We keep at least kRandomPool allocations for each size.
+  static constexpr size_t kRandomPool = 20;
+
+  static std::vector<T*>& GetPointers(size_t n) {
+    static auto* m = new absl::flat_hash_map<size_t, std::vector<T*>>();
+    return (*m)[n];
+  }
+};
+
+template <class T>
+struct DefaultHash {
+  using type = absl::container_internal::hash_default_hash<T>;
+};
+
+template <class T>
+using DefaultHashT = typename DefaultHash<T>::type;
+
+template <class T>
+struct Table : absl::container_internal::raw_hash_set<
+                   Policy<T>, DefaultHashT<T>,
+                   absl::container_internal::hash_default_eq<T>,
+                   RandomizedAllocator<T>> {};
+
+struct LoadSizes {
+  size_t min_load;
+  size_t max_load;
+};
+
+LoadSizes GetMinMaxLoadSizes() {
+  static const auto sizes = [] {
+    Table<int> t;
+
+    // First, fill enough to have a good distribution.
+    constexpr size_t kMinSize = 10000;
+    while (t.size() < kMinSize) t.insert(t.size());
+
+    const auto reach_min_load_factor = [&] {
+      const double lf = t.load_factor();
+      while (lf <= t.load_factor()) t.insert(t.size());
+    };
+
+    // Then, insert until we reach min load factor.
+    reach_min_load_factor();
+    const size_t min_load_size = t.size();
+
+    // Keep going until we hit min load factor again, then go back one.
+    t.insert(t.size());
+    reach_min_load_factor();
+
+    return LoadSizes{min_load_size, t.size() - 1};
+  }();
+  return sizes;
+}
+
+struct Ratios {
+  double min_load;
+  double avg_load;
+  double max_load;
+};
+
+// See absl/container/internal/hashtable_debug.h for details on
+// probe length calculation.
+template <class ElemFn>
+Ratios CollectMeanProbeLengths() {
+  const auto min_max_sizes = GetMinMaxLoadSizes();
+
+  ElemFn elem;
+  using Key = decltype(elem());
+  Table<Key> t;
+
+  Ratios result;
+  while (t.size() < min_max_sizes.min_load) t.insert(elem());
+  result.min_load =
+      absl::container_internal::GetHashtableDebugProbeSummary(t).mean;
+
+  while (t.size() < (min_max_sizes.min_load + min_max_sizes.max_load) / 2)
+    t.insert(elem());
+  result.avg_load =
+      absl::container_internal::GetHashtableDebugProbeSummary(t).mean;
+
+  while (t.size() < min_max_sizes.max_load) t.insert(elem());
+  result.max_load =
+      absl::container_internal::GetHashtableDebugProbeSummary(t).mean;
+
+  return result;
+}
+
+template <int Align>
+uintptr_t PointerForAlignment() {
+  alignas(Align) static constexpr uintptr_t kInitPointer = 0;
+  return reinterpret_cast<uintptr_t>(&kInitPointer);
+}
+
+// This incomplete type is used for testing hash of pointers of different
+// alignments.
+// NOTE: We are generating invalid pointer values on the fly with
+// reinterpret_cast. There are not "safely derived" pointers so using them is
+// technically UB. It is unlikely to be a problem, though.
+template <int Align>
+struct Ptr;
+
+template <int Align>
+Ptr<Align>* MakePtr(uintptr_t v) {
+  if (sizeof(v) == 8) {
+    constexpr int kCopyBits = 16;
+    // Ensure high bits are all the same.
+    v = static_cast<uintptr_t>(static_cast<intptr_t>(v << kCopyBits) >>
+                               kCopyBits);
+  }
+  return reinterpret_cast<Ptr<Align>*>(v);
+}
+
+struct IntIdentity {
+  uint64_t i;
+  friend bool operator==(IntIdentity a, IntIdentity b) { return a.i == b.i; }
+  IntIdentity operator++(int) { return IntIdentity{i++}; }
+};
+
+template <int Align>
+struct PtrIdentity {
+  explicit PtrIdentity(uintptr_t val = PointerForAlignment<Align>()) : i(val) {}
+  uintptr_t i;
+  friend bool operator==(PtrIdentity a, PtrIdentity b) { return a.i == b.i; }
+  PtrIdentity operator++(int) {
+    PtrIdentity p(i);
+    i += Align;
+    return p;
+  }
+};
+
+constexpr char kStringFormat[] = "/path/to/file/name-%07d-of-9999999.txt";
+
+template <bool small>
+struct String {
+  std::string value;
+  static std::string Make(uint32_t v) {
+    return {small ? absl::StrCat(v) : absl::StrFormat(kStringFormat, v)};
+  }
+};
+
+template <>
+struct DefaultHash<IntIdentity> {
+  struct type {
+    size_t operator()(IntIdentity t) const { return t.i; }
+  };
+};
+
+template <int Align>
+struct DefaultHash<PtrIdentity<Align>> {
+  struct type {
+    size_t operator()(PtrIdentity<Align> t) const { return t.i; }
+  };
+};
+
+template <class T>
+struct Sequential {
+  T operator()() const { return current++; }
+  mutable T current{};
+};
+
+template <int Align>
+struct Sequential<Ptr<Align>*> {
+  Ptr<Align>* operator()() const {
+    auto* result = MakePtr<Align>(current);
+    current += Align;
+    return result;
+  }
+  mutable uintptr_t current = PointerForAlignment<Align>();
+};
+
+
+template <bool small>
+struct Sequential<String<small>> {
+  std::string operator()() const { return String<small>::Make(current++); }
+  mutable uint32_t current = 0;
+};
+
+template <class T, class U>
+struct Sequential<std::pair<T, U>> {
+  mutable Sequential<T> tseq;
+  mutable Sequential<U> useq;
+
+  using RealT = decltype(tseq());
+  using RealU = decltype(useq());
+
+  mutable std::vector<RealT> ts;
+  mutable std::vector<RealU> us;
+  mutable size_t ti = 0, ui = 0;
+
+  std::pair<RealT, RealU> operator()() const {
+    std::pair<RealT, RealU> value{get_t(), get_u()};
+    if (ti == 0) {
+      ti = ui + 1;
+      ui = 0;
+    } else {
+      --ti;
+      ++ui;
+    }
+    return value;
+  }
+
+  RealT get_t() const {
+    while (ti >= ts.size()) ts.push_back(tseq());
+    return ts[ti];
+  }
+
+  RealU get_u() const {
+    while (ui >= us.size()) us.push_back(useq());
+    return us[ui];
+  }
+};
+
+template <class T, int percent_skip>
+struct AlmostSequential {
+  mutable Sequential<T> current;
+
+  auto operator()() const -> decltype(current()) {
+    while (absl::Uniform(GlobalBitGen(), 0.0, 1.0) <= percent_skip / 100.)
+      current();
+    return current();
+  }
+};
+
+struct Uniform {
+  template <typename T>
+  T operator()(T) const {
+    return absl::Uniform<T>(absl::IntervalClosed, GlobalBitGen(), T{0}, ~T{0});
+  }
+};
+
+struct Gaussian {
+  template <typename T>
+  T operator()(T) const {
+    double d;
+    do {
+      d = absl::Gaussian<double>(GlobalBitGen(), 1e6, 1e4);
+    } while (d <= 0 || d > std::numeric_limits<T>::max() / 2);
+    return static_cast<T>(d);
+  }
+};
+
+struct Zipf {
+  template <typename T>
+  T operator()(T) const {
+    return absl::Zipf<T>(GlobalBitGen(), std::numeric_limits<T>::max(), 1.6);
+  }
+};
+
+template <class T, class Dist>
+struct Random {
+  T operator()() const { return Dist{}(T{}); }
+};
+
+template <class Dist, int Align>
+struct Random<Ptr<Align>*, Dist> {
+  Ptr<Align>* operator()() const {
+    return MakePtr<Align>(Random<uintptr_t, Dist>{}() * Align);
+  }
+};
+
+template <class Dist>
+struct Random<IntIdentity, Dist> {
+  IntIdentity operator()() const {
+    return IntIdentity{Random<uint64_t, Dist>{}()};
+  }
+};
+
+template <class Dist, int Align>
+struct Random<PtrIdentity<Align>, Dist> {
+  PtrIdentity<Align> operator()() const {
+    return PtrIdentity<Align>{Random<uintptr_t, Dist>{}() * Align};
+  }
+};
+
+template <class Dist, bool small>
+struct Random<String<small>, Dist> {
+  std::string operator()() const {
+    return String<small>::Make(Random<uint32_t, Dist>{}());
+  }
+};
+
+template <class T, class U, class Dist>
+struct Random<std::pair<T, U>, Dist> {
+  auto operator()() const
+      -> decltype(std::make_pair(Random<T, Dist>{}(), Random<U, Dist>{}())) {
+    return std::make_pair(Random<T, Dist>{}(), Random<U, Dist>{}());
+  }
+};
+
+template <typename>
+std::string Name();
+
+std::string Name(uint32_t*) { return "u32"; }
+std::string Name(uint64_t*) { return "u64"; }
+std::string Name(IntIdentity*) { return "IntIdentity"; }
+
+template <int Align>
+std::string Name(Ptr<Align>**) {
+  return absl::StrCat("Ptr", Align);
+}
+
+template <int Align>
+std::string Name(PtrIdentity<Align>*) {
+  return absl::StrCat("PtrIdentity", Align);
+}
+
+template <bool small>
+std::string Name(String<small>*) {
+  return small ? "StrS" : "StrL";
+}
+
+template <class T, class U>
+std::string Name(std::pair<T, U>*) {
+  if (output() == OutputStyle::kBenchmark)
+    return absl::StrCat("P_", Name<T>(), "_", Name<U>());
+  return absl::StrCat("P<", Name<T>(), ",", Name<U>(), ">");
+}
+
+template <class T>
+std::string Name(Sequential<T>*) {
+  return "Sequential";
+}
+
+template <class T, int P>
+std::string Name(AlmostSequential<T, P>*) {
+  return absl::StrCat("AlmostSeq_", P);
+}
+
+template <class T>
+std::string Name(Random<T, Uniform>*) {
+  return "UnifRand";
+}
+
+template <class T>
+std::string Name(Random<T, Gaussian>*) {
+  return "GausRand";
+}
+
+template <class T>
+std::string Name(Random<T, Zipf>*) {
+  return "ZipfRand";
+}
+
+template <typename T>
+std::string Name() {
+  return Name(static_cast<T*>(nullptr));
+}
+
+constexpr int kNameWidth = 15;
+constexpr int kDistWidth = 16;
+
+bool CanRunBenchmark(absl::string_view name) {
+  static std::regex* const filter = []() -> std::regex* {
+    return benchmarks.empty() || benchmarks == "all"
+               ? nullptr
+               : new std::regex(std::string(benchmarks));
+  }();
+  return filter == nullptr || std::regex_search(std::string(name), *filter);
+}
+
+struct Result {
+  std::string name;
+  std::string dist_name;
+  Ratios ratios;
+};
+
+template <typename T, typename Dist>
+void RunForTypeAndDistribution(std::vector<Result>& results) {
+  std::string name = absl::StrCat(Name<T>(), "/", Name<Dist>());
+  // We have to check against all three names (min/avg/max) before we run it.
+  // If any of them is enabled, we run it.
+  if (!CanRunBenchmark(absl::StrCat(name, "/min")) &&
+      !CanRunBenchmark(absl::StrCat(name, "/avg")) &&
+      !CanRunBenchmark(absl::StrCat(name, "/max"))) {
+    return;
+  }
+  results.push_back({Name<T>(), Name<Dist>(), CollectMeanProbeLengths<Dist>()});
+}
+
+template <class T>
+void RunForType(std::vector<Result>& results) {
+  RunForTypeAndDistribution<T, Sequential<T>>(results);
+  RunForTypeAndDistribution<T, AlmostSequential<T, 20>>(results);
+  RunForTypeAndDistribution<T, AlmostSequential<T, 50>>(results);
+  RunForTypeAndDistribution<T, Random<T, Uniform>>(results);
+#ifdef NDEBUG
+  // Disable these in non-opt mode because they take too long.
+  RunForTypeAndDistribution<T, Random<T, Gaussian>>(results);
+  RunForTypeAndDistribution<T, Random<T, Zipf>>(results);
+#endif  // NDEBUG
+}
+
+}  // namespace
+
+int main(int argc, char** argv) {
+  // Parse the benchmark flags. Ignore all of them except the regex pattern.
+  for (int i = 1; i < argc; ++i) {
+    absl::string_view arg = argv[i];
+    const auto next = [&] { return argv[std::min(i + 1, argc - 1)]; };
+
+    if (absl::ConsumePrefix(&arg, "--benchmark_filter")) {
+      if (arg == "") {
+        // --benchmark_filter X
+        benchmarks = next();
+      } else if (absl::ConsumePrefix(&arg, "=")) {
+        // --benchmark_filter=X
+        benchmarks = arg;
+      }
+    }
+
+    // Any --benchmark flag turns on the mode.
+    if (absl::ConsumePrefix(&arg, "--benchmark")) {
+      if (benchmarks.empty()) benchmarks="all";
+    }
+  }
+
+  std::vector<Result> results;
+  RunForType<uint64_t>(results);
+  RunForType<IntIdentity>(results);
+  RunForType<Ptr<8>*>(results);
+  RunForType<Ptr<16>*>(results);
+  RunForType<Ptr<32>*>(results);
+  RunForType<Ptr<64>*>(results);
+  RunForType<PtrIdentity<8>>(results);
+  RunForType<PtrIdentity<16>>(results);
+  RunForType<PtrIdentity<32>>(results);
+  RunForType<PtrIdentity<64>>(results);
+  RunForType<std::pair<uint32_t, uint32_t>>(results);
+  RunForType<String<true>>(results);
+  RunForType<String<false>>(results);
+  RunForType<std::pair<uint64_t, String<true>>>(results);
+  RunForType<std::pair<String<true>, uint64_t>>(results);
+  RunForType<std::pair<uint64_t, String<false>>>(results);
+  RunForType<std::pair<String<false>, uint64_t>>(results);
+
+  switch (output()) {
+    case OutputStyle::kRegular:
+      absl::PrintF("%-*s%-*s       Min       Avg       Max\n%s\n", kNameWidth,
+                   "Type", kDistWidth, "Distribution",
+                   std::string(kNameWidth + kDistWidth + 10 * 3, '-'));
+      for (const auto& result : results) {
+        absl::PrintF("%-*s%-*s  %8.4f  %8.4f  %8.4f\n", kNameWidth, result.name,
+                     kDistWidth, result.dist_name, result.ratios.min_load,
+                     result.ratios.avg_load, result.ratios.max_load);
+      }
+      break;
+    case OutputStyle::kBenchmark: {
+      absl::PrintF("{\n");
+      absl::PrintF("  \"benchmarks\": [\n");
+      absl::string_view comma;
+      for (const auto& result : results) {
+        auto print = [&](absl::string_view stat, double Ratios::*val) {
+          std::string name =
+              absl::StrCat(result.name, "/", result.dist_name, "/", stat);
+          // Check the regex again. We might had have enabled only one of the
+          // stats for the benchmark.
+          if (!CanRunBenchmark(name)) return;
+          absl::PrintF("    %s{\n", comma);
+          absl::PrintF("      \"cpu_time\": %f,\n", 1e9 * result.ratios.*val);
+          absl::PrintF("      \"real_time\": %f,\n", 1e9 * result.ratios.*val);
+          absl::PrintF("      \"iterations\": 1,\n");
+          absl::PrintF("      \"name\": \"%s\",\n", name);
+          absl::PrintF("      \"time_unit\": \"ns\"\n");
+          absl::PrintF("    }\n");
+          comma = ",";
+        };
+        print("min", &Ratios::min_load);
+        print("avg", &Ratios::avg_load);
+        print("max", &Ratios::max_load);
+      }
+      absl::PrintF("  ],\n");
+      absl::PrintF("  \"context\": {\n");
+      absl::PrintF("  }\n");
+      absl::PrintF("}\n");
+      break;
+    }
+  }
+
+  return 0;
+}
diff --git a/third_party/abseil-cpp/absl/flags/BUILD.bazel b/third_party/abseil-cpp/absl/flags/BUILD.bazel
index 2bd9478..78d6da7 100644
--- a/third_party/abseil-cpp/absl/flags/BUILD.bazel
+++ b/third_party/abseil-cpp/absl/flags/BUILD.bazel
@@ -416,6 +416,7 @@
         ":flag",
         ":parse",
         ":reflection",
+        ":usage_internal",
         "//absl/base:raw_logging_internal",
         "//absl/base:scoped_set_env",
         "//absl/strings",
diff --git a/third_party/abseil-cpp/absl/flags/BUILD.gn b/third_party/abseil-cpp/absl/flags/BUILD.gn
index 8fa0603..e9f67df 100644
--- a/third_party/abseil-cpp/absl/flags/BUILD.gn
+++ b/third_party/abseil-cpp/absl/flags/BUILD.gn
@@ -26,8 +26,16 @@
   visibility = [ ":*" ]
 }
 
+# Since absl/flags are only used by some test binaries (e.g. in WebRTC),
+# there is no need to strip flags from mobile platforms binaries.
+# This does not affect Chromium.
+config("absl_flags_config") {
+  defines = [ "ABSL_FLAGS_STRIP_NAMES=0" ]
+}
+
 absl_source_set("config") {
   sources = [ "usage_config.cc" ]
+  public_configs = [ ":absl_flags_config" ]
   public = [
     "config.h",
     "usage_config.h",
diff --git a/third_party/abseil-cpp/absl/flags/CMakeLists.txt b/third_party/abseil-cpp/absl/flags/CMakeLists.txt
index 8855191..e5083d7 100644
--- a/third_party/abseil-cpp/absl/flags/CMakeLists.txt
+++ b/third_party/abseil-cpp/absl/flags/CMakeLists.txt
@@ -366,6 +366,7 @@
     absl::flags
     absl::flags_parse
     absl::flags_reflection
+    absl::flags_usage_internal
     absl::raw_logging_internal
     absl::scoped_set_env
     absl::span
diff --git a/third_party/abseil-cpp/absl/flags/internal/commandlineflag.h b/third_party/abseil-cpp/absl/flags/internal/commandlineflag.h
index cb46fe2..ebfe81b 100644
--- a/third_party/abseil-cpp/absl/flags/internal/commandlineflag.h
+++ b/third_party/abseil-cpp/absl/flags/internal/commandlineflag.h
@@ -24,7 +24,7 @@
 namespace flags_internal {
 
 // An alias for flag fast type id. This value identifies the flag value type
-// simialarly to typeid(T), without relying on RTTI being available. In most
+// similarly to typeid(T), without relying on RTTI being available. In most
 // cases this id is enough to uniquely identify the flag's value type. In a few
 // cases we'll have to resort to using actual RTTI implementation if it is
 // available.
diff --git a/third_party/abseil-cpp/absl/flags/internal/usage.cc b/third_party/abseil-cpp/absl/flags/internal/usage.cc
index 7557322..f29d7c9 100644
--- a/third_party/abseil-cpp/absl/flags/internal/usage.cc
+++ b/third_party/abseil-cpp/absl/flags/internal/usage.cc
@@ -37,26 +37,26 @@
 #include "absl/strings/str_split.h"
 #include "absl/strings/string_view.h"
 
-ABSL_FLAG(bool, help, false,
-          "show help on important flags for this binary [tip: all flags can "
-          "have two dashes]");
-ABSL_FLAG(bool, helpfull, false, "show help on all flags");
-ABSL_FLAG(bool, helpshort, false,
-          "show help on only the main module for this program");
-ABSL_FLAG(bool, helppackage, false,
-          "show help on all modules in the main package");
-ABSL_FLAG(bool, version, false, "show version and build info and exit");
-ABSL_FLAG(bool, only_check_args, false, "exit after checking all flags");
-ABSL_FLAG(std::string, helpon, "",
-          "show help on the modules named by this flag value");
-ABSL_FLAG(std::string, helpmatch, "",
-          "show help on modules whose name contains the specified substr");
+// Dummy global variables to prevent anyone else defining these.
+bool FLAGS_help = false;
+bool FLAGS_helpfull = false;
+bool FLAGS_helpshort = false;
+bool FLAGS_helppackage = false;
+bool FLAGS_version = false;
+bool FLAGS_only_check_args = false;
+bool FLAGS_helpon = false;
+bool FLAGS_helpmatch = false;
 
 namespace absl {
 ABSL_NAMESPACE_BEGIN
 namespace flags_internal {
 namespace {
 
+using PerFlagFilter = std::function<bool(const absl::CommandLineFlag&)>;
+
+// Maximum length size in a human readable format.
+constexpr size_t kHrfMaxLineLength = 80;
+
 // This class is used to emit an XML element with `tag` and `text`.
 // It adds opening and closing tags and escapes special characters in the text.
 // For example:
@@ -109,9 +109,12 @@
  public:
   // Pretty printer holds on to the std::ostream& reference to direct an output
   // to that stream.
-  FlagHelpPrettyPrinter(int max_line_len, std::ostream& out)
+  FlagHelpPrettyPrinter(size_t max_line_len, size_t min_line_len,
+                        size_t wrapped_line_indent, std::ostream& out)
       : out_(out),
         max_line_len_(max_line_len),
+        min_line_len_(min_line_len),
+        wrapped_line_indent_(wrapped_line_indent),
         line_len_(0),
         first_line_(true) {}
 
@@ -165,13 +168,12 @@
 
   void StartLine() {
     if (first_line_) {
-      out_ << "    ";
-      line_len_ = 4;
+      line_len_ = min_line_len_;
       first_line_ = false;
     } else {
-      out_ << "      ";
-      line_len_ = 6;
+      line_len_ = min_line_len_ + wrapped_line_indent_;
     }
+    out_ << std::string(line_len_, ' ');
   }
   void EndLine() {
     out_ << '\n';
@@ -180,13 +182,15 @@
 
  private:
   std::ostream& out_;
-  const int max_line_len_;
-  int line_len_;
+  const size_t max_line_len_;
+  const size_t min_line_len_;
+  const size_t wrapped_line_indent_;
+  size_t line_len_;
   bool first_line_;
 };
 
 void FlagHelpHumanReadable(const CommandLineFlag& flag, std::ostream& out) {
-  FlagHelpPrettyPrinter printer(80, out);  // Max line length is 80.
+  FlagHelpPrettyPrinter printer(kHrfMaxLineLength, 4, 2, out);
 
   // Flag name.
   printer.Write(absl::StrCat("--", flag.Name()));
@@ -222,7 +226,7 @@
 // If a flag's help message has been stripped (e.g. by adding '#define
 // STRIP_FLAG_HELP 1' then this flag will not be displayed by '--help'
 // and its variants.
-void FlagsHelpImpl(std::ostream& out, flags_internal::FlagKindFilter filter_cb,
+void FlagsHelpImpl(std::ostream& out, PerFlagFilter filter_cb,
                    HelpFormat format, absl::string_view program_usage_message) {
   if (format == HelpFormat::kHumanReadable) {
     out << flags_internal::ShortProgramInvocationName() << ": "
@@ -257,10 +261,10 @@
     // If the flag has been stripped, pretend that it doesn't exist.
     if (flag.Help() == flags_internal::kStrippedFlagHelp) return;
 
-    std::string flag_filename = flag.Filename();
-
     // Make sure flag satisfies the filter
-    if (!filter_cb || !filter_cb(flag_filename)) return;
+    if (!filter_cb(flag)) return;
+
+    std::string flag_filename = flag.Filename();
 
     matching_flags[std::string(flags_internal::Package(flag_filename))]
                   [flag_filename]
@@ -290,15 +294,34 @@
   }
 
   if (format == HelpFormat::kHumanReadable) {
+    FlagHelpPrettyPrinter printer(kHrfMaxLineLength, 0, 0, out);
+
     if (filter_cb && matching_flags.empty()) {
-      out << "  No modules matched: use -helpfull\n";
+      printer.Write("No flags matched.\n", true);
     }
+    printer.EndLine();
+    printer.Write(
+        "Try --helpfull to get a list of all flags or --help=substring "
+        "shows help for flags which include specified substring in either "
+        "in the name, or description or path.\n",
+        true);
   } else {
     // The end of the document.
     out << "</AllFlags>\n";
   }
 }
 
+void FlagsHelpImpl(std::ostream& out,
+                   flags_internal::FlagKindFilter filename_filter_cb,
+                   HelpFormat format, absl::string_view program_usage_message) {
+  FlagsHelpImpl(
+      out,
+      [&](const absl::CommandLineFlag& flag) {
+        return filename_filter_cb && filename_filter_cb(flag.Filename());
+      },
+      format, program_usage_message);
+}
+
 }  // namespace
 
 // --------------------------------------------------------------------
@@ -310,7 +333,7 @@
 }
 
 // --------------------------------------------------------------------
-// Produces the help messages for all flags matching the filter.
+// Produces the help messages for all flags matching the filename filter.
 // If filter is empty produces help messages for all flags.
 void FlagsHelp(std::ostream& out, absl::string_view filter, HelpFormat format,
                absl::string_view program_usage_message) {
@@ -325,68 +348,177 @@
 // If so, handles them appropriately.
 int HandleUsageFlags(std::ostream& out,
                      absl::string_view program_usage_message) {
-  if (absl::GetFlag(FLAGS_helpshort)) {
-    flags_internal::FlagsHelpImpl(
-        out, flags_internal::GetUsageConfig().contains_helpshort_flags,
-        HelpFormat::kHumanReadable, program_usage_message);
-    return 1;
-  }
+  switch (GetFlagsHelpMode()) {
+    case HelpMode::kNone:
+      break;
+    case HelpMode::kImportant:
+      flags_internal::FlagsHelpImpl(
+          out, flags_internal::GetUsageConfig().contains_help_flags,
+          GetFlagsHelpFormat(), program_usage_message);
+      return 1;
 
-  if (absl::GetFlag(FLAGS_helpfull)) {
-    // show all options
-    flags_internal::FlagsHelp(out, "", HelpFormat::kHumanReadable,
-                              program_usage_message);
-    return 1;
-  }
+    case HelpMode::kShort:
+      flags_internal::FlagsHelpImpl(
+          out, flags_internal::GetUsageConfig().contains_helpshort_flags,
+          GetFlagsHelpFormat(), program_usage_message);
+      return 1;
 
-  if (!absl::GetFlag(FLAGS_helpon).empty()) {
-    flags_internal::FlagsHelp(
-        out, absl::StrCat("/", absl::GetFlag(FLAGS_helpon), "."),
-        HelpFormat::kHumanReadable, program_usage_message);
-    return 1;
-  }
+    case HelpMode::kFull:
+      flags_internal::FlagsHelp(out, "", GetFlagsHelpFormat(),
+                                program_usage_message);
+      return 1;
 
-  if (!absl::GetFlag(FLAGS_helpmatch).empty()) {
-    flags_internal::FlagsHelp(out, absl::GetFlag(FLAGS_helpmatch),
-                              HelpFormat::kHumanReadable,
-                              program_usage_message);
-    return 1;
-  }
+    case HelpMode::kPackage:
+      flags_internal::FlagsHelpImpl(
+          out, flags_internal::GetUsageConfig().contains_helppackage_flags,
+          GetFlagsHelpFormat(), program_usage_message);
 
-  if (absl::GetFlag(FLAGS_help)) {
-    flags_internal::FlagsHelpImpl(
-        out, flags_internal::GetUsageConfig().contains_help_flags,
-        HelpFormat::kHumanReadable, program_usage_message);
+      return 1;
 
-    out << "\nTry --helpfull to get a list of all flags.\n";
+    case HelpMode::kMatch: {
+      std::string substr = GetFlagsHelpMatchSubstr();
+      if (substr.empty()) {
+        // show all options
+        flags_internal::FlagsHelp(out, substr, GetFlagsHelpFormat(),
+                                  program_usage_message);
+      } else {
+        auto filter_cb = [&substr](const absl::CommandLineFlag& flag) {
+          if (absl::StrContains(flag.Name(), substr)) return true;
+          if (absl::StrContains(flag.Filename(), substr)) return true;
+          if (absl::StrContains(flag.Help(), substr)) return true;
 
-    return 1;
-  }
+          return false;
+        };
+        flags_internal::FlagsHelpImpl(
+            out, filter_cb, HelpFormat::kHumanReadable, program_usage_message);
+      }
 
-  if (absl::GetFlag(FLAGS_helppackage)) {
-    flags_internal::FlagsHelpImpl(
-        out, flags_internal::GetUsageConfig().contains_helppackage_flags,
-        HelpFormat::kHumanReadable, program_usage_message);
+      return 1;
+    }
+    case HelpMode::kVersion:
+      if (flags_internal::GetUsageConfig().version_string)
+        out << flags_internal::GetUsageConfig().version_string();
+      // Unlike help, we may be asking for version in a script, so return 0
+      return 0;
 
-    out << "\nTry --helpfull to get a list of all flags.\n";
-
-    return 1;
-  }
-
-  if (absl::GetFlag(FLAGS_version)) {
-    if (flags_internal::GetUsageConfig().version_string)
-      out << flags_internal::GetUsageConfig().version_string();
-    // Unlike help, we may be asking for version in a script, so return 0
-    return 0;
-  }
-
-  if (absl::GetFlag(FLAGS_only_check_args)) {
-    return 0;
+    case HelpMode::kOnlyCheckArgs:
+      return 0;
   }
 
   return -1;
 }
 
+// --------------------------------------------------------------------
+// Globals representing usage reporting flags
+
+namespace {
+
+ABSL_CONST_INIT absl::Mutex help_attributes_guard(absl::kConstInit);
+ABSL_CONST_INIT std::string* match_substr
+    ABSL_GUARDED_BY(help_attributes_guard) = nullptr;
+ABSL_CONST_INIT HelpMode help_mode ABSL_GUARDED_BY(help_attributes_guard) =
+    HelpMode::kNone;
+ABSL_CONST_INIT HelpFormat help_format ABSL_GUARDED_BY(help_attributes_guard) =
+    HelpFormat::kHumanReadable;
+
+}  // namespace
+
+std::string GetFlagsHelpMatchSubstr() {
+  absl::MutexLock l(&help_attributes_guard);
+  if (match_substr == nullptr) return "";
+  return *match_substr;
+}
+
+void SetFlagsHelpMatchSubstr(absl::string_view substr) {
+  absl::MutexLock l(&help_attributes_guard);
+  if (match_substr == nullptr) match_substr = new std::string;
+  match_substr->assign(substr.data(), substr.size());
+}
+
+HelpMode GetFlagsHelpMode() {
+  absl::MutexLock l(&help_attributes_guard);
+  // Refer to dummy variales to prevent linker dropping them
+  if (FLAGS_help || FLAGS_helpfull || FLAGS_helpshort || FLAGS_helppackage ||
+      FLAGS_version || FLAGS_only_check_args || FLAGS_helpon ||
+      FLAGS_helpmatch) {
+    help_mode = HelpMode::kNone;
+  }
+  return help_mode;
+}
+
+void SetFlagsHelpMode(HelpMode mode) {
+  absl::MutexLock l(&help_attributes_guard);
+  help_mode = mode;
+}
+
+HelpFormat GetFlagsHelpFormat() {
+  absl::MutexLock l(&help_attributes_guard);
+  return help_format;
+}
+
+void SetFlagsHelpFormat(HelpFormat format) {
+  absl::MutexLock l(&help_attributes_guard);
+  help_format = format;
+}
+
+// Deduces usage flags from the input argument in a form --name=value or
+// --name. argument is already split into name and value before we call this
+// function.
+bool DeduceUsageFlags(absl::string_view name, absl::string_view value) {
+  if (absl::ConsumePrefix(&name, "help")) {
+    if (name == "") {
+      if (value.empty()) {
+        SetFlagsHelpMode(HelpMode::kImportant);
+      } else {
+        SetFlagsHelpMode(HelpMode::kMatch);
+        SetFlagsHelpMatchSubstr(value);
+      }
+      return true;
+    }
+
+    if (name == "match") {
+      SetFlagsHelpMode(HelpMode::kMatch);
+      SetFlagsHelpMatchSubstr(value);
+      return true;
+    }
+
+    if (name == "on") {
+      SetFlagsHelpMode(HelpMode::kMatch);
+      SetFlagsHelpMatchSubstr(absl::StrCat("/", value, "."));
+      return true;
+    }
+
+    if (name == "full") {
+      SetFlagsHelpMode(HelpMode::kFull);
+      return true;
+    }
+
+    if (name == "short") {
+      SetFlagsHelpMode(HelpMode::kShort);
+      return true;
+    }
+
+    if (name == "package") {
+      SetFlagsHelpMode(HelpMode::kPackage);
+      return true;
+    }
+
+    return false;
+  }
+
+  if (name == "version") {
+    SetFlagsHelpMode(HelpMode::kVersion);
+    return true;
+  }
+
+  if (name == "only_check_args") {
+    SetFlagsHelpMode(HelpMode::kOnlyCheckArgs);
+    return true;
+  }
+
+  return false;
+}
+
 }  // namespace flags_internal
 ABSL_NAMESPACE_END
 }  // namespace absl
diff --git a/third_party/abseil-cpp/absl/flags/internal/usage.h b/third_party/abseil-cpp/absl/flags/internal/usage.h
index 619ccce..c0bcac5 100644
--- a/third_party/abseil-cpp/absl/flags/internal/usage.h
+++ b/third_party/abseil-cpp/absl/flags/internal/usage.h
@@ -66,17 +66,39 @@
 int HandleUsageFlags(std::ostream& out,
                      absl::string_view program_usage_message);
 
+// --------------------------------------------------------------------
+// Globals representing usage reporting flags
+
+enum class HelpMode {
+  kNone,
+  kImportant,
+  kShort,
+  kFull,
+  kPackage,
+  kMatch,
+  kVersion,
+  kOnlyCheckArgs
+};
+
+// Returns substring to filter help output (--help=substr argument)
+std::string GetFlagsHelpMatchSubstr();
+// Returns the requested help mode.
+HelpMode GetFlagsHelpMode();
+// Returns the requested help format.
+HelpFormat GetFlagsHelpFormat();
+
+// These are corresponding setters to the attributes above.
+void SetFlagsHelpMatchSubstr(absl::string_view);
+void SetFlagsHelpMode(HelpMode);
+void SetFlagsHelpFormat(HelpFormat);
+
+// Deduces usage flags from the input argument in a form --name=value or
+// --name. argument is already split into name and value before we call this
+// function.
+bool DeduceUsageFlags(absl::string_view name, absl::string_view value);
+
 }  // namespace flags_internal
 ABSL_NAMESPACE_END
 }  // namespace absl
 
-ABSL_DECLARE_FLAG(bool, help);
-ABSL_DECLARE_FLAG(bool, helpfull);
-ABSL_DECLARE_FLAG(bool, helpshort);
-ABSL_DECLARE_FLAG(bool, helppackage);
-ABSL_DECLARE_FLAG(bool, version);
-ABSL_DECLARE_FLAG(bool, only_check_args);
-ABSL_DECLARE_FLAG(std::string, helpon);
-ABSL_DECLARE_FLAG(std::string, helpmatch);
-
 #endif  // ABSL_FLAGS_INTERNAL_USAGE_H_
diff --git a/third_party/abseil-cpp/absl/flags/internal/usage_test.cc b/third_party/abseil-cpp/absl/flags/internal/usage_test.cc
index 6e583fb..b5c2487 100644
--- a/third_party/abseil-cpp/absl/flags/internal/usage_test.cc
+++ b/third_party/abseil-cpp/absl/flags/internal/usage_test.cc
@@ -87,6 +87,11 @@
     default_config.normalize_filename = &NormalizeFileName;
     absl::SetFlagsUsageConfig(default_config);
   }
+  ~UsageReportingTest() override {
+    flags::SetFlagsHelpMode(flags::HelpMode::kNone);
+    flags::SetFlagsHelpMatchSubstr("");
+    flags::SetFlagsHelpFormat(flags::HelpFormat::kHumanReadable);
+  }
 
  private:
   absl::FlagSaver flag_saver_;
@@ -191,6 +196,10 @@
       Some more help.
       Even more long long long long long long long long long long long long help
       message.); default: "";
+
+Try --helpfull to get a list of all flags or --help=substring shows help for
+flags which include specified substring in either in the name, or description or
+path.
 )";
 
   std::stringstream test_buf_01;
@@ -214,7 +223,11 @@
   EXPECT_EQ(test_buf_04.str(),
             R"(usage_test: Custom usage message
 
-  No modules matched: use -helpfull
+No flags matched.
+
+Try --helpfull to get a list of all flags or --help=substring shows help for
+flags which include specified substring in either in the name, or description or
+path.
 )");
 
   std::stringstream test_buf_05;
@@ -226,12 +239,8 @@
       absl::StartsWith(test_out_str, "usage_test: Custom usage message"));
   EXPECT_TRUE(absl::StrContains(
       test_out_str, "Flags from absl/flags/internal/usage_test.cc:"));
-  EXPECT_TRUE(absl::StrContains(test_out_str,
-                                "Flags from absl/flags/internal/usage.cc:"));
   EXPECT_TRUE(
       absl::StrContains(test_out_str, "-usage_reporting_test_flag_01 "));
-  EXPECT_TRUE(absl::StrContains(test_out_str, "-help (show help"))
-      << test_out_str;
 }
 
 // --------------------------------------------------------------------
@@ -244,7 +253,7 @@
 // --------------------------------------------------------------------
 
 TEST_F(UsageReportingTest, TestUsageFlag_helpshort) {
-  absl::SetFlag(&FLAGS_helpshort, true);
+  flags::SetFlagsHelpMode(flags::HelpMode::kShort);
 
   std::stringstream test_buf;
   EXPECT_EQ(flags::HandleUsageFlags(test_buf, kTestUsageMessage), 1);
@@ -267,13 +276,17 @@
       Some more help.
       Even more long long long long long long long long long long long long help
       message.); default: "";
+
+Try --helpfull to get a list of all flags or --help=substring shows help for
+flags which include specified substring in either in the name, or description or
+path.
 )");
 }
 
 // --------------------------------------------------------------------
 
-TEST_F(UsageReportingTest, TestUsageFlag_help) {
-  absl::SetFlag(&FLAGS_help, true);
+TEST_F(UsageReportingTest, TestUsageFlag_help_simple) {
+  flags::SetFlagsHelpMode(flags::HelpMode::kImportant);
 
   std::stringstream test_buf;
   EXPECT_EQ(flags::HandleUsageFlags(test_buf, kTestUsageMessage), 1);
@@ -297,14 +310,74 @@
       Even more long long long long long long long long long long long long help
       message.); default: "";
 
-Try --helpfull to get a list of all flags.
+Try --helpfull to get a list of all flags or --help=substring shows help for
+flags which include specified substring in either in the name, or description or
+path.
+)");
+}
+
+// --------------------------------------------------------------------
+
+TEST_F(UsageReportingTest, TestUsageFlag_help_one_flag) {
+  flags::SetFlagsHelpMode(flags::HelpMode::kMatch);
+  flags::SetFlagsHelpMatchSubstr("usage_reporting_test_flag_06");
+
+  std::stringstream test_buf;
+  EXPECT_EQ(flags::HandleUsageFlags(test_buf, kTestUsageMessage), 1);
+  EXPECT_EQ(test_buf.str(),
+            R"(usage_test: Custom usage message
+
+  Flags from absl/flags/internal/usage_test.cc:
+    --usage_reporting_test_flag_06 (usage_reporting_test_flag_06 help message.
+
+      Some more help.
+      Even more long long long long long long long long long long long long help
+      message.); default: "";
+
+Try --helpfull to get a list of all flags or --help=substring shows help for
+flags which include specified substring in either in the name, or description or
+path.
+)");
+}
+
+// --------------------------------------------------------------------
+
+TEST_F(UsageReportingTest, TestUsageFlag_help_multiple_flag) {
+  flags::SetFlagsHelpMode(flags::HelpMode::kMatch);
+  flags::SetFlagsHelpMatchSubstr("test_flag");
+
+  std::stringstream test_buf;
+  EXPECT_EQ(flags::HandleUsageFlags(test_buf, kTestUsageMessage), 1);
+  EXPECT_EQ(test_buf.str(),
+            R"(usage_test: Custom usage message
+
+  Flags from absl/flags/internal/usage_test.cc:
+    --usage_reporting_test_flag_01 (usage_reporting_test_flag_01 help message);
+      default: 101;
+    --usage_reporting_test_flag_02 (usage_reporting_test_flag_02 help message);
+      default: false;
+    --usage_reporting_test_flag_03 (usage_reporting_test_flag_03 help message);
+      default: 1.03;
+    --usage_reporting_test_flag_04 (usage_reporting_test_flag_04 help message);
+      default: 1000000000000004;
+    --usage_reporting_test_flag_05 (usage_reporting_test_flag_05 help message);
+      default: UDT{};
+    --usage_reporting_test_flag_06 (usage_reporting_test_flag_06 help message.
+
+      Some more help.
+      Even more long long long long long long long long long long long long help
+      message.); default: "";
+
+Try --helpfull to get a list of all flags or --help=substring shows help for
+flags which include specified substring in either in the name, or description or
+path.
 )");
 }
 
 // --------------------------------------------------------------------
 
 TEST_F(UsageReportingTest, TestUsageFlag_helppackage) {
-  absl::SetFlag(&FLAGS_helppackage, true);
+  flags::SetFlagsHelpMode(flags::HelpMode::kPackage);
 
   std::stringstream test_buf;
   EXPECT_EQ(flags::HandleUsageFlags(test_buf, kTestUsageMessage), 1);
@@ -328,14 +401,16 @@
       Even more long long long long long long long long long long long long help
       message.); default: "";
 
-Try --helpfull to get a list of all flags.
+Try --helpfull to get a list of all flags or --help=substring shows help for
+flags which include specified substring in either in the name, or description or
+path.
 )");
 }
 
 // --------------------------------------------------------------------
 
 TEST_F(UsageReportingTest, TestUsageFlag_version) {
-  absl::SetFlag(&FLAGS_version, true);
+  flags::SetFlagsHelpMode(flags::HelpMode::kVersion);
 
   std::stringstream test_buf;
   EXPECT_EQ(flags::HandleUsageFlags(test_buf, kTestUsageMessage), 0);
@@ -349,7 +424,7 @@
 // --------------------------------------------------------------------
 
 TEST_F(UsageReportingTest, TestUsageFlag_only_check_args) {
-  absl::SetFlag(&FLAGS_only_check_args, true);
+  flags::SetFlagsHelpMode(flags::HelpMode::kOnlyCheckArgs);
 
   std::stringstream test_buf;
   EXPECT_EQ(flags::HandleUsageFlags(test_buf, kTestUsageMessage), 0);
@@ -359,17 +434,22 @@
 // --------------------------------------------------------------------
 
 TEST_F(UsageReportingTest, TestUsageFlag_helpon) {
-  absl::SetFlag(&FLAGS_helpon, "bla-bla");
+  flags::SetFlagsHelpMode(flags::HelpMode::kMatch);
+  flags::SetFlagsHelpMatchSubstr("/bla-bla.");
 
   std::stringstream test_buf_01;
   EXPECT_EQ(flags::HandleUsageFlags(test_buf_01, kTestUsageMessage), 1);
   EXPECT_EQ(test_buf_01.str(),
             R"(usage_test: Custom usage message
 
-  No modules matched: use -helpfull
+No flags matched.
+
+Try --helpfull to get a list of all flags or --help=substring shows help for
+flags which include specified substring in either in the name, or description or
+path.
 )");
 
-  absl::SetFlag(&FLAGS_helpon, "usage_test");
+  flags::SetFlagsHelpMatchSubstr("/usage_test.");
 
   std::stringstream test_buf_02;
   EXPECT_EQ(flags::HandleUsageFlags(test_buf_02, kTestUsageMessage), 1);
@@ -392,6 +472,10 @@
       Some more help.
       Even more long long long long long long long long long long long long help
       message.); default: "";
+
+Try --helpfull to get a list of all flags or --help=substring shows help for
+flags which include specified substring in either in the name, or description or
+path.
 )");
 }
 
diff --git a/third_party/abseil-cpp/absl/flags/parse.cc b/third_party/abseil-cpp/absl/flags/parse.cc
index 1835a83..dd1a679 100644
--- a/third_party/abseil-cpp/absl/flags/parse.cc
+++ b/third_party/abseil-cpp/absl/flags/parse.cc
@@ -713,6 +713,11 @@
     std::tie(flag, is_negative) = LocateFlag(flag_name);
 
     if (flag == nullptr) {
+      // Usage flags are not modeled as Abseil flags. Locate them separately.
+      if (flags_internal::DeduceUsageFlags(flag_name, value)) {
+        continue;
+      }
+
       if (on_undef_flag != OnUndefinedFlag::kIgnoreUndefined) {
         undefined_flag_names.emplace_back(arg_from_argv,
                                           std::string(flag_name));
diff --git a/third_party/abseil-cpp/absl/flags/parse_test.cc b/third_party/abseil-cpp/absl/flags/parse_test.cc
index d35a6e4..41bc0bc 100644
--- a/third_party/abseil-cpp/absl/flags/parse_test.cc
+++ b/third_party/abseil-cpp/absl/flags/parse_test.cc
@@ -28,6 +28,7 @@
 #include "absl/flags/declare.h"
 #include "absl/flags/flag.h"
 #include "absl/flags/internal/parse.h"
+#include "absl/flags/internal/usage.h"
 #include "absl/flags/reflection.h"
 #include "absl/strings/str_cat.h"
 #include "absl/strings/string_view.h"
@@ -207,6 +208,9 @@
 using testing::ElementsAreArray;
 
 class ParseTest : public testing::Test {
+ public:
+  ~ParseTest() override { flags::SetFlagsHelpMode(flags::HelpMode::kNone); }
+
  private:
   absl::FlagSaver flag_saver_;
 };
@@ -851,7 +855,7 @@
 
 // --------------------------------------------------------------------
 
-TEST_F(ParseDeathTest, TestHelpFlagHandling) {
+TEST_F(ParseDeathTest, TestSimpleHelpFlagHandling) {
   const char* in_args1[] = {
       "testbin",
       "--help",
@@ -870,11 +874,38 @@
       flags::UsageFlagsAction::kIgnoreUsage,
       flags::OnUndefinedFlag::kAbortIfUndefined);
 
+  EXPECT_EQ(flags::GetFlagsHelpMode(), flags::HelpMode::kImportant);
   EXPECT_EQ(absl::GetFlag(FLAGS_int_flag), 3);
 }
 
 // --------------------------------------------------------------------
 
+TEST_F(ParseDeathTest, TestSubstringHelpFlagHandling) {
+  const char* in_args1[] = {
+      "testbin",
+      "--help=abcd",
+  };
+
+  auto out_args1 = flags::ParseCommandLineImpl(
+      2, const_cast<char**>(in_args1), flags::ArgvListAction::kRemoveParsedArgs,
+      flags::UsageFlagsAction::kIgnoreUsage,
+      flags::OnUndefinedFlag::kAbortIfUndefined);
+
+  EXPECT_EQ(flags::GetFlagsHelpMode(), flags::HelpMode::kMatch);
+  EXPECT_EQ(flags::GetFlagsHelpMatchSubstr(), "abcd");
+
+  const char* in_args2[] = {"testbin", "--help", "some_positional_arg"};
+
+  auto out_args2 = flags::ParseCommandLineImpl(
+      3, const_cast<char**>(in_args2), flags::ArgvListAction::kRemoveParsedArgs,
+      flags::UsageFlagsAction::kIgnoreUsage,
+      flags::OnUndefinedFlag::kAbortIfUndefined);
+
+  EXPECT_EQ(flags::GetFlagsHelpMode(), flags::HelpMode::kImportant);
+}
+
+// --------------------------------------------------------------------
+
 TEST_F(ParseTest, WasPresentOnCommandLine) {
   const char* in_args1[] = {
       "testbin",        "arg1", "--bool_flag",
diff --git a/third_party/abseil-cpp/absl/flags/reflection_test.cc b/third_party/abseil-cpp/absl/flags/reflection_test.cc
index 8620d14..4c80900 100644
--- a/third_party/abseil-cpp/absl/flags/reflection_test.cc
+++ b/third_party/abseil-cpp/absl/flags/reflection_test.cc
@@ -32,8 +32,6 @@
 ABSL_FLAG(std::string, string_flag, "dflt", "string_flag help");
 ABSL_RETIRED_FLAG(bool, bool_retired_flag, false, "bool_retired_flag help");
 
-ABSL_DECLARE_FLAG(bool, help);
-
 namespace {
 
 namespace flags = absl::flags_internal;
@@ -66,12 +64,9 @@
 // --------------------------------------------------------------------
 
 TEST_F(ReflectionTest, TestGetAllFlags) {
-  (void)absl::GetFlag(FLAGS_help);  // Force linking of usage flags.
-
   auto all_flags = absl::GetAllFlags();
   EXPECT_NE(all_flags.find("int_flag"), all_flags.end());
   EXPECT_EQ(all_flags.find("bool_retired_flag"), all_flags.end());
-  EXPECT_NE(all_flags.find("help"), all_flags.end());
   EXPECT_EQ(all_flags.find("some_undefined_flag"), all_flags.end());
 
   std::vector<absl::string_view> flag_names_first_attempt;
diff --git a/third_party/abseil-cpp/absl/hash/BUILD.bazel b/third_party/abseil-cpp/absl/hash/BUILD.bazel
index 5b1e2d0..acd490b 100644
--- a/third_party/abseil-cpp/absl/hash/BUILD.bazel
+++ b/third_party/abseil-cpp/absl/hash/BUILD.bazel
@@ -37,6 +37,7 @@
     linkopts = ABSL_DEFAULT_LINKOPTS,
     deps = [
         ":city",
+        ":wyhash",
         "//absl/base:core_headers",
         "//absl/base:endian",
         "//absl/container:fixed_array",
@@ -81,6 +82,24 @@
     ],
 )
 
+cc_binary(
+    name = "hash_benchmark",
+    testonly = 1,
+    srcs = ["hash_benchmark.cc"],
+    copts = ABSL_TEST_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    tags = ["benchmark"],
+    visibility = ["//visibility:private"],
+    deps = [
+        ":hash",
+        "//absl/base:core_headers",
+        "//absl/random",
+        "//absl/strings:cord",
+        "//absl/strings:cord_test_helpers",
+        "@com_github_google_benchmark//:benchmark_main",
+    ],
+)
+
 cc_library(
     name = "spy_hash_state",
     testonly = 1,
@@ -120,3 +139,30 @@
         "@com_google_googletest//:gtest_main",
     ],
 )
+
+cc_library(
+    name = "wyhash",
+    srcs = ["internal/wyhash.cc"],
+    hdrs = ["internal/wyhash.h"],
+    copts = ABSL_DEFAULT_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    visibility = ["//visibility:private"],
+    deps = [
+        "//absl/base:config",
+        "//absl/base:endian",
+        "//absl/numeric:int128",
+    ],
+)
+
+cc_test(
+    name = "wyhash_test",
+    srcs = ["internal/wyhash_test.cc"],
+    copts = ABSL_TEST_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    visibility = ["//visibility:private"],
+    deps = [
+        ":wyhash",
+        "//absl/strings",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
diff --git a/third_party/abseil-cpp/absl/hash/BUILD.gn b/third_party/abseil-cpp/absl/hash/BUILD.gn
index ca4a05b..7a69e67 100644
--- a/third_party/abseil-cpp/absl/hash/BUILD.gn
+++ b/third_party/abseil-cpp/absl/hash/BUILD.gn
@@ -13,6 +13,7 @@
   public = [ "hash.h" ]
   deps = [
     ":city",
+    ":wyhash",
     "//third_party/abseil-cpp/absl/base:core_headers",
     "//third_party/abseil-cpp/absl/base:endian",
     "//third_party/abseil-cpp/absl/container:fixed_array",
@@ -57,3 +58,14 @@
     "//third_party/abseil-cpp/absl/base:endian",
   ]
 }
+
+absl_source_set("wyhash") {
+  public = [ "internal/wyhash.h" ]
+  sources = [ "internal/wyhash.cc" ]
+  deps = [
+    "//third_party/abseil-cpp/absl/base:config",
+    "//third_party/abseil-cpp/absl/base:endian",
+    "//third_party/abseil-cpp/absl/numeric:int128",
+  ]
+  visibility = [ ":*" ]
+}
diff --git a/third_party/abseil-cpp/absl/hash/CMakeLists.txt b/third_party/abseil-cpp/absl/hash/CMakeLists.txt
index 61365e9..6d19877 100644
--- a/third_party/abseil-cpp/absl/hash/CMakeLists.txt
+++ b/third_party/abseil-cpp/absl/hash/CMakeLists.txt
@@ -24,7 +24,8 @@
     "internal/hash.h"
   COPTS
     ${ABSL_DEFAULT_COPTS}
-  DEPS
+    DEPS
+    absl::city
     absl::core_headers
     absl::endian
     absl::fixed_array
@@ -34,7 +35,7 @@
     absl::optional
     absl::variant
     absl::utility
-    absl::city
+    absl::wyhash
   PUBLIC
 )
 
@@ -114,3 +115,30 @@
     gmock_main
 )
 
+absl_cc_library(
+  NAME
+    wyhash
+  HDRS
+    "internal/wyhash.h"
+  SRCS
+    "internal/wyhash.cc"
+  COPTS
+    ${ABSL_DEFAULT_COPTS}
+  DEPS
+    absl::config
+    absl::endian
+    absl::int128
+)
+
+absl_cc_test(
+  NAME
+    wyhash_test
+  SRCS
+    "internal/wyhash_test.cc"
+  COPTS
+    ${ABSL_TEST_COPTS}
+  DEPS
+    absl::wyhash
+    absl::strings
+    gmock_main
+)
diff --git a/third_party/abseil-cpp/absl/hash/hash_benchmark.cc b/third_party/abseil-cpp/absl/hash/hash_benchmark.cc
new file mode 100644
index 0000000..27e5271
--- /dev/null
+++ b/third_party/abseil-cpp/absl/hash/hash_benchmark.cc
@@ -0,0 +1,249 @@
+// Copyright 2018 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <typeindex>
+
+#include "absl/base/attributes.h"
+#include "absl/hash/hash.h"
+#include "absl/random/random.h"
+#include "absl/strings/cord.h"
+#include "absl/strings/cord_test_helpers.h"
+#include "benchmark/benchmark.h"
+
+namespace {
+
+using absl::Hash;
+
+template <template <typename> class H, typename T>
+void RunBenchmark(benchmark::State& state, T value) {
+  H<T> h;
+  for (auto _ : state) {
+    benchmark::DoNotOptimize(value);
+    benchmark::DoNotOptimize(h(value));
+  }
+}
+
+}  // namespace
+
+template <typename T>
+using AbslHash = absl::Hash<T>;
+
+class TypeErasedInterface {
+ public:
+  virtual ~TypeErasedInterface() = default;
+
+  template <typename H>
+  friend H AbslHashValue(H state, const TypeErasedInterface& wrapper) {
+    state = H::combine(std::move(state), std::type_index(typeid(wrapper)));
+    wrapper.HashValue(absl::HashState::Create(&state));
+    return state;
+  }
+
+ private:
+  virtual void HashValue(absl::HashState state) const = 0;
+};
+
+template <typename T>
+struct TypeErasedAbslHash {
+  class Wrapper : public TypeErasedInterface {
+   public:
+    explicit Wrapper(const T& value) : value_(value) {}
+
+   private:
+    void HashValue(absl::HashState state) const override {
+      absl::HashState::combine(std::move(state), value_);
+    }
+
+    const T& value_;
+  };
+
+  size_t operator()(const T& value) {
+    return absl::Hash<Wrapper>{}(Wrapper(value));
+  }
+};
+
+template <typename FuncType>
+inline FuncType* ODRUseFunction(FuncType* ptr) {
+  volatile FuncType* dummy = ptr;
+  return dummy;
+}
+
+absl::Cord FlatCord(size_t size) {
+  absl::Cord result(std::string(size, 'a'));
+  result.Flatten();
+  return result;
+}
+
+absl::Cord FragmentedCord(size_t size) {
+  const size_t orig_size = size;
+  std::vector<std::string> chunks;
+  size_t chunk_size = std::max<size_t>(1, size / 10);
+  while (size > chunk_size) {
+    chunks.push_back(std::string(chunk_size, 'a'));
+    size -= chunk_size;
+  }
+  if (size > 0) {
+    chunks.push_back(std::string(size, 'a'));
+  }
+  absl::Cord result = absl::MakeFragmentedCord(chunks);
+  (void) orig_size;
+  assert(result.size() == orig_size);
+  return result;
+}
+
+// Generates a benchmark and a codegen method for the provided types.  The
+// codegen method provides a well known entrypoint for dumping assembly.
+#define MAKE_BENCHMARK(hash, name, ...)                          \
+  namespace {                                                    \
+  void BM_##hash##_##name(benchmark::State& state) {             \
+    RunBenchmark<hash>(state, __VA_ARGS__);                      \
+  }                                                              \
+  BENCHMARK(BM_##hash##_##name);                                 \
+  }                                                              \
+  size_t Codegen##hash##name(const decltype(__VA_ARGS__)& arg);  \
+  size_t Codegen##hash##name(const decltype(__VA_ARGS__)& arg) { \
+    return hash<decltype(__VA_ARGS__)>{}(arg);                   \
+  }                                                              \
+  bool absl_hash_test_odr_use##hash##name =                      \
+      ODRUseFunction(&Codegen##hash##name);
+
+MAKE_BENCHMARK(AbslHash, Int32, int32_t{});
+MAKE_BENCHMARK(AbslHash, Int64, int64_t{});
+MAKE_BENCHMARK(AbslHash, Double, 1.2);
+MAKE_BENCHMARK(AbslHash, DoubleZero, 0.0);
+MAKE_BENCHMARK(AbslHash, PairInt32Int32, std::pair<int32_t, int32_t>{});
+MAKE_BENCHMARK(AbslHash, PairInt64Int64, std::pair<int64_t, int64_t>{});
+MAKE_BENCHMARK(AbslHash, TupleInt32BoolInt64,
+               std::tuple<int32_t, bool, int64_t>{});
+MAKE_BENCHMARK(AbslHash, String_0, std::string());
+MAKE_BENCHMARK(AbslHash, String_10, std::string(10, 'a'));
+MAKE_BENCHMARK(AbslHash, String_30, std::string(30, 'a'));
+MAKE_BENCHMARK(AbslHash, String_90, std::string(90, 'a'));
+MAKE_BENCHMARK(AbslHash, String_200, std::string(200, 'a'));
+MAKE_BENCHMARK(AbslHash, String_5000, std::string(5000, 'a'));
+MAKE_BENCHMARK(AbslHash, Cord_Flat_0, absl::Cord());
+MAKE_BENCHMARK(AbslHash, Cord_Flat_10, FlatCord(10));
+MAKE_BENCHMARK(AbslHash, Cord_Flat_30, FlatCord(30));
+MAKE_BENCHMARK(AbslHash, Cord_Flat_90, FlatCord(90));
+MAKE_BENCHMARK(AbslHash, Cord_Flat_200, FlatCord(200));
+MAKE_BENCHMARK(AbslHash, Cord_Flat_5000, FlatCord(5000));
+MAKE_BENCHMARK(AbslHash, Cord_Fragmented_200, FragmentedCord(200));
+MAKE_BENCHMARK(AbslHash, Cord_Fragmented_5000, FragmentedCord(5000));
+MAKE_BENCHMARK(AbslHash, VectorInt64_10, std::vector<int64_t>(10));
+MAKE_BENCHMARK(AbslHash, VectorInt64_100, std::vector<int64_t>(100));
+MAKE_BENCHMARK(AbslHash, VectorDouble_10, std::vector<double>(10, 1.1));
+MAKE_BENCHMARK(AbslHash, VectorDouble_100, std::vector<double>(100, 1.1));
+MAKE_BENCHMARK(AbslHash, PairStringString_0,
+               std::make_pair(std::string(), std::string()));
+MAKE_BENCHMARK(AbslHash, PairStringString_10,
+               std::make_pair(std::string(10, 'a'), std::string(10, 'b')));
+MAKE_BENCHMARK(AbslHash, PairStringString_30,
+               std::make_pair(std::string(30, 'a'), std::string(30, 'b')));
+MAKE_BENCHMARK(AbslHash, PairStringString_90,
+               std::make_pair(std::string(90, 'a'), std::string(90, 'b')));
+MAKE_BENCHMARK(AbslHash, PairStringString_200,
+               std::make_pair(std::string(200, 'a'), std::string(200, 'b')));
+MAKE_BENCHMARK(AbslHash, PairStringString_5000,
+               std::make_pair(std::string(5000, 'a'), std::string(5000, 'b')));
+
+MAKE_BENCHMARK(TypeErasedAbslHash, Int32, int32_t{});
+MAKE_BENCHMARK(TypeErasedAbslHash, Int64, int64_t{});
+MAKE_BENCHMARK(TypeErasedAbslHash, PairInt32Int32,
+               std::pair<int32_t, int32_t>{});
+MAKE_BENCHMARK(TypeErasedAbslHash, PairInt64Int64,
+               std::pair<int64_t, int64_t>{});
+MAKE_BENCHMARK(TypeErasedAbslHash, TupleInt32BoolInt64,
+               std::tuple<int32_t, bool, int64_t>{});
+MAKE_BENCHMARK(TypeErasedAbslHash, String_0, std::string());
+MAKE_BENCHMARK(TypeErasedAbslHash, String_10, std::string(10, 'a'));
+MAKE_BENCHMARK(TypeErasedAbslHash, String_30, std::string(30, 'a'));
+MAKE_BENCHMARK(TypeErasedAbslHash, String_90, std::string(90, 'a'));
+MAKE_BENCHMARK(TypeErasedAbslHash, String_200, std::string(200, 'a'));
+MAKE_BENCHMARK(TypeErasedAbslHash, String_5000, std::string(5000, 'a'));
+MAKE_BENCHMARK(TypeErasedAbslHash, VectorDouble_10,
+               std::vector<double>(10, 1.1));
+MAKE_BENCHMARK(TypeErasedAbslHash, VectorDouble_100,
+               std::vector<double>(100, 1.1));
+
+// The latency benchmark attempts to model the speed of the hash function in
+// production. When a hash function is used for hashtable lookups it is rarely
+// used to hash N items in a tight loop nor on constant sized strings. Instead,
+// after hashing there is a potential equality test plus a (usually) large
+// amount of user code. To simulate this effectively we introduce a data
+// dependency between elements we hash by using the hash of the Nth element as
+// the selector of the N+1th element to hash. This isolates the hash function
+// code much like in production. As a bonus we use the hash to generate strings
+// of size [1,N] (instead of fixed N) to disable perfect branch predictions in
+// hash function implementations.
+namespace {
+// 16kb fits in L1 cache of most CPUs we care about. Keeping memory latency low
+// will allow us to attribute most time to CPU which means more accurate
+// measurements.
+static constexpr size_t kEntropySize = 16 << 10;
+static char entropy[kEntropySize + 1024];
+ABSL_ATTRIBUTE_UNUSED static const bool kInitialized = [] {
+  absl::BitGen gen;
+  static_assert(sizeof(entropy) % sizeof(uint64_t) == 0, "");
+  for (int i = 0; i != sizeof(entropy); i += sizeof(uint64_t)) {
+    auto rand = absl::Uniform<uint64_t>(gen);
+    memcpy(&entropy[i], &rand, sizeof(uint64_t));
+  }
+  return true;
+}();
+}  // namespace
+
+template <class T>
+struct PodRand {
+  static_assert(std::is_pod<T>::value, "");
+  static_assert(kEntropySize + sizeof(T) < sizeof(entropy), "");
+
+  T Get(size_t i) const {
+    T v;
+    memcpy(&v, &entropy[i % kEntropySize], sizeof(T));
+    return v;
+  }
+};
+
+template <size_t N>
+struct StringRand {
+  static_assert(kEntropySize + N < sizeof(entropy), "");
+
+  absl::string_view Get(size_t i) const {
+    // This has a small bias towards small numbers. Because max N is ~200 this
+    // is very small and prefer to be very fast instead of absolutely accurate.
+    // Also we pass N = 2^K+1 so that mod reduces to a bitand.
+    size_t s = (i % (N - 1)) + 1;
+    return {&entropy[i % kEntropySize], s};
+  }
+};
+
+#define MAKE_LATENCY_BENCHMARK(hash, name, ...)              \
+  namespace {                                                \
+  void BM_latency_##hash##_##name(benchmark::State& state) { \
+    __VA_ARGS__ r;                                           \
+    hash<decltype(r.Get(0))> h;                              \
+    size_t i = 871401241;                                    \
+    for (auto _ : state) {                                   \
+      benchmark::DoNotOptimize(i = h(r.Get(i)));             \
+    }                                                        \
+  }                                                          \
+  BENCHMARK(BM_latency_##hash##_##name);                     \
+  }  // namespace
+
+MAKE_LATENCY_BENCHMARK(AbslHash, Int32, PodRand<int32_t>);
+MAKE_LATENCY_BENCHMARK(AbslHash, Int64, PodRand<int64_t>);
+MAKE_LATENCY_BENCHMARK(AbslHash, String9, StringRand<9>);
+MAKE_LATENCY_BENCHMARK(AbslHash, String33, StringRand<33>);
+MAKE_LATENCY_BENCHMARK(AbslHash, String65, StringRand<65>);
+MAKE_LATENCY_BENCHMARK(AbslHash, String257, StringRand<257>);
diff --git a/third_party/abseil-cpp/absl/hash/internal/hash.cc b/third_party/abseil-cpp/absl/hash/internal/hash.cc
index b44ecb3..1433eb9 100644
--- a/third_party/abseil-cpp/absl/hash/internal/hash.cc
+++ b/third_party/abseil-cpp/absl/hash/internal/hash.cc
@@ -18,9 +18,9 @@
 ABSL_NAMESPACE_BEGIN
 namespace hash_internal {
 
-uint64_t CityHashState::CombineLargeContiguousImpl32(uint64_t state,
-                                                     const unsigned char* first,
-                                                     size_t len) {
+uint64_t HashState::CombineLargeContiguousImpl32(uint64_t state,
+                                                 const unsigned char* first,
+                                                 size_t len) {
   while (len >= PiecewiseChunkSize()) {
     state =
         Mix(state, absl::hash_internal::CityHash32(reinterpret_cast<const char*>(first),
@@ -33,13 +33,11 @@
                                std::integral_constant<int, 4>{});
 }
 
-uint64_t CityHashState::CombineLargeContiguousImpl64(uint64_t state,
-                                                     const unsigned char* first,
-                                                     size_t len) {
+uint64_t HashState::CombineLargeContiguousImpl64(uint64_t state,
+                                                 const unsigned char* first,
+                                                 size_t len) {
   while (len >= PiecewiseChunkSize()) {
-    state =
-        Mix(state, absl::hash_internal::CityHash64(reinterpret_cast<const char*>(first),
-                                         PiecewiseChunkSize()));
+    state = Mix(state, Hash64(first, PiecewiseChunkSize()));
     len -= PiecewiseChunkSize();
     first += PiecewiseChunkSize();
   }
@@ -48,7 +46,24 @@
                                std::integral_constant<int, 8>{});
 }
 
-ABSL_CONST_INIT const void* const CityHashState::kSeed = &kSeed;
+ABSL_CONST_INIT const void* const HashState::kSeed = &kSeed;
+
+// The salt array used by Wyhash. This array is NOT the mechanism used to make
+// absl::Hash non-deterministic between program invocations.  See `Seed()` for
+// that mechanism.
+//
+// Any random values are fine. These values are just digits from the decimal
+// part of pi.
+// https://en.wikipedia.org/wiki/Nothing-up-my-sleeve_number
+constexpr uint64_t kWyhashSalt[5] = {
+    uint64_t{0x243F6A8885A308D3}, uint64_t{0x13198A2E03707344},
+    uint64_t{0xA4093822299F31D0}, uint64_t{0x082EFA98EC4E6C89},
+    uint64_t{0x452821E638D01377},
+};
+
+uint64_t HashState::WyhashImpl(const unsigned char* data, size_t len) {
+  return Wyhash(data, len, Seed(), kWyhashSalt);
+}
 
 }  // namespace hash_internal
 ABSL_NAMESPACE_END
diff --git a/third_party/abseil-cpp/absl/hash/internal/hash.h b/third_party/abseil-cpp/absl/hash/internal/hash.h
index b0132da..eb3471d 100644
--- a/third_party/abseil-cpp/absl/hash/internal/hash.h
+++ b/third_party/abseil-cpp/absl/hash/internal/hash.h
@@ -41,6 +41,7 @@
 #include "absl/base/internal/endian.h"
 #include "absl/base/port.h"
 #include "absl/container/fixed_array.h"
+#include "absl/hash/internal/wyhash.h"
 #include "absl/meta/type_traits.h"
 #include "absl/numeric/int128.h"
 #include "absl/strings/string_view.h"
@@ -712,9 +713,8 @@
 struct is_hashable
     : std::integral_constant<bool, HashSelect::template Apply<T>::value> {};
 
-// CityHashState
-class ABSL_DLL CityHashState
-    : public HashStateBase<CityHashState> {
+// HashState
+class ABSL_DLL HashState : public HashStateBase<HashState> {
   // absl::uint128 is not an alias or a thin wrapper around the intrinsic.
   // We use the intrinsic when available to improve performance.
 #ifdef ABSL_HAVE_INTRINSIC_INT128
@@ -733,23 +733,22 @@
 
  public:
   // Move only
-  CityHashState(CityHashState&&) = default;
-  CityHashState& operator=(CityHashState&&) = default;
+  HashState(HashState&&) = default;
+  HashState& operator=(HashState&&) = default;
 
-  // CityHashState::combine_contiguous()
+  // HashState::combine_contiguous()
   //
   // Fundamental base case for hash recursion: mixes the given range of bytes
   // into the hash state.
-  static CityHashState combine_contiguous(CityHashState hash_state,
-                                          const unsigned char* first,
-                                          size_t size) {
-    return CityHashState(
+  static HashState combine_contiguous(HashState hash_state,
+                                      const unsigned char* first, size_t size) {
+    return HashState(
         CombineContiguousImpl(hash_state.state_, first, size,
                               std::integral_constant<int, sizeof(size_t)>{}));
   }
-  using CityHashState::HashStateBase::combine_contiguous;
+  using HashState::HashStateBase::combine_contiguous;
 
-  // CityHashState::hash()
+  // HashState::hash()
   //
   // For performance reasons in non-opt mode, we specialize this for
   // integral types.
@@ -761,24 +760,24 @@
     return static_cast<size_t>(Mix(Seed(), static_cast<uint64_t>(value)));
   }
 
-  // Overload of CityHashState::hash()
+  // Overload of HashState::hash()
   template <typename T, absl::enable_if_t<!IntegralFastPath<T>::value, int> = 0>
   static size_t hash(const T& value) {
-    return static_cast<size_t>(combine(CityHashState{}, value).state_);
+    return static_cast<size_t>(combine(HashState{}, value).state_);
   }
 
  private:
   // Invoked only once for a given argument; that plus the fact that this is
   // move-only ensures that there is only one non-moved-from object.
-  CityHashState() : state_(Seed()) {}
+  HashState() : state_(Seed()) {}
 
   // Workaround for MSVC bug.
   // We make the type copyable to fix the calling convention, even though we
   // never actually copy it. Keep it private to not affect the public API of the
   // type.
-  CityHashState(const CityHashState&) = default;
+  HashState(const HashState&) = default;
 
-  explicit CityHashState(uint64_t state) : state_(state) {}
+  explicit HashState(uint64_t state) : state_(state) {}
 
   // Implementation of the base case for combine_contiguous where we actually
   // mix the bytes into the state.
@@ -791,7 +790,8 @@
   static uint64_t CombineContiguousImpl(uint64_t state,
                                         const unsigned char* first, size_t len,
                                         std::integral_constant<int, 8>
-                                        /* sizeof_size_t*/);
+                                        /* sizeof_size_t */);
+
 
   // Slow dispatch path for calls to CombineContiguousImpl with a size argument
   // larger than PiecewiseChunkSize().  Has the same effect as calling
@@ -838,6 +838,19 @@
     return static_cast<uint64_t>(m ^ (m >> (sizeof(m) * 8 / 2)));
   }
 
+  // An extern to avoid bloat on a direct call to Wyhash() with fixed values for
+  // both the seed and salt parameters.
+  static uint64_t WyhashImpl(const unsigned char* data, size_t len);
+
+  ABSL_ATTRIBUTE_ALWAYS_INLINE static uint64_t Hash64(const unsigned char* data,
+                                                      size_t len) {
+#ifdef ABSL_HAVE_INTRINSIC_INT128
+    return WyhashImpl(data, len);
+#else
+    return absl::hash_internal::CityHash64(reinterpret_cast<const char*>(data), len);
+#endif
+  }
+
   // Seed()
   //
   // A non-deterministic seed.
@@ -869,8 +882,8 @@
   uint64_t state_;
 };
 
-// CityHashState::CombineContiguousImpl()
-inline uint64_t CityHashState::CombineContiguousImpl(
+// HashState::CombineContiguousImpl()
+inline uint64_t HashState::CombineContiguousImpl(
     uint64_t state, const unsigned char* first, size_t len,
     std::integral_constant<int, 4> /* sizeof_size_t */) {
   // For large values we use CityHash, for small ones we just use a
@@ -892,18 +905,18 @@
   return Mix(state, v);
 }
 
-// Overload of CityHashState::CombineContiguousImpl()
-inline uint64_t CityHashState::CombineContiguousImpl(
+// Overload of HashState::CombineContiguousImpl()
+inline uint64_t HashState::CombineContiguousImpl(
     uint64_t state, const unsigned char* first, size_t len,
     std::integral_constant<int, 8> /* sizeof_size_t */) {
-  // For large values we use CityHash, for small ones we just use a
-  // multiplicative hash.
+  // For large values we use Wyhash or CityHash depending on the platform, for
+  // small ones we just use a multiplicative hash.
   uint64_t v;
   if (len > 16) {
     if (ABSL_PREDICT_FALSE(len > PiecewiseChunkSize())) {
       return CombineLargeContiguousImpl64(state, first, len);
     }
-    v = absl::hash_internal::CityHash64(reinterpret_cast<const char*>(first), len);
+    v = Hash64(first, len);
   } else if (len > 8) {
     auto p = Read9To16(first, len);
     state = Mix(state, p.first);
@@ -934,7 +947,7 @@
 
 template <typename T>
 struct HashImpl {
-  size_t operator()(const T& value) const { return CityHashState::hash(value); }
+  size_t operator()(const T& value) const { return HashState::hash(value); }
 };
 
 template <typename T>
diff --git a/third_party/abseil-cpp/absl/hash/internal/wyhash.cc b/third_party/abseil-cpp/absl/hash/internal/wyhash.cc
new file mode 100644
index 0000000..642bde4
--- /dev/null
+++ b/third_party/abseil-cpp/absl/hash/internal/wyhash.cc
@@ -0,0 +1,111 @@
+// Copyright 2020 The Abseil Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/hash/internal/wyhash.h"
+
+#include "absl/base/internal/unaligned_access.h"
+#include "absl/numeric/int128.h"
+
+namespace absl {
+ABSL_NAMESPACE_BEGIN
+namespace hash_internal {
+
+static uint64_t WyhashMix(uint64_t v0, uint64_t v1) {
+  absl::uint128 p = v0;
+  p *= v1;
+  return absl::Uint128Low64(p) ^ absl::Uint128High64(p);
+}
+
+uint64_t Wyhash(const void* data, size_t len, uint64_t seed,
+                const uint64_t salt[]) {
+  const uint8_t* ptr = static_cast<const uint8_t*>(data);
+  uint64_t starting_length = static_cast<uint64_t>(len);
+  uint64_t current_state = seed ^ salt[0];
+
+  if (len > 64) {
+    // If we have more than 64 bytes, we're going to handle chunks of 64
+    // bytes at a time. We're going to build up two separate hash states
+    // which we will then hash together.
+    uint64_t duplicated_state = current_state;
+
+    do {
+      uint64_t a = absl::base_internal::UnalignedLoad64(ptr);
+      uint64_t b = absl::base_internal::UnalignedLoad64(ptr + 8);
+      uint64_t c = absl::base_internal::UnalignedLoad64(ptr + 16);
+      uint64_t d = absl::base_internal::UnalignedLoad64(ptr + 24);
+      uint64_t e = absl::base_internal::UnalignedLoad64(ptr + 32);
+      uint64_t f = absl::base_internal::UnalignedLoad64(ptr + 40);
+      uint64_t g = absl::base_internal::UnalignedLoad64(ptr + 48);
+      uint64_t h = absl::base_internal::UnalignedLoad64(ptr + 56);
+
+      uint64_t cs0 = WyhashMix(a ^ salt[1], b ^ current_state);
+      uint64_t cs1 = WyhashMix(c ^ salt[2], d ^ current_state);
+      current_state = (cs0 ^ cs1);
+
+      uint64_t ds0 = WyhashMix(e ^ salt[3], f ^ duplicated_state);
+      uint64_t ds1 = WyhashMix(g ^ salt[4], h ^ duplicated_state);
+      duplicated_state = (ds0 ^ ds1);
+
+      ptr += 64;
+      len -= 64;
+    } while (len > 64);
+
+    current_state = current_state ^ duplicated_state;
+  }
+
+  // We now have a data `ptr` with at most 64 bytes and the current state
+  // of the hashing state machine stored in current_state.
+  while (len > 16) {
+    uint64_t a = absl::base_internal::UnalignedLoad64(ptr);
+    uint64_t b = absl::base_internal::UnalignedLoad64(ptr + 8);
+
+    current_state = WyhashMix(a ^ salt[1], b ^ current_state);
+
+    ptr += 16;
+    len -= 16;
+  }
+
+  // We now have a data `ptr` with at most 16 bytes.
+  uint64_t a = 0;
+  uint64_t b = 0;
+  if (len > 8) {
+    // When we have at least 9 and at most 16 bytes, set A to the first 64
+    // bits of the input and B to the last 64 bits of the input. Yes, they will
+    // overlap in the middle if we are working with less than the full 16
+    // bytes.
+    a = absl::base_internal::UnalignedLoad64(ptr);
+    b = absl::base_internal::UnalignedLoad64(ptr + len - 8);
+  } else if (len > 3) {
+    // If we have at least 4 and at most 8 bytes, set A to the first 32
+    // bits and B to the last 32 bits.
+    a = absl::base_internal::UnalignedLoad32(ptr);
+    b = absl::base_internal::UnalignedLoad32(ptr + len - 4);
+  } else if (len > 0) {
+    // If we have at least 1 and at most 3 bytes, read all of the provided
+    // bits into A, with some adjustments.
+    a = ((ptr[0] << 16) | (ptr[len >> 1] << 8) | ptr[len - 1]);
+    b = 0;
+  } else {
+    a = 0;
+    b = 0;
+  }
+
+  uint64_t w = WyhashMix(a ^ salt[1], b ^ current_state);
+  uint64_t z = salt[1] ^ starting_length;
+  return WyhashMix(w, z);
+}
+
+}  // namespace hash_internal
+ABSL_NAMESPACE_END
+}  // namespace absl
diff --git a/third_party/abseil-cpp/absl/hash/internal/wyhash.h b/third_party/abseil-cpp/absl/hash/internal/wyhash.h
new file mode 100644
index 0000000..4aff4e9
--- /dev/null
+++ b/third_party/abseil-cpp/absl/hash/internal/wyhash.h
@@ -0,0 +1,48 @@
+// Copyright 2020 The Abseil Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// This file provides the Google-internal implementation of the Wyhash
+// algorithm.
+//
+// Wyhash is a fast hash function for hash tables, the fastest we've currently
+// (late 2020) found that passes the SMHasher tests. The algorithm relies on
+// intrinsic 128-bit multiplication for speed. This is not meant to be secure -
+// just fast.
+
+#ifndef ABSL_HASH_INTERNAL_WYHASH_H_
+#define ABSL_HASH_INTERNAL_WYHASH_H_
+
+#include <stdint.h>
+#include <stdlib.h>
+
+#include "absl/base/config.h"
+
+namespace absl {
+ABSL_NAMESPACE_BEGIN
+namespace hash_internal {
+
+// Hash function for a byte array. A 64-bit seed and a set of five 64-bit
+// integers are hashed into the result.
+//
+// To allow all hashable types (including string_view and Span) to depend on
+// this algoritm, we keep the API low-level, with as few dependencies as
+// possible.
+uint64_t Wyhash(const void* data, size_t len, uint64_t seed,
+                const uint64_t salt[5]);
+
+}  // namespace hash_internal
+ABSL_NAMESPACE_END
+}  // namespace absl
+
+#endif  // ABSL_HASH_INTERNAL_WYHASH_H_
diff --git a/third_party/abseil-cpp/absl/hash/internal/wyhash_test.cc b/third_party/abseil-cpp/absl/hash/internal/wyhash_test.cc
new file mode 100644
index 0000000..30dc9e3
--- /dev/null
+++ b/third_party/abseil-cpp/absl/hash/internal/wyhash_test.cc
@@ -0,0 +1,486 @@
+// Copyright 2020 The Abseil Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in cokSaltliance with the License.
+// You may obtain a copy of the License at
+//
+//     https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or ikSaltlied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/hash/internal/wyhash.h"
+
+#include "absl/strings/escaping.h"
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+
+namespace {
+
+static const uint64_t kCurrentSeed = 0;
+static const uint64_t kSalt[5] = {0xa0761d6478bd642f, 0xe7037ed1a0b428dbl,
+                                  0x8ebc6af09c88c6e3, 0x589965cc75374cc3l,
+                                  0x1d8e4e27c47d124f};
+
+// Note: We don't account for endianness, so the values here are only correct if
+// you're also running on a little endian platform.
+
+TEST(WyhashTest, EmptyString) {
+  const std::string s = "";
+  EXPECT_EQ(
+      absl::hash_internal::Wyhash(s.c_str(), s.length(), kCurrentSeed, kSalt),
+      4808886099364463827);
+}
+
+TEST(WyhashTest, Spaces) {
+  const std::string s = "   ";
+  EXPECT_EQ(
+      absl::hash_internal::Wyhash(s.c_str(), s.length(), kCurrentSeed, kSalt),
+      1686201463024549249);
+}
+
+TEST(WyhashTest, RepeatingString) {
+  const std::string s = "aaaa";
+  EXPECT_EQ(
+      absl::hash_internal::Wyhash(s.c_str(), s.length(), kCurrentSeed, kSalt),
+      6646112255271966632);
+}
+
+TEST(WyhashTest, HexString) {
+  const std::string small = "\x01\x02\x03";
+  const std::string med = "\x01\x02\x03\x04";
+
+  EXPECT_EQ(absl::hash_internal::Wyhash(small.c_str(), small.length(),
+                                        kCurrentSeed, kSalt),
+            11989428023081740911ULL);
+  EXPECT_EQ(absl::hash_internal::Wyhash(med.c_str(), med.length(), kCurrentSeed,
+                                        kSalt),
+            9765997711188871556ULL);
+}
+
+TEST(WyhashTest, Words) {
+  const std::string s = "third_party|wyhash|64";
+  EXPECT_EQ(
+      absl::hash_internal::Wyhash(s.c_str(), s.length(), kCurrentSeed, kSalt),
+      3702018632387611330);
+}
+
+TEST(WyhashTest, LongString) {
+  const std::string s =
+      "AbCdEfGhIjKlMnOpQrStUvWxYz0123456789AbCdEfGhIjKlMnOpQrStUvWxYz"
+      "0123456789AbCdEfGhIjKlMnOpQrStUvWxYz0123456789AbCdEfGhIjKlMnOp"
+      "QrStUvWxYz0123456789AbCdEfGhIjKlMnOpQrStUvWxYz0123456789AbCdEf"
+      "GhIjKlMnOpQrStUvWxYz0123456789AbCdEfGhIjKlMnOpQrStUvWxYz012345"
+      "6789AbCdEfGhIjKlMnOpQrStUvWxYz0123456789";
+
+  EXPECT_EQ(
+      absl::hash_internal::Wyhash(s.c_str(), s.length(), kCurrentSeed, kSalt),
+      9245411362605796064ULL);
+}
+
+TEST(WyhashTest, BigReference) {
+  struct ExpectedResult {
+    absl::string_view base64_data;
+    uint64_t seed;
+    uint64_t hash;
+  } expected_results[] = {
+      {"", uint64_t{0xec42b7ab404b8acb}, uint64_t{0xe5a40d39ab796423}},
+      {"Zw==", uint64_t{0xeeee074043a3ee0f}, uint64_t{0xa6564b468248c683}},
+      {"xmk=", uint64_t{0x857902089c393de}, uint64_t{0xef192f401b116e1c}},
+      {"c1H/", uint64_t{0x993df040024ca3af}, uint64_t{0xbe8dc0c54617639d}},
+      {"SuwpzQ==", uint64_t{0xc4e4c2acea740e96}, uint64_t{0x93d7f665b5521c8e}},
+      {"uqvy++M=", uint64_t{0x6a214b3db872d0cf}, uint64_t{0x646d70bb42445f28}},
+      {"RnzCVPgb", uint64_t{0x44343db6a89dba4d}, uint64_t{0x96a7b1e3cc9bd426}},
+      {"6OeNdlouYw==", uint64_t{0x77b5d6d1ae1dd483},
+       uint64_t{0x76020289ab0790c4}},
+      {"M5/JmmYyDbc=", uint64_t{0x89ab8ecb44d221f1},
+       uint64_t{0x39f842e4133b9b44}},
+      {"MVijWiVdBRdY", uint64_t{0x60244b17577ca81b},
+       uint64_t{0x2b8d7047be4bcaab}},
+      {"6V7Uq7LNxpu0VA==", uint64_t{0x59a08dcee0717067},
+       uint64_t{0x99628abef6716a97}},
+      {"EQ6CdEEhPdyHcOk=", uint64_t{0xf5f20db3ade57396},
+       uint64_t{0x4432e02ba42b2740}},
+      {"PqFB4fxnPgF+l+rc", uint64_t{0xbf8dee0751ad3efb},
+       uint64_t{0x74d810efcad7918a}},
+      {"a5aPOFwq7LA7+zKvPA==", uint64_t{0x6b7a06b268d63e30},
+       uint64_t{0x88c84e986002507f}},
+      {"VOwY21wCGv5D+/qqOvs=", uint64_t{0xb8c37f0ae0f54c82},
+       uint64_t{0x4f99acf193cf39b9}},
+      {"KdHmBTx8lHXYvmGJ+Vy7", uint64_t{0x9fcbed0c38e50eef},
+       uint64_t{0xd90e7a3655891e37}},
+      {"qJkPlbHr8bMF7/cA6aE65Q==", uint64_t{0x2af4bade1d8e3a1d},
+       uint64_t{0x3bb378b1d4df8fcf}},
+      {"ygvL0EhHZL0fIx6oHHtkxRQ=", uint64_t{0x714e3aa912da2f2c},
+       uint64_t{0xf78e94045c052d47}},
+      {"c1rFXkt5YztwZCQRngncqtSs", uint64_t{0xf5ee75e3cbb82c1c},
+       uint64_t{0x26da0b2130da6b40}},
+      {"8hsQrzszzeNQSEcVXLtvIhm6mw==", uint64_t{0x620e7007321b93b9},
+       uint64_t{0x30b4d426af8c6986}},
+      {"ffUL4RocfyP4KfikGxO1yk7omDI=", uint64_t{0xc08528cac2e551fc},
+       uint64_t{0x5413b4aaf3baaeae}},
+      {"OOB5TT00vF9Od/rLbAWshiErqhpV", uint64_t{0x6a1debf9cc3ad39},
+       uint64_t{0x756ab265370a1597}},
+      {"or5wtXM7BFzTNpSzr+Lw5J5PMhVJ/Q==", uint64_t{0x7e0a3c88111fc226},
+       uint64_t{0xdaf5f4b7d09814fb}},
+      {"gk6pCHDUsoopVEiaCrzVDhioRKxb844=", uint64_t{0x1301fef15df39edb},
+       uint64_t{0x8f874ae37742b75e}},
+      {"TNctmwlC5QbEM6/No4R/La3UdkfeMhzs", uint64_t{0x64e181f3d5817ab},
+       uint64_t{0x8fecd03956121ce8}},
+      {"SsQw9iAjhWz7sgcE9OwLuSC6hsM+BfHs2Q==", uint64_t{0xafafc44961078ecb},
+       uint64_t{0x229c292ea7a08285}},
+      {"ZzO3mVCj4xTT2TT3XqDyEKj2BZQBvrS8RHg=", uint64_t{0x4f7bb45549250094},
+       uint64_t{0xbb4bf0692d14bae}},
+      {"+klp5iPQGtppan5MflEls0iEUzqU+zGZkDJX", uint64_t{0xa30061abaa2818c},
+       uint64_t{0x207b24ca3bdac1db}},
+      {"RO6bvOnlJc8I9eniXlNgqtKy0IX6VNg16NRmgg==", uint64_t{0xd902ee3e44a5705f},
+       uint64_t{0x64f6cd6745d3825b}},
+      {"ZJjZqId1ZXBaij9igClE3nyliU5XWdNRrayGlYA=", uint64_t{0x316d36da516f583},
+       uint64_t{0xa2b2e1656b58df1e}},
+      {"7BfkhfGMDGbxfMB8uyL85GbaYQtjr2K8g7RpLzr/", uint64_t{0x402d83f9f834f616},
+       uint64_t{0xd01d30d9ee7a148}},
+      {"rycWk6wHH7htETQtje9PidS2YzXBx+Qkg2fY7ZYS7A==",
+       uint64_t{0x9c604164c016b72c}, uint64_t{0x1cb4cd00ab804e3b}},
+      {"RTkC2OUK+J13CdGllsH0H5WqgspsSa6QzRZouqx6pvI=",
+       uint64_t{0x3f4507e01f9e73ba}, uint64_t{0x4697f2637fd90999}},
+      {"tKjKmbLCNyrLCM9hycOAXm4DKNpM12oZ7dLTmUx5iwAi",
+       uint64_t{0xc3fe0d5be8d2c7c7}, uint64_t{0x8383a756b5688c07}},
+      {"VprUGNH+5NnNRaORxgH/ySrZFQFDL+4VAodhfBNinmn8cg==",
+       uint64_t{0x531858a40bfa7ea1}, uint64_t{0x695c29cb3696a975}},
+      {"gc1xZaY+q0nPcUvOOnWnT3bqfmT/geth/f7Dm2e/DemMfk4=",
+       uint64_t{0x86689478a7a7e8fa}, uint64_t{0xda2e5a5a5e971521}},
+      {"Mr35fIxqx1ukPAL0su1yFuzzAU3wABCLZ8+ZUFsXn47UmAph",
+       uint64_t{0x4ec948b8e7f27288}, uint64_t{0x7935d4befa056b2b}},
+      {"A9G8pw2+m7+rDtWYAdbl8tb2fT7FFo4hLi2vAsa5Y8mKH3CX3g==",
+       uint64_t{0xce46c7213c10032}, uint64_t{0x38dd541ca95420fe}},
+      {"DFaJGishGwEHDdj9ixbCoaTjz9KS0phLNWHVVdFsM93CvPft3hM=",
+       uint64_t{0xf63e96ee6f32a8b6}, uint64_t{0xcc06c7a4963f967f}},
+      {"7+Ugx+Kr3aRNgYgcUxru62YkTDt5Hqis+2po81hGBkcrJg4N0uuy",
+       uint64_t{0x1cfe85e65fc5225}, uint64_t{0xbf0f6f66e232fb20}},
+      {"H2w6O8BUKqu6Tvj2xxaecxEI2wRgIgqnTTG1WwOgDSINR13Nm4d4Vg==",
+       uint64_t{0x45c474f1cee1d2e8}, uint64_t{0xf7efb32d373fe71a}},
+      {"1XBMnIbqD5jy65xTDaf6WtiwtdtQwv1dCVoqpeKj+7cTR1SaMWMyI04=",
+       uint64_t{0x6e024e14015f329c}, uint64_t{0xe2e64634b1c12660}},
+      {"znZbdXG2TSFrKHEuJc83gPncYpzXGbAebUpP0XxzH0rpe8BaMQ17nDbt",
+       uint64_t{0x760c40502103ae1c}, uint64_t{0x285b8fd1638e306d}},
+      {"ylu8Atu13j1StlcC1MRMJJXIl7USgDDS22HgVv0WQ8hx/8pNtaiKB17hCQ==",
+       uint64_t{0x17fd05c3c560c320}, uint64_t{0x658e8a4e3b714d6c}},
+      {"M6ZVVzsd7vAvbiACSYHioH/440dp4xG2mLlBnxgiqEvI/aIEGpD0Sf4VS0g=",
+       uint64_t{0x8b34200a6f8e90d9}, uint64_t{0xf391fb968e0eb398}},
+      {"li3oFSXLXI+ubUVGJ4blP6mNinGKLHWkvGruun85AhVn6iuMtocbZPVhqxzn",
+       uint64_t{0x6be89e50818bdf69}, uint64_t{0x744a9ea0cc144bf2}},
+      {"kFuQHuUCqBF3Tc3hO4dgdIp223ShaCoog48d5Do5zMqUXOh5XpGK1t5XtxnfGA==",
+       uint64_t{0xfb389773315b47d8}, uint64_t{0x12636f2be11012f1}},
+      {"jWmOad0v0QhXVJd1OdGuBZtDYYS8wBVHlvOeTQx9ZZnm8wLEItPMeihj72E0nWY=",
+       uint64_t{0x4f2512a23f61efee}, uint64_t{0x29c57de825948f80}},
+      {"z+DHU52HaOQdW4JrZwDQAebEA6rm13Zg/9lPYA3txt3NjTBqFZlOMvTRnVzRbl23",
+       uint64_t{0x59ccd92fc16c6fda}, uint64_t{0x58c6f99ab0d1c021}},
+      {"MmBiGDfYeTayyJa/tVycg+rN7f9mPDFaDc+23j0TlW9094er0ADigsl4QX7V3gG/qw==",
+       uint64_t{0x25c5a7f5bd330919}, uint64_t{0x13e7b5a7b82fe3bb}},
+      {"774RK+9rOL4iFvs1q2qpo/JVc/I39buvNjqEFDtDvyoB0FXxPI2vXqOrk08VPfIHkmU=",
+       uint64_t{0x51df4174d34c97d7}, uint64_t{0x10fbc87901e02b63}},
+      {"+slatXiQ7/2lK0BkVUI1qzNxOOLP3I1iK6OfHaoxgqT63FpzbElwEXSwdsryq3UlHK0I",
+       uint64_t{0x80ce6d76f89cb57}, uint64_t{0xa24c9184901b748b}},
+      {"64mVTbQ47dHjHlOHGS/hjJwr/"
+       "K2frCNpn87exOqMzNUVYiPKmhCbfS7vBUce5tO6Ec9osQ==",
+       uint64_t{0x20961c911965f684}, uint64_t{0xcac4fd4c5080e581}},
+      {"fIsaG1r530SFrBqaDj1kqE0AJnvvK8MNEZbII2Yw1OK77v0V59xabIh0B5axaz/"
+       "+a2V5WpA=",
+       uint64_t{0x4e5b926ec83868e7}, uint64_t{0xc38bdb7483ba68e1}},
+      {"PGih0zDEOWCYGxuHGDFu9Ivbff/"
+       "iE7BNUq65tycTR2R76TerrXALRosnzaNYO5fjFhTi+CiS",
+       uint64_t{0x3927b30b922eecef}, uint64_t{0xdb2a8069b2ceaffa}},
+      {"RnpA/"
+       "zJnEnnLjmICORByRVb9bCOgxF44p3VMiW10G7PvW7IhwsWajlP9kIwNA9FjAD2GoQHk2Q="
+       "=",
+       uint64_t{0xbd0291284a49b61c}, uint64_t{0xdf9fe91d0d1c7887}},
+      {"qFklMceaTHqJpy2qavJE+EVBiNFOi6OxjOA3LeIcBop1K7w8xQi3TrDk+"
+       "BrWPRIbfprszSaPfrI=",
+       uint64_t{0x73a77c575bcc956}, uint64_t{0xe83f49e96e2e6a08}},
+      {"cLbfUtLl3EcQmITWoTskUR8da/VafRDYF/ylPYwk7/"
+       "zazk6ssyrzxMN3mmSyvrXR2yDGNZ3WDrTT",
+       uint64_t{0x766a0e2ade6d09a6}, uint64_t{0xc69e61b62ca2b62}},
+      {"s/"
+       "Jf1+"
+       "FbsbCpXWPTUSeWyMH6e4CvTFvPE5Fs6Z8hvFITGyr0dtukHzkI84oviVLxhM1xMxrMAy1db"
+       "w==",
+       uint64_t{0x2599f4f905115869}, uint64_t{0xb4a4f3f85f8298fe}},
+      {"FvyQ00+j7nmYZVQ8hI1Edxd0AWplhTfWuFGiu34AK5X8u2hLX1bE97sZM0CmeLe+"
+       "7LgoUT1fJ/axybE=",
+       uint64_t{0xd8256e5444d21e53}, uint64_t{0x167a1b39e1e95f41}},
+      {"L8ncxMaYLBH3g9buPu8hfpWZNlOF7nvWLNv9IozH07uQsIBWSKxoPy8+"
+       "LW4tTuzC6CIWbRGRRD1sQV/4",
+       uint64_t{0xf664a91333fb8dfd}, uint64_t{0xf8a2a5649855ee41}},
+      {"CDK0meI07yrgV2kQlZZ+"
+       "wuVqhc2NmzqeLH7bmcA6kchsRWFPeVF5Wqjjaj556ABeUoUr3yBmfU3kWOakkg==",
+       uint64_t{0x9625b859be372cd1}, uint64_t{0x27992565b595c498}},
+      {"d23/vc5ONh/"
+       "HkMiq+gYk4gaCNYyuFKwUkvn46t+dfVcKfBTYykr4kdvAPNXGYLjM4u1YkAEFpJP+"
+       "nX7eOvs=",
+       uint64_t{0x7b99940782e29898}, uint64_t{0x3e08cca5b71f9346}},
+      {"NUR3SRxBkxTSbtQORJpu/GdR6b/h6sSGfsMj/KFd99ahbh+9r7LSgSGmkGVB/"
+       "mGoT0pnMTQst7Lv2q6QN6Vm",
+       uint64_t{0x4fe12fa5383b51a8}, uint64_t{0xad406b10c770a6d2}},
+      {"2BOFlcI3Z0RYDtS9T9Ie9yJoXlOdigpPeeT+CRujb/"
+       "O39Ih5LPC9hP6RQk1kYESGyaLZZi3jtabHs7DiVx/VDg==",
+       uint64_t{0xe2ccb09ac0f5b4b6}, uint64_t{0xd1713ce6e552bcf2}},
+      {"FF2HQE1FxEvWBpg6Z9zAMH+Zlqx8S1JD/"
+       "wIlViL6ZDZY63alMDrxB0GJQahmAtjlm26RGLnjW7jmgQ4Ie3I+014=",
+       uint64_t{0x7d0a37adbd7b753b}, uint64_t{0x753b287194c73ad3}},
+      {"tHmO7mqVL/PX11nZrz50Hc+M17Poj5lpnqHkEN+4bpMx/"
+       "YGbkrGOaYjoQjgmt1X2QyypK7xClFrjeWrCMdlVYtbW",
+       uint64_t{0xd3ae96ef9f7185f2}, uint64_t{0x5ae41a95f600af1c}},
+      {"/WiHi9IQcxRImsudkA/KOTqGe8/"
+       "gXkhKIHkjddv5S9hi02M049dIK3EUyAEjkjpdGLUs+BN0QzPtZqjIYPOgwsYE9g==",
+       uint64_t{0x4fb88ea63f79a0d8}, uint64_t{0x4a61163b86a8bb4c}},
+      {"qds+1ExSnU11L4fTSDz/QE90g4Jh6ioqSh3KDOTOAo2pQGL1k/"
+       "9CCC7J23YF27dUTzrWsCQA2m4epXoCc3yPHb3xElA=",
+       uint64_t{0xed564e259bb5ebe9}, uint64_t{0x42eeaa79e760c7e4}},
+      {"8FVYHx40lSQPTHheh08Oq0/"
+       "pGm2OlG8BEf8ezvAxHuGGdgCkqpXIueJBF2mQJhTfDy5NncO8ntS7vaKs7sCNdDaNGOEi",
+       uint64_t{0x3e3256b60c428000}, uint64_t{0x698df622ef465b0a}},
+      {"4ZoEIrJtstiCkeew3oRzmyJHVt/pAs2pj0HgHFrBPztbQ10NsQ/"
+       "lM6DM439QVxpznnBSiHMgMQJhER+70l72LqFTO1JiIQ==",
+       uint64_t{0xfb05bad59ec8705}, uint64_t{0x157583111e1a6026}},
+      {"hQPtaYI+wJyxXgwD5n8jGIKFKaFA/"
+       "P83KqCKZfPthnjwdOFysqEOYwAaZuaaiv4cDyi9TyS8hk5cEbNP/jrI7q6pYGBLbsM=",
+       uint64_t{0xafdc251dbf97b5f8}, uint64_t{0xaa1388f078e793e0}},
+      {"S4gpMSKzMD7CWPsSfLeYyhSpfWOntyuVZdX1xSBjiGvsspwOZcxNKCRIOqAA0moUfOh3I5+"
+       "juQV4rsqYElMD/gWfDGpsWZKQ",
+       uint64_t{0x10ec9c92ddb5dcbc}, uint64_t{0xf10d68d0f3309360}},
+      {"oswxop+"
+       "bthuDLT4j0PcoSKby4LhF47ZKg8K17xxHf74UsGCzTBbOz0MM8hQEGlyqDT1iUiAYnaPaUp"
+       "L2mRK0rcIUYA4qLt5uOw==",
+       uint64_t{0x9a767d5822c7dac4}, uint64_t{0x2af056184457a3de}},
+      {"0II/"
+       "697p+"
+       "BtLSjxj5989OXI004TogEb94VUnDzOVSgMXie72cuYRvTFNIBgtXlKfkiUjeqVpd4a+"
+       "n5bxNOD1TGrjQtzKU5r7obo=",
+       uint64_t{0xee46254080d6e2db}, uint64_t{0x6d0058e1590b2489}},
+      {"E84YZW2qipAlMPmctrg7TKlwLZ68l4L+c0xRDUfyyFrA4MAti0q9sHq3TDFviH0Y+"
+       "Kq3tEE5srWFA8LM9oomtmvm5PYxoaarWPLc",
+       uint64_t{0xbbb669588d8bf398}, uint64_t{0x638f287f68817f12}},
+      {"x3pa4HIElyZG0Nj7Vdy9IdJIR4izLmypXw5PCmZB5y68QQ4uRaVVi3UthsoJROvbjDJkP2D"
+       "Q6L/eN8pFeLFzNPKBYzcmuMOb5Ull7w==",
+       uint64_t{0xdc2afaa529beef44}, uint64_t{0xc46b71fecefd5467}},
+      {"jVDKGYIuWOP/"
+       "QKLdd2wi8B2VJA8Wh0c8PwrXJVM8FOGM3voPDVPyDJOU6QsBDPseoR8uuKd19OZ/"
+       "zAvSCB+zlf6upAsBlheUKgCfKww=",
+       uint64_t{0xf1f67391d45013a8}, uint64_t{0x2c8e94679d964e0a}},
+      {"mkquunhmYe1aR2wmUz4vcvLEcKBoe6H+kjUok9VUn2+eTSkWs4oDDtJvNCWtY5efJwg/"
+       "j4PgjRYWtqnrCkhaqJaEvkkOwVfgMIwF3e+d",
+       uint64_t{0x16fce2b8c65a3429}, uint64_t{0x8612b797ce22503a}},
+      {"fRelvKYonTQ+s+rnnvQw+JzGfFoPixtna0vzcSjiDqX5s2Kg2//"
+       "UGrK+AVCyMUhO98WoB1DDbrsOYSw2QzrcPe0+3ck9sePvb+Q/IRaHbw==",
+       uint64_t{0xf4b096699f49fe67}, uint64_t{0x59f929babfba7170}},
+      {"DUwXFJzagljo44QeJ7/"
+       "6ZKw4QXV18lhkYT2jglMr8WB3CHUU4vdsytvw6AKv42ZcG6fRkZkq9fpnmXy6xG0aO3WPT1"
+       "eHuyFirAlkW+zKtwg=",
+       uint64_t{0xca584c4bc8198682}, uint64_t{0x9527556923fb49a0}},
+      {"cYmZCrOOBBongNTr7e4nYn52uQUy2mfe48s50JXx2AZ6cRAt/"
+       "xRHJ5QbEoEJOeOHsJyM4nbzwFm++SlT6gFZZHJpkXJ92JkR86uS/eV1hJUR",
+       uint64_t{0xed269fc3818b6aad}, uint64_t{0x1039ab644f5e150b}},
+      {"EXeHBDfhwzAKFhsMcH9+2RHwV+mJaN01+9oacF6vgm8mCXRd6jeN9U2oAb0of5c5cO4i+"
+       "Vb/LlHZSMI490SnHU0bejhSCC2gsC5d2K30ER3iNA==",
+       uint64_t{0x33f253cbb8fe66a8}, uint64_t{0x7816c83f3aa05e6d}},
+      {"FzkzRYoNjkxFhZDso94IHRZaJUP61nFYrh5MwDwv9FNoJ5jyNCY/"
+       "eazPZk+tbmzDyJIGw2h3GxaWZ9bSlsol/vK98SbkMKCQ/wbfrXRLcDzdd/8=",
+       uint64_t{0xd0b76b2c1523d99c}, uint64_t{0xf51d2f564518c619}},
+      {"Re4aXISCMlYY/XsX7zkIFR04ta03u4zkL9dVbLXMa/q6hlY/CImVIIYRN3VKP4pnd0AUr/"
+       "ugkyt36JcstAInb4h9rpAGQ7GMVOgBniiMBZ/MGU7H",
+       uint64_t{0xfd28f0811a2a237f}, uint64_t{0x67d494cff03ac004}},
+      {"ueLyMcqJXX+MhO4UApylCN9WlTQ+"
+       "ltJmItgG7vFUtqs2qNwBMjmAvr5u0sAKd8jpzV0dDPTwchbIeAW5zbtkA2NABJV6hFM48ib"
+       "4/J3A5mseA3cS8w==",
+       uint64_t{0x6261fb136482e84}, uint64_t{0x2802d636ced1cfbb}},
+      {"6Si7Yi11L+jZMkwaN+GUuzXMrlvEqviEkGOilNq0h8TdQyYKuFXzkYc/"
+       "q74gP3pVCyiwz9KpVGMM9vfnq36riMHRknkmhQutxLZs5fbmOgEO69HglCU=",
+       uint64_t{0x458efc750bca7c3a}, uint64_t{0xf64e20bad771cb12}},
+      {"Q6AbOofGuTJOegPh9Clm/"
+       "9crtUMQqylKrTc1fhfJo1tqvpXxhU4k08kntL1RG7woRnFrVh2UoMrL1kjin+s9CanT+"
+       "y4hHwLqRranl9FjvxfVKm3yvg68",
+       uint64_t{0xa7e69ff84e5e7c27}, uint64_t{0xb9a6cf84a83e15e}},
+      {"ieQEbIPvqY2YfIjHnqfJiO1/MIVRk0RoaG/WWi3kFrfIGiNLCczYoklgaecHMm/"
+       "1sZ96AjO+a5stQfZbJQwS7Sc1ODABEdJKcTsxeW2hbh9A6CFzpowP1A==",
+       uint64_t{0x3c59bfd0c29efe9e}, uint64_t{0x8da6630319609301}},
+      {"zQUv8hFB3zh2GGl3KTvCmnfzE+"
+       "SUgQPVaSVIELFX5H9cE3FuVFGmymkPQZJLAyzC90Cmi8GqYCvPqTuAAB//"
+       "XTJxy4bCcVArgZG9zJXpjowpNBfr3ngWrSE=",
+       uint64_t{0x10befacc6afd298d}, uint64_t{0x40946a86e2a996f3}},
+      {"US4hcC1+op5JKGC7eIs8CUgInjKWKlvKQkapulxW262E/"
+       "B2ye79QxOexf188u2mFwwe3WTISJHRZzS61IwljqAWAWoBAqkUnW8SHmIDwHUP31J0p5sGd"
+       "P47L",
+       uint64_t{0x41d5320b0a38efa7}, uint64_t{0xcab7f5997953fa76}},
+      {"9bHUWFna2LNaGF6fQLlkx1Hkt24nrkLE2CmFdWgTQV3FFbUe747SSqYw6ebpTa07MWSpWRP"
+       "sHesVo2B9tqHbe7eQmqYebPDFnNqrhSdZwFm9arLQVs+7a3Ic6A==",
+       uint64_t{0x58db1c7450fe17f3}, uint64_t{0x39129ca0e04fc465}},
+      {"Kb3DpHRUPhtyqgs3RuXjzA08jGb59hjKTOeFt1qhoINfYyfTt2buKhD6YVffRCPsgK9SeqZ"
+       "qRPJSyaqsa0ovyq1WnWW8jI/NhvAkZTVHUrX2pC+cD3OPYT05Dag=",
+       uint64_t{0x6098c055a335b7a6}, uint64_t{0x5238221fd685e1b8}},
+      {"gzxyMJIPlU+bJBwhFUCHSofZ/"
+       "319LxqMoqnt3+L6h2U2+ZXJCSsYpE80xmR0Ta77Jq54o92SMH87HV8dGOaCTuAYF+"
+       "lDL42SY1P316Cl0sZTS2ow3ZqwGbcPNs/1",
+       uint64_t{0x1bbacec67845a801}, uint64_t{0x175130c407dbcaab}},
+      {"uR7V0TW+FGVMpsifnaBAQ3IGlr1wx5sKd7TChuqRe6OvUXTlD4hKWy8S+"
+       "8yyOw8lQabism19vOQxfmocEOW/"
+       "vzY0pEa87qHrAZy4s9fH2Bltu8vaOIe+agYohhYORQ==",
+       uint64_t{0xc419cfc7442190}, uint64_t{0x2f20e7536c0b0df}},
+      {"1UR5eoo2aCwhacjZHaCh9bkOsITp6QunUxHQ2SfeHv0imHetzt/"
+       "Z70mhyWZBalv6eAx+YfWKCUib2SHDtz/"
+       "A2dc3hqUWX5VfAV7FQsghPUAtu6IiRatq4YSLpDvKZBQ=",
+       uint64_t{0xc95e510d94ba270c}, uint64_t{0x2742cb488a04ad56}},
+      {"opubR7H63BH7OtY+Avd7QyQ25UZ8kLBdFDsBTwZlY6gA/"
+       "u+x+"
+       "czC9AaZMgmQrUy15DH7YMGsvdXnviTtI4eVI4aF1H9Rl3NXMKZgwFOsdTfdcZeeHVRzBBKX"
+       "8jUfh1il",
+       uint64_t{0xff1ae05c98089c3f}, uint64_t{0xd6afb593879ff93b}},
+      {"DC0kXcSXtfQ9FbSRwirIn5tgPri0sbzHSa78aDZVDUKCMaBGyFU6BmrulywYX8yzvwprdLs"
+       "oOwTWN2wMjHlPDqrvVHNEjnmufRDblW+nSS+xtKNs3N5xsxXdv6JXDrAB/Q==",
+       uint64_t{0x90c02b8dceced493}, uint64_t{0xf50ad64caac0ca7f}},
+      {"BXRBk+3wEP3Lpm1y75wjoz+PgB0AMzLe8tQ1AYU2/"
+       "oqrQB2YMC6W+9QDbcOfkGbeH+b7IBkt/"
+       "gwCMw2HaQsRFEsurXtcQ3YwRuPz5XNaw5NAvrNa67Fm7eRzdE1+hWLKtA8=",
+       uint64_t{0x9f8a76697ab1aa36}, uint64_t{0x2ade95c4261364ae}},
+      {"RRBSvEGYnzR9E45Aps/+WSnpCo/X7gJLO4DRnUqFrJCV/kzWlusLE/"
+       "6ZU6RoUf2ROwcgEvUiXTGjLs7ts3t9SXnJHxC1KiOzxHdYLMhVvgNd3hVSAXODpKFSkVXND"
+       "55G2L1W",
+       uint64_t{0x6ba1bf3d811a531d}, uint64_t{0x5c4f3299faacd07a}},
+      {"jeh6Qazxmdi57pa9S3XSnnZFIRrnc6s8QLrah5OX3SB/V2ErSPoEAumavzQPkdKF1/"
+       "SfvmdL+qgF1C+Yawy562QaFqwVGq7+tW0yxP8FStb56ZRgNI4IOmI30s1Ei7iops9Uuw==",
+       uint64_t{0x6a418974109c67b4}, uint64_t{0xfffe3bff0ae5e9bc}},
+      {"6QO5nnDrY2/"
+       "wrUXpltlKy2dSBcmK15fOY092CR7KxAjNfaY+"
+       "aAmtWbbzQk3MjBg03x39afSUN1fkrWACdyQKRaGxgwq6MGNxI6W+8DLWJBHzIXrntrE/"
+       "ml6fnNXEpxplWJ1vEs4=",
+       uint64_t{0x8472f1c2b3d230a3}, uint64_t{0x1db785c0005166e4}},
+      {"0oPxeEHhqhcFuwonNfLd5jF3RNATGZS6NPoS0WklnzyokbTqcl4BeBkMn07+fDQv83j/"
+       "BpGUwcWO05f3+DYzocfnizpFjLJemFGsls3gxcBYxcbqWYev51tG3lN9EvRE+X9+Pwww",
+       uint64_t{0x5e06068f884e73a7}, uint64_t{0xea000d962ad18418}},
+      {"naSBSjtOKgAOg8XVbR5cHAW3Y+QL4Pb/JO9/"
+       "oy6L08wvVRZqo0BrssMwhzBP401Um7A4ppAupbQeJFdMrysY34AuSSNvtNUy5VxjNECwiNt"
+       "gwYHw7yakDUv8WvonctmnoSPKENegQg==",
+       uint64_t{0x55290b1a8f170f59}, uint64_t{0xe42aef38359362d9}},
+      {"vPyl8DxVeRe1OpilKb9KNwpGkQRtA94UpAHetNh+"
+       "95V7nIW38v7PpzhnTWIml5kw3So1Si0TXtIUPIbsu32BNhoH7QwFvLM+"
+       "JACgSpc5e3RjsL6Qwxxi11npwxRmRUqATDeMUfRAjxg=",
+       uint64_t{0x5501cfd83dfe706a}, uint64_t{0xc8e95657348a3891}},
+      {"QC9i2GjdTMuNC1xQJ74ngKfrlA4w3o58FhvNCltdIpuMhHP1YsDA78scQPLbZ3OCUgeQguY"
+       "f/vw6zAaVKSgwtaykqg5ka/4vhz4hYqWU5ficdXqClHl+zkWEY26slCNYOM5nnDlly8Cj",
+       uint64_t{0xe43ed13d13a66990}, uint64_t{0xc162eca864f238c6}},
+      {"7CNIgQhAHX27nxI0HeB5oUTnTdgKpRDYDKwRcXfSFGP1XeT9nQF6WKCMjL1tBV6x7KuJ91G"
+       "Zz11F4c+8s+MfqEAEpd4FHzamrMNjGcjCyrVtU6y+7HscMVzr7Q/"
+       "ODLcPEFztFnwjvCjmHw==",
+       uint64_t{0xdf43bc375cf5283f}, uint64_t{0xbe1fb373e20579ad}},
+      {"Qa/hC2RPXhANSospe+gUaPfjdK/yhQvfm4cCV6/pdvCYWPv8p1kMtKOX3h5/"
+       "8oZ31fsmx4Axphu5qXJokuhZKkBUJueuMpxRyXpwSWz2wELx5glxF7CM0Fn+"
+       "OevnkhUn5jsPlG2r5jYlVn8=",
+       uint64_t{0x8112b806d288d7b5}, uint64_t{0x628a1d4f40aa6ffd}},
+      {"kUw/0z4l3a89jTwN5jpG0SHY5km/"
+       "IVhTjgM5xCiPRLncg40aqWrJ5vcF891AOq5hEpSq0bUCJUMFXgct7kvnys905HjerV7Vs1G"
+       "y84tgVJ70/2+pAZTsB/PzNOE/G6sOj4+GbTzkQu819OLB",
+       uint64_t{0xd52a18abb001cb46}, uint64_t{0xa87bdb7456340f90}},
+      {"VDdfSDbO8Tdj3T5W0XM3EI7iHh5xpIutiM6dvcJ/fhe23V/srFEkDy5iZf/"
+       "VnA9kfi2C79ENnFnbOReeuZW1b3MUXB9lgC6U4pOTuC+"
+       "jHK3Qnpyiqzj7h3ISJSuo2pob7vY6VHZo6Fn7exEqHg==",
+       uint64_t{0xe12b76a2433a1236}, uint64_t{0x5960ef3ba982c801}},
+      {"Ldfvy3ORdquM/R2fIkhH/ONi69mcP1AEJ6n/"
+       "oropwecAsLJzQSgezSY8bEiEs0VnFTBBsW+RtZY6tDj03fnb3amNUOq1b7jbqyQkL9hpl+"
+       "2Z2J8IaVSeownWl+bQcsR5/xRktIMckC5AtF4YHfU=",
+       uint64_t{0x175bf7319cf1fa00}, uint64_t{0x5026586df9a431ec}},
+      {"BrbNpb42+"
+       "VzZAjJw6QLirXzhweCVRfwlczzZ0VX2xluskwBqyfnGovz5EuX79JJ31VNXa5hTkAyQat3l"
+       "YKRADTdAdwE5PqM1N7YaMqqsqoAAAeuYVXuk5eWCykYmClNdSspegwgCuT+403JigBzi",
+       uint64_t{0xd63d57b3f67525ae}, uint64_t{0xfe4b8a20fdf0840b}},
+      {"gB3NGHJJvVcuPyF0ZSvHwnWSIfmaI7La24VMPQVoIIWF7Z74NltPZZpx2f+cocESM+"
+       "ILzQW9p+BC8x5IWz7N4Str2WLGKMdgmaBfNkEhSHQDU0IJEOnpUt0HmjhFaBlx0/"
+       "LTmhua+rQ6Wup8ezLwfg==",
+       uint64_t{0x933faea858832b73}, uint64_t{0xdcb761867da7072f}},
+      {"hTKHlRxx6Pl4gjG+6ksvvj0CWFicUg3WrPdSJypDpq91LUWRni2KF6+"
+       "81ZoHBFhEBrCdogKqeK+hy9bLDnx7g6rAFUjtn1+cWzQ2YjiOpz4+"
+       "ROBB7lnwjyTGWzJD1rXtlso1g2qVH8XJVigC5M9AIxM=",
+       uint64_t{0x53d061e5f8e7c04f}, uint64_t{0xc10d4653667275b7}},
+      {"IWQBelSQnhrr0F3BhUpXUIDauhX6f95Qp+A0diFXiUK7irwPG1oqBiqHyK/SH/"
+       "9S+"
+       "rln9DlFROAmeFdH0OCJi2tFm4afxYzJTFR4HnR4cG4x12JqHaZLQx6iiu6CE3rtWBVz99oA"
+       "wCZUOEXIsLU24o2Y",
+       uint64_t{0xdb4124556dd515e0}, uint64_t{0x727720deec13110b}},
+      {"TKo+l+"
+       "1dOXdLvIrFqeLaHdm0HZnbcdEgOoLVcGRiCbAMR0j5pIFw8D36tefckAS1RCFOH5IgP8yiF"
+       "T0Gd0a2hI3+"
+       "fTKA7iK96NekxWeoeqzJyctc6QsoiyBlkZerRxs5RplrxoeNg29kKDTM0K94mnhD9g==",
+       uint64_t{0x4fb31a0dd681ee71}, uint64_t{0x710b009662858dc9}},
+      {"YU4e7G6EfQYvxCFoCrrT0EFgVLHFfOWRTJQJ5gxM3G2b+"
+       "1kJf9YPrpsxF6Xr6nYtS8reEEbDoZJYqnlk9lXSkVArm88Cqn6d25VCx3+"
+       "49MqC0trIlXtb7SXUUhwpJK16T0hJUfPH7s5cMZXc6YmmbFuBNPE=",
+       uint64_t{0x27cc72eefa138e4c}, uint64_t{0xfbf8f7a3ecac1eb7}},
+      {"/I/"
+       "eImMwPo1U6wekNFD1Jxjk9XQVi1D+"
+       "FPdqcHifYXQuP5aScNQfxMAmaPR2XhuOQhADV5tTVbBKwCDCX4E3jcDNHzCiPvViZF1W27t"
+       "xaf2BbFQdwKrNCmrtzcluBFYu0XZfc7RU1RmxK/RtnF1qHsq/O4pp",
+       uint64_t{0x44bc2dfba4bd3ced}, uint64_t{0xb6fc4fcd0722e3df}},
+      {"CJTT9WGcY2XykTdo8KodRIA29qsqY0iHzWZRjKHb9alwyJ7RZAE3V5Juv4MY3MeYEr1EPCC"
+       "MxO7yFXqT8XA8YTjaMp3bafRt17Pw8JC4iKJ1zN+WWKOESrj+"
+       "3aluGQqn8z1EzqY4PH7rLG575PYeWsP98BugdA==",
+       uint64_t{0x242da1e3a439bed8}, uint64_t{0x7cb86dcc55104aac}},
+      {"ZlhyQwLhXQyIUEnMH/"
+       "AEW27vh9xrbNKJxpWGtrEmKhd+nFqAfbeNBQjW0SfG1YI0xQkQMHXjuTt4P/"
+       "EpZRtA47ibZDVS8TtaxwyBjuIDwqcN09eCtpC+Ls+"
+       "vWDTLmBeDM3u4hmzz4DQAYsLiZYSJcldg9Q3wszw=",
+       uint64_t{0xdc559c746e35c139}, uint64_t{0x19e71e9b45c3a51e}},
+      {"v2KU8y0sCrBghmnm8lzGJlwo6D6ObccAxCf10heoDtYLosk4ztTpLlpSFEyu23MLA1tJkcg"
+       "Rko04h19QMG0mOw/"
+       "wc93EXAweriBqXfvdaP85sZABwiKO+6rtS9pacRVpYYhHJeVTQ5NzrvBvi1huxAr+"
+       "xswhVMfL",
+       uint64_t{0xd0b0350275b9989}, uint64_t{0x51de38573c2bea48}},
+      {"QhKlnIS6BuVCTQsnoE67E/"
+       "yrgogE8EwO7xLaEGei26m0gEU4OksefJgppDh3X0x0Cs78Dr9IHK5b977CmZlrTRmwhlP8p"
+       "M+UzXPNRNIZuN3ntOum/QhUWP8SGpirheXENWsXMQ/"
+       "nxtxakyEtrNkKk471Oov9juP8oQ==",
+       uint64_t{0xb04489e41d17730c}, uint64_t{0xa73ab6996d6df158}},
+      {"/ZRMgnoRt+Uo6fUPr9FqQvKX7syhgVqWu+"
+       "WUSsiQ68UlN0efSP6Eced5gJZL6tg9gcYJIkhjuQNITU0Q3TjVAnAcobgbJikCn6qZ6pRxK"
+       "BY4MTiAlfGD3T7R7hwJwx554MAy++Zb/YUFlnCaCJiwQMnowF7aQzwYFCo=",
+       uint64_t{0x2217285eb4572156}, uint64_t{0x55ef2b8c930817b2}},
+      {"NB7tU5fNE8nI+SXGfipc7sRkhnSkUF1krjeo6k+8FITaAtdyz+"
+       "o7mONgXmGLulBPH9bEwyYhKNVY0L+njNQrZ9YC2aXsFD3PdZsxAFaBT3VXEzh+"
+       "NGBTjDASNL3mXyS8Yv1iThGfHoY7T4aR0NYGJ+k+pR6f+KrPC96M",
+       uint64_t{0x12c2e8e68aede73b}, uint64_t{0xb2850bf5fae87157}},
+      {"8T6wrqCtEO6/rwxF6lvMeyuigVOLwPipX/FULvwyu+1wa5sQGav/"
+       "2FsLHUVn6cGSi0LlFwLewGHPFJDLR0u4t7ZUyM//"
+       "x6da0sWgOa5hzDqjsVGmjxEHXiaXKW3i4iSZNuxoNbMQkIbVML+"
+       "DkYu9ND0O2swg4itGeVSzXA==",
+       uint64_t{0x4d612125bdc4fd00}, uint64_t{0xecf3de1acd04651f}},
+      {"Ntf1bMRdondtMv1CYr3G80iDJ4WSAlKy5H34XdGruQiCrnRGDBa+"
+       "eUi7vKp4gp3BBcVGl8eYSasVQQjn7MLvb3BjtXx6c/"
+       "bCL7JtpzQKaDnPr9GWRxpBXVxKREgMM7d8lm35EODv0w+"
+       "hQLfVSh8OGs7fsBb68nNWPLeeSOo=",
+       uint64_t{0x81826b553954464e}, uint64_t{0xcc0a40552559ff32}},
+      {"VsSAw72Ro6xks02kaiLuiTEIWBC5bgqr4WDnmP8vglXzAhixk7td926rm9jNimL+"
+       "kroPSygZ9gl63aF5DCPOACXmsbmhDrAQuUzoh9ZKhWgElLQsrqo1KIjWoZT5b5QfVUXY9lS"
+       "IBg3U75SqORoTPq7HalxxoIT5diWOcJQi",
+       uint64_t{0xc2e5d345dc0ddd2d}, uint64_t{0xc385c374f20315b1}},
+      {"j+loZ+C87+"
+       "bJxNVebg94gU0mSLeDulcHs84tQT7BZM2rzDSLiCNxUedHr1ZWJ9ejTiBa0dqy2I2ABc++"
+       "xzOLcv+//YfibtjKtYggC6/3rv0XCc7xu6d/"
+       "O6xO+XOBhOWAQ+IHJVHf7wZnDxIXB8AUHsnjEISKj7823biqXjyP3g==",
+       uint64_t{0x3da6830a9e32631e}, uint64_t{0xb90208a4c7234183}},
+      {"f3LlpcPElMkspNtDq5xXyWU62erEaKn7RWKlo540gR6mZsNpK1czV/"
+       "sOmqaq8XAQLEn68LKj6/"
+       "cFkJukxRzCa4OF1a7cCAXYFp9+wZDu0bw4y63qbpjhdCl8GO6Z2lkcXy7KOzbPE01ukg7+"
+       "gN+7uKpoohgAhIwpAKQXmX5xtd0=",
+       uint64_t{0xc9ae5c8759b4877a}, uint64_t{0x58aa1ca7a4c075d9}},
+  };
+
+  for (const auto& expected_result : expected_results) {
+    std::string str;
+    ASSERT_TRUE(absl::Base64Unescape(expected_result.base64_data, &str));
+    EXPECT_EQ(absl::hash_internal::Wyhash(str.data(), str.size(),
+                                          expected_result.seed, kSalt),
+              expected_result.hash);
+  }
+}
+
+}  // namespace
diff --git a/third_party/abseil-cpp/absl/meta/type_traits.h b/third_party/abseil-cpp/absl/meta/type_traits.h
index 75689bb..d5cb5f3 100644
--- a/third_party/abseil-cpp/absl/meta/type_traits.h
+++ b/third_party/abseil-cpp/absl/meta/type_traits.h
@@ -610,8 +610,22 @@
 template <typename T>
 using underlying_type_t = typename std::underlying_type<T>::type;
 
-template <typename T>
-using result_of_t = typename std::result_of<T>::type;
+
+namespace type_traits_internal {
+
+#if __cplusplus >= 201703L
+// std::result_of is deprecated (C++17) or removed (C++20)
+template<typename> struct result_of;
+template<typename F, typename... Args>
+struct result_of<F(Args...)> : std::invoke_result<F, Args...> {};
+#else
+template<typename F> using result_of = std::result_of<F>;
+#endif
+
+}  // namespace type_traits_internal
+
+template<typename F>
+using result_of_t = typename type_traits_internal::result_of<F>::type;
 
 namespace type_traits_internal {
 // In MSVC we can't probe std::hash or stdext::hash because it triggers a
diff --git a/third_party/abseil-cpp/absl/random/internal/randen.cc b/third_party/abseil-cpp/absl/random/internal/randen.cc
index 78a1e00..c1bc044 100644
--- a/third_party/abseil-cpp/absl/random/internal/randen.cc
+++ b/third_party/abseil-cpp/absl/random/internal/randen.cc
@@ -17,7 +17,7 @@
 #include "absl/base/internal/raw_logging.h"
 #include "absl/random/internal/randen_detect.h"
 
-// RANDen = RANDom generator or beetroots in Swiss German.
+// RANDen = RANDom generator or beetroots in Swiss High German.
 // 'Strong' (well-distributed, unpredictable, backtracking-resistant) random
 // generator, faster in some benchmarks than std::mt19937_64 and pcg64_c32.
 //
diff --git a/third_party/abseil-cpp/absl/random/internal/randen.h b/third_party/abseil-cpp/absl/random/internal/randen.h
index c2834aa..9a3840b 100644
--- a/third_party/abseil-cpp/absl/random/internal/randen.h
+++ b/third_party/abseil-cpp/absl/random/internal/randen.h
@@ -26,7 +26,7 @@
 ABSL_NAMESPACE_BEGIN
 namespace random_internal {
 
-// RANDen = RANDom generator or beetroots in Swiss German.
+// RANDen = RANDom generator or beetroots in Swiss High German.
 // 'Strong' (well-distributed, unpredictable, backtracking-resistant) random
 // generator, faster in some benchmarks than std::mt19937_64 and pcg64_c32.
 //
diff --git a/third_party/abseil-cpp/absl/random/internal/randen_hwaes.h b/third_party/abseil-cpp/absl/random/internal/randen_hwaes.h
index bce36b5..71a7f69 100644
--- a/third_party/abseil-cpp/absl/random/internal/randen_hwaes.h
+++ b/third_party/abseil-cpp/absl/random/internal/randen_hwaes.h
@@ -26,7 +26,7 @@
 ABSL_NAMESPACE_BEGIN
 namespace random_internal {
 
-// RANDen = RANDom generator or beetroots in Swiss German.
+// RANDen = RANDom generator or beetroots in Swiss High German.
 // 'Strong' (well-distributed, unpredictable, backtracking-resistant) random
 // generator, faster in some benchmarks than std::mt19937_64 and pcg64_c32.
 //
diff --git a/third_party/abseil-cpp/absl/random/internal/randen_slow.h b/third_party/abseil-cpp/absl/random/internal/randen_slow.h
index b6f137e..532c3a8 100644
--- a/third_party/abseil-cpp/absl/random/internal/randen_slow.h
+++ b/third_party/abseil-cpp/absl/random/internal/randen_slow.h
@@ -23,7 +23,7 @@
 ABSL_NAMESPACE_BEGIN
 namespace random_internal {
 
-// RANDen = RANDom generator or beetroots in Swiss German.
+// RANDen = RANDom generator or beetroots in Swiss High German.
 // RandenSlow implements the basic state manipulation methods for
 // architectures lacking AES hardware acceleration intrinsics.
 class RandenSlow {
diff --git a/third_party/abseil-cpp/absl/random/internal/randen_traits.h b/third_party/abseil-cpp/absl/random/internal/randen_traits.h
index 53caa93..120022c 100644
--- a/third_party/abseil-cpp/absl/random/internal/randen_traits.h
+++ b/third_party/abseil-cpp/absl/random/internal/randen_traits.h
@@ -28,7 +28,7 @@
 ABSL_NAMESPACE_BEGIN
 namespace random_internal {
 
-// RANDen = RANDom generator or beetroots in Swiss German.
+// RANDen = RANDom generator or beetroots in Swiss High German.
 // 'Strong' (well-distributed, unpredictable, backtracking-resistant) random
 // generator, faster in some benchmarks than std::mt19937_64 and pcg64_c32.
 //
diff --git a/third_party/abseil-cpp/absl/status/internal/status_internal.h b/third_party/abseil-cpp/absl/status/internal/status_internal.h
index 1f82b8e..279f8f5 100644
--- a/third_party/abseil-cpp/absl/status/internal/status_internal.h
+++ b/third_party/abseil-cpp/absl/status/internal/status_internal.h
@@ -36,6 +36,13 @@
 
 // Reference-counted representation of Status data.
 struct StatusRep {
+  StatusRep(absl::StatusCode code, std::string message,
+            std::unique_ptr<status_internal::Payloads> payloads)
+      : ref(int32_t{1}),
+        code(code),
+        message(std::move(message)),
+        payloads(std::move(payloads)) {}
+
   std::atomic<int32_t> ref;
   absl::StatusCode code;
   std::string message;
diff --git a/third_party/abseil-cpp/absl/status/status.cc b/third_party/abseil-cpp/absl/status/status.cc
index a27fd8b..c71de84 100644
--- a/third_party/abseil-cpp/absl/status/status.cc
+++ b/third_party/abseil-cpp/absl/status/status.cc
@@ -209,11 +209,8 @@
 
 uintptr_t Status::NewRep(absl::StatusCode code, absl::string_view msg,
                          std::unique_ptr<status_internal::Payloads> payloads) {
-  status_internal::StatusRep* rep = new status_internal::StatusRep;
-  rep->ref.store(1, std::memory_order_relaxed);
-  rep->code = code;
-  rep->message.assign(msg.data(), msg.size());
-  rep->payloads = std::move(payloads);
+  status_internal::StatusRep* rep = new status_internal::StatusRep(
+      code, std::string(msg.data(), msg.size()), std::move(payloads));
   return PointerToRep(rep);
 }
 
diff --git a/third_party/abseil-cpp/absl/status/status.h b/third_party/abseil-cpp/absl/status/status.h
index c4d6fce..9019e6c 100644
--- a/third_party/abseil-cpp/absl/status/status.h
+++ b/third_party/abseil-cpp/absl/status/status.h
@@ -57,6 +57,7 @@
 #include "absl/container/inlined_vector.h"
 #include "absl/status/internal/status_internal.h"
 #include "absl/strings/cord.h"
+#include "absl/strings/string_view.h"
 #include "absl/types/optional.h"
 
 namespace absl {
diff --git a/third_party/abseil-cpp/absl/strings/BUILD.bazel b/third_party/abseil-cpp/absl/strings/BUILD.bazel
index 30a8dd2..a1579a4 100644
--- a/third_party/abseil-cpp/absl/strings/BUILD.bazel
+++ b/third_party/abseil-cpp/absl/strings/BUILD.bazel
@@ -267,7 +267,10 @@
 
 cc_library(
     name = "cord_internal",
-    hdrs = ["internal/cord_internal.h"],
+    hdrs = [
+        "internal/cord_internal.h",
+        "internal/cord_rep_flat.h",
+    ],
     copts = ABSL_DEFAULT_COPTS,
     visibility = ["//visibility:private"],
     deps = [
diff --git a/third_party/abseil-cpp/absl/strings/BUILD.gn b/third_party/abseil-cpp/absl/strings/BUILD.gn
index 4495790..a949c9d 100644
--- a/third_party/abseil-cpp/absl/strings/BUILD.gn
+++ b/third_party/abseil-cpp/absl/strings/BUILD.gn
@@ -117,7 +117,10 @@
 }
 
 absl_source_set("cord_internal") {
-  public = [ "internal/cord_internal.h" ]
+  public = [
+    "internal/cord_internal.h",
+    "internal/cord_rep_flat.h",
+  ]
   visibility = [ ":*" ]
   deps = [
     ":strings",
diff --git a/third_party/abseil-cpp/absl/strings/CMakeLists.txt b/third_party/abseil-cpp/absl/strings/CMakeLists.txt
index 2b994a7..af0b57d 100644
--- a/third_party/abseil-cpp/absl/strings/CMakeLists.txt
+++ b/third_party/abseil-cpp/absl/strings/CMakeLists.txt
@@ -557,6 +557,7 @@
   SRCS
     "cord.cc"
     "internal/cord_internal.h"
+    "internal/cord_rep_flat.h"
   COPTS
     ${ABSL_DEFAULT_COPTS}
   DEPS
diff --git a/third_party/abseil-cpp/absl/strings/cord.cc b/third_party/abseil-cpp/absl/strings/cord.cc
index 9efd135..badeb61 100644
--- a/third_party/abseil-cpp/absl/strings/cord.cc
+++ b/third_party/abseil-cpp/absl/strings/cord.cc
@@ -36,6 +36,7 @@
 #include "absl/container/inlined_vector.h"
 #include "absl/strings/escaping.h"
 #include "absl/strings/internal/cord_internal.h"
+#include "absl/strings/internal/cord_rep_flat.h"
 #include "absl/strings/internal/resize_uninitialized.h"
 #include "absl/strings/str_cat.h"
 #include "absl/strings/str_format.h"
@@ -48,8 +49,12 @@
 using ::absl::cord_internal::CordRep;
 using ::absl::cord_internal::CordRepConcat;
 using ::absl::cord_internal::CordRepExternal;
+using ::absl::cord_internal::CordRepFlat;
 using ::absl::cord_internal::CordRepSubstring;
 
+using ::absl::cord_internal::kMinFlatLength;
+using ::absl::cord_internal::kMaxFlatLength;
+
 using ::absl::cord_internal::CONCAT;
 using ::absl::cord_internal::EXTERNAL;
 using ::absl::cord_internal::FLAT;
@@ -87,54 +92,20 @@
   return static_cast<const CordRepExternal*>(this);
 }
 
+inline CordRepFlat* CordRep::flat() {
+  assert(tag >= FLAT);
+  return static_cast<CordRepFlat*>(this);
+}
+inline const CordRepFlat* CordRep::flat() const {
+  assert(tag >= FLAT);
+  return static_cast<const CordRepFlat*>(this);
+}
+
 }  // namespace cord_internal
 
-static const size_t kFlatOverhead = offsetof(CordRep, data);
-
-// Largest and smallest flat node lengths we are willing to allocate
-// Flat allocation size is stored in tag, which currently can encode sizes up
-// to 4K, encoded as multiple of either 8 or 32 bytes.
-// If we allow for larger sizes, we need to change this to 8/64, 16/128, etc.
-static constexpr size_t kMaxFlatSize = 4096;
-static constexpr size_t kMaxFlatLength = kMaxFlatSize - kFlatOverhead;
-static constexpr size_t kMinFlatLength = 32 - kFlatOverhead;
-
 // Prefer copying blocks of at most this size, otherwise reference count.
 static const size_t kMaxBytesToCopy = 511;
 
-// Helper functions for rounded div, and rounding to exact sizes.
-static size_t DivUp(size_t n, size_t m) { return (n + m - 1) / m; }
-static size_t RoundUp(size_t n, size_t m) { return DivUp(n, m) * m; }
-
-// Returns the size to the nearest equal or larger value that can be
-// expressed exactly as a tag value.
-static size_t RoundUpForTag(size_t size) {
-  return RoundUp(size, (size <= 1024) ? 8 : 32);
-}
-
-// Converts the allocated size to a tag, rounding down if the size
-// does not exactly match a 'tag expressible' size value. The result is
-// undefined if the size exceeds the maximum size that can be encoded in
-// a tag, i.e., if size is larger than TagToAllocatedSize(<max tag>).
-static uint8_t AllocatedSizeToTag(size_t size) {
-  const size_t tag = (size <= 1024) ? size / 8 : 128 + size / 32 - 1024 / 32;
-  assert(tag <= std::numeric_limits<uint8_t>::max());
-  return tag;
-}
-
-// Converts the provided tag to the corresponding allocated size
-static constexpr size_t TagToAllocatedSize(uint8_t tag) {
-  return (tag <= 128) ? (tag * 8) : (1024 + (tag - 128) * 32);
-}
-
-// Converts the provided tag to the corresponding available data length
-static constexpr size_t TagToLength(uint8_t tag) {
-  return TagToAllocatedSize(tag) - kFlatOverhead;
-}
-
-// Enforce that kMaxFlatSize maps to a well-known exact tag value.
-static_assert(TagToAllocatedSize(224) == kMaxFlatSize, "Bad tag logic");
-
 constexpr uint64_t Fibonacci(unsigned char n, uint64_t a = 0, uint64_t b = 1) {
   return n == 0 ? a : Fibonacci(n - 1, b, a + b);
 }
@@ -256,9 +227,7 @@
         continue;
       }
     } else if (rep->tag == EXTERNAL) {
-      CordRepExternal* rep_external = rep->external();
-      assert(rep_external->releaser_invoker != nullptr);
-      rep_external->releaser_invoker(rep_external);
+      CordRepExternal::Delete(rep);
       rep = nullptr;
     } else if (rep->tag == SUBSTRING) {
       CordRepSubstring* rep_substring = rep->substring();
@@ -270,17 +239,7 @@
         continue;
       }
     } else {
-      // Flat CordReps are allocated and constructed with raw ::operator new
-      // and placement new, and must be destructed and deallocated
-      // accordingly.
-#if defined(__cpp_sized_deallocation)
-      size_t size = TagToAllocatedSize(rep->tag);
-      rep->~CordRep();
-      ::operator delete(rep, size);
-#else
-      rep->~CordRep();
-      ::operator delete(rep);
-#endif
+      CordRepFlat::Delete(rep);
       rep = nullptr;
     }
 
@@ -370,22 +329,6 @@
   return reps[0];
 }
 
-// Create a new flat node.
-static CordRep* NewFlat(size_t length_hint) {
-  if (length_hint <= kMinFlatLength) {
-    length_hint = kMinFlatLength;
-  } else if (length_hint > kMaxFlatLength) {
-    length_hint = kMaxFlatLength;
-  }
-
-  // Round size up so it matches a size we can exactly express in a tag.
-  const size_t size = RoundUpForTag(length_hint + kFlatOverhead);
-  void* const raw_rep = ::operator new(size);
-  CordRep* rep = new (raw_rep) CordRep();
-  rep->tag = AllocatedSizeToTag(size);
-  return VerifyTree(rep);
-}
-
 // Create a new tree out of the specified array.
 // The returned node has a refcount of 1.
 static CordRep* NewTree(const char* data,
@@ -396,7 +339,7 @@
   size_t n = 0;
   do {
     const size_t len = std::min(length, kMaxFlatLength);
-    CordRep* rep = NewFlat(len + alloc_hint);
+    CordRep* rep = CordRepFlat::New(len + alloc_hint);
     rep->length = len;
     memcpy(rep->data, data, len);
     reps[n++] = VerifyTree(rep);
@@ -460,7 +403,7 @@
     return data_.as_tree.rep;
   }
 
-  CordRep* result = NewFlat(len + extra_hint);
+  CordRep* result = CordRepFlat::New(len + extra_hint);
   result->length = len;
   static_assert(kMinFlatLength >= sizeof(data_.as_chars), "");
   memcpy(result->data, data_.as_chars, sizeof(data_.as_chars));
@@ -522,7 +465,7 @@
   }
 
   const size_t in_use = dst->length;
-  const size_t capacity = TagToLength(dst->tag);
+  const size_t capacity = dst->flat()->Capacity();
   if (in_use == capacity) {
     *region = nullptr;
     *size = 0;
@@ -566,10 +509,9 @@
   }
 
   // Allocate new node.
-  CordRep* new_node =
-      NewFlat(std::max(static_cast<size_t>(root->length), max_length));
-  new_node->length =
-      std::min(static_cast<size_t>(TagToLength(new_node->tag)), max_length);
+  CordRepFlat* new_node =
+      CordRepFlat::New(std::max(static_cast<size_t>(root->length), max_length));
+  new_node->length = std::min(new_node->Capacity(), max_length);
   *region = new_node->data;
   *size = new_node->length;
   replace_tree(Concat(root, new_node));
@@ -594,8 +536,8 @@
   }
 
   // Allocate new node.
-  CordRep* new_node = NewFlat(root->length);
-  new_node->length = TagToLength(new_node->tag);
+  CordRepFlat* new_node = CordRepFlat::New(root->length);
+  new_node->length = new_node->Capacity();
   *region = new_node->data;
   *size = new_node->length;
   replace_tree(Concat(root, new_node));
@@ -605,7 +547,7 @@
 // will return true.
 static bool RepMemoryUsageLeaf(const CordRep* rep, size_t* total_mem_usage) {
   if (rep->tag >= FLAT) {
-    *total_mem_usage += TagToAllocatedSize(rep->tag);
+    *total_mem_usage += rep->flat()->AllocatedSize();
     return true;
   }
   if (rep->tag == EXTERNAL) {
@@ -703,7 +645,8 @@
     return *this;
   }
   if (tree != nullptr && tree->tag >= FLAT &&
-      TagToLength(tree->tag) >= length && tree->refcount.IsOne()) {
+      tree->flat()->Capacity() >= length &&
+      tree->refcount.IsOne()) {
     // Copy in place if the existing FLAT node is reusable.
     memmove(tree->data, data, length);
     tree->length = length;
@@ -757,8 +700,9 @@
     // either double the inlined size, or the added size + 10%.
     const size_t size1 = inline_length * 2 + src_size;
     const size_t size2 = inline_length + src_size / 10;
-    root = NewFlat(std::max<size_t>(size1, size2));
-    appended = std::min(src_size, TagToLength(root->tag) - inline_length);
+    root = CordRepFlat::New(std::max<size_t>(size1, size2));
+    appended = std::min(
+        src_size, root->flat()->Capacity() - inline_length);
     memcpy(root->data, data_.as_chars, inline_length);
     memcpy(root->data + inline_length, src_data, appended);
     root->length = inline_length + appended;
@@ -1734,7 +1678,7 @@
   // Try to put the contents into a new flat rep. If they won't fit in the
   // biggest possible flat node, use an external rep instead.
   if (total_size <= kMaxFlatLength) {
-    new_rep = NewFlat(total_size);
+    new_rep = CordRepFlat::New(total_size);
     new_rep->length = total_size;
     new_buffer = new_rep->data;
     CopyToArraySlowPath(new_buffer);
@@ -1849,7 +1793,8 @@
           *os << absl::CEscape(std::string(rep->external()->base, rep->length));
         *os << "]\n";
       } else {
-        *os << "FLAT cap=" << TagToLength(rep->tag) << " [";
+        *os << "FLAT cap=" << rep->flat()->Capacity()
+            << " [";
         if (include_data)
           *os << absl::CEscape(std::string(rep->data, rep->length));
         *os << "]\n";
@@ -1897,8 +1842,9 @@
         worklist.push_back(node->concat()->left);
       }
     } else if (node->tag >= FLAT) {
-      ABSL_INTERNAL_CHECK(node->length <= TagToLength(node->tag),
-                          ReportError(root, node));
+      ABSL_INTERNAL_CHECK(
+          node->length <= node->flat()->Capacity(),
+          ReportError(root, node));
     } else if (node->tag == EXTERNAL) {
       ABSL_INTERNAL_CHECK(node->external()->base != nullptr,
                           ReportError(root, node));
@@ -1974,14 +1920,14 @@
 }
 
 namespace strings_internal {
-size_t CordTestAccess::FlatOverhead() { return kFlatOverhead; }
-size_t CordTestAccess::MaxFlatLength() { return kMaxFlatLength; }
+size_t CordTestAccess::FlatOverhead() { return cord_internal::kFlatOverhead; }
+size_t CordTestAccess::MaxFlatLength() { return cord_internal::kMaxFlatLength; }
 size_t CordTestAccess::FlatTagToLength(uint8_t tag) {
-  return TagToLength(tag);
+  return cord_internal::TagToLength(tag);
 }
 uint8_t CordTestAccess::LengthToTag(size_t s) {
   ABSL_INTERNAL_CHECK(s <= kMaxFlatLength, absl::StrCat("Invalid length ", s));
-  return AllocatedSizeToTag(s + kFlatOverhead);
+  return cord_internal::AllocatedSizeToTag(s + cord_internal::kFlatOverhead);
 }
 size_t CordTestAccess::SizeofCordRepConcat() { return sizeof(CordRepConcat); }
 size_t CordTestAccess::SizeofCordRepExternal() {
diff --git a/third_party/abseil-cpp/absl/strings/internal/cord_internal.h b/third_party/abseil-cpp/absl/strings/internal/cord_internal.h
index aa91a69..6fb75c4 100644
--- a/third_party/abseil-cpp/absl/strings/internal/cord_internal.h
+++ b/third_party/abseil-cpp/absl/strings/internal/cord_internal.h
@@ -108,18 +108,25 @@
 // functions in the base class.
 
 struct CordRepConcat;
-struct CordRepSubstring;
 struct CordRepExternal;
+struct CordRepFlat;
+struct CordRepSubstring;
 
 // Various representations that we allow
 enum CordRepKind {
   CONCAT        = 0,
   EXTERNAL      = 1,
   SUBSTRING     = 2,
+  RING          = 3,
 
   // We have different tags for different sized flat arrays,
-  // starting with FLAT
-  FLAT          = 3,
+  // starting with FLAT, and limited to MAX_FLAT_TAG. The 224 value is based on
+  // the current 'size to tag' encoding of 8 / 32 bytes. If a new tag is needed
+  // in the future, then 'FLAT' and 'MAX_FLAT_TAG' should be adjusted as well
+  // as the Tag <---> Size logic so that FLAT stil represents the minimum flat
+  // allocation size. (32 bytes as of now).
+  FLAT = 4,
+  MAX_FLAT_TAG = 224,
 };
 
 struct CordRep {
@@ -142,6 +149,8 @@
   inline const CordRepSubstring* substring() const;
   inline CordRepExternal* external();
   inline const CordRepExternal* external() const;
+  inline CordRepFlat* flat();
+  inline const CordRepFlat* flat() const;
 };
 
 struct CordRepConcat : public CordRep {
@@ -174,6 +183,10 @@
   const char* base;
   // Pointer to function that knows how to call and destroy the releaser.
   ExternalReleaserInvoker releaser_invoker;
+
+  // Deletes (releases) the external rep.
+  // Requires rep != nullptr and rep->tag == EXTERNAL
+  static void Delete(CordRep* rep);
 };
 
 struct Rank1 {};
@@ -214,6 +227,13 @@
   }
 };
 
+inline void CordRepExternal::Delete(CordRep* rep) {
+  assert(rep != nullptr && rep->tag == EXTERNAL);
+  auto* rep_external = static_cast<CordRepExternal*>(rep);
+  assert(rep_external->releaser_invoker != nullptr);
+  rep_external->releaser_invoker(rep_external);
+}
+
 template <typename Str>
 struct ConstInitExternalStorage {
   ABSL_CONST_INIT static CordRepExternal value;
diff --git a/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h b/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h
new file mode 100644
index 0000000..80391a5
--- /dev/null
+++ b/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h
@@ -0,0 +1,129 @@
+// Copyright 2020 The Abseil Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_STRINGS_INTERNAL_CORD_REP_FLAT_H_
+#define ABSL_STRINGS_INTERNAL_CORD_REP_FLAT_H_
+
+#include <cassert>
+#include <cstddef>
+#include <cstdint>
+#include <memory>
+
+#include "absl/strings/internal/cord_internal.h"
+
+namespace absl {
+ABSL_NAMESPACE_BEGIN
+namespace cord_internal {
+
+// Note: all constants below are never ODR used and internal to cord, we define
+// these as static constexpr to avoid 'in struct' definition and usage clutter.
+
+// Largest and smallest flat node lengths we are willing to allocate
+// Flat allocation size is stored in tag, which currently can encode sizes up
+// to 4K, encoded as multiple of either 8 or 32 bytes.
+// If we allow for larger sizes, we need to change this to 8/64, 16/128, etc.
+// kMinFlatSize is bounded by tag needing to be at least FLAT * 8 bytes, and
+// ideally a 'nice' size aligning with allocation and cacheline sizes like 32.
+// kMaxFlatSize is bounded by the size resulting in a computed tag no greater
+// than MAX_FLAT_TAG. MAX_FLAT_TAG provides for additional 'high' tag values.
+static constexpr size_t kFlatOverhead = offsetof(CordRep, data);
+static constexpr size_t kMinFlatSize = 32;
+static constexpr size_t kMaxFlatSize = 4096;
+static constexpr size_t kMaxFlatLength = kMaxFlatSize - kFlatOverhead;
+static constexpr size_t kMinFlatLength = kMinFlatSize - kFlatOverhead;
+
+constexpr size_t AllocatedSizeToTagUnchecked(size_t size) {
+  return (size <= 1024) ? size / 8 : 128 + size / 32 - 1024 / 32;
+}
+
+static_assert(kMinFlatSize / 8 >= FLAT, "");
+static_assert(AllocatedSizeToTagUnchecked(kMaxFlatSize) <= MAX_FLAT_TAG, "");
+
+// Helper functions for rounded div, and rounding to exact sizes.
+constexpr size_t DivUp(size_t n, size_t m) { return (n + m - 1) / m; }
+constexpr size_t RoundUp(size_t n, size_t m) { return DivUp(n, m) * m; }
+
+// Returns the size to the nearest equal or larger value that can be
+// expressed exactly as a tag value.
+inline size_t RoundUpForTag(size_t size) {
+  return RoundUp(size, (size <= 1024) ? 8 : 32);
+}
+
+// Converts the allocated size to a tag, rounding down if the size
+// does not exactly match a 'tag expressible' size value. The result is
+// undefined if the size exceeds the maximum size that can be encoded in
+// a tag, i.e., if size is larger than TagToAllocatedSize(<max tag>).
+inline uint8_t AllocatedSizeToTag(size_t size) {
+  const size_t tag = AllocatedSizeToTagUnchecked(size);
+  assert(tag <= MAX_FLAT_TAG);
+  return tag;
+}
+
+// Converts the provided tag to the corresponding allocated size
+constexpr size_t TagToAllocatedSize(uint8_t tag) {
+  return (tag <= 128) ? (tag * 8) : (1024 + (tag - 128) * 32);
+}
+
+// Converts the provided tag to the corresponding available data length
+constexpr size_t TagToLength(uint8_t tag) {
+  return TagToAllocatedSize(tag) - kFlatOverhead;
+}
+
+// Enforce that kMaxFlatSize maps to a well-known exact tag value.
+static_assert(TagToAllocatedSize(224) == kMaxFlatSize, "Bad tag logic");
+
+struct CordRepFlat : public CordRep {
+  // Creates a new flat node.
+  static CordRepFlat* New(size_t len) {
+    if (len <= kMinFlatLength) {
+      len = kMinFlatLength;
+    } else if (len > kMaxFlatLength) {
+      len = kMaxFlatLength;
+    }
+
+    // Round size up so it matches a size we can exactly express in a tag.
+    const size_t size = RoundUpForTag(len + kFlatOverhead);
+    void* const raw_rep = ::operator new(size);
+    CordRepFlat* rep = new (raw_rep) CordRepFlat();
+    rep->tag = AllocatedSizeToTag(size);
+    return rep;
+  }
+
+  // Deletes a CordRepFlat instance created previously through a call to New().
+  // Flat CordReps are allocated and constructed with raw ::operator new and
+  // placement new, and must be destructed and deallocated accordingly.
+  static void Delete(CordRep*rep) {
+    assert(rep->tag >= FLAT);
+#if defined(__cpp_sized_deallocation)
+    size_t size = TagToAllocatedSize(rep->tag);
+    rep->~CordRep();
+    ::operator delete(rep, size);
+#else
+    rep->~CordRep();
+    ::operator delete(rep);
+#endif
+  }
+
+  // Returns the maximum capacity (payload size) of this instance.
+  size_t Capacity() const { return TagToLength(tag); }
+
+  // Returns the allocated size (payload + overhead) of this instance.
+  size_t AllocatedSize() const { return TagToAllocatedSize(tag); }
+};
+
+}  // namespace cord_internal
+ABSL_NAMESPACE_END
+}  // namespace absl
+
+#endif  // ABSL_STRINGS_INTERNAL_CORD_REP_FLAT_H_
diff --git a/third_party/abseil-cpp/absl/strings/internal/string_constant.h b/third_party/abseil-cpp/absl/strings/internal/string_constant.h
index b15f1d9..a11336b 100644
--- a/third_party/abseil-cpp/absl/strings/internal/string_constant.h
+++ b/third_party/abseil-cpp/absl/strings/internal/string_constant.h
@@ -35,18 +35,12 @@
 // below.
 template <typename T>
 struct StringConstant {
- private:
-  // Returns true if `view` points to constant data.
-  // Otherwise, it can't be constant evaluated.
-  static constexpr bool ValidateConstant(absl::string_view view) {
-    return view.empty() || 2 * view[0] != 1;
-  }
-
- public:
   static constexpr absl::string_view value = T{}();
   constexpr absl::string_view operator()() const { return value; }
 
-  static_assert(ValidateConstant(value),
+  // Check to be sure `view` points to constant data.
+  // Otherwise, it can't be constant evaluated.
+  static_assert(value.empty() || 2 * value[0] != 1,
                 "The input string_view must point to constant data.");
 };
 
diff --git a/third_party/abseil-cpp/absl/strings/match.cc b/third_party/abseil-cpp/absl/strings/match.cc
index 8127cb0..2d67250 100644
--- a/third_party/abseil-cpp/absl/strings/match.cc
+++ b/third_party/abseil-cpp/absl/strings/match.cc
@@ -19,19 +19,22 @@
 namespace absl {
 ABSL_NAMESPACE_BEGIN
 
-bool EqualsIgnoreCase(absl::string_view piece1, absl::string_view piece2) {
+bool EqualsIgnoreCase(absl::string_view piece1,
+                      absl::string_view piece2) noexcept {
   return (piece1.size() == piece2.size() &&
           0 == absl::strings_internal::memcasecmp(piece1.data(), piece2.data(),
                                                   piece1.size()));
   // memcasecmp uses absl::ascii_tolower().
 }
 
-bool StartsWithIgnoreCase(absl::string_view text, absl::string_view prefix) {
+bool StartsWithIgnoreCase(absl::string_view text,
+                          absl::string_view prefix) noexcept {
   return (text.size() >= prefix.size()) &&
          EqualsIgnoreCase(text.substr(0, prefix.size()), prefix);
 }
 
-bool EndsWithIgnoreCase(absl::string_view text, absl::string_view suffix) {
+bool EndsWithIgnoreCase(absl::string_view text,
+                        absl::string_view suffix) noexcept {
   return (text.size() >= suffix.size()) &&
          EqualsIgnoreCase(text.substr(text.size() - suffix.size()), suffix);
 }
diff --git a/third_party/abseil-cpp/absl/strings/match.h b/third_party/abseil-cpp/absl/strings/match.h
index 90fca98..038cbb3 100644
--- a/third_party/abseil-cpp/absl/strings/match.h
+++ b/third_party/abseil-cpp/absl/strings/match.h
@@ -43,14 +43,20 @@
 // StrContains()
 //
 // Returns whether a given string `haystack` contains the substring `needle`.
-inline bool StrContains(absl::string_view haystack, absl::string_view needle) {
+inline bool StrContains(absl::string_view haystack,
+                        absl::string_view needle) noexcept {
   return haystack.find(needle, 0) != haystack.npos;
 }
 
+inline bool StrContains(absl::string_view haystack, char needle) noexcept {
+  return haystack.find(needle) != haystack.npos;
+}
+
 // StartsWith()
 //
 // Returns whether a given string `text` begins with `prefix`.
-inline bool StartsWith(absl::string_view text, absl::string_view prefix) {
+inline bool StartsWith(absl::string_view text,
+                       absl::string_view prefix) noexcept {
   return prefix.empty() ||
          (text.size() >= prefix.size() &&
           memcmp(text.data(), prefix.data(), prefix.size()) == 0);
@@ -59,7 +65,8 @@
 // EndsWith()
 //
 // Returns whether a given string `text` ends with `suffix`.
-inline bool EndsWith(absl::string_view text, absl::string_view suffix) {
+inline bool EndsWith(absl::string_view text,
+                     absl::string_view suffix) noexcept {
   return suffix.empty() ||
          (text.size() >= suffix.size() &&
           memcmp(text.data() + (text.size() - suffix.size()), suffix.data(),
@@ -70,19 +77,22 @@
 //
 // Returns whether given ASCII strings `piece1` and `piece2` are equal, ignoring
 // case in the comparison.
-bool EqualsIgnoreCase(absl::string_view piece1, absl::string_view piece2);
+bool EqualsIgnoreCase(absl::string_view piece1,
+                      absl::string_view piece2) noexcept;
 
 // StartsWithIgnoreCase()
 //
 // Returns whether a given ASCII string `text` starts with `prefix`,
 // ignoring case in the comparison.
-bool StartsWithIgnoreCase(absl::string_view text, absl::string_view prefix);
+bool StartsWithIgnoreCase(absl::string_view text,
+                          absl::string_view prefix) noexcept;
 
 // EndsWithIgnoreCase()
 //
 // Returns whether a given ASCII string `text` ends with `suffix`, ignoring
 // case in the comparison.
-bool EndsWithIgnoreCase(absl::string_view text, absl::string_view suffix);
+bool EndsWithIgnoreCase(absl::string_view text,
+                        absl::string_view suffix) noexcept;
 
 ABSL_NAMESPACE_END
 }  // namespace absl
diff --git a/third_party/abseil-cpp/absl/strings/match_test.cc b/third_party/abseil-cpp/absl/strings/match_test.cc
index 4c313dd..5841bc1 100644
--- a/third_party/abseil-cpp/absl/strings/match_test.cc
+++ b/third_party/abseil-cpp/absl/strings/match_test.cc
@@ -66,6 +66,23 @@
   EXPECT_FALSE(absl::StrContains("", "a"));
 }
 
+TEST(MatchTest, ContainsChar) {
+  absl::string_view a("abcdefg");
+  absl::string_view b("abcd");
+  EXPECT_TRUE(absl::StrContains(a, 'a'));
+  EXPECT_TRUE(absl::StrContains(a, 'b'));
+  EXPECT_TRUE(absl::StrContains(a, 'e'));
+  EXPECT_FALSE(absl::StrContains(a, 'h'));
+
+  EXPECT_TRUE(absl::StrContains(b, 'a'));
+  EXPECT_TRUE(absl::StrContains(b, 'b'));
+  EXPECT_FALSE(absl::StrContains(b, 'e'));
+  EXPECT_FALSE(absl::StrContains(b, 'h'));
+
+  EXPECT_FALSE(absl::StrContains("", 'a'));
+  EXPECT_FALSE(absl::StrContains("", 'a'));
+}
+
 TEST(MatchTest, ContainsNull) {
   const std::string s = "foo";
   const char* cs = "foo";
diff --git a/third_party/abseil-cpp/roll_abseil.py b/third_party/abseil-cpp/roll_abseil.py
index be45967..779f8b5 100755
--- a/third_party/abseil-cpp/roll_abseil.py
+++ b/third_party/abseil-cpp/roll_abseil.py
@@ -52,6 +52,7 @@
  logging.info('Syncing abseil in chromium/src/third_party...')
  exclude = [
    '*BUILD.gn',
+   'DIR_METADATA',
    'README.chromium',
    'OWNERS',
    '.gitignore',
diff --git a/third_party/abseil-cpp/symbols_arm64_dbg.def b/third_party/abseil-cpp/symbols_arm64_dbg.def
index d9ffd9d..b6c4eb8 100644
--- a/third_party/abseil-cpp/symbols_arm64_dbg.def
+++ b/third_party/abseil-cpp/symbols_arm64_dbg.def
@@ -84,17 +84,19 @@
     ??$?0AEA_KAEBV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@?$CompressedTupleImpl@V?$CompressedTuple@_KV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@container_internal@absl@@U?$integer_sequence@_K$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@AEA_KAEBV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@Z
     ??$?0AEBV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@?$Storage@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@$00$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@AEBV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@Z
     ??$?0AEBV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@?$Storage@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@AEBV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@Z
-    ??$?0AEBV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@AEB_K@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@AEBV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@AEB_K@Z
+    ??$?0AEBV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@H$00@?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@_K@container_internal@absl@@QEAA@AEBV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@$$QEAH@Z
+    ??$?0AEBV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@H@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@AEBV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@$$QEAH@Z
     ??$?0AEBV?$allocator@UPayload@status_internal@absl@@@__1@std@@@?$Storage@V?$allocator@UPayload@status_internal@absl@@@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@AEBV?$allocator@UPayload@status_internal@absl@@@__1@std@@@Z
-    ??$?0AEBV?$allocator@UPayload@status_internal@absl@@@__1@std@@AEB_K@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__1@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@AEBV?$allocator@UPayload@status_internal@absl@@@__1@std@@AEB_K@Z
+    ??$?0AEBV?$allocator@UPayload@status_internal@absl@@@__1@std@@H$00@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__1@std@@_K@container_internal@absl@@QEAA@AEBV?$allocator@UPayload@status_internal@absl@@@__1@std@@$$QEAH@Z
+    ??$?0AEBV?$allocator@UPayload@status_internal@absl@@@__1@std@@H@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__1@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@AEBV?$allocator@UPayload@status_internal@absl@@@__1@std@@$$QEAH@Z
     ??$?0AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$$Z$$V$$Z$0A@$$Z$S@?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@AEAA@Upiecewise_construct_t@12@AEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@12@AEAV?$tuple@$$V@12@U?$__tuple_indices@$0A@@12@U?$__tuple_indices@$S@12@@Z
     ??$?0AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$$Z$$V@?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QEAA@Upiecewise_construct_t@12@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@12@V?$tuple@$$V@12@@Z
     ??$?0AEBVCord@absl@@$0A@@?$optional@VCord@absl@@@absl@@QEAA@AEBVCord@1@@Z
     ??$?0AEBVCord@absl@@@?$optional_data_dtor_base@VCord@absl@@$0A@@optional_internal@absl@@IEAA@Uin_place_t@2@AEBVCord@2@@Z
-    ??$?0AEB_K@?$Storage@_K$00$0A@@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@AEB_K@Z
     ??$?0H$00@?$__compressed_pair@_KV?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@__1@std@@@__1@std@@QEAA@$$QEAH@Z
     ??$?0H$00@?$__compressed_pair@_KV?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@@__1@std@@QEAA@$$QEAH@Z
     ??$?0H$00@?$__compressed_pair@_KV?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@$$QEAH@Z
+    ??$?0H@?$Storage@_K$00$0A@@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@$$QEAH@Z
     ??$?0H@FormatArgImpl@str_format_internal@absl@@QEAA@AEBH@Z
     ??$?0M$00@?$__compressed_pair@MV?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@__1@std@@@__1@std@@QEAA@$$QEAM@Z
     ??$?0PEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@$00@?$__compressed_pair@PEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@@23@@__1@std@@QEAA@$$QEAPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@12@@Z
@@ -160,6 +162,21 @@
     ??$?0V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@X@?$__compressed_pair_elem@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@$00$0A@@__1@std@@QEAA@$$QEAV?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@12@@Z
     ??$?0V?$allocator@D@__1@std@@@AlphaNum@absl@@QEAA@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ??$?0V?$allocator@D@__1@std@@@string_view@absl@@QEAA@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
+    ??$?0V?$allocator@H@__1@std@@@?$Storage@V?$allocator@H@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@$$QEAV?$allocator@H@__1@std@@@Z
+    ??$?0V?$allocator@H@__1@std@@H$00@?$CompressedTuple@V?$allocator@H@__1@std@@_K@container_internal@absl@@QEAA@$$QEAV?$allocator@H@__1@std@@$$QEAH@Z
+    ??$?0V?$allocator@H@__1@std@@H@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@H@__1@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@$$QEAV?$allocator@H@__1@std@@$$QEAH@Z
+    ??$?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@?$Storage@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@$$QEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@Z
+    ??$?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@H$00@?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@_K@container_internal@absl@@QEAA@$$QEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@$$QEAH@Z
+    ??$?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@H@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@$$QEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@$$QEAH@Z
+    ??$?0V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@?$Storage@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@$$QEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@Z
+    ??$?0V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@H$00@?$CompressedTuple@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@_K@container_internal@absl@@QEAA@$$QEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@$$QEAH@Z
+    ??$?0V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@H@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@$$QEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@$$QEAH@Z
+    ??$?0V?$allocator@UPayload@status_internal@absl@@@__1@std@@@?$Storage@V?$allocator@UPayload@status_internal@absl@@@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@$$QEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@@Z
+    ??$?0V?$allocator@UPayload@status_internal@absl@@@__1@std@@H$00@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__1@std@@_K@container_internal@absl@@QEAA@$$QEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@$$QEAH@Z
+    ??$?0V?$allocator@UPayload@status_internal@absl@@@__1@std@@H@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__1@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@$$QEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@$$QEAH@Z
+    ??$?0V?$allocator@USubRange@absl@@@__1@std@@@?$Storage@V?$allocator@USubRange@absl@@@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@$$QEAV?$allocator@USubRange@absl@@@__1@std@@@Z
+    ??$?0V?$allocator@USubRange@absl@@@__1@std@@H$00@?$CompressedTuple@V?$allocator@USubRange@absl@@@__1@std@@_K@container_internal@absl@@QEAA@$$QEAV?$allocator@USubRange@absl@@@__1@std@@$$QEAH@Z
+    ??$?0V?$allocator@USubRange@absl@@@__1@std@@H@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@USubRange@absl@@@__1@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@$$QEAV?$allocator@USubRange@absl@@@__1@std@@$$QEAH@Z
     ??$?0V?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QEAA@PEAV?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@@Z
     ??$?0V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@Cord@absl@@QEAA@$$QEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ??$?0V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QEAA@PEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
@@ -274,6 +291,15 @@
     ??$EmplaceBack@PEAUCordRep@cord_internal@absl@@@?$Storage@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEAPEAUCordRep@cord_internal@2@$$QEAPEAU342@@Z
     ??$EmplaceBack@UPayload@status_internal@absl@@@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEAUPayload@status_internal@2@$$QEAU342@@Z
     ??$EmplaceBack@USubRange@absl@@@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEAUSubRange@2@$$QEAU32@@Z
+    ??$EmplaceBackSlow@AEBH@?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@AEAAAEAHAEBH@Z
+    ??$EmplaceBackSlow@AEBQEAUCordRep@cord_internal@absl@@@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAAEAPEAUCordRep@cord_internal@2@AEBQEAU342@@Z
+    ??$EmplaceBackSlow@AEBQEAUCordRep@cord_internal@absl@@@?$Storage@PEAUCordRep@cord_internal@absl@@$03V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAAEAPEAUCordRep@cord_internal@2@AEBQEAU342@@Z
+    ??$EmplaceBackSlow@AEBQEAUCordRep@cord_internal@absl@@@?$Storage@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAAEAPEAUCordRep@cord_internal@2@AEBQEAU342@@Z
+    ??$EmplaceBackSlow@AEBQEBUCordRep@cord_internal@absl@@@?$Storage@PEBUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAAEAPEBUCordRep@cord_internal@2@AEBQEBU342@@Z
+    ??$EmplaceBackSlow@PEAUCordRep@cord_internal@absl@@@?$Storage@PEAUCordRep@cord_internal@absl@@$03V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAAEAPEAUCordRep@cord_internal@2@$$QEAPEAU342@@Z
+    ??$EmplaceBackSlow@PEAUCordRep@cord_internal@absl@@@?$Storage@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAAEAPEAUCordRep@cord_internal@2@$$QEAPEAU342@@Z
+    ??$EmplaceBackSlow@UPayload@status_internal@absl@@@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAAEAUPayload@status_internal@2@$$QEAU342@@Z
+    ??$EmplaceBackSlow@USubRange@absl@@@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAAEAUSubRange@2@$$QEAU32@@Z
     ??$ExtractCharSet@$03@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@U?$ArgConvertResult@$03@01@@Z
     ??$ExtractCharSet@$0BPOAA@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@U?$ArgConvertResult@$0BPOAA@@01@@Z
     ??$ExtractCharSet@$0BPPPL@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@U?$ArgConvertResult@$0BPPPL@@01@@Z
@@ -610,7 +636,7 @@
     ??$forward@AEBVCord@absl@@@__1@std@@YAAEBVCord@absl@@AEBV23@@Z
     ??$forward@AEBVCord@absl@@@absl@@YAAEBVCord@0@AEBV10@@Z
     ??$forward@AEBVstring_view@absl@@@__1@std@@YAAEBVstring_view@absl@@AEBV23@@Z
-    ??$forward@AEB_K@absl@@YAAEB_KAEB_K@Z
+    ??$forward@H@absl@@YA$$QEAHAEAH@Z
     ??$forward@PEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@YA$$QEAPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@01@AEAPEAPEAU201@@Z
     ??$forward@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@YA$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAPEAPEBV23456@@Z
     ??$forward@PEAUCordRep@cord_internal@absl@@@__1@std@@YA$$QEAPEAUCordRep@cord_internal@absl@@AEAPEAU234@@Z
@@ -632,6 +658,11 @@
     ??$forward@V?$__allocator_destructor@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@@__1@std@@YA$$QEAV?$__allocator_destructor@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@01@AEAV201@@Z
     ??$forward@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@YA$$QEAV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@01@AEAV201@@Z
     ??$forward@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@@__1@std@@YA$$QEAV?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@01@AEAV201@@Z
+    ??$forward@V?$allocator@H@__1@std@@@absl@@YA$$QEAV?$allocator@H@__1@std@@AEAV123@@Z
+    ??$forward@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@YA$$QEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@AEAV123@@Z
+    ??$forward@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@absl@@YA$$QEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@AEAV123@@Z
+    ??$forward@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@YA$$QEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@AEAV123@@Z
+    ??$forward@V?$allocator@USubRange@absl@@@__1@std@@@absl@@YA$$QEAV?$allocator@USubRange@absl@@@__1@std@@AEAV123@@Z
     ??$forward@VCord@absl@@@__1@std@@YA$$QEAVCord@absl@@AEAV23@@Z
     ??$forward@Vstring_view@absl@@@__1@std@@YA$$QEAVstring_view@absl@@AEAV23@@Z
     ??$forward@W4LogSeverity@absl@@@__1@std@@YA$$QEAW4LogSeverity@absl@@AEAW423@@Z
@@ -725,18 +756,6 @@
     ??0?$BigUnsigned@$0FE@@strings_internal@absl@@QEAA@Vstring_view@2@@Z
     ??0?$BigUnsigned@$0FE@@strings_internal@absl@@QEAA@XZ
     ??0?$BigUnsigned@$0FE@@strings_internal@absl@@QEAA@_K@Z
-    ??0?$CompressedTuple@V?$allocator@H@__1@std@@_K@container_internal@absl@@QEAA@XZ
-    ??0?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@_K@container_internal@absl@@QEAA@AEBV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@AEB_K@Z
-    ??0?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@_K@container_internal@absl@@QEAA@XZ
-    ??0?$CompressedTuple@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@_K@container_internal@absl@@QEAA@XZ
-    ??0?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__1@std@@_K@container_internal@absl@@QEAA@AEBV?$allocator@UPayload@status_internal@absl@@@__1@std@@AEB_K@Z
-    ??0?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__1@std@@_K@container_internal@absl@@QEAA@XZ
-    ??0?$CompressedTuple@V?$allocator@USubRange@absl@@@__1@std@@_K@container_internal@absl@@QEAA@XZ
-    ??0?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@H@__1@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QEAA@XZ
-    ??0?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QEAA@XZ
-    ??0?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QEAA@XZ
-    ??0?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__1@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QEAA@XZ
-    ??0?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@USubRange@absl@@@__1@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QEAA@XZ
     ??0?$CopyValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAA@AEBQEAUCordRep@cord_internal@2@@Z
     ??0?$FixedArray@PEAUCordRep@cord_internal@absl@@$0?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QEAA@_KAEBV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@Z
     ??0?$InlinedVector@H$0CP@V?$allocator@H@__1@std@@@absl@@QEAA@XZ
@@ -768,11 +787,6 @@
     ??0?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAA@AEBV?$allocator@UPayload@status_internal@absl@@@__1@std@@@Z
     ??0?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAA@XZ
     ??0?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAA@XZ
-    ??0?$Storage@V?$allocator@H@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QEAA@XZ
-    ??0?$Storage@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QEAA@XZ
-    ??0?$Storage@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QEAA@XZ
-    ??0?$Storage@V?$allocator@UPayload@status_internal@absl@@@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QEAA@XZ
-    ??0?$Storage@V?$allocator@USubRange@absl@@@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QEAA@XZ
     ??0?$__allocator_destructor@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@AEAV?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@_K@Z
     ??0?$__atomic_base@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z$0A@@__1@std@@QEAA@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@Z
     ??0?$__atomic_base@PEAUHashtablezInfo@container_internal@absl@@$0A@@__1@std@@QEAA@PEAUHashtablezInfo@container_internal@absl@@@Z
@@ -925,6 +939,7 @@
     ??0CordRep@cord_internal@absl@@QEAA@XZ
     ??0CordRepConcat@cord_internal@absl@@QEAA@XZ
     ??0CordRepExternal@cord_internal@absl@@QEAA@XZ
+    ??0CordRepFlat@cord_internal@absl@@QEAA@XZ
     ??0CordRepSubstring@cord_internal@absl@@QEAA@XZ
     ??0Duration@absl@@AEAA@_JI@Z
     ??0Duration@absl@@QEAA@XZ
@@ -962,7 +977,7 @@
     ??0SpinLockHolder@base_internal@absl@@QEAA@PEAVSpinLock@12@@Z
     ??0Status@absl@@QEAA@$$QEAV01@@Z
     ??0Status@absl@@QEAA@W4StatusCode@1@Vstring_view@1@@Z
-    ??0StatusRep@status_internal@absl@@QEAA@XZ
+    ??0StatusRep@status_internal@absl@@QEAA@W4StatusCode@2@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@V?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@56@@Z
     ??0Storage@?$FixedArray@PEAUCordRep@cord_internal@absl@@$0?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QEAA@_KAEBV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@Z
     ??0Streamable@str_format_internal@absl@@QEAA@AEBVUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z
     ??0StringReleaser@?M@???$?0V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@Cord@absl@@QEAA@$$QEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z@QEAA@$$QEAU0?M@???$?0V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@12@QEAA@0@Z@@Z
@@ -1401,6 +1416,9 @@
     ?Allocate@?$AllocationTransaction@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAPEAPEBUCordRep@cord_internal@3@_K@Z
     ?Allocate@?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAPEAUPayload@status_internal@3@_K@Z
     ?Allocate@?$AllocationTransaction@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAPEAUSubRange@3@_K@Z
+    ?AllocatedSize@CordRepFlat@cord_internal@absl@@QEBA_KXZ
+    ?AllocatedSizeToTag@cord_internal@absl@@YAE_K@Z
+    ?AllocatedSizeToTagUnchecked@cord_internal@absl@@YA_K_K@Z
     ?AlreadyExistsError@absl@@YA?AVStatus@1@Vstring_view@1@@Z
     ?AnnotateConstruct@NonEmptyInlinedStorage@?$FixedArray@PEAUCordRep@cord_internal@absl@@$0?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QEAAX_K@Z
     ?AnnotateDestruct@NonEmptyInlinedStorage@?$FixedArray@PEAUCordRep@cord_internal@absl@@$0?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QEAAX_K@Z
@@ -1452,6 +1470,7 @@
     ?CalculateBase64EscapedLenInternal@strings_internal@absl@@YA_K_K_N@Z
     ?CallVoidPtrFunction@Condition@absl@@CA_NPEBV12@@Z
     ?CancelledError@absl@@YA?AVStatus@1@Vstring_view@1@@Z
+    ?Capacity@CordRepFlat@cord_internal@absl@@QEBA_KXZ
     ?CatPieces@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@V?$initializer_list@Vstring_view@absl@@@5@@Z
     ?Ceil@absl@@YA?AVDuration@1@V21@0@Z
     ?CheckInvariants@GraphCycles@synchronization_internal@absl@@QEBA_NXZ
@@ -1467,10 +1486,10 @@
     ?ClearSlow@InlineRep@Cord@absl@@AEAAXXZ
     ?ClearTimeZoneMapTestOnly@Impl@time_zone@cctz@time_internal@absl@@SAXXZ
     ?CodeToInlinedRep@Status@absl@@CA_KW4StatusCode@2@@Z
-    ?CombineContiguousImpl@CityHashState@hash_internal@absl@@CA_K_KPEBE0U?$integral_constant@H$03@__1@std@@@Z
-    ?CombineContiguousImpl@CityHashState@hash_internal@absl@@CA_K_KPEBE0U?$integral_constant@H$07@__1@std@@@Z
-    ?CombineLargeContiguousImpl32@CityHashState@hash_internal@absl@@CA_K_KPEBE0@Z
-    ?CombineLargeContiguousImpl64@CityHashState@hash_internal@absl@@CA_K_KPEBE0@Z
+    ?CombineContiguousImpl@HashState@hash_internal@absl@@CA_K_KPEBE0U?$integral_constant@H$03@__1@std@@@Z
+    ?CombineContiguousImpl@HashState@hash_internal@absl@@CA_K_KPEBE0U?$integral_constant@H$07@__1@std@@@Z
+    ?CombineLargeContiguousImpl32@HashState@hash_internal@absl@@CA_K_KPEBE0@Z
+    ?CombineLargeContiguousImpl64@HashState@hash_internal@absl@@CA_K_KPEBE0@Z
     ?Compare@Cord@absl@@QEBAHVstring_view@2@@Z
     ?CompareImpl@Cord@absl@@AEBAHAEBV12@@Z
     ?CompareSlowPath@Cord@absl@@AEBAHAEBV12@_K1@Z
@@ -1520,6 +1539,8 @@
     ?DecrementSynchSem@Mutex@absl@@CA_NPEAV12@PEAUPerThreadSynch@base_internal@2@VKernelTimeout@synchronization_internal@2@@Z
     ?DefaultArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@XZ
     ?DefaultStackUnwinder@absl@@YAHPEAPEAXPEAHHHPEBX1@Z
+    ?Delete@CordRepExternal@cord_internal@absl@@SAXPEAUCordRep@23@@Z
+    ?Delete@CordRepFlat@cord_internal@absl@@SAXPEAUCordRep@23@@Z
     ?DeleteArena@LowLevelAlloc@base_internal@absl@@SA_NPEAUArena@123@@Z
     ?Demangle@debugging_internal@absl@@YA_NPEBDPEADH@Z
     ?Description@Impl@time_zone@cctz@time_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
@@ -1535,6 +1556,7 @@
     ?Digits10@?$BigUnsigned@$03@strings_internal@absl@@SAHXZ
     ?Digits10@?$BigUnsigned@$0FE@@strings_internal@absl@@SAHXZ
     ?DisableRescheduling@SchedulingGuard@base_internal@absl@@CA_NXZ
+    ?DivUp@cord_internal@absl@@YA_K_K0@Z
     ?DoLoad@?$AtomicHook@P6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@absl@@Vstring_view@2@AEBVCord@2@@Z@base_internal@absl@@AEBAP6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@3@Vstring_view@3@AEBVCord@3@@ZXZ
     ?DoLoad@?$AtomicHook@P6AXPEBDH000@Z@base_internal@absl@@AEBAP6AXPEBDH000@ZXZ
     ?DoLoad@?$AtomicHook@P6AXPEBDPEBX@Z@base_internal@absl@@AEBAP6AXPEBDPEBX@ZXZ
@@ -1911,6 +1933,7 @@
     ?Nanoseconds@absl@@YA?AVDuration@1@_J@Z
     ?NegateAndSubtractOne@time_internal@absl@@YA_J_J@Z
     ?Never@KernelTimeout@synchronization_internal@absl@@SA?AV123@XZ
+    ?New@CordRepFlat@cord_internal@absl@@SAPEAU123@_K@Z
     ?NewArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@H@Z
     ?NewRep@Status@absl@@CA_KW4StatusCode@2@Vstring_view@2@V?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@__1@std@@@Z
     ?NextCapacity@?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@SA_K_K@Z
@@ -1982,9 +2005,9 @@
     ?RandomSeed@container_internal@absl@@YA_KXZ
     ?RawLog@raw_logging_internal@absl@@YAXW4LogSeverity@2@PEBDH1ZZ
     ?RawLoggingFullySupported@raw_logging_internal@absl@@YA_NXZ
-    ?Read1To3@CityHashState@hash_internal@absl@@CAIPEBE_K@Z
-    ?Read4To8@CityHashState@hash_internal@absl@@CA_KPEBE_K@Z
-    ?Read9To16@CityHashState@hash_internal@absl@@CA?AU?$pair@_K_K@__1@std@@PEBE_K@Z
+    ?Read1To3@HashState@hash_internal@absl@@CAIPEBE_K@Z
+    ?Read4To8@HashState@hash_internal@absl@@CA_KPEBE_K@Z
+    ?Read9To16@HashState@hash_internal@absl@@CA?AU?$pair@_K_K@__1@std@@PEBE_K@Z
     ?ReadDigits@?$BigUnsigned@$03@strings_internal@absl@@AEAAHPEBD0H@Z
     ?ReadDigits@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAHPEBD0H@Z
     ?ReadFloatMantissa@?$BigUnsigned@$03@strings_internal@absl@@QEAAHAEBUParsedFloat@23@H@Z
@@ -2026,6 +2049,8 @@
     ?Resize@?$ResizeUninitializedTraits@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@X@strings_internal@absl@@SAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@_K@Z
     ?ResourceExhaustedError@absl@@YA?AVStatus@1@Vstring_view@1@@Z
     ?Rethrow@variant_internal@absl@@YAXXZ
+    ?RoundUp@cord_internal@absl@@YA_K_K0@Z
+    ?RoundUpForTag@cord_internal@absl@@YA_K_K@Z
     ?SafeWriteToStderr@raw_logging_internal@absl@@YAXPEBD_K@Z
     ?SampleSlow@container_internal@absl@@YAPEAUHashtablezInfo@12@PEA_J@Z
     ?Seconds@absl@@YA?AVDuration@1@_J@Z
@@ -2118,6 +2143,8 @@
     ?SubtractSize@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAX_K@Z
     ?Summarize@str_format_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z
     ?Symbolize@absl@@YA_NPEBXPEADH@Z
+    ?TagToAllocatedSize@cord_internal@absl@@YA_KE@Z
+    ?TagToLength@cord_internal@absl@@YA_KE@Z
     ?TakeRep@Cord@absl@@AEGBAPEAUCordRep@cord_internal@2@XZ
     ?TakeRep@Cord@absl@@AEHAAPEAUCordRep@cord_internal@2@XZ
     ?ThrowBadStatusOrAccess@internal_statusor@absl@@YAXVStatus@2@@Z
@@ -2273,6 +2300,8 @@
     ?Write@BufferRawSink@str_format_internal@absl@@QEAAXVstring_view@3@@Z
     ?Write@FILERawSink@str_format_internal@absl@@QEAAXVstring_view@3@@Z
     ?Write@FormatRawSinkImpl@str_format_internal@absl@@QEAAXVstring_view@3@@Z
+    ?Wyhash@hash_internal@absl@@YA_KPEBX_K1QEB_K@Z
+    ?WyhashImpl@HashState@hash_internal@absl@@CA_KPEBE_K@Z
     ?ZeroDuration@absl@@YA?AVDuration@1@XZ
     ?__add_back_capacity@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAXXZ
     ?__addr@?$__temp_value@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAPEAUTransition@cctz@time_internal@absl@@XZ
@@ -2795,6 +2824,8 @@
     ?first@?$__compressed_pair@_KV?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAAEA_KXZ
     ?first@?$__compressed_pair@_KV?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBAAEB_KXZ
     ?fixed_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@AEBV?$duration@_JV?$ratio@$00$00@__1@std@@@chrono@__1@std@@@Z
+    ?flat@CordRep@cord_internal@absl@@QEAAPEAUCordRepFlat@23@XZ
+    ?flat@CordRep@cord_internal@absl@@QEBAPEBUCordRepFlat@23@XZ
     ?force_tree@InlineRep@Cord@absl@@QEAAPEAUCordRep@cord_internal@3@_K@Z
     ?format@detail@cctz@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@AEBV567@AEBV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@67@AEBV?$duration@_JV?$ratio@$00$0DINHOKEMGIAAA@@__1@std@@@967@AEBVtime_zone@234@@Z
     ?from_chars@absl@@YA?AUfrom_chars_result@1@PEBD0AEAMW4chars_format@1@@Z
diff --git a/third_party/abseil-cpp/symbols_arm64_rel.def b/third_party/abseil-cpp/symbols_arm64_rel.def
index c26572c..f642c85 100644
--- a/third_party/abseil-cpp/symbols_arm64_rel.def
+++ b/third_party/abseil-cpp/symbols_arm64_rel.def
@@ -42,6 +42,13 @@
     ??$EmplaceBack@PEAUCordRep@cord_internal@absl@@@?$Storage@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEAPEAUCordRep@cord_internal@2@$$QEAPEAU342@@Z
     ??$EmplaceBack@UPayload@status_internal@absl@@@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEAUPayload@status_internal@2@$$QEAU342@@Z
     ??$EmplaceBack@USubRange@absl@@@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEAUSubRange@2@$$QEAU32@@Z
+    ??$EmplaceBackSlow@AEBQEAUCordRep@cord_internal@absl@@@?$Storage@PEAUCordRep@cord_internal@absl@@$03V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAAEAPEAUCordRep@cord_internal@2@AEBQEAU342@@Z
+    ??$EmplaceBackSlow@AEBQEAUCordRep@cord_internal@absl@@@?$Storage@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAAEAPEAUCordRep@cord_internal@2@AEBQEAU342@@Z
+    ??$EmplaceBackSlow@AEBQEBUCordRep@cord_internal@absl@@@?$Storage@PEBUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAAEAPEBUCordRep@cord_internal@2@AEBQEBU342@@Z
+    ??$EmplaceBackSlow@PEAUCordRep@cord_internal@absl@@@?$Storage@PEAUCordRep@cord_internal@absl@@$03V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAAEAPEAUCordRep@cord_internal@2@$$QEAPEAU342@@Z
+    ??$EmplaceBackSlow@PEAUCordRep@cord_internal@absl@@@?$Storage@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAAEAPEAUCordRep@cord_internal@2@$$QEAPEAU342@@Z
+    ??$EmplaceBackSlow@UPayload@status_internal@absl@@@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAAEAUPayload@status_internal@2@$$QEAU342@@Z
+    ??$EmplaceBackSlow@USubRange@absl@@@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAAEAUSubRange@2@$$QEAU32@@Z
     ??$FindSubstitutions@V?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@std@@@strings_internal@absl@@YA?AV?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@Vstring_view@1@AEBV?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@4@@Z
     ??$Flush@V?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@@FormatRawSinkImpl@str_format_internal@absl@@CAXPEAXVstring_view@2@@Z
     ??$Flush@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@FormatRawSinkImpl@str_format_internal@absl@@CAXPEAXVstring_view@2@@Z
@@ -104,6 +111,7 @@
     ??0Rep@GraphCycles@synchronization_internal@absl@@QEAA@XZ
     ??0SpinLock@base_internal@absl@@QEAA@W4SchedulingMode@12@@Z
     ??0Status@absl@@QEAA@W4StatusCode@1@Vstring_view@1@@Z
+    ??0StatusRep@status_internal@absl@@QEAA@W4StatusCode@2@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@V?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@56@@Z
     ??0Streamable@str_format_internal@absl@@QEAA@AEBVUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z
     ??0TimeZoneInfo@cctz@time_internal@absl@@QEAA@XZ
     ??0TimeZoneLibC@cctz@time_internal@absl@@QEAA@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
@@ -241,10 +249,10 @@
     ?ClearCurrentThreadIdentity@base_internal@absl@@YAXXZ
     ?ClearSlow@InlineRep@Cord@absl@@AEAAXXZ
     ?ClearTimeZoneMapTestOnly@Impl@time_zone@cctz@time_internal@absl@@SAXXZ
-    ?CombineContiguousImpl@CityHashState@hash_internal@absl@@CA_K_KPEBE0U?$integral_constant@H$03@__1@std@@@Z
-    ?CombineContiguousImpl@CityHashState@hash_internal@absl@@CA_K_KPEBE0U?$integral_constant@H$07@__1@std@@@Z
-    ?CombineLargeContiguousImpl32@CityHashState@hash_internal@absl@@CA_K_KPEBE0@Z
-    ?CombineLargeContiguousImpl64@CityHashState@hash_internal@absl@@CA_K_KPEBE0@Z
+    ?CombineContiguousImpl@HashState@hash_internal@absl@@CA_K_KPEBE0U?$integral_constant@H$03@__1@std@@@Z
+    ?CombineContiguousImpl@HashState@hash_internal@absl@@CA_K_KPEBE0U?$integral_constant@H$07@__1@std@@@Z
+    ?CombineLargeContiguousImpl32@HashState@hash_internal@absl@@CA_K_KPEBE0@Z
+    ?CombineLargeContiguousImpl64@HashState@hash_internal@absl@@CA_K_KPEBE0@Z
     ?Compare@Cord@absl@@QEBAHVstring_view@2@@Z
     ?CompareImpl@Cord@absl@@AEBAHAEBV12@@Z
     ?CompareSlowPath@Cord@absl@@AEBAHAEBV12@_K1@Z
@@ -469,6 +477,7 @@
     ?MultiplyStep@?$BigUnsigned@$03@strings_internal@absl@@AEAAXHPEBIHH@Z
     ?MultiplyStep@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAXHPEBIHH@Z
     ?MutexDelay@synchronization_internal@absl@@YAHHH@Z
+    ?New@CordRepFlat@cord_internal@absl@@SAPEAU123@_K@Z
     ?NewArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@H@Z
     ?NewRep@Status@absl@@CA_KW4StatusCode@2@Vstring_view@2@V?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@__1@std@@@Z
     ?NextTransition@TimeZone@absl@@QEBA_NVTime@2@PEAUCivilTransition@12@@Z
@@ -699,6 +708,8 @@
     ?WebSafeBase64Unescape@absl@@YA_NVstring_view@1@PEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ?Write@BufferRawSink@str_format_internal@absl@@QEAAXVstring_view@3@@Z
     ?Write@FILERawSink@str_format_internal@absl@@QEAAXVstring_view@3@@Z
+    ?Wyhash@hash_internal@absl@@YA_KPEBX_K1QEB_K@Z
+    ?WyhashImpl@HashState@hash_internal@absl@@CA_KPEBE_K@Z
     ?__add_back_capacity@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAXXZ
     ?__append@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAX_K@Z
     ?__append@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAX_K@Z
diff --git a/third_party/abseil-cpp/symbols_x64_dbg.def b/third_party/abseil-cpp/symbols_x64_dbg.def
index 138512c..8f287e7 100644
--- a/third_party/abseil-cpp/symbols_x64_dbg.def
+++ b/third_party/abseil-cpp/symbols_x64_dbg.def
@@ -84,17 +84,19 @@
     ??$?0AEA_KAEBV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@?$CompressedTupleImpl@V?$CompressedTuple@_KV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@container_internal@absl@@U?$integer_sequence@_K$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@AEA_KAEBV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@Z
     ??$?0AEBV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@?$Storage@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@$00$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@AEBV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@Z
     ??$?0AEBV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@?$Storage@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@AEBV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@Z
-    ??$?0AEBV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@AEB_K@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@AEBV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@AEB_K@Z
+    ??$?0AEBV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@H$00@?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@_K@container_internal@absl@@QEAA@AEBV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@$$QEAH@Z
+    ??$?0AEBV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@H@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@AEBV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@$$QEAH@Z
     ??$?0AEBV?$allocator@UPayload@status_internal@absl@@@__1@std@@@?$Storage@V?$allocator@UPayload@status_internal@absl@@@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@AEBV?$allocator@UPayload@status_internal@absl@@@__1@std@@@Z
-    ??$?0AEBV?$allocator@UPayload@status_internal@absl@@@__1@std@@AEB_K@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__1@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@AEBV?$allocator@UPayload@status_internal@absl@@@__1@std@@AEB_K@Z
+    ??$?0AEBV?$allocator@UPayload@status_internal@absl@@@__1@std@@H$00@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__1@std@@_K@container_internal@absl@@QEAA@AEBV?$allocator@UPayload@status_internal@absl@@@__1@std@@$$QEAH@Z
+    ??$?0AEBV?$allocator@UPayload@status_internal@absl@@@__1@std@@H@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__1@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@AEBV?$allocator@UPayload@status_internal@absl@@@__1@std@@$$QEAH@Z
     ??$?0AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$$Z$$V$$Z$0A@$$Z$S@?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@AEAA@Upiecewise_construct_t@12@AEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@12@AEAV?$tuple@$$V@12@U?$__tuple_indices@$0A@@12@U?$__tuple_indices@$S@12@@Z
     ??$?0AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$$Z$$V@?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QEAA@Upiecewise_construct_t@12@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@12@V?$tuple@$$V@12@@Z
     ??$?0AEBVCord@absl@@$0A@@?$optional@VCord@absl@@@absl@@QEAA@AEBVCord@1@@Z
     ??$?0AEBVCord@absl@@@?$optional_data_dtor_base@VCord@absl@@$0A@@optional_internal@absl@@IEAA@Uin_place_t@2@AEBVCord@2@@Z
-    ??$?0AEB_K@?$Storage@_K$00$0A@@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@AEB_K@Z
     ??$?0H$00@?$__compressed_pair@_KV?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@__1@std@@@__1@std@@QEAA@$$QEAH@Z
     ??$?0H$00@?$__compressed_pair@_KV?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@@__1@std@@QEAA@$$QEAH@Z
     ??$?0H$00@?$__compressed_pair@_KV?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@$$QEAH@Z
+    ??$?0H@?$Storage@_K$00$0A@@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@$$QEAH@Z
     ??$?0H@FormatArgImpl@str_format_internal@absl@@QEAA@AEBH@Z
     ??$?0M$00@?$__compressed_pair@MV?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@__1@std@@@__1@std@@QEAA@$$QEAM@Z
     ??$?0PEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@$00@?$__compressed_pair@PEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@@23@@__1@std@@QEAA@$$QEAPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@12@@Z
@@ -160,6 +162,21 @@
     ??$?0V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@X@?$__compressed_pair_elem@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@$00$0A@@__1@std@@QEAA@$$QEAV?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@12@@Z
     ??$?0V?$allocator@D@__1@std@@@AlphaNum@absl@@QEAA@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ??$?0V?$allocator@D@__1@std@@@string_view@absl@@QEAA@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
+    ??$?0V?$allocator@H@__1@std@@@?$Storage@V?$allocator@H@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@$$QEAV?$allocator@H@__1@std@@@Z
+    ??$?0V?$allocator@H@__1@std@@H$00@?$CompressedTuple@V?$allocator@H@__1@std@@_K@container_internal@absl@@QEAA@$$QEAV?$allocator@H@__1@std@@$$QEAH@Z
+    ??$?0V?$allocator@H@__1@std@@H@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@H@__1@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@$$QEAV?$allocator@H@__1@std@@$$QEAH@Z
+    ??$?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@?$Storage@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@$$QEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@Z
+    ??$?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@H$00@?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@_K@container_internal@absl@@QEAA@$$QEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@$$QEAH@Z
+    ??$?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@H@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@$$QEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@$$QEAH@Z
+    ??$?0V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@?$Storage@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@$$QEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@Z
+    ??$?0V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@H$00@?$CompressedTuple@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@_K@container_internal@absl@@QEAA@$$QEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@$$QEAH@Z
+    ??$?0V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@H@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@$$QEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@$$QEAH@Z
+    ??$?0V?$allocator@UPayload@status_internal@absl@@@__1@std@@@?$Storage@V?$allocator@UPayload@status_internal@absl@@@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@$$QEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@@Z
+    ??$?0V?$allocator@UPayload@status_internal@absl@@@__1@std@@H$00@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__1@std@@_K@container_internal@absl@@QEAA@$$QEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@$$QEAH@Z
+    ??$?0V?$allocator@UPayload@status_internal@absl@@@__1@std@@H@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__1@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@$$QEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@$$QEAH@Z
+    ??$?0V?$allocator@USubRange@absl@@@__1@std@@@?$Storage@V?$allocator@USubRange@absl@@@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@$$QEAV?$allocator@USubRange@absl@@@__1@std@@@Z
+    ??$?0V?$allocator@USubRange@absl@@@__1@std@@H$00@?$CompressedTuple@V?$allocator@USubRange@absl@@@__1@std@@_K@container_internal@absl@@QEAA@$$QEAV?$allocator@USubRange@absl@@@__1@std@@$$QEAH@Z
+    ??$?0V?$allocator@USubRange@absl@@@__1@std@@H@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@USubRange@absl@@@__1@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@$$QEAV?$allocator@USubRange@absl@@@__1@std@@$$QEAH@Z
     ??$?0V?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QEAA@PEAV?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@@Z
     ??$?0V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@Cord@absl@@QEAA@$$QEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ??$?0V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QEAA@PEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
@@ -274,6 +291,15 @@
     ??$EmplaceBack@PEAUCordRep@cord_internal@absl@@@?$Storage@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEAPEAUCordRep@cord_internal@2@$$QEAPEAU342@@Z
     ??$EmplaceBack@UPayload@status_internal@absl@@@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEAUPayload@status_internal@2@$$QEAU342@@Z
     ??$EmplaceBack@USubRange@absl@@@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEAUSubRange@2@$$QEAU32@@Z
+    ??$EmplaceBackSlow@AEBH@?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@AEAAAEAHAEBH@Z
+    ??$EmplaceBackSlow@AEBQEAUCordRep@cord_internal@absl@@@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAAEAPEAUCordRep@cord_internal@2@AEBQEAU342@@Z
+    ??$EmplaceBackSlow@AEBQEAUCordRep@cord_internal@absl@@@?$Storage@PEAUCordRep@cord_internal@absl@@$03V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAAEAPEAUCordRep@cord_internal@2@AEBQEAU342@@Z
+    ??$EmplaceBackSlow@AEBQEAUCordRep@cord_internal@absl@@@?$Storage@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAAEAPEAUCordRep@cord_internal@2@AEBQEAU342@@Z
+    ??$EmplaceBackSlow@AEBQEBUCordRep@cord_internal@absl@@@?$Storage@PEBUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAAEAPEBUCordRep@cord_internal@2@AEBQEBU342@@Z
+    ??$EmplaceBackSlow@PEAUCordRep@cord_internal@absl@@@?$Storage@PEAUCordRep@cord_internal@absl@@$03V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAAEAPEAUCordRep@cord_internal@2@$$QEAPEAU342@@Z
+    ??$EmplaceBackSlow@PEAUCordRep@cord_internal@absl@@@?$Storage@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAAEAPEAUCordRep@cord_internal@2@$$QEAPEAU342@@Z
+    ??$EmplaceBackSlow@UPayload@status_internal@absl@@@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAAEAUPayload@status_internal@2@$$QEAU342@@Z
+    ??$EmplaceBackSlow@USubRange@absl@@@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAAEAUSubRange@2@$$QEAU32@@Z
     ??$ExtractCharSet@$03@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@U?$ArgConvertResult@$03@01@@Z
     ??$ExtractCharSet@$0BPOAA@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@U?$ArgConvertResult@$0BPOAA@@01@@Z
     ??$ExtractCharSet@$0BPPPL@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@U?$ArgConvertResult@$0BPPPL@@01@@Z
@@ -612,7 +638,7 @@
     ??$forward@AEBVCord@absl@@@__1@std@@YAAEBVCord@absl@@AEBV23@@Z
     ??$forward@AEBVCord@absl@@@absl@@YAAEBVCord@0@AEBV10@@Z
     ??$forward@AEBVstring_view@absl@@@__1@std@@YAAEBVstring_view@absl@@AEBV23@@Z
-    ??$forward@AEB_K@absl@@YAAEB_KAEB_K@Z
+    ??$forward@H@absl@@YA$$QEAHAEAH@Z
     ??$forward@PEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@YA$$QEAPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@01@AEAPEAPEAU201@@Z
     ??$forward@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@YA$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAPEAPEBV23456@@Z
     ??$forward@PEAUCordRep@cord_internal@absl@@@__1@std@@YA$$QEAPEAUCordRep@cord_internal@absl@@AEAPEAU234@@Z
@@ -634,6 +660,11 @@
     ??$forward@V?$__allocator_destructor@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@@__1@std@@YA$$QEAV?$__allocator_destructor@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@01@AEAV201@@Z
     ??$forward@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@YA$$QEAV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@01@AEAV201@@Z
     ??$forward@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@@__1@std@@YA$$QEAV?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@01@AEAV201@@Z
+    ??$forward@V?$allocator@H@__1@std@@@absl@@YA$$QEAV?$allocator@H@__1@std@@AEAV123@@Z
+    ??$forward@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@YA$$QEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@AEAV123@@Z
+    ??$forward@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@absl@@YA$$QEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@AEAV123@@Z
+    ??$forward@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@YA$$QEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@AEAV123@@Z
+    ??$forward@V?$allocator@USubRange@absl@@@__1@std@@@absl@@YA$$QEAV?$allocator@USubRange@absl@@@__1@std@@AEAV123@@Z
     ??$forward@VCord@absl@@@__1@std@@YA$$QEAVCord@absl@@AEAV23@@Z
     ??$forward@Vstring_view@absl@@@__1@std@@YA$$QEAVstring_view@absl@@AEAV23@@Z
     ??$forward@W4LogSeverity@absl@@@__1@std@@YA$$QEAW4LogSeverity@absl@@AEAW423@@Z
@@ -727,18 +758,6 @@
     ??0?$BigUnsigned@$0FE@@strings_internal@absl@@QEAA@Vstring_view@2@@Z
     ??0?$BigUnsigned@$0FE@@strings_internal@absl@@QEAA@XZ
     ??0?$BigUnsigned@$0FE@@strings_internal@absl@@QEAA@_K@Z
-    ??0?$CompressedTuple@V?$allocator@H@__1@std@@_K@container_internal@absl@@QEAA@XZ
-    ??0?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@_K@container_internal@absl@@QEAA@AEBV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@AEB_K@Z
-    ??0?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@_K@container_internal@absl@@QEAA@XZ
-    ??0?$CompressedTuple@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@_K@container_internal@absl@@QEAA@XZ
-    ??0?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__1@std@@_K@container_internal@absl@@QEAA@AEBV?$allocator@UPayload@status_internal@absl@@@__1@std@@AEB_K@Z
-    ??0?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__1@std@@_K@container_internal@absl@@QEAA@XZ
-    ??0?$CompressedTuple@V?$allocator@USubRange@absl@@@__1@std@@_K@container_internal@absl@@QEAA@XZ
-    ??0?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@H@__1@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QEAA@XZ
-    ??0?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QEAA@XZ
-    ??0?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QEAA@XZ
-    ??0?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__1@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QEAA@XZ
-    ??0?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@USubRange@absl@@@__1@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QEAA@XZ
     ??0?$CopyValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAA@AEBQEAUCordRep@cord_internal@2@@Z
     ??0?$FixedArray@PEAUCordRep@cord_internal@absl@@$0?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QEAA@_KAEBV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@Z
     ??0?$InlinedVector@H$0CP@V?$allocator@H@__1@std@@@absl@@QEAA@XZ
@@ -770,11 +789,6 @@
     ??0?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAA@AEBV?$allocator@UPayload@status_internal@absl@@@__1@std@@@Z
     ??0?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAA@XZ
     ??0?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAA@XZ
-    ??0?$Storage@V?$allocator@H@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QEAA@XZ
-    ??0?$Storage@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QEAA@XZ
-    ??0?$Storage@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QEAA@XZ
-    ??0?$Storage@V?$allocator@UPayload@status_internal@absl@@@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QEAA@XZ
-    ??0?$Storage@V?$allocator@USubRange@absl@@@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QEAA@XZ
     ??0?$__allocator_destructor@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@AEAV?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@_K@Z
     ??0?$__atomic_base@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z$0A@@__1@std@@QEAA@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@Z
     ??0?$__atomic_base@PEAUHashtablezInfo@container_internal@absl@@$0A@@__1@std@@QEAA@PEAUHashtablezInfo@container_internal@absl@@@Z
@@ -927,6 +941,7 @@
     ??0CordRep@cord_internal@absl@@QEAA@XZ
     ??0CordRepConcat@cord_internal@absl@@QEAA@XZ
     ??0CordRepExternal@cord_internal@absl@@QEAA@XZ
+    ??0CordRepFlat@cord_internal@absl@@QEAA@XZ
     ??0CordRepSubstring@cord_internal@absl@@QEAA@XZ
     ??0Duration@absl@@AEAA@_JI@Z
     ??0Duration@absl@@QEAA@XZ
@@ -964,7 +979,7 @@
     ??0SpinLockHolder@base_internal@absl@@QEAA@PEAVSpinLock@12@@Z
     ??0Status@absl@@QEAA@$$QEAV01@@Z
     ??0Status@absl@@QEAA@W4StatusCode@1@Vstring_view@1@@Z
-    ??0StatusRep@status_internal@absl@@QEAA@XZ
+    ??0StatusRep@status_internal@absl@@QEAA@W4StatusCode@2@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@V?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@56@@Z
     ??0Storage@?$FixedArray@PEAUCordRep@cord_internal@absl@@$0?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QEAA@_KAEBV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@Z
     ??0Streamable@str_format_internal@absl@@QEAA@AEBVUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z
     ??0StringReleaser@?M@???$?0V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@Cord@absl@@QEAA@$$QEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z@QEAA@$$QEAU0?M@???$?0V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@12@QEAA@0@Z@@Z
@@ -1402,6 +1417,9 @@
     ?Allocate@?$AllocationTransaction@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAPEAPEBUCordRep@cord_internal@3@_K@Z
     ?Allocate@?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAPEAUPayload@status_internal@3@_K@Z
     ?Allocate@?$AllocationTransaction@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAPEAUSubRange@3@_K@Z
+    ?AllocatedSize@CordRepFlat@cord_internal@absl@@QEBA_KXZ
+    ?AllocatedSizeToTag@cord_internal@absl@@YAE_K@Z
+    ?AllocatedSizeToTagUnchecked@cord_internal@absl@@YA_K_K@Z
     ?AlreadyExistsError@absl@@YA?AVStatus@1@Vstring_view@1@@Z
     ?AnnotateConstruct@NonEmptyInlinedStorage@?$FixedArray@PEAUCordRep@cord_internal@absl@@$0?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QEAAX_K@Z
     ?AnnotateDestruct@NonEmptyInlinedStorage@?$FixedArray@PEAUCordRep@cord_internal@absl@@$0?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QEAAX_K@Z
@@ -1453,6 +1471,7 @@
     ?CalculateBase64EscapedLenInternal@strings_internal@absl@@YA_K_K_N@Z
     ?CallVoidPtrFunction@Condition@absl@@CA_NPEBV12@@Z
     ?CancelledError@absl@@YA?AVStatus@1@Vstring_view@1@@Z
+    ?Capacity@CordRepFlat@cord_internal@absl@@QEBA_KXZ
     ?CatPieces@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@V?$initializer_list@Vstring_view@absl@@@5@@Z
     ?Ceil@absl@@YA?AVDuration@1@V21@0@Z
     ?CheckInvariants@GraphCycles@synchronization_internal@absl@@QEBA_NXZ
@@ -1468,10 +1487,10 @@
     ?ClearSlow@InlineRep@Cord@absl@@AEAAXXZ
     ?ClearTimeZoneMapTestOnly@Impl@time_zone@cctz@time_internal@absl@@SAXXZ
     ?CodeToInlinedRep@Status@absl@@CA_KW4StatusCode@2@@Z
-    ?CombineContiguousImpl@CityHashState@hash_internal@absl@@CA_K_KPEBE0U?$integral_constant@H$03@__1@std@@@Z
-    ?CombineContiguousImpl@CityHashState@hash_internal@absl@@CA_K_KPEBE0U?$integral_constant@H$07@__1@std@@@Z
-    ?CombineLargeContiguousImpl32@CityHashState@hash_internal@absl@@CA_K_KPEBE0@Z
-    ?CombineLargeContiguousImpl64@CityHashState@hash_internal@absl@@CA_K_KPEBE0@Z
+    ?CombineContiguousImpl@HashState@hash_internal@absl@@CA_K_KPEBE0U?$integral_constant@H$03@__1@std@@@Z
+    ?CombineContiguousImpl@HashState@hash_internal@absl@@CA_K_KPEBE0U?$integral_constant@H$07@__1@std@@@Z
+    ?CombineLargeContiguousImpl32@HashState@hash_internal@absl@@CA_K_KPEBE0@Z
+    ?CombineLargeContiguousImpl64@HashState@hash_internal@absl@@CA_K_KPEBE0@Z
     ?Compare@Cord@absl@@QEBAHVstring_view@2@@Z
     ?CompareImpl@Cord@absl@@AEBAHAEBV12@@Z
     ?CompareSlowPath@Cord@absl@@AEBAHAEBV12@_K1@Z
@@ -1521,6 +1540,8 @@
     ?DecrementSynchSem@Mutex@absl@@CA_NPEAV12@PEAUPerThreadSynch@base_internal@2@VKernelTimeout@synchronization_internal@2@@Z
     ?DefaultArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@XZ
     ?DefaultStackUnwinder@absl@@YAHPEAPEAXPEAHHHPEBX1@Z
+    ?Delete@CordRepExternal@cord_internal@absl@@SAXPEAUCordRep@23@@Z
+    ?Delete@CordRepFlat@cord_internal@absl@@SAXPEAUCordRep@23@@Z
     ?DeleteArena@LowLevelAlloc@base_internal@absl@@SA_NPEAUArena@123@@Z
     ?Demangle@debugging_internal@absl@@YA_NPEBDPEADH@Z
     ?Description@Impl@time_zone@cctz@time_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
@@ -1536,6 +1557,7 @@
     ?Digits10@?$BigUnsigned@$03@strings_internal@absl@@SAHXZ
     ?Digits10@?$BigUnsigned@$0FE@@strings_internal@absl@@SAHXZ
     ?DisableRescheduling@SchedulingGuard@base_internal@absl@@CA_NXZ
+    ?DivUp@cord_internal@absl@@YA_K_K0@Z
     ?DoLoad@?$AtomicHook@P6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@absl@@Vstring_view@2@AEBVCord@2@@Z@base_internal@absl@@AEBAP6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@3@Vstring_view@3@AEBVCord@3@@ZXZ
     ?DoLoad@?$AtomicHook@P6AXPEBDH000@Z@base_internal@absl@@AEBAP6AXPEBDH000@ZXZ
     ?DoLoad@?$AtomicHook@P6AXPEBDPEBX@Z@base_internal@absl@@AEBAP6AXPEBDPEBX@ZXZ
@@ -1911,6 +1933,7 @@
     ?Nanoseconds@absl@@YA?AVDuration@1@_J@Z
     ?NegateAndSubtractOne@time_internal@absl@@YA_J_J@Z
     ?Never@KernelTimeout@synchronization_internal@absl@@SA?AV123@XZ
+    ?New@CordRepFlat@cord_internal@absl@@SAPEAU123@_K@Z
     ?NewArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@H@Z
     ?NewRep@Status@absl@@CA_KW4StatusCode@2@Vstring_view@2@V?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@__1@std@@@Z
     ?NextCapacity@?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@SA_K_K@Z
@@ -1982,9 +2005,9 @@
     ?RandomSeed@container_internal@absl@@YA_KXZ
     ?RawLog@raw_logging_internal@absl@@YAXW4LogSeverity@2@PEBDH1ZZ
     ?RawLoggingFullySupported@raw_logging_internal@absl@@YA_NXZ
-    ?Read1To3@CityHashState@hash_internal@absl@@CAIPEBE_K@Z
-    ?Read4To8@CityHashState@hash_internal@absl@@CA_KPEBE_K@Z
-    ?Read9To16@CityHashState@hash_internal@absl@@CA?AU?$pair@_K_K@__1@std@@PEBE_K@Z
+    ?Read1To3@HashState@hash_internal@absl@@CAIPEBE_K@Z
+    ?Read4To8@HashState@hash_internal@absl@@CA_KPEBE_K@Z
+    ?Read9To16@HashState@hash_internal@absl@@CA?AU?$pair@_K_K@__1@std@@PEBE_K@Z
     ?ReadDigits@?$BigUnsigned@$03@strings_internal@absl@@AEAAHPEBD0H@Z
     ?ReadDigits@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAHPEBD0H@Z
     ?ReadFloatMantissa@?$BigUnsigned@$03@strings_internal@absl@@QEAAHAEBUParsedFloat@23@H@Z
@@ -2026,6 +2049,8 @@
     ?Resize@?$ResizeUninitializedTraits@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@X@strings_internal@absl@@SAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@_K@Z
     ?ResourceExhaustedError@absl@@YA?AVStatus@1@Vstring_view@1@@Z
     ?Rethrow@variant_internal@absl@@YAXXZ
+    ?RoundUp@cord_internal@absl@@YA_K_K0@Z
+    ?RoundUpForTag@cord_internal@absl@@YA_K_K@Z
     ?SafeWriteToStderr@raw_logging_internal@absl@@YAXPEBD_K@Z
     ?SampleSlow@container_internal@absl@@YAPEAUHashtablezInfo@12@PEA_J@Z
     ?Seconds@absl@@YA?AVDuration@1@_J@Z
@@ -2117,6 +2142,8 @@
     ?SubtractSize@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAX_K@Z
     ?Summarize@str_format_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z
     ?Symbolize@absl@@YA_NPEBXPEADH@Z
+    ?TagToAllocatedSize@cord_internal@absl@@YA_KE@Z
+    ?TagToLength@cord_internal@absl@@YA_KE@Z
     ?TakeRep@Cord@absl@@AEGBAPEAUCordRep@cord_internal@2@XZ
     ?TakeRep@Cord@absl@@AEHAAPEAUCordRep@cord_internal@2@XZ
     ?ThrowBadStatusOrAccess@internal_statusor@absl@@YAXVStatus@2@@Z
@@ -2271,6 +2298,8 @@
     ?Write@BufferRawSink@str_format_internal@absl@@QEAAXVstring_view@3@@Z
     ?Write@FILERawSink@str_format_internal@absl@@QEAAXVstring_view@3@@Z
     ?Write@FormatRawSinkImpl@str_format_internal@absl@@QEAAXVstring_view@3@@Z
+    ?Wyhash@hash_internal@absl@@YA_KPEBX_K1QEB_K@Z
+    ?WyhashImpl@HashState@hash_internal@absl@@CA_KPEBE_K@Z
     ?ZeroDuration@absl@@YA?AVDuration@1@XZ
     ?__add_back_capacity@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAXXZ
     ?__addr@?$__temp_value@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAPEAUTransition@cctz@time_internal@absl@@XZ
@@ -2794,6 +2823,8 @@
     ?first@?$__compressed_pair@_KV?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAAEA_KXZ
     ?first@?$__compressed_pair@_KV?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBAAEB_KXZ
     ?fixed_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@AEBV?$duration@_JV?$ratio@$00$00@__1@std@@@chrono@__1@std@@@Z
+    ?flat@CordRep@cord_internal@absl@@QEAAPEAUCordRepFlat@23@XZ
+    ?flat@CordRep@cord_internal@absl@@QEBAPEBUCordRepFlat@23@XZ
     ?force_tree@InlineRep@Cord@absl@@QEAAPEAUCordRep@cord_internal@3@_K@Z
     ?format@detail@cctz@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@AEBV567@AEBV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@67@AEBV?$duration@_JV?$ratio@$00$0DINHOKEMGIAAA@@__1@std@@@967@AEBVtime_zone@234@@Z
     ?from_chars@absl@@YA?AUfrom_chars_result@1@PEBD0AEAMW4chars_format@1@@Z
diff --git a/third_party/abseil-cpp/symbols_x64_rel.def b/third_party/abseil-cpp/symbols_x64_rel.def
index 5534809..5ceb1dc 100644
--- a/third_party/abseil-cpp/symbols_x64_rel.def
+++ b/third_party/abseil-cpp/symbols_x64_rel.def
@@ -42,6 +42,13 @@
     ??$EmplaceBack@PEAUCordRep@cord_internal@absl@@@?$Storage@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEAPEAUCordRep@cord_internal@2@$$QEAPEAU342@@Z
     ??$EmplaceBack@UPayload@status_internal@absl@@@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEAUPayload@status_internal@2@$$QEAU342@@Z
     ??$EmplaceBack@USubRange@absl@@@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEAUSubRange@2@$$QEAU32@@Z
+    ??$EmplaceBackSlow@AEBQEAUCordRep@cord_internal@absl@@@?$Storage@PEAUCordRep@cord_internal@absl@@$03V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAAEAPEAUCordRep@cord_internal@2@AEBQEAU342@@Z
+    ??$EmplaceBackSlow@AEBQEAUCordRep@cord_internal@absl@@@?$Storage@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAAEAPEAUCordRep@cord_internal@2@AEBQEAU342@@Z
+    ??$EmplaceBackSlow@AEBQEBUCordRep@cord_internal@absl@@@?$Storage@PEBUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAAEAPEBUCordRep@cord_internal@2@AEBQEBU342@@Z
+    ??$EmplaceBackSlow@PEAUCordRep@cord_internal@absl@@@?$Storage@PEAUCordRep@cord_internal@absl@@$03V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAAEAPEAUCordRep@cord_internal@2@$$QEAPEAU342@@Z
+    ??$EmplaceBackSlow@PEAUCordRep@cord_internal@absl@@@?$Storage@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAAEAPEAUCordRep@cord_internal@2@$$QEAPEAU342@@Z
+    ??$EmplaceBackSlow@UPayload@status_internal@absl@@@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAAEAUPayload@status_internal@2@$$QEAU342@@Z
+    ??$EmplaceBackSlow@USubRange@absl@@@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAAEAUSubRange@2@$$QEAU32@@Z
     ??$FindSubstitutions@V?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@std@@@strings_internal@absl@@YA?AV?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@Vstring_view@1@AEBV?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@4@@Z
     ??$Flush@V?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@@FormatRawSinkImpl@str_format_internal@absl@@CAXPEAXVstring_view@2@@Z
     ??$Flush@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@FormatRawSinkImpl@str_format_internal@absl@@CAXPEAXVstring_view@2@@Z
@@ -106,6 +113,7 @@
     ??0Rep@GraphCycles@synchronization_internal@absl@@QEAA@XZ
     ??0SpinLock@base_internal@absl@@QEAA@W4SchedulingMode@12@@Z
     ??0Status@absl@@QEAA@W4StatusCode@1@Vstring_view@1@@Z
+    ??0StatusRep@status_internal@absl@@QEAA@W4StatusCode@2@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@V?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@56@@Z
     ??0Streamable@str_format_internal@absl@@QEAA@AEBVUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z
     ??0TimeZoneInfo@cctz@time_internal@absl@@QEAA@XZ
     ??0TimeZoneLibC@cctz@time_internal@absl@@QEAA@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
@@ -242,10 +250,10 @@
     ?ClearCurrentThreadIdentity@base_internal@absl@@YAXXZ
     ?ClearSlow@InlineRep@Cord@absl@@AEAAXXZ
     ?ClearTimeZoneMapTestOnly@Impl@time_zone@cctz@time_internal@absl@@SAXXZ
-    ?CombineContiguousImpl@CityHashState@hash_internal@absl@@CA_K_KPEBE0U?$integral_constant@H$03@__1@std@@@Z
-    ?CombineContiguousImpl@CityHashState@hash_internal@absl@@CA_K_KPEBE0U?$integral_constant@H$07@__1@std@@@Z
-    ?CombineLargeContiguousImpl32@CityHashState@hash_internal@absl@@CA_K_KPEBE0@Z
-    ?CombineLargeContiguousImpl64@CityHashState@hash_internal@absl@@CA_K_KPEBE0@Z
+    ?CombineContiguousImpl@HashState@hash_internal@absl@@CA_K_KPEBE0U?$integral_constant@H$03@__1@std@@@Z
+    ?CombineContiguousImpl@HashState@hash_internal@absl@@CA_K_KPEBE0U?$integral_constant@H$07@__1@std@@@Z
+    ?CombineLargeContiguousImpl32@HashState@hash_internal@absl@@CA_K_KPEBE0@Z
+    ?CombineLargeContiguousImpl64@HashState@hash_internal@absl@@CA_K_KPEBE0@Z
     ?Compare@Cord@absl@@QEBAHVstring_view@2@@Z
     ?CompareImpl@Cord@absl@@AEBAHAEBV12@@Z
     ?CompareSlowPath@Cord@absl@@AEBAHAEBV12@_K1@Z
@@ -470,6 +478,7 @@
     ?MultiplyStep@?$BigUnsigned@$03@strings_internal@absl@@AEAAXHPEBIHH@Z
     ?MultiplyStep@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAXHPEBIHH@Z
     ?MutexDelay@synchronization_internal@absl@@YAHHH@Z
+    ?New@CordRepFlat@cord_internal@absl@@SAPEAU123@_K@Z
     ?NewArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@H@Z
     ?NewRep@Status@absl@@CA_KW4StatusCode@2@Vstring_view@2@V?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@__1@std@@@Z
     ?NextTransition@TimeZone@absl@@QEBA_NVTime@2@PEAUCivilTransition@12@@Z
@@ -700,6 +709,8 @@
     ?WebSafeBase64Unescape@absl@@YA_NVstring_view@1@PEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ?Write@BufferRawSink@str_format_internal@absl@@QEAAXVstring_view@3@@Z
     ?Write@FILERawSink@str_format_internal@absl@@QEAAXVstring_view@3@@Z
+    ?Wyhash@hash_internal@absl@@YA_KPEBX_K1QEB_K@Z
+    ?WyhashImpl@HashState@hash_internal@absl@@CA_KPEBE_K@Z
     ?__add_back_capacity@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAXXZ
     ?__append@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAX_K@Z
     ?__append@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAX_K@Z
diff --git a/third_party/abseil-cpp/symbols_x64_rel_asan.def b/third_party/abseil-cpp/symbols_x64_rel_asan.def
index 97e39f5..b036ba2 100644
--- a/third_party/abseil-cpp/symbols_x64_rel_asan.def
+++ b/third_party/abseil-cpp/symbols_x64_rel_asan.def
@@ -42,6 +42,13 @@
     ??$EmplaceBack@PEAUCordRep@cord_internal@absl@@@?$Storage@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEAPEAUCordRep@cord_internal@2@$$QEAPEAU342@@Z
     ??$EmplaceBack@UPayload@status_internal@absl@@@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEAUPayload@status_internal@2@$$QEAU342@@Z
     ??$EmplaceBack@USubRange@absl@@@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEAUSubRange@2@$$QEAU32@@Z
+    ??$EmplaceBackSlow@AEBQEAUCordRep@cord_internal@absl@@@?$Storage@PEAUCordRep@cord_internal@absl@@$03V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAAEAPEAUCordRep@cord_internal@2@AEBQEAU342@@Z
+    ??$EmplaceBackSlow@AEBQEAUCordRep@cord_internal@absl@@@?$Storage@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAAEAPEAUCordRep@cord_internal@2@AEBQEAU342@@Z
+    ??$EmplaceBackSlow@AEBQEBUCordRep@cord_internal@absl@@@?$Storage@PEBUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAAEAPEBUCordRep@cord_internal@2@AEBQEBU342@@Z
+    ??$EmplaceBackSlow@PEAUCordRep@cord_internal@absl@@@?$Storage@PEAUCordRep@cord_internal@absl@@$03V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAAEAPEAUCordRep@cord_internal@2@$$QEAPEAU342@@Z
+    ??$EmplaceBackSlow@PEAUCordRep@cord_internal@absl@@@?$Storage@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAAEAPEAUCordRep@cord_internal@2@$$QEAPEAU342@@Z
+    ??$EmplaceBackSlow@UPayload@status_internal@absl@@@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAAEAUPayload@status_internal@2@$$QEAU342@@Z
+    ??$EmplaceBackSlow@USubRange@absl@@@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAAEAUSubRange@2@$$QEAU32@@Z
     ??$FindSubstitutions@V?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@std@@@strings_internal@absl@@YA?AV?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@Vstring_view@1@AEBV?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@4@@Z
     ??$Flush@V?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@@FormatRawSinkImpl@str_format_internal@absl@@CAXPEAXVstring_view@2@@Z
     ??$Flush@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@FormatRawSinkImpl@str_format_internal@absl@@CAXPEAXVstring_view@2@@Z
@@ -111,6 +118,7 @@
     ??0Rep@GraphCycles@synchronization_internal@absl@@QEAA@XZ
     ??0SpinLock@base_internal@absl@@QEAA@W4SchedulingMode@12@@Z
     ??0Status@absl@@QEAA@W4StatusCode@1@Vstring_view@1@@Z
+    ??0StatusRep@status_internal@absl@@QEAA@W4StatusCode@2@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@V?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@56@@Z
     ??0Streamable@str_format_internal@absl@@QEAA@AEBVUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z
     ??0TimeZoneInfo@cctz@time_internal@absl@@QEAA@XZ
     ??0TimeZoneLibC@cctz@time_internal@absl@@QEAA@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
@@ -261,10 +269,10 @@
     ?ClearCurrentThreadIdentity@base_internal@absl@@YAXXZ
     ?ClearSlow@InlineRep@Cord@absl@@AEAAXXZ
     ?ClearTimeZoneMapTestOnly@Impl@time_zone@cctz@time_internal@absl@@SAXXZ
-    ?CombineContiguousImpl@CityHashState@hash_internal@absl@@CA_K_KPEBE0U?$integral_constant@H$03@__1@std@@@Z
-    ?CombineContiguousImpl@CityHashState@hash_internal@absl@@CA_K_KPEBE0U?$integral_constant@H$07@__1@std@@@Z
-    ?CombineLargeContiguousImpl32@CityHashState@hash_internal@absl@@CA_K_KPEBE0@Z
-    ?CombineLargeContiguousImpl64@CityHashState@hash_internal@absl@@CA_K_KPEBE0@Z
+    ?CombineContiguousImpl@HashState@hash_internal@absl@@CA_K_KPEBE0U?$integral_constant@H$03@__1@std@@@Z
+    ?CombineContiguousImpl@HashState@hash_internal@absl@@CA_K_KPEBE0U?$integral_constant@H$07@__1@std@@@Z
+    ?CombineLargeContiguousImpl32@HashState@hash_internal@absl@@CA_K_KPEBE0@Z
+    ?CombineLargeContiguousImpl64@HashState@hash_internal@absl@@CA_K_KPEBE0@Z
     ?Compare@Cord@absl@@QEBAHVstring_view@2@@Z
     ?CompareImpl@Cord@absl@@AEBAHAEBV12@@Z
     ?CompareSlowPath@Cord@absl@@AEBAHAEBV12@_K1@Z
@@ -488,6 +496,7 @@
     ?MultiplyStep@?$BigUnsigned@$03@strings_internal@absl@@AEAAXHPEBIHH@Z
     ?MultiplyStep@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAXHPEBIHH@Z
     ?MutexDelay@synchronization_internal@absl@@YAHHH@Z
+    ?New@CordRepFlat@cord_internal@absl@@SAPEAU123@_K@Z
     ?NewArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@H@Z
     ?NewRep@Status@absl@@CA_KW4StatusCode@2@Vstring_view@2@V?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@__1@std@@@Z
     ?NextTransition@TimeZone@absl@@QEBA_NVTime@2@PEAUCivilTransition@12@@Z
@@ -718,6 +727,8 @@
     ?WebSafeBase64Unescape@absl@@YA_NVstring_view@1@PEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ?Write@BufferRawSink@str_format_internal@absl@@QEAAXVstring_view@3@@Z
     ?Write@FILERawSink@str_format_internal@absl@@QEAAXVstring_view@3@@Z
+    ?Wyhash@hash_internal@absl@@YA_KPEBX_K1QEB_K@Z
+    ?WyhashImpl@HashState@hash_internal@absl@@CA_KPEBE_K@Z
     ?__add_back_capacity@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAXXZ
     ?__annotate_delete@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@AEBAXXZ
     ?__annotate_increase@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@AEBAX_K@Z
diff --git a/third_party/abseil-cpp/symbols_x86_dbg.def b/third_party/abseil-cpp/symbols_x86_dbg.def
index cea7708..2d26b43 100644
--- a/third_party/abseil-cpp/symbols_x86_dbg.def
+++ b/third_party/abseil-cpp/symbols_x86_dbg.def
@@ -82,12 +82,13 @@
     ??$?0AAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@X@?$__compressed_pair_elem@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@$00$0A@@__1@std@@QAE@AAV?$allocator@UTransition@cctz@time_internal@absl@@@12@@Z
     ??$?0AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@X@?$__compressed_pair_elem@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@$00$0A@@__1@std@@QAE@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@@Z
     ??$?0AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@X@?$__compressed_pair_elem@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@$00$0A@@__1@std@@QAE@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@@Z
-    ??$?0ABI@?$Storage@I$00$0A@@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@3@ABI@Z
     ??$?0ABV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@?$Storage@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@$00$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@3@ABV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@Z
     ??$?0ABV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@?$Storage@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@3@ABV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@Z
-    ??$?0ABV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@ABI@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@I@container_internal@absl@@U?$integer_sequence@I$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@3@ABV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@ABI@Z
+    ??$?0ABV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@H$00@?$CompressedTuple@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@I@container_internal@absl@@QAE@ABV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@$$QAH@Z
+    ??$?0ABV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@H@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@I@container_internal@absl@@U?$integer_sequence@I$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@3@ABV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@$$QAH@Z
     ??$?0ABV?$allocator@UPayload@status_internal@absl@@@__1@std@@@?$Storage@V?$allocator@UPayload@status_internal@absl@@@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@3@ABV?$allocator@UPayload@status_internal@absl@@@__1@std@@@Z
-    ??$?0ABV?$allocator@UPayload@status_internal@absl@@@__1@std@@ABI@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__1@std@@I@container_internal@absl@@U?$integer_sequence@I$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@3@ABV?$allocator@UPayload@status_internal@absl@@@__1@std@@ABI@Z
+    ??$?0ABV?$allocator@UPayload@status_internal@absl@@@__1@std@@H$00@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__1@std@@I@container_internal@absl@@QAE@ABV?$allocator@UPayload@status_internal@absl@@@__1@std@@$$QAH@Z
+    ??$?0ABV?$allocator@UPayload@status_internal@absl@@@__1@std@@H@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__1@std@@I@container_internal@absl@@U?$integer_sequence@I$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@3@ABV?$allocator@UPayload@status_internal@absl@@@__1@std@@$$QAH@Z
     ??$?0ABV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$$Z$$V$$Z$0A@$$Z$S@?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@AAE@Upiecewise_construct_t@12@AAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@12@AAV?$tuple@$$V@12@U?$__tuple_indices@$0A@@12@U?$__tuple_indices@$S@12@@Z
     ??$?0ABV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$$Z$$V@?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QAE@Upiecewise_construct_t@12@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@12@V?$tuple@$$V@12@@Z
     ??$?0ABVCord@absl@@$0A@@?$optional@VCord@absl@@@absl@@QAE@ABVCord@1@@Z
@@ -95,6 +96,7 @@
     ??$?0H$00@?$__compressed_pair@IV?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@__1@std@@@__1@std@@QAE@$$QAH@Z
     ??$?0H$00@?$__compressed_pair@IV?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@__1@std@@@__1@std@@QAE@$$QAH@Z
     ??$?0H$00@?$__compressed_pair@IV?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE@$$QAH@Z
+    ??$?0H@?$Storage@I$00$0A@@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@3@$$QAH@Z
     ??$?0H@FormatArgImpl@str_format_internal@absl@@QAE@ABH@Z
     ??$?0M$00@?$__compressed_pair@MV?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@__1@std@@@__1@std@@QAE@$$QAM@Z
     ??$?0PAPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@$00@?$__compressed_pair@PAPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@V?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@__1@std@@@23@@__1@std@@QAE@$$QAPAPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@12@@Z
@@ -160,6 +162,21 @@
     ??$?0V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@__1@std@@X@?$__compressed_pair_elem@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@__1@std@@$00$0A@@__1@std@@QAE@$$QAV?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@12@@Z
     ??$?0V?$allocator@D@__1@std@@@AlphaNum@absl@@QAE@ABV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ??$?0V?$allocator@D@__1@std@@@string_view@absl@@QAE@ABV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
+    ??$?0V?$allocator@H@__1@std@@@?$Storage@V?$allocator@H@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@3@$$QAV?$allocator@H@__1@std@@@Z
+    ??$?0V?$allocator@H@__1@std@@H$00@?$CompressedTuple@V?$allocator@H@__1@std@@I@container_internal@absl@@QAE@$$QAV?$allocator@H@__1@std@@$$QAH@Z
+    ??$?0V?$allocator@H@__1@std@@H@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@H@__1@std@@I@container_internal@absl@@U?$integer_sequence@I$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@3@$$QAV?$allocator@H@__1@std@@$$QAH@Z
+    ??$?0V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@?$Storage@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@3@$$QAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@Z
+    ??$?0V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@H$00@?$CompressedTuple@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@I@container_internal@absl@@QAE@$$QAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@$$QAH@Z
+    ??$?0V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@H@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@I@container_internal@absl@@U?$integer_sequence@I$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@3@$$QAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@$$QAH@Z
+    ??$?0V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@?$Storage@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@3@$$QAV?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@Z
+    ??$?0V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@H$00@?$CompressedTuple@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@I@container_internal@absl@@QAE@$$QAV?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@$$QAH@Z
+    ??$?0V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@H@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@I@container_internal@absl@@U?$integer_sequence@I$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@3@$$QAV?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@$$QAH@Z
+    ??$?0V?$allocator@UPayload@status_internal@absl@@@__1@std@@@?$Storage@V?$allocator@UPayload@status_internal@absl@@@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@3@$$QAV?$allocator@UPayload@status_internal@absl@@@__1@std@@@Z
+    ??$?0V?$allocator@UPayload@status_internal@absl@@@__1@std@@H$00@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__1@std@@I@container_internal@absl@@QAE@$$QAV?$allocator@UPayload@status_internal@absl@@@__1@std@@$$QAH@Z
+    ??$?0V?$allocator@UPayload@status_internal@absl@@@__1@std@@H@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__1@std@@I@container_internal@absl@@U?$integer_sequence@I$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@3@$$QAV?$allocator@UPayload@status_internal@absl@@@__1@std@@$$QAH@Z
+    ??$?0V?$allocator@USubRange@absl@@@__1@std@@@?$Storage@V?$allocator@USubRange@absl@@@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@3@$$QAV?$allocator@USubRange@absl@@@__1@std@@@Z
+    ??$?0V?$allocator@USubRange@absl@@@__1@std@@H$00@?$CompressedTuple@V?$allocator@USubRange@absl@@@__1@std@@I@container_internal@absl@@QAE@$$QAV?$allocator@USubRange@absl@@@__1@std@@$$QAH@Z
+    ??$?0V?$allocator@USubRange@absl@@@__1@std@@H@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@USubRange@absl@@@__1@std@@I@container_internal@absl@@U?$integer_sequence@I$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@3@$$QAV?$allocator@USubRange@absl@@@__1@std@@$$QAH@Z
     ??$?0V?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QAE@PAV?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@@Z
     ??$?0V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@Cord@absl@@QAE@$$QAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ??$?0V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QAE@PAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
@@ -274,6 +291,15 @@
     ??$EmplaceBack@PAUCordRep@cord_internal@absl@@@?$Storage@PAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEAAPAUCordRep@cord_internal@2@$$QAPAU342@@Z
     ??$EmplaceBack@UPayload@status_internal@absl@@@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEAAUPayload@status_internal@2@$$QAU342@@Z
     ??$EmplaceBack@USubRange@absl@@@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEAAUSubRange@2@$$QAU32@@Z
+    ??$EmplaceBackSlow@ABH@?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@AAEAAHABH@Z
+    ??$EmplaceBackSlow@ABQAUCordRep@cord_internal@absl@@@?$Storage@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AAEAAPAUCordRep@cord_internal@2@ABQAU342@@Z
+    ??$EmplaceBackSlow@ABQAUCordRep@cord_internal@absl@@@?$Storage@PAUCordRep@cord_internal@absl@@$03V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AAEAAPAUCordRep@cord_internal@2@ABQAU342@@Z
+    ??$EmplaceBackSlow@ABQAUCordRep@cord_internal@absl@@@?$Storage@PAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AAEAAPAUCordRep@cord_internal@2@ABQAU342@@Z
+    ??$EmplaceBackSlow@ABQBUCordRep@cord_internal@absl@@@?$Storage@PBUCordRep@cord_internal@absl@@$0CP@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AAEAAPBUCordRep@cord_internal@2@ABQBU342@@Z
+    ??$EmplaceBackSlow@PAUCordRep@cord_internal@absl@@@?$Storage@PAUCordRep@cord_internal@absl@@$03V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AAEAAPAUCordRep@cord_internal@2@$$QAPAU342@@Z
+    ??$EmplaceBackSlow@PAUCordRep@cord_internal@absl@@@?$Storage@PAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AAEAAPAUCordRep@cord_internal@2@$$QAPAU342@@Z
+    ??$EmplaceBackSlow@UPayload@status_internal@absl@@@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AAEAAUPayload@status_internal@2@$$QAU342@@Z
+    ??$EmplaceBackSlow@USubRange@absl@@@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@AAEAAUSubRange@2@$$QAU32@@Z
     ??$ExtractCharSet@$03@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@U?$ArgConvertResult@$03@01@@Z
     ??$ExtractCharSet@$0BPOAA@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@U?$ArgConvertResult@$0BPOAA@@01@@Z
     ??$ExtractCharSet@$0BPPPL@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@U?$ArgConvertResult@$0BPPPL@@01@@Z
@@ -598,7 +624,6 @@
     ??$forward@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@YAAAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@AAV201@@Z
     ??$forward@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@YAAAV?$allocator@UViableSubstitution@strings_internal@absl@@@01@AAV201@@Z
     ??$forward@AAVstring_view@absl@@@__1@std@@YAAAVstring_view@absl@@AAV23@@Z
-    ??$forward@ABI@absl@@YAABIABI@Z
     ??$forward@ABQAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@YAABQAPBVImpl@time_zone@cctz@time_internal@absl@@ABQAPBV23456@@Z
     ??$forward@ABQAUCordRep@cord_internal@absl@@@__1@std@@YAABQAUCordRep@cord_internal@absl@@ABQAU234@@Z
     ??$forward@ABQBUCordRep@cord_internal@absl@@@__1@std@@YAABQBUCordRep@cord_internal@absl@@ABQBU234@@Z
@@ -611,6 +636,7 @@
     ??$forward@ABVCord@absl@@@__1@std@@YAABVCord@absl@@ABV23@@Z
     ??$forward@ABVCord@absl@@@absl@@YAABVCord@0@ABV10@@Z
     ??$forward@ABVstring_view@absl@@@__1@std@@YAABVstring_view@absl@@ABV23@@Z
+    ??$forward@H@absl@@YA$$QAHAAH@Z
     ??$forward@PAPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@__1@std@@YA$$QAPAPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@01@AAPAPAU201@@Z
     ??$forward@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@YA$$QAPAPBVImpl@time_zone@cctz@time_internal@absl@@AAPAPBV23456@@Z
     ??$forward@PAUCordRep@cord_internal@absl@@@__1@std@@YA$$QAPAUCordRep@cord_internal@absl@@AAPAU234@@Z
@@ -632,6 +658,11 @@
     ??$forward@V?$__allocator_destructor@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@@__1@std@@YA$$QAV?$__allocator_destructor@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@01@AAV201@@Z
     ??$forward@V?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@__1@std@@YA$$QAV?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@01@AAV201@@Z
     ??$forward@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@__1@std@@@__1@std@@YA$$QAV?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@01@AAV201@@Z
+    ??$forward@V?$allocator@H@__1@std@@@absl@@YA$$QAV?$allocator@H@__1@std@@AAV123@@Z
+    ??$forward@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@absl@@YA$$QAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@AAV123@@Z
+    ??$forward@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@absl@@YA$$QAV?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@AAV123@@Z
+    ??$forward@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@YA$$QAV?$allocator@UPayload@status_internal@absl@@@__1@std@@AAV123@@Z
+    ??$forward@V?$allocator@USubRange@absl@@@__1@std@@@absl@@YA$$QAV?$allocator@USubRange@absl@@@__1@std@@AAV123@@Z
     ??$forward@VCord@absl@@@__1@std@@YA$$QAVCord@absl@@AAV23@@Z
     ??$forward@Vstring_view@absl@@@__1@std@@YA$$QAVstring_view@absl@@AAV23@@Z
     ??$forward@W4LogSeverity@absl@@@__1@std@@YA$$QAW4LogSeverity@absl@@AAW423@@Z
@@ -725,18 +756,6 @@
     ??0?$BigUnsigned@$0FE@@strings_internal@absl@@QAE@Vstring_view@2@@Z
     ??0?$BigUnsigned@$0FE@@strings_internal@absl@@QAE@XZ
     ??0?$BigUnsigned@$0FE@@strings_internal@absl@@QAE@_K@Z
-    ??0?$CompressedTuple@V?$allocator@H@__1@std@@I@container_internal@absl@@QAE@XZ
-    ??0?$CompressedTuple@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@I@container_internal@absl@@QAE@ABV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@ABI@Z
-    ??0?$CompressedTuple@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@I@container_internal@absl@@QAE@XZ
-    ??0?$CompressedTuple@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@I@container_internal@absl@@QAE@XZ
-    ??0?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__1@std@@I@container_internal@absl@@QAE@ABV?$allocator@UPayload@status_internal@absl@@@__1@std@@ABI@Z
-    ??0?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__1@std@@I@container_internal@absl@@QAE@XZ
-    ??0?$CompressedTuple@V?$allocator@USubRange@absl@@@__1@std@@I@container_internal@absl@@QAE@XZ
-    ??0?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@H@__1@std@@I@container_internal@absl@@U?$integer_sequence@I$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QAE@XZ
-    ??0?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@I@container_internal@absl@@U?$integer_sequence@I$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QAE@XZ
-    ??0?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@I@container_internal@absl@@U?$integer_sequence@I$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QAE@XZ
-    ??0?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__1@std@@I@container_internal@absl@@U?$integer_sequence@I$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QAE@XZ
-    ??0?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@USubRange@absl@@@__1@std@@I@container_internal@absl@@U?$integer_sequence@I$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QAE@XZ
     ??0?$CopyValueAdapter@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAE@ABQAUCordRep@cord_internal@2@@Z
     ??0?$FixedArray@PAUCordRep@cord_internal@absl@@$0PPPPPPPP@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QAE@IABV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@Z
     ??0?$InlinedVector@H$0CP@V?$allocator@H@__1@std@@@absl@@QAE@XZ
@@ -768,11 +787,6 @@
     ??0?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAE@ABV?$allocator@UPayload@status_internal@absl@@@__1@std@@@Z
     ??0?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAE@XZ
     ??0?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QAE@XZ
-    ??0?$Storage@V?$allocator@H@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QAE@XZ
-    ??0?$Storage@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QAE@XZ
-    ??0?$Storage@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QAE@XZ
-    ??0?$Storage@V?$allocator@UPayload@status_internal@absl@@@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QAE@XZ
-    ??0?$Storage@V?$allocator@USubRange@absl@@@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QAE@XZ
     ??0?$__allocator_destructor@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE@AAV?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@12@I@Z
     ??0?$__atomic_base@P6AXABUHashtablezInfo@container_internal@absl@@@Z$0A@@__1@std@@QAE@P6AXABUHashtablezInfo@container_internal@absl@@@Z@Z
     ??0?$__atomic_base@PAUHashtablezInfo@container_internal@absl@@$0A@@__1@std@@QAE@PAUHashtablezInfo@container_internal@absl@@@Z
@@ -925,6 +939,7 @@
     ??0CordRep@cord_internal@absl@@QAE@XZ
     ??0CordRepConcat@cord_internal@absl@@QAE@XZ
     ??0CordRepExternal@cord_internal@absl@@QAE@XZ
+    ??0CordRepFlat@cord_internal@absl@@QAE@XZ
     ??0CordRepSubstring@cord_internal@absl@@QAE@XZ
     ??0Duration@absl@@AAE@_JI@Z
     ??0Duration@absl@@QAE@XZ
@@ -962,7 +977,7 @@
     ??0SpinLockHolder@base_internal@absl@@QAE@PAVSpinLock@12@@Z
     ??0Status@absl@@QAE@$$QAV01@@Z
     ??0Status@absl@@QAE@W4StatusCode@1@Vstring_view@1@@Z
-    ??0StatusRep@status_internal@absl@@QAE@XZ
+    ??0StatusRep@status_internal@absl@@QAE@W4StatusCode@2@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@V?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@56@@Z
     ??0Storage@?$FixedArray@PAUCordRep@cord_internal@absl@@$0PPPPPPPP@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QAE@IABV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@Z
     ??0Streamable@str_format_internal@absl@@QAE@ABVUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z
     ??0StringReleaser@?M@???$?0V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@Cord@absl@@QAE@$$QAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z@QAE@$$QAU0?M@???$?0V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@12@QAE@0@Z@@Z
@@ -1399,6 +1414,9 @@
     ?Allocate@?$AllocationTransaction@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEPAPBUCordRep@cord_internal@3@I@Z
     ?Allocate@?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEPAUPayload@status_internal@3@I@Z
     ?Allocate@?$AllocationTransaction@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEPAUSubRange@3@I@Z
+    ?AllocatedSize@CordRepFlat@cord_internal@absl@@QBEIXZ
+    ?AllocatedSizeToTag@cord_internal@absl@@YAEI@Z
+    ?AllocatedSizeToTagUnchecked@cord_internal@absl@@YAII@Z
     ?AlreadyExistsError@absl@@YA?AVStatus@1@Vstring_view@1@@Z
     ?AnnotateConstruct@NonEmptyInlinedStorage@?$FixedArray@PAUCordRep@cord_internal@absl@@$0PPPPPPPP@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QAEXI@Z
     ?AnnotateDestruct@NonEmptyInlinedStorage@?$FixedArray@PAUCordRep@cord_internal@absl@@$0PPPPPPPP@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QAEXI@Z
@@ -1450,6 +1468,7 @@
     ?CalculateBase64EscapedLenInternal@strings_internal@absl@@YAII_N@Z
     ?CallVoidPtrFunction@Condition@absl@@CA_NPBV12@@Z
     ?CancelledError@absl@@YA?AVStatus@1@Vstring_view@1@@Z
+    ?Capacity@CordRepFlat@cord_internal@absl@@QBEIXZ
     ?CatPieces@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@V?$initializer_list@Vstring_view@absl@@@5@@Z
     ?Ceil@absl@@YA?AVDuration@1@V21@0@Z
     ?CheckInvariants@GraphCycles@synchronization_internal@absl@@QBE_NXZ
@@ -1465,10 +1484,10 @@
     ?ClearSlow@InlineRep@Cord@absl@@AAEXXZ
     ?ClearTimeZoneMapTestOnly@Impl@time_zone@cctz@time_internal@absl@@SAXXZ
     ?CodeToInlinedRep@Status@absl@@CAIW4StatusCode@2@@Z
-    ?CombineContiguousImpl@CityHashState@hash_internal@absl@@CA_K_KPBEIU?$integral_constant@H$03@__1@std@@@Z
-    ?CombineContiguousImpl@CityHashState@hash_internal@absl@@CA_K_KPBEIU?$integral_constant@H$07@__1@std@@@Z
-    ?CombineLargeContiguousImpl32@CityHashState@hash_internal@absl@@CA_K_KPBEI@Z
-    ?CombineLargeContiguousImpl64@CityHashState@hash_internal@absl@@CA_K_KPBEI@Z
+    ?CombineContiguousImpl@HashState@hash_internal@absl@@CA_K_KPBEIU?$integral_constant@H$03@__1@std@@@Z
+    ?CombineContiguousImpl@HashState@hash_internal@absl@@CA_K_KPBEIU?$integral_constant@H$07@__1@std@@@Z
+    ?CombineLargeContiguousImpl32@HashState@hash_internal@absl@@CA_K_KPBEI@Z
+    ?CombineLargeContiguousImpl64@HashState@hash_internal@absl@@CA_K_KPBEI@Z
     ?Compare@Cord@absl@@QBEHVstring_view@2@@Z
     ?CompareImpl@Cord@absl@@ABEHABV12@@Z
     ?CompareSlowPath@Cord@absl@@ABEHABV12@II@Z
@@ -1518,6 +1537,8 @@
     ?DecrementSynchSem@Mutex@absl@@CA_NPAV12@PAUPerThreadSynch@base_internal@2@VKernelTimeout@synchronization_internal@2@@Z
     ?DefaultArena@LowLevelAlloc@base_internal@absl@@SAPAUArena@123@XZ
     ?DefaultStackUnwinder@absl@@YAHPAPAXPAHHHPBX1@Z
+    ?Delete@CordRepExternal@cord_internal@absl@@SAXPAUCordRep@23@@Z
+    ?Delete@CordRepFlat@cord_internal@absl@@SAXPAUCordRep@23@@Z
     ?DeleteArena@LowLevelAlloc@base_internal@absl@@SA_NPAUArena@123@@Z
     ?Demangle@debugging_internal@absl@@YA_NPBDPADH@Z
     ?Description@Impl@time_zone@cctz@time_internal@absl@@QBE?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
@@ -1533,6 +1554,7 @@
     ?Digits10@?$BigUnsigned@$03@strings_internal@absl@@SAHXZ
     ?Digits10@?$BigUnsigned@$0FE@@strings_internal@absl@@SAHXZ
     ?DisableRescheduling@SchedulingGuard@base_internal@absl@@CA_NXZ
+    ?DivUp@cord_internal@absl@@YAIII@Z
     ?DoLoad@?$AtomicHook@P6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@absl@@Vstring_view@2@ABVCord@2@@Z@base_internal@absl@@ABEP6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@3@Vstring_view@3@ABVCord@3@@ZXZ
     ?DoLoad@?$AtomicHook@P6AXPBDH000@Z@base_internal@absl@@ABEP6AXPBDH000@ZXZ
     ?DoLoad@?$AtomicHook@P6AXPBDPBX@Z@base_internal@absl@@ABEP6AXPBDPBX@ZXZ
@@ -1908,6 +1930,7 @@
     ?Nanoseconds@absl@@YA?AVDuration@1@_J@Z
     ?NegateAndSubtractOne@time_internal@absl@@YA_J_J@Z
     ?Never@KernelTimeout@synchronization_internal@absl@@SA?AV123@XZ
+    ?New@CordRepFlat@cord_internal@absl@@SAPAU123@I@Z
     ?NewArena@LowLevelAlloc@base_internal@absl@@SAPAUArena@123@H@Z
     ?NewRep@Status@absl@@CAIW4StatusCode@2@Vstring_view@2@V?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@__1@std@@@Z
     ?NextCapacity@?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@SAII@Z
@@ -1979,9 +2002,9 @@
     ?RandomSeed@container_internal@absl@@YAIXZ
     ?RawLog@raw_logging_internal@absl@@YAXW4LogSeverity@2@PBDH1ZZ
     ?RawLoggingFullySupported@raw_logging_internal@absl@@YA_NXZ
-    ?Read1To3@CityHashState@hash_internal@absl@@CAIPBEI@Z
-    ?Read4To8@CityHashState@hash_internal@absl@@CA_KPBEI@Z
-    ?Read9To16@CityHashState@hash_internal@absl@@CA?AU?$pair@_K_K@__1@std@@PBEI@Z
+    ?Read1To3@HashState@hash_internal@absl@@CAIPBEI@Z
+    ?Read4To8@HashState@hash_internal@absl@@CA_KPBEI@Z
+    ?Read9To16@HashState@hash_internal@absl@@CA?AU?$pair@_K_K@__1@std@@PBEI@Z
     ?ReadDigits@?$BigUnsigned@$03@strings_internal@absl@@AAEHPBD0H@Z
     ?ReadDigits@?$BigUnsigned@$0FE@@strings_internal@absl@@AAEHPBD0H@Z
     ?ReadFloatMantissa@?$BigUnsigned@$03@strings_internal@absl@@QAEHABUParsedFloat@23@H@Z
@@ -2023,6 +2046,8 @@
     ?Resize@?$ResizeUninitializedTraits@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@X@strings_internal@absl@@SAXPAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@I@Z
     ?ResourceExhaustedError@absl@@YA?AVStatus@1@Vstring_view@1@@Z
     ?Rethrow@variant_internal@absl@@YAXXZ
+    ?RoundUp@cord_internal@absl@@YAIII@Z
+    ?RoundUpForTag@cord_internal@absl@@YAII@Z
     ?SafeWriteToStderr@raw_logging_internal@absl@@YAXPBDI@Z
     ?SampleSlow@container_internal@absl@@YAPAUHashtablezInfo@12@PA_J@Z
     ?Seconds@absl@@YA?AVDuration@1@_J@Z
@@ -2114,6 +2139,8 @@
     ?SubtractSize@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEXI@Z
     ?Summarize@str_format_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z
     ?Symbolize@absl@@YA_NPBXPADH@Z
+    ?TagToAllocatedSize@cord_internal@absl@@YAIE@Z
+    ?TagToLength@cord_internal@absl@@YAIE@Z
     ?TakeRep@Cord@absl@@AGBEPAUCordRep@cord_internal@2@XZ
     ?TakeRep@Cord@absl@@AHAEPAUCordRep@cord_internal@2@XZ
     ?ThrowBadStatusOrAccess@internal_statusor@absl@@YAXVStatus@2@@Z
@@ -2268,6 +2295,8 @@
     ?Write@BufferRawSink@str_format_internal@absl@@QAEXVstring_view@3@@Z
     ?Write@FILERawSink@str_format_internal@absl@@QAEXVstring_view@3@@Z
     ?Write@FormatRawSinkImpl@str_format_internal@absl@@QAEXVstring_view@3@@Z
+    ?Wyhash@hash_internal@absl@@YA_KPBXI_KQB_K@Z
+    ?WyhashImpl@HashState@hash_internal@absl@@CA_KPBEI@Z
     ?ZeroDuration@absl@@YA?AVDuration@1@XZ
     ?__add_back_capacity@?$deque@PBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@AAEXXZ
     ?__addr@?$__temp_value@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAEPAUTransition@cctz@time_internal@absl@@XZ
@@ -2791,6 +2820,8 @@
     ?first@?$__compressed_pair@PBVImpl@time_zone@cctz@time_internal@absl@@U?$default_delete@$$CBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QBEABQBVImpl@time_zone@cctz@time_internal@absl@@XZ
     ?first@?$__compressed_pair@U?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@23@@__1@std@@QAEAAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@23@XZ
     ?fixed_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@ABV?$duration@_JV?$ratio@$00$00@__1@std@@@chrono@__1@std@@@Z
+    ?flat@CordRep@cord_internal@absl@@QAEPAUCordRepFlat@23@XZ
+    ?flat@CordRep@cord_internal@absl@@QBEPBUCordRepFlat@23@XZ
     ?force_tree@InlineRep@Cord@absl@@QAEPAUCordRep@cord_internal@3@I@Z
     ?format@detail@cctz@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@ABV567@ABV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@67@ABV?$duration@_JV?$ratio@$00$0DINHOKEMGIAAA@@__1@std@@@967@ABVtime_zone@234@@Z
     ?from_chars@absl@@YA?AUfrom_chars_result@1@PBD0AAMW4chars_format@1@@Z
diff --git a/third_party/abseil-cpp/symbols_x86_rel.def b/third_party/abseil-cpp/symbols_x86_rel.def
index e06a668..3ef1152 100644
--- a/third_party/abseil-cpp/symbols_x86_rel.def
+++ b/third_party/abseil-cpp/symbols_x86_rel.def
@@ -42,6 +42,13 @@
     ??$EmplaceBack@PAUCordRep@cord_internal@absl@@@?$Storage@PAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEAAPAUCordRep@cord_internal@2@$$QAPAU342@@Z
     ??$EmplaceBack@UPayload@status_internal@absl@@@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEAAUPayload@status_internal@2@$$QAU342@@Z
     ??$EmplaceBack@USubRange@absl@@@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEAAUSubRange@2@$$QAU32@@Z
+    ??$EmplaceBackSlow@ABQAUCordRep@cord_internal@absl@@@?$Storage@PAUCordRep@cord_internal@absl@@$03V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AAEAAPAUCordRep@cord_internal@2@ABQAU342@@Z
+    ??$EmplaceBackSlow@ABQAUCordRep@cord_internal@absl@@@?$Storage@PAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AAEAAPAUCordRep@cord_internal@2@ABQAU342@@Z
+    ??$EmplaceBackSlow@ABQBUCordRep@cord_internal@absl@@@?$Storage@PBUCordRep@cord_internal@absl@@$0CP@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AAEAAPBUCordRep@cord_internal@2@ABQBU342@@Z
+    ??$EmplaceBackSlow@PAUCordRep@cord_internal@absl@@@?$Storage@PAUCordRep@cord_internal@absl@@$03V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AAEAAPAUCordRep@cord_internal@2@$$QAPAU342@@Z
+    ??$EmplaceBackSlow@PAUCordRep@cord_internal@absl@@@?$Storage@PAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AAEAAPAUCordRep@cord_internal@2@$$QAPAU342@@Z
+    ??$EmplaceBackSlow@UPayload@status_internal@absl@@@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AAEAAUPayload@status_internal@2@$$QAU342@@Z
+    ??$EmplaceBackSlow@USubRange@absl@@@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@AAEAAUSubRange@2@$$QAU32@@Z
     ??$FindSubstitutions@V?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@std@@@strings_internal@absl@@YA?AV?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@Vstring_view@1@ABV?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@4@@Z
     ??$Flush@V?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@@FormatRawSinkImpl@str_format_internal@absl@@CAXPAXVstring_view@2@@Z
     ??$Flush@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@FormatRawSinkImpl@str_format_internal@absl@@CAXPAXVstring_view@2@@Z
@@ -104,6 +111,7 @@
     ??0Rep@GraphCycles@synchronization_internal@absl@@QAE@XZ
     ??0SpinLock@base_internal@absl@@QAE@W4SchedulingMode@12@@Z
     ??0Status@absl@@QAE@W4StatusCode@1@Vstring_view@1@@Z
+    ??0StatusRep@status_internal@absl@@QAE@W4StatusCode@2@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@V?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@56@@Z
     ??0Streamable@str_format_internal@absl@@QAE@ABVUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z
     ??0TimeZoneInfo@cctz@time_internal@absl@@QAE@XZ
     ??0TimeZoneLibC@cctz@time_internal@absl@@QAE@ABV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
@@ -239,10 +247,10 @@
     ?ClearCurrentThreadIdentity@base_internal@absl@@YAXXZ
     ?ClearSlow@InlineRep@Cord@absl@@AAEXXZ
     ?ClearTimeZoneMapTestOnly@Impl@time_zone@cctz@time_internal@absl@@SAXXZ
-    ?CombineContiguousImpl@CityHashState@hash_internal@absl@@CA_K_KPBEIU?$integral_constant@H$03@__1@std@@@Z
-    ?CombineContiguousImpl@CityHashState@hash_internal@absl@@CA_K_KPBEIU?$integral_constant@H$07@__1@std@@@Z
-    ?CombineLargeContiguousImpl32@CityHashState@hash_internal@absl@@CA_K_KPBEI@Z
-    ?CombineLargeContiguousImpl64@CityHashState@hash_internal@absl@@CA_K_KPBEI@Z
+    ?CombineContiguousImpl@HashState@hash_internal@absl@@CA_K_KPBEIU?$integral_constant@H$03@__1@std@@@Z
+    ?CombineContiguousImpl@HashState@hash_internal@absl@@CA_K_KPBEIU?$integral_constant@H$07@__1@std@@@Z
+    ?CombineLargeContiguousImpl32@HashState@hash_internal@absl@@CA_K_KPBEI@Z
+    ?CombineLargeContiguousImpl64@HashState@hash_internal@absl@@CA_K_KPBEI@Z
     ?Compare@Cord@absl@@QBEHVstring_view@2@@Z
     ?CompareImpl@Cord@absl@@ABEHABV12@@Z
     ?CompareSlowPath@Cord@absl@@ABEHABV12@II@Z
@@ -466,6 +474,7 @@
     ?MultiplyStep@?$BigUnsigned@$03@strings_internal@absl@@AAEXHPBIHH@Z
     ?MultiplyStep@?$BigUnsigned@$0FE@@strings_internal@absl@@AAEXHPBIHH@Z
     ?MutexDelay@synchronization_internal@absl@@YAHHH@Z
+    ?New@CordRepFlat@cord_internal@absl@@SAPAU123@I@Z
     ?NewArena@LowLevelAlloc@base_internal@absl@@SAPAUArena@123@H@Z
     ?NewRep@Status@absl@@CAIW4StatusCode@2@Vstring_view@2@V?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@__1@std@@@Z
     ?NextTransition@TimeZone@absl@@QBE_NVTime@2@PAUCivilTransition@12@@Z
@@ -696,6 +705,8 @@
     ?WebSafeBase64Unescape@absl@@YA_NVstring_view@1@PAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ?Write@BufferRawSink@str_format_internal@absl@@QAEXVstring_view@3@@Z
     ?Write@FILERawSink@str_format_internal@absl@@QAEXVstring_view@3@@Z
+    ?Wyhash@hash_internal@absl@@YA_KPBXI_KQB_K@Z
+    ?WyhashImpl@HashState@hash_internal@absl@@CA_KPBEI@Z
     ?__add_back_capacity@?$deque@PBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@AAEXXZ
     ?__append@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@AAEXI@Z
     ?__append@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@AAEXI@Z
diff --git a/third_party/glslang/src/BUILD.gn b/third_party/glslang/src/BUILD.gn
index 29256c4..973ca98 100644
--- a/third_party/glslang/src/BUILD.gn
+++ b/third_party/glslang/src/BUILD.gn
@@ -246,6 +246,8 @@
       ]
     }
 
+    include_dirs = [ "${target_gen_dir}/include" ]
+
     deps = [ ":glslang_build_info" ]
 
     if (invoker.enable_opt) {
@@ -253,10 +255,9 @@
         "${spirv_tools_dir}:spvtools_opt",
         "${spirv_tools_dir}:spvtools_val",
       ]
+      include_dirs += [ "${spirv_tools_dir}/include" ]
     }
 
-    include_dirs = [ "${target_gen_dir}/include" ]
-
     configs -= _configs_to_remove
     configs += _configs_to_add
   }
@@ -302,7 +303,10 @@
   ]
   public_configs = [ ":glslang_hlsl" ]
 
-  include_dirs = [ "${target_gen_dir}/include" ]
+  include_dirs = [
+    "${target_gen_dir}/include",
+    "${spirv_tools_dir}/include",
+  ]
 
   configs -= _configs_to_remove
   configs += _configs_to_add
@@ -313,6 +317,8 @@
   defines = [ "ENABLE_OPT=1" ]
   deps = [ ":glslang_sources" ]
 
+  include_dirs = [ "${spirv_tools_dir}/include" ]
+
   configs -= _configs_to_remove
   configs += _configs_to_add
 }
diff --git a/third_party/glslang/src/SPIRV/GLSL.ext.EXT.h b/third_party/glslang/src/SPIRV/GLSL.ext.EXT.h
index 6eb0eee..20b9e54 100644
--- a/third_party/glslang/src/SPIRV/GLSL.ext.EXT.h
+++ b/third_party/glslang/src/SPIRV/GLSL.ext.EXT.h
@@ -36,5 +36,6 @@
 static const char* const E_SPV_EXT_fragment_invocation_density = "SPV_EXT_fragment_invocation_density";
 static const char* const E_SPV_EXT_demote_to_helper_invocation = "SPV_EXT_demote_to_helper_invocation";
 static const char* const E_SPV_EXT_shader_atomic_float_add = "SPV_EXT_shader_atomic_float_add";
+static const char* const E_SPV_EXT_shader_image_int64 = "SPV_EXT_shader_image_int64";
 
 #endif  // #ifndef GLSLextEXT_H
diff --git a/third_party/glslang/src/SPIRV/GLSL.ext.KHR.h b/third_party/glslang/src/SPIRV/GLSL.ext.KHR.h
index 2be968e..9610c6e 100644
--- a/third_party/glslang/src/SPIRV/GLSL.ext.KHR.h
+++ b/third_party/glslang/src/SPIRV/GLSL.ext.KHR.h
@@ -49,4 +49,6 @@
 static const char* const E_SPV_KHR_ray_tracing                  = "SPV_KHR_ray_tracing";
 static const char* const E_SPV_KHR_ray_query                    = "SPV_KHR_ray_query";
 static const char* const E_SPV_KHR_fragment_shading_rate        = "SPV_KHR_fragment_shading_rate";
+static const char* const E_SPV_KHR_terminate_invocation         = "SPV_KHR_terminate_invocation";
+
 #endif  // #ifndef GLSLextKHR_H
diff --git a/third_party/glslang/src/SPIRV/GlslangToSpv.cpp b/third_party/glslang/src/SPIRV/GlslangToSpv.cpp
index 1d153c0..1adebef 100644
--- a/third_party/glslang/src/SPIRV/GlslangToSpv.cpp
+++ b/third_party/glslang/src/SPIRV/GlslangToSpv.cpp
@@ -149,6 +149,7 @@
     spv::Decoration TranslateInterpolationDecoration(const glslang::TQualifier& qualifier);
     spv::Decoration TranslateAuxiliaryStorageDecoration(const glslang::TQualifier& qualifier);
     spv::Decoration TranslateNonUniformDecoration(const glslang::TQualifier& qualifier);
+    spv::Decoration TranslateNonUniformDecoration(const spv::Builder::AccessChain::CoherentFlags& coherentFlags);
     spv::Builder::AccessChain::CoherentFlags TranslateCoherent(const glslang::TType& type);
     spv::MemoryAccessMask TranslateMemoryAccess(const spv::Builder::AccessChain::CoherentFlags &coherentFlags);
     spv::ImageOperandsMask TranslateImageOperands(const spv::Builder::AccessChain::CoherentFlags &coherentFlags);
@@ -189,6 +190,7 @@
     bool originalParam(glslang::TStorageQualifier, const glslang::TType&, bool implicitThisParam);
     void makeFunctions(const glslang::TIntermSequence&);
     void makeGlobalInitializers(const glslang::TIntermSequence&);
+    void collectRayTracingLinkerObjects();
     void visitFunctions(const glslang::TIntermSequence&);
     void handleFunctionEntry(const glslang::TIntermAggregate* node);
     void translateArguments(const glslang::TIntermAggregate& node, std::vector<spv::Id>& arguments,
@@ -272,6 +274,9 @@
     // requiring local translation to and from SPIR-V type on every access.
     // Maps <builtin-variable-id -> AST-required-type-id>
     std::unordered_map<spv::Id, spv::Id> forceType;
+
+    // Used later for generating OpTraceKHR/OpExecuteCallableKHR
+    std::unordered_map<unsigned int, glslang::TIntermSymbol *> locationToSymbol[2];
 };
 
 //
@@ -539,6 +544,20 @@
         return spv::DecorationMax;
 }
 
+// If lvalue flags contains nonUniform, return SPIR-V NonUniform decoration.
+spv::Decoration TGlslangToSpvTraverser::TranslateNonUniformDecoration(
+    const spv::Builder::AccessChain::CoherentFlags& coherentFlags)
+{
+#ifndef GLSLANG_WEB
+    if (coherentFlags.isNonUniform()) {
+        builder.addIncorporatedExtension("SPV_EXT_descriptor_indexing", spv::Spv_1_5);
+        builder.addCapability(spv::CapabilityShaderNonUniformEXT);
+        return spv::DecorationNonUniformEXT;
+    } else
+#endif
+        return spv::DecorationMax;
+}
+
 spv::MemoryAccessMask TGlslangToSpvTraverser::TranslateMemoryAccess(
     const spv::Builder::AccessChain::CoherentFlags &coherentFlags)
 {
@@ -614,6 +633,7 @@
                        flags.volatil;
     flags.isImage = type.getBasicType() == glslang::EbtSampler;
 #endif
+    flags.nonUniform = type.getQualifier().nonUniform;
     return flags;
 }
 
@@ -709,13 +729,20 @@
         return spv::BuiltInCullDistance;
 
     case glslang::EbvViewportIndex:
-        builder.addCapability(spv::CapabilityMultiViewport);
+        if (glslangIntermediate->getStage() == EShLangGeometry ||
+            glslangIntermediate->getStage() == EShLangFragment) {
+            builder.addCapability(spv::CapabilityMultiViewport);
+        }
         if (glslangIntermediate->getStage() == EShLangVertex ||
             glslangIntermediate->getStage() == EShLangTessControl ||
             glslangIntermediate->getStage() == EShLangTessEvaluation) {
 
-            builder.addIncorporatedExtension(spv::E_SPV_EXT_shader_viewport_index_layer, spv::Spv_1_5);
-            builder.addCapability(spv::CapabilityShaderViewportIndexLayerEXT);
+            if (builder.getSpvVersion() < spv::Spv_1_5) {
+                builder.addIncorporatedExtension(spv::E_SPV_EXT_shader_viewport_index_layer, spv::Spv_1_5);
+                builder.addCapability(spv::CapabilityShaderViewportIndexLayerEXT);
+            }
+            else
+                builder.addCapability(spv::CapabilityShaderViewportIndex);
         }
         return spv::BuiltInViewportIndex;
 
@@ -734,13 +761,19 @@
         if (glslangIntermediate->getStage() == EShLangMeshNV) {
             return spv::BuiltInLayer;
         }
-        builder.addCapability(spv::CapabilityGeometry);
+        if (glslangIntermediate->getStage() == EShLangGeometry ||
+            glslangIntermediate->getStage() == EShLangFragment) {
+            builder.addCapability(spv::CapabilityGeometry);
+        }
         if (glslangIntermediate->getStage() == EShLangVertex ||
             glslangIntermediate->getStage() == EShLangTessControl ||
             glslangIntermediate->getStage() == EShLangTessEvaluation) {
 
-            builder.addIncorporatedExtension(spv::E_SPV_EXT_shader_viewport_index_layer, spv::Spv_1_5);
-            builder.addCapability(spv::CapabilityShaderViewportIndexLayerEXT);
+            if (builder.getSpvVersion() < spv::Spv_1_5) {
+                builder.addIncorporatedExtension(spv::E_SPV_EXT_shader_viewport_index_layer, spv::Spv_1_5);
+                builder.addCapability(spv::CapabilityShaderViewportIndexLayerEXT);
+            } else
+                builder.addCapability(spv::CapabilityShaderLayer);
         }
         return spv::BuiltInLayer;
 
@@ -973,7 +1006,17 @@
     case glslang::EbvInstanceCustomIndex:
         return spv::BuiltInInstanceCustomIndexKHR;
     case glslang::EbvHitT:
-        return spv::BuiltInHitTKHR;
+        {
+            // this is a GLSL alias of RayTmax
+            // in SPV_NV_ray_tracing it has a dedicated builtin
+            // but in SPV_KHR_ray_tracing it gets mapped to RayTmax
+            auto& extensions = glslangIntermediate->getRequestedExtensions();
+            if (extensions.find("GL_NV_ray_tracing") != extensions.end()) {
+                return spv::BuiltInHitTNV;
+            } else {
+                return spv::BuiltInRayTmaxKHR;
+            }
+        }
     case glslang::EbvHitKind:
         return spv::BuiltInHitKindKHR;
     case glslang::EbvObjectToWorld:
@@ -1081,6 +1124,10 @@
         builder.addCapability(spv::CapabilityStorageImageExtendedFormats);
         break;
 
+    case glslang::ElfR64ui:
+    case glslang::ElfR64i:
+        builder.addExtension(spv::E_SPV_EXT_shader_image_int64);
+        builder.addCapability(spv::CapabilityInt64ImageEXT);
     default:
         break;
     }
@@ -1127,6 +1174,8 @@
     case glslang::ElfRg8ui:         return spv::ImageFormatRg8ui;
     case glslang::ElfR16ui:         return spv::ImageFormatR16ui;
     case glslang::ElfR8ui:          return spv::ImageFormatR8ui;
+    case glslang::ElfR64ui:         return spv::ImageFormatR64ui;
+    case glslang::ElfR64i:          return spv::ImageFormatR64i;
     default:                        return spv::ImageFormatMax;
     }
 }
@@ -1197,7 +1246,7 @@
 spv::StorageClass TGlslangToSpvTraverser::TranslateStorageClass(const glslang::TType& type)
 {
     if (type.getBasicType() == glslang::EbtRayQuery)
-        return spv::StorageClassFunction;
+        return spv::StorageClassPrivate;
     if (type.getQualifier().isPipeInput())
         return spv::StorageClassInput;
     if (type.getQualifier().isPipeOutput())
@@ -1363,6 +1412,8 @@
     if (parent.writeonly)
         child.writeonly = true;
 #endif
+    if (parent.nonUniform)
+        child.nonUniform = true;
 }
 
 bool HasNonLayoutQualifiers(const glslang::TType& type, const glslang::TQualifier& qualifier)
@@ -1464,7 +1515,7 @@
     }
 
     if (glslangIntermediate->getLayoutPrimitiveCulling()) {
-        builder.addCapability(spv::CapabilityRayTraversalPrimitiveCullingProvisionalKHR);
+        builder.addCapability(spv::CapabilityRayTraversalPrimitiveCullingKHR);
     }
 
     unsigned int mode;
@@ -1631,7 +1682,7 @@
     {
         auto& extensions = glslangIntermediate->getRequestedExtensions();
         if (extensions.find("GL_NV_ray_tracing") == extensions.end()) {
-            builder.addCapability(spv::CapabilityRayTracingProvisionalKHR);
+            builder.addCapability(spv::CapabilityRayTracingKHR);
             builder.addExtension("SPV_KHR_ray_tracing");
         }
         else {
@@ -1868,9 +1919,11 @@
                 spv::Id leftRValue = accessChainLoad(node->getLeft()->getType());
 
                 // do the operation
+                spv::Builder::AccessChain::CoherentFlags coherentFlags = TranslateCoherent(node->getLeft()->getType());
+                coherentFlags |= TranslateCoherent(node->getRight()->getType());
                 OpDecorations decorations = { TranslatePrecisionDecoration(node->getOperationPrecision()),
                                               TranslateNoContractionDecoration(node->getType().getQualifier()),
-                                              TranslateNonUniformDecoration(node->getType().getQualifier()) };
+                                              TranslateNonUniformDecoration(coherentFlags) };
                 rValue = createBinaryOperation(node->getOp(), decorations,
                                                convertGlslangToSpvType(node->getType()), leftRValue, rValue,
                                                node->getType().getBasicType());
@@ -1901,13 +1954,16 @@
             if (! node->getLeft()->getType().isArray() &&
                 node->getLeft()->getType().isVector() &&
                 node->getOp() == glslang::EOpIndexDirect) {
+                // Swizzle is uniform so propagate uniform into access chain
+                spv::Builder::AccessChain::CoherentFlags coherentFlags = TranslateCoherent(node->getLeft()->getType());
+                coherentFlags.nonUniform = 0;
                 // This is essentially a hard-coded vector swizzle of size 1,
                 // so short circuit the access-chain stuff with a swizzle.
                 std::vector<unsigned> swizzle;
                 swizzle.push_back(glslangIndex);
                 int dummySize;
                 builder.accessChainPushSwizzle(swizzle, convertGlslangToSpvType(node->getLeft()->getType()),
-                                               TranslateCoherent(node->getLeft()->getType()),
+                                               coherentFlags,
                                                glslangIntermediate->getBaseAlignmentScalar(
                                                    node->getLeft()->getType(), dummySize));
             } else {
@@ -1938,9 +1994,14 @@
                     }
                 }
 
+                // Struct reference propagates uniform lvalue
+                spv::Builder::AccessChain::CoherentFlags coherentFlags =
+                        TranslateCoherent(node->getLeft()->getType());
+                coherentFlags.nonUniform = 0;
+
                 // normal case for indexing array or structure or block
                 builder.accessChainPush(builder.makeIntConstant(spvIndex),
-                    TranslateCoherent(node->getLeft()->getType()),
+                        coherentFlags,
                         node->getLeft()->getType().getBufferReferenceAlignment());
 
                 // Add capabilities here for accessing PointSize and clip/cull distance.
@@ -1974,15 +2035,20 @@
             // restore the saved access chain
             builder.setAccessChain(partial);
 
+            // Only if index is nonUniform should we propagate nonUniform into access chain
+            spv::Builder::AccessChain::CoherentFlags index_flags = TranslateCoherent(node->getRight()->getType());
+            spv::Builder::AccessChain::CoherentFlags coherent_flags = TranslateCoherent(node->getLeft()->getType());
+            coherent_flags.nonUniform = index_flags.nonUniform;
+
             if (! node->getLeft()->getType().isArray() && node->getLeft()->getType().isVector()) {
                 int dummySize;
-                builder.accessChainPushComponent(index, convertGlslangToSpvType(node->getLeft()->getType()),
-                                                TranslateCoherent(node->getLeft()->getType()),
+                builder.accessChainPushComponent(
+                    index, convertGlslangToSpvType(node->getLeft()->getType()), coherent_flags,
                                                 glslangIntermediate->getBaseAlignmentScalar(node->getLeft()->getType(),
                                                 dummySize));
             } else
-                builder.accessChainPush(index, TranslateCoherent(node->getLeft()->getType()),
-                    node->getLeft()->getType().getBufferReferenceAlignment());
+                builder.accessChainPush(index, coherent_flags,
+                                        node->getLeft()->getType().getBufferReferenceAlignment());
         }
         return false;
     case glslang::EOpVectorSwizzle:
@@ -2066,8 +2132,9 @@
             // these require changing a 64-bit scaler -> a vector of 32-bit components
             if (glslangType.isVector())
                 break;
-            std::pair<spv::Id, spv::Id> ret(builder.makeVectorType(builder.makeUintType(32), 4),
-                                            builder.makeUintType(64));
+            spv::Id ivec4_type = builder.makeVectorType(builder.makeUintType(32), 4);
+            spv::Id uint64_type = builder.makeUintType(64);
+            std::pair<spv::Id, spv::Id> ret(ivec4_type, uint64_type);
             return ret;
         }
         // There are no SPIR-V builtins defined for these and map onto original non-transposed
@@ -2106,7 +2173,7 @@
             // handle 32-bit v.xy* -> 64-bit
             builder.clearAccessChain();
             builder.setAccessChainLValue(object);
-            object = builder.accessChainLoad(spv::NoPrecision, spv::DecorationMax, objectTypeId);
+            object = builder.accessChainLoad(spv::NoPrecision, spv::DecorationMax, spv::DecorationMax, objectTypeId);
             std::vector<spv::Id> components;
             components.push_back(builder.createCompositeExtract(object, builder.getContainedTypeId(objectTypeId), 0));
             components.push_back(builder.createCompositeExtract(object, builder.getContainedTypeId(objectTypeId), 1));
@@ -2122,7 +2189,7 @@
             // and we insert a transpose after loading the original non-transposed builtins
             builder.clearAccessChain();
             builder.setAccessChainLValue(object);
-            object = builder.accessChainLoad(spv::NoPrecision, spv::DecorationMax, objectTypeId);
+            object = builder.accessChainLoad(spv::NoPrecision, spv::DecorationMax, spv::DecorationMax, objectTypeId);
             return builder.createUnaryOp(spv::OpTranspose, desiredTypeId, object);
 
     } else  {
@@ -2309,7 +2376,7 @@
             // The result of operation is always stored, but conditionally the
             // consumed result.  The consumed result is always an r-value.
             builder.accessChainStore(result,
-                                     TranslateNonUniformDecoration(node->getOperand()->getType().getQualifier()));
+                                     TranslateNonUniformDecoration(builder.getAccessChain().coherentFlags));
             builder.clearAccessChain();
             if (node->getOp() == glslang::EOpPreIncrement ||
                 node->getOp() == glslang::EOpPreDecrement)
@@ -2385,7 +2452,6 @@
     spv::Id invertedType = spv::NoType;                     // to use to override the natural type of the node
     std::vector<spv::Builder::AccessChain> complexLvalues;  // for holding swizzling l-values too complex for
                                                             // SPIR-V, for an out parameter
-    std::vector<glslang::TQualifier> complexLValueQualifiers;
     std::vector<spv::Id> temporaryLvalues;                  // temporaries to pass, as proxies for complexLValues
 
     auto resultType = [&invertedType, &node, this](){ return invertedType != spv::NoType ?
@@ -2439,6 +2505,10 @@
             // anything else gets there, so visit out of order, doing them all now.
             makeGlobalInitializers(node->getAsAggregate()->getSequence());
 
+            //Pre process linker objects for ray tracing stages
+            if (glslangIntermediate->isRayTracingStage())
+                collectRayTracingLinkerObjects();
+
             // Initializers are done, don't want to visit again, but functions and link objects need to be processed,
             // so do them manually.
             visitFunctions(node->getAsAggregate()->getSequence());
@@ -2748,10 +2818,12 @@
         binOp = node->getOp();
         break;
 
-    case glslang::EOpIgnoreIntersection:
-    case glslang::EOpTerminateRay:
-    case glslang::EOpTrace:
-    case glslang::EOpExecuteCallable:
+    case glslang::EOpIgnoreIntersectionNV:
+    case glslang::EOpTerminateRayNV:
+    case glslang::EOpTraceNV:
+    case glslang::EOpTraceKHR:
+    case glslang::EOpExecuteCallableNV:
+    case glslang::EOpExecuteCallableKHR:
     case glslang::EOpWritePackedPrimitiveIndices4x8NV:
         noReturnValue = true;
         break;
@@ -2760,7 +2832,7 @@
     case glslang::EOpRayQueryGenerateIntersection:
     case glslang::EOpRayQueryConfirmIntersection:
         builder.addExtension("SPV_KHR_ray_query");
-        builder.addCapability(spv::CapabilityRayQueryProvisionalKHR);
+        builder.addCapability(spv::CapabilityRayQueryKHR);
         noReturnValue = true;
         break;
     case glslang::EOpRayQueryProceed:
@@ -2783,7 +2855,7 @@
     case glslang::EOpRayQueryGetIntersectionObjectToWorld:
     case glslang::EOpRayQueryGetIntersectionWorldToObject:
         builder.addExtension("SPV_KHR_ray_query");
-        builder.addCapability(spv::CapabilityRayQueryProvisionalKHR);
+        builder.addCapability(spv::CapabilityRayQueryKHR);
         break;
     case glslang::EOpCooperativeMatrixLoad:
     case glslang::EOpCooperativeMatrixStore:
@@ -3007,7 +3079,6 @@
                 // receive the result, and must later swizzle that into the original
                 // l-value.
                 complexLvalues.push_back(builder.getAccessChain());
-                complexLValueQualifiers.push_back(glslangOperands[arg]->getAsTyped()->getType().getQualifier());
                 temporaryLvalues.push_back(builder.createVariable(
                     spv::NoPrecision, spv::StorageClassFunction,
                     builder.accessChainGetInferredType(), "swizzleTemp"));
@@ -3037,11 +3108,18 @@
                     )) {
                 bool cond = glslangOperands[arg]->getAsConstantUnion()->getConstArray()[0].getBConst();
                 operands.push_back(builder.makeIntConstant(cond ? 1 : 0));
-            }
-            else {
+             } else if ((arg == 10 && glslangOp == glslang::EOpTraceKHR) ||
+                        (arg == 1  && glslangOp == glslang::EOpExecuteCallableKHR)) {
+                 const int opdNum = glslangOp == glslang::EOpTraceKHR ? 10 : 1;
+                 const int set = glslangOp == glslang::EOpTraceKHR ? 0 : 1;
+                 const int location = glslangOperands[opdNum]->getAsConstantUnion()->getConstArray()[0].getUConst();
+                 auto itNode = locationToSymbol[set].find(location);
+                 visitSymbol(itNode->second);
+                 spv::Id symId = getSymbolId(itNode->second);
+                 operands.push_back(symId);
+             } else {
                 operands.push_back(accessChainLoad(glslangOperands[arg]->getAsTyped()->getType()));
-            }
-
+             }
         }
     }
 
@@ -3112,7 +3190,8 @@
 
         for (unsigned int i = 0; i < temporaryLvalues.size(); ++i) {
             builder.setAccessChain(complexLvalues[i]);
-            builder.accessChainStore(builder.createLoad(temporaryLvalues[i], spv::NoPrecision), TranslateNonUniformDecoration(complexLValueQualifiers[i]));
+            builder.accessChainStore(builder.createLoad(temporaryLvalues[i], spv::NoPrecision),
+                TranslateNonUniformDecoration(complexLvalues[i].coherentFlags));
         }
     }
 
@@ -3443,7 +3522,11 @@
 
     switch (node->getFlowOp()) {
     case glslang::EOpKill:
-        builder.makeDiscard();
+        builder.makeStatementTerminator(spv::OpKill, "post-discard");
+        break;
+    case glslang::EOpTerminateInvocation:
+        builder.addExtension(spv::E_SPV_KHR_terminate_invocation);
+        builder.makeStatementTerminator(spv::OpTerminateInvocation, "post-terminate-invocation");
         break;
     case glslang::EOpBreak:
         if (breakForLoop.top())
@@ -3480,6 +3563,12 @@
         builder.addExtension(spv::E_SPV_EXT_demote_to_helper_invocation);
         builder.addCapability(spv::CapabilityDemoteToHelperInvocationEXT);
         break;
+    case glslang::EOpTerminateRayKHR:
+        builder.makeStatementTerminator(spv::OpTerminateRayKHR, "post-terminateRayKHR");
+        break;
+    case glslang::EOpIgnoreIntersectionKHR:
+        builder.makeStatementTerminator(spv::OpIgnoreIntersectionKHR, "post-ignoreIntersectionKHR");
+        break;
 #endif
 
     default:
@@ -3587,6 +3676,12 @@
             builder.addExtension(spv::E_SPV_AMD_gpu_shader_half_float_fetch);
             builder.addCapability(spv::CapabilityFloat16ImageAMD);
             return builder.makeFloatType(16);
+        case glslang::EbtInt64:      return builder.makeIntType(64);
+            builder.addExtension(spv::E_SPV_EXT_shader_image_int64);
+            builder.addCapability(spv::CapabilityFloat16ImageAMD);
+        case glslang::EbtUint64:     return builder.makeUintType(64);
+            builder.addExtension(spv::E_SPV_EXT_shader_image_int64);
+            builder.addCapability(spv::CapabilityFloat16ImageAMD);
 #endif
         default:
             assert(0);
@@ -3693,10 +3788,36 @@
         spvType = builder.makeUintType(32);
         break;
     case glslang::EbtAccStruct:
+        switch (glslangIntermediate->getStage()) {
+        case EShLangRayGen:
+        case EShLangIntersect:
+        case EShLangAnyHit:
+        case EShLangClosestHit:
+        case EShLangMiss:
+        case EShLangCallable:
+            // these all should have the RayTracingNV/KHR capability already
+            break;
+        default:
+            {
+                auto& extensions = glslangIntermediate->getRequestedExtensions();
+                if (extensions.find("GL_EXT_ray_query") != extensions.end()) {
+                    builder.addExtension(spv::E_SPV_KHR_ray_query);
+                    builder.addCapability(spv::CapabilityRayQueryKHR);
+                }
+            }
+            break;
+        }
         spvType = builder.makeAccelerationStructureType();
         break;
     case glslang::EbtRayQuery:
-        spvType = builder.makeRayQueryType();
+        {
+            auto& extensions = glslangIntermediate->getRequestedExtensions();
+            if (extensions.find("GL_EXT_ray_query") != extensions.end()) {
+                builder.addExtension(spv::E_SPV_KHR_ray_query);
+                builder.addCapability(spv::CapabilityRayQueryKHR);
+            }
+            spvType = builder.makeRayQueryType();
+        }
         break;
     case glslang::EbtReference:
         {
@@ -3952,6 +4073,8 @@
     // Name and decorate the non-hidden members
     int offset = -1;
     int locationOffset = 0;  // for use within the members of this struct
+    bool memberLocationInvalid = type.isArrayOfArrays() ||
+        (type.isArray() && (type.getQualifier().isArrayedIo(glslangIntermediate->getStage()) == false));
     for (int i = 0; i < (int)glslangMembers->size(); i++) {
         glslang::TType& glslangMember = *(*glslangMembers)[i].type;
         int member = i;
@@ -4004,7 +4127,7 @@
         // just track whether a member needs to be decorated.
         // Ignore member locations if the container is an array, as that's
         // ill-specified and decisions have been made to not allow this.
-        if (! type.isArray() && memberQualifier.hasLocation())
+        if (!memberLocationInvalid && memberQualifier.hasLocation())
             builder.addMemberDecoration(spvType, member, spv::DecorationLocation, memberQualifier.layoutLocation);
 
         if (qualifier.hasLocation())      // track for upcoming inheritance
@@ -4110,6 +4233,7 @@
     alignment |= type.getBufferReferenceAlignment();
 
     spv::Id loadedId = builder.accessChainLoad(TranslatePrecisionDecoration(type),
+        TranslateNonUniformDecoration(builder.getAccessChain().coherentFlags),
         TranslateNonUniformDecoration(type.getQualifier()),
         nominalTypeId,
         spv::MemoryAccessMask(TranslateMemoryAccess(coherentFlags) & ~spv::MemoryAccessMakePointerAvailableKHRMask),
@@ -4177,7 +4301,7 @@
     unsigned int alignment = builder.getAccessChain().alignment;
     alignment |= type.getBufferReferenceAlignment();
 
-    builder.accessChainStore(rvalue, TranslateNonUniformDecoration(type.getQualifier()),
+    builder.accessChainStore(rvalue, TranslateNonUniformDecoration(builder.getAccessChain().coherentFlags),
                              spv::MemoryAccessMask(TranslateMemoryAccess(coherentFlags) &
                                 ~spv::MemoryAccessMakePointerVisibleKHRMask),
                              TranslateMemoryScope(coherentFlags), alignment);
@@ -4565,7 +4689,39 @@
         }
     }
 }
+// Walk over all linker objects to create a map for payload and callable data linker objects
+// and their location to be used during codegen for OpTraceKHR and OpExecuteCallableKHR
+// This is done here since it is possible that these linker objects are not be referenced in the AST
+void TGlslangToSpvTraverser::collectRayTracingLinkerObjects()
+{
+    glslang::TIntermAggregate* linkerObjects = glslangIntermediate->findLinkerObjects();
+    for (auto& objSeq : linkerObjects->getSequence()) {
+        auto objNode = objSeq->getAsSymbolNode();
+        if (objNode != nullptr) {
+            if (objNode->getQualifier().hasLocation()) {
+                unsigned int location = objNode->getQualifier().layoutLocation;
+                auto st = objNode->getQualifier().storage;
+                int set;
+                switch (st)
+                {
+                case glslang::EvqPayload:
+                case glslang::EvqPayloadIn:
+                    set = 0;
+                    break;
+                case glslang::EvqCallableData:
+                case glslang::EvqCallableDataIn:
+                    set = 1;
+                    break;
 
+                default:
+                    set = -1;
+                }
+                if (set != -1)
+                    locationToSymbol[set].insert(std::make_pair(location, objNode));
+            }
+        }
+    }
+}
 // Process all the functions, while skipping initializers.
 void TGlslangToSpvTraverser::visitFunctions(const glslang::TIntermSequence& glslFunctions)
 {
@@ -4709,8 +4865,10 @@
         }
 
         if (lvalue) {
-            arguments.push_back(builder.accessChainGetLValue());
+            spv::Id lvalue_id = builder.accessChainGetLValue();
+            arguments.push_back(lvalue_id);
             lvalueCoherentFlags = builder.getAccessChain().coherentFlags;
+            builder.addDecoration(lvalue_id, TranslateNonUniformDecoration(lvalueCoherentFlags));
             lvalueCoherentFlags |= TranslateCoherent(glslangArguments[i]->getAsTyped()->getType());
         } else
 #endif
@@ -5390,6 +5548,7 @@
     // 3. Make the call.
     spv::Id result = builder.createFunctionCall(function, spvArgs);
     builder.setPrecision(result, TranslatePrecisionDecoration(node->getType()));
+    builder.addDecoration(result, TranslateNonUniformDecoration(node->getType().getQualifier()));
 
     // 4. Copy back out an "out" arguments.
     lValueCount = 0;
@@ -5399,6 +5558,7 @@
         else if (writableParam(qualifiers[a])) {
             if (qualifiers[a] == glslang::EvqOut || qualifiers[a] == glslang::EvqInOut) {
                 spv::Id copy = builder.createLoad(spvArgs[a], spv::NoPrecision);
+                builder.addDecoration(copy, TranslateNonUniformDecoration(argTypes[a]->getQualifier()));
                 builder.setAccessChain(lValues[lValueCount]);
                 multiTypeStore(*argTypes[a], copy);
             }
@@ -6186,6 +6346,11 @@
     case glslang::EOpConstructReference:
         unaryOp = spv::OpBitcast;
         break;
+
+    case glslang::EOpConvUint64ToAccStruct:
+    case glslang::EOpConvUvec2ToAccStruct:
+        unaryOp = spv::OpConvertUToAccelerationStructureKHR;
+        break;
 #endif
 
     case glslang::EOpCopyObject:
@@ -7772,10 +7937,16 @@
         typeId = builder.makeBoolType();
         opCode = spv::OpReportIntersectionKHR;
         break;
-    case glslang::EOpTrace:
+    case glslang::EOpTraceNV:
+        builder.createNoResultOp(spv::OpTraceNV, operands);
+        return 0;
+    case glslang::EOpTraceKHR:
         builder.createNoResultOp(spv::OpTraceRayKHR, operands);
         return 0;
-    case glslang::EOpExecuteCallable:
+    case glslang::EOpExecuteCallableNV:
+        builder.createNoResultOp(spv::OpExecuteCallableNV, operands);
+        return 0;
+    case glslang::EOpExecuteCallableKHR:
         builder.createNoResultOp(spv::OpExecuteCallableKHR, operands);
         return 0;
 
@@ -8063,11 +8234,11 @@
         spv::Id id = builder.createBuiltinCall(typeId, getExtBuiltins(spv::E_SPV_AMD_gcn_shader), spv::TimeAMD, args);
         return builder.setPrecision(id, precision);
     }
-    case glslang::EOpIgnoreIntersection:
-        builder.createNoResultOp(spv::OpIgnoreIntersectionKHR);
+    case glslang::EOpIgnoreIntersectionNV:
+        builder.createNoResultOp(spv::OpIgnoreIntersectionNV);
         return 0;
-    case glslang::EOpTerminateRay:
-        builder.createNoResultOp(spv::OpTerminateRayKHR);
+    case glslang::EOpTerminateRayNV:
+        builder.createNoResultOp(spv::OpTerminateRayNV);
         return 0;
     case glslang::EOpRayQueryInitialize:
         builder.createNoResultOp(spv::OpRayQueryInitializeKHR);
@@ -8195,7 +8366,8 @@
     }
 
 #ifndef GLSLANG_WEB
-    if (symbol->getType().isImage()) {
+    // Subgroup builtins which have input storage class are volatile for ray tracing stages.
+    if (symbol->getType().isImage() || symbol->getQualifier().isPipeInput()) {
         std::vector<spv::Decoration> memory;
         TranslateMemoryDecoration(symbol->getType().getQualifier(), memory,
             glslangIntermediate->usingVulkanMemoryModel());
@@ -8203,9 +8375,6 @@
             builder.addDecoration(id, memory[i]);
     }
 
-    // nonuniform
-    builder.addDecoration(id, TranslateNonUniformDecoration(symbol->getType().getQualifier()));
-
     if (builtIn == spv::BuiltInSampleMask) {
           spv::Decoration decoration;
           // GL_NV_sample_mask_override_coverage extension
diff --git a/third_party/glslang/src/SPIRV/SpvBuilder.cpp b/third_party/glslang/src/SPIRV/SpvBuilder.cpp
index 42896ce..c8fbcc4 100644
--- a/third_party/glslang/src/SPIRV/SpvBuilder.cpp
+++ b/third_party/glslang/src/SPIRV/SpvBuilder.cpp
@@ -621,13 +621,13 @@
 Id Builder::makeRayQueryType()
 {
     Instruction *type;
-    if (groupedTypes[OpTypeRayQueryProvisionalKHR].size() == 0) {
-        type = new Instruction(getUniqueId(), NoType, OpTypeRayQueryProvisionalKHR);
-        groupedTypes[OpTypeRayQueryProvisionalKHR].push_back(type);
+    if (groupedTypes[OpTypeRayQueryKHR].size() == 0) {
+        type = new Instruction(getUniqueId(), NoType, OpTypeRayQueryKHR);
+        groupedTypes[OpTypeRayQueryKHR].push_back(type);
         constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));
         module.mapInstruction(type);
     } else {
-        type = groupedTypes[OpTypeRayQueryProvisionalKHR].back();
+        type = groupedTypes[OpTypeRayQueryKHR].back();
     }
 
     return type->getResultId();
@@ -1447,10 +1447,10 @@
 }
 
 // Comments in header
-void Builder::makeDiscard()
+void Builder::makeStatementTerminator(spv::Op opcode, const char *name)
 {
-    buildPoint->addInstruction(std::unique_ptr<Instruction>(new Instruction(OpKill)));
-    createAndSetNoPredecessorBlock("post-discard");
+    buildPoint->addInstruction(std::unique_ptr<Instruction>(new Instruction(opcode)));
+    createAndSetNoPredecessorBlock(name);
 }
 
 // Comments in header
@@ -2791,8 +2791,9 @@
 }
 
 // Comments in header
-Id Builder::accessChainLoad(Decoration precision, Decoration nonUniform, Id resultType,
-    spv::MemoryAccessMask memoryAccess, spv::Scope scope, unsigned int alignment)
+Id Builder::accessChainLoad(Decoration precision, Decoration l_nonUniform,
+    Decoration r_nonUniform, Id resultType, spv::MemoryAccessMask memoryAccess,
+    spv::Scope scope, unsigned int alignment)
 {
     Id id;
 
@@ -2856,9 +2857,9 @@
         // Buffer accesses need the access chain decorated, and this is where
         // loaded image types get decorated. TODO: This should maybe move to
         // createImageTextureFunctionCall.
-        addDecoration(id, nonUniform);
+        addDecoration(id, l_nonUniform);
         id = createLoad(id, precision, memoryAccess, scope, alignment);
-        addDecoration(id, nonUniform);
+        addDecoration(id, r_nonUniform);
     }
 
     // Done, unless there are swizzles to do
@@ -2879,7 +2880,7 @@
     if (accessChain.component != NoResult)
         id = setPrecision(createVectorExtractDynamic(id, resultType, accessChain.component), precision);
 
-    addDecoration(id, nonUniform);
+    addDecoration(id, r_nonUniform);
     return id;
 }
 
diff --git a/third_party/glslang/src/SPIRV/SpvBuilder.h b/third_party/glslang/src/SPIRV/SpvBuilder.h
index f93e182..911ea58 100644
--- a/third_party/glslang/src/SPIRV/SpvBuilder.h
+++ b/third_party/glslang/src/SPIRV/SpvBuilder.h
@@ -357,8 +357,9 @@
     // Generate all the code needed to finish up a function.
     void leaveFunction();
 
-    // Create a discard.
-    void makeDiscard();
+    // Create block terminator instruction for certain statements like
+    // discard, terminate-invocation, terminateRayEXT, or ignoreIntersectionEXT
+    void makeStatementTerminator(spv::Op opcode, const char *name);
 
     // Create a global or function local or IO variable.
     Id createVariable(Decoration precision, StorageClass, Id type, const char* name = nullptr,
@@ -624,6 +625,7 @@
             CoherentFlags operator |=(const CoherentFlags &other) { return *this; }
 #else
             bool isVolatile() const { return volatil; }
+            bool isNonUniform() const { return nonUniform; }
             bool anyCoherent() const {
                 return coherent || devicecoherent || queuefamilycoherent || workgroupcoherent ||
                     subgroupcoherent || shadercallcoherent;
@@ -638,6 +640,7 @@
             unsigned nonprivate : 1;
             unsigned volatil : 1;
             unsigned isImage : 1;
+            unsigned nonUniform : 1;
 
             void clear() {
                 coherent = 0;
@@ -649,6 +652,7 @@
                 nonprivate = 0;
                 volatil = 0;
                 isImage = 0;
+                nonUniform = 0;
             }
 
             CoherentFlags operator |=(const CoherentFlags &other) {
@@ -661,6 +665,7 @@
                 nonprivate |= other.nonprivate;
                 volatil |= other.volatil;
                 isImage |= other.isImage;
+                nonUniform |= other.nonUniform;
                 return *this;
             }
 #endif
@@ -726,7 +731,7 @@
         spv::Scope scope = spv::ScopeMax, unsigned int alignment = 0);
 
     // use accessChain and swizzle to load an r-value
-    Id accessChainLoad(Decoration precision, Decoration nonUniform, Id ResultType,
+    Id accessChainLoad(Decoration precision, Decoration l_nonUniform, Decoration r_nonUniform, Id ResultType,
         spv::MemoryAccessMask memoryAccess = spv::MemoryAccessMaskNone, spv::Scope scope = spv::ScopeMax,
             unsigned int alignment = 0);
 
diff --git a/third_party/glslang/src/SPIRV/SpvTools.cpp b/third_party/glslang/src/SPIRV/SpvTools.cpp
index 112ac33..16d051a 100644
--- a/third_party/glslang/src/SPIRV/SpvTools.cpp
+++ b/third_party/glslang/src/SPIRV/SpvTools.cpp
@@ -44,7 +44,6 @@
 
 #include "SpvTools.h"
 #include "spirv-tools/optimizer.hpp"
-#include "spirv-tools/libspirv.h"
 
 namespace glslang {
 
@@ -114,11 +113,18 @@
     out << std::endl;
 }
 
-// Use the SPIRV-Tools disassembler to print SPIR-V.
+// Use the SPIRV-Tools disassembler to print SPIR-V using a SPV_ENV_UNIVERSAL_1_3 environment.
 void SpirvToolsDisassemble(std::ostream& out, const std::vector<unsigned int>& spirv)
 {
+    SpirvToolsDisassemble(out, spirv, spv_target_env::SPV_ENV_UNIVERSAL_1_3);
+}
+
+// Use the SPIRV-Tools disassembler to print SPIR-V with a provided SPIR-V environment.
+void SpirvToolsDisassemble(std::ostream& out, const std::vector<unsigned int>& spirv,
+                           spv_target_env requested_context)
+{
     // disassemble
-    spv_context context = spvContextCreate(SPV_ENV_UNIVERSAL_1_3);
+    spv_context context = spvContextCreate(requested_context);
     spv_text text;
     spv_diagnostic diagnostic = nullptr;
     spvBinaryToText(context, spirv.data(), spirv.size(),
@@ -174,10 +180,7 @@
     // line information into all SPIR-V instructions. This avoids loss of
     // information when instructions are deleted or moved. Later, remove
     // redundant information to minimize final SPRIR-V size.
-    if (options->generateDebugInfo) {
-        optimizer.RegisterPass(spvtools::CreatePropagateLineInfoPass());
-    }
-    else if (options->stripDebugInfo) {
+    if (options->stripDebugInfo) {
         optimizer.RegisterPass(spvtools::CreateStripDebugInfoPass());
     }
     optimizer.RegisterPass(spvtools::CreateWrapOpKillPass());
@@ -207,9 +210,6 @@
     }
     optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass());
     optimizer.RegisterPass(spvtools::CreateCFGCleanupPass());
-    if (options->generateDebugInfo) {
-        optimizer.RegisterPass(spvtools::CreateRedundantLineInfoElimPass());
-    }
 
     spvtools::OptimizerOptions spvOptOptions;
     optimizer.SetTargetEnv(MapToSpirvToolsEnv(intermediate.getSpv(), logger));
diff --git a/third_party/glslang/src/SPIRV/SpvTools.h b/third_party/glslang/src/SPIRV/SpvTools.h
index 7779dfa..3fb3cba 100644
--- a/third_party/glslang/src/SPIRV/SpvTools.h
+++ b/third_party/glslang/src/SPIRV/SpvTools.h
@@ -41,9 +41,10 @@
 #ifndef GLSLANG_SPV_TOOLS_H
 #define GLSLANG_SPV_TOOLS_H
 
-#ifdef ENABLE_OPT
+#if ENABLE_OPT
 #include <vector>
 #include <ostream>
+#include "spirv-tools/libspirv.h"
 #endif
 
 #include "glslang/MachineIndependent/localintermediate.h"
@@ -62,11 +63,15 @@
     bool validate;
 };
 
-#ifdef ENABLE_OPT
+#if ENABLE_OPT
 
-// Use the SPIRV-Tools disassembler to print SPIR-V.
+// Use the SPIRV-Tools disassembler to print SPIR-V using a SPV_ENV_UNIVERSAL_1_3 environment.
 void SpirvToolsDisassemble(std::ostream& out, const std::vector<unsigned int>& spirv);
 
+// Use the SPIRV-Tools disassembler to print SPIR-V with a provided SPIR-V environment.
+void SpirvToolsDisassemble(std::ostream& out, const std::vector<unsigned int>& spirv,
+                           spv_target_env requested_context);
+
 // Apply the SPIRV-Tools validator to generated SPIR-V.
 void SpirvToolsValidate(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv,
                         spv::SpvBuildLogger*, bool prelegalization);
diff --git a/third_party/glslang/src/SPIRV/doc.cpp b/third_party/glslang/src/SPIRV/doc.cpp
index b1d7eb7..5327f22 100644
--- a/third_party/glslang/src/SPIRV/doc.cpp
+++ b/third_party/glslang/src/SPIRV/doc.cpp
@@ -395,7 +395,7 @@
     case BuiltInRayGeometryIndexKHR:         return "RayGeometryIndexKHR";
     case BuiltInObjectToWorldKHR:            return "ObjectToWorldKHR";
     case BuiltInWorldToObjectKHR:            return "WorldToObjectKHR";
-    case BuiltInHitTKHR:                     return "HitTKHR";
+    case BuiltInHitTNV:                      return "HitTNV";
     case BuiltInHitKindKHR:                  return "HitKindKHR";
     case BuiltInIncomingRayFlagsKHR:         return "IncomingRayFlagsKHR";
     case BuiltInViewportMaskNV:              return "ViewportMaskNV";
@@ -523,6 +523,8 @@
     case 37: return "Rg8ui";
     case 38: return "R16ui";
     case 39: return "R8ui";
+    case 40: return "R64ui";
+    case 41: return "R64i";
 
     default:
         return "Bad";
@@ -913,9 +915,9 @@
     case CapabilityPerViewAttributesNV:             return "PerViewAttributesNV";
     case CapabilityGroupNonUniformPartitionedNV:    return "GroupNonUniformPartitionedNV";
     case CapabilityRayTracingNV:                    return "RayTracingNV";
-    case CapabilityRayTracingProvisionalKHR:        return "RayTracingProvisionalKHR";
-    case CapabilityRayQueryProvisionalKHR:          return "RayQueryProvisionalKHR";
-    case CapabilityRayTraversalPrimitiveCullingProvisionalKHR: return "RayTraversalPrimitiveCullingProvisionalKHR";
+    case CapabilityRayTracingKHR:                   return "RayTracingKHR";
+    case CapabilityRayQueryKHR:                     return "RayQueryKHR";
+    case CapabilityRayTraversalPrimitiveCullingKHR: return "RayTraversalPrimitiveCullingKHR";
     case CapabilityComputeDerivativeGroupQuadsNV:   return "ComputeDerivativeGroupQuadsNV";
     case CapabilityComputeDerivativeGroupLinearNV:  return "ComputeDerivativeGroupLinearNV";
     case CapabilityFragmentBarycentricNV:           return "FragmentBarycentricNV";
@@ -958,6 +960,7 @@
 
     case CapabilityDemoteToHelperInvocationEXT:             return "DemoteToHelperInvocationEXT";
     case CapabilityShaderClockKHR:                          return "ShaderClockKHR";
+    case CapabilityInt64ImageEXT:                           return "Int64ImageEXT";
 
     case CapabilityIntegerFunctions2INTEL:              return "CapabilityIntegerFunctions2INTEL";
 
@@ -1333,6 +1336,8 @@
     case 365: return "OpGroupNonUniformQuadBroadcast";
     case 366: return "OpGroupNonUniformQuadSwap";
 
+    case OpTerminateInvocation: return "OpTerminateInvocation";
+
     case 4421: return "OpSubgroupBallotKHR";
     case 4422: return "OpSubgroupFirstInvocationKHR";
     case 4428: return "OpSubgroupAllKHR";
@@ -1359,17 +1364,23 @@
     case OpDecorateStringGOOGLE:       return "OpDecorateStringGOOGLE";
     case OpMemberDecorateStringGOOGLE: return "OpMemberDecorateStringGOOGLE";
 
+    case OpReportIntersectionKHR:             return "OpReportIntersectionKHR";
+    case OpIgnoreIntersectionNV:              return "OpIgnoreIntersectionNV";
+    case OpIgnoreIntersectionKHR:             return "OpIgnoreIntersectionKHR";
+    case OpTerminateRayNV:                    return "OpTerminateRayNV";
+    case OpTerminateRayKHR:                   return "OpTerminateRayKHR";
+    case OpTraceNV:                           return "OpTraceNV";
+    case OpTraceRayKHR:                       return "OpTraceRayKHR";
+    case OpTypeAccelerationStructureKHR:      return "OpTypeAccelerationStructureKHR";
+    case OpExecuteCallableNV:                 return "OpExecuteCallableNV";
+    case OpExecuteCallableKHR:                return "OpExecuteCallableKHR";
+    case OpConvertUToAccelerationStructureKHR: return "OpConvertUToAccelerationStructureKHR";
+
     case OpGroupNonUniformPartitionNV:       return "OpGroupNonUniformPartitionNV";
-    case OpReportIntersectionKHR:            return "OpReportIntersectionKHR";
-    case OpIgnoreIntersectionKHR:            return "OpIgnoreIntersectionKHR";
-    case OpTerminateRayKHR:                  return "OpTerminateRayKHR";
-    case OpTraceRayKHR:                      return "OpTraceRayKHR";
-    case OpTypeAccelerationStructureKHR:     return "OpTypeAccelerationStructureKHR";
-    case OpExecuteCallableKHR:               return "OpExecuteCallableKHR";
     case OpImageSampleFootprintNV:           return "OpImageSampleFootprintNV";
     case OpWritePackedPrimitiveIndices4x8NV: return "OpWritePackedPrimitiveIndices4x8NV";
 
-    case OpTypeRayQueryProvisionalKHR:                                        return "OpTypeRayQueryProvisionalKHR";
+    case OpTypeRayQueryKHR:                                                   return "OpTypeRayQueryKHR";
     case OpRayQueryInitializeKHR:                                             return "OpRayQueryInitializeKHR";
     case OpRayQueryTerminateKHR:                                              return "OpRayQueryTerminateKHR";
     case OpRayQueryGenerateIntersectionKHR:                                   return "OpRayQueryGenerateIntersectionKHR";
@@ -1501,6 +1512,7 @@
     InstructionDesc[OpBranchConditional].setResultAndType(false, false);
     InstructionDesc[OpSwitch].setResultAndType(false, false);
     InstructionDesc[OpKill].setResultAndType(false, false);
+    InstructionDesc[OpTerminateInvocation].setResultAndType(false, false);
     InstructionDesc[OpReturn].setResultAndType(false, false);
     InstructionDesc[OpReturnValue].setResultAndType(false, false);
     InstructionDesc[OpUnreachable].setResultAndType(false, false);
@@ -2765,7 +2777,20 @@
 
     InstructionDesc[OpTypeAccelerationStructureKHR].setResultAndType(true, false);
 
-    InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'NV Acceleration Structure'");
+    InstructionDesc[OpTraceNV].operands.push(OperandId, "'Acceleration Structure'");
+    InstructionDesc[OpTraceNV].operands.push(OperandId, "'Ray Flags'");
+    InstructionDesc[OpTraceNV].operands.push(OperandId, "'Cull Mask'");
+    InstructionDesc[OpTraceNV].operands.push(OperandId, "'SBT Record Offset'");
+    InstructionDesc[OpTraceNV].operands.push(OperandId, "'SBT Record Stride'");
+    InstructionDesc[OpTraceNV].operands.push(OperandId, "'Miss Index'");
+    InstructionDesc[OpTraceNV].operands.push(OperandId, "'Ray Origin'");
+    InstructionDesc[OpTraceNV].operands.push(OperandId, "'TMin'");
+    InstructionDesc[OpTraceNV].operands.push(OperandId, "'Ray Direction'");
+    InstructionDesc[OpTraceNV].operands.push(OperandId, "'TMax'");
+    InstructionDesc[OpTraceNV].operands.push(OperandId, "'Payload'");
+    InstructionDesc[OpTraceNV].setResultAndType(false, false);
+
+    InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Acceleration Structure'");
     InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Ray Flags'");
     InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Cull Mask'");
     InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'SBT Record Offset'");
@@ -2781,17 +2806,28 @@
     InstructionDesc[OpReportIntersectionKHR].operands.push(OperandId, "'Hit Parameter'");
     InstructionDesc[OpReportIntersectionKHR].operands.push(OperandId, "'Hit Kind'");
 
+    InstructionDesc[OpIgnoreIntersectionNV].setResultAndType(false, false);
+
     InstructionDesc[OpIgnoreIntersectionKHR].setResultAndType(false, false);
 
+    InstructionDesc[OpTerminateRayNV].setResultAndType(false, false);
+
     InstructionDesc[OpTerminateRayKHR].setResultAndType(false, false);
     
+    InstructionDesc[OpExecuteCallableNV].operands.push(OperandId, "SBT Record Index");
+    InstructionDesc[OpExecuteCallableNV].operands.push(OperandId, "CallableData ID");
+    InstructionDesc[OpExecuteCallableNV].setResultAndType(false, false);
+
     InstructionDesc[OpExecuteCallableKHR].operands.push(OperandId, "SBT Record Index");
-    InstructionDesc[OpExecuteCallableKHR].operands.push(OperandId, "CallableData ID");
+    InstructionDesc[OpExecuteCallableKHR].operands.push(OperandId, "CallableData");
     InstructionDesc[OpExecuteCallableKHR].setResultAndType(false, false);
 
+    InstructionDesc[OpConvertUToAccelerationStructureKHR].operands.push(OperandId, "Value");
+    InstructionDesc[OpConvertUToAccelerationStructureKHR].setResultAndType(true, true);
+
     // Ray Query
     InstructionDesc[OpTypeAccelerationStructureKHR].setResultAndType(true, false);
-    InstructionDesc[OpTypeRayQueryProvisionalKHR].setResultAndType(true, false);
+    InstructionDesc[OpTypeRayQueryKHR].setResultAndType(true, false);
 
     InstructionDesc[OpRayQueryInitializeKHR].operands.push(OperandId, "'RayQuery'");
     InstructionDesc[OpRayQueryInitializeKHR].operands.push(OperandId, "'AccelerationS'");
diff --git a/third_party/glslang/src/SPIRV/spirv.hpp b/third_party/glslang/src/SPIRV/spirv.hpp
index 26b35bb..43dd2aa 100644
--- a/third_party/glslang/src/SPIRV/spirv.hpp
+++ b/third_party/glslang/src/SPIRV/spirv.hpp
@@ -50,11 +50,11 @@
 typedef unsigned int Id;
 
 #define SPV_VERSION 0x10500
-#define SPV_REVISION 3
+#define SPV_REVISION 4
 
 static const unsigned int MagicNumber = 0x07230203;
 static const unsigned int Version = 0x00010500;
-static const unsigned int Revision = 3;
+static const unsigned int Revision = 4;
 static const unsigned int OpCodeMask = 0xffff;
 static const unsigned int WordCountShift = 16;
 
@@ -614,7 +614,6 @@
     BuiltInObjectToWorldNV = 5330,
     BuiltInWorldToObjectKHR = 5331,
     BuiltInWorldToObjectNV = 5331,
-    BuiltInHitTKHR = 5332,
     BuiltInHitTNV = 5332,
     BuiltInHitKindKHR = 5333,
     BuiltInHitKindNV = 5333,
@@ -899,7 +898,9 @@
     CapabilityRoundingModeRTE = 4467,
     CapabilityRoundingModeRTZ = 4468,
     CapabilityRayQueryProvisionalKHR = 4471,
-    CapabilityRayTraversalPrimitiveCullingProvisionalKHR = 4478,
+    CapabilityRayQueryKHR = 4472,
+    CapabilityRayTraversalPrimitiveCullingKHR = 4478,
+    CapabilityRayTracingKHR = 4479,
     CapabilityFloat16ImageAMD = 5008,
     CapabilityImageGatherBiasLodAMD = 5009,
     CapabilityFragmentMaskAMD = 5010,
@@ -1398,7 +1399,12 @@
     OpSubgroupAnyKHR = 4429,
     OpSubgroupAllEqualKHR = 4430,
     OpSubgroupReadInvocationKHR = 4432,
-    OpTypeRayQueryProvisionalKHR = 4472,
+    OpTraceRayKHR = 4445,
+    OpExecuteCallableKHR = 4446,
+    OpConvertUToAccelerationStructureKHR = 4447,
+    OpIgnoreIntersectionKHR = 4448,
+    OpTerminateRayKHR = 4449,
+    OpTypeRayQueryKHR = 4472,
     OpRayQueryInitializeKHR = 4473,
     OpRayQueryTerminateKHR = 4474,
     OpRayQueryGenerateIntersectionKHR = 4475,
@@ -1421,15 +1427,11 @@
     OpWritePackedPrimitiveIndices4x8NV = 5299,
     OpReportIntersectionKHR = 5334,
     OpReportIntersectionNV = 5334,
-    OpIgnoreIntersectionKHR = 5335,
     OpIgnoreIntersectionNV = 5335,
-    OpTerminateRayKHR = 5336,
     OpTerminateRayNV = 5336,
     OpTraceNV = 5337,
-    OpTraceRayKHR = 5337,
     OpTypeAccelerationStructureKHR = 5341,
     OpTypeAccelerationStructureNV = 5341,
-    OpExecuteCallableKHR = 5344,
     OpExecuteCallableNV = 5344,
     OpTypeCooperativeMatrixNV = 5358,
     OpCooperativeMatrixLoadNV = 5359,
@@ -1969,7 +1971,12 @@
     case OpSubgroupAnyKHR: *hasResult = true; *hasResultType = true; break;
     case OpSubgroupAllEqualKHR: *hasResult = true; *hasResultType = true; break;
     case OpSubgroupReadInvocationKHR: *hasResult = true; *hasResultType = true; break;
-    case OpTypeRayQueryProvisionalKHR: *hasResult = true; *hasResultType = false; break;
+    case OpTraceRayKHR: *hasResult = false; *hasResultType = false; break;
+    case OpExecuteCallableKHR: *hasResult = false; *hasResultType = false; break;
+    case OpConvertUToAccelerationStructureKHR: *hasResult = true; *hasResultType = true; break;
+    case OpIgnoreIntersectionKHR: *hasResult = false; *hasResultType = false; break;
+    case OpTerminateRayKHR: *hasResult = false; *hasResultType = false; break;
+    case OpTypeRayQueryKHR: *hasResult = true; *hasResultType = false; break;
     case OpRayQueryInitializeKHR: *hasResult = false; *hasResultType = false; break;
     case OpRayQueryTerminateKHR: *hasResult = false; *hasResultType = false; break;
     case OpRayQueryGenerateIntersectionKHR: *hasResult = false; *hasResultType = false; break;
diff --git a/third_party/glslang/src/SPIRV/spvIR.h b/third_party/glslang/src/SPIRV/spvIR.h
index 868b9bf..486e80d 100644
--- a/third_party/glslang/src/SPIRV/spvIR.h
+++ b/third_party/glslang/src/SPIRV/spvIR.h
@@ -263,6 +263,7 @@
         case OpBranchConditional:
         case OpSwitch:
         case OpKill:
+        case OpTerminateInvocation:
         case OpReturn:
         case OpReturnValue:
         case OpUnreachable:
diff --git a/third_party/glslang/src/StandAlone/CMakeLists.txt b/third_party/glslang/src/StandAlone/CMakeLists.txt
index 8038c04..bff9ab6 100644
--- a/third_party/glslang/src/StandAlone/CMakeLists.txt
+++ b/third_party/glslang/src/StandAlone/CMakeLists.txt
@@ -41,7 +41,6 @@
                            PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
                            PUBLIC $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}>)
 
-
 set(SOURCES StandAlone.cpp DirStackFileIncluder.h)
 
 add_executable(glslangValidator ${SOURCES})
@@ -70,6 +69,12 @@
     $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../External>
     $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/External>)
 
+if(ENABLE_OPT)
+    target_include_directories(glslangValidator
+        PRIVATE ${spirv-tools_SOURCE_DIR}/include
+    )
+endif(ENABLE_OPT)
+
 if(ENABLE_SPVREMAPPER)
     set(REMAPPER_SOURCES spirv-remap.cpp)
     add_executable(spirv-remap ${REMAPPER_SOURCES})
diff --git a/third_party/glslang/src/Test/baseResults/300layout.vert.out b/third_party/glslang/src/Test/baseResults/300layout.vert.out
index e245cbc..527425b 100644
--- a/third_party/glslang/src/Test/baseResults/300layout.vert.out
+++ b/third_party/glslang/src/Test/baseResults/300layout.vert.out
@@ -1,6 +1,7 @@
 300layout.vert
 ERROR: 0:7: 'vertex input arrays' : not supported with this profile: es
 ERROR: 0:8: 'in' : cannot be a structure or array 
+ERROR: 0:8: 's' : A structure containing an array is not allowed as input in ES 
 ERROR: 0:8: 'vertex input arrays' : not supported with this profile: es
 ERROR: 0:8: 'location' : overlapping use of location 10
 ERROR: 0:12: 'layout' : cannot specify matrix layout on a variable declaration 
@@ -18,7 +19,7 @@
 ERROR: 0:50: 'shared' : not supported in this stage: vertex
 ERROR: 0:54: 'layout' : cannot specify packing on a variable declaration 
 ERROR: 0:57: 'location' : overlapping use of location 40
-ERROR: 19 compilation errors.  No code generated.
+ERROR: 20 compilation errors.  No code generated.
 
 
 Shader version: 300
diff --git a/third_party/glslang/src/Test/baseResults/310.frag.out b/third_party/glslang/src/Test/baseResults/310.frag.out
index 9fe93e9..9f73c67 100644
--- a/third_party/glslang/src/Test/baseResults/310.frag.out
+++ b/third_party/glslang/src/Test/baseResults/310.frag.out
@@ -40,10 +40,14 @@
 ERROR: 0:114: 'in' : cannot be bool 
 ERROR: 0:115: 'sampler2D' : sampler/image types can only be used in uniform variables or function parameters: ino
 ERROR: 0:117: 'fragment-shader array-of-array input' : not supported with this profile: es
+ERROR: 0:120: 'S' : A structure containing an array is not allowed as input in ES 
 ERROR: 0:120: 'fragment-shader array-of-struct input' : not supported with this profile: es
+ERROR: 0:121: 'S' : A structure containing an array is not allowed as input in ES 
 ERROR: 0:121: 'fragment-shader array-of-struct input' : not supported with this profile: es
 ERROR: 0:123: 'fragment-shader struct input containing an array' : not supported with this profile: es
+ERROR: 0:123: 'SA' : A structure containing an array is not allowed as input in ES 
 ERROR: 0:125: 'fragment-shader struct input containing structure' : not supported with this profile: es
+ERROR: 0:125: 'SS' : A structure containing an struct is not allowed as input in ES 
 ERROR: 0:133: 'output block' : not supported in this stage: fragment
 ERROR: 0:138: '' : cannot nest a structure definition inside a structure or block 
 ERROR: 0:146: 'location' : overlapping use of location 13
@@ -139,7 +143,7 @@
 ERROR: 0:463: 'return' : void function cannot return a value 
 ERROR: 0:472: '=' :  cannot convert from ' temp mediump uint' to ' temp mediump int'
 ERROR: 0:485: '=' :  cannot convert from ' global mediump int' to ' temp mediump uint'
-ERROR: 132 compilation errors.  No code generated.
+ERROR: 136 compilation errors.  No code generated.
 
 
 Shader version: 310
diff --git a/third_party/glslang/src/Test/baseResults/310.vert.out b/third_party/glslang/src/Test/baseResults/310.vert.out
index a910e34..1d2152d 100644
--- a/third_party/glslang/src/Test/baseResults/310.vert.out
+++ b/third_party/glslang/src/Test/baseResults/310.vert.out
@@ -21,6 +21,7 @@
 ERROR: 0:107: 'input block' : not supported in this stage: vertex
 ERROR: 0:109: 'gl_PerVertex' : block redeclaration has extra members 
 ERROR: 0:119: 'gl_PointSize' : member of nameless block was not redeclared 
+ERROR: 0:119: 'assign' :  l-value required "gl_PerVertex" (can't modify void)
 ERROR: 0:119: 'assign' :  cannot convert from ' const float' to ' gl_PointSize highp void PointSize'
 ERROR: 0:122: 'gl_PerVertex' : can only redeclare a built-in block once, and before any use 
 ERROR: 0:127: 'flat/smooth/noperspective' : cannot use interpolation qualifiers on an interface block 
@@ -96,7 +97,7 @@
 ERROR: 0:400: 'interpolateAtCentroid' : no matching overloaded function found 
 ERROR: 0:401: 'interpolateAtSample' : no matching overloaded function found 
 ERROR: 0:402: 'interpolateAtOffset' : no matching overloaded function found 
-ERROR: 93 compilation errors.  No code generated.
+ERROR: 94 compilation errors.  No code generated.
 
 
 Shader version: 310
diff --git a/third_party/glslang/src/Test/baseResults/320.vert.out b/third_party/glslang/src/Test/baseResults/320.vert.out
index bf127d4..0313b61 100644
--- a/third_party/glslang/src/Test/baseResults/320.vert.out
+++ b/third_party/glslang/src/Test/baseResults/320.vert.out
@@ -4,6 +4,7 @@
 ERROR: 0:16: 'input block' : not supported in this stage: vertex
 ERROR: 0:18: 'gl_PerVertex' : block redeclaration has extra members 
 ERROR: 0:28: 'gl_PointSize' : member of nameless block was not redeclared 
+ERROR: 0:28: 'assign' :  l-value required "gl_PerVertex" (can't modify void)
 ERROR: 0:28: 'assign' :  cannot convert from ' const float' to ' gl_PointSize highp void PointSize'
 ERROR: 0:31: 'gl_PerVertex' : can only redeclare a built-in block once, and before any use 
 ERROR: 0:36: 'flat/smooth/noperspective' : cannot use interpolation qualifiers on an interface block 
@@ -33,7 +34,7 @@
 ERROR: 0:252: 'interpolateAtCentroid' : no matching overloaded function found 
 ERROR: 0:253: 'interpolateAtSample' : no matching overloaded function found 
 ERROR: 0:254: 'interpolateAtOffset' : no matching overloaded function found 
-ERROR: 34 compilation errors.  No code generated.
+ERROR: 35 compilation errors.  No code generated.
 
 
 Shader version: 320
diff --git a/third_party/glslang/src/Test/baseResults/410.geom.out b/third_party/glslang/src/Test/baseResults/410.geom.out
index c38ba48..498da5a 100644
--- a/third_party/glslang/src/Test/baseResults/410.geom.out
+++ b/third_party/glslang/src/Test/baseResults/410.geom.out
@@ -5,9 +5,10 @@
 ERROR: 0:32: 'gl_Position' : no such field in structure 
 ERROR: 0:32: '=' :  cannot convert from ' temp block{ in float PointSize gl_PointSize}' to ' temp 4-component vector of float'
 ERROR: 0:33: 'gl_Position' : member of nameless block was not redeclared 
+ERROR: 0:33: 'assign' :  l-value required "gl_PerVertex" (can't modify void)
 ERROR: 0:33: 'assign' :  cannot convert from ' const 4-component vector of float' to 'layout( stream=0) gl_Position void Position'
 WARNING: 0:38: 'return' : type conversion on return values was not explicitly allowed until version 420 
-ERROR: 7 compilation errors.  No code generated.
+ERROR: 8 compilation errors.  No code generated.
 
 
 Shader version: 410
diff --git a/third_party/glslang/src/Test/baseResults/cppDeepNest.frag.out b/third_party/glslang/src/Test/baseResults/cppDeepNest.frag.out
index 969a256..49b9aa3 100644
--- a/third_party/glslang/src/Test/baseResults/cppDeepNest.frag.out
+++ b/third_party/glslang/src/Test/baseResults/cppDeepNest.frag.out
@@ -1,7 +1,7 @@
 cppDeepNest.frag
 ERROR: 0:66: '#if/#ifdef/#ifndef' : maximum nesting depth exceeded 
 ERROR: 0:66: '' : missing #endif 
-ERROR: 0:66: '' :  syntax error, unexpected $end
+ERROR: 0:66: '' :  syntax error, unexpected end of file
 ERROR: 3 compilation errors.  No code generated.
 
 
diff --git a/third_party/glslang/src/Test/baseResults/glsl.460.subgroup.rcall.out b/third_party/glslang/src/Test/baseResults/glsl.460.subgroup.rcall.out
index 6bffdc9..2b2d89b 100644
--- a/third_party/glslang/src/Test/baseResults/glsl.460.subgroup.rcall.out
+++ b/third_party/glslang/src/Test/baseResults/glsl.460.subgroup.rcall.out
@@ -109,8 +109,8 @@
 0:4    Function Parameters: 
 0:4      'f4' ( in 4-component vector of float)
 0:?     Sequence
-0:7      'gl_SubgroupSize' ( in uint SubgroupSize)
-0:8      'gl_SubgroupInvocationID' ( in uint SubgroupInvocationID)
+0:7      'gl_SubgroupSize' ( volatile in uint SubgroupSize)
+0:8      'gl_SubgroupInvocationID' ( volatile in uint SubgroupInvocationID)
 0:9      subgroupBarrier ( global void)
 0:10      subgroupMemoryBarrier ( global void)
 0:11      subgroupMemoryBarrierBuffer ( global void)
@@ -128,11 +128,11 @@
 0:19          false (const bool)
 0:20      subgroupAllEqual ( global bool)
 0:20        'f4' ( in 4-component vector of float)
-0:22      'gl_SubgroupEqMask' ( in 4-component vector of uint SubgroupEqMask)
-0:23      'gl_SubgroupGeMask' ( in 4-component vector of uint SubgroupGeMask)
-0:24      'gl_SubgroupGtMask' ( in 4-component vector of uint SubgroupGtMask)
-0:25      'gl_SubgroupLeMask' ( in 4-component vector of uint SubgroupLeMask)
-0:26      'gl_SubgroupLtMask' ( in 4-component vector of uint SubgroupLtMask)
+0:22      'gl_SubgroupEqMask' ( volatile in 4-component vector of uint SubgroupEqMask)
+0:23      'gl_SubgroupGeMask' ( volatile in 4-component vector of uint SubgroupGeMask)
+0:24      'gl_SubgroupGtMask' ( volatile in 4-component vector of uint SubgroupGtMask)
+0:25      'gl_SubgroupLeMask' ( volatile in 4-component vector of uint SubgroupLeMask)
+0:26      'gl_SubgroupLtMask' ( volatile in 4-component vector of uint SubgroupLtMask)
 0:27      subgroupBroadcast ( global 4-component vector of float)
 0:27        'f4' ( in 4-component vector of float)
 0:27        Constant:
@@ -359,8 +359,8 @@
 0:119  Function Definition: basic_works( ( global void)
 0:119    Function Parameters: 
 0:121    Sequence
-0:121      'gl_SubgroupSize' ( in uint SubgroupSize)
-0:122      'gl_SubgroupInvocationID' ( in uint SubgroupInvocationID)
+0:121      'gl_SubgroupSize' ( volatile in uint SubgroupSize)
+0:122      'gl_SubgroupInvocationID' ( volatile in uint SubgroupInvocationID)
 0:123      subgroupBarrier ( global void)
 0:124      subgroupMemoryBarrier ( global void)
 0:125      subgroupMemoryBarrierBuffer ( global void)
@@ -370,11 +370,11 @@
 0:131    Function Parameters: 
 0:131      'f4' ( in 4-component vector of float)
 0:132    Sequence
-0:132      'gl_SubgroupEqMask' ( in 4-component vector of uint SubgroupEqMask)
-0:133      'gl_SubgroupGeMask' ( in 4-component vector of uint SubgroupGeMask)
-0:134      'gl_SubgroupGtMask' ( in 4-component vector of uint SubgroupGtMask)
-0:135      'gl_SubgroupLeMask' ( in 4-component vector of uint SubgroupLeMask)
-0:136      'gl_SubgroupLtMask' ( in 4-component vector of uint SubgroupLtMask)
+0:132      'gl_SubgroupEqMask' ( volatile in 4-component vector of uint SubgroupEqMask)
+0:133      'gl_SubgroupGeMask' ( volatile in 4-component vector of uint SubgroupGeMask)
+0:134      'gl_SubgroupGtMask' ( volatile in 4-component vector of uint SubgroupGtMask)
+0:135      'gl_SubgroupLeMask' ( volatile in 4-component vector of uint SubgroupLeMask)
+0:136      'gl_SubgroupLtMask' ( volatile in 4-component vector of uint SubgroupLtMask)
 0:137      subgroupBroadcast ( global 4-component vector of float)
 0:137        'f4' ( in 4-component vector of float)
 0:137        Constant:
@@ -624,15 +624,15 @@
 0:247    Sequence
 0:247      'gl_WarpsPerSMNV' ( in uint WarpsPerSMNV)
 0:248      'gl_SMCountNV' ( in uint SMCountNV)
-0:249      'gl_WarpIDNV' ( in uint WarpIDNV)
-0:250      'gl_SMIDNV' ( in uint SMIDNV)
+0:249      'gl_WarpIDNV' ( volatile in uint WarpIDNV)
+0:250      'gl_SMIDNV' ( volatile in uint SMIDNV)
 0:257  Function Definition: sm_builtins( ( global void)
 0:257    Function Parameters: 
 0:259    Sequence
 0:259      'gl_WarpsPerSMNV' ( in uint WarpsPerSMNV)
 0:260      'gl_SMCountNV' ( in uint SMCountNV)
-0:261      'gl_WarpIDNV' ( in uint WarpIDNV)
-0:262      'gl_SMIDNV' ( in uint SMIDNV)
+0:261      'gl_WarpIDNV' ( volatile in uint WarpIDNV)
+0:262      'gl_SMIDNV' ( volatile in uint SMIDNV)
 0:?   Linker Objects
 0:?     'data0' (layout( location=0) callableDataNV 4-component vector of float)
 0:?     'anon@0' (layout( location=1) callableDataInNV block{ callableDataInNV uint data1})
diff --git a/third_party/glslang/src/Test/baseResults/glsl.460.subgroup.rchit.out b/third_party/glslang/src/Test/baseResults/glsl.460.subgroup.rchit.out
index 1ea9e69..f5083e0 100644
--- a/third_party/glslang/src/Test/baseResults/glsl.460.subgroup.rchit.out
+++ b/third_party/glslang/src/Test/baseResults/glsl.460.subgroup.rchit.out
@@ -109,8 +109,8 @@
 0:4    Function Parameters: 
 0:4      'f4' ( in 4-component vector of float)
 0:?     Sequence
-0:7      'gl_SubgroupSize' ( in uint SubgroupSize)
-0:8      'gl_SubgroupInvocationID' ( in uint SubgroupInvocationID)
+0:7      'gl_SubgroupSize' ( volatile in uint SubgroupSize)
+0:8      'gl_SubgroupInvocationID' ( volatile in uint SubgroupInvocationID)
 0:9      subgroupBarrier ( global void)
 0:10      subgroupMemoryBarrier ( global void)
 0:11      subgroupMemoryBarrierBuffer ( global void)
@@ -128,11 +128,11 @@
 0:19          false (const bool)
 0:20      subgroupAllEqual ( global bool)
 0:20        'f4' ( in 4-component vector of float)
-0:22      'gl_SubgroupEqMask' ( in 4-component vector of uint SubgroupEqMask)
-0:23      'gl_SubgroupGeMask' ( in 4-component vector of uint SubgroupGeMask)
-0:24      'gl_SubgroupGtMask' ( in 4-component vector of uint SubgroupGtMask)
-0:25      'gl_SubgroupLeMask' ( in 4-component vector of uint SubgroupLeMask)
-0:26      'gl_SubgroupLtMask' ( in 4-component vector of uint SubgroupLtMask)
+0:22      'gl_SubgroupEqMask' ( volatile in 4-component vector of uint SubgroupEqMask)
+0:23      'gl_SubgroupGeMask' ( volatile in 4-component vector of uint SubgroupGeMask)
+0:24      'gl_SubgroupGtMask' ( volatile in 4-component vector of uint SubgroupGtMask)
+0:25      'gl_SubgroupLeMask' ( volatile in 4-component vector of uint SubgroupLeMask)
+0:26      'gl_SubgroupLtMask' ( volatile in 4-component vector of uint SubgroupLtMask)
 0:27      subgroupBroadcast ( global 4-component vector of float)
 0:27        'f4' ( in 4-component vector of float)
 0:27        Constant:
@@ -425,8 +425,8 @@
 0:129  Function Definition: basic_works( ( global void)
 0:129    Function Parameters: 
 0:131    Sequence
-0:131      'gl_SubgroupSize' ( in uint SubgroupSize)
-0:132      'gl_SubgroupInvocationID' ( in uint SubgroupInvocationID)
+0:131      'gl_SubgroupSize' ( volatile in uint SubgroupSize)
+0:132      'gl_SubgroupInvocationID' ( volatile in uint SubgroupInvocationID)
 0:133      subgroupBarrier ( global void)
 0:134      subgroupMemoryBarrier ( global void)
 0:135      subgroupMemoryBarrierBuffer ( global void)
@@ -436,11 +436,11 @@
 0:141    Function Parameters: 
 0:141      'f4' ( in 4-component vector of float)
 0:142    Sequence
-0:142      'gl_SubgroupEqMask' ( in 4-component vector of uint SubgroupEqMask)
-0:143      'gl_SubgroupGeMask' ( in 4-component vector of uint SubgroupGeMask)
-0:144      'gl_SubgroupGtMask' ( in 4-component vector of uint SubgroupGtMask)
-0:145      'gl_SubgroupLeMask' ( in 4-component vector of uint SubgroupLeMask)
-0:146      'gl_SubgroupLtMask' ( in 4-component vector of uint SubgroupLtMask)
+0:142      'gl_SubgroupEqMask' ( volatile in 4-component vector of uint SubgroupEqMask)
+0:143      'gl_SubgroupGeMask' ( volatile in 4-component vector of uint SubgroupGeMask)
+0:144      'gl_SubgroupGtMask' ( volatile in 4-component vector of uint SubgroupGtMask)
+0:145      'gl_SubgroupLeMask' ( volatile in 4-component vector of uint SubgroupLeMask)
+0:146      'gl_SubgroupLtMask' ( volatile in 4-component vector of uint SubgroupLtMask)
 0:147      subgroupBroadcast ( global 4-component vector of float)
 0:147        'f4' ( in 4-component vector of float)
 0:147        Constant:
@@ -690,15 +690,15 @@
 0:257    Sequence
 0:257      'gl_WarpsPerSMNV' ( in uint WarpsPerSMNV)
 0:258      'gl_SMCountNV' ( in uint SMCountNV)
-0:259      'gl_WarpIDNV' ( in uint WarpIDNV)
-0:260      'gl_SMIDNV' ( in uint SMIDNV)
+0:259      'gl_WarpIDNV' ( volatile in uint WarpIDNV)
+0:260      'gl_SMIDNV' ( volatile in uint SMIDNV)
 0:267  Function Definition: sm_builtins( ( global void)
 0:267    Function Parameters: 
 0:269    Sequence
 0:269      'gl_WarpsPerSMNV' ( in uint WarpsPerSMNV)
 0:270      'gl_SMCountNV' ( in uint SMCountNV)
-0:271      'gl_WarpIDNV' ( in uint WarpIDNV)
-0:272      'gl_SMIDNV' ( in uint SMIDNV)
+0:271      'gl_WarpIDNV' ( volatile in uint WarpIDNV)
+0:272      'gl_SMIDNV' ( volatile in uint SMIDNV)
 0:?   Linker Objects
 0:?     'accNV' (layout( set=0 binding=0) uniform accelerationStructureNV)
 0:?     'localPayload' (layout( location=0) rayPayloadNV 4-component vector of float)
diff --git a/third_party/glslang/src/Test/baseResults/glsl.460.subgroup.rgen.out b/third_party/glslang/src/Test/baseResults/glsl.460.subgroup.rgen.out
index dfe1e2b..56283bb 100644
--- a/third_party/glslang/src/Test/baseResults/glsl.460.subgroup.rgen.out
+++ b/third_party/glslang/src/Test/baseResults/glsl.460.subgroup.rgen.out
@@ -109,8 +109,8 @@
 0:4    Function Parameters: 
 0:4      'f4' ( in 4-component vector of float)
 0:?     Sequence
-0:7      'gl_SubgroupSize' ( in uint SubgroupSize)
-0:8      'gl_SubgroupInvocationID' ( in uint SubgroupInvocationID)
+0:7      'gl_SubgroupSize' ( volatile in uint SubgroupSize)
+0:8      'gl_SubgroupInvocationID' ( volatile in uint SubgroupInvocationID)
 0:9      subgroupBarrier ( global void)
 0:10      subgroupMemoryBarrier ( global void)
 0:11      subgroupMemoryBarrierBuffer ( global void)
@@ -128,11 +128,11 @@
 0:19          false (const bool)
 0:20      subgroupAllEqual ( global bool)
 0:20        'f4' ( in 4-component vector of float)
-0:22      'gl_SubgroupEqMask' ( in 4-component vector of uint SubgroupEqMask)
-0:23      'gl_SubgroupGeMask' ( in 4-component vector of uint SubgroupGeMask)
-0:24      'gl_SubgroupGtMask' ( in 4-component vector of uint SubgroupGtMask)
-0:25      'gl_SubgroupLeMask' ( in 4-component vector of uint SubgroupLeMask)
-0:26      'gl_SubgroupLtMask' ( in 4-component vector of uint SubgroupLtMask)
+0:22      'gl_SubgroupEqMask' ( volatile in 4-component vector of uint SubgroupEqMask)
+0:23      'gl_SubgroupGeMask' ( volatile in 4-component vector of uint SubgroupGeMask)
+0:24      'gl_SubgroupGtMask' ( volatile in 4-component vector of uint SubgroupGtMask)
+0:25      'gl_SubgroupLeMask' ( volatile in 4-component vector of uint SubgroupLeMask)
+0:26      'gl_SubgroupLtMask' ( volatile in 4-component vector of uint SubgroupLtMask)
 0:27      subgroupBroadcast ( global 4-component vector of float)
 0:27        'f4' ( in 4-component vector of float)
 0:27        Constant:
@@ -389,8 +389,8 @@
 0:123  Function Definition: basic_works( ( global void)
 0:123    Function Parameters: 
 0:125    Sequence
-0:125      'gl_SubgroupSize' ( in uint SubgroupSize)
-0:126      'gl_SubgroupInvocationID' ( in uint SubgroupInvocationID)
+0:125      'gl_SubgroupSize' ( volatile in uint SubgroupSize)
+0:126      'gl_SubgroupInvocationID' ( volatile in uint SubgroupInvocationID)
 0:127      subgroupBarrier ( global void)
 0:128      subgroupMemoryBarrier ( global void)
 0:129      subgroupMemoryBarrierBuffer ( global void)
@@ -400,11 +400,11 @@
 0:135    Function Parameters: 
 0:135      'f4' ( in 4-component vector of float)
 0:136    Sequence
-0:136      'gl_SubgroupEqMask' ( in 4-component vector of uint SubgroupEqMask)
-0:137      'gl_SubgroupGeMask' ( in 4-component vector of uint SubgroupGeMask)
-0:138      'gl_SubgroupGtMask' ( in 4-component vector of uint SubgroupGtMask)
-0:139      'gl_SubgroupLeMask' ( in 4-component vector of uint SubgroupLeMask)
-0:140      'gl_SubgroupLtMask' ( in 4-component vector of uint SubgroupLtMask)
+0:136      'gl_SubgroupEqMask' ( volatile in 4-component vector of uint SubgroupEqMask)
+0:137      'gl_SubgroupGeMask' ( volatile in 4-component vector of uint SubgroupGeMask)
+0:138      'gl_SubgroupGtMask' ( volatile in 4-component vector of uint SubgroupGtMask)
+0:139      'gl_SubgroupLeMask' ( volatile in 4-component vector of uint SubgroupLeMask)
+0:140      'gl_SubgroupLtMask' ( volatile in 4-component vector of uint SubgroupLtMask)
 0:141      subgroupBroadcast ( global 4-component vector of float)
 0:141        'f4' ( in 4-component vector of float)
 0:141        Constant:
@@ -654,15 +654,15 @@
 0:251    Sequence
 0:251      'gl_WarpsPerSMNV' ( in uint WarpsPerSMNV)
 0:252      'gl_SMCountNV' ( in uint SMCountNV)
-0:253      'gl_WarpIDNV' ( in uint WarpIDNV)
-0:254      'gl_SMIDNV' ( in uint SMIDNV)
+0:253      'gl_WarpIDNV' ( volatile in uint WarpIDNV)
+0:254      'gl_SMIDNV' ( volatile in uint SMIDNV)
 0:261  Function Definition: sm_builtins( ( global void)
 0:261    Function Parameters: 
 0:263    Sequence
 0:263      'gl_WarpsPerSMNV' ( in uint WarpsPerSMNV)
 0:264      'gl_SMCountNV' ( in uint SMCountNV)
-0:265      'gl_WarpIDNV' ( in uint WarpIDNV)
-0:266      'gl_SMIDNV' ( in uint SMIDNV)
+0:265      'gl_WarpIDNV' ( volatile in uint WarpIDNV)
+0:266      'gl_SMIDNV' ( volatile in uint SMIDNV)
 0:?   Linker Objects
 0:?     'accNV0' (layout( set=0 binding=0) uniform accelerationStructureNV)
 0:?     'accNV1' (layout( set=0 binding=1) uniform accelerationStructureNV)
diff --git a/third_party/glslang/src/Test/baseResults/glsl.460.subgroup.rint.out b/third_party/glslang/src/Test/baseResults/glsl.460.subgroup.rint.out
index 9915ecf..a7de7d3 100644
--- a/third_party/glslang/src/Test/baseResults/glsl.460.subgroup.rint.out
+++ b/third_party/glslang/src/Test/baseResults/glsl.460.subgroup.rint.out
@@ -109,8 +109,8 @@
 0:5    Function Parameters: 
 0:5      'f4' ( in 4-component vector of float)
 0:?     Sequence
-0:8      'gl_SubgroupSize' ( in uint SubgroupSize)
-0:9      'gl_SubgroupInvocationID' ( in uint SubgroupInvocationID)
+0:8      'gl_SubgroupSize' ( volatile in uint SubgroupSize)
+0:9      'gl_SubgroupInvocationID' ( volatile in uint SubgroupInvocationID)
 0:10      subgroupBarrier ( global void)
 0:11      subgroupMemoryBarrier ( global void)
 0:12      subgroupMemoryBarrierBuffer ( global void)
@@ -128,11 +128,11 @@
 0:20          false (const bool)
 0:21      subgroupAllEqual ( global bool)
 0:21        'f4' ( in 4-component vector of float)
-0:23      'gl_SubgroupEqMask' ( in 4-component vector of uint SubgroupEqMask)
-0:24      'gl_SubgroupGeMask' ( in 4-component vector of uint SubgroupGeMask)
-0:25      'gl_SubgroupGtMask' ( in 4-component vector of uint SubgroupGtMask)
-0:26      'gl_SubgroupLeMask' ( in 4-component vector of uint SubgroupLeMask)
-0:27      'gl_SubgroupLtMask' ( in 4-component vector of uint SubgroupLtMask)
+0:23      'gl_SubgroupEqMask' ( volatile in 4-component vector of uint SubgroupEqMask)
+0:24      'gl_SubgroupGeMask' ( volatile in 4-component vector of uint SubgroupGeMask)
+0:25      'gl_SubgroupGtMask' ( volatile in 4-component vector of uint SubgroupGtMask)
+0:26      'gl_SubgroupLeMask' ( volatile in 4-component vector of uint SubgroupLeMask)
+0:27      'gl_SubgroupLtMask' ( volatile in 4-component vector of uint SubgroupLtMask)
 0:28      subgroupBroadcast ( global 4-component vector of float)
 0:28        'f4' ( in 4-component vector of float)
 0:28        Constant:
@@ -403,8 +403,8 @@
 0:129  Function Definition: basic_works( ( global void)
 0:129    Function Parameters: 
 0:131    Sequence
-0:131      'gl_SubgroupSize' ( in uint SubgroupSize)
-0:132      'gl_SubgroupInvocationID' ( in uint SubgroupInvocationID)
+0:131      'gl_SubgroupSize' ( volatile in uint SubgroupSize)
+0:132      'gl_SubgroupInvocationID' ( volatile in uint SubgroupInvocationID)
 0:133      subgroupBarrier ( global void)
 0:134      subgroupMemoryBarrier ( global void)
 0:135      subgroupMemoryBarrierBuffer ( global void)
@@ -414,11 +414,11 @@
 0:141    Function Parameters: 
 0:141      'f4' ( in 4-component vector of float)
 0:142    Sequence
-0:142      'gl_SubgroupEqMask' ( in 4-component vector of uint SubgroupEqMask)
-0:143      'gl_SubgroupGeMask' ( in 4-component vector of uint SubgroupGeMask)
-0:144      'gl_SubgroupGtMask' ( in 4-component vector of uint SubgroupGtMask)
-0:145      'gl_SubgroupLeMask' ( in 4-component vector of uint SubgroupLeMask)
-0:146      'gl_SubgroupLtMask' ( in 4-component vector of uint SubgroupLtMask)
+0:142      'gl_SubgroupEqMask' ( volatile in 4-component vector of uint SubgroupEqMask)
+0:143      'gl_SubgroupGeMask' ( volatile in 4-component vector of uint SubgroupGeMask)
+0:144      'gl_SubgroupGtMask' ( volatile in 4-component vector of uint SubgroupGtMask)
+0:145      'gl_SubgroupLeMask' ( volatile in 4-component vector of uint SubgroupLeMask)
+0:146      'gl_SubgroupLtMask' ( volatile in 4-component vector of uint SubgroupLtMask)
 0:147      subgroupBroadcast ( global 4-component vector of float)
 0:147        'f4' ( in 4-component vector of float)
 0:147        Constant:
@@ -668,15 +668,15 @@
 0:257    Sequence
 0:257      'gl_WarpsPerSMNV' ( in uint WarpsPerSMNV)
 0:258      'gl_SMCountNV' ( in uint SMCountNV)
-0:259      'gl_WarpIDNV' ( in uint WarpIDNV)
-0:260      'gl_SMIDNV' ( in uint SMIDNV)
+0:259      'gl_WarpIDNV' ( volatile in uint WarpIDNV)
+0:260      'gl_SMIDNV' ( volatile in uint SMIDNV)
 0:267  Function Definition: sm_builtins( ( global void)
 0:267    Function Parameters: 
 0:269    Sequence
 0:269      'gl_WarpsPerSMNV' ( in uint WarpsPerSMNV)
 0:270      'gl_SMCountNV' ( in uint SMCountNV)
-0:271      'gl_WarpIDNV' ( in uint WarpIDNV)
-0:272      'gl_SMIDNV' ( in uint SMIDNV)
+0:271      'gl_WarpIDNV' ( volatile in uint WarpIDNV)
+0:272      'gl_SMIDNV' ( volatile in uint SMIDNV)
 0:?   Linker Objects
 0:?     'iAttr' ( hitAttributeNV 4-component vector of float)
 
diff --git a/third_party/glslang/src/Test/baseResults/glsl.460.subgroup.rmiss.out b/third_party/glslang/src/Test/baseResults/glsl.460.subgroup.rmiss.out
index ddf7d1b..865d88c 100644
--- a/third_party/glslang/src/Test/baseResults/glsl.460.subgroup.rmiss.out
+++ b/third_party/glslang/src/Test/baseResults/glsl.460.subgroup.rmiss.out
@@ -109,8 +109,8 @@
 0:5    Function Parameters: 
 0:5      'f4' ( in 4-component vector of float)
 0:?     Sequence
-0:8      'gl_SubgroupSize' ( in uint SubgroupSize)
-0:9      'gl_SubgroupInvocationID' ( in uint SubgroupInvocationID)
+0:8      'gl_SubgroupSize' ( volatile in uint SubgroupSize)
+0:9      'gl_SubgroupInvocationID' ( volatile in uint SubgroupInvocationID)
 0:10      subgroupBarrier ( global void)
 0:11      subgroupMemoryBarrier ( global void)
 0:12      subgroupMemoryBarrierBuffer ( global void)
@@ -128,11 +128,11 @@
 0:20          false (const bool)
 0:21      subgroupAllEqual ( global bool)
 0:21        'f4' ( in 4-component vector of float)
-0:23      'gl_SubgroupEqMask' ( in 4-component vector of uint SubgroupEqMask)
-0:24      'gl_SubgroupGeMask' ( in 4-component vector of uint SubgroupGeMask)
-0:25      'gl_SubgroupGtMask' ( in 4-component vector of uint SubgroupGtMask)
-0:26      'gl_SubgroupLeMask' ( in 4-component vector of uint SubgroupLeMask)
-0:27      'gl_SubgroupLtMask' ( in 4-component vector of uint SubgroupLtMask)
+0:23      'gl_SubgroupEqMask' ( volatile in 4-component vector of uint SubgroupEqMask)
+0:24      'gl_SubgroupGeMask' ( volatile in 4-component vector of uint SubgroupGeMask)
+0:25      'gl_SubgroupGtMask' ( volatile in 4-component vector of uint SubgroupGtMask)
+0:26      'gl_SubgroupLeMask' ( volatile in 4-component vector of uint SubgroupLeMask)
+0:27      'gl_SubgroupLtMask' ( volatile in 4-component vector of uint SubgroupLtMask)
 0:28      subgroupBroadcast ( global 4-component vector of float)
 0:28        'f4' ( in 4-component vector of float)
 0:28        Constant:
@@ -397,8 +397,8 @@
 0:123  Function Definition: basic_works( ( global void)
 0:123    Function Parameters: 
 0:125    Sequence
-0:125      'gl_SubgroupSize' ( in uint SubgroupSize)
-0:126      'gl_SubgroupInvocationID' ( in uint SubgroupInvocationID)
+0:125      'gl_SubgroupSize' ( volatile in uint SubgroupSize)
+0:126      'gl_SubgroupInvocationID' ( volatile in uint SubgroupInvocationID)
 0:127      subgroupBarrier ( global void)
 0:128      subgroupMemoryBarrier ( global void)
 0:129      subgroupMemoryBarrierBuffer ( global void)
@@ -408,11 +408,11 @@
 0:135    Function Parameters: 
 0:135      'f4' ( in 4-component vector of float)
 0:136    Sequence
-0:136      'gl_SubgroupEqMask' ( in 4-component vector of uint SubgroupEqMask)
-0:137      'gl_SubgroupGeMask' ( in 4-component vector of uint SubgroupGeMask)
-0:138      'gl_SubgroupGtMask' ( in 4-component vector of uint SubgroupGtMask)
-0:139      'gl_SubgroupLeMask' ( in 4-component vector of uint SubgroupLeMask)
-0:140      'gl_SubgroupLtMask' ( in 4-component vector of uint SubgroupLtMask)
+0:136      'gl_SubgroupEqMask' ( volatile in 4-component vector of uint SubgroupEqMask)
+0:137      'gl_SubgroupGeMask' ( volatile in 4-component vector of uint SubgroupGeMask)
+0:138      'gl_SubgroupGtMask' ( volatile in 4-component vector of uint SubgroupGtMask)
+0:139      'gl_SubgroupLeMask' ( volatile in 4-component vector of uint SubgroupLeMask)
+0:140      'gl_SubgroupLtMask' ( volatile in 4-component vector of uint SubgroupLtMask)
 0:141      subgroupBroadcast ( global 4-component vector of float)
 0:141        'f4' ( in 4-component vector of float)
 0:141        Constant:
@@ -662,15 +662,15 @@
 0:251    Sequence
 0:251      'gl_WarpsPerSMNV' ( in uint WarpsPerSMNV)
 0:252      'gl_SMCountNV' ( in uint SMCountNV)
-0:253      'gl_WarpIDNV' ( in uint WarpIDNV)
-0:254      'gl_SMIDNV' ( in uint SMIDNV)
+0:253      'gl_WarpIDNV' ( volatile in uint WarpIDNV)
+0:254      'gl_SMIDNV' ( volatile in uint SMIDNV)
 0:261  Function Definition: sm_builtins( ( global void)
 0:261    Function Parameters: 
 0:263    Sequence
 0:263      'gl_WarpsPerSMNV' ( in uint WarpsPerSMNV)
 0:264      'gl_SMCountNV' ( in uint SMCountNV)
-0:265      'gl_WarpIDNV' ( in uint WarpIDNV)
-0:266      'gl_SMIDNV' ( in uint SMIDNV)
+0:265      'gl_WarpIDNV' ( volatile in uint WarpIDNV)
+0:266      'gl_SMIDNV' ( volatile in uint SMIDNV)
 0:?   Linker Objects
 0:?     'accNV' (layout( set=0 binding=0) uniform accelerationStructureNV)
 0:?     'localPayload' (layout( location=0) rayPayloadNV 4-component vector of float)
diff --git a/third_party/glslang/src/Test/baseResults/hlsl.structbuffer.append.fn.frag.out b/third_party/glslang/src/Test/baseResults/hlsl.structbuffer.append.fn.frag.out
index 6a239da..2ac904e 100644
--- a/third_party/glslang/src/Test/baseResults/hlsl.structbuffer.append.fn.frag.out
+++ b/third_party/glslang/src/Test/baseResults/hlsl.structbuffer.append.fn.frag.out
@@ -190,13 +190,13 @@
                               Decorate 9 BufferBlock
                               Decorate 12 BufferBlock
                               Decorate 49(sbuf_a) DescriptorSet 0
-                              Decorate 49(sbuf_a) Binding 4
+                              Decorate 49(sbuf_a) Binding 0
                               Decorate 50(sbuf_a@count) DescriptorSet 0
-                              Decorate 50(sbuf_a@count) Binding 6
+                              Decorate 50(sbuf_a@count) Binding 0
                               Decorate 51(sbuf_c) DescriptorSet 0
-                              Decorate 51(sbuf_c) Binding 5
+                              Decorate 51(sbuf_c) Binding 1
                               Decorate 52(sbuf_c@count) DescriptorSet 0
-                              Decorate 52(sbuf_c@count) Binding 7
+                              Decorate 52(sbuf_c@count) Binding 0
                               Decorate 58(pos) Flat
                               Decorate 58(pos) Location 0
                               Decorate 61(@entryPointOutput) Location 0
diff --git a/third_party/glslang/src/Test/baseResults/hlsl.structbuffer.fn.frag.out b/third_party/glslang/src/Test/baseResults/hlsl.structbuffer.fn.frag.out
index c5afd35..bd2a4e6 100644
--- a/third_party/glslang/src/Test/baseResults/hlsl.structbuffer.fn.frag.out
+++ b/third_party/glslang/src/Test/baseResults/hlsl.structbuffer.fn.frag.out
@@ -191,9 +191,9 @@
                               Decorate 18 BufferBlock
                               Decorate 20 BufferBlock
                               Decorate 47(sbuf2) DescriptorSet 0
-                              Decorate 47(sbuf2) Binding 2
+                              Decorate 47(sbuf2) Binding 0
                               Decorate 48(sbuf2@count) DescriptorSet 0
-                              Decorate 48(sbuf2@count) Binding 3
+                              Decorate 48(sbuf2@count) Binding 0
                               Decorate 50(sbuf) DescriptorSet 0
                               Decorate 50(sbuf) Binding 10
                               Decorate 63(pos) Flat
diff --git a/third_party/glslang/src/Test/baseResults/link.vk.multiBlocksValid.0.0.vert.out b/third_party/glslang/src/Test/baseResults/link.vk.multiBlocksValid.0.0.vert.out
index ddb856d..bdabab1 100644
--- a/third_party/glslang/src/Test/baseResults/link.vk.multiBlocksValid.0.0.vert.out
+++ b/third_party/glslang/src/Test/baseResults/link.vk.multiBlocksValid.0.0.vert.out
@@ -211,7 +211,7 @@
                               Name 70  "BufferBlock"
                               MemberName 70(BufferBlock) 0  "p"
                               Name 72  "uBuf"
-                              Decorate 14(oColor) Location 4
+                              Decorate 14(oColor) Location 2
                               MemberDecorate 16(ColorBlock) 0 Offset 0
                               MemberDecorate 16(ColorBlock) 1 Offset 16
                               MemberDecorate 16(ColorBlock) 2 Offset 32
@@ -224,7 +224,7 @@
                               Decorate 28(uColorBuf) DescriptorSet 0
                               Decorate 28(uColorBuf) Binding 0
                               Decorate 32(Vertex) Block
-                              Decorate 34(oV) Location 2
+                              Decorate 34(oV) Location 0
                               MemberDecorate 40(gl_PerVertex) 0 BuiltIn Position
                               MemberDecorate 40(gl_PerVertex) 1 BuiltIn PointSize
                               MemberDecorate 40(gl_PerVertex) 2 BuiltIn ClipDistance
diff --git a/third_party/glslang/src/Test/baseResults/link.vk.multiBlocksValid.1.0.geom.out b/third_party/glslang/src/Test/baseResults/link.vk.multiBlocksValid.1.0.geom.out
index 63be728..c0b33b7 100644
--- a/third_party/glslang/src/Test/baseResults/link.vk.multiBlocksValid.1.0.geom.out
+++ b/third_party/glslang/src/Test/baseResults/link.vk.multiBlocksValid.1.0.geom.out
@@ -304,7 +304,7 @@
                               MemberName 95(BufferBlock) 0  "p"
                               Name 97  "uBuf"
                               Name 100  "P"
-                              Decorate 18(oColor) Location 2
+                              Decorate 18(oColor) Location 1
                               MemberDecorate 20(ColorBlock) 0 Offset 0
                               MemberDecorate 20(ColorBlock) 1 Offset 16
                               MemberDecorate 20(ColorBlock) 2 Offset 32
@@ -326,16 +326,16 @@
                               Decorate 50(uM) DescriptorSet 0
                               Decorate 50(uM) Binding 0
                               Decorate 59(Vertex) Block
-                              Decorate 61(oV) Location 1
+                              Decorate 61(oV) Location 0
                               Decorate 64(Vertex) Block
-                              Decorate 68(iV) Location 0
+                              Decorate 68(iV) Location 1
                               MemberDecorate 95(BufferBlock) 0 ColMajor
                               MemberDecorate 95(BufferBlock) 0 Offset 0
                               MemberDecorate 95(BufferBlock) 0 MatrixStride 16
                               Decorate 95(BufferBlock) BufferBlock
                               Decorate 97(uBuf) DescriptorSet 0
                               Decorate 97(uBuf) Binding 1
-                              Decorate 100(P) Location 4
+                              Decorate 100(P) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/third_party/glslang/src/Test/baseResults/numeral.frag.out b/third_party/glslang/src/Test/baseResults/numeral.frag.out
index b7c0a78..e2a7c64 100644
--- a/third_party/glslang/src/Test/baseResults/numeral.frag.out
+++ b/third_party/glslang/src/Test/baseResults/numeral.frag.out
@@ -12,7 +12,7 @@
 ERROR: 0:98: '' : numeric literal too big 
 ERROR: 0:101: '' : numeric literal too big 
 ERROR: 0:104: '#' : preprocessor directive cannot be preceded by another token 
-ERROR: 0:104: '' :  syntax error, unexpected $end, expecting COMMA or SEMICOLON
+ERROR: 0:104: '' :  syntax error, unexpected end of file, expecting COMMA or SEMICOLON
 ERROR: 14 compilation errors.  No code generated.
 
 
diff --git a/third_party/glslang/src/Test/baseResults/rayQuery-allOps.comp.out b/third_party/glslang/src/Test/baseResults/rayQuery-allOps.comp.out
index c0cc8aa..fd4a2ff 100644
--- a/third_party/glslang/src/Test/baseResults/rayQuery-allOps.comp.out
+++ b/third_party/glslang/src/Test/baseResults/rayQuery-allOps.comp.out
@@ -4,8 +4,8 @@
 // Id's are bound by 258
 
                               Capability Shader
-                              Capability RayQueryProvisionalKHR
-                              Capability RayTraversalPrimitiveCullingProvisionalKHR
+                              Capability RayQueryKHR
+                              Capability RayTraversalPrimitiveCullingKHR
                               Extension  "SPV_KHR_ray_query"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
@@ -86,8 +86,9 @@
               35:             TypePointer Function 8(float)
               37:     18(int) Constant 3
               38:    8(float) Constant 1176255488
-              45:             TypeRayQueryProvisionalKHR
-              46:             TypePointer Function 45
+              45:             TypeRayQueryKHR
+              46:             TypePointer Private 45
+    47(rayQuery):     46(ptr) Variable Private
               48:             TypeAccelerationStructureKHR
               49:             TypePointer UniformConstant 48
         50(rtas):     49(ptr) Variable UniformConstant
@@ -114,7 +115,6 @@
          4(main):           2 Function None 3
                5:             Label
          43(ray):     25(ptr) Variable Function
-    47(rayQuery):     46(ptr) Variable Function
 69(candidateType):     68(ptr) Variable Function
      78(_mat4x3):     77(ptr) Variable Function
      83(_mat3x4):     82(ptr) Variable Function
diff --git a/third_party/glslang/src/Test/baseResults/rayQuery-allOps.frag.out b/third_party/glslang/src/Test/baseResults/rayQuery-allOps.frag.out
index 8182da3..573a640 100644
--- a/third_party/glslang/src/Test/baseResults/rayQuery-allOps.frag.out
+++ b/third_party/glslang/src/Test/baseResults/rayQuery-allOps.frag.out
@@ -4,7 +4,7 @@
 // Id's are bound by 257
 
                               Capability Shader
-                              Capability RayQueryProvisionalKHR
+                              Capability RayQueryKHR
                               Extension  "SPV_KHR_ray_query"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
@@ -85,8 +85,9 @@
               35:             TypePointer Function 8(float)
               37:     18(int) Constant 3
               38:    8(float) Constant 1176255488
-              45:             TypeRayQueryProvisionalKHR
-              46:             TypePointer Function 45
+              45:             TypeRayQueryKHR
+              46:             TypePointer Private 45
+    47(rayQuery):     46(ptr) Variable Private
               48:             TypeAccelerationStructureKHR
               49:             TypePointer UniformConstant 48
         50(rtas):     49(ptr) Variable UniformConstant
@@ -112,7 +113,6 @@
          4(main):           2 Function None 3
                5:             Label
          43(ray):     25(ptr) Variable Function
-    47(rayQuery):     46(ptr) Variable Function
 69(candidateType):     68(ptr) Variable Function
      78(_mat4x3):     77(ptr) Variable Function
      83(_mat3x4):     82(ptr) Variable Function
diff --git a/third_party/glslang/src/Test/baseResults/rayQuery-allOps.rgen.out b/third_party/glslang/src/Test/baseResults/rayQuery-allOps.rgen.out
index 01b8f1d..deb0f7d 100644
--- a/third_party/glslang/src/Test/baseResults/rayQuery-allOps.rgen.out
+++ b/third_party/glslang/src/Test/baseResults/rayQuery-allOps.rgen.out
@@ -3,7 +3,7 @@
 // Generated by (magic number): 8000a
 // Id's are bound by 257
 
-                              Capability RayQueryProvisionalKHR
+                              Capability RayQueryKHR
                               Capability RayTracingNV
                               Extension  "SPV_KHR_ray_query"
                               Extension  "SPV_NV_ray_tracing"
@@ -85,8 +85,9 @@
               35:             TypePointer Function 8(float)
               37:     18(int) Constant 3
               38:    8(float) Constant 1176255488
-              45:             TypeRayQueryProvisionalKHR
-              46:             TypePointer Function 45
+              45:             TypeRayQueryKHR
+              46:             TypePointer Private 45
+    47(rayQuery):     46(ptr) Variable Private
               48:             TypeAccelerationStructureKHR
               49:             TypePointer UniformConstant 48
         50(rtas):     49(ptr) Variable UniformConstant
@@ -112,7 +113,6 @@
          4(main):           2 Function None 3
                5:             Label
          43(ray):     25(ptr) Variable Function
-    47(rayQuery):     46(ptr) Variable Function
 69(candidateType):     68(ptr) Variable Function
      78(_mat4x3):     77(ptr) Variable Function
      83(_mat3x4):     82(ptr) Variable Function
diff --git a/third_party/glslang/src/Test/baseResults/rayQuery-global.rgen.out b/third_party/glslang/src/Test/baseResults/rayQuery-global.rgen.out
new file mode 100644
index 0000000..7b05173
--- /dev/null
+++ b/third_party/glslang/src/Test/baseResults/rayQuery-global.rgen.out
@@ -0,0 +1,76 @@
+rayQuery-global.rgen
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 44
+
+                              Capability RayQueryKHR
+                              Capability RayTracingKHR
+                              Extension  "SPV_KHR_ray_query"
+                              Extension  "SPV_KHR_ray_tracing"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint RayGenerationKHR 4  "main"
+                              Source GLSL 460
+                              SourceExtension  "GL_EXT_ray_flags_primitive_culling"
+                              SourceExtension  "GL_EXT_ray_query"
+                              Name 4  "main"
+                              Name 10  "otherWrapper(rq1;"
+                              Name 9  "rq"
+                              Name 13  "wrapper(rq1;"
+                              Name 12  "rq"
+                              Name 17  "rqGlobal"
+                              Name 22  "rq2"
+                              Name 27  "rtas"
+                              Name 40  "rq2"
+                              Decorate 27(rtas) DescriptorSet 0
+                              Decorate 27(rtas) Binding 1
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeRayQueryKHR
+               7:             TypePointer Private 6
+               8:             TypeFunction 2 7(ptr)
+              15:             TypeBool
+    17(rqGlobal):      7(ptr) Variable Private
+         22(rq2):      7(ptr) Variable Private
+              25:             TypeAccelerationStructureKHR
+              26:             TypePointer UniformConstant 25
+        27(rtas):     26(ptr) Variable UniformConstant
+              29:             TypeInt 32 0
+              30:     29(int) Constant 0
+              31:     29(int) Constant 255
+              32:             TypeFloat 32
+              33:             TypeVector 32(float) 3
+              34:   32(float) Constant 0
+              35:   33(fvec3) ConstantComposite 34 34 34
+              36:   32(float) Constant 1065353216
+              37:   33(fvec3) ConstantComposite 36 34 34
+         40(rq2):      7(ptr) Variable Private
+         4(main):           2 Function None 3
+               5:             Label
+              28:          25 Load 27(rtas)
+                              RayQueryInitializeKHR 17(rqGlobal) 28 30 31 35 34 37 36
+              38:           2 FunctionCall 13(wrapper(rq1;) 17(rqGlobal)
+              39:           2 FunctionCall 10(otherWrapper(rq1;) 17(rqGlobal)
+              41:          25 Load 27(rtas)
+                              RayQueryInitializeKHR 40(rq2) 41 30 31 35 34 37 36
+              42:           2 FunctionCall 13(wrapper(rq1;) 40(rq2)
+              43:           2 FunctionCall 10(otherWrapper(rq1;) 40(rq2)
+                              Return
+                              FunctionEnd
+10(otherWrapper(rq1;):           2 Function None 8
+           9(rq):      7(ptr) FunctionParameter
+              11:             Label
+              16:    15(bool) RayQueryProceedKHR 9(rq)
+              18:    15(bool) RayQueryProceedKHR 17(rqGlobal)
+                              Return
+                              FunctionEnd
+13(wrapper(rq1;):           2 Function None 8
+          12(rq):      7(ptr) FunctionParameter
+              14:             Label
+              19:    15(bool) RayQueryProceedKHR 12(rq)
+              20:    15(bool) RayQueryProceedKHR 17(rqGlobal)
+              21:           2 FunctionCall 10(otherWrapper(rq1;) 12(rq)
+              23:           2 FunctionCall 10(otherWrapper(rq1;) 22(rq2)
+              24:           2 FunctionCall 10(otherWrapper(rq1;) 17(rqGlobal)
+                              Return
+                              FunctionEnd
diff --git a/third_party/glslang/src/Test/baseResults/rayQuery-initialize.rgen.out b/third_party/glslang/src/Test/baseResults/rayQuery-initialize.rgen.out
index f97287f..f16facd 100644
--- a/third_party/glslang/src/Test/baseResults/rayQuery-initialize.rgen.out
+++ b/third_party/glslang/src/Test/baseResults/rayQuery-initialize.rgen.out
@@ -3,7 +3,7 @@
 // Generated by (magic number): 8000a
 // Id's are bound by 103
 
-                              Capability RayQueryProvisionalKHR
+                              Capability RayQueryKHR
                               Capability RayTracingNV
                               Extension  "SPV_KHR_ray_query"
                               Extension  "SPV_NV_ray_tracing"
@@ -55,8 +55,8 @@
                3:             TypeFunction 2
                6:             TypeInt 32 0
                7:             TypeFunction 6(int)
-              10:             TypeRayQueryProvisionalKHR
-              11:             TypePointer Function 10
+              10:             TypeRayQueryKHR
+              11:             TypePointer Private 10
               12:             TypeFloat 32
               13:             TypeVector 12(float) 3
          14(Ray):             TypeStruct 13(fvec3) 12(float) 13(fvec3) 12(float)
@@ -88,12 +88,12 @@
               75:             TypePointer Uniform 74(Rays)
               76:     75(ptr) Variable Uniform
               78:             TypePointer Uniform 72(Ray)
+    89(rayQuery):     11(ptr) Variable Private
               94:      6(int) Constant 32
          4(main):           2 Function None 3
                5:             Label
        69(index):     68(ptr) Variable Function
          71(ray):     15(ptr) Variable Function
-    89(rayQuery):     11(ptr) Variable Function
        90(param):     15(ptr) Variable Function
               70:      6(int) FunctionCall 8(launchIndex()
                               Store 69(index) 70
diff --git a/third_party/glslang/src/Test/baseResults/rayQuery-no-cse.rgen.out b/third_party/glslang/src/Test/baseResults/rayQuery-no-cse.rgen.out
index 23c8b51..a44c41f 100644
--- a/third_party/glslang/src/Test/baseResults/rayQuery-no-cse.rgen.out
+++ b/third_party/glslang/src/Test/baseResults/rayQuery-no-cse.rgen.out
@@ -3,7 +3,7 @@
 // Generated by (magic number): 8000a
 // Id's are bound by 107
 
-                              Capability RayQueryProvisionalKHR
+                              Capability RayQueryKHR
                               Capability RayTracingNV
                               Extension  "SPV_KHR_ray_query"
                               Extension  "SPV_NV_ray_tracing"
@@ -57,8 +57,8 @@
                3:             TypeFunction 2
                6:             TypeInt 32 0
                7:             TypeFunction 6(int)
-              10:             TypeRayQueryProvisionalKHR
-              11:             TypePointer Function 10
+              10:             TypeRayQueryKHR
+              11:             TypePointer Private 10
               12:             TypeFloat 32
               13:             TypeVector 12(float) 3
          14(Ray):             TypeStruct 13(fvec3) 12(float) 13(fvec3) 12(float)
@@ -90,14 +90,14 @@
               75:             TypePointer Uniform 74(Rays)
               76:     75(ptr) Variable Uniform
               78:             TypePointer Uniform 72(Ray)
+   89(rayQuery1):     11(ptr) Variable Private
               94:      6(int) Constant 32
+  103(rayQuery2):     11(ptr) Variable Private
          4(main):           2 Function None 3
                5:             Label
        69(index):     68(ptr) Variable Function
          71(ray):     15(ptr) Variable Function
-   89(rayQuery1):     11(ptr) Variable Function
        90(param):     15(ptr) Variable Function
-  103(rayQuery2):     11(ptr) Variable Function
       104(param):     15(ptr) Variable Function
               70:      6(int) FunctionCall 8(launchIndex()
                               Store 69(index) 70
diff --git a/third_party/glslang/src/Test/baseResults/rayQuery.rgen.out b/third_party/glslang/src/Test/baseResults/rayQuery.rgen.out
index bf142a3..80e9916 100644
--- a/third_party/glslang/src/Test/baseResults/rayQuery.rgen.out
+++ b/third_party/glslang/src/Test/baseResults/rayQuery.rgen.out
@@ -3,7 +3,7 @@
 // Generated by (magic number): 8000a
 // Id's are bound by 44
 
-                              Capability RayQueryProvisionalKHR
+                              Capability RayQueryKHR
                               Capability RayTracingNV
                               Extension  "SPV_KHR_ray_query"
                               Extension  "SPV_NV_ray_tracing"
@@ -39,8 +39,9 @@
               11:             TypePointer Function 10(float)
               13:   10(float) Constant 0
               15:   10(float) Constant 1148846080
-              16:             TypeRayQueryProvisionalKHR
-              17:             TypePointer Function 16
+              16:             TypeRayQueryKHR
+              17:             TypePointer Private 16
+18(localRayQuery):     17(ptr) Variable Private
               19:             TypeAccelerationStructureKHR
               20:             TypePointer UniformConstant 19
         21(acc0):     20(ptr) Variable UniformConstant
@@ -59,7 +60,6 @@
      8(rayFlags):      7(ptr) Variable Function
         12(tMin):     11(ptr) Variable Function
         14(tMax):     11(ptr) Variable Function
-18(localRayQuery):     17(ptr) Variable Function
                               Store 8(rayFlags) 9
                               Store 12(tMin) 13
                               Store 14(tMax) 15
diff --git a/third_party/glslang/src/Test/baseResults/spv.AnyHitShader.rahit.out b/third_party/glslang/src/Test/baseResults/spv.AnyHitShader.rahit.out
index 755d60e..c893f88 100644
--- a/third_party/glslang/src/Test/baseResults/spv.AnyHitShader.rahit.out
+++ b/third_party/glslang/src/Test/baseResults/spv.AnyHitShader.rahit.out
@@ -53,7 +53,7 @@
                               Decorate 42(gl_ObjectRayDirectionNV) BuiltIn ObjectRayDirectionKHR
                               Decorate 47(gl_RayTminNV) BuiltIn RayTminKHR
                               Decorate 50(gl_RayTmaxNV) BuiltIn RayTmaxKHR
-                              Decorate 53(gl_HitTNV) BuiltIn HitTKHR
+                              Decorate 53(gl_HitTNV) BuiltIn HitTNV
                               Decorate 58(gl_HitKindNV) BuiltIn HitKindKHR
                               Decorate 64(gl_ObjectToWorldNV) BuiltIn ObjectToWorldKHR
                               Decorate 67(gl_WorldToObjectNV) BuiltIn WorldToObjectKHR
@@ -153,10 +153,10 @@
                               SelectionMerge 79 None
                               BranchConditional 77 78 80
               78:               Label
-                                IgnoreIntersectionKHR
+                                IgnoreIntersectionNV
                                 Branch 79
               80:               Label
-                                TerminateRayKHR
+                                TerminateRayNV
                                 Branch 79
               79:             Label
                               Return
diff --git a/third_party/glslang/src/Test/baseResults/spv.ClosestHitShader.rchit.out b/third_party/glslang/src/Test/baseResults/spv.ClosestHitShader.rchit.out
index 63039dd..b76629c 100644
--- a/third_party/glslang/src/Test/baseResults/spv.ClosestHitShader.rchit.out
+++ b/third_party/glslang/src/Test/baseResults/spv.ClosestHitShader.rchit.out
@@ -55,7 +55,7 @@
                               Decorate 42(gl_ObjectRayDirectionNV) BuiltIn ObjectRayDirectionKHR
                               Decorate 47(gl_RayTminNV) BuiltIn RayTminKHR
                               Decorate 50(gl_RayTmaxNV) BuiltIn RayTmaxKHR
-                              Decorate 53(gl_HitTNV) BuiltIn HitTKHR
+                              Decorate 53(gl_HitTNV) BuiltIn HitTNV
                               Decorate 58(gl_HitKindNV) BuiltIn HitKindKHR
                               Decorate 64(gl_ObjectToWorldNV) BuiltIn ObjectToWorldKHR
                               Decorate 67(gl_WorldToObjectNV) BuiltIn WorldToObjectKHR
@@ -164,6 +164,6 @@
               68:          60 Load 67(gl_WorldToObjectNV)
                               Store 66(v14) 68
               72:          69 Load 71(accNV)
-                              TraceRayKHR 72 73 74 75 76 73 78 77 80 81 82
+                              TraceNV 72 73 74 75 76 73 78 77 80 81 82
                               Return
                               FunctionEnd
diff --git a/third_party/glslang/src/Test/baseResults/spv.MissShader.rmiss.out b/third_party/glslang/src/Test/baseResults/spv.MissShader.rmiss.out
index d0eeb01..e573bba 100644
--- a/third_party/glslang/src/Test/baseResults/spv.MissShader.rmiss.out
+++ b/third_party/glslang/src/Test/baseResults/spv.MissShader.rmiss.out
@@ -1,13 +1,13 @@
 spv.MissShader.rmiss
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 60
+// Id's are bound by 59
 
                               Capability RayTracingNV
                               Extension  "SPV_NV_ray_tracing"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint MissKHR 4  "main" 11 14 21 24 27 30 35 38
+                              EntryPoint MissKHR 4  "main" 11 14 21 24 29 34 37
                               Source GLSL 460
                               SourceExtension  "GL_NV_ray_tracing"
                               Name 4  "main"
@@ -19,29 +19,26 @@
                               Name 21  "gl_WorldRayOriginNV"
                               Name 23  "v3"
                               Name 24  "gl_WorldRayDirectionNV"
-                              Name 26  "v4"
-                              Name 27  "gl_ObjectRayOriginNV"
-                              Name 29  "v5"
-                              Name 30  "gl_ObjectRayDirectionNV"
-                              Name 33  "v6"
-                              Name 35  "gl_RayTminNV"
-                              Name 37  "v7"
-                              Name 38  "gl_RayTmaxNV"
-                              Name 42  "accNV"
-                              Name 57  "localPayload"
-                              Name 59  "incomingPayload"
+                              Name 27  "v4"
+                              Name 29  "gl_IncomingRayFlagsNV"
+                              Name 32  "v6"
+                              Name 34  "gl_RayTminNV"
+                              Name 36  "v7"
+                              Name 37  "gl_RayTmaxNV"
+                              Name 41  "accNV"
+                              Name 56  "localPayload"
+                              Name 58  "incomingPayload"
                               Decorate 11(gl_LaunchIDNV) BuiltIn LaunchIdKHR
                               Decorate 14(gl_LaunchSizeNV) BuiltIn LaunchSizeKHR
                               Decorate 21(gl_WorldRayOriginNV) BuiltIn WorldRayOriginKHR
                               Decorate 24(gl_WorldRayDirectionNV) BuiltIn WorldRayDirectionKHR
-                              Decorate 27(gl_ObjectRayOriginNV) BuiltIn ObjectRayOriginKHR
-                              Decorate 30(gl_ObjectRayDirectionNV) BuiltIn ObjectRayDirectionKHR
-                              Decorate 35(gl_RayTminNV) BuiltIn RayTminKHR
-                              Decorate 38(gl_RayTmaxNV) BuiltIn RayTmaxKHR
-                              Decorate 42(accNV) DescriptorSet 0
-                              Decorate 42(accNV) Binding 0
-                              Decorate 57(localPayload) Location 0
-                              Decorate 59(incomingPayload) Location 1
+                              Decorate 29(gl_IncomingRayFlagsNV) BuiltIn IncomingRayFlagsKHR
+                              Decorate 34(gl_RayTminNV) BuiltIn RayTminKHR
+                              Decorate 37(gl_RayTmaxNV) BuiltIn RayTmaxKHR
+                              Decorate 41(accNV) DescriptorSet 0
+                              Decorate 41(accNV) Binding 0
+                              Decorate 56(localPayload) Location 0
+                              Decorate 58(incomingPayload) Location 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -56,41 +53,41 @@
               20:             TypePointer Input 17(fvec3)
 21(gl_WorldRayOriginNV):     20(ptr) Variable Input
 24(gl_WorldRayDirectionNV):     20(ptr) Variable Input
-27(gl_ObjectRayOriginNV):     20(ptr) Variable Input
-30(gl_ObjectRayDirectionNV):     20(ptr) Variable Input
-              32:             TypePointer Function 16(float)
-              34:             TypePointer Input 16(float)
-35(gl_RayTminNV):     34(ptr) Variable Input
-38(gl_RayTmaxNV):     34(ptr) Variable Input
-              40:             TypeAccelerationStructureKHR
-              41:             TypePointer UniformConstant 40
-       42(accNV):     41(ptr) Variable UniformConstant
-              44:      6(int) Constant 0
-              45:      6(int) Constant 1
-              46:      6(int) Constant 2
-              47:      6(int) Constant 3
-              48:   16(float) Constant 1056964608
-              49:   17(fvec3) ConstantComposite 48 48 48
-              50:   16(float) Constant 1065353216
-              51:   17(fvec3) ConstantComposite 50 50 50
-              52:   16(float) Constant 1061158912
-              53:             TypeInt 32 1
-              54:     53(int) Constant 1
-              55:             TypeVector 16(float) 4
-              56:             TypePointer RayPayloadKHR 55(fvec4)
-57(localPayload):     56(ptr) Variable RayPayloadKHR
-              58:             TypePointer IncomingRayPayloadKHR 55(fvec4)
-59(incomingPayload):     58(ptr) Variable IncomingRayPayloadKHR
+              26:             TypePointer Function 6(int)
+              28:             TypePointer Input 6(int)
+29(gl_IncomingRayFlagsNV):     28(ptr) Variable Input
+              31:             TypePointer Function 16(float)
+              33:             TypePointer Input 16(float)
+34(gl_RayTminNV):     33(ptr) Variable Input
+37(gl_RayTmaxNV):     33(ptr) Variable Input
+              39:             TypeAccelerationStructureKHR
+              40:             TypePointer UniformConstant 39
+       41(accNV):     40(ptr) Variable UniformConstant
+              43:      6(int) Constant 0
+              44:      6(int) Constant 1
+              45:      6(int) Constant 2
+              46:      6(int) Constant 3
+              47:   16(float) Constant 1056964608
+              48:   17(fvec3) ConstantComposite 47 47 47
+              49:   16(float) Constant 1065353216
+              50:   17(fvec3) ConstantComposite 49 49 49
+              51:   16(float) Constant 1061158912
+              52:             TypeInt 32 1
+              53:     52(int) Constant 1
+              54:             TypeVector 16(float) 4
+              55:             TypePointer RayPayloadKHR 54(fvec4)
+56(localPayload):     55(ptr) Variable RayPayloadKHR
+              57:             TypePointer IncomingRayPayloadKHR 54(fvec4)
+58(incomingPayload):     57(ptr) Variable IncomingRayPayloadKHR
          4(main):           2 Function None 3
                5:             Label
            9(v0):      8(ptr) Variable Function
           13(v1):      8(ptr) Variable Function
           19(v2):     18(ptr) Variable Function
           23(v3):     18(ptr) Variable Function
-          26(v4):     18(ptr) Variable Function
-          29(v5):     18(ptr) Variable Function
-          33(v6):     32(ptr) Variable Function
-          37(v7):     32(ptr) Variable Function
+          27(v4):     26(ptr) Variable Function
+          32(v6):     31(ptr) Variable Function
+          36(v7):     31(ptr) Variable Function
               12:    7(ivec3) Load 11(gl_LaunchIDNV)
                               Store 9(v0) 12
               15:    7(ivec3) Load 14(gl_LaunchSizeNV)
@@ -99,15 +96,13 @@
                               Store 19(v2) 22
               25:   17(fvec3) Load 24(gl_WorldRayDirectionNV)
                               Store 23(v3) 25
-              28:   17(fvec3) Load 27(gl_ObjectRayOriginNV)
-                              Store 26(v4) 28
-              31:   17(fvec3) Load 30(gl_ObjectRayDirectionNV)
-                              Store 29(v5) 31
-              36:   16(float) Load 35(gl_RayTminNV)
-                              Store 33(v6) 36
-              39:   16(float) Load 38(gl_RayTmaxNV)
-                              Store 37(v7) 39
-              43:          40 Load 42(accNV)
-                              TraceRayKHR 43 44 45 46 47 44 49 48 51 52 54
+              30:      6(int) Load 29(gl_IncomingRayFlagsNV)
+                              Store 27(v4) 30
+              35:   16(float) Load 34(gl_RayTminNV)
+                              Store 32(v6) 35
+              38:   16(float) Load 37(gl_RayTmaxNV)
+                              Store 36(v7) 38
+              42:          39 Load 41(accNV)
+                              TraceNV 42 43 44 45 46 43 48 47 50 51 53
                               Return
                               FunctionEnd
diff --git a/third_party/glslang/src/Test/baseResults/spv.RayCallable.rcall.out b/third_party/glslang/src/Test/baseResults/spv.RayCallable.rcall.out
index f59d36f..75698fc 100644
--- a/third_party/glslang/src/Test/baseResults/spv.RayCallable.rcall.out
+++ b/third_party/glslang/src/Test/baseResults/spv.RayCallable.rcall.out
@@ -55,6 +55,6 @@
                               Store 13(size) 15
               23:     22(ptr) AccessChain 18 20
                               Store 23 21
-                              ExecuteCallableKHR 24 25
+                              ExecuteCallableNV 24 25
                               Return
                               FunctionEnd
diff --git a/third_party/glslang/src/Test/baseResults/spv.RayConstants.rgen.out b/third_party/glslang/src/Test/baseResults/spv.RayConstants.rgen.out
index c4085fe..962aeb7 100644
--- a/third_party/glslang/src/Test/baseResults/spv.RayConstants.rgen.out
+++ b/third_party/glslang/src/Test/baseResults/spv.RayConstants.rgen.out
@@ -41,6 +41,6 @@
          4(main):           2 Function None 3
                5:             Label
                9:           6 Load 8(accNV)
-                              TraceRayKHR 9 11 12 13 13 12 17 18 20 21 23
+                              TraceNV 9 11 12 13 13 12 17 18 20 21 23
                               Return
                               FunctionEnd
diff --git a/third_party/glslang/src/Test/baseResults/spv.RayGenShader.rgen.out b/third_party/glslang/src/Test/baseResults/spv.RayGenShader.rgen.out
index 363b3dd..f8f3fd6 100644
--- a/third_party/glslang/src/Test/baseResults/spv.RayGenShader.rgen.out
+++ b/third_party/glslang/src/Test/baseResults/spv.RayGenShader.rgen.out
@@ -92,6 +92,6 @@
               44:   36(fvec3) Load 43
               47:     42(ptr) AccessChain 39 46
               48:   36(fvec3) Load 47
-                              TraceRayKHR 30 31 32 33 34 12 44 45 48 49 41
+                              TraceNV 30 31 32 33 34 12 44 45 48 49 41
                               Return
                               FunctionEnd
diff --git a/third_party/glslang/src/Test/baseResults/spv.RayGenShader11.rgen.out b/third_party/glslang/src/Test/baseResults/spv.RayGenShader11.rgen.out
index 195071f..f6b79c5 100644
--- a/third_party/glslang/src/Test/baseResults/spv.RayGenShader11.rgen.out
+++ b/third_party/glslang/src/Test/baseResults/spv.RayGenShader11.rgen.out
@@ -88,6 +88,6 @@
               44:   36(fvec3) Load 43
               47:     42(ptr) AccessChain 39 46
               48:   36(fvec3) Load 47
-                              TraceRayKHR 30 31 32 33 34 12 44 45 48 49 41
+                              TraceNV 30 31 32 33 34 12 44 45 48 49 41
                               Return
                               FunctionEnd
diff --git a/third_party/glslang/src/Test/baseResults/spv.RayGenShaderArray.rgen.out b/third_party/glslang/src/Test/baseResults/spv.RayGenShaderArray.rgen.out
index fef54aa..63a04b3 100644
--- a/third_party/glslang/src/Test/baseResults/spv.RayGenShaderArray.rgen.out
+++ b/third_party/glslang/src/Test/baseResults/spv.RayGenShaderArray.rgen.out
@@ -111,7 +111,7 @@
               51:   32(fvec3) Load 50
               54:     49(ptr) AccessChain 36 53
               55:   32(fvec3) Load 54
-                              TraceRayKHR 43 44 45 46 47 12 51 52 55 56 48
+                              TraceNV 43 44 45 46 47 12 51 52 55 56 48
               61:     38(ptr) AccessChain 36 37
               62:     33(int) Load 61
               63:     41(ptr) AccessChain 60(accNV1) 62
@@ -124,7 +124,7 @@
               70:   32(fvec3) Load 69
               71:     49(ptr) AccessChain 36 53
               72:   32(fvec3) Load 71
-                              TraceRayKHR 64 65 66 67 68 12 70 52 72 56 48
+                              TraceNV 64 65 66 67 68 12 70 52 72 56 48
               73:     38(ptr) AccessChain 36 37
               74:     33(int) Load 73
               75:     33(int) CopyObject 74
@@ -138,6 +138,6 @@
               83:   32(fvec3) Load 82
               84:     49(ptr) AccessChain 36 53
               85:   32(fvec3) Load 84
-                              TraceRayKHR 77 78 79 80 81 12 83 52 85 56 48
+                              TraceNV 77 78 79 80 81 12 83 52 85 56 48
                               Return
                               FunctionEnd
diff --git a/third_party/glslang/src/Test/baseResults/spv.ext.AccelDecl.frag.out b/third_party/glslang/src/Test/baseResults/spv.ext.AccelDecl.frag.out
new file mode 100644
index 0000000..11d4560
--- /dev/null
+++ b/third_party/glslang/src/Test/baseResults/spv.ext.AccelDecl.frag.out
@@ -0,0 +1,41 @@
+spv.ext.AccelDecl.frag
+// Module Version 10400
+// Generated by (magic number): 8000a
+// Id's are bound by 15
+
+                              Capability Shader
+                              Capability RayQueryKHR
+                              Extension  "SPV_KHR_ray_query"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 9 14
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 460
+                              SourceExtension  "GL_ARB_separate_shader_objects"
+                              SourceExtension  "GL_EXT_nonuniform_qualifier"
+                              SourceExtension  "GL_EXT_ray_query"
+                              SourceExtension  "GL_EXT_scalar_block_layout"
+                              SourceExtension  "GL_GOOGLE_cpp_style_line_directive"
+                              SourceExtension  "GL_GOOGLE_include_directive"
+                              Name 4  "main"
+                              Name 9  "outColor"
+                              Name 14  "topLevelAS"
+                              Decorate 9(outColor) Location 0
+                              Decorate 14(topLevelAS) DescriptorSet 0
+                              Decorate 14(topLevelAS) Binding 1
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Output 7(fvec4)
+     9(outColor):      8(ptr) Variable Output
+              10:    6(float) Constant 0
+              11:    7(fvec4) ConstantComposite 10 10 10 10
+              12:             TypeAccelerationStructureKHR
+              13:             TypePointer UniformConstant 12
+  14(topLevelAS):     13(ptr) Variable UniformConstant
+         4(main):           2 Function None 3
+               5:             Label
+                              Store 9(outColor) 11
+                              Return
+                              FunctionEnd
diff --git a/third_party/glslang/src/Test/baseResults/spv.ext.AnyHitShader.rahit.out b/third_party/glslang/src/Test/baseResults/spv.ext.AnyHitShader.rahit.out
index 39e43a7..7bcf812 100644
--- a/third_party/glslang/src/Test/baseResults/spv.ext.AnyHitShader.rahit.out
+++ b/third_party/glslang/src/Test/baseResults/spv.ext.AnyHitShader.rahit.out
@@ -1,15 +1,17 @@
 spv.ext.AnyHitShader.rahit
 // Module Version 10400
 // Generated by (magic number): 8000a
-// Id's are bound by 94
+// Id's are bound by 107
 
-                              Capability RayTracingProvisionalKHR
+                              Capability GroupNonUniform
+                              Capability RayTracingKHR
                               Extension  "SPV_KHR_ray_tracing"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint AnyHitKHR 4  "main" 11 14 20 23 26 33 36 39 42 47 50 53 58 64 67 70 76 80 84
+                              EntryPoint AnyHitKHR 4  "main" 11 14 20 23 26 33 36 39 42 47 50 53 58 64 67 70 76 80 84 98
                               Source GLSL 460
                               SourceExtension  "GL_EXT_ray_tracing"
+                              SourceExtension  "GL_KHR_shader_subgroup_basic"
                               Name 4  "main"
                               Name 9  "v0"
                               Name 11  "gl_LaunchIDEXT"
@@ -48,6 +50,7 @@
                               Name 79  "v17"
                               Name 80  "gl_WorldToObject3x4EXT"
                               Name 84  "incomingPayload"
+                              Name 98  "gl_SubgroupSize"
                               Decorate 11(gl_LaunchIDEXT) BuiltIn LaunchIdKHR
                               Decorate 14(gl_LaunchSizeEXT) BuiltIn LaunchSizeKHR
                               Decorate 20(gl_PrimitiveID) BuiltIn PrimitiveId
@@ -59,7 +62,7 @@
                               Decorate 42(gl_ObjectRayDirectionEXT) BuiltIn ObjectRayDirectionKHR
                               Decorate 47(gl_RayTminEXT) BuiltIn RayTminKHR
                               Decorate 50(gl_RayTmaxEXT) BuiltIn RayTmaxKHR
-                              Decorate 53(gl_HitTEXT) BuiltIn HitTKHR
+                              Decorate 53(gl_HitTEXT) BuiltIn RayTmaxKHR
                               Decorate 58(gl_HitKindEXT) BuiltIn HitKindKHR
                               Decorate 64(gl_ObjectToWorldEXT) BuiltIn ObjectToWorldKHR
                               Decorate 67(gl_WorldToObjectEXT) BuiltIn WorldToObjectKHR
@@ -67,6 +70,9 @@
                               Decorate 76(gl_ObjectToWorld3x4EXT) BuiltIn ObjectToWorldKHR
                               Decorate 80(gl_WorldToObject3x4EXT) BuiltIn WorldToObjectKHR
                               Decorate 84(incomingPayload) Location 1
+                              Decorate 98(gl_SubgroupSize) RelaxedPrecision
+                              Decorate 98(gl_SubgroupSize) BuiltIn SubgroupSize
+                              Decorate 99 RelaxedPrecision
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -114,6 +120,9 @@
               86:   72(fvec4) ConstantComposite 85 85 85 85
               88:     16(int) Constant 1
               89:             TypeBool
+              94:      6(int) Constant 0
+98(gl_SubgroupSize):     57(ptr) Variable Input
+             101:             TypePointer IncomingRayPayloadKHR 28(float)
          4(main):           2 Function None 3
                5:             Label
            9(v0):      8(ptr) Variable Function
@@ -176,13 +185,16 @@
               87:     16(int) Load 18(v2)
               90:    89(bool) IEqual 87 88
                               SelectionMerge 92 None
-                              BranchConditional 90 91 93
+                              BranchConditional 90 91 92
               91:               Label
                                 IgnoreIntersectionKHR
-                                Branch 92
-              93:               Label
-                                TerminateRayKHR
-                                Branch 92
               92:             Label
-                              Return
+              99:      6(int) Load 98(gl_SubgroupSize)
+             100:   28(float) ConvertUToF 99
+             102:    101(ptr) AccessChain 84(incomingPayload) 94
+             103:   28(float) Load 102
+             104:   28(float) FAdd 103 100
+             105:    101(ptr) AccessChain 84(incomingPayload) 94
+                              Store 105 104
+                              TerminateRayKHR
                               FunctionEnd
diff --git a/third_party/glslang/src/Test/baseResults/spv.ext.ClosestHitShader.rchit.out b/third_party/glslang/src/Test/baseResults/spv.ext.ClosestHitShader.rchit.out
index 7077ea4..40903e6 100644
--- a/third_party/glslang/src/Test/baseResults/spv.ext.ClosestHitShader.rchit.out
+++ b/third_party/glslang/src/Test/baseResults/spv.ext.ClosestHitShader.rchit.out
@@ -3,7 +3,7 @@
 // Generated by (magic number): 8000a
 // Id's are bound by 101
 
-                              Capability RayTracingProvisionalKHR
+                              Capability RayTracingKHR
                               Extension  "SPV_KHR_ray_tracing"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
@@ -48,8 +48,8 @@
                               Name 79  "v17"
                               Name 80  "gl_WorldToObject3x4EXT"
                               Name 85  "accEXT"
-                              Name 98  "localPayload"
-                              Name 100  "incomingPayload"
+                              Name 98  "incomingPayload"
+                              Name 100  "localPayload"
                               Decorate 11(gl_LaunchIDEXT) BuiltIn LaunchIdKHR
                               Decorate 14(gl_LaunchSizeEXT) BuiltIn LaunchSizeKHR
                               Decorate 20(gl_PrimitiveID) BuiltIn PrimitiveId
@@ -61,7 +61,7 @@
                               Decorate 42(gl_ObjectRayDirectionEXT) BuiltIn ObjectRayDirectionKHR
                               Decorate 47(gl_RayTminEXT) BuiltIn RayTminKHR
                               Decorate 50(gl_RayTmaxEXT) BuiltIn RayTmaxKHR
-                              Decorate 53(gl_HitTEXT) BuiltIn HitTKHR
+                              Decorate 53(gl_HitTEXT) BuiltIn RayTmaxKHR
                               Decorate 58(gl_HitKindEXT) BuiltIn HitKindKHR
                               Decorate 64(gl_ObjectToWorldEXT) BuiltIn ObjectToWorldKHR
                               Decorate 67(gl_WorldToObjectEXT) BuiltIn WorldToObjectKHR
@@ -70,8 +70,8 @@
                               Decorate 80(gl_WorldToObject3x4EXT) BuiltIn WorldToObjectKHR
                               Decorate 85(accEXT) DescriptorSet 0
                               Decorate 85(accEXT) Binding 0
-                              Decorate 98(localPayload) Location 0
-                              Decorate 100(incomingPayload) Location 1
+                              Decorate 98(incomingPayload) Location 1
+                              Decorate 100(localPayload) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -126,10 +126,10 @@
               94:   29(fvec3) ConstantComposite 93 93 93
               95:   28(float) Constant 1061158912
               96:     16(int) Constant 1
-              97:             TypePointer RayPayloadKHR 72(fvec4)
-98(localPayload):     97(ptr) Variable RayPayloadKHR
-              99:             TypePointer IncomingRayPayloadKHR 72(fvec4)
-100(incomingPayload):     99(ptr) Variable IncomingRayPayloadKHR
+              97:             TypePointer IncomingRayPayloadKHR 72(fvec4)
+98(incomingPayload):     97(ptr) Variable IncomingRayPayloadKHR
+              99:             TypePointer RayPayloadKHR 72(fvec4)
+100(localPayload):     99(ptr) Variable RayPayloadKHR
          4(main):           2 Function None 3
                5:             Label
            9(v0):      8(ptr) Variable Function
@@ -189,6 +189,6 @@
               82:          73 Transpose 81
                               Store 79(v17) 82
               86:          83 Load 85(accEXT)
-                              TraceRayKHR 86 87 88 89 90 87 92 91 94 95 96
+                              TraceRayKHR 86 87 88 89 90 87 92 91 94 95 98(incomingPayload)
                               Return
                               FunctionEnd
diff --git a/third_party/glslang/src/Test/baseResults/spv.ext.ClosestHitShader_Errors.rchit.out b/third_party/glslang/src/Test/baseResults/spv.ext.ClosestHitShader_Errors.rchit.out
index 6c87d1c..9f945a2 100644
--- a/third_party/glslang/src/Test/baseResults/spv.ext.ClosestHitShader_Errors.rchit.out
+++ b/third_party/glslang/src/Test/baseResults/spv.ext.ClosestHitShader_Errors.rchit.out
@@ -1,10 +1,12 @@
 spv.ext.ClosestHitShader_Errors.rchit
-ERROR: 0:8: 'assign' :  l-value required "payload" (cannot modify hitAttributeNV in this stage)
-ERROR: 0:9: 'reportIntersectionEXT' : no matching overloaded function found 
-ERROR: 0:10: 'terminateRayEXT' : no matching overloaded function found 
-ERROR: 0:11: 'ignoreIntersectionEXT' : no matching overloaded function found 
-ERROR: 0:12: 'gl_RayFlagsSkipAABBEXT' : required extension not requested: GL_EXT_ray_flags_primitive_culling
-ERROR: 5 compilation errors.  No code generated.
+ERROR: 0:6: 'location' : overlapping use of location 2
+ERROR: 0:9: 'assign' :  l-value required "payload" (cannot modify hitAttributeNV in this stage)
+ERROR: 0:10: 'reportIntersectionEXT' : no matching overloaded function found 
+ERROR: 0:11: 'terminateRayEXT' : not supported in this stage: closest-hit
+ERROR: 0:12: 'ignoreIntersectionEXT' : not supported in this stage: closest-hit
+ERROR: 0:13: 'gl_RayFlagsSkipAABBEXT' : required extension not requested: GL_EXT_ray_flags_primitive_culling
+ERROR: 0:14: 'no rayPayloadEXT/rayPayloadInEXT declared' : with layout(location = 0)
+ERROR: 7 compilation errors.  No code generated.
 
 
 SPIR-V is not generated for failed compile or link
diff --git a/third_party/glslang/src/Test/baseResults/spv.ext.ClosestHitShader_Subgroup.rchit.out b/third_party/glslang/src/Test/baseResults/spv.ext.ClosestHitShader_Subgroup.rchit.out
new file mode 100644
index 0000000..14ec09b
--- /dev/null
+++ b/third_party/glslang/src/Test/baseResults/spv.ext.ClosestHitShader_Subgroup.rchit.out
@@ -0,0 +1,114 @@
+spv.ext.ClosestHitShader_Subgroup.rchit
+// Module Version 10400
+// Generated by (magic number): 8000a
+// Id's are bound by 67
+
+                              Capability Int64
+                              Capability GroupNonUniform
+                              Capability GroupNonUniformBallot
+                              Capability SubgroupBallotKHR
+                              Capability RayTracingKHR
+                              Capability VulkanMemoryModelKHR
+                              Capability ShaderSMBuiltinsNV
+                              Extension  "SPV_KHR_ray_tracing"
+                              Extension  "SPV_KHR_shader_ballot"
+                              Extension  "SPV_KHR_vulkan_memory_model"
+                              Extension  "SPV_NV_shader_sm_builtins"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical VulkanKHR
+                              EntryPoint ClosestHitKHR 4  "main" 8 26 28 34 43 48 53 61
+                              Source GLSL 460
+                              SourceExtension  "GL_ARB_shader_ballot"
+                              SourceExtension  "GL_EXT_ray_tracing"
+                              SourceExtension  "GL_KHR_shader_subgroup_ballot"
+                              SourceExtension  "GL_KHR_shader_subgroup_basic"
+                              SourceExtension  "GL_NV_shader_sm_builtins"
+                              Name 4  "main"
+                              Name 8  "accEXT"
+                              Name 26  "incomingPayload"
+                              Name 28  "gl_SubgroupInvocationID"
+                              Name 34  "gl_SubGroupGeMaskARB"
+                              Name 43  "gl_SubgroupGtMask"
+                              Name 48  "gl_SubgroupLeMask"
+                              Name 53  "gl_SubGroupLtMaskARB"
+                              Name 61  "gl_SMIDNV"
+                              Decorate 8(accEXT) DescriptorSet 0
+                              Decorate 8(accEXT) Binding 0
+                              Decorate 26(incomingPayload) Location 1
+                              Decorate 28(gl_SubgroupInvocationID) RelaxedPrecision
+                              Decorate 28(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId
+                              Decorate 29 RelaxedPrecision
+                              Decorate 34(gl_SubGroupGeMaskARB) BuiltIn SubgroupGeMaskKHR
+                              Decorate 43(gl_SubgroupGtMask) BuiltIn SubgroupGtMaskKHR
+                              Decorate 48(gl_SubgroupLeMask) BuiltIn SubgroupLeMaskKHR
+                              Decorate 53(gl_SubGroupLtMaskARB) BuiltIn SubgroupLtMaskKHR
+                              Decorate 61(gl_SMIDNV) BuiltIn SMIDNV
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeAccelerationStructureKHR
+               7:             TypePointer UniformConstant 6
+       8(accEXT):      7(ptr) Variable UniformConstant
+              10:             TypeInt 32 0
+              11:     10(int) Constant 0
+              12:     10(int) Constant 1
+              13:     10(int) Constant 2
+              14:     10(int) Constant 3
+              15:             TypeFloat 32
+              16:             TypeVector 15(float) 3
+              17:   15(float) Constant 1056964608
+              18:   16(fvec3) ConstantComposite 17 17 17
+              19:   15(float) Constant 1065353216
+              20:   16(fvec3) ConstantComposite 19 19 19
+              21:   15(float) Constant 1061158912
+              22:             TypeInt 32 1
+              23:     22(int) Constant 1
+              24:             TypeVector 15(float) 4
+              25:             TypePointer IncomingRayPayloadKHR 24(fvec4)
+26(incomingPayload):     25(ptr) Variable IncomingRayPayloadKHR
+              27:             TypePointer Input 10(int)
+28(gl_SubgroupInvocationID):     27(ptr) Variable Input
+              31:             TypeVector 10(int) 4
+              32:             TypeInt 64 0
+              33:             TypePointer Input 31(ivec4)
+34(gl_SubGroupGeMaskARB):     33(ptr) Variable Input
+              38:             TypeVector 10(int) 2
+43(gl_SubgroupGtMask):     33(ptr) Variable Input
+48(gl_SubgroupLeMask):     33(ptr) Variable Input
+53(gl_SubGroupLtMaskARB):     33(ptr) Variable Input
+   61(gl_SMIDNV):     27(ptr) Variable Input
+              65:             TypePointer IncomingRayPayloadKHR 15(float)
+         4(main):           2 Function None 3
+               5:             Label
+               9:           6 Load 8(accEXT)
+                              TraceRayKHR 9 11 12 13 14 11 18 17 20 21 26(incomingPayload)
+              29:     10(int) Load 28(gl_SubgroupInvocationID) Volatile 
+              30:   15(float) ConvertUToF 29
+              35:   31(ivec4) Load 34(gl_SubGroupGeMaskARB)
+              36:     10(int) CompositeExtract 35 0
+              37:     10(int) CompositeExtract 35 1
+              39:   38(ivec2) CompositeConstruct 36 37
+              40: 32(int64_t) Bitcast 39
+              41:   15(float) ConvertUToF 40
+              42:   15(float) FAdd 30 41
+              44:   31(ivec4) Load 43(gl_SubgroupGtMask) Volatile 
+              45:   24(fvec4) ConvertUToF 44
+              46:   15(float) CompositeExtract 45 0
+              47:   15(float) FAdd 42 46
+              49:   31(ivec4) Load 48(gl_SubgroupLeMask) Volatile 
+              50:   24(fvec4) ConvertUToF 49
+              51:   15(float) CompositeExtract 50 0
+              52:   15(float) FAdd 47 51
+              54:   31(ivec4) Load 53(gl_SubGroupLtMaskARB)
+              55:     10(int) CompositeExtract 54 0
+              56:     10(int) CompositeExtract 54 1
+              57:   38(ivec2) CompositeConstruct 55 56
+              58: 32(int64_t) Bitcast 57
+              59:   15(float) ConvertUToF 58
+              60:   15(float) FAdd 52 59
+              62:     10(int) Load 61(gl_SMIDNV) Volatile 
+              63:   15(float) ConvertUToF 62
+              64:   15(float) FAdd 60 63
+              66:     65(ptr) AccessChain 26(incomingPayload) 11
+                              Store 66 64
+                              Return
+                              FunctionEnd
diff --git a/third_party/glslang/src/Test/baseResults/spv.ext.IntersectShader.rint.out b/third_party/glslang/src/Test/baseResults/spv.ext.IntersectShader.rint.out
index 4a4a34a..2d389a0 100644
--- a/third_party/glslang/src/Test/baseResults/spv.ext.IntersectShader.rint.out
+++ b/third_party/glslang/src/Test/baseResults/spv.ext.IntersectShader.rint.out
@@ -3,7 +3,7 @@
 // Generated by (magic number): 8000a
 // Id's are bound by 81
 
-                              Capability RayTracingProvisionalKHR
+                              Capability RayTracingKHR
                               Extension  "SPV_KHR_ray_tracing"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
@@ -53,6 +53,8 @@
                               Decorate 42(gl_ObjectRayDirectionEXT) BuiltIn ObjectRayDirectionKHR
                               Decorate 47(gl_RayTminEXT) BuiltIn RayTminKHR
                               Decorate 50(gl_RayTmaxEXT) BuiltIn RayTmaxKHR
+                              Decorate 50(gl_RayTmaxEXT) Volatile
+                              Decorate 50(gl_RayTmaxEXT) Coherent
                               Decorate 56(gl_ObjectToWorldEXT) BuiltIn ObjectToWorldKHR
                               Decorate 59(gl_WorldToObjectEXT) BuiltIn WorldToObjectKHR
                               Decorate 65(gl_ObjectToWorld3x4EXT) BuiltIn ObjectToWorldKHR
diff --git a/third_party/glslang/src/Test/baseResults/spv.ext.MissShader.rmiss.out b/third_party/glslang/src/Test/baseResults/spv.ext.MissShader.rmiss.out
index 544901b..bc29ccc 100644
--- a/third_party/glslang/src/Test/baseResults/spv.ext.MissShader.rmiss.out
+++ b/third_party/glslang/src/Test/baseResults/spv.ext.MissShader.rmiss.out
@@ -1,15 +1,25 @@
 spv.ext.MissShader.rmiss
 // Module Version 10400
 // Generated by (magic number): 8000a
-// Id's are bound by 54
+// Id's are bound by 71
 
-                              Capability RayTracingProvisionalKHR
+                              Capability GroupNonUniform
+                              Capability GroupNonUniformBallot
+                              Capability SubgroupBallotKHR
+                              Capability RayTracingKHR
+                              Capability ShaderSMBuiltinsNV
                               Extension  "SPV_KHR_ray_tracing"
+                              Extension  "SPV_KHR_shader_ballot"
+                              Extension  "SPV_NV_shader_sm_builtins"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint MissKHR 4  "main" 11 14 21 24 29 32 36 51 53
+                              EntryPoint MissKHR 4  "main" 11 14 21 24 29 32 36 51 53 58 63 70
                               Source GLSL 460
+                              SourceExtension  "GL_ARB_shader_ballot"
                               SourceExtension  "GL_EXT_ray_tracing"
+                              SourceExtension  "GL_KHR_shader_subgroup_ballot"
+                              SourceExtension  "GL_KHR_shader_subgroup_basic"
+                              SourceExtension  "GL_NV_shader_sm_builtins"
                               Name 4  "main"
                               Name 9  "v0"
                               Name 11  "gl_LaunchIDEXT"
@@ -24,8 +34,11 @@
                               Name 31  "v5"
                               Name 32  "gl_RayTmaxEXT"
                               Name 36  "accEXT"
-                              Name 51  "localPayload"
-                              Name 53  "incomingPayload"
+                              Name 51  "incomingPayload"
+                              Name 53  "gl_SubGroupSizeARB"
+                              Name 58  "gl_SubgroupEqMask"
+                              Name 63  "gl_WarpIDNV"
+                              Name 70  "localPayload"
                               Decorate 11(gl_LaunchIDEXT) BuiltIn LaunchIdKHR
                               Decorate 14(gl_LaunchSizeEXT) BuiltIn LaunchSizeKHR
                               Decorate 21(gl_WorldRayOriginEXT) BuiltIn WorldRayOriginKHR
@@ -34,8 +47,17 @@
                               Decorate 32(gl_RayTmaxEXT) BuiltIn RayTmaxKHR
                               Decorate 36(accEXT) DescriptorSet 0
                               Decorate 36(accEXT) Binding 0
-                              Decorate 51(localPayload) Location 0
-                              Decorate 53(incomingPayload) Location 1
+                              Decorate 51(incomingPayload) Location 1
+                              Decorate 53(gl_SubGroupSizeARB) BuiltIn SubgroupSize
+                              Decorate 53(gl_SubGroupSizeARB) Volatile
+                              Decorate 53(gl_SubGroupSizeARB) Coherent
+                              Decorate 58(gl_SubgroupEqMask) BuiltIn SubgroupEqMaskKHR
+                              Decorate 58(gl_SubgroupEqMask) Volatile
+                              Decorate 58(gl_SubgroupEqMask) Coherent
+                              Decorate 63(gl_WarpIDNV) BuiltIn WarpIDNV
+                              Decorate 63(gl_WarpIDNV) Volatile
+                              Decorate 63(gl_WarpIDNV) Coherent
+                              Decorate 70(localPayload) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -69,10 +91,17 @@
               47:             TypeInt 32 1
               48:     47(int) Constant 1
               49:             TypeVector 16(float) 4
-              50:             TypePointer RayPayloadKHR 49(fvec4)
-51(localPayload):     50(ptr) Variable RayPayloadKHR
-              52:             TypePointer IncomingRayPayloadKHR 49(fvec4)
-53(incomingPayload):     52(ptr) Variable IncomingRayPayloadKHR
+              50:             TypePointer IncomingRayPayloadKHR 49(fvec4)
+51(incomingPayload):     50(ptr) Variable IncomingRayPayloadKHR
+              52:             TypePointer Input 6(int)
+53(gl_SubGroupSizeARB):     52(ptr) Variable Input
+              56:             TypeVector 6(int) 4
+              57:             TypePointer Input 56(ivec4)
+58(gl_SubgroupEqMask):     57(ptr) Variable Input
+ 63(gl_WarpIDNV):     52(ptr) Variable Input
+              67:             TypePointer IncomingRayPayloadKHR 16(float)
+              69:             TypePointer RayPayloadKHR 49(fvec4)
+70(localPayload):     69(ptr) Variable RayPayloadKHR
          4(main):           2 Function None 3
                5:             Label
            9(v0):      8(ptr) Variable Function
@@ -94,6 +123,17 @@
               33:   16(float) Load 32(gl_RayTmaxEXT)
                               Store 31(v5) 33
               37:          34 Load 36(accEXT)
-                              TraceRayKHR 37 38 39 40 41 38 43 42 45 46 48
+                              TraceRayKHR 37 38 39 40 41 38 43 42 45 46 51(incomingPayload)
+              54:      6(int) Load 53(gl_SubGroupSizeARB)
+              55:   16(float) ConvertUToF 54
+              59:   56(ivec4) Load 58(gl_SubgroupEqMask)
+              60:   49(fvec4) ConvertUToF 59
+              61:   16(float) CompositeExtract 60 0
+              62:   16(float) FAdd 55 61
+              64:      6(int) Load 63(gl_WarpIDNV)
+              65:   16(float) ConvertUToF 64
+              66:   16(float) FAdd 62 65
+              68:     67(ptr) AccessChain 51(incomingPayload) 38
+                              Store 68 66
                               Return
                               FunctionEnd
diff --git a/third_party/glslang/src/Test/baseResults/spv.ext.MissShader_Errors.rmiss.out b/third_party/glslang/src/Test/baseResults/spv.ext.MissShader_Errors.rmiss.out
index 929a2a7..50d3c83 100644
--- a/third_party/glslang/src/Test/baseResults/spv.ext.MissShader_Errors.rmiss.out
+++ b/third_party/glslang/src/Test/baseResults/spv.ext.MissShader_Errors.rmiss.out
@@ -13,8 +13,8 @@
 ERROR: 0:11: 'gl_HitTEXT' : undeclared identifier 
 ERROR: 0:12: 'gl_HitKindEXT' : undeclared identifier 
 ERROR: 0:13: 'reportIntersectionEXT' : no matching overloaded function found 
-ERROR: 0:14: 'ignoreIntersectionEXT' : no matching overloaded function found 
-ERROR: 0:15: 'terminateRayEXT' : no matching overloaded function found 
+ERROR: 0:14: 'ignoreIntersectionEXT' : not supported in this stage: miss
+ERROR: 0:15: 'terminateRayEXT' : not supported in this stage: miss
 ERROR: 16 compilation errors.  No code generated.
 
 
diff --git a/third_party/glslang/src/Test/baseResults/spv.ext.RayCallable.rcall.out b/third_party/glslang/src/Test/baseResults/spv.ext.RayCallable.rcall.out
index e87b5fa..d429116 100644
--- a/third_party/glslang/src/Test/baseResults/spv.ext.RayCallable.rcall.out
+++ b/third_party/glslang/src/Test/baseResults/spv.ext.RayCallable.rcall.out
@@ -3,7 +3,7 @@
 // Generated by (magic number): 8000a
 // Id's are bound by 30
 
-                              Capability RayTracingProvisionalKHR
+                              Capability RayTracingKHR
                               Extension  "SPV_KHR_ray_tracing"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
@@ -55,6 +55,6 @@
                               Store 13(size) 15
               23:     22(ptr) AccessChain 18 20
                               Store 23 21
-                              ExecuteCallableKHR 24 25
+                              ExecuteCallableKHR 24 18
                               Return
                               FunctionEnd
diff --git a/third_party/glslang/src/Test/baseResults/spv.ext.RayCallable_Errors.rcall.out b/third_party/glslang/src/Test/baseResults/spv.ext.RayCallable_Errors.rcall.out
index 4699342..e623874 100644
--- a/third_party/glslang/src/Test/baseResults/spv.ext.RayCallable_Errors.rcall.out
+++ b/third_party/glslang/src/Test/baseResults/spv.ext.RayCallable_Errors.rcall.out
@@ -2,34 +2,36 @@
 ERROR: 0:3: 'hitAttributeEXT' : not supported in this stage: callable
 ERROR: 0:4: 'rayPayloadEXT' : not supported in this stage: callable
 ERROR: 0:5: 'rayPayloadInEXT' : not supported in this stage: callable
-ERROR: 0:9: 'gl_PrimitiveID' : undeclared identifier 
-ERROR: 0:9: '=' :  cannot convert from ' temp float' to ' temp highp int'
-ERROR: 0:10: 'gl_InstanceID' : undeclared identifier (Did you mean gl_InstanceIndex?)
+ERROR: 0:7: 'location' : overlapping use of location 0
+ERROR: 0:10: 'gl_PrimitiveID' : undeclared identifier 
 ERROR: 0:10: '=' :  cannot convert from ' temp float' to ' temp highp int'
-ERROR: 0:11: 'gl_InstanceCustomIndexEXT' : undeclared identifier 
+ERROR: 0:11: 'gl_InstanceID' : undeclared identifier (Did you mean gl_InstanceIndex?)
 ERROR: 0:11: '=' :  cannot convert from ' temp float' to ' temp highp int'
-ERROR: 0:12: 'gl_WorldRayOriginEXT' : undeclared identifier 
-ERROR: 0:12: '=' :  cannot convert from ' temp float' to ' temp highp 3-component vector of float'
-ERROR: 0:13: 'gl_WorldRayDirectionEXT' : undeclared identifier 
+ERROR: 0:12: 'gl_InstanceCustomIndexEXT' : undeclared identifier 
+ERROR: 0:12: '=' :  cannot convert from ' temp float' to ' temp highp int'
+ERROR: 0:13: 'gl_WorldRayOriginEXT' : undeclared identifier 
 ERROR: 0:13: '=' :  cannot convert from ' temp float' to ' temp highp 3-component vector of float'
-ERROR: 0:14: 'gl_ObjectRayOriginEXT' : undeclared identifier 
+ERROR: 0:14: 'gl_WorldRayDirectionEXT' : undeclared identifier 
 ERROR: 0:14: '=' :  cannot convert from ' temp float' to ' temp highp 3-component vector of float'
-ERROR: 0:15: 'gl_ObjectRayDirectionEXT' : undeclared identifier 
+ERROR: 0:15: 'gl_ObjectRayOriginEXT' : undeclared identifier 
 ERROR: 0:15: '=' :  cannot convert from ' temp float' to ' temp highp 3-component vector of float'
-ERROR: 0:16: 'gl_RayTminEXT' : undeclared identifier 
-ERROR: 0:17: 'gl_RayTmaxEXT' : undeclared identifier 
-ERROR: 0:18: 'gl_ObjectToWorldEXT' : undeclared identifier 
-ERROR: 0:18: '=' :  cannot convert from ' temp float' to ' temp highp 4X3 matrix of float'
-ERROR: 0:19: 'gl_WorldToObjectEXT' : undeclared identifier 
+ERROR: 0:16: 'gl_ObjectRayDirectionEXT' : undeclared identifier 
+ERROR: 0:16: '=' :  cannot convert from ' temp float' to ' temp highp 3-component vector of float'
+ERROR: 0:17: 'gl_RayTminEXT' : undeclared identifier 
+ERROR: 0:18: 'gl_RayTmaxEXT' : undeclared identifier 
+ERROR: 0:19: 'gl_ObjectToWorldEXT' : undeclared identifier 
 ERROR: 0:19: '=' :  cannot convert from ' temp float' to ' temp highp 4X3 matrix of float'
-ERROR: 0:20: 'gl_HitTEXT' : undeclared identifier 
-ERROR: 0:21: 'gl_HitKindEXT' : undeclared identifier 
-ERROR: 0:22: 'gl_IncomingRayFlagsEXT' : undeclared identifier 
-ERROR: 0:22: '=' :  cannot convert from ' temp float' to ' temp highp uint'
-ERROR: 0:23: 'reportIntersectionEXT' : no matching overloaded function found 
-ERROR: 0:24: 'ignoreIntersectionEXT' : no matching overloaded function found 
-ERROR: 0:25: 'terminateRayEXT' : no matching overloaded function found 
-ERROR: 30 compilation errors.  No code generated.
+ERROR: 0:20: 'gl_WorldToObjectEXT' : undeclared identifier 
+ERROR: 0:20: '=' :  cannot convert from ' temp float' to ' temp highp 4X3 matrix of float'
+ERROR: 0:21: 'gl_HitTEXT' : undeclared identifier 
+ERROR: 0:22: 'gl_HitKindEXT' : undeclared identifier 
+ERROR: 0:23: 'gl_IncomingRayFlagsEXT' : undeclared identifier 
+ERROR: 0:23: '=' :  cannot convert from ' temp float' to ' temp highp uint'
+ERROR: 0:24: 'reportIntersectionEXT' : no matching overloaded function found 
+ERROR: 0:25: 'ignoreIntersectionEXT' : not supported in this stage: callable
+ERROR: 0:26: 'terminateRayEXT' : not supported in this stage: callable
+ERROR: 0:27: 'no callableDataEXT/callableDataInEXT declared' : with layout(location = 1)
+ERROR: 32 compilation errors.  No code generated.
 
 
 SPIR-V is not generated for failed compile or link
diff --git a/third_party/glslang/src/Test/baseResults/spv.ext.RayConstants.rgen.out b/third_party/glslang/src/Test/baseResults/spv.ext.RayConstants.rgen.out
index 5d7079a..afd5083 100644
--- a/third_party/glslang/src/Test/baseResults/spv.ext.RayConstants.rgen.out
+++ b/third_party/glslang/src/Test/baseResults/spv.ext.RayConstants.rgen.out
@@ -3,7 +3,7 @@
 // Generated by (magic number): 8000a
 // Id's are bound by 27
 
-                              Capability RayTracingProvisionalKHR
+                              Capability RayTracingKHR
                               Extension  "SPV_KHR_ray_tracing"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
@@ -15,7 +15,7 @@
                               Name 26  "payload"
                               Decorate 8(accEXT) DescriptorSet 0
                               Decorate 8(accEXT) Binding 0
-                              Decorate 26(payload) Location 0
+                              Decorate 26(payload) Location 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeAccelerationStructureKHR
@@ -41,6 +41,6 @@
          4(main):           2 Function None 3
                5:             Label
                9:           6 Load 8(accEXT)
-                              TraceRayKHR 9 11 12 13 13 12 17 18 20 21 23
+                              TraceRayKHR 9 11 12 13 13 12 17 18 20 21 26(payload)
                               Return
                               FunctionEnd
diff --git a/third_party/glslang/src/Test/baseResults/spv.ext.RayGenSBTlayout.rgen.out b/third_party/glslang/src/Test/baseResults/spv.ext.RayGenSBTlayout.rgen.out
new file mode 100644
index 0000000..60b5e93
--- /dev/null
+++ b/third_party/glslang/src/Test/baseResults/spv.ext.RayGenSBTlayout.rgen.out
@@ -0,0 +1,134 @@
+spv.ext.RayGenSBTlayout.rgen
+// Module Version 10400
+// Generated by (magic number): 8000a
+// Id's are bound by 74
+
+                              Capability Int64
+                              Capability RayTracingKHR
+                              Extension  "SPV_KHR_ray_tracing"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint RayGenerationKHR 4  "main" 11 21 38 60
+                              Source GLSL 460
+                              SourceExtension  "GL_ARB_gpu_shader_int64"
+                              SourceExtension  "GL_EXT_ray_tracing"
+                              Name 4  "main"
+                              Name 8  "lx"
+                              Name 11  "gl_LaunchIDEXT"
+                              Name 16  "ly"
+                              Name 20  "sx"
+                              Name 21  "gl_LaunchSizeEXT"
+                              Name 24  "sy"
+                              Name 36  "block"
+                              MemberName 36(block) 0  "dir"
+                              MemberName 36(block) 1  "origin"
+                              MemberName 36(block) 2  "i"
+                              MemberName 36(block) 3  "aHandle32"
+                              MemberName 36(block) 4  "aHandle64"
+                              MemberName 36(block) 5  "arr2"
+                              MemberName 36(block) 6  "a"
+                              MemberName 36(block) 7  "arr3"
+                              MemberName 36(block) 8  "packme"
+                              MemberName 36(block) 9  "b"
+                              MemberName 36(block) 10  "c"
+                              Name 38  ""
+                              Name 60  "payload"
+                              Decorate 11(gl_LaunchIDEXT) BuiltIn LaunchIdKHR
+                              Decorate 21(gl_LaunchSizeEXT) BuiltIn LaunchSizeKHR
+                              Decorate 34 ArrayStride 8
+                              Decorate 35 ArrayStride 16
+                              MemberDecorate 36(block) 0 Offset 0
+                              MemberDecorate 36(block) 1 Offset 16
+                              MemberDecorate 36(block) 2 Offset 28
+                              MemberDecorate 36(block) 3 Offset 32
+                              MemberDecorate 36(block) 4 Offset 40
+                              MemberDecorate 36(block) 5 Offset 48
+                              MemberDecorate 36(block) 6 Offset 64
+                              MemberDecorate 36(block) 7 Offset 80
+                              MemberDecorate 36(block) 8 Offset 112
+                              MemberDecorate 36(block) 9 Offset 120
+                              MemberDecorate 36(block) 10 Offset 128
+                              Decorate 36(block) Block
+                              Decorate 38 DescriptorSet 0
+                              Decorate 38 Binding 0
+                              Decorate 60(payload) Location 1
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypePointer Function 6(int)
+               9:             TypeVector 6(int) 3
+              10:             TypePointer Input 9(ivec3)
+11(gl_LaunchIDEXT):     10(ptr) Variable Input
+              12:      6(int) Constant 0
+              13:             TypePointer Input 6(int)
+              17:      6(int) Constant 1
+21(gl_LaunchSizeEXT):     10(ptr) Variable Input
+              27:             TypeFloat 32
+              28:             TypeVector 27(float) 3
+              29:             TypeInt 32 1
+              30:             TypeVector 6(int) 2
+              31:             TypeInt 64 0
+              32:             TypeVector 27(float) 2
+              33:      6(int) Constant 2
+              34:             TypeArray 32(fvec2) 33
+              35:             TypeArray 28(fvec3) 33
+       36(block):             TypeStruct 28(fvec3) 28(fvec3) 29(int) 30(ivec2) 31(int64_t) 34 27(float) 35 27(float) 32(fvec2) 27(float)
+              37:             TypePointer ShaderRecordBufferKHR 36(block)
+              38:     37(ptr) Variable ShaderRecordBufferKHR
+              39:     29(int) Constant 3
+              40:             TypePointer ShaderRecordBufferKHR 30(ivec2)
+              43:             TypeAccelerationStructureKHR
+              49:     29(int) Constant 1
+              50:             TypePointer ShaderRecordBufferKHR 28(fvec3)
+              53:   27(float) Constant 1056964608
+              54:     29(int) Constant 0
+              57:   27(float) Constant 1061158912
+              58:             TypeVector 27(float) 4
+              59:             TypePointer RayPayloadKHR 58(fvec4)
+     60(payload):     59(ptr) Variable RayPayloadKHR
+              61:     29(int) Constant 4
+              62:             TypePointer ShaderRecordBufferKHR 31(int64_t)
+         4(main):           2 Function None 3
+               5:             Label
+           8(lx):      7(ptr) Variable Function
+          16(ly):      7(ptr) Variable Function
+          20(sx):      7(ptr) Variable Function
+          24(sy):      7(ptr) Variable Function
+              14:     13(ptr) AccessChain 11(gl_LaunchIDEXT) 12
+              15:      6(int) Load 14
+                              Store 8(lx) 15
+              18:     13(ptr) AccessChain 11(gl_LaunchIDEXT) 17
+              19:      6(int) Load 18
+                              Store 16(ly) 19
+              22:     13(ptr) AccessChain 21(gl_LaunchSizeEXT) 12
+              23:      6(int) Load 22
+                              Store 20(sx) 23
+              25:     13(ptr) AccessChain 21(gl_LaunchSizeEXT) 17
+              26:      6(int) Load 25
+                              Store 24(sy) 26
+              41:     40(ptr) AccessChain 38 39
+              42:   30(ivec2) Load 41
+              44:          43 ConvertUToAccelerationStructureKHR 42
+              45:      6(int) Load 8(lx)
+              46:      6(int) Load 16(ly)
+              47:      6(int) Load 20(sx)
+              48:      6(int) Load 24(sy)
+              51:     50(ptr) AccessChain 38 49
+              52:   28(fvec3) Load 51
+              55:     50(ptr) AccessChain 38 54
+              56:   28(fvec3) Load 55
+                              TraceRayKHR 44 45 46 47 48 12 52 53 56 57 60(payload)
+              63:     62(ptr) AccessChain 38 61
+              64: 31(int64_t) Load 63
+              65:          43 ConvertUToAccelerationStructureKHR 64
+              66:      6(int) Load 8(lx)
+              67:      6(int) Load 16(ly)
+              68:      6(int) Load 20(sx)
+              69:      6(int) Load 24(sy)
+              70:     50(ptr) AccessChain 38 49
+              71:   28(fvec3) Load 70
+              72:     50(ptr) AccessChain 38 54
+              73:   28(fvec3) Load 72
+                              TraceRayKHR 65 66 67 68 69 12 71 53 73 57 60(payload)
+                              Return
+                              FunctionEnd
diff --git a/third_party/glslang/src/Test/baseResults/spv.ext.RayGenSBTlayout140.rgen.out b/third_party/glslang/src/Test/baseResults/spv.ext.RayGenSBTlayout140.rgen.out
new file mode 100644
index 0000000..cc175f7
--- /dev/null
+++ b/third_party/glslang/src/Test/baseResults/spv.ext.RayGenSBTlayout140.rgen.out
@@ -0,0 +1,134 @@
+spv.ext.RayGenSBTlayout140.rgen
+// Module Version 10400
+// Generated by (magic number): 8000a
+// Id's are bound by 74
+
+                              Capability Int64
+                              Capability RayTracingKHR
+                              Extension  "SPV_KHR_ray_tracing"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint RayGenerationKHR 4  "main" 11 21 38 60
+                              Source GLSL 460
+                              SourceExtension  "GL_ARB_gpu_shader_int64"
+                              SourceExtension  "GL_EXT_ray_tracing"
+                              Name 4  "main"
+                              Name 8  "lx"
+                              Name 11  "gl_LaunchIDEXT"
+                              Name 16  "ly"
+                              Name 20  "sx"
+                              Name 21  "gl_LaunchSizeEXT"
+                              Name 24  "sy"
+                              Name 36  "block"
+                              MemberName 36(block) 0  "dir"
+                              MemberName 36(block) 1  "origin"
+                              MemberName 36(block) 2  "i"
+                              MemberName 36(block) 3  "aHandle32"
+                              MemberName 36(block) 4  "aHandle64"
+                              MemberName 36(block) 5  "arr"
+                              MemberName 36(block) 6  "a"
+                              MemberName 36(block) 7  "arr3"
+                              MemberName 36(block) 8  "packme"
+                              MemberName 36(block) 9  "b"
+                              MemberName 36(block) 10  "c"
+                              Name 38  ""
+                              Name 60  "payload"
+                              Decorate 11(gl_LaunchIDEXT) BuiltIn LaunchIdKHR
+                              Decorate 21(gl_LaunchSizeEXT) BuiltIn LaunchSizeKHR
+                              Decorate 34 ArrayStride 16
+                              Decorate 35 ArrayStride 16
+                              MemberDecorate 36(block) 0 Offset 0
+                              MemberDecorate 36(block) 1 Offset 16
+                              MemberDecorate 36(block) 2 Offset 28
+                              MemberDecorate 36(block) 3 Offset 32
+                              MemberDecorate 36(block) 4 Offset 40
+                              MemberDecorate 36(block) 5 Offset 48
+                              MemberDecorate 36(block) 6 Offset 80
+                              MemberDecorate 36(block) 7 Offset 96
+                              MemberDecorate 36(block) 8 Offset 128
+                              MemberDecorate 36(block) 9 Offset 136
+                              MemberDecorate 36(block) 10 Offset 144
+                              Decorate 36(block) Block
+                              Decorate 38 DescriptorSet 0
+                              Decorate 38 Binding 0
+                              Decorate 60(payload) Location 1
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypePointer Function 6(int)
+               9:             TypeVector 6(int) 3
+              10:             TypePointer Input 9(ivec3)
+11(gl_LaunchIDEXT):     10(ptr) Variable Input
+              12:      6(int) Constant 0
+              13:             TypePointer Input 6(int)
+              17:      6(int) Constant 1
+21(gl_LaunchSizeEXT):     10(ptr) Variable Input
+              27:             TypeFloat 32
+              28:             TypeVector 27(float) 3
+              29:             TypeInt 32 1
+              30:             TypeVector 6(int) 2
+              31:             TypeInt 64 0
+              32:             TypeVector 27(float) 2
+              33:      6(int) Constant 2
+              34:             TypeArray 32(fvec2) 33
+              35:             TypeArray 28(fvec3) 33
+       36(block):             TypeStruct 28(fvec3) 28(fvec3) 29(int) 30(ivec2) 31(int64_t) 34 27(float) 35 27(float) 32(fvec2) 27(float)
+              37:             TypePointer ShaderRecordBufferKHR 36(block)
+              38:     37(ptr) Variable ShaderRecordBufferKHR
+              39:     29(int) Constant 3
+              40:             TypePointer ShaderRecordBufferKHR 30(ivec2)
+              43:             TypeAccelerationStructureKHR
+              49:     29(int) Constant 1
+              50:             TypePointer ShaderRecordBufferKHR 28(fvec3)
+              53:   27(float) Constant 1056964608
+              54:     29(int) Constant 0
+              57:   27(float) Constant 1061158912
+              58:             TypeVector 27(float) 4
+              59:             TypePointer RayPayloadKHR 58(fvec4)
+     60(payload):     59(ptr) Variable RayPayloadKHR
+              61:     29(int) Constant 4
+              62:             TypePointer ShaderRecordBufferKHR 31(int64_t)
+         4(main):           2 Function None 3
+               5:             Label
+           8(lx):      7(ptr) Variable Function
+          16(ly):      7(ptr) Variable Function
+          20(sx):      7(ptr) Variable Function
+          24(sy):      7(ptr) Variable Function
+              14:     13(ptr) AccessChain 11(gl_LaunchIDEXT) 12
+              15:      6(int) Load 14
+                              Store 8(lx) 15
+              18:     13(ptr) AccessChain 11(gl_LaunchIDEXT) 17
+              19:      6(int) Load 18
+                              Store 16(ly) 19
+              22:     13(ptr) AccessChain 21(gl_LaunchSizeEXT) 12
+              23:      6(int) Load 22
+                              Store 20(sx) 23
+              25:     13(ptr) AccessChain 21(gl_LaunchSizeEXT) 17
+              26:      6(int) Load 25
+                              Store 24(sy) 26
+              41:     40(ptr) AccessChain 38 39
+              42:   30(ivec2) Load 41
+              44:          43 ConvertUToAccelerationStructureKHR 42
+              45:      6(int) Load 8(lx)
+              46:      6(int) Load 16(ly)
+              47:      6(int) Load 20(sx)
+              48:      6(int) Load 24(sy)
+              51:     50(ptr) AccessChain 38 49
+              52:   28(fvec3) Load 51
+              55:     50(ptr) AccessChain 38 54
+              56:   28(fvec3) Load 55
+                              TraceRayKHR 44 45 46 47 48 12 52 53 56 57 60(payload)
+              63:     62(ptr) AccessChain 38 61
+              64: 31(int64_t) Load 63
+              65:          43 ConvertUToAccelerationStructureKHR 64
+              66:      6(int) Load 8(lx)
+              67:      6(int) Load 16(ly)
+              68:      6(int) Load 20(sx)
+              69:      6(int) Load 24(sy)
+              70:     50(ptr) AccessChain 38 49
+              71:   28(fvec3) Load 70
+              72:     50(ptr) AccessChain 38 54
+              73:   28(fvec3) Load 72
+                              TraceRayKHR 65 66 67 68 69 12 71 53 73 57 60(payload)
+                              Return
+                              FunctionEnd
diff --git a/third_party/glslang/src/Test/baseResults/spv.ext.RayGenSBTlayout430.rgen.out b/third_party/glslang/src/Test/baseResults/spv.ext.RayGenSBTlayout430.rgen.out
new file mode 100644
index 0000000..afcfa9c
--- /dev/null
+++ b/third_party/glslang/src/Test/baseResults/spv.ext.RayGenSBTlayout430.rgen.out
@@ -0,0 +1,134 @@
+spv.ext.RayGenSBTlayout430.rgen
+// Module Version 10400
+// Generated by (magic number): 8000a
+// Id's are bound by 74
+
+                              Capability Int64
+                              Capability RayTracingKHR
+                              Extension  "SPV_KHR_ray_tracing"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint RayGenerationKHR 4  "main" 11 21 38 60
+                              Source GLSL 460
+                              SourceExtension  "GL_ARB_gpu_shader_int64"
+                              SourceExtension  "GL_EXT_ray_tracing"
+                              Name 4  "main"
+                              Name 8  "lx"
+                              Name 11  "gl_LaunchIDEXT"
+                              Name 16  "ly"
+                              Name 20  "sx"
+                              Name 21  "gl_LaunchSizeEXT"
+                              Name 24  "sy"
+                              Name 36  "block"
+                              MemberName 36(block) 0  "dir"
+                              MemberName 36(block) 1  "origin"
+                              MemberName 36(block) 2  "i"
+                              MemberName 36(block) 3  "aHandle32"
+                              MemberName 36(block) 4  "aHandle64"
+                              MemberName 36(block) 5  "arr"
+                              MemberName 36(block) 6  "a"
+                              MemberName 36(block) 7  "arr3"
+                              MemberName 36(block) 8  "packme"
+                              MemberName 36(block) 9  "b"
+                              MemberName 36(block) 10  "c"
+                              Name 38  ""
+                              Name 60  "payload"
+                              Decorate 11(gl_LaunchIDEXT) BuiltIn LaunchIdKHR
+                              Decorate 21(gl_LaunchSizeEXT) BuiltIn LaunchSizeKHR
+                              Decorate 34 ArrayStride 8
+                              Decorate 35 ArrayStride 16
+                              MemberDecorate 36(block) 0 Offset 0
+                              MemberDecorate 36(block) 1 Offset 16
+                              MemberDecorate 36(block) 2 Offset 28
+                              MemberDecorate 36(block) 3 Offset 32
+                              MemberDecorate 36(block) 4 Offset 40
+                              MemberDecorate 36(block) 5 Offset 48
+                              MemberDecorate 36(block) 6 Offset 64
+                              MemberDecorate 36(block) 7 Offset 80
+                              MemberDecorate 36(block) 8 Offset 112
+                              MemberDecorate 36(block) 9 Offset 120
+                              MemberDecorate 36(block) 10 Offset 128
+                              Decorate 36(block) Block
+                              Decorate 38 DescriptorSet 0
+                              Decorate 38 Binding 0
+                              Decorate 60(payload) Location 1
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypePointer Function 6(int)
+               9:             TypeVector 6(int) 3
+              10:             TypePointer Input 9(ivec3)
+11(gl_LaunchIDEXT):     10(ptr) Variable Input
+              12:      6(int) Constant 0
+              13:             TypePointer Input 6(int)
+              17:      6(int) Constant 1
+21(gl_LaunchSizeEXT):     10(ptr) Variable Input
+              27:             TypeFloat 32
+              28:             TypeVector 27(float) 3
+              29:             TypeInt 32 1
+              30:             TypeVector 6(int) 2
+              31:             TypeInt 64 0
+              32:             TypeVector 27(float) 2
+              33:      6(int) Constant 2
+              34:             TypeArray 32(fvec2) 33
+              35:             TypeArray 28(fvec3) 33
+       36(block):             TypeStruct 28(fvec3) 28(fvec3) 29(int) 30(ivec2) 31(int64_t) 34 27(float) 35 27(float) 32(fvec2) 27(float)
+              37:             TypePointer ShaderRecordBufferKHR 36(block)
+              38:     37(ptr) Variable ShaderRecordBufferKHR
+              39:     29(int) Constant 3
+              40:             TypePointer ShaderRecordBufferKHR 30(ivec2)
+              43:             TypeAccelerationStructureKHR
+              49:     29(int) Constant 1
+              50:             TypePointer ShaderRecordBufferKHR 28(fvec3)
+              53:   27(float) Constant 1056964608
+              54:     29(int) Constant 0
+              57:   27(float) Constant 1061158912
+              58:             TypeVector 27(float) 4
+              59:             TypePointer RayPayloadKHR 58(fvec4)
+     60(payload):     59(ptr) Variable RayPayloadKHR
+              61:     29(int) Constant 4
+              62:             TypePointer ShaderRecordBufferKHR 31(int64_t)
+         4(main):           2 Function None 3
+               5:             Label
+           8(lx):      7(ptr) Variable Function
+          16(ly):      7(ptr) Variable Function
+          20(sx):      7(ptr) Variable Function
+          24(sy):      7(ptr) Variable Function
+              14:     13(ptr) AccessChain 11(gl_LaunchIDEXT) 12
+              15:      6(int) Load 14
+                              Store 8(lx) 15
+              18:     13(ptr) AccessChain 11(gl_LaunchIDEXT) 17
+              19:      6(int) Load 18
+                              Store 16(ly) 19
+              22:     13(ptr) AccessChain 21(gl_LaunchSizeEXT) 12
+              23:      6(int) Load 22
+                              Store 20(sx) 23
+              25:     13(ptr) AccessChain 21(gl_LaunchSizeEXT) 17
+              26:      6(int) Load 25
+                              Store 24(sy) 26
+              41:     40(ptr) AccessChain 38 39
+              42:   30(ivec2) Load 41
+              44:          43 ConvertUToAccelerationStructureKHR 42
+              45:      6(int) Load 8(lx)
+              46:      6(int) Load 16(ly)
+              47:      6(int) Load 20(sx)
+              48:      6(int) Load 24(sy)
+              51:     50(ptr) AccessChain 38 49
+              52:   28(fvec3) Load 51
+              55:     50(ptr) AccessChain 38 54
+              56:   28(fvec3) Load 55
+                              TraceRayKHR 44 45 46 47 48 12 52 53 56 57 60(payload)
+              63:     62(ptr) AccessChain 38 61
+              64: 31(int64_t) Load 63
+              65:          43 ConvertUToAccelerationStructureKHR 64
+              66:      6(int) Load 8(lx)
+              67:      6(int) Load 16(ly)
+              68:      6(int) Load 20(sx)
+              69:      6(int) Load 24(sy)
+              70:     50(ptr) AccessChain 38 49
+              71:   28(fvec3) Load 70
+              72:     50(ptr) AccessChain 38 54
+              73:   28(fvec3) Load 72
+                              TraceRayKHR 65 66 67 68 69 12 71 53 73 57 60(payload)
+                              Return
+                              FunctionEnd
diff --git a/third_party/glslang/src/Test/baseResults/spv.ext.RayGenSBTlayoutscalar.rgen.out b/third_party/glslang/src/Test/baseResults/spv.ext.RayGenSBTlayoutscalar.rgen.out
new file mode 100644
index 0000000..eac481a
--- /dev/null
+++ b/third_party/glslang/src/Test/baseResults/spv.ext.RayGenSBTlayoutscalar.rgen.out
@@ -0,0 +1,135 @@
+spv.ext.RayGenSBTlayoutscalar.rgen
+// Module Version 10400
+// Generated by (magic number): 8000a
+// Id's are bound by 74
+
+                              Capability Int64
+                              Capability RayTracingKHR
+                              Extension  "SPV_KHR_ray_tracing"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint RayGenerationKHR 4  "main" 11 21 38 60
+                              Source GLSL 460
+                              SourceExtension  "GL_ARB_gpu_shader_int64"
+                              SourceExtension  "GL_EXT_ray_tracing"
+                              SourceExtension  "GL_EXT_scalar_block_layout"
+                              Name 4  "main"
+                              Name 8  "lx"
+                              Name 11  "gl_LaunchIDEXT"
+                              Name 16  "ly"
+                              Name 20  "sx"
+                              Name 21  "gl_LaunchSizeEXT"
+                              Name 24  "sy"
+                              Name 36  "block"
+                              MemberName 36(block) 0  "dir"
+                              MemberName 36(block) 1  "origin"
+                              MemberName 36(block) 2  "i"
+                              MemberName 36(block) 3  "aHandle32"
+                              MemberName 36(block) 4  "aHandle64"
+                              MemberName 36(block) 5  "arr"
+                              MemberName 36(block) 6  "a"
+                              MemberName 36(block) 7  "arr3"
+                              MemberName 36(block) 8  "packme"
+                              MemberName 36(block) 9  "b"
+                              MemberName 36(block) 10  "c"
+                              Name 38  ""
+                              Name 60  "payload"
+                              Decorate 11(gl_LaunchIDEXT) BuiltIn LaunchIdKHR
+                              Decorate 21(gl_LaunchSizeEXT) BuiltIn LaunchSizeKHR
+                              Decorate 34 ArrayStride 8
+                              Decorate 35 ArrayStride 12
+                              MemberDecorate 36(block) 0 Offset 0
+                              MemberDecorate 36(block) 1 Offset 12
+                              MemberDecorate 36(block) 2 Offset 24
+                              MemberDecorate 36(block) 3 Offset 28
+                              MemberDecorate 36(block) 4 Offset 40
+                              MemberDecorate 36(block) 5 Offset 48
+                              MemberDecorate 36(block) 6 Offset 64
+                              MemberDecorate 36(block) 7 Offset 68
+                              MemberDecorate 36(block) 8 Offset 92
+                              MemberDecorate 36(block) 9 Offset 96
+                              MemberDecorate 36(block) 10 Offset 104
+                              Decorate 36(block) Block
+                              Decorate 38 DescriptorSet 0
+                              Decorate 38 Binding 0
+                              Decorate 60(payload) Location 1
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypePointer Function 6(int)
+               9:             TypeVector 6(int) 3
+              10:             TypePointer Input 9(ivec3)
+11(gl_LaunchIDEXT):     10(ptr) Variable Input
+              12:      6(int) Constant 0
+              13:             TypePointer Input 6(int)
+              17:      6(int) Constant 1
+21(gl_LaunchSizeEXT):     10(ptr) Variable Input
+              27:             TypeFloat 32
+              28:             TypeVector 27(float) 3
+              29:             TypeInt 32 1
+              30:             TypeVector 6(int) 2
+              31:             TypeInt 64 0
+              32:             TypeVector 27(float) 2
+              33:      6(int) Constant 2
+              34:             TypeArray 32(fvec2) 33
+              35:             TypeArray 28(fvec3) 33
+       36(block):             TypeStruct 28(fvec3) 28(fvec3) 29(int) 30(ivec2) 31(int64_t) 34 27(float) 35 27(float) 32(fvec2) 27(float)
+              37:             TypePointer ShaderRecordBufferKHR 36(block)
+              38:     37(ptr) Variable ShaderRecordBufferKHR
+              39:     29(int) Constant 3
+              40:             TypePointer ShaderRecordBufferKHR 30(ivec2)
+              43:             TypeAccelerationStructureKHR
+              49:     29(int) Constant 1
+              50:             TypePointer ShaderRecordBufferKHR 28(fvec3)
+              53:   27(float) Constant 1056964608
+              54:     29(int) Constant 0
+              57:   27(float) Constant 1061158912
+              58:             TypeVector 27(float) 4
+              59:             TypePointer RayPayloadKHR 58(fvec4)
+     60(payload):     59(ptr) Variable RayPayloadKHR
+              61:     29(int) Constant 4
+              62:             TypePointer ShaderRecordBufferKHR 31(int64_t)
+         4(main):           2 Function None 3
+               5:             Label
+           8(lx):      7(ptr) Variable Function
+          16(ly):      7(ptr) Variable Function
+          20(sx):      7(ptr) Variable Function
+          24(sy):      7(ptr) Variable Function
+              14:     13(ptr) AccessChain 11(gl_LaunchIDEXT) 12
+              15:      6(int) Load 14
+                              Store 8(lx) 15
+              18:     13(ptr) AccessChain 11(gl_LaunchIDEXT) 17
+              19:      6(int) Load 18
+                              Store 16(ly) 19
+              22:     13(ptr) AccessChain 21(gl_LaunchSizeEXT) 12
+              23:      6(int) Load 22
+                              Store 20(sx) 23
+              25:     13(ptr) AccessChain 21(gl_LaunchSizeEXT) 17
+              26:      6(int) Load 25
+                              Store 24(sy) 26
+              41:     40(ptr) AccessChain 38 39
+              42:   30(ivec2) Load 41
+              44:          43 ConvertUToAccelerationStructureKHR 42
+              45:      6(int) Load 8(lx)
+              46:      6(int) Load 16(ly)
+              47:      6(int) Load 20(sx)
+              48:      6(int) Load 24(sy)
+              51:     50(ptr) AccessChain 38 49
+              52:   28(fvec3) Load 51
+              55:     50(ptr) AccessChain 38 54
+              56:   28(fvec3) Load 55
+                              TraceRayKHR 44 45 46 47 48 12 52 53 56 57 60(payload)
+              63:     62(ptr) AccessChain 38 61
+              64: 31(int64_t) Load 63
+              65:          43 ConvertUToAccelerationStructureKHR 64
+              66:      6(int) Load 8(lx)
+              67:      6(int) Load 16(ly)
+              68:      6(int) Load 20(sx)
+              69:      6(int) Load 24(sy)
+              70:     50(ptr) AccessChain 38 49
+              71:   28(fvec3) Load 70
+              72:     50(ptr) AccessChain 38 54
+              73:   28(fvec3) Load 72
+                              TraceRayKHR 65 66 67 68 69 12 71 53 73 57 60(payload)
+                              Return
+                              FunctionEnd
diff --git a/third_party/glslang/src/Test/baseResults/spv.ext.RayGenShader.rgen.out b/third_party/glslang/src/Test/baseResults/spv.ext.RayGenShader.rgen.out
index b1904ac..da516f3 100644
--- a/third_party/glslang/src/Test/baseResults/spv.ext.RayGenShader.rgen.out
+++ b/third_party/glslang/src/Test/baseResults/spv.ext.RayGenShader.rgen.out
@@ -3,12 +3,12 @@
 // Generated by (magic number): 8000a
 // Id's are bound by 58
 
-                              Capability RayTraversalPrimitiveCullingProvisionalKHR
-                              Capability RayTracingProvisionalKHR
+                              Capability RayTraversalPrimitiveCullingKHR
+                              Capability RayTracingKHR
                               Extension  "SPV_KHR_ray_tracing"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint RayGenerationKHR 4  "main" 11 21 29 40 51 54 57
+                              EntryPoint RayGenerationKHR 4  "main" 11 21 29 40 53 54 57
                               Source GLSL 460
                               SourceExtension  "GL_EXT_ray_flags_primitive_culling"
                               SourceExtension  "GL_EXT_ray_tracing"
@@ -24,9 +24,9 @@
                               MemberName 38(block) 0  "dir"
                               MemberName 38(block) 1  "origin"
                               Name 40  ""
-                              Name 51  "accEXT1"
-                              Name 54  "imageu"
-                              Name 57  "payload"
+                              Name 53  "payload"
+                              Name 54  "accEXT1"
+                              Name 57  "imageu"
                               Decorate 11(gl_LaunchIDEXT) BuiltIn LaunchIdKHR
                               Decorate 21(gl_LaunchSizeEXT) BuiltIn LaunchSizeKHR
                               Decorate 29(accEXT0) DescriptorSet 0
@@ -36,11 +36,11 @@
                               Decorate 38(block) Block
                               Decorate 40 DescriptorSet 0
                               Decorate 40 Binding 3
-                              Decorate 51(accEXT1) DescriptorSet 0
-                              Decorate 51(accEXT1) Binding 1
-                              Decorate 54(imageu) DescriptorSet 0
-                              Decorate 54(imageu) Binding 2
-                              Decorate 57(payload) Location 0
+                              Decorate 53(payload) Location 1
+                              Decorate 54(accEXT1) DescriptorSet 0
+                              Decorate 54(accEXT1) Binding 1
+                              Decorate 57(imageu) DescriptorSet 0
+                              Decorate 57(imageu) Binding 2
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -67,13 +67,13 @@
               46:   36(float) Constant 1056964608
               47:     41(int) Constant 0
               50:   36(float) Constant 1061158912
-     51(accEXT1):     28(ptr) Variable UniformConstant
-              52:             TypeImage 6(int) 2D nonsampled format:R32ui
-              53:             TypePointer UniformConstant 52
-      54(imageu):     53(ptr) Variable UniformConstant
-              55:             TypeVector 36(float) 4
-              56:             TypePointer RayPayloadKHR 55(fvec4)
-     57(payload):     56(ptr) Variable RayPayloadKHR
+              51:             TypeVector 36(float) 4
+              52:             TypePointer RayPayloadKHR 51(fvec4)
+     53(payload):     52(ptr) Variable RayPayloadKHR
+     54(accEXT1):     28(ptr) Variable UniformConstant
+              55:             TypeImage 6(int) 2D nonsampled format:R32ui
+              56:             TypePointer UniformConstant 55
+      57(imageu):     56(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
            8(lx):      7(ptr) Variable Function
@@ -101,6 +101,6 @@
               45:   37(fvec3) Load 44
               48:     43(ptr) AccessChain 40 47
               49:   37(fvec3) Load 48
-                              TraceRayKHR 30 31 32 33 34 35 45 46 49 50 42
+                              TraceRayKHR 30 31 32 33 34 35 45 46 49 50 53(payload)
                               Return
                               FunctionEnd
diff --git a/third_party/glslang/src/Test/baseResults/spv.ext.RayGenShader11.rgen.out b/third_party/glslang/src/Test/baseResults/spv.ext.RayGenShader11.rgen.out
index cfaf529..00262ac 100644
--- a/third_party/glslang/src/Test/baseResults/spv.ext.RayGenShader11.rgen.out
+++ b/third_party/glslang/src/Test/baseResults/spv.ext.RayGenShader11.rgen.out
@@ -3,7 +3,7 @@
 // Generated by (magic number): 8000a
 // Id's are bound by 53
 
-                              Capability RayTracingProvisionalKHR
+                              Capability RayTracingKHR
                               Extension  "SPV_KHR_ray_tracing"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
@@ -32,7 +32,7 @@
                               Decorate 37(block) Block
                               Decorate 39 DescriptorSet 0
                               Decorate 39 Binding 1
-                              Decorate 52(payload) Location 0
+                              Decorate 52(payload) Location 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -88,6 +88,6 @@
               44:   36(fvec3) Load 43
               47:     42(ptr) AccessChain 39 46
               48:   36(fvec3) Load 47
-                              TraceRayKHR 30 31 32 33 34 12 44 45 48 49 41
+                              TraceRayKHR 30 31 32 33 34 12 44 45 48 49 52(payload)
                               Return
                               FunctionEnd
diff --git a/third_party/glslang/src/Test/baseResults/spv.ext.RayGenShaderArray.rgen.out b/third_party/glslang/src/Test/baseResults/spv.ext.RayGenShaderArray.rgen.out
index 25d46a6..473937d 100644
--- a/third_party/glslang/src/Test/baseResults/spv.ext.RayGenShaderArray.rgen.out
+++ b/third_party/glslang/src/Test/baseResults/spv.ext.RayGenShaderArray.rgen.out
@@ -1,17 +1,19 @@
 spv.ext.RayGenShaderArray.rgen
 // Module Version 10400
 // Generated by (magic number): 8000a
-// Id's are bound by 89
+// Id's are bound by 117
 
+                              Capability Int64
+                              Capability RayTracingKHR
                               Capability ShaderNonUniformEXT
                               Capability RuntimeDescriptorArrayEXT
-                              Capability RayTracingProvisionalKHR
                               Extension  "SPV_EXT_descriptor_indexing"
                               Extension  "SPV_KHR_ray_tracing"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint RayGenerationKHR 4  "main" 11 21 30 36 60 88
+                              EntryPoint RayGenerationKHR 4  "main" 11 21 30 38 61 65
                               Source GLSL 460
+                              SourceExtension  "GL_ARB_gpu_shader_int64"
                               SourceExtension  "GL_EXT_nonuniform_qualifier"
                               SourceExtension  "GL_EXT_ray_tracing"
                               Name 4  "main"
@@ -22,29 +24,33 @@
                               Name 21  "gl_LaunchSizeEXT"
                               Name 24  "sy"
                               Name 30  "accEXT0"
-                              Name 34  "block"
-                              MemberName 34(block) 0  "dir"
-                              MemberName 34(block) 1  "origin"
-                              MemberName 34(block) 2  "i"
-                              Name 36  ""
-                              Name 60  "accEXT1"
-                              Name 88  "payload"
+                              Name 36  "block"
+                              MemberName 36(block) 0  "dir"
+                              MemberName 36(block) 1  "origin"
+                              MemberName 36(block) 2  "i"
+                              MemberName 36(block) 3  "aHandle32"
+                              MemberName 36(block) 4  "aHandle64"
+                              Name 38  ""
+                              Name 61  "payload"
+                              Name 65  "accEXT1"
                               Decorate 11(gl_LaunchIDEXT) BuiltIn LaunchIdKHR
                               Decorate 21(gl_LaunchSizeEXT) BuiltIn LaunchSizeKHR
                               Decorate 30(accEXT0) DescriptorSet 0
                               Decorate 30(accEXT0) Binding 0
-                              MemberDecorate 34(block) 0 Offset 0
-                              MemberDecorate 34(block) 1 Offset 16
-                              MemberDecorate 34(block) 2 Offset 28
-                              Decorate 34(block) Block
-                              Decorate 36 DescriptorSet 0
-                              Decorate 36 Binding 2
-                              Decorate 60(accEXT1) DescriptorSet 0
-                              Decorate 60(accEXT1) Binding 1
-                              Decorate 75 DecorationNonUniformEXT
-                              Decorate 76 DecorationNonUniformEXT
-                              Decorate 77 DecorationNonUniformEXT
-                              Decorate 88(payload) Location 0
+                              MemberDecorate 36(block) 0 Offset 0
+                              MemberDecorate 36(block) 1 Offset 16
+                              MemberDecorate 36(block) 2 Offset 28
+                              MemberDecorate 36(block) 3 Offset 32
+                              MemberDecorate 36(block) 4 Offset 40
+                              Decorate 36(block) Block
+                              Decorate 38 DescriptorSet 0
+                              Decorate 38 Binding 2
+                              Decorate 61(payload) Location 1
+                              Decorate 65(accEXT1) DescriptorSet 0
+                              Decorate 65(accEXT1) Binding 1
+                              Decorate 80 DecorationNonUniformEXT
+                              Decorate 81 DecorationNonUniformEXT
+                              Decorate 82 DecorationNonUniformEXT
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -63,24 +69,30 @@
               31:             TypeFloat 32
               32:             TypeVector 31(float) 3
               33:             TypeInt 32 1
-       34(block):             TypeStruct 32(fvec3) 32(fvec3) 33(int)
-              35:             TypePointer ShaderRecordBufferKHR 34(block)
-              36:     35(ptr) Variable ShaderRecordBufferKHR
-              37:     33(int) Constant 2
-              38:             TypePointer ShaderRecordBufferKHR 33(int)
-              41:             TypePointer UniformConstant 27
-              48:     33(int) Constant 1
-              49:             TypePointer ShaderRecordBufferKHR 32(fvec3)
-              52:   31(float) Constant 1056964608
-              53:     33(int) Constant 0
-              56:   31(float) Constant 1061158912
-              57:      6(int) Constant 2
-              58:             TypeArray 27 57
-              59:             TypePointer UniformConstant 58
-     60(accEXT1):     59(ptr) Variable UniformConstant
-              86:             TypeVector 31(float) 4
-              87:             TypePointer RayPayloadKHR 86(fvec4)
-     88(payload):     87(ptr) Variable RayPayloadKHR
+              34:             TypeVector 6(int) 2
+              35:             TypeInt 64 0
+       36(block):             TypeStruct 32(fvec3) 32(fvec3) 33(int) 34(ivec2) 35(int64_t)
+              37:             TypePointer ShaderRecordBufferKHR 36(block)
+              38:     37(ptr) Variable ShaderRecordBufferKHR
+              39:     33(int) Constant 2
+              40:             TypePointer ShaderRecordBufferKHR 33(int)
+              43:             TypePointer UniformConstant 27
+              50:     33(int) Constant 1
+              51:             TypePointer ShaderRecordBufferKHR 32(fvec3)
+              54:   31(float) Constant 1056964608
+              55:     33(int) Constant 0
+              58:   31(float) Constant 1061158912
+              59:             TypeVector 31(float) 4
+              60:             TypePointer RayPayloadKHR 59(fvec4)
+     61(payload):     60(ptr) Variable RayPayloadKHR
+              62:      6(int) Constant 2
+              63:             TypeArray 27 62
+              64:             TypePointer UniformConstant 63
+     65(accEXT1):     64(ptr) Variable UniformConstant
+              91:     33(int) Constant 3
+              92:             TypePointer ShaderRecordBufferKHR 34(ivec2)
+             104:     33(int) Constant 4
+             105:             TypePointer ShaderRecordBufferKHR 35(int64_t)
          4(main):           2 Function None 3
                5:             Label
            8(lx):      7(ptr) Variable Function
@@ -99,45 +111,69 @@
               25:     13(ptr) AccessChain 21(gl_LaunchSizeEXT) 17
               26:      6(int) Load 25
                               Store 24(sy) 26
-              39:     38(ptr) AccessChain 36 37
-              40:     33(int) Load 39
-              42:     41(ptr) AccessChain 30(accEXT0) 40
-              43:          27 Load 42
-              44:      6(int) Load 8(lx)
-              45:      6(int) Load 16(ly)
-              46:      6(int) Load 20(sx)
-              47:      6(int) Load 24(sy)
-              50:     49(ptr) AccessChain 36 48
-              51:   32(fvec3) Load 50
-              54:     49(ptr) AccessChain 36 53
-              55:   32(fvec3) Load 54
-                              TraceRayKHR 43 44 45 46 47 12 51 52 55 56 48
-              61:     38(ptr) AccessChain 36 37
-              62:     33(int) Load 61
-              63:     41(ptr) AccessChain 60(accEXT1) 62
-              64:          27 Load 63
-              65:      6(int) Load 8(lx)
-              66:      6(int) Load 16(ly)
-              67:      6(int) Load 20(sx)
-              68:      6(int) Load 24(sy)
-              69:     49(ptr) AccessChain 36 48
-              70:   32(fvec3) Load 69
-              71:     49(ptr) AccessChain 36 53
-              72:   32(fvec3) Load 71
-                              TraceRayKHR 64 65 66 67 68 12 70 52 72 56 48
-              73:     38(ptr) AccessChain 36 37
-              74:     33(int) Load 73
-              75:     33(int) CopyObject 74
-              76:     41(ptr) AccessChain 30(accEXT0) 75
-              77:          27 Load 76
-              78:      6(int) Load 8(lx)
-              79:      6(int) Load 16(ly)
-              80:      6(int) Load 20(sx)
-              81:      6(int) Load 24(sy)
-              82:     49(ptr) AccessChain 36 48
-              83:   32(fvec3) Load 82
-              84:     49(ptr) AccessChain 36 53
-              85:   32(fvec3) Load 84
-                              TraceRayKHR 77 78 79 80 81 12 83 52 85 56 48
+              41:     40(ptr) AccessChain 38 39
+              42:     33(int) Load 41
+              44:     43(ptr) AccessChain 30(accEXT0) 42
+              45:          27 Load 44
+              46:      6(int) Load 8(lx)
+              47:      6(int) Load 16(ly)
+              48:      6(int) Load 20(sx)
+              49:      6(int) Load 24(sy)
+              52:     51(ptr) AccessChain 38 50
+              53:   32(fvec3) Load 52
+              56:     51(ptr) AccessChain 38 55
+              57:   32(fvec3) Load 56
+                              TraceRayKHR 45 46 47 48 49 12 53 54 57 58 61(payload)
+              66:     40(ptr) AccessChain 38 39
+              67:     33(int) Load 66
+              68:     43(ptr) AccessChain 65(accEXT1) 67
+              69:          27 Load 68
+              70:      6(int) Load 8(lx)
+              71:      6(int) Load 16(ly)
+              72:      6(int) Load 20(sx)
+              73:      6(int) Load 24(sy)
+              74:     51(ptr) AccessChain 38 50
+              75:   32(fvec3) Load 74
+              76:     51(ptr) AccessChain 38 55
+              77:   32(fvec3) Load 76
+                              TraceRayKHR 69 70 71 72 73 12 75 54 77 58 61(payload)
+              78:     40(ptr) AccessChain 38 39
+              79:     33(int) Load 78
+              80:     33(int) CopyObject 79
+              81:     43(ptr) AccessChain 30(accEXT0) 80
+              82:          27 Load 81
+              83:      6(int) Load 8(lx)
+              84:      6(int) Load 16(ly)
+              85:      6(int) Load 20(sx)
+              86:      6(int) Load 24(sy)
+              87:     51(ptr) AccessChain 38 50
+              88:   32(fvec3) Load 87
+              89:     51(ptr) AccessChain 38 55
+              90:   32(fvec3) Load 89
+                              TraceRayKHR 82 83 84 85 86 12 88 54 90 58 61(payload)
+              93:     92(ptr) AccessChain 38 91
+              94:   34(ivec2) Load 93
+              95:          27 ConvertUToAccelerationStructureKHR 94
+              96:      6(int) Load 8(lx)
+              97:      6(int) Load 16(ly)
+              98:      6(int) Load 20(sx)
+              99:      6(int) Load 24(sy)
+             100:     51(ptr) AccessChain 38 50
+             101:   32(fvec3) Load 100
+             102:     51(ptr) AccessChain 38 55
+             103:   32(fvec3) Load 102
+                              TraceRayKHR 95 96 97 98 99 12 101 54 103 58 61(payload)
+             106:    105(ptr) AccessChain 38 104
+             107: 35(int64_t) Load 106
+             108:          27 ConvertUToAccelerationStructureKHR 107
+             109:      6(int) Load 8(lx)
+             110:      6(int) Load 16(ly)
+             111:      6(int) Load 20(sx)
+             112:      6(int) Load 24(sy)
+             113:     51(ptr) AccessChain 38 50
+             114:   32(fvec3) Load 113
+             115:     51(ptr) AccessChain 38 55
+             116:   32(fvec3) Load 115
+                              TraceRayKHR 108 109 110 111 112 12 114 54 116 58 61(payload)
                               Return
                               FunctionEnd
diff --git a/third_party/glslang/src/Test/baseResults/spv.ext.RayGenShader_Errors.rgen.out b/third_party/glslang/src/Test/baseResults/spv.ext.RayGenShader_Errors.rgen.out
index 6dc7480..3f336bb 100644
--- a/third_party/glslang/src/Test/baseResults/spv.ext.RayGenShader_Errors.rgen.out
+++ b/third_party/glslang/src/Test/baseResults/spv.ext.RayGenShader_Errors.rgen.out
@@ -4,8 +4,9 @@
 ERROR: 0:5: 'shaderRecordNV' : can only be used with a buffer 
 ERROR: 0:9: 'binding' : cannot be used with shaderRecordNV 
 ERROR: 0:12: 'set' : cannot be used with shaderRecordNV 
+ERROR: 0:23: ' temp accelerationStructureNV' : cannot construct with these arguments 
 ERROR: 0:23: 'accelerationStructureNV' : accelerationStructureNV can only be used in uniform variables or function parameters: a
-ERROR: 0:23: '=' :  cannot convert from ' const int' to ' temp accelerationStructureNV'
+ERROR: 0:23: '=' :  cannot convert from ' const float' to ' temp accelerationStructureNV'
 ERROR: 0:24: 'gl_PrimitiveID' : undeclared identifier 
 ERROR: 0:24: '=' :  cannot convert from ' temp float' to ' temp highp int'
 ERROR: 0:25: 'gl_InstanceID' : undeclared identifier (Did you mean gl_InstanceIndex?)
@@ -28,11 +29,13 @@
 ERROR: 0:34: '=' :  cannot convert from ' temp float' to ' temp highp 4X3 matrix of float'
 ERROR: 0:35: 'gl_HitTEXT' : undeclared identifier 
 ERROR: 0:36: 'gl_HitKindEXT' : undeclared identifier 
-ERROR: 0:37: 'reportIntersectionEXT' : no matching overloaded function found 
-ERROR: 0:38: 'ignoreIntersectionEXT' : no matching overloaded function found 
-ERROR: 0:39: 'terminateRayEXT' : no matching overloaded function found 
-ERROR: 0:40: 'assign' :  l-value required "anon@3" (can't modify a shaderrecordnv qualified buffer)
-ERROR: 33 compilation errors.  No code generated.
+ERROR: 0:37: 'gl_RayFlagsSkipAABBEXT' : required extension not requested: GL_EXT_ray_flags_primitive_culling
+ERROR: 0:37: '=' :  cannot convert from ' const uint' to ' temp highp int'
+ERROR: 0:38: 'reportIntersectionEXT' : no matching overloaded function found 
+ERROR: 0:39: 'ignoreIntersectionEXT' : not supported in this stage: ray-generation
+ERROR: 0:40: 'terminateRayEXT' : not supported in this stage: ray-generation
+ERROR: 0:41: 'assign' :  l-value required "anon@3" (can't modify a shaderrecordnv qualified buffer)
+ERROR: 36 compilation errors.  No code generated.
 
 
 ERROR: Linking ray-generation stage: Only one shaderRecordNV buffer block is allowed per stage
diff --git a/third_party/glslang/src/Test/baseResults/spv.ext.RayQueryDecl.frag.out b/third_party/glslang/src/Test/baseResults/spv.ext.RayQueryDecl.frag.out
new file mode 100644
index 0000000..97681e9
--- /dev/null
+++ b/third_party/glslang/src/Test/baseResults/spv.ext.RayQueryDecl.frag.out
@@ -0,0 +1,39 @@
+spv.ext.RayQueryDecl.frag
+// Module Version 10400
+// Generated by (magic number): 8000a
+// Id's are bound by 15
+
+                              Capability Shader
+                              Capability RayQueryKHR
+                              Extension  "SPV_KHR_ray_query"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 9 14
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 460
+                              SourceExtension  "GL_ARB_separate_shader_objects"
+                              SourceExtension  "GL_EXT_nonuniform_qualifier"
+                              SourceExtension  "GL_EXT_ray_query"
+                              SourceExtension  "GL_EXT_scalar_block_layout"
+                              SourceExtension  "GL_GOOGLE_cpp_style_line_directive"
+                              SourceExtension  "GL_GOOGLE_include_directive"
+                              Name 4  "main"
+                              Name 9  "outColor"
+                              Name 14  "rq"
+                              Decorate 9(outColor) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Output 7(fvec4)
+     9(outColor):      8(ptr) Variable Output
+              10:    6(float) Constant 0
+              11:    7(fvec4) ConstantComposite 10 10 10 10
+              12:             TypeRayQueryKHR
+              13:             TypePointer Private 12
+          14(rq):     13(ptr) Variable Private
+         4(main):           2 Function None 3
+               5:             Label
+                              Store 9(outColor) 11
+                              Return
+                              FunctionEnd
diff --git a/third_party/glslang/src/Test/baseResults/spv.ext.World3x4.rahit.out b/third_party/glslang/src/Test/baseResults/spv.ext.World3x4.rahit.out
index ad877bd..40d73d1 100644
--- a/third_party/glslang/src/Test/baseResults/spv.ext.World3x4.rahit.out
+++ b/third_party/glslang/src/Test/baseResults/spv.ext.World3x4.rahit.out
@@ -3,7 +3,7 @@
 // Generated by (magic number): 8000a
 // Id's are bound by 90
 
-                              Capability RayTracingProvisionalKHR
+                              Capability RayTracingKHR
                               Extension  "SPV_KHR_ray_tracing"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
diff --git a/third_party/glslang/src/Test/baseResults/spv.imageAtomic64.frag.out b/third_party/glslang/src/Test/baseResults/spv.imageAtomic64.frag.out
new file mode 100644
index 0000000..3083697
--- /dev/null
+++ b/third_party/glslang/src/Test/baseResults/spv.imageAtomic64.frag.out
@@ -0,0 +1,634 @@
+spv.imageAtomic64.frag
+Validation failed
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 503
+
+                              Capability Shader
+                              Capability Int64
+                              Capability Int64Atomics
+                              Capability StorageImageMultisample
+                              Capability ImageCubeArray
+                              Capability ImageRect
+                              Capability SparseResidency
+                              Capability Image1D
+                              Capability ImageBuffer
+                              Capability ImageMSArray
+                              Capability Int64ImageEXT
+                              Extension  "SPV_EXT_shader_image_int64"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main"
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              SourceExtension  "GL_ARB_gpu_shader_int64"
+                              SourceExtension  "GL_ARB_sparse_texture2"
+                              SourceExtension  "GL_EXT_shader_image_int64"
+                              SourceExtension  "GL_KHR_memory_scope_semantics"
+                              Name 4  "main"
+                              Name 12  "Buf"
+                              MemberName 12(Buf) 0  "i64"
+                              MemberName 12(Buf) 1  "u64"
+                              MemberName 12(Buf) 2  "i64v4"
+                              MemberName 12(Buf) 3  "u64v4"
+                              MemberName 12(Buf) 4  "i32v4"
+                              Name 14  ""
+                              Name 18  "i1D"
+                              Name 35  "i3D"
+                              Name 48  "iBuf"
+                              Name 58  "i2DArray"
+                              Name 69  "i2DRect"
+                              Name 81  "i2DMSArray"
+                              Name 194  "u2D"
+                              Name 207  "uCube"
+                              Name 218  "u1DArray"
+                              Name 229  "uCubeArray"
+                              Name 240  "u2DMS"
+                              Name 458  "ResType"
+                              Name 483  "ResType"
+                              MemberDecorate 12(Buf) 0 Offset 0
+                              MemberDecorate 12(Buf) 1 Offset 8
+                              MemberDecorate 12(Buf) 2 Offset 32
+                              MemberDecorate 12(Buf) 3 Offset 64
+                              MemberDecorate 12(Buf) 4 Offset 96
+                              Decorate 12(Buf) BufferBlock
+                              Decorate 14 DescriptorSet 0
+                              Decorate 14 Binding 11
+                              Decorate 18(i1D) DescriptorSet 0
+                              Decorate 18(i1D) Binding 0
+                              Decorate 35(i3D) DescriptorSet 0
+                              Decorate 35(i3D) Binding 2
+                              Decorate 48(iBuf) DescriptorSet 0
+                              Decorate 48(iBuf) Binding 4
+                              Decorate 58(i2DArray) DescriptorSet 0
+                              Decorate 58(i2DArray) Binding 6
+                              Decorate 69(i2DRect) DescriptorSet 0
+                              Decorate 69(i2DRect) Binding 8
+                              Decorate 81(i2DMSArray) DescriptorSet 0
+                              Decorate 81(i2DMSArray) Binding 10
+                              Decorate 194(u2D) DescriptorSet 0
+                              Decorate 194(u2D) Binding 1
+                              Decorate 207(uCube) DescriptorSet 0
+                              Decorate 207(uCube) Binding 3
+                              Decorate 218(u1DArray) DescriptorSet 0
+                              Decorate 218(u1DArray) Binding 5
+                              Decorate 229(uCubeArray) DescriptorSet 0
+                              Decorate 229(uCubeArray) Binding 7
+                              Decorate 240(u2DMS) DescriptorSet 0
+                              Decorate 240(u2DMS) Binding 9
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 64 1
+               7:             TypeInt 64 0
+               8:             TypeVector 6(int64_t) 4
+               9:             TypeVector 7(int64_t) 4
+              10:             TypeInt 32 1
+              11:             TypeVector 10(int) 4
+         12(Buf):             TypeStruct 6(int64_t) 7(int64_t) 8(i64vec4) 9(i64vec4) 11(ivec4)
+              13:             TypePointer Uniform 12(Buf)
+              14:     13(ptr) Variable Uniform
+              15:     10(int) Constant 0
+              16:             TypeImage 6(int64_t) 1D nonsampled format:R64i
+              17:             TypePointer UniformConstant 16
+         18(i1D):     17(ptr) Variable UniformConstant
+              19:     10(int) Constant 4
+              20:             TypeInt 32 0
+              21:     20(int) Constant 0
+              22:             TypePointer Uniform 10(int)
+              25:             TypePointer Uniform 6(int64_t)
+              28:             TypePointer Image 6(int64_t)
+              30:     20(int) Constant 1
+              33:             TypeImage 6(int64_t) 3D nonsampled format:R64i
+              34:             TypePointer UniformConstant 33
+         35(i3D):     34(ptr) Variable UniformConstant
+              36:             TypeVector 10(int) 3
+              37:             TypePointer Uniform 11(ivec4)
+              46:             TypeImage 6(int64_t) Buffer nonsampled format:R64i
+              47:             TypePointer UniformConstant 46
+        48(iBuf):     47(ptr) Variable UniformConstant
+              56:             TypeImage 6(int64_t) 2D array nonsampled format:R64i
+              57:             TypePointer UniformConstant 56
+    58(i2DArray):     57(ptr) Variable UniformConstant
+              67:             TypeImage 6(int64_t) Rect nonsampled format:R64i
+              68:             TypePointer UniformConstant 67
+     69(i2DRect):     68(ptr) Variable UniformConstant
+              70:             TypeVector 10(int) 2
+              79:             TypeImage 6(int64_t) 2D array multi-sampled nonsampled format:R64i
+              80:             TypePointer UniformConstant 79
+  81(i2DMSArray):     80(ptr) Variable UniformConstant
+              85:     20(int) Constant 3
+             107:  6(int64_t) Constant 1 0
+             116:     10(int) Constant 1
+             117:     10(int) Constant 2048
+             119:     20(int) Constant 2048
+             192:             TypeImage 7(int64_t) 2D nonsampled format:R64ui
+             193:             TypePointer UniformConstant 192
+        194(u2D):    193(ptr) Variable UniformConstant
+             198:             TypePointer Uniform 7(int64_t)
+             201:             TypePointer Image 7(int64_t)
+             205:             TypeImage 7(int64_t) Cube nonsampled format:R64ui
+             206:             TypePointer UniformConstant 205
+      207(uCube):    206(ptr) Variable UniformConstant
+             216:             TypeImage 7(int64_t) 1D array nonsampled format:R64ui
+             217:             TypePointer UniformConstant 216
+   218(u1DArray):    217(ptr) Variable UniformConstant
+             227:             TypeImage 7(int64_t) Cube array nonsampled format:R64ui
+             228:             TypePointer UniformConstant 227
+ 229(uCubeArray):    228(ptr) Variable UniformConstant
+             238:             TypeImage 7(int64_t) 2D multi-sampled nonsampled format:R64ui
+             239:             TypePointer UniformConstant 238
+      240(u2DMS):    239(ptr) Variable UniformConstant
+             244:     20(int) Constant 2
+             275:  7(int64_t) Constant 1 0
+             363:     10(int) Constant 2
+             368:             TypePointer Uniform 8(i64vec4)
+             423:     10(int) Constant 3
+             424:             TypePointer Uniform 9(i64vec4)
+    458(ResType):             TypeStruct 10(int) 8(i64vec4)
+    483(ResType):             TypeStruct 10(int) 9(i64vec4)
+         4(main):           2 Function None 3
+               5:             Label
+              23:     22(ptr) AccessChain 14 19 21
+              24:     10(int) Load 23
+              26:     25(ptr) AccessChain 14 15
+              27:  6(int64_t) Load 26
+              29:     28(ptr) ImageTexelPointer 18(i1D) 24 21
+              31:  6(int64_t) AtomicIAdd 29 30 21 27
+              32:     25(ptr) AccessChain 14 15
+                              Store 32 31
+              38:     37(ptr) AccessChain 14 19
+              39:   11(ivec4) Load 38
+              40:   36(ivec3) VectorShuffle 39 39 0 1 2
+              41:     25(ptr) AccessChain 14 15
+              42:  6(int64_t) Load 41
+              43:     28(ptr) ImageTexelPointer 35(i3D) 40 21
+              44:  6(int64_t) AtomicSMin 43 30 21 42
+              45:     25(ptr) AccessChain 14 15
+                              Store 45 44
+              49:     22(ptr) AccessChain 14 19 21
+              50:     10(int) Load 49
+              51:     25(ptr) AccessChain 14 15
+              52:  6(int64_t) Load 51
+              53:     28(ptr) ImageTexelPointer 48(iBuf) 50 21
+              54:  6(int64_t) AtomicSMax 53 30 21 52
+              55:     25(ptr) AccessChain 14 15
+                              Store 55 54
+              59:     37(ptr) AccessChain 14 19
+              60:   11(ivec4) Load 59
+              61:   36(ivec3) VectorShuffle 60 60 0 1 2
+              62:     25(ptr) AccessChain 14 15
+              63:  6(int64_t) Load 62
+              64:     28(ptr) ImageTexelPointer 58(i2DArray) 61 21
+              65:  6(int64_t) AtomicAnd 64 30 21 63
+              66:     25(ptr) AccessChain 14 15
+                              Store 66 65
+              71:     37(ptr) AccessChain 14 19
+              72:   11(ivec4) Load 71
+              73:   70(ivec2) VectorShuffle 72 72 0 1
+              74:     25(ptr) AccessChain 14 15
+              75:  6(int64_t) Load 74
+              76:     28(ptr) ImageTexelPointer 69(i2DRect) 73 21
+              77:  6(int64_t) AtomicOr 76 30 21 75
+              78:     25(ptr) AccessChain 14 15
+                              Store 78 77
+              82:     37(ptr) AccessChain 14 19
+              83:   11(ivec4) Load 82
+              84:   36(ivec3) VectorShuffle 83 83 0 1 2
+              86:     22(ptr) AccessChain 14 19 85
+              87:     10(int) Load 86
+              88:     25(ptr) AccessChain 14 15
+              89:  6(int64_t) Load 88
+              90:     28(ptr) ImageTexelPointer 81(i2DMSArray) 84 87
+              91:  6(int64_t) AtomicXor 90 30 21 89
+              92:     25(ptr) AccessChain 14 15
+                              Store 92 91
+              93:     22(ptr) AccessChain 14 19 21
+              94:     10(int) Load 93
+              95:     25(ptr) AccessChain 14 15
+              96:  6(int64_t) Load 95
+              97:     28(ptr) ImageTexelPointer 18(i1D) 94 21
+              98:  6(int64_t) AtomicExchange 97 30 21 96
+              99:     25(ptr) AccessChain 14 15
+                              Store 99 98
+             100:     37(ptr) AccessChain 14 19
+             101:   11(ivec4) Load 100
+             102:   36(ivec3) VectorShuffle 101 101 0 1 2
+             103:     25(ptr) AccessChain 14 15
+             104:  6(int64_t) Load 103
+             105:     25(ptr) AccessChain 14 15
+             106:  6(int64_t) Load 105
+             108:  6(int64_t) IAdd 106 107
+             109:     28(ptr) ImageTexelPointer 35(i3D) 102 21
+             110:  6(int64_t) AtomicCompareExchange 109 30 21 21 108 104
+             111:     25(ptr) AccessChain 14 15
+                              Store 111 110
+             112:     22(ptr) AccessChain 14 19 21
+             113:     10(int) Load 112
+             114:     25(ptr) AccessChain 14 15
+             115:  6(int64_t) Load 114
+             118:     28(ptr) ImageTexelPointer 18(i1D) 113 21
+             120:  6(int64_t) AtomicIAdd 118 116 119 115
+             121:     25(ptr) AccessChain 14 15
+                              Store 121 120
+             122:     37(ptr) AccessChain 14 19
+             123:   11(ivec4) Load 122
+             124:   36(ivec3) VectorShuffle 123 123 0 1 2
+             125:     25(ptr) AccessChain 14 15
+             126:  6(int64_t) Load 125
+             127:     28(ptr) ImageTexelPointer 35(i3D) 124 21
+             128:  6(int64_t) AtomicSMin 127 116 119 126
+             129:     25(ptr) AccessChain 14 15
+                              Store 129 128
+             130:     22(ptr) AccessChain 14 19 21
+             131:     10(int) Load 130
+             132:     25(ptr) AccessChain 14 15
+             133:  6(int64_t) Load 132
+             134:     28(ptr) ImageTexelPointer 48(iBuf) 131 21
+             135:  6(int64_t) AtomicSMax 134 116 119 133
+             136:     25(ptr) AccessChain 14 15
+                              Store 136 135
+             137:     37(ptr) AccessChain 14 19
+             138:   11(ivec4) Load 137
+             139:   36(ivec3) VectorShuffle 138 138 0 1 2
+             140:     25(ptr) AccessChain 14 15
+             141:  6(int64_t) Load 140
+             142:     28(ptr) ImageTexelPointer 58(i2DArray) 139 21
+             143:  6(int64_t) AtomicAnd 142 116 119 141
+             144:     25(ptr) AccessChain 14 15
+                              Store 144 143
+             145:     37(ptr) AccessChain 14 19
+             146:   11(ivec4) Load 145
+             147:   70(ivec2) VectorShuffle 146 146 0 1
+             148:     25(ptr) AccessChain 14 15
+             149:  6(int64_t) Load 148
+             150:     28(ptr) ImageTexelPointer 69(i2DRect) 147 21
+             151:  6(int64_t) AtomicOr 150 116 119 149
+             152:     25(ptr) AccessChain 14 15
+                              Store 152 151
+             153:     37(ptr) AccessChain 14 19
+             154:   11(ivec4) Load 153
+             155:   36(ivec3) VectorShuffle 154 154 0 1 2
+             156:     22(ptr) AccessChain 14 19 85
+             157:     10(int) Load 156
+             158:     25(ptr) AccessChain 14 15
+             159:  6(int64_t) Load 158
+             160:     28(ptr) ImageTexelPointer 81(i2DMSArray) 155 157
+             161:  6(int64_t) AtomicXor 160 116 119 159
+             162:     25(ptr) AccessChain 14 15
+                              Store 162 161
+             163:     22(ptr) AccessChain 14 19 21
+             164:     10(int) Load 163
+             165:     25(ptr) AccessChain 14 15
+             166:  6(int64_t) Load 165
+             167:     28(ptr) ImageTexelPointer 18(i1D) 164 21
+             168:  6(int64_t) AtomicExchange 167 116 119 166
+             169:     25(ptr) AccessChain 14 15
+                              Store 169 168
+             170:     37(ptr) AccessChain 14 19
+             171:   11(ivec4) Load 170
+             172:   36(ivec3) VectorShuffle 171 171 0 1 2
+             173:     25(ptr) AccessChain 14 15
+             174:  6(int64_t) Load 173
+             175:     25(ptr) AccessChain 14 15
+             176:  6(int64_t) Load 175
+             177:  6(int64_t) IAdd 176 107
+             178:     28(ptr) ImageTexelPointer 35(i3D) 172 21
+             179:  6(int64_t) AtomicCompareExchange 178 116 119 119 177 174
+             180:     25(ptr) AccessChain 14 15
+                              Store 180 179
+             181:     22(ptr) AccessChain 14 19 21
+             182:     10(int) Load 181
+             183:     28(ptr) ImageTexelPointer 48(iBuf) 182 21
+             184:  6(int64_t) AtomicLoad 183 116 119
+             185:     25(ptr) AccessChain 14 15
+                              Store 185 184
+             186:     37(ptr) AccessChain 14 19
+             187:   11(ivec4) Load 186
+             188:   36(ivec3) VectorShuffle 187 187 0 1 2
+             189:     25(ptr) AccessChain 14 15
+             190:  6(int64_t) Load 189
+             191:     28(ptr) ImageTexelPointer 58(i2DArray) 188 21
+                              AtomicStore 191 116 119 190
+             195:     37(ptr) AccessChain 14 19
+             196:   11(ivec4) Load 195
+             197:   70(ivec2) VectorShuffle 196 196 0 1
+             199:    198(ptr) AccessChain 14 116
+             200:  7(int64_t) Load 199
+             202:    201(ptr) ImageTexelPointer 194(u2D) 197 21
+             203:  7(int64_t) AtomicIAdd 202 30 21 200
+             204:    198(ptr) AccessChain 14 116
+                              Store 204 203
+             208:     37(ptr) AccessChain 14 19
+             209:   11(ivec4) Load 208
+             210:   36(ivec3) VectorShuffle 209 209 0 1 2
+             211:    198(ptr) AccessChain 14 116
+             212:  7(int64_t) Load 211
+             213:    201(ptr) ImageTexelPointer 207(uCube) 210 21
+             214:  7(int64_t) AtomicUMin 213 30 21 212
+             215:    198(ptr) AccessChain 14 116
+                              Store 215 214
+             219:     37(ptr) AccessChain 14 19
+             220:   11(ivec4) Load 219
+             221:   70(ivec2) VectorShuffle 220 220 0 1
+             222:    198(ptr) AccessChain 14 116
+             223:  7(int64_t) Load 222
+             224:    201(ptr) ImageTexelPointer 218(u1DArray) 221 21
+             225:  7(int64_t) AtomicUMax 224 30 21 223
+             226:    198(ptr) AccessChain 14 116
+                              Store 226 225
+             230:     37(ptr) AccessChain 14 19
+             231:   11(ivec4) Load 230
+             232:   36(ivec3) VectorShuffle 231 231 0 1 2
+             233:    198(ptr) AccessChain 14 116
+             234:  7(int64_t) Load 233
+             235:    201(ptr) ImageTexelPointer 229(uCubeArray) 232 21
+             236:  7(int64_t) AtomicAnd 235 30 21 234
+             237:    198(ptr) AccessChain 14 116
+                              Store 237 236
+             241:     37(ptr) AccessChain 14 19
+             242:   11(ivec4) Load 241
+             243:   70(ivec2) VectorShuffle 242 242 0 1
+             245:     22(ptr) AccessChain 14 19 244
+             246:     10(int) Load 245
+             247:    198(ptr) AccessChain 14 116
+             248:  7(int64_t) Load 247
+             249:    201(ptr) ImageTexelPointer 240(u2DMS) 243 246
+             250:  7(int64_t) AtomicOr 249 30 21 248
+             251:    198(ptr) AccessChain 14 116
+                              Store 251 250
+             252:     37(ptr) AccessChain 14 19
+             253:   11(ivec4) Load 252
+             254:   70(ivec2) VectorShuffle 253 253 0 1
+             255:    198(ptr) AccessChain 14 116
+             256:  7(int64_t) Load 255
+             257:    201(ptr) ImageTexelPointer 194(u2D) 254 21
+             258:  7(int64_t) AtomicXor 257 30 21 256
+             259:    198(ptr) AccessChain 14 116
+                              Store 259 258
+             260:     37(ptr) AccessChain 14 19
+             261:   11(ivec4) Load 260
+             262:   36(ivec3) VectorShuffle 261 261 0 1 2
+             263:    198(ptr) AccessChain 14 116
+             264:  7(int64_t) Load 263
+             265:    201(ptr) ImageTexelPointer 207(uCube) 262 21
+             266:  7(int64_t) AtomicExchange 265 30 21 264
+             267:    198(ptr) AccessChain 14 116
+                              Store 267 266
+             268:     37(ptr) AccessChain 14 19
+             269:   11(ivec4) Load 268
+             270:   70(ivec2) VectorShuffle 269 269 0 1
+             271:    198(ptr) AccessChain 14 116
+             272:  7(int64_t) Load 271
+             273:    198(ptr) AccessChain 14 116
+             274:  7(int64_t) Load 273
+             276:  7(int64_t) IAdd 274 275
+             277:    201(ptr) ImageTexelPointer 218(u1DArray) 270 21
+             278:  7(int64_t) AtomicCompareExchange 277 30 21 21 276 272
+             279:    198(ptr) AccessChain 14 116
+                              Store 279 278
+             280:     37(ptr) AccessChain 14 19
+             281:   11(ivec4) Load 280
+             282:   70(ivec2) VectorShuffle 281 281 0 1
+             283:    198(ptr) AccessChain 14 116
+             284:  7(int64_t) Load 283
+             285:    201(ptr) ImageTexelPointer 194(u2D) 282 21
+             286:  7(int64_t) AtomicIAdd 285 116 119 284
+             287:    198(ptr) AccessChain 14 116
+                              Store 287 286
+             288:     37(ptr) AccessChain 14 19
+             289:   11(ivec4) Load 288
+             290:   36(ivec3) VectorShuffle 289 289 0 1 2
+             291:    198(ptr) AccessChain 14 116
+             292:  7(int64_t) Load 291
+             293:    201(ptr) ImageTexelPointer 207(uCube) 290 21
+             294:  7(int64_t) AtomicUMin 293 116 119 292
+             295:    198(ptr) AccessChain 14 116
+                              Store 295 294
+             296:     37(ptr) AccessChain 14 19
+             297:   11(ivec4) Load 296
+             298:   70(ivec2) VectorShuffle 297 297 0 1
+             299:    198(ptr) AccessChain 14 116
+             300:  7(int64_t) Load 299
+             301:    201(ptr) ImageTexelPointer 218(u1DArray) 298 21
+             302:  7(int64_t) AtomicUMax 301 116 119 300
+             303:    198(ptr) AccessChain 14 116
+                              Store 303 302
+             304:     37(ptr) AccessChain 14 19
+             305:   11(ivec4) Load 304
+             306:   36(ivec3) VectorShuffle 305 305 0 1 2
+             307:    198(ptr) AccessChain 14 116
+             308:  7(int64_t) Load 307
+             309:    201(ptr) ImageTexelPointer 229(uCubeArray) 306 21
+             310:  7(int64_t) AtomicAnd 309 116 119 308
+             311:    198(ptr) AccessChain 14 116
+                              Store 311 310
+             312:     37(ptr) AccessChain 14 19
+             313:   11(ivec4) Load 312
+             314:   70(ivec2) VectorShuffle 313 313 0 1
+             315:     22(ptr) AccessChain 14 19 244
+             316:     10(int) Load 315
+             317:    198(ptr) AccessChain 14 116
+             318:  7(int64_t) Load 317
+             319:    201(ptr) ImageTexelPointer 240(u2DMS) 314 316
+             320:  7(int64_t) AtomicOr 319 116 119 318
+             321:    198(ptr) AccessChain 14 116
+                              Store 321 320
+             322:     37(ptr) AccessChain 14 19
+             323:   11(ivec4) Load 322
+             324:   70(ivec2) VectorShuffle 323 323 0 1
+             325:    198(ptr) AccessChain 14 116
+             326:  7(int64_t) Load 325
+             327:    201(ptr) ImageTexelPointer 194(u2D) 324 21
+             328:  7(int64_t) AtomicXor 327 116 119 326
+             329:    198(ptr) AccessChain 14 116
+                              Store 329 328
+             330:     37(ptr) AccessChain 14 19
+             331:   11(ivec4) Load 330
+             332:   36(ivec3) VectorShuffle 331 331 0 1 2
+             333:    198(ptr) AccessChain 14 116
+             334:  7(int64_t) Load 333
+             335:    201(ptr) ImageTexelPointer 207(uCube) 332 21
+             336:  7(int64_t) AtomicExchange 335 116 119 334
+             337:    198(ptr) AccessChain 14 116
+                              Store 337 336
+             338:     37(ptr) AccessChain 14 19
+             339:   11(ivec4) Load 338
+             340:   70(ivec2) VectorShuffle 339 339 0 1
+             341:    198(ptr) AccessChain 14 116
+             342:  7(int64_t) Load 341
+             343:    198(ptr) AccessChain 14 116
+             344:  7(int64_t) Load 343
+             345:  7(int64_t) IAdd 344 275
+             346:    201(ptr) ImageTexelPointer 218(u1DArray) 340 21
+             347:  7(int64_t) AtomicCompareExchange 346 116 119 119 345 342
+             348:    198(ptr) AccessChain 14 116
+                              Store 348 347
+             349:     37(ptr) AccessChain 14 19
+             350:   11(ivec4) Load 349
+             351:   36(ivec3) VectorShuffle 350 350 0 1 2
+             352:    201(ptr) ImageTexelPointer 229(uCubeArray) 351 21
+             353:  7(int64_t) AtomicLoad 352 116 119
+             354:    198(ptr) AccessChain 14 116
+                              Store 354 353
+             355:     37(ptr) AccessChain 14 19
+             356:   11(ivec4) Load 355
+             357:   70(ivec2) VectorShuffle 356 356 0 1
+             358:     22(ptr) AccessChain 14 19 244
+             359:     10(int) Load 358
+             360:    198(ptr) AccessChain 14 116
+             361:  7(int64_t) Load 360
+             362:    201(ptr) ImageTexelPointer 240(u2DMS) 357 359
+                              AtomicStore 362 116 119 361
+             364:          16 Load 18(i1D)
+             365:     22(ptr) AccessChain 14 19 21
+             366:     10(int) Load 365
+             367:  8(i64vec4) ImageRead 364 366
+             369:    368(ptr) AccessChain 14 363
+             370:  8(i64vec4) Load 369
+             371:  8(i64vec4) IAdd 370 367
+             372:    368(ptr) AccessChain 14 363
+                              Store 372 371
+             373:          33 Load 35(i3D)
+             374:     37(ptr) AccessChain 14 19
+             375:   11(ivec4) Load 374
+             376:   36(ivec3) VectorShuffle 375 375 0 1 2
+             377:  8(i64vec4) ImageRead 373 376
+             378:    368(ptr) AccessChain 14 363
+             379:  8(i64vec4) Load 378
+             380:  8(i64vec4) IAdd 379 377
+             381:    368(ptr) AccessChain 14 363
+                              Store 381 380
+             382:          46 Load 48(iBuf)
+             383:     22(ptr) AccessChain 14 19 21
+             384:     10(int) Load 383
+             385:  8(i64vec4) ImageRead 382 384
+             386:    368(ptr) AccessChain 14 363
+             387:  8(i64vec4) Load 386
+             388:  8(i64vec4) IAdd 387 385
+             389:    368(ptr) AccessChain 14 363
+                              Store 389 388
+             390:          56 Load 58(i2DArray)
+             391:     37(ptr) AccessChain 14 19
+             392:   11(ivec4) Load 391
+             393:   36(ivec3) VectorShuffle 392 392 0 1 2
+             394:  8(i64vec4) ImageRead 390 393
+             395:    368(ptr) AccessChain 14 363
+             396:  8(i64vec4) Load 395
+             397:  8(i64vec4) IAdd 396 394
+             398:    368(ptr) AccessChain 14 363
+                              Store 398 397
+             399:          67 Load 69(i2DRect)
+             400:     37(ptr) AccessChain 14 19
+             401:   11(ivec4) Load 400
+             402:   70(ivec2) VectorShuffle 401 401 0 1
+             403:  8(i64vec4) ImageRead 399 402
+             404:    368(ptr) AccessChain 14 363
+             405:  8(i64vec4) Load 404
+             406:  8(i64vec4) IAdd 405 403
+             407:    368(ptr) AccessChain 14 363
+                              Store 407 406
+             408:          79 Load 81(i2DMSArray)
+             409:     37(ptr) AccessChain 14 19
+             410:   11(ivec4) Load 409
+             411:   36(ivec3) VectorShuffle 410 410 0 1 2
+             412:     22(ptr) AccessChain 14 19 85
+             413:     10(int) Load 412
+             414:  8(i64vec4) ImageRead 408 411 Sample 413
+             415:    368(ptr) AccessChain 14 363
+             416:  8(i64vec4) Load 415
+             417:  8(i64vec4) IAdd 416 414
+             418:    368(ptr) AccessChain 14 363
+                              Store 418 417
+             419:         192 Load 194(u2D)
+             420:     37(ptr) AccessChain 14 19
+             421:   11(ivec4) Load 420
+             422:   70(ivec2) VectorShuffle 421 421 0 1
+             425:    424(ptr) AccessChain 14 423
+             426:  9(i64vec4) Load 425
+                              ImageWrite 419 422 426
+             427:         205 Load 207(uCube)
+             428:     37(ptr) AccessChain 14 19
+             429:   11(ivec4) Load 428
+             430:   36(ivec3) VectorShuffle 429 429 0 1 2
+             431:    424(ptr) AccessChain 14 423
+             432:  9(i64vec4) Load 431
+                              ImageWrite 427 430 432
+             433:         216 Load 218(u1DArray)
+             434:     37(ptr) AccessChain 14 19
+             435:   11(ivec4) Load 434
+             436:   70(ivec2) VectorShuffle 435 435 0 1
+             437:    424(ptr) AccessChain 14 423
+             438:  9(i64vec4) Load 437
+                              ImageWrite 433 436 438
+             439:         227 Load 229(uCubeArray)
+             440:     37(ptr) AccessChain 14 19
+             441:   11(ivec4) Load 440
+             442:   36(ivec3) VectorShuffle 441 441 0 1 2
+             443:    424(ptr) AccessChain 14 423
+             444:  9(i64vec4) Load 443
+                              ImageWrite 439 442 444
+             445:         238 Load 240(u2DMS)
+             446:     37(ptr) AccessChain 14 19
+             447:   11(ivec4) Load 446
+             448:   70(ivec2) VectorShuffle 447 447 0 1
+             449:     22(ptr) AccessChain 14 19 244
+             450:     10(int) Load 449
+             451:    424(ptr) AccessChain 14 423
+             452:  9(i64vec4) Load 451
+                              ImageWrite 445 448 452 Sample 450
+             453:          33 Load 35(i3D)
+             454:     37(ptr) AccessChain 14 19
+             455:   11(ivec4) Load 454
+             456:   36(ivec3) VectorShuffle 455 455 0 1 2
+             457:    368(ptr) AccessChain 14 363
+             459:458(ResType) ImageSparseRead 453 456
+             460:  8(i64vec4) CompositeExtract 459 1
+                              Store 457 460
+             461:     10(int) CompositeExtract 459 0
+             462:          56 Load 58(i2DArray)
+             463:     37(ptr) AccessChain 14 19
+             464:   11(ivec4) Load 463
+             465:   36(ivec3) VectorShuffle 464 464 0 1 2
+             466:    368(ptr) AccessChain 14 363
+             467:458(ResType) ImageSparseRead 462 465
+             468:  8(i64vec4) CompositeExtract 467 1
+                              Store 466 468
+             469:     10(int) CompositeExtract 467 0
+             470:          67 Load 69(i2DRect)
+             471:     37(ptr) AccessChain 14 19
+             472:   11(ivec4) Load 471
+             473:   70(ivec2) VectorShuffle 472 472 0 1
+             474:    368(ptr) AccessChain 14 363
+             475:458(ResType) ImageSparseRead 470 473
+             476:  8(i64vec4) CompositeExtract 475 1
+                              Store 474 476
+             477:     10(int) CompositeExtract 475 0
+             478:         192 Load 194(u2D)
+             479:     37(ptr) AccessChain 14 19
+             480:   11(ivec4) Load 479
+             481:   70(ivec2) VectorShuffle 480 480 0 1
+             482:    424(ptr) AccessChain 14 423
+             484:483(ResType) ImageSparseRead 478 481
+             485:  9(i64vec4) CompositeExtract 484 1
+                              Store 482 485
+             486:     10(int) CompositeExtract 484 0
+             487:         205 Load 207(uCube)
+             488:     37(ptr) AccessChain 14 19
+             489:   11(ivec4) Load 488
+             490:   36(ivec3) VectorShuffle 489 489 0 1 2
+             491:    424(ptr) AccessChain 14 423
+             492:483(ResType) ImageSparseRead 487 490
+             493:  9(i64vec4) CompositeExtract 492 1
+                              Store 491 493
+             494:     10(int) CompositeExtract 492 0
+             495:         227 Load 229(uCubeArray)
+             496:     37(ptr) AccessChain 14 19
+             497:   11(ivec4) Load 496
+             498:   36(ivec3) VectorShuffle 497 497 0 1 2
+             499:    424(ptr) AccessChain 14 423
+             500:483(ResType) ImageSparseRead 495 498
+             501:  9(i64vec4) CompositeExtract 500 1
+                              Store 499 501
+             502:     10(int) CompositeExtract 500 0
+                              Return
+                              FunctionEnd
diff --git a/third_party/glslang/src/Test/baseResults/spv.imageLoadStoreLod.frag.out b/third_party/glslang/src/Test/baseResults/spv.imageLoadStoreLod.frag.out
index 2f83604..b809474 100644
--- a/third_party/glslang/src/Test/baseResults/spv.imageLoadStoreLod.frag.out
+++ b/third_party/glslang/src/Test/baseResults/spv.imageLoadStoreLod.frag.out
@@ -1,20 +1,25 @@
 spv.imageLoadStoreLod.frag
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 82
+// Id's are bound by 148
 
                               Capability Shader
+                              Capability Int64
                               Capability ImageCubeArray
                               Capability SparseResidency
                               Capability Image1D
                               Capability ImageReadWriteLodAMD
+                              Capability Int64ImageEXT
                               Extension  "SPV_AMD_shader_image_load_store_lod"
+                              Extension  "SPV_EXT_shader_image_int64"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 77
                               ExecutionMode 4 OriginUpperLeft
                               Source GLSL 450
                               SourceExtension  "GL_AMD_shader_image_load_store_lod"
+                              SourceExtension  "GL_ARB_gpu_shader_int64"
+                              SourceExtension  "GL_EXT_shader_image_int64"
                               Name 4  "main"
                               Name 9  "f4"
                               Name 14  "i1D"
@@ -27,6 +32,18 @@
                               Name 65  "ResType"
                               Name 71  "uiCubeArray"
                               Name 77  "fragColor"
+                              Name 86  "Buf"
+                              MemberName 86(Buf) 0  "i64v4"
+                              MemberName 86(Buf) 1  "u64v4"
+                              Name 88  ""
+                              Name 92  "i64i1D"
+                              Name 102  "i64i2D"
+                              Name 111  "i64i3D"
+                              Name 120  "u64iCube"
+                              Name 127  "u64i1DArray"
+                              Name 133  "u64i2DArray"
+                              Name 136  "ResType"
+                              Name 142  "u64iCubeArray"
                               Decorate 14(i1D) DescriptorSet 0
                               Decorate 14(i1D) Binding 0
                               Decorate 24(i2D) DescriptorSet 0
@@ -42,6 +59,25 @@
                               Decorate 71(uiCubeArray) DescriptorSet 0
                               Decorate 71(uiCubeArray) Binding 6
                               Decorate 77(fragColor) Location 0
+                              MemberDecorate 86(Buf) 0 Offset 0
+                              MemberDecorate 86(Buf) 1 Offset 32
+                              Decorate 86(Buf) BufferBlock
+                              Decorate 88 DescriptorSet 0
+                              Decorate 88 Binding 14
+                              Decorate 92(i64i1D) DescriptorSet 0
+                              Decorate 92(i64i1D) Binding 7
+                              Decorate 102(i64i2D) DescriptorSet 0
+                              Decorate 102(i64i2D) Binding 8
+                              Decorate 111(i64i3D) DescriptorSet 0
+                              Decorate 111(i64i3D) Binding 9
+                              Decorate 120(u64iCube) DescriptorSet 0
+                              Decorate 120(u64iCube) Binding 10
+                              Decorate 127(u64i1DArray) DescriptorSet 0
+                              Decorate 127(u64i1DArray) Binding 11
+                              Decorate 133(u64i2DArray) DescriptorSet 0
+                              Decorate 133(u64i2DArray) Binding 12
+                              Decorate 142(u64iCubeArray) DescriptorSet 0
+                              Decorate 142(u64iCubeArray) Binding 13
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -88,6 +124,38 @@
  71(uiCubeArray):     70(ptr) Variable UniformConstant
               76:             TypePointer Output 7(fvec4)
    77(fragColor):     76(ptr) Variable Output
+              82:             TypeInt 64 1
+              83:             TypeVector 82(int64_t) 4
+              84:             TypeInt 64 0
+              85:             TypeVector 84(int64_t) 4
+         86(Buf):             TypeStruct 83(i64vec4) 85(i64vec4)
+              87:             TypePointer Uniform 86(Buf)
+              88:     87(ptr) Variable Uniform
+              89:     16(int) Constant 0
+              90:             TypeImage 82(int64_t) 1D nonsampled format:R64i
+              91:             TypePointer UniformConstant 90
+      92(i64i1D):     91(ptr) Variable UniformConstant
+              95:             TypePointer Uniform 83(i64vec4)
+             100:             TypeImage 82(int64_t) 2D nonsampled format:R64i
+             101:             TypePointer UniformConstant 100
+     102(i64i2D):    101(ptr) Variable UniformConstant
+             109:             TypeImage 82(int64_t) 3D nonsampled format:R64i
+             110:             TypePointer UniformConstant 109
+     111(i64i3D):    110(ptr) Variable UniformConstant
+             118:             TypeImage 84(int64_t) Cube nonsampled format:R64ui
+             119:             TypePointer UniformConstant 118
+   120(u64iCube):    119(ptr) Variable UniformConstant
+             122:             TypePointer Uniform 85(i64vec4)
+             125:             TypeImage 84(int64_t) 1D array nonsampled format:R64ui
+             126:             TypePointer UniformConstant 125
+127(u64i1DArray):    126(ptr) Variable UniformConstant
+             131:             TypeImage 84(int64_t) 2D array nonsampled format:R64ui
+             132:             TypePointer UniformConstant 131
+133(u64i2DArray):    132(ptr) Variable UniformConstant
+    136(ResType):             TypeStruct 16(int) 85(i64vec4)
+             140:             TypeImage 84(int64_t) Cube array nonsampled format:R64ui
+             141:             TypePointer UniformConstant 140
+142(u64iCubeArray):    141(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
            9(f4):      8(ptr) Variable Function
@@ -131,5 +199,46 @@
               80:    7(fvec4) ConvertUToF 79
               81:    7(fvec4) FAdd 78 80
                               Store 77(fragColor) 81
+              93:          90 Load 92(i64i1D)
+              94: 83(i64vec4) ImageRead 93 17 Lod 18
+              96:     95(ptr) AccessChain 88 89
+              97: 83(i64vec4) Load 96
+              98: 83(i64vec4) IAdd 97 94
+              99:     95(ptr) AccessChain 88 89
+                              Store 99 98
+             103:         100 Load 102(i64i2D)
+             104: 83(i64vec4) ImageRead 103 28 Lod 18
+             105:     95(ptr) AccessChain 88 89
+             106: 83(i64vec4) Load 105
+             107: 83(i64vec4) IAdd 106 104
+             108:     95(ptr) AccessChain 88 89
+                              Store 108 107
+             112:         109 Load 111(i64i3D)
+             113: 83(i64vec4) ImageRead 112 40 Lod 18
+             114:     95(ptr) AccessChain 88 89
+             115: 83(i64vec4) Load 114
+             116: 83(i64vec4) IAdd 115 113
+             117:     95(ptr) AccessChain 88 89
+                              Store 117 116
+             121:         118 Load 120(u64iCube)
+             123:    122(ptr) AccessChain 88 17
+             124: 85(i64vec4) Load 123
+                              ImageWrite 121 40 124 Lod 18
+             128:         125 Load 127(u64i1DArray)
+             129:    122(ptr) AccessChain 88 17
+             130: 85(i64vec4) Load 129
+                              ImageWrite 128 28 130 Lod 18
+             134:         131 Load 133(u64i2DArray)
+             135:    122(ptr) AccessChain 88 17
+             137:136(ResType) ImageSparseRead 134 40 Lod 18
+             138: 85(i64vec4) CompositeExtract 137 1
+                              Store 135 138
+             139:     16(int) CompositeExtract 137 0
+             143:         140 Load 142(u64iCubeArray)
+             144:    122(ptr) AccessChain 88 17
+             145:136(ResType) ImageSparseRead 143 40 Lod 18
+             146: 85(i64vec4) CompositeExtract 145 1
+                              Store 144 146
+             147:     16(int) CompositeExtract 145 0
                               Return
                               FunctionEnd
diff --git a/third_party/glslang/src/Test/baseResults/spv.layer.tese.out b/third_party/glslang/src/Test/baseResults/spv.layer.tese.out
new file mode 100644
index 0000000..906340f
--- /dev/null
+++ b/third_party/glslang/src/Test/baseResults/spv.layer.tese.out
@@ -0,0 +1,30 @@
+spv.layer.tese
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 10
+
+                              Capability Tessellation
+                              Capability ShaderViewportIndexLayerNV
+                              Extension  "SPV_EXT_shader_viewport_index_layer"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint TessellationEvaluation 4  "main" 8
+                              ExecutionMode 4 Triangles
+                              ExecutionMode 4 SpacingEqual
+                              ExecutionMode 4 VertexOrderCcw
+                              Source GLSL 450
+                              SourceExtension  "GL_ARB_shader_viewport_layer_array"
+                              Name 4  "main"
+                              Name 8  "gl_Layer"
+                              Decorate 8(gl_Layer) BuiltIn Layer
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 1
+               7:             TypePointer Output 6(int)
+     8(gl_Layer):      7(ptr) Variable Output
+               9:      6(int) Constant 1
+         4(main):           2 Function None 3
+               5:             Label
+                              Store 8(gl_Layer) 9
+                              Return
+                              FunctionEnd
diff --git a/third_party/glslang/src/Test/baseResults/spv.meshShaderBuiltins.mesh.out b/third_party/glslang/src/Test/baseResults/spv.meshShaderBuiltins.mesh.out
index f0c252a..b26122e 100644
--- a/third_party/glslang/src/Test/baseResults/spv.meshShaderBuiltins.mesh.out
+++ b/third_party/glslang/src/Test/baseResults/spv.meshShaderBuiltins.mesh.out
@@ -5,7 +5,6 @@
 
                               Capability ClipDistance
                               Capability CullDistance
-                              Capability MultiViewport
                               Capability DrawParameters
                               Capability ShaderViewportMaskNV
                               Capability MeshShadingNV
diff --git a/third_party/glslang/src/Test/baseResults/spv.meshShaderPerViewBuiltins.mesh.out b/third_party/glslang/src/Test/baseResults/spv.meshShaderPerViewBuiltins.mesh.out
index 907ae28..86a4fd2 100644
--- a/third_party/glslang/src/Test/baseResults/spv.meshShaderPerViewBuiltins.mesh.out
+++ b/third_party/glslang/src/Test/baseResults/spv.meshShaderPerViewBuiltins.mesh.out
@@ -3,7 +3,6 @@
 // Generated by (magic number): 8000a
 // Id's are bound by 126
 
-                              Capability MultiViewport
                               Capability PerViewAttributesNV
                               Capability MeshShadingNV
                               Extension  "SPV_NVX_multiview_per_view_attributes"
diff --git a/third_party/glslang/src/Test/baseResults/spv.meshShaderRedeclBuiltins.mesh.out b/third_party/glslang/src/Test/baseResults/spv.meshShaderRedeclBuiltins.mesh.out
index 66c3a0d..bfd2d85 100644
--- a/third_party/glslang/src/Test/baseResults/spv.meshShaderRedeclBuiltins.mesh.out
+++ b/third_party/glslang/src/Test/baseResults/spv.meshShaderRedeclBuiltins.mesh.out
@@ -5,7 +5,6 @@
 
                               Capability ClipDistance
                               Capability CullDistance
-                              Capability MultiViewport
                               Capability ShaderViewportMaskNV
                               Capability MeshShadingNV
                               Extension  "SPV_NV_mesh_shader"
diff --git a/third_party/glslang/src/Test/baseResults/spv.nonuniform.frag.out b/third_party/glslang/src/Test/baseResults/spv.nonuniform.frag.out
index 66f53d5..f6febc9 100644
--- a/third_party/glslang/src/Test/baseResults/spv.nonuniform.frag.out
+++ b/third_party/glslang/src/Test/baseResults/spv.nonuniform.frag.out
@@ -1,7 +1,7 @@
 spv.nonuniform.frag
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 235
+// Id's are bound by 289
 
                               Capability Shader
                               Capability InputAttachment
@@ -22,7 +22,7 @@
                               Extension  "SPV_EXT_descriptor_indexing"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 35 92 182
+                              EntryPoint Fragment 4  "main" 41 98 188
                               ExecutionMode 4 OriginUpperLeft
                               Source GLSL 450
                               SourceExtension  "GL_EXT_nonuniform_qualifier"
@@ -34,246 +34,268 @@
                               Name 17  "nu_li"
                               Name 18  "param"
                               Name 20  "param"
-                              Name 32  "b"
-                              Name 35  "nu_inv4"
-                              Name 41  "nu_gf"
-                              Name 47  "inputAttachmentDyn"
-                              Name 48  "dyn_i"
-                              Name 64  "uniformTexelBufferDyn"
-                              Name 78  "storageTexelBufferDyn"
-                              Name 87  "uname"
-                              MemberName 87(uname) 0  "a"
-                              Name 90  "uniformBuffer"
-                              Name 92  "nu_ii"
-                              Name 99  "bname"
-                              MemberName 99(bname) 0  "b"
-                              Name 102  "storageBuffer"
-                              Name 112  "sampledImage"
-                              Name 127  "storageImage"
-                              Name 139  "inputAttachment"
-                              Name 149  "uniformTexelBuffer"
-                              Name 160  "storageTexelBuffer"
-                              Name 171  "uniformTexArr"
-                              Name 178  "uniformSampler"
-                              Name 182  "inTexcoord"
-                              Name 190  "v"
-                              Name 205  "uv"
-                              Name 215  "m"
-                              Name 223  "S"
-                              MemberName 223(S) 0  "a"
-                              Name 225  "s"
-                              Decorate 9(nupi) DecorationNonUniformEXT
+                              Name 30  "nu_li2"
+                              Name 38  "b"
+                              Name 41  "nu_inv4"
+                              Name 47  "nu_gf"
+                              Name 53  "inputAttachmentDyn"
+                              Name 54  "dyn_i"
+                              Name 70  "uniformTexelBufferDyn"
+                              Name 84  "storageTexelBufferDyn"
+                              Name 93  "uname"
+                              MemberName 93(uname) 0  "a"
+                              Name 96  "uniformBuffer"
+                              Name 98  "nu_ii"
+                              Name 105  "bname"
+                              MemberName 105(bname) 0  "b"
+                              Name 108  "storageBuffer"
+                              Name 118  "sampledImage"
+                              Name 133  "storageImage"
+                              Name 145  "inputAttachment"
+                              Name 155  "uniformTexelBuffer"
+                              Name 166  "storageTexelBuffer"
+                              Name 177  "uniformTexArr"
+                              Name 184  "uniformSampler"
+                              Name 188  "inTexcoord"
+                              Name 207  "v"
+                              Name 222  "uv"
+                              Name 232  "m"
+                              Name 240  "S"
+                              MemberName 240(S) 0  "a"
+                              Name 242  "s"
+                              Name 252  "arr"
+                              Name 259  "um"
+                              Name 268  "US"
+                              MemberName 268(US) 0  "a"
+                              Name 270  "us"
+                              Name 278  "uarr"
                               Decorate 13 DecorationNonUniformEXT
-                              Decorate 17(nu_li) DecorationNonUniformEXT
-                              Decorate 17(nu_li) DecorationNonUniformEXT
                               Decorate 19 DecorationNonUniformEXT
-                              Decorate 18(param) DecorationNonUniformEXT
-                              Decorate 17(nu_li) DecorationNonUniformEXT
+                              Decorate 21 DecorationNonUniformEXT
+                              Decorate 22 DecorationNonUniformEXT
                               Decorate 24 DecorationNonUniformEXT
                               Decorate 28 DecorationNonUniformEXT
                               Decorate 29 DecorationNonUniformEXT
-                              Decorate 17(nu_li) DecorationNonUniformEXT
-                              Decorate 35(nu_inv4) Location 0
-                              Decorate 35(nu_inv4) DecorationNonUniformEXT
-                              Decorate 39 DecorationNonUniformEXT
-                              Decorate 40 DecorationNonUniformEXT
-                              Decorate 41(nu_gf) DecorationNonUniformEXT
-                              Decorate 41(nu_gf) DecorationNonUniformEXT
-                              Decorate 42 DecorationNonUniformEXT
-                              Decorate 43 DecorationNonUniformEXT
-                              Decorate 47(inputAttachmentDyn) DescriptorSet 0
-                              Decorate 47(inputAttachmentDyn) Binding 0
-                              Decorate 47(inputAttachmentDyn) InputAttachmentIndex 0
-                              Decorate 64(uniformTexelBufferDyn) DescriptorSet 0
-                              Decorate 64(uniformTexelBufferDyn) Binding 1
-                              Decorate 78(storageTexelBufferDyn) DescriptorSet 0
-                              Decorate 78(storageTexelBufferDyn) Binding 2
-                              MemberDecorate 87(uname) 0 Offset 0
-                              Decorate 87(uname) Block
-                              Decorate 90(uniformBuffer) DescriptorSet 0
-                              Decorate 90(uniformBuffer) Binding 3
-                              Decorate 92(nu_ii) Flat
-                              Decorate 92(nu_ii) Location 1
-                              Decorate 92(nu_ii) DecorationNonUniformEXT
-                              Decorate 92(nu_ii) DecorationNonUniformEXT
-                              Decorate 93 DecorationNonUniformEXT
-                              Decorate 95 DecorationNonUniformEXT
-                              Decorate 96 DecorationNonUniformEXT
-                              MemberDecorate 99(bname) 0 Offset 0
-                              Decorate 99(bname) BufferBlock
-                              Decorate 102(storageBuffer) DescriptorSet 0
-                              Decorate 102(storageBuffer) Binding 4
-                              Decorate 92(nu_ii) DecorationNonUniformEXT
-                              Decorate 103 DecorationNonUniformEXT
+                              Decorate 34 DecorationNonUniformEXT
+                              Decorate 35 DecorationNonUniformEXT
+                              Decorate 41(nu_inv4) Location 0
+                              Decorate 46 DecorationNonUniformEXT
+                              Decorate 48 DecorationNonUniformEXT
+                              Decorate 49 DecorationNonUniformEXT
+                              Decorate 53(inputAttachmentDyn) DescriptorSet 0
+                              Decorate 53(inputAttachmentDyn) Binding 0
+                              Decorate 53(inputAttachmentDyn) InputAttachmentIndex 0
+                              Decorate 70(uniformTexelBufferDyn) DescriptorSet 0
+                              Decorate 70(uniformTexelBufferDyn) Binding 1
+                              Decorate 84(storageTexelBufferDyn) DescriptorSet 0
+                              Decorate 84(storageTexelBufferDyn) Binding 2
+                              MemberDecorate 93(uname) 0 Offset 0
+                              Decorate 93(uname) Block
+                              Decorate 96(uniformBuffer) DescriptorSet 0
+                              Decorate 96(uniformBuffer) Binding 3
+                              Decorate 98(nu_ii) Flat
+                              Decorate 98(nu_ii) Location 1
+                              Decorate 99 DecorationNonUniformEXT
+                              Decorate 101 DecorationNonUniformEXT
+                              Decorate 102 DecorationNonUniformEXT
                               Decorate 104 DecorationNonUniformEXT
-                              Decorate 105 DecorationNonUniformEXT
-                              Decorate 112(sampledImage) DescriptorSet 0
-                              Decorate 112(sampledImage) Binding 5
-                              Decorate 92(nu_ii) DecorationNonUniformEXT
+                              MemberDecorate 105(bname) 0 Offset 0
+                              Decorate 105(bname) BufferBlock
+                              Decorate 108(storageBuffer) DescriptorSet 0
+                              Decorate 108(storageBuffer) Binding 4
+                              Decorate 109 DecorationNonUniformEXT
+                              Decorate 110 DecorationNonUniformEXT
+                              Decorate 111 DecorationNonUniformEXT
                               Decorate 113 DecorationNonUniformEXT
-                              Decorate 115 DecorationNonUniformEXT
-                              Decorate 116 DecorationNonUniformEXT
-                              Decorate 127(storageImage) DescriptorSet 0
-                              Decorate 127(storageImage) Binding 6
-                              Decorate 92(nu_ii) DecorationNonUniformEXT
-                              Decorate 128 DecorationNonUniformEXT
-                              Decorate 130 DecorationNonUniformEXT
-                              Decorate 131 DecorationNonUniformEXT
-                              Decorate 139(inputAttachment) DescriptorSet 0
-                              Decorate 139(inputAttachment) Binding 7
-                              Decorate 139(inputAttachment) InputAttachmentIndex 1
-                              Decorate 92(nu_ii) DecorationNonUniformEXT
-                              Decorate 140 DecorationNonUniformEXT
-                              Decorate 141 DecorationNonUniformEXT
-                              Decorate 142 DecorationNonUniformEXT
-                              Decorate 149(uniformTexelBuffer) DescriptorSet 0
-                              Decorate 149(uniformTexelBuffer) Binding 8
-                              Decorate 92(nu_ii) DecorationNonUniformEXT
-                              Decorate 150 DecorationNonUniformEXT
-                              Decorate 151 DecorationNonUniformEXT
-                              Decorate 152 DecorationNonUniformEXT
-                              Decorate 153 DecorationNonUniformEXT
-                              Decorate 160(storageTexelBuffer) DescriptorSet 0
-                              Decorate 160(storageTexelBuffer) Binding 9
-                              Decorate 92(nu_ii) DecorationNonUniformEXT
-                              Decorate 161 DecorationNonUniformEXT
-                              Decorate 162 DecorationNonUniformEXT
-                              Decorate 163 DecorationNonUniformEXT
-                              Decorate 171(uniformTexArr) DescriptorSet 0
-                              Decorate 171(uniformTexArr) Binding 10
-                              Decorate 92(nu_ii) DecorationNonUniformEXT
-                              Decorate 172 DecorationNonUniformEXT
-                              Decorate 174 DecorationNonUniformEXT
-                              Decorate 175 DecorationNonUniformEXT
-                              Decorate 178(uniformSampler) DescriptorSet 0
-                              Decorate 178(uniformSampler) Binding 11
-                              Decorate 182(inTexcoord) Location 2
-                              Decorate 190(v) DecorationNonUniformEXT
-                              Decorate 192 DecorationNonUniformEXT
-                              Decorate 193 DecorationNonUniformEXT
+                              Decorate 118(sampledImage) DescriptorSet 0
+                              Decorate 118(sampledImage) Binding 5
+                              Decorate 119 DecorationNonUniformEXT
+                              Decorate 121 DecorationNonUniformEXT
+                              Decorate 122 DecorationNonUniformEXT
+                              Decorate 133(storageImage) DescriptorSet 0
+                              Decorate 133(storageImage) Binding 6
+                              Decorate 134 DecorationNonUniformEXT
+                              Decorate 136 DecorationNonUniformEXT
+                              Decorate 137 DecorationNonUniformEXT
+                              Decorate 145(inputAttachment) DescriptorSet 0
+                              Decorate 145(inputAttachment) Binding 7
+                              Decorate 145(inputAttachment) InputAttachmentIndex 1
+                              Decorate 146 DecorationNonUniformEXT
+                              Decorate 147 DecorationNonUniformEXT
+                              Decorate 148 DecorationNonUniformEXT
+                              Decorate 155(uniformTexelBuffer) DescriptorSet 0
+                              Decorate 155(uniformTexelBuffer) Binding 8
+                              Decorate 156 DecorationNonUniformEXT
+                              Decorate 157 DecorationNonUniformEXT
+                              Decorate 158 DecorationNonUniformEXT
+                              Decorate 159 DecorationNonUniformEXT
+                              Decorate 166(storageTexelBuffer) DescriptorSet 0
+                              Decorate 166(storageTexelBuffer) Binding 9
+                              Decorate 167 DecorationNonUniformEXT
+                              Decorate 168 DecorationNonUniformEXT
+                              Decorate 169 DecorationNonUniformEXT
+                              Decorate 177(uniformTexArr) DescriptorSet 0
+                              Decorate 177(uniformTexArr) Binding 10
+                              Decorate 178 DecorationNonUniformEXT
+                              Decorate 180 DecorationNonUniformEXT
+                              Decorate 181 DecorationNonUniformEXT
+                              Decorate 184(uniformSampler) DescriptorSet 0
+                              Decorate 184(uniformSampler) Binding 11
+                              Decorate 188(inTexcoord) Location 2
                               Decorate 194 DecorationNonUniformEXT
                               Decorate 195 DecorationNonUniformEXT
+                              Decorate 196 DecorationNonUniformEXT
                               Decorate 199 DecorationNonUniformEXT
-                              Decorate 200 DecorationNonUniformEXT
-                              Decorate 201 DecorationNonUniformEXT
-                              Decorate 202 DecorationNonUniformEXT
-                              Decorate 92(nu_ii) DecorationNonUniformEXT
-                              Decorate 206 DecorationNonUniformEXT
-                              Decorate 207 DecorationNonUniformEXT
-                              Decorate 208 DecorationNonUniformEXT
-                              Decorate 209 DecorationNonUniformEXT
                               Decorate 210 DecorationNonUniformEXT
-                              Decorate 215(m) DecorationNonUniformEXT
-                              Decorate 216 DecorationNonUniformEXT
+                              Decorate 211 DecorationNonUniformEXT
+                              Decorate 212 DecorationNonUniformEXT
+                              Decorate 214 DecorationNonUniformEXT
                               Decorate 217 DecorationNonUniformEXT
-                              Decorate 225(s) DecorationNonUniformEXT
+                              Decorate 218 DecorationNonUniformEXT
+                              Decorate 219 DecorationNonUniformEXT
+                              Decorate 221 DecorationNonUniformEXT
+                              Decorate 223 DecorationNonUniformEXT
+                              Decorate 224 DecorationNonUniformEXT
+                              Decorate 225 DecorationNonUniformEXT
                               Decorate 226 DecorationNonUniformEXT
                               Decorate 227 DecorationNonUniformEXT
-                              Decorate 228 DecorationNonUniformEXT
                               Decorate 229 DecorationNonUniformEXT
-                              Decorate 92(nu_ii) DecorationNonUniformEXT
-                              Decorate 232 DecorationNonUniformEXT
                               Decorate 234 DecorationNonUniformEXT
+                              Decorate 244 DecorationNonUniformEXT
+                              Decorate 245 DecorationNonUniformEXT
+                              Decorate 246 DecorationNonUniformEXT
+                              Decorate 248 DecorationNonUniformEXT
+                              Decorate 254 DecorationNonUniformEXT
+                              Decorate 255 DecorationNonUniformEXT
+                              Decorate 256 DecorationNonUniformEXT
+                              Decorate 258 DecorationNonUniformEXT
+                              Decorate 260 DecorationNonUniformEXT
+                              Decorate 261 DecorationNonUniformEXT
+                              Decorate 262 DecorationNonUniformEXT
+                              Decorate 271 DecorationNonUniformEXT
+                              Decorate 272 DecorationNonUniformEXT
+                              Decorate 273 DecorationNonUniformEXT
+                              Decorate 274 DecorationNonUniformEXT
+                              Decorate 275 DecorationNonUniformEXT
+                              Decorate 277 DecorationNonUniformEXT
+                              Decorate 279 DecorationNonUniformEXT
+                              Decorate 280 DecorationNonUniformEXT
+                              Decorate 281 DecorationNonUniformEXT
+                              Decorate 282 DecorationNonUniformEXT
+                              Decorate 283 DecorationNonUniformEXT
+                              Decorate 285 DecorationNonUniformEXT
+                              Decorate 286 DecorationNonUniformEXT
+                              Decorate 288 DecorationNonUniformEXT
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
                7:             TypePointer Function 6(int)
                8:             TypeFunction 6(int) 7(ptr) 7(ptr)
               26:      6(int) Constant 2
-              30:             TypeFloat 32
-              31:             TypePointer Function 30(float)
-              33:             TypeVector 30(float) 4
-              34:             TypePointer Input 33(fvec4)
-     35(nu_inv4):     34(ptr) Variable Input
-              36:             TypeInt 32 0
-              37:     36(int) Constant 0
-              38:             TypePointer Input 30(float)
-              44:             TypeImage 30(float) SubpassData nonsampled format:Unknown
-              45:             TypeRuntimeArray 44
-              46:             TypePointer UniformConstant 45
-47(inputAttachmentDyn):     46(ptr) Variable UniformConstant
-              50:             TypePointer UniformConstant 44
-              53:      6(int) Constant 0
-              54:             TypeVector 6(int) 2
-              55:   54(ivec2) ConstantComposite 53 53
-              60:             TypeImage 30(float) Buffer sampled format:Unknown
-              61:             TypeSampledImage 60
-              62:             TypeRuntimeArray 61
-              63:             TypePointer UniformConstant 62
-64(uniformTexelBufferDyn):     63(ptr) Variable UniformConstant
-              66:             TypePointer UniformConstant 61
-              69:      6(int) Constant 1
-              75:             TypeImage 30(float) Buffer nonsampled format:R32f
-              76:             TypeRuntimeArray 75
-              77:             TypePointer UniformConstant 76
-78(storageTexelBufferDyn):     77(ptr) Variable UniformConstant
-              80:             TypePointer UniformConstant 75
-       87(uname):             TypeStruct 30(float)
-              88:             TypeRuntimeArray 87(uname)
-              89:             TypePointer Uniform 88
-90(uniformBuffer):     89(ptr) Variable Uniform
-              91:             TypePointer Input 6(int)
-       92(nu_ii):     91(ptr) Variable Input
-              94:             TypePointer Uniform 30(float)
-       99(bname):             TypeStruct 30(float)
-             100:             TypeRuntimeArray 99(bname)
-             101:             TypePointer Uniform 100
-102(storageBuffer):    101(ptr) Variable Uniform
-             108:             TypeImage 30(float) 2D sampled format:Unknown
-             109:             TypeSampledImage 108
-             110:             TypeRuntimeArray 109
-             111:             TypePointer UniformConstant 110
-112(sampledImage):    111(ptr) Variable UniformConstant
-             114:             TypePointer UniformConstant 109
-             117:             TypeVector 30(float) 2
-             118:   30(float) Constant 1056964608
-             119:  117(fvec2) ConstantComposite 118 118
-             124:             TypeImage 30(float) 2D nonsampled format:R32f
-             125:             TypeRuntimeArray 124
-             126:             TypePointer UniformConstant 125
-127(storageImage):    126(ptr) Variable UniformConstant
-             129:             TypePointer UniformConstant 124
-             132:   54(ivec2) ConstantComposite 69 69
-             137:             TypeRuntimeArray 44
-             138:             TypePointer UniformConstant 137
-139(inputAttachment):    138(ptr) Variable UniformConstant
-             147:             TypeRuntimeArray 61
-             148:             TypePointer UniformConstant 147
-149(uniformTexelBuffer):    148(ptr) Variable UniformConstant
-             158:             TypeRuntimeArray 75
-             159:             TypePointer UniformConstant 158
-160(storageTexelBuffer):    159(ptr) Variable UniformConstant
-             168:     36(int) Constant 8
-             169:             TypeArray 108 168
-             170:             TypePointer UniformConstant 169
-171(uniformTexArr):    170(ptr) Variable UniformConstant
-             173:             TypePointer UniformConstant 108
-             176:             TypeSampler
-             177:             TypePointer UniformConstant 176
-178(uniformSampler):    177(ptr) Variable UniformConstant
-             181:             TypePointer Input 117(fvec2)
- 182(inTexcoord):    181(ptr) Variable Input
-             188:             TypeVector 6(int) 4
-             189:             TypePointer Function 188(ivec4)
-             191:     36(int) Constant 1
-             198:     36(int) Constant 2
-             213:             TypeMatrix 33(fvec4) 4
-             214:             TypePointer Function 213
-          223(S):             TypeStruct 6(int)
-             224:             TypePointer Function 223(S)
+              36:             TypeFloat 32
+              37:             TypePointer Function 36(float)
+              39:             TypeVector 36(float) 4
+              40:             TypePointer Input 39(fvec4)
+     41(nu_inv4):     40(ptr) Variable Input
+              42:             TypeInt 32 0
+              43:     42(int) Constant 0
+              44:             TypePointer Input 36(float)
+              50:             TypeImage 36(float) SubpassData nonsampled format:Unknown
+              51:             TypeRuntimeArray 50
+              52:             TypePointer UniformConstant 51
+53(inputAttachmentDyn):     52(ptr) Variable UniformConstant
+              56:             TypePointer UniformConstant 50
+              59:      6(int) Constant 0
+              60:             TypeVector 6(int) 2
+              61:   60(ivec2) ConstantComposite 59 59
+              66:             TypeImage 36(float) Buffer sampled format:Unknown
+              67:             TypeSampledImage 66
+              68:             TypeRuntimeArray 67
+              69:             TypePointer UniformConstant 68
+70(uniformTexelBufferDyn):     69(ptr) Variable UniformConstant
+              72:             TypePointer UniformConstant 67
+              75:      6(int) Constant 1
+              81:             TypeImage 36(float) Buffer nonsampled format:R32f
+              82:             TypeRuntimeArray 81
+              83:             TypePointer UniformConstant 82
+84(storageTexelBufferDyn):     83(ptr) Variable UniformConstant
+              86:             TypePointer UniformConstant 81
+       93(uname):             TypeStruct 36(float)
+              94:             TypeRuntimeArray 93(uname)
+              95:             TypePointer Uniform 94
+96(uniformBuffer):     95(ptr) Variable Uniform
+              97:             TypePointer Input 6(int)
+       98(nu_ii):     97(ptr) Variable Input
+             100:             TypePointer Uniform 36(float)
+      105(bname):             TypeStruct 36(float)
+             106:             TypeRuntimeArray 105(bname)
+             107:             TypePointer Uniform 106
+108(storageBuffer):    107(ptr) Variable Uniform
+             114:             TypeImage 36(float) 2D sampled format:Unknown
+             115:             TypeSampledImage 114
+             116:             TypeRuntimeArray 115
+             117:             TypePointer UniformConstant 116
+118(sampledImage):    117(ptr) Variable UniformConstant
+             120:             TypePointer UniformConstant 115
+             123:             TypeVector 36(float) 2
+             124:   36(float) Constant 1056964608
+             125:  123(fvec2) ConstantComposite 124 124
+             130:             TypeImage 36(float) 2D nonsampled format:R32f
+             131:             TypeRuntimeArray 130
+             132:             TypePointer UniformConstant 131
+133(storageImage):    132(ptr) Variable UniformConstant
+             135:             TypePointer UniformConstant 130
+             138:   60(ivec2) ConstantComposite 75 75
+             143:             TypeRuntimeArray 50
+             144:             TypePointer UniformConstant 143
+145(inputAttachment):    144(ptr) Variable UniformConstant
+             153:             TypeRuntimeArray 67
+             154:             TypePointer UniformConstant 153
+155(uniformTexelBuffer):    154(ptr) Variable UniformConstant
+             164:             TypeRuntimeArray 81
+             165:             TypePointer UniformConstant 164
+166(storageTexelBuffer):    165(ptr) Variable UniformConstant
+             174:     42(int) Constant 8
+             175:             TypeArray 114 174
+             176:             TypePointer UniformConstant 175
+177(uniformTexArr):    176(ptr) Variable UniformConstant
+             179:             TypePointer UniformConstant 114
+             182:             TypeSampler
+             183:             TypePointer UniformConstant 182
+184(uniformSampler):    183(ptr) Variable UniformConstant
+             187:             TypePointer Input 123(fvec2)
+ 188(inTexcoord):    187(ptr) Variable Input
+             205:             TypeVector 6(int) 4
+             206:             TypePointer Function 205(ivec4)
+             208:     42(int) Constant 1
+             215:     42(int) Constant 2
+             230:             TypeMatrix 39(fvec4) 4
+             231:             TypePointer Function 230
+          240(S):             TypeStruct 6(int)
+             241:             TypePointer Function 240(S)
+             249:     42(int) Constant 10
+             250:             TypeArray 6(int) 249
+             251:             TypePointer Function 250
+         268(US):             TypeStruct 250
+             269:             TypePointer Function 268(US)
          4(main):           2 Function None 3
                5:             Label
            16(a):      7(ptr) Variable Function
        17(nu_li):      7(ptr) Variable Function
        18(param):      7(ptr) Variable Function
        20(param):      7(ptr) Variable Function
-           32(b):     31(ptr) Variable Function
-       41(nu_gf):     31(ptr) Variable Function
-       48(dyn_i):      7(ptr) Variable Function
-          190(v):    189(ptr) Variable Function
-         205(uv):    189(ptr) Variable Function
-          215(m):    214(ptr) Variable Function
-          225(s):    224(ptr) Variable Function
+      30(nu_li2):      7(ptr) Variable Function
+           38(b):     37(ptr) Variable Function
+       47(nu_gf):     37(ptr) Variable Function
+       54(dyn_i):      7(ptr) Variable Function
+          207(v):    206(ptr) Variable Function
+         222(uv):    206(ptr) Variable Function
+          232(m):    231(ptr) Variable Function
+          242(s):    241(ptr) Variable Function
+        252(arr):    251(ptr) Variable Function
+         259(um):    231(ptr) Variable Function
+         270(us):    269(ptr) Variable Function
+       278(uarr):    251(ptr) Variable Function
               19:      6(int) Load 17(nu_li)
                               Store 18(param) 19
               21:      6(int) FunctionCall 11(foo(i1;i1;) 18(param) 20(param)
@@ -287,141 +309,191 @@
               28:      6(int) CopyObject 27
               29:      6(int) IAdd 24 28
                               Store 17(nu_li) 29
-              39:     38(ptr) AccessChain 35(nu_inv4) 37
-              40:   30(float) Load 39
-              42:   30(float) Load 41(nu_gf)
-              43:   30(float) FMul 40 42
-                              Store 32(b) 43
-              49:      6(int) Load 48(dyn_i)
-              51:     50(ptr) AccessChain 47(inputAttachmentDyn) 49
-              52:          44 Load 51
-              56:   33(fvec4) ImageRead 52 55
-              57:   30(float) CompositeExtract 56 0
-              58:   30(float) Load 32(b)
-              59:   30(float) FAdd 58 57
-                              Store 32(b) 59
-              65:      6(int) Load 48(dyn_i)
-              67:     66(ptr) AccessChain 64(uniformTexelBufferDyn) 65
-              68:          61 Load 67
-              70:          60 Image 68
-              71:   33(fvec4) ImageFetch 70 69
-              72:   30(float) CompositeExtract 71 0
-              73:   30(float) Load 32(b)
-              74:   30(float) FAdd 73 72
-                              Store 32(b) 74
-              79:      6(int) Load 48(dyn_i)
-              81:     80(ptr) AccessChain 78(storageTexelBufferDyn) 79
-              82:          75 Load 81
-              83:   33(fvec4) ImageRead 82 69
-              84:   30(float) CompositeExtract 83 0
-              85:   30(float) Load 32(b)
-              86:   30(float) FAdd 85 84
-                              Store 32(b) 86
-              93:      6(int) Load 92(nu_ii)
-              95:     94(ptr) AccessChain 90(uniformBuffer) 93 53
-              96:   30(float) Load 95
-              97:   30(float) Load 32(b)
-              98:   30(float) FAdd 97 96
-                              Store 32(b) 98
-             103:      6(int) Load 92(nu_ii)
-             104:     94(ptr) AccessChain 102(storageBuffer) 103 53
-             105:   30(float) Load 104
-             106:   30(float) Load 32(b)
-             107:   30(float) FAdd 106 105
-                              Store 32(b) 107
-             113:      6(int) Load 92(nu_ii)
-             115:    114(ptr) AccessChain 112(sampledImage) 113
-             116:         109 Load 115
-             120:   33(fvec4) ImageSampleImplicitLod 116 119
-             121:   30(float) CompositeExtract 120 0
-             122:   30(float) Load 32(b)
-             123:   30(float) FAdd 122 121
-                              Store 32(b) 123
-             128:      6(int) Load 92(nu_ii)
-             130:    129(ptr) AccessChain 127(storageImage) 128
-             131:         124 Load 130
-             133:   33(fvec4) ImageRead 131 132
-             134:   30(float) CompositeExtract 133 0
-             135:   30(float) Load 32(b)
-             136:   30(float) FAdd 135 134
-                              Store 32(b) 136
-             140:      6(int) Load 92(nu_ii)
-             141:     50(ptr) AccessChain 139(inputAttachment) 140
-             142:          44 Load 141
-             143:   33(fvec4) ImageRead 142 55
-             144:   30(float) CompositeExtract 143 0
-             145:   30(float) Load 32(b)
-             146:   30(float) FAdd 145 144
-                              Store 32(b) 146
-             150:      6(int) Load 92(nu_ii)
-             151:     66(ptr) AccessChain 149(uniformTexelBuffer) 150
-             152:          61 Load 151
-             153:          60 Image 152
-             154:   33(fvec4) ImageFetch 153 69
-             155:   30(float) CompositeExtract 154 0
-             156:   30(float) Load 32(b)
-             157:   30(float) FAdd 156 155
-                              Store 32(b) 157
-             161:      6(int) Load 92(nu_ii)
-             162:     80(ptr) AccessChain 160(storageTexelBuffer) 161
-             163:          75 Load 162
-             164:   33(fvec4) ImageRead 163 69
-             165:   30(float) CompositeExtract 164 0
-             166:   30(float) Load 32(b)
-             167:   30(float) FAdd 166 165
-                              Store 32(b) 167
-             172:      6(int) Load 92(nu_ii)
-             174:    173(ptr) AccessChain 171(uniformTexArr) 172
-             175:         108 Load 174
-             179:         176 Load 178(uniformSampler)
-             180:         109 SampledImage 175 179
-             183:  117(fvec2) Load 182(inTexcoord)
-             184:   33(fvec4) ImageSampleImplicitLod 180 183
-             185:   30(float) CompositeExtract 184 0
-             186:   30(float) Load 32(b)
-             187:   30(float) FAdd 186 185
-                              Store 32(b) 187
-             192:      7(ptr) AccessChain 190(v) 191
-             193:      6(int) Load 192
-             194:     94(ptr) AccessChain 90(uniformBuffer) 193 53
-             195:   30(float) Load 194
-             196:   30(float) Load 32(b)
-             197:   30(float) FAdd 196 195
-                              Store 32(b) 197
-             199:      7(ptr) AccessChain 190(v) 198
-             200:      6(int) Load 199
-             201:     94(ptr) AccessChain 90(uniformBuffer) 200 53
-             202:   30(float) Load 201
-             203:   30(float) Load 32(b)
-             204:   30(float) FAdd 203 202
-                              Store 32(b) 204
-             206:      6(int) Load 92(nu_ii)
-             207:      7(ptr) AccessChain 205(uv) 206
-             208:      6(int) Load 207
-             209:     94(ptr) AccessChain 90(uniformBuffer) 208 53
-             210:   30(float) Load 209
-             211:   30(float) Load 32(b)
-             212:   30(float) FAdd 211 210
-                              Store 32(b) 212
-             216:     31(ptr) AccessChain 215(m) 26 198
-             217:   30(float) Load 216
-             218:      6(int) ConvertFToS 217
-             219:     94(ptr) AccessChain 90(uniformBuffer) 218 53
-             220:   30(float) Load 219
-             221:   30(float) Load 32(b)
-             222:   30(float) FAdd 221 220
-                              Store 32(b) 222
-             226:      7(ptr) AccessChain 225(s) 53
-             227:      6(int) Load 226
-             228:     94(ptr) AccessChain 90(uniformBuffer) 227 53
-             229:   30(float) Load 228
-             230:   30(float) Load 32(b)
-             231:   30(float) FAdd 230 229
-                              Store 32(b) 231
-             232:      6(int) Load 92(nu_ii)
-             233:   30(float) Load 32(b)
-             234:     94(ptr) AccessChain 102(storageBuffer) 232 53
-                              Store 234 233
+              31:      6(int) Load 16(a)
+              32:      6(int) Load 16(a)
+              33:      6(int) IMul 32 26
+              34:      6(int) CopyObject 33
+              35:      6(int) IAdd 31 34
+                              Store 30(nu_li2) 35
+              45:     44(ptr) AccessChain 41(nu_inv4) 43
+              46:   36(float) Load 45
+              48:   36(float) Load 47(nu_gf)
+              49:   36(float) FMul 46 48
+                              Store 38(b) 49
+              55:      6(int) Load 54(dyn_i)
+              57:     56(ptr) AccessChain 53(inputAttachmentDyn) 55
+              58:          50 Load 57
+              62:   39(fvec4) ImageRead 58 61
+              63:   36(float) CompositeExtract 62 0
+              64:   36(float) Load 38(b)
+              65:   36(float) FAdd 64 63
+                              Store 38(b) 65
+              71:      6(int) Load 54(dyn_i)
+              73:     72(ptr) AccessChain 70(uniformTexelBufferDyn) 71
+              74:          67 Load 73
+              76:          66 Image 74
+              77:   39(fvec4) ImageFetch 76 75
+              78:   36(float) CompositeExtract 77 0
+              79:   36(float) Load 38(b)
+              80:   36(float) FAdd 79 78
+                              Store 38(b) 80
+              85:      6(int) Load 54(dyn_i)
+              87:     86(ptr) AccessChain 84(storageTexelBufferDyn) 85
+              88:          81 Load 87
+              89:   39(fvec4) ImageRead 88 75
+              90:   36(float) CompositeExtract 89 0
+              91:   36(float) Load 38(b)
+              92:   36(float) FAdd 91 90
+                              Store 38(b) 92
+              99:      6(int) Load 98(nu_ii)
+             101:    100(ptr) AccessChain 96(uniformBuffer) 99 59
+             102:   36(float) Load 101
+             103:   36(float) Load 38(b)
+             104:   36(float) FAdd 103 102
+                              Store 38(b) 104
+             109:      6(int) Load 98(nu_ii)
+             110:    100(ptr) AccessChain 108(storageBuffer) 109 59
+             111:   36(float) Load 110
+             112:   36(float) Load 38(b)
+             113:   36(float) FAdd 112 111
+                              Store 38(b) 113
+             119:      6(int) Load 98(nu_ii)
+             121:    120(ptr) AccessChain 118(sampledImage) 119
+             122:         115 Load 121
+             126:   39(fvec4) ImageSampleImplicitLod 122 125
+             127:   36(float) CompositeExtract 126 0
+             128:   36(float) Load 38(b)
+             129:   36(float) FAdd 128 127
+                              Store 38(b) 129
+             134:      6(int) Load 98(nu_ii)
+             136:    135(ptr) AccessChain 133(storageImage) 134
+             137:         130 Load 136
+             139:   39(fvec4) ImageRead 137 138
+             140:   36(float) CompositeExtract 139 0
+             141:   36(float) Load 38(b)
+             142:   36(float) FAdd 141 140
+                              Store 38(b) 142
+             146:      6(int) Load 98(nu_ii)
+             147:     56(ptr) AccessChain 145(inputAttachment) 146
+             148:          50 Load 147
+             149:   39(fvec4) ImageRead 148 61
+             150:   36(float) CompositeExtract 149 0
+             151:   36(float) Load 38(b)
+             152:   36(float) FAdd 151 150
+                              Store 38(b) 152
+             156:      6(int) Load 98(nu_ii)
+             157:     72(ptr) AccessChain 155(uniformTexelBuffer) 156
+             158:          67 Load 157
+             159:          66 Image 158
+             160:   39(fvec4) ImageFetch 159 75
+             161:   36(float) CompositeExtract 160 0
+             162:   36(float) Load 38(b)
+             163:   36(float) FAdd 162 161
+                              Store 38(b) 163
+             167:      6(int) Load 98(nu_ii)
+             168:     86(ptr) AccessChain 166(storageTexelBuffer) 167
+             169:          81 Load 168
+             170:   39(fvec4) ImageRead 169 75
+             171:   36(float) CompositeExtract 170 0
+             172:   36(float) Load 38(b)
+             173:   36(float) FAdd 172 171
+                              Store 38(b) 173
+             178:      6(int) Load 98(nu_ii)
+             180:    179(ptr) AccessChain 177(uniformTexArr) 178
+             181:         114 Load 180
+             185:         182 Load 184(uniformSampler)
+             186:         115 SampledImage 181 185
+             189:  123(fvec2) Load 188(inTexcoord)
+             190:   39(fvec4) ImageSampleImplicitLod 186 189
+             191:   36(float) CompositeExtract 190 0
+             192:   36(float) Load 38(b)
+             193:   36(float) FAdd 192 191
+                              Store 38(b) 193
+             194:      6(int) Load 98(nu_ii)
+             195:    179(ptr) AccessChain 177(uniformTexArr) 194
+             196:         114 Load 195
+             197:         182 Load 184(uniformSampler)
+             198:         115 SampledImage 196 197
+             199:         115 CopyObject 198
+             200:  123(fvec2) Load 188(inTexcoord)
+             201:   39(fvec4) ImageSampleImplicitLod 199 200
+             202:   36(float) CompositeExtract 201 0
+             203:   36(float) Load 38(b)
+             204:   36(float) FAdd 203 202
+                              Store 38(b) 204
+             209:      7(ptr) AccessChain 207(v) 208
+             210:      6(int) Load 209
+             211:    100(ptr) AccessChain 96(uniformBuffer) 210 59
+             212:   36(float) Load 211
+             213:   36(float) Load 38(b)
+             214:   36(float) FAdd 213 212
+                              Store 38(b) 214
+             216:      7(ptr) AccessChain 207(v) 215
+             217:      6(int) Load 216
+             218:    100(ptr) AccessChain 96(uniformBuffer) 217 59
+             219:   36(float) Load 218
+             220:   36(float) Load 38(b)
+             221:   36(float) FAdd 220 219
+                              Store 38(b) 221
+             223:      6(int) Load 98(nu_ii)
+             224:      7(ptr) AccessChain 222(uv) 223
+             225:      6(int) Load 224
+             226:    100(ptr) AccessChain 96(uniformBuffer) 225 59
+             227:   36(float) Load 226
+             228:   36(float) Load 38(b)
+             229:   36(float) FAdd 228 227
+                              Store 38(b) 229
+             233:     37(ptr) AccessChain 232(m) 26 215
+             234:   36(float) Load 233
+             235:      6(int) ConvertFToS 234
+             236:    100(ptr) AccessChain 96(uniformBuffer) 235 59
+             237:   36(float) Load 236
+             238:   36(float) Load 38(b)
+             239:   36(float) FAdd 238 237
+                              Store 38(b) 239
+             243:      7(ptr) AccessChain 242(s) 59
+             244:      6(int) Load 243
+             245:    100(ptr) AccessChain 96(uniformBuffer) 244 59
+             246:   36(float) Load 245
+             247:   36(float) Load 38(b)
+             248:   36(float) FAdd 247 246
+                              Store 38(b) 248
+             253:      7(ptr) AccessChain 252(arr) 26
+             254:      6(int) Load 253
+             255:    100(ptr) AccessChain 96(uniformBuffer) 254 59
+             256:   36(float) Load 255
+             257:   36(float) Load 38(b)
+             258:   36(float) FAdd 257 256
+                              Store 38(b) 258
+             260:      6(int) Load 98(nu_ii)
+             261:     37(ptr) AccessChain 259(um) 260 215
+             262:   36(float) Load 261
+             263:      6(int) ConvertFToS 262
+             264:    100(ptr) AccessChain 96(uniformBuffer) 263 59
+             265:   36(float) Load 264
+             266:   36(float) Load 38(b)
+             267:   36(float) FAdd 266 265
+                              Store 38(b) 267
+             271:      6(int) Load 98(nu_ii)
+             272:      7(ptr) AccessChain 270(us) 59 271
+             273:      6(int) Load 272
+             274:    100(ptr) AccessChain 96(uniformBuffer) 273 59
+             275:   36(float) Load 274
+             276:   36(float) Load 38(b)
+             277:   36(float) FAdd 276 275
+                              Store 38(b) 277
+             279:      6(int) Load 98(nu_ii)
+             280:      7(ptr) AccessChain 278(uarr) 279
+             281:      6(int) Load 280
+             282:    100(ptr) AccessChain 96(uniformBuffer) 281 59
+             283:   36(float) Load 282
+             284:   36(float) Load 38(b)
+             285:   36(float) FAdd 284 283
+                              Store 38(b) 285
+             286:      6(int) Load 98(nu_ii)
+             287:   36(float) Load 38(b)
+             288:    100(ptr) AccessChain 108(storageBuffer) 286 59
+                              Store 288 287
                               Return
                               FunctionEnd
   11(foo(i1;i1;):      6(int) Function None 8
diff --git a/third_party/glslang/src/Test/baseResults/spv.nonuniform4.frag.out b/third_party/glslang/src/Test/baseResults/spv.nonuniform4.frag.out
index 92cbd36..6bfc957 100644
--- a/third_party/glslang/src/Test/baseResults/spv.nonuniform4.frag.out
+++ b/third_party/glslang/src/Test/baseResults/spv.nonuniform4.frag.out
@@ -23,6 +23,7 @@
                               Decorate 13(rIndex) Flat
                               Decorate 13(rIndex) Location 3
                               Decorate 15 DecorationNonUniformEXT
+                              Decorate 17 DecorationNonUniformEXT
                               Decorate 21 DecorationNonUniformEXT
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/third_party/glslang/src/Test/baseResults/spv.specConstant.vert.out b/third_party/glslang/src/Test/baseResults/spv.specConstant.vert.out
index 921cc68..76f3de6 100644
--- a/third_party/glslang/src/Test/baseResults/spv.specConstant.vert.out
+++ b/third_party/glslang/src/Test/baseResults/spv.specConstant.vert.out
@@ -11,7 +11,7 @@
                               Source GLSL 400
                               Name 4  "main"
                               Name 9  "arraySize"
-                              Name 14  "foo(vf4[s4546];"
+                              Name 14  "foo(vf4[s805310914];"
                               Name 13  "p"
                               Name 17  "builtin_spec_constant("
                               Name 20  "color"
@@ -106,10 +106,10 @@
                               Store 20(color) 46
               48:          10 Load 22(ucol)
                               Store 47(param) 48
-              49:           2 FunctionCall 14(foo(vf4[s4546];) 47(param)
+              49:           2 FunctionCall 14(foo(vf4[s805310914];) 47(param)
                               Return
                               FunctionEnd
-14(foo(vf4[s4546];):           2 Function None 12
+14(foo(vf4[s805310914];):           2 Function None 12
            13(p):     11(ptr) FunctionParameter
               15:             Label
               54:     24(ptr) AccessChain 53(dupUcol) 23
diff --git a/third_party/glslang/src/Test/baseResults/spv.stereoViewRendering.tesc.out b/third_party/glslang/src/Test/baseResults/spv.stereoViewRendering.tesc.out
index a357346..f01e53b 100644
--- a/third_party/glslang/src/Test/baseResults/spv.stereoViewRendering.tesc.out
+++ b/third_party/glslang/src/Test/baseResults/spv.stereoViewRendering.tesc.out
@@ -3,7 +3,6 @@
 // Generated by (magic number): 8000a
 // Id's are bound by 42
 
-                              Capability Geometry
                               Capability Tessellation
                               Capability ShaderViewportIndexLayerNV
                               Capability ShaderViewportMaskNV
diff --git a/third_party/glslang/src/Test/baseResults/spv.stereoViewRendering.vert.out b/third_party/glslang/src/Test/baseResults/spv.stereoViewRendering.vert.out
index 0667cb8..e74921a 100644
--- a/third_party/glslang/src/Test/baseResults/spv.stereoViewRendering.vert.out
+++ b/third_party/glslang/src/Test/baseResults/spv.stereoViewRendering.vert.out
@@ -4,7 +4,6 @@
 // Id's are bound by 27
 
                               Capability Shader
-                              Capability Geometry
                               Capability ShaderViewportIndexLayerNV
                               Capability ShaderViewportMaskNV
                               Capability ShaderStereoViewNV
diff --git a/third_party/glslang/src/Test/baseResults/spv.terminate.frag.out b/third_party/glslang/src/Test/baseResults/spv.terminate.frag.out
new file mode 100755
index 0000000..39cb151
--- /dev/null
+++ b/third_party/glslang/src/Test/baseResults/spv.terminate.frag.out
@@ -0,0 +1,20 @@
+spv.terminate.frag
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 7
+
+                              Capability Shader
+                              Extension  "SPV_KHR_terminate_invocation"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main"
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 400
+                              SourceExtension  "GL_EXT_terminate_invocation"
+                              Name 4  "main"
+               2:             TypeVoid
+               3:             TypeFunction 2
+         4(main):           2 Function None 3
+               5:             Label
+                              TerminateInvocation
+                              FunctionEnd
diff --git a/third_party/glslang/src/Test/baseResults/spv.viewportArray2.tesc.out b/third_party/glslang/src/Test/baseResults/spv.viewportArray2.tesc.out
index 6a9dccc..74235a5 100644
--- a/third_party/glslang/src/Test/baseResults/spv.viewportArray2.tesc.out
+++ b/third_party/glslang/src/Test/baseResults/spv.viewportArray2.tesc.out
@@ -4,9 +4,7 @@
 // Generated by (magic number): 8000a
 // Id's are bound by 25
 
-                              Capability Geometry
                               Capability Tessellation
-                              Capability MultiViewport
                               Capability ShaderViewportIndexLayerNV
                               Capability ShaderViewportMaskNV
                               Extension  "SPV_EXT_shader_viewport_index_layer"
diff --git a/third_party/glslang/src/Test/baseResults/spv.viewportArray2.vert.out b/third_party/glslang/src/Test/baseResults/spv.viewportArray2.vert.out
index 96e5b07..cf29cd7 100644
--- a/third_party/glslang/src/Test/baseResults/spv.viewportArray2.vert.out
+++ b/third_party/glslang/src/Test/baseResults/spv.viewportArray2.vert.out
@@ -4,8 +4,6 @@
 // Id's are bound by 19
 
                               Capability Shader
-                              Capability Geometry
-                              Capability MultiViewport
                               Capability ShaderViewportIndexLayerNV
                               Capability ShaderViewportMaskNV
                               Extension  "SPV_EXT_shader_viewport_index_layer"
diff --git a/third_party/glslang/src/Test/baseResults/spv.viewportindex.tese.out b/third_party/glslang/src/Test/baseResults/spv.viewportindex.tese.out
new file mode 100644
index 0000000..12a30cf
--- /dev/null
+++ b/third_party/glslang/src/Test/baseResults/spv.viewportindex.tese.out
@@ -0,0 +1,30 @@
+spv.viewportindex.tese
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 10
+
+                              Capability Tessellation
+                              Capability ShaderViewportIndexLayerNV
+                              Extension  "SPV_EXT_shader_viewport_index_layer"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint TessellationEvaluation 4  "main" 8
+                              ExecutionMode 4 Triangles
+                              ExecutionMode 4 SpacingEqual
+                              ExecutionMode 4 VertexOrderCcw
+                              Source GLSL 450
+                              SourceExtension  "GL_ARB_shader_viewport_layer_array"
+                              Name 4  "main"
+                              Name 8  "gl_ViewportIndex"
+                              Decorate 8(gl_ViewportIndex) BuiltIn ViewportIndex
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 1
+               7:             TypePointer Output 6(int)
+8(gl_ViewportIndex):      7(ptr) Variable Output
+               9:      6(int) Constant 1
+         4(main):           2 Function None 3
+               5:             Label
+                              Store 8(gl_ViewportIndex) 9
+                              Return
+                              FunctionEnd
diff --git a/third_party/glslang/src/Test/baseResults/terminate.frag.out b/third_party/glslang/src/Test/baseResults/terminate.frag.out
new file mode 100755
index 0000000..4f72c9b
--- /dev/null
+++ b/third_party/glslang/src/Test/baseResults/terminate.frag.out
@@ -0,0 +1,24 @@
+terminate.frag
+ERROR: 0:3: 'terminateInvocation' : undeclared identifier 
+ERROR: 0:9: '' :  syntax error, unexpected TERMINATE_INVOCATION, expecting COMMA or SEMICOLON
+ERROR: 2 compilation errors.  No code generated.
+
+
+Shader version: 400
+Requested GL_EXT_terminate_invocation
+ERROR: node is still EOpNull!
+0:3  Function Definition: foo( ( global void)
+0:3    Function Parameters: 
+0:3    Sequence
+0:3      'terminateInvocation' ( temp float)
+0:?   Linker Objects
+
+
+Linked fragment stage:
+
+
+Shader version: 400
+Requested GL_EXT_terminate_invocation
+ERROR: node is still EOpNull!
+0:?   Linker Objects
+
diff --git a/third_party/glslang/src/Test/baseResults/terminate.vert.out b/third_party/glslang/src/Test/baseResults/terminate.vert.out
new file mode 100755
index 0000000..cd984af
--- /dev/null
+++ b/third_party/glslang/src/Test/baseResults/terminate.vert.out
@@ -0,0 +1,36 @@
+terminate.vert
+ERROR: 0:3: 'terminateInvocation' : undeclared identifier 
+ERROR: 0:9: 'terminateInvocation' : not supported in this stage: vertex
+ERROR: 2 compilation errors.  No code generated.
+
+
+Shader version: 400
+Requested GL_EXT_terminate_invocation
+ERROR: node is still EOpNull!
+0:3  Function Definition: foo( ( global void)
+0:3    Function Parameters: 
+0:3    Sequence
+0:3      'terminateInvocation' ( temp float)
+0:7  Function Definition: main( ( global void)
+0:7    Function Parameters: 
+0:9    Sequence
+0:9      Branch: TerminateInvocation
+0:?   Linker Objects
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
+
+Linked vertex stage:
+
+
+Shader version: 400
+Requested GL_EXT_terminate_invocation
+ERROR: node is still EOpNull!
+0:7  Function Definition: main( ( global void)
+0:7    Function Parameters: 
+0:9    Sequence
+0:9      Branch: TerminateInvocation
+0:?   Linker Objects
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
diff --git a/third_party/glslang/src/Test/baseResults/tokenPaste.vert.out b/third_party/glslang/src/Test/baseResults/tokenPaste.vert.out
index b5ba9a5..5ae1f75 100644
--- a/third_party/glslang/src/Test/baseResults/tokenPaste.vert.out
+++ b/third_party/glslang/src/Test/baseResults/tokenPaste.vert.out
@@ -3,11 +3,11 @@
 ERROR: 0:40: '##' : unexpected location; end of replacement list 
 ERROR: 0:49: '##' : combined tokens are too long 
 ERROR: 0:52: '##' : not supported for these tokens 
-ERROR: 0:69: '##' : combined token is invalid 
-ERROR: 0:82: 'macro expansion' : Too few args in Macro rec
-ERROR: 0:82: '##' : unexpected location 
-ERROR: 0:82: '##' : unexpected location 
-ERROR: 0:86: '##' : unexpected location; end of argument 
+ERROR: 0:81: '##' : combined token is invalid 
+ERROR: 0:94: 'macro expansion' : Too few args in Macro rec
+ERROR: 0:94: '##' : unexpected location 
+ERROR: 0:94: '##' : unexpected location 
+ERROR: 0:98: '##' : unexpected location; end of argument 
 ERROR: 9 compilation errors.  No code generated.
 
 
@@ -18,35 +18,35 @@
 0:52      'a' ( global int)
 0:52      Constant:
 0:52        11 (const int)
-0:58  Sequence
-0:58    move second child to first child ( temp int)
-0:58      'cop' ( global int)
-0:58      Constant:
-0:58        160 (const int)
-0:59  Sequence
-0:59    move second child to first child ( temp bool)
-0:59      'dop' ( global bool)
-0:59      Constant:
-0:59        true (const bool)
-0:63  Function Definition: ShouldntExpandToThis( ( global void)
-0:63    Function Parameters: 
-0:65    Sequence
-0:65      Sequence
-0:65        move second child to first child ( temp int)
-0:65          'e' ( temp int)
-0:65          Constant:
-0:65            16 (const int)
-0:66      right shift second child into first child ( temp int)
-0:66        'e' ( temp int)
-0:66        Constant:
-0:66          2 (const int)
-0:69      Sequence
-0:69        move second child to first child ( temp bool)
-0:69          'f' ( temp bool)
-0:69          Compare Greater Than ( temp bool)
-0:69            'e' ( temp int)
-0:69            Constant:
-0:69              5 (const int)
+0:70  Sequence
+0:70    move second child to first child ( temp int)
+0:70      'cop' ( global int)
+0:70      Constant:
+0:70        160 (const int)
+0:71  Sequence
+0:71    move second child to first child ( temp bool)
+0:71      'dop' ( global bool)
+0:71      Constant:
+0:71        true (const bool)
+0:75  Function Definition: ShouldntExpandToThis( ( global void)
+0:75    Function Parameters: 
+0:77    Sequence
+0:77      Sequence
+0:77        move second child to first child ( temp int)
+0:77          'e' ( temp int)
+0:77          Constant:
+0:77            16 (const int)
+0:78      right shift second child into first child ( temp int)
+0:78        'e' ( temp int)
+0:78        Constant:
+0:78          2 (const int)
+0:81      Sequence
+0:81        move second child to first child ( temp bool)
+0:81          'f' ( temp bool)
+0:81          Compare Greater Than ( temp bool)
+0:81            'e' ( temp int)
+0:81            Constant:
+0:81              5 (const int)
 0:?   Linker Objects
 0:?     'SecondExpansion' ( global int)
 0:?     'PostPasteExpansion' ( global int)
@@ -60,6 +60,8 @@
 0:?     'foo875' ( uniform float)
 0:?     'ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF012345' ( global float)
 0:?     'a' ( global int)
+0:?     'seahorse_var' ( uniform float)
+0:?     'sealion_var' ( uniform float)
 0:?     'aop' ( const int)
 0:?       10 (const int)
 0:?     'bop' ( const int)
@@ -83,16 +85,16 @@
 0:52      'a' ( global int)
 0:52      Constant:
 0:52        11 (const int)
-0:58  Sequence
-0:58    move second child to first child ( temp int)
-0:58      'cop' ( global int)
-0:58      Constant:
-0:58        160 (const int)
-0:59  Sequence
-0:59    move second child to first child ( temp bool)
-0:59      'dop' ( global bool)
-0:59      Constant:
-0:59        true (const bool)
+0:70  Sequence
+0:70    move second child to first child ( temp int)
+0:70      'cop' ( global int)
+0:70      Constant:
+0:70        160 (const int)
+0:71  Sequence
+0:71    move second child to first child ( temp bool)
+0:71      'dop' ( global bool)
+0:71      Constant:
+0:71        true (const bool)
 0:?   Linker Objects
 0:?     'SecondExpansion' ( global int)
 0:?     'PostPasteExpansion' ( global int)
@@ -106,6 +108,8 @@
 0:?     'foo875' ( uniform float)
 0:?     'ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF012345' ( global float)
 0:?     'a' ( global int)
+0:?     'seahorse_var' ( uniform float)
+0:?     'sealion_var' ( uniform float)
 0:?     'aop' ( const int)
 0:?       10 (const int)
 0:?     'bop' ( const int)
diff --git a/third_party/glslang/src/Test/rayQuery-global.rgen b/third_party/glslang/src/Test/rayQuery-global.rgen
new file mode 100644
index 0000000..3a57e74
--- /dev/null
+++ b/third_party/glslang/src/Test/rayQuery-global.rgen
@@ -0,0 +1,31 @@
+#version 460
+#extension GL_EXT_ray_query : enable
+#extension GL_EXT_ray_flags_primitive_culling : enable
+
+layout(binding = 1, set = 0) uniform accelerationStructureEXT rtas;
+
+rayQueryEXT rqGlobal;
+
+void otherWrapper(rayQueryEXT rq) {
+    rayQueryProceedEXT(rq);
+    rayQueryProceedEXT(rqGlobal);
+}
+
+void wrapper(rayQueryEXT rq) {
+    rayQueryEXT rq2;
+    rayQueryProceedEXT(rq);
+    rayQueryProceedEXT(rqGlobal);
+    otherWrapper(rq);
+    otherWrapper(rq2);
+    otherWrapper(rqGlobal);
+}
+
+void main() {
+    rayQueryInitializeEXT(rqGlobal, rtas, gl_RayFlagsNoneEXT, 0xFF, vec3(0,0,0), 0.0, vec3(1,0,0), 1.0);
+    wrapper(rqGlobal);
+    otherWrapper(rqGlobal);
+    rayQueryEXT rq2;
+    rayQueryInitializeEXT(rq2, rtas, gl_RayFlagsNoneEXT, 0xFF, vec3(0,0,0), 0.0, vec3(1,0,0), 1.0);
+    wrapper(rq2);
+    otherWrapper(rq2);
+}
diff --git a/third_party/glslang/src/Test/spv.MissShader.rmiss b/third_party/glslang/src/Test/spv.MissShader.rmiss
index 06113de..3c6b31c 100644
--- a/third_party/glslang/src/Test/spv.MissShader.rmiss
+++ b/third_party/glslang/src/Test/spv.MissShader.rmiss
@@ -9,8 +9,7 @@
 	uvec3 v1 = gl_LaunchSizeNV;
 	vec3 v2 = gl_WorldRayOriginNV;
 	vec3 v3 = gl_WorldRayDirectionNV;
-	vec3 v4 = gl_ObjectRayOriginNV;
-	vec3 v5 = gl_ObjectRayDirectionNV;
+	uint v4 = gl_IncomingRayFlagsNV;
 	float v6 = gl_RayTminNV;
 	float v7 = gl_RayTmaxNV;
 	traceNV(accNV, 0u, 1u, 2u, 3u, 0u, vec3(0.5f), 0.5f, vec3(1.0f), 0.75f, 1);
diff --git a/third_party/glslang/src/Test/spv.ext.AccelDecl.frag b/third_party/glslang/src/Test/spv.ext.AccelDecl.frag
new file mode 100644
index 0000000..4374bf3
--- /dev/null
+++ b/third_party/glslang/src/Test/spv.ext.AccelDecl.frag
@@ -0,0 +1,14 @@
+#version 460
+#extension GL_ARB_separate_shader_objects : enable
+#extension GL_EXT_nonuniform_qualifier : enable
+#extension GL_GOOGLE_include_directive : enable
+#extension GL_EXT_scalar_block_layout : enable
+#extension GL_EXT_ray_query : enable
+
+layout(location = 0) out vec4 outColor;
+
+layout(binding = 1, set = 0) uniform accelerationStructureEXT topLevelAS;
+
+void main() {
+  outColor = vec4(0.0);
+}
diff --git a/third_party/glslang/src/Test/spv.ext.AnyHitShader.rahit b/third_party/glslang/src/Test/spv.ext.AnyHitShader.rahit
index ee7d9c7..871f8fe 100644
--- a/third_party/glslang/src/Test/spv.ext.AnyHitShader.rahit
+++ b/third_party/glslang/src/Test/spv.ext.AnyHitShader.rahit
@@ -1,5 +1,6 @@
 #version 460
 #extension GL_EXT_ray_tracing : enable
+#extension GL_KHR_shader_subgroup_basic : enable
 layout(location = 1) rayPayloadInEXT vec4 incomingPayload;
 void main()
 {
@@ -22,8 +23,10 @@
     mat3x4 v16 = gl_ObjectToWorld3x4EXT;
     mat3x4 v17 = gl_WorldToObject3x4EXT;
 	incomingPayload = vec4(0.5f);
-	if (v2 == 1)
-	    ignoreIntersectionEXT();
-	else
-	    terminateRayEXT();
+	if (v2 == 1) {
+	    ignoreIntersectionEXT;
+	    v0.x++;
+	}
+	incomingPayload.x += float(gl_SubgroupSize);
+	terminateRayEXT;
 }
diff --git a/third_party/glslang/src/Test/spv.ext.ClosestHitShader_Errors.rchit b/third_party/glslang/src/Test/spv.ext.ClosestHitShader_Errors.rchit
index 05e05fe..6416f1f 100644
--- a/third_party/glslang/src/Test/spv.ext.ClosestHitShader_Errors.rchit
+++ b/third_party/glslang/src/Test/spv.ext.ClosestHitShader_Errors.rchit
@@ -2,12 +2,14 @@
 #extension GL_EXT_ray_tracing : enable
 hitAttributeEXT vec4 payload;
 layout(binding = 0, set = 0) uniform accelerationStructureEXT accEXT;
-
+layout(location = 2) rayPayloadEXT vec4 payload0;
+layout(location = 2) rayPayloadInEXT block { vec4 data; }; // ERROR : location already used
 void main()
 {
     payload.x = 1.0f;                                       // ERROR, cannot write to hitattributeEXT in stage
     reportIntersectionEXT(1.0, 1U);                          // ERROR, unsupported builtin in stage 
-    terminateRayEXT();
-    ignoreIntersectionEXT();
+    terminateRayEXT;
+    ignoreIntersectionEXT;
     bool e1 = gl_IncomingRayFlagsEXT == gl_RayFlagsSkipAABBEXT;
+    traceRayEXT(accEXT, 0, 0, 0, 0, 0, vec3(0.0), 0.0, vec3(1.0), 1.0, 0); //ERROR no payload variable with location = 0
 }
diff --git a/third_party/glslang/src/Test/spv.ext.ClosestHitShader_Subgroup.rchit b/third_party/glslang/src/Test/spv.ext.ClosestHitShader_Subgroup.rchit
new file mode 100644
index 0000000..ce2091a
--- /dev/null
+++ b/third_party/glslang/src/Test/spv.ext.ClosestHitShader_Subgroup.rchit
@@ -0,0 +1,16 @@
+#version 460
+#pragma use_vulkan_memory_model
+#extension GL_EXT_ray_tracing : enable
+#extension GL_NV_shader_sm_builtins : enable
+#extension GL_KHR_shader_subgroup_ballot : enable
+#extension GL_ARB_shader_ballot : enable
+#extension GL_NV_shader_sm_builtins : enable
+layout(binding = 0, set = 0) uniform accelerationStructureEXT accEXT;
+layout(location = 1) rayPayloadInEXT vec4 incomingPayload;
+void main()
+{
+	traceRayEXT(accEXT, 0u, 1u, 2u, 3u, 0u, vec3(0.5f), 0.5f, vec3(1.0f), 0.75f, 1);
+        incomingPayload.x = float(gl_SubgroupInvocationID) + float(gl_SubGroupGeMaskARB) +
+			    float(gl_SubgroupGtMask) + float(gl_SubgroupLeMask) + 
+                            float(gl_SubGroupLtMaskARB) + float(gl_SMIDNV);
+}
diff --git a/third_party/glslang/src/Test/spv.ext.MissShader.rmiss b/third_party/glslang/src/Test/spv.ext.MissShader.rmiss
index e774334..982bd84 100644
--- a/third_party/glslang/src/Test/spv.ext.MissShader.rmiss
+++ b/third_party/glslang/src/Test/spv.ext.MissShader.rmiss
@@ -1,5 +1,9 @@
 #version 460
 #extension GL_EXT_ray_tracing : enable
+#extension GL_NV_shader_sm_builtins : enable
+#extension GL_KHR_shader_subgroup_ballot : enable
+#extension GL_ARB_shader_ballot : enable
+#extension GL_NV_shader_sm_builtins : enable
 layout(binding = 0, set = 0) uniform accelerationStructureEXT accEXT;
 layout(location = 0) rayPayloadEXT vec4 localPayload;
 layout(location = 1) rayPayloadInEXT vec4 incomingPayload;
@@ -12,4 +16,5 @@
 	float v4 = gl_RayTminEXT;
 	float v5 = gl_RayTmaxEXT;
 	traceRayEXT(accEXT, 0u, 1u, 2u, 3u, 0u, vec3(0.5f), 0.5f, vec3(1.0f), 0.75f, 1);
+    incomingPayload.x = float(gl_SubGroupSizeARB) + float(gl_SubgroupEqMask) + float(gl_WarpIDNV);
 }
diff --git a/third_party/glslang/src/Test/spv.ext.MissShader_Errors.rmiss b/third_party/glslang/src/Test/spv.ext.MissShader_Errors.rmiss
index 2391211..c921f23 100644
--- a/third_party/glslang/src/Test/spv.ext.MissShader_Errors.rmiss
+++ b/third_party/glslang/src/Test/spv.ext.MissShader_Errors.rmiss
@@ -11,6 +11,6 @@
     float e12 = gl_HitTEXT;                                 // ERROR, unsupported builtin in stage
     float e13 = gl_HitKindEXT;                              // ERROR, unsupported builtin in stage
     reportIntersectionEXT(1.0, 1U);                         // ERROR, unsupported builtin in stage
-    ignoreIntersectionEXT();                                // ERROR, unsupported builtin in stage
-    terminateRayEXT();                                      // ERROR, unsupported builtin in stage
+    ignoreIntersectionEXT;                                  // ERROR, unsupported in stage
+    terminateRayEXT;                                        // ERROR, unsupported in stage
 }
diff --git a/third_party/glslang/src/Test/spv.ext.RayCallable_Errors.rcall b/third_party/glslang/src/Test/spv.ext.RayCallable_Errors.rcall
index d35672e..660ea75 100644
--- a/third_party/glslang/src/Test/spv.ext.RayCallable_Errors.rcall
+++ b/third_party/glslang/src/Test/spv.ext.RayCallable_Errors.rcall
@@ -3,7 +3,8 @@
 hitAttributeEXT vec4 hitattr;                                // ERROR, hitattributeEXT unsupported in this stage 
 rayPayloadEXT vec4 payload;                                  // ERROR, rayPayloadEXT unsupported in this stage
 rayPayloadInEXT vec4 payloadIn;                              // ERROR, rayPayloadInEXT unsupported in this stage
-
+layout(location = 0) callableDataEXT vec4 cd0;
+layout(location = 0) callableDataEXT float cd1;              // ERROR, location already used
 void main()
 {
     int e0 = gl_PrimitiveID;                                // ERROR, unsupported builtin in stage
@@ -21,6 +22,7 @@
     float e13 = gl_HitKindEXT;                               // ERROR, unsupported builtin in stage
     uint curFlags = gl_IncomingRayFlagsEXT;                  // ERROR, unsupported builtin in stage
     reportIntersectionEXT(1.0, 1U);                          // ERROR, unsupported builtin in stage
-    ignoreIntersectionEXT();                                 // ERROR, unsupported builtin in stage
-    terminateRayEXT();                                       // ERROR, unsupported builtin in stage
+    ignoreIntersectionEXT;                                   // ERROR, unsupported in stage
+    terminateRayEXT;                                         // ERROR, unsupported in stage
+    executeCallableEXT(1,1);                                 // ERROR, no callable data with location 1
 }
diff --git a/third_party/glslang/src/Test/spv.ext.RayConstants.rgen b/third_party/glslang/src/Test/spv.ext.RayConstants.rgen
index 73cb0c1..8e681ba 100644
--- a/third_party/glslang/src/Test/spv.ext.RayConstants.rgen
+++ b/third_party/glslang/src/Test/spv.ext.RayConstants.rgen
@@ -1,7 +1,7 @@
 #version 460
 #extension GL_EXT_ray_tracing : enable
 layout(binding = 0, set = 0) uniform accelerationStructureEXT accEXT;
-layout(location = 0) rayPayloadEXT vec4 payload;
+layout(location = 1) rayPayloadEXT vec4 payload;
 void main()
 {
     const uint rayFlags = gl_RayFlagsNoneEXT | gl_RayFlagsOpaqueEXT |
diff --git a/third_party/glslang/src/Test/spv.ext.RayGenSBTlayout.rgen b/third_party/glslang/src/Test/spv.ext.RayGenSBTlayout.rgen
new file mode 100644
index 0000000..a5fa2b6
--- /dev/null
+++ b/third_party/glslang/src/Test/spv.ext.RayGenSBTlayout.rgen
@@ -0,0 +1,28 @@
+#version 460
+#extension GL_EXT_ray_tracing : enable
+#extension GL_ARB_gpu_shader_int64 : enable
+layout(location = 1) rayPayloadEXT vec4 payload;
+// should get std430 layout
+layout(shaderRecordEXT) buffer block
+{
+    vec3 dir;
+    vec3 origin;
+    int i;
+    uvec2 aHandle32;
+    uint64_t aHandle64;
+    vec2 arr2[2];
+    float a;
+    vec3 arr3[2];
+    float packme;
+    vec2 b;
+    float c;
+};
+void main()
+{
+    uint lx = gl_LaunchIDEXT.x;
+    uint ly = gl_LaunchIDEXT.y;
+    uint sx = gl_LaunchSizeEXT.x;
+    uint sy = gl_LaunchSizeEXT.y;
+    traceRayEXT(accelerationStructureEXT(aHandle32), lx, ly, sx, sy, 0u, origin, 0.5f, dir, 0.75f, 1);
+    traceRayEXT(accelerationStructureEXT(aHandle64), lx, ly, sx, sy, 0u, origin, 0.5f, dir, 0.75f, 1);
+}
diff --git a/third_party/glslang/src/Test/spv.ext.RayGenSBTlayout140.rgen b/third_party/glslang/src/Test/spv.ext.RayGenSBTlayout140.rgen
new file mode 100644
index 0000000..7d673a8
--- /dev/null
+++ b/third_party/glslang/src/Test/spv.ext.RayGenSBTlayout140.rgen
@@ -0,0 +1,27 @@
+#version 460
+#extension GL_EXT_ray_tracing : enable
+#extension GL_ARB_gpu_shader_int64 : enable
+layout(location = 1) rayPayloadEXT vec4 payload;
+layout(shaderRecordEXT, std140) buffer block
+{
+    vec3 dir;
+    vec3 origin;
+    int i;
+    uvec2 aHandle32;
+    uint64_t aHandle64;
+    vec2 arr[2];
+    float a;
+    vec3 arr3[2];
+    float packme;
+    vec2 b;
+    float c;
+};
+void main()
+{
+    uint lx = gl_LaunchIDEXT.x;
+    uint ly = gl_LaunchIDEXT.y;
+    uint sx = gl_LaunchSizeEXT.x;
+    uint sy = gl_LaunchSizeEXT.y;
+    traceRayEXT(accelerationStructureEXT(aHandle32), lx, ly, sx, sy, 0u, origin, 0.5f, dir, 0.75f, 1);
+    traceRayEXT(accelerationStructureEXT(aHandle64), lx, ly, sx, sy, 0u, origin, 0.5f, dir, 0.75f, 1);
+}
diff --git a/third_party/glslang/src/Test/spv.ext.RayGenSBTlayout430.rgen b/third_party/glslang/src/Test/spv.ext.RayGenSBTlayout430.rgen
new file mode 100644
index 0000000..bd308b4
--- /dev/null
+++ b/third_party/glslang/src/Test/spv.ext.RayGenSBTlayout430.rgen
@@ -0,0 +1,27 @@
+#version 460
+#extension GL_EXT_ray_tracing : enable
+#extension GL_ARB_gpu_shader_int64 : enable
+layout(location = 1) rayPayloadEXT vec4 payload;
+layout(shaderRecordEXT, std430) buffer block
+{
+    vec3 dir;
+    vec3 origin;
+    int i;
+    uvec2 aHandle32;
+    uint64_t aHandle64;
+    vec2 arr[2];
+    float a;
+    vec3 arr3[2];
+    float packme;
+    vec2 b;
+    float c;
+};
+void main()
+{
+    uint lx = gl_LaunchIDEXT.x;
+    uint ly = gl_LaunchIDEXT.y;
+    uint sx = gl_LaunchSizeEXT.x;
+    uint sy = gl_LaunchSizeEXT.y;
+    traceRayEXT(accelerationStructureEXT(aHandle32), lx, ly, sx, sy, 0u, origin, 0.5f, dir, 0.75f, 1);
+    traceRayEXT(accelerationStructureEXT(aHandle64), lx, ly, sx, sy, 0u, origin, 0.5f, dir, 0.75f, 1);
+}
diff --git a/third_party/glslang/src/Test/spv.ext.RayGenSBTlayoutscalar.rgen b/third_party/glslang/src/Test/spv.ext.RayGenSBTlayoutscalar.rgen
new file mode 100644
index 0000000..16bcb13
--- /dev/null
+++ b/third_party/glslang/src/Test/spv.ext.RayGenSBTlayoutscalar.rgen
@@ -0,0 +1,28 @@
+#version 460
+#extension GL_EXT_ray_tracing : enable
+#extension GL_ARB_gpu_shader_int64 : enable
+#extension GL_EXT_scalar_block_layout : enable
+layout(location = 1) rayPayloadEXT vec4 payload;
+layout(shaderRecordEXT, scalar) buffer block
+{
+    vec3 dir;
+    vec3 origin;
+    int i;
+    uvec2 aHandle32;
+    uint64_t aHandle64;
+    vec2 arr[2];
+    float a;
+    vec3 arr3[2];
+    float packme;
+    vec2 b;
+    float c;
+};
+void main()
+{
+    uint lx = gl_LaunchIDEXT.x;
+    uint ly = gl_LaunchIDEXT.y;
+    uint sx = gl_LaunchSizeEXT.x;
+    uint sy = gl_LaunchSizeEXT.y;
+    traceRayEXT(accelerationStructureEXT(aHandle32), lx, ly, sx, sy, 0u, origin, 0.5f, dir, 0.75f, 1);
+    traceRayEXT(accelerationStructureEXT(aHandle64), lx, ly, sx, sy, 0u, origin, 0.5f, dir, 0.75f, 1);
+}
diff --git a/third_party/glslang/src/Test/spv.ext.RayGenShader.rgen b/third_party/glslang/src/Test/spv.ext.RayGenShader.rgen
index 9fedf3a..e9eb2cb 100644
--- a/third_party/glslang/src/Test/spv.ext.RayGenShader.rgen
+++ b/third_party/glslang/src/Test/spv.ext.RayGenShader.rgen
@@ -4,7 +4,7 @@
 layout(binding = 0) uniform accelerationStructureEXT accEXT0;
 layout(binding = 1, set = 0) uniform accelerationStructureEXT accEXT1; // Unused
 layout(binding = 2, r32ui) shadercallcoherent uniform uimage2D imageu;
-layout(location = 0) rayPayloadEXT vec4 payload;
+layout(location = 1) rayPayloadEXT vec4 payload;
 layout(shaderRecordEXT) buffer block
 {
 	vec3 dir;
diff --git a/third_party/glslang/src/Test/spv.ext.RayGenShader11.rgen b/third_party/glslang/src/Test/spv.ext.RayGenShader11.rgen
index 4817026..50853d4 100644
--- a/third_party/glslang/src/Test/spv.ext.RayGenShader11.rgen
+++ b/third_party/glslang/src/Test/spv.ext.RayGenShader11.rgen
@@ -1,7 +1,7 @@
 #version 460
 #extension GL_EXT_ray_tracing : enable
 layout(binding = 0, set = 0) uniform accelerationStructureEXT accEXT;
-layout(location = 0) rayPayloadEXT vec4 payload;
+layout(location = 1) rayPayloadEXT vec4 payload;
 layout(shaderRecordEXT) buffer block
 {
 	vec3 dir;
diff --git a/third_party/glslang/src/Test/spv.ext.RayGenShaderArray.rgen b/third_party/glslang/src/Test/spv.ext.RayGenShaderArray.rgen
index d3f99de..66286d9 100644
--- a/third_party/glslang/src/Test/spv.ext.RayGenShaderArray.rgen
+++ b/third_party/glslang/src/Test/spv.ext.RayGenShaderArray.rgen
@@ -1,14 +1,17 @@
 #version 460
 #extension GL_EXT_ray_tracing : enable
 #extension GL_EXT_nonuniform_qualifier : enable
+#extension GL_ARB_gpu_shader_int64 : enable
 layout(binding = 0, set = 0) uniform accelerationStructureEXT accEXT0[];
 layout(binding = 1, set = 0) uniform accelerationStructureEXT accEXT1[2];
-layout(location = 0) rayPayloadEXT vec4 payload;
+layout(location = 1) rayPayloadEXT vec4 payload;
 layout(shaderRecordEXT) buffer block
 {
 	vec3 dir;
 	vec3 origin;
     int i;
+    uvec2 aHandle32;
+    uint64_t aHandle64;
 };
 void main()
 {
@@ -19,4 +22,6 @@
     traceRayEXT(accEXT0[i], lx, ly, sx, sy, 0u, origin, 0.5f, dir, 0.75f, 1);
     traceRayEXT(accEXT1[i], lx, ly, sx, sy, 0u, origin, 0.5f, dir, 0.75f, 1);
     traceRayEXT(accEXT0[nonuniformEXT(i)], lx, ly, sx, sy, 0u, origin, 0.5f, dir, 0.75f, 1);
+    traceRayEXT(accelerationStructureEXT(aHandle32), lx, ly, sx, sy, 0u, origin, 0.5f, dir, 0.75f, 1);
+    traceRayEXT(accelerationStructureEXT(aHandle64), lx, ly, sx, sy, 0u, origin, 0.5f, dir, 0.75f, 1);
 }
diff --git a/third_party/glslang/src/Test/spv.ext.RayGenShader_Errors.rgen b/third_party/glslang/src/Test/spv.ext.RayGenShader_Errors.rgen
index 3498342..107df0f 100644
--- a/third_party/glslang/src/Test/spv.ext.RayGenShader_Errors.rgen
+++ b/third_party/glslang/src/Test/spv.ext.RayGenShader_Errors.rgen
@@ -20,7 +20,7 @@
 };
 void main()
 {
-    accelerationStructureEXT a = 0;
+    accelerationStructureEXT a = accelerationStructureEXT(c);
     int e0 = gl_PrimitiveID;                                // ERROR, unsupported builtin in stage
     int e1 = gl_InstanceID;                                 // ERROR, unsupported builtin in stage
     int e3 = gl_InstanceCustomIndexEXT;                      // ERROR, unsupported builtin in stage
@@ -36,7 +36,7 @@
     float e13 = gl_HitKindEXT;                               // ERROR, unsupported builtin in stage
     int e14 = gl_RayFlagsSkipAABBEXT;                        // ERROR, unsupported builtin in stage
     reportIntersectionEXT(1.0, 1U);                          // ERROR, unsupported builtin in stage
-    ignoreIntersectionEXT();                                 // ERROR, unsupported builtin in stage
-    terminateRayEXT();                                       // ERROR, unsupported builtin in stage
-    d = 1.0f;                                               // ERROR, can't modify shaderRecordEXT block
+    ignoreIntersectionEXT;                                   // ERROR, unsupported builtin in stage
+    terminateRayEXT;                                         // ERROR, unsupported builtin in stage
+    d = 1.0f;                                                // ERROR, can't modify shaderRecordEXT block
 }
diff --git a/third_party/glslang/src/Test/spv.ext.RayQueryDecl.frag b/third_party/glslang/src/Test/spv.ext.RayQueryDecl.frag
new file mode 100644
index 0000000..8a144d6
--- /dev/null
+++ b/third_party/glslang/src/Test/spv.ext.RayQueryDecl.frag
@@ -0,0 +1,14 @@
+#version 460
+#extension GL_ARB_separate_shader_objects : enable
+#extension GL_EXT_nonuniform_qualifier : enable
+#extension GL_GOOGLE_include_directive : enable
+#extension GL_EXT_scalar_block_layout : enable
+#extension GL_EXT_ray_query : enable
+
+layout(location = 0) out vec4 outColor;
+
+rayQueryEXT rq;
+
+void main() {
+  outColor = vec4(0.0);
+}
diff --git a/third_party/glslang/src/Test/spv.imageAtomic64.frag b/third_party/glslang/src/Test/spv.imageAtomic64.frag
new file mode 100644
index 0000000..bd671d9
--- /dev/null
+++ b/third_party/glslang/src/Test/spv.imageAtomic64.frag
@@ -0,0 +1,92 @@
+#version 450 core

+

+#extension GL_ARB_gpu_shader_int64: enable

+#extension GL_EXT_shader_image_int64: enable

+#extension GL_KHR_memory_scope_semantics: enable

+#extension GL_ARB_sparse_texture2: enable

+ 

+layout(binding = 0, r64i)  uniform i64image1D i1D;

+layout(binding = 1, r64ui) uniform u64image2D u2D;

+layout(binding = 2, r64i)  uniform i64image3D i3D;

+layout(binding = 3, r64ui) uniform u64imageCube uCube;

+layout(binding = 4, r64i)  uniform i64imageBuffer iBuf;

+layout(binding = 5, r64ui) uniform u64image1DArray u1DArray;

+layout(binding = 6, r64i)  uniform i64image2DArray i2DArray;

+layout(binding = 7, r64ui) uniform u64imageCubeArray uCubeArray;

+layout(binding = 8, r64i)  uniform i64image2DRect i2DRect;

+layout(binding = 9, r64ui) uniform u64image2DMS u2DMS;

+layout(binding = 10, r64i) uniform i64image2DMSArray i2DMSArray;

+

+layout(binding = 11) buffer Buf

+{

+    int64_t i64;

+    uint64_t u64;

+    i64vec4 i64v4;

+    u64vec4 u64v4;

+    ivec4 i32v4;

+};

+

+void main()

+{

+    i64 = imageAtomicAdd(i1D, i32v4.x, i64);

+    i64 = imageAtomicMin(i3D, i32v4.xyz, i64);

+    i64 = imageAtomicMax(iBuf, i32v4.x, i64);

+    i64 = imageAtomicAnd(i2DArray, i32v4.xyz, i64);

+    i64 = imageAtomicOr(i2DRect, i32v4.xy, i64);

+    i64 = imageAtomicXor(i2DMSArray, i32v4.xyz, i32v4.w, i64);

+    i64 = imageAtomicExchange(i1D, i32v4.x, i64);

+    i64 = imageAtomicCompSwap(i3D, i32v4.xyz, i64, i64 + 1);

+

+    i64 = imageAtomicAdd(i1D, i32v4.x, i64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+    i64 = imageAtomicMin(i3D, i32v4.xyz, i64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+    i64 = imageAtomicMax(iBuf, i32v4.x, i64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+    i64 = imageAtomicAnd(i2DArray, i32v4.xyz, i64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+    i64 = imageAtomicOr(i2DRect, i32v4.xy, i64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+    i64 = imageAtomicXor(i2DMSArray, i32v4.xyz, i32v4.w, i64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+    i64 = imageAtomicExchange(i1D, i32v4.x, i64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+    i64 = imageAtomicCompSwap(i3D, i32v4.xyz, i64, i64 + 1, gl_ScopeDevice,

+            gl_StorageSemanticsImage, gl_SemanticsRelaxed, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+    i64 = imageAtomicLoad(iBuf, i32v4.x, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+    imageAtomicStore(i2DArray, i32v4.xyz, i64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+

+    u64 = imageAtomicAdd(u2D, i32v4.xy, u64);

+    u64 = imageAtomicMin(uCube, i32v4.xyz, u64);

+    u64 = imageAtomicMax(u1DArray, i32v4.xy, u64);

+    u64 = imageAtomicAnd(uCubeArray, i32v4.xyz, u64);

+    u64 = imageAtomicOr(u2DMS, i32v4.xy, i32v4.z, u64);

+    u64 = imageAtomicXor(u2D, i32v4.xy, u64);

+    u64 = imageAtomicExchange(uCube, i32v4.xyz, u64);

+    u64 = imageAtomicCompSwap(u1DArray, i32v4.xy, u64, u64 + 1);

+

+    u64 = imageAtomicAdd(u2D, i32v4.xy, u64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+    u64 = imageAtomicMin(uCube, i32v4.xyz, u64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+    u64 = imageAtomicMax(u1DArray, i32v4.xy, u64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+    u64 = imageAtomicAnd(uCubeArray, i32v4.xyz, u64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+    u64 = imageAtomicOr(u2DMS, i32v4.xy, i32v4.z, u64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+    u64 = imageAtomicXor(u2D, i32v4.xy, u64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+    u64 = imageAtomicExchange(uCube, i32v4.xyz, u64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+    u64 = imageAtomicCompSwap(u1DArray, i32v4.xy, u64, u64 + 1, gl_ScopeDevice,

+            gl_StorageSemanticsImage, gl_SemanticsRelaxed, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+    u64 = imageAtomicLoad(uCubeArray, i32v4.xyz, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+    imageAtomicStore(u2DMS, i32v4.xy, i32v4.z, u64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+

+    i64v4 += imageLoad(i1D, i32v4.x);

+    i64v4 += imageLoad(i3D, i32v4.xyz);

+    i64v4 += imageLoad(iBuf, i32v4.x);

+    i64v4 += imageLoad(i2DArray, i32v4.xyz);

+    i64v4 += imageLoad(i2DRect, i32v4.xy);

+    i64v4 += imageLoad(i2DMSArray, i32v4.xyz, i32v4.w);

+

+    imageStore(u2D, i32v4.xy, u64v4);

+    imageStore(uCube, i32v4.xyz, u64v4);

+    imageStore(u1DArray, i32v4.xy, u64v4);

+    imageStore(uCubeArray, i32v4.xyz, u64v4);

+    imageStore(u2DMS, i32v4.xy, i32v4.z, u64v4);

+

+    sparseImageLoadARB(i3D, i32v4.xyz, i64v4);

+    sparseImageLoadARB(i2DArray, i32v4.xyz, i64v4);

+    sparseImageLoadARB(i2DRect, i32v4.xy, i64v4);

+    sparseImageLoadARB(u2D, i32v4.xy, u64v4);

+    sparseImageLoadARB(uCube, i32v4.xyz, u64v4);

+    sparseImageLoadARB(uCubeArray, i32v4.xyz, u64v4);

+}
\ No newline at end of file
diff --git a/third_party/glslang/src/Test/spv.imageLoadStoreLod.frag b/third_party/glslang/src/Test/spv.imageLoadStoreLod.frag
index 0da1da1..ed3cad2 100644
--- a/third_party/glslang/src/Test/spv.imageLoadStoreLod.frag
+++ b/third_party/glslang/src/Test/spv.imageLoadStoreLod.frag
@@ -1,6 +1,8 @@
 #version 450 core

 

 #extension GL_AMD_shader_image_load_store_lod: enable

+#extension GL_ARB_gpu_shader_int64: enable

+#extension GL_EXT_shader_image_int64: enable

 

 layout(rgba32f,  binding = 0) uniform image1D         i1D;

 layout(rgba32f,  binding = 1) uniform image2D         i2D;

@@ -12,6 +14,20 @@
 

 layout(location = 0) out vec4 fragColor;

 

+layout(r64i,  binding = 7)  uniform i64image1D        i64i1D;

+layout(r64i,  binding = 8)  uniform i64image2D        i64i2D;

+layout(r64i,  binding = 9)  uniform i64image3D        i64i3D;

+layout(r64ui, binding = 10) uniform u64imageCube      u64iCube;

+layout(r64ui, binding = 11) uniform u64image1DArray   u64i1DArray;

+layout(r64ui, binding = 12) uniform u64image2DArray   u64i2DArray;

+layout(r64ui, binding = 13) uniform u64imageCubeArray u64iCubeArray;

+

+layout(binding = 14) buffer Buf

+{

+    i64vec4 i64v4;

+    u64vec4 u64v4;

+};

+

 void main()

 {

     const int c1 = 1;

@@ -33,4 +49,14 @@
     sparseImageLoadLodAMD(uiCubeArray, c3, lod, u4);

 

     fragColor = f4 + vec4(u4);

+

+    i64v4 += imageLoadLodAMD(i64i1D, c1, lod);

+    i64v4 += imageLoadLodAMD(i64i2D, c2, lod);

+    i64v4 += imageLoadLodAMD(i64i3D, c3, lod);

+

+    imageStoreLodAMD(u64iCube, c3, lod, u64v4);

+    imageStoreLodAMD(u64i1DArray, c2, lod, u64v4);

+

+    sparseImageLoadLodAMD(u64i2DArray, c3, lod, u64v4);

+    sparseImageLoadLodAMD(u64iCubeArray, c3, lod, u64v4);

 }
\ No newline at end of file
diff --git a/third_party/glslang/src/Test/spv.layer.tese b/third_party/glslang/src/Test/spv.layer.tese
new file mode 100644
index 0000000..b0ce079
--- /dev/null
+++ b/third_party/glslang/src/Test/spv.layer.tese
@@ -0,0 +1,8 @@
+#version 450
+
+#extension GL_ARB_shader_viewport_layer_array : require
+
+layout(triangles) in;
+void main() {
+  gl_Layer = 1;
+}
diff --git a/third_party/glslang/src/Test/spv.nonuniform.frag b/third_party/glslang/src/Test/spv.nonuniform.frag
index c136d25..cf7ebed 100644
--- a/third_party/glslang/src/Test/spv.nonuniform.frag
+++ b/third_party/glslang/src/Test/spv.nonuniform.frag
@@ -28,10 +28,12 @@
 void main()

 {

     nonuniformEXT int nu_li;

+    nonuniformEXT int nu_li2;

     int dyn_i;

 

     int a = foo(nu_li, nu_li);

     nu_li = nonuniformEXT(a) + nonuniformEXT(a * 2);

+    nu_li2 = a + nonuniformEXT(a * 2);

 

     float b;

     b = nu_inv4.x * nu_gf;

@@ -46,16 +48,25 @@
     b += texelFetch(uniformTexelBuffer[nu_ii], 1).x;

     b += imageLoad(storageTexelBuffer[nu_ii], 1).x;

     b += texture(sampler2D(uniformTexArr[nu_ii], uniformSampler), inTexcoord.xy).x;

+    b += texture(nonuniformEXT(sampler2D(uniformTexArr[nu_ii], uniformSampler)), inTexcoord.xy).x;

 

     nonuniformEXT ivec4 v;

     nonuniformEXT mat4 m;

     nonuniformEXT struct S { int a; } s;

+    nonuniformEXT int arr[10];

     ivec4 uv;

+    mat4 um;

+    struct US { int a[10]; } us;

+    int uarr[10];

     b += uniformBuffer[v.y].a;

     b += uniformBuffer[v[2]].a;

     b += uniformBuffer[uv[nu_ii]].a;

     b += uniformBuffer[int(m[2].z)].a;

     b += uniformBuffer[s.a].a;

+    b += uniformBuffer[arr[2]].a;

+    b += uniformBuffer[int(um[nu_ii].z)].a;

+    b += uniformBuffer[us.a[nu_ii]].a;

+    b += uniformBuffer[uarr[nu_ii]].a;

 

     storageBuffer[nu_ii].b = b;

 }

diff --git a/third_party/glslang/src/Test/spv.terminate.frag b/third_party/glslang/src/Test/spv.terminate.frag
new file mode 100644
index 0000000..2555877
--- /dev/null
+++ b/third_party/glslang/src/Test/spv.terminate.frag
@@ -0,0 +1,8 @@
+#version 400

+

+#extension GL_EXT_terminate_invocation : enable

+

+void main()

+{

+    terminateInvocation;

+}

diff --git a/third_party/glslang/src/Test/spv.viewportindex.tese b/third_party/glslang/src/Test/spv.viewportindex.tese
new file mode 100644
index 0000000..0da4cc8
--- /dev/null
+++ b/third_party/glslang/src/Test/spv.viewportindex.tese
@@ -0,0 +1,8 @@
+#version 450
+
+#extension GL_ARB_shader_viewport_layer_array : require
+
+layout(triangles) in;
+void main() {
+  gl_ViewportIndex = 1;
+}
diff --git a/third_party/glslang/src/Test/terminate.frag b/third_party/glslang/src/Test/terminate.frag
new file mode 100644
index 0000000..32f1495
--- /dev/null
+++ b/third_party/glslang/src/Test/terminate.frag
@@ -0,0 +1,10 @@
+#version 400

+

+void foo() { terminateInvocation; } // ERROR: identifier undeclared

+

+#extension GL_EXT_terminate_invocation : enable

+

+void main()

+{

+    int terminateInvocation;  // syntax ERROR

+}

diff --git a/third_party/glslang/src/Test/terminate.vert b/third_party/glslang/src/Test/terminate.vert
new file mode 100644
index 0000000..1d4eea9
--- /dev/null
+++ b/third_party/glslang/src/Test/terminate.vert
@@ -0,0 +1,10 @@
+#version 400

+

+void foo() { terminateInvocation; } // ERROR: identifier undeclared

+

+#extension GL_EXT_terminate_invocation : enable

+

+void main()

+{

+    terminateInvocation;  // ERROR: wrong stage

+}

diff --git a/third_party/glslang/src/Test/tokenPaste.vert b/third_party/glslang/src/Test/tokenPaste.vert
index 40de6f9..c4515d4 100644
--- a/third_party/glslang/src/Test/tokenPaste.vert
+++ b/third_party/glslang/src/Test/tokenPaste.vert
@@ -51,6 +51,18 @@
 // non-identifiers
 int a = simplePaste(11,12);
 
+// should work in #if as well
+#define seahorse 1
+#define sealion 0
+#define marine_animal(suffix) (sea ## suffix)
+
+#if marine_animal(horse) // should pass
+uniform float seahorse_var;
+#endif
+#if !marine_animal(lion) // should pass
+uniform float sealion_var;
+#endif
+
 // operators
 #define MAKE_OP(L, R) L ## R

 const int aop = 10;

diff --git a/third_party/glslang/src/glslang/Include/Types.h b/third_party/glslang/src/glslang/Include/Types.h
index 514fa10..696daf6 100644
--- a/third_party/glslang/src/glslang/Include/Types.h
+++ b/third_party/glslang/src/glslang/Include/Types.h
@@ -406,6 +406,7 @@
     ElfRg8i,
     ElfR16i,
     ElfR8i,
+    ElfR64i,
 
     ElfIntGuard,       // to help with comparisons
 
@@ -423,6 +424,7 @@
     ElfRg8ui,
     ElfR16ui,
     ElfR8ui,
+    ElfR64ui,
 
     ElfCount
 };
@@ -755,6 +757,12 @@
     bool isPerPrimitive() const { return perPrimitiveNV; }
     bool isPerView() const { return perViewNV; }
     bool isTaskMemory() const { return perTaskNV; }
+    bool isAnyPayload() const {
+        return storage == EvqPayload || storage == EvqPayloadIn;
+    }
+    bool isAnyCallable() const {
+        return storage == EvqCallableData || storage == EvqCallableDataIn;
+    }
 
     // True if this type of IO is supposed to be arrayed with extra level for per-vertex data
     bool isArrayedIo(EShLanguage language) const
@@ -1117,6 +1125,8 @@
         case ElfR32ui:        return "r32ui";
         case ElfR16ui:        return "r16ui";
         case ElfR8ui:         return "r8ui";
+        case ElfR64ui:        return "r64ui";
+        case ElfR64i:         return "r64i";
         default:              return "none";
         }
     }
diff --git a/third_party/glslang/src/glslang/Include/intermediate.h b/third_party/glslang/src/glslang/Include/intermediate.h
index 30cb6fb..19cd32e 100644
--- a/third_party/glslang/src/glslang/Include/intermediate.h
+++ b/third_party/glslang/src/glslang/Include/intermediate.h
@@ -280,6 +280,12 @@
     EOpConvUvec2ToPtr,
     EOpConvPtrToUvec2,
 
+    // uint64_t -> accelerationStructureEXT
+    EOpConvUint64ToAccStruct,
+
+    // uvec2 -> accelerationStructureEXT
+    EOpConvUvec2ToAccStruct,
+
     //
     // binary operations
     //
@@ -628,13 +634,16 @@
     // Branch
     //
 
-    EOpKill,            // Fragment only
+    EOpKill,                // Fragment only
+    EOpTerminateInvocation, // Fragment only
+    EOpDemote,              // Fragment only
+    EOpTerminateRayKHR,         // Any-hit only
+    EOpIgnoreIntersectionKHR,   // Any-hit only
     EOpReturn,
     EOpBreak,
     EOpContinue,
     EOpCase,
     EOpDefault,
-    EOpDemote,          // Fragment only
 
     //
     // Constructors
@@ -751,6 +760,7 @@
     EOpConstructNonuniform,     // expected to be transformed away, not present in final AST
     EOpConstructReference,
     EOpConstructCooperativeMatrix,
+    EOpConstructAccStruct,
     EOpConstructGuardEnd,
 
     //
@@ -911,11 +921,13 @@
     EOpAverageRounded,
     EOpMul32x16,
 
-    EOpTrace,
+    EOpTraceNV,
+    EOpTraceKHR,
     EOpReportIntersection,
-    EOpIgnoreIntersection,
-    EOpTerminateRay,
-    EOpExecuteCallable,
+    EOpIgnoreIntersectionNV,
+    EOpTerminateRayNV,
+    EOpExecuteCallableNV,
+    EOpExecuteCallableKHR,
     EOpWritePackedPrimitiveIndices4x8NV,
 
     //
@@ -1282,6 +1294,8 @@
     TIntermTyped* getConstSubtree() const { return constSubtree; }
 #ifndef GLSLANG_WEB
     void setFlattenSubset(int subset) { flattenSubset = subset; }
+    virtual const TString& getAccessName() const;
+
     int getFlattenSubset() const { return flattenSubset; } // -1 means full object
 #endif
 
diff --git a/third_party/glslang/src/glslang/MachineIndependent/Initialize.cpp b/third_party/glslang/src/glslang/MachineIndependent/Initialize.cpp
index 0ce2583..a5ef6cc 100644
--- a/third_party/glslang/src/glslang/MachineIndependent/Initialize.cpp
+++ b/third_party/glslang/src/glslang/MachineIndependent/Initialize.cpp
@@ -509,6 +509,8 @@
     prefixes[EbtUint8] = "u8";
     prefixes[EbtInt16]  = "i16";
     prefixes[EbtUint16] = "u16";
+    prefixes[EbtInt64]  = "i64";
+    prefixes[EbtUint64] = "u64";
 #endif
 
     postfixes[2] = "2";
@@ -4419,9 +4421,7 @@
             "\n");
         stageBuiltins[EShLangAnyHit].append(
             "void ignoreIntersectionNV();"
-            "void ignoreIntersectionEXT();"
             "void terminateRayNV();"
-            "void terminateRayEXT();"
             "\n");
         stageBuiltins[EShLangClosestHit].append(
             "void traceNV(accelerationStructureNV,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);"
@@ -5434,6 +5434,12 @@
             "\n");
     }
 
+    if (version >= 300 /* both ES and non-ES */) {
+        stageBuiltins[EShLangFragment].append(
+            "flat in highp uint gl_ViewID_OVR;"     // GL_OVR_multiview, GL_OVR_multiview2
+            "\n");
+    }
+
 #ifndef GLSLANG_ANGLE
     // GL_ARB_shader_ballot
     if (profile != EEsProfile && version >= 450) {
@@ -5446,6 +5452,15 @@
             "in uint64_t gl_SubGroupLeMaskARB;"
             "in uint64_t gl_SubGroupLtMaskARB;"
             "\n";
+        const char* rtBallotDecls =
+            "uniform volatile uint gl_SubGroupSizeARB;"
+            "in volatile uint     gl_SubGroupInvocationARB;"
+            "in volatile uint64_t gl_SubGroupEqMaskARB;"
+            "in volatile uint64_t gl_SubGroupGeMaskARB;"
+            "in volatile uint64_t gl_SubGroupGtMaskARB;"
+            "in volatile uint64_t gl_SubGroupLeMaskARB;"
+            "in volatile uint64_t gl_SubGroupLtMaskARB;"
+            "\n";
         const char* fragmentBallotDecls =
             "uniform uint gl_SubGroupSizeARB;"
             "flat in uint     gl_SubGroupInvocationARB;"
@@ -5463,6 +5478,13 @@
         stageBuiltins[EShLangFragment]      .append(fragmentBallotDecls);
         stageBuiltins[EShLangMeshNV]        .append(ballotDecls);
         stageBuiltins[EShLangTaskNV]        .append(ballotDecls);
+        stageBuiltins[EShLangRayGen]        .append(rtBallotDecls);
+        stageBuiltins[EShLangIntersect]     .append(rtBallotDecls);
+        // No volatile qualifier on these builtins in any-hit
+        stageBuiltins[EShLangAnyHit]        .append(ballotDecls);
+        stageBuiltins[EShLangClosestHit]    .append(rtBallotDecls);
+        stageBuiltins[EShLangMiss]          .append(rtBallotDecls);
+        stageBuiltins[EShLangCallable]      .append(rtBallotDecls);
     }
 
     // GL_KHR_shader_subgroup
@@ -5500,6 +5522,21 @@
             "in highp   uint  gl_NumSubgroups;"
             "in highp   uint  gl_SubgroupID;"
             "\n";
+        // These builtins are volatile for RT stages
+        const char* rtSubgroupDecls =
+            "in mediump volatile uint  gl_SubgroupSize;"
+            "in mediump volatile uint  gl_SubgroupInvocationID;"
+            "in highp   volatile uvec4 gl_SubgroupEqMask;"
+            "in highp   volatile uvec4 gl_SubgroupGeMask;"
+            "in highp   volatile uvec4 gl_SubgroupGtMask;"
+            "in highp   volatile uvec4 gl_SubgroupLeMask;"
+            "in highp   volatile uvec4 gl_SubgroupLtMask;"
+            // GL_NV_shader_sm_builtins
+            "in highp    uint  gl_WarpsPerSMNV;"
+            "in highp    uint  gl_SMCountNV;"
+            "in highp volatile uint  gl_WarpIDNV;"
+            "in highp volatile uint  gl_SMIDNV;"
+            "\n";
 
         stageBuiltins[EShLangVertex]        .append(subgroupDecls);
         stageBuiltins[EShLangTessControl]   .append(subgroupDecls);
@@ -5512,12 +5549,13 @@
         stageBuiltins[EShLangMeshNV]        .append(computeSubgroupDecls);
         stageBuiltins[EShLangTaskNV]        .append(subgroupDecls);
         stageBuiltins[EShLangTaskNV]        .append(computeSubgroupDecls);
-        stageBuiltins[EShLangRayGen]        .append(subgroupDecls);
-        stageBuiltins[EShLangIntersect]     .append(subgroupDecls);
+        stageBuiltins[EShLangRayGen]        .append(rtSubgroupDecls);
+        stageBuiltins[EShLangIntersect]     .append(rtSubgroupDecls);
+        // No volatile qualifier on these builtins in any-hit
         stageBuiltins[EShLangAnyHit]        .append(subgroupDecls);
-        stageBuiltins[EShLangClosestHit]    .append(subgroupDecls);
-        stageBuiltins[EShLangMiss]          .append(subgroupDecls);
-        stageBuiltins[EShLangCallable]      .append(subgroupDecls);
+        stageBuiltins[EShLangClosestHit]    .append(rtSubgroupDecls);
+        stageBuiltins[EShLangMiss]          .append(rtSubgroupDecls);
+        stageBuiltins[EShLangCallable]      .append(rtSubgroupDecls);
     }
 
     // GL_NV_ray_tracing/GL_EXT_ray_tracing
@@ -5585,7 +5623,7 @@
             "in    float  gl_RayTminNV;"
             "in    float  gl_RayTminEXT;"
             "in    float  gl_RayTmaxNV;"
-            "in    float  gl_RayTmaxEXT;"
+            "in volatile float gl_RayTmaxEXT;"
             "in    mat4x3 gl_ObjectToWorldNV;"
             "in    mat4x3 gl_ObjectToWorldEXT;"
             "in    mat3x4 gl_ObjectToWorld3x4EXT;"
@@ -5705,14 +5743,6 @@
         commonBuiltins.append("const int gl_StorageSemanticsOutput   = 0x1000;\n");
     }
 
-#endif // !GLSLANG_ANGLE
-
-    if (version >= 300 /* both ES and non-ES */) {
-        stageBuiltins[EShLangFragment].append(
-            "flat in highp uint gl_ViewID_OVR;"     // GL_OVR_multiview, GL_OVR_multiview2
-            "\n");
-    }
-
     // Adding these to common built-ins triggers an assert due to a memory corruption in related code when testing
     // So instead add to each stage individually, avoiding the GLSLang bug
     if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 310)) {
@@ -5724,6 +5754,46 @@
             stageBuiltins[static_cast<EShLanguage>(stage)].append("const highp int gl_ShadingRateFlag4HorizontalPixelsEXT     = 8;\n");
         }
     }
+    
+    // GL_EXT_shader_image_int64
+    if ((profile != EEsProfile && version >= 420) ||
+        (profile == EEsProfile && version >= 310)) {
+            
+        const TBasicType bTypes[] = { EbtInt64, EbtUint64 };
+        for (int ms = 0; ms <= 1; ++ms) { // loop over "bool" multisample or not
+            for (int arrayed = 0; arrayed <= 1; ++arrayed) { // loop over "bool" arrayed or not
+                for (int dim = Esd1D; dim < EsdSubpass; ++dim) { // 1D, ..., buffer
+                    if ((dim == Esd1D || dim == EsdRect) && profile == EEsProfile)
+                        continue;
+                    
+                    if ((dim == Esd3D || dim == EsdRect || dim == EsdBuffer) && arrayed)
+                        continue;
+                    
+                    if (dim != Esd2D && ms)
+                        continue;
+                    
+                    // Loop over the bTypes
+                    for (size_t bType = 0; bType < sizeof(bTypes)/sizeof(TBasicType); ++bType) {
+                        //
+                        // Now, make all the function prototypes for the type we just built...
+                        //
+                        TSampler sampler;
+                    
+                        sampler.setImage(bTypes[bType], (TSamplerDim)dim, arrayed ? true : false,
+                                                                          false,
+                                                                          ms      ? true : false);
+
+                        TString typeName = sampler.getString();
+
+                        addQueryFunctions(sampler, typeName, version, profile);
+                        addImageFunctions(sampler, typeName, version, profile);
+                    }
+                }
+            }
+        }
+    }
+#endif // !GLSLANG_ANGLE
+    
 #endif // !GLSLANG_WEB
 
     // printf("%s\n", commonBuiltins.c_str());
@@ -5820,7 +5890,6 @@
 #endif
                             if (shadow && (bTypes[bType] == EbtInt || bTypes[bType] == EbtUint))
                                 continue;
-
                             //
                             // Now, make all the function prototypes for the type we just built...
                             //
@@ -6045,8 +6114,16 @@
 
     if ( profile != EEsProfile ||
         (profile == EEsProfile && version >= 310)) {
-        if (sampler.type == EbtInt || sampler.type == EbtUint) {
-            const char* dataType = sampler.type == EbtInt ? "highp int" : "highp uint";
+        if (sampler.type == EbtInt || sampler.type == EbtUint || sampler.type == EbtInt64 || sampler.type == EbtUint64 ) {
+            
+            const char* dataType;
+            switch (sampler.type) {
+                case(EbtInt): dataType = "highp int"; break;
+                case(EbtUint): dataType = "highp uint"; break;
+                case(EbtInt64): dataType = "highp int64_t"; break;
+                case(EbtUint64): dataType = "highp uint64_t"; break;
+                default: dataType = "";
+            }
 
             const int numBuiltins = 7;
 
@@ -8407,9 +8484,7 @@
             symbolTable.setFunctionExtensions("reportIntersectionNV", 1, &E_GL_NV_ray_tracing);
             symbolTable.setFunctionExtensions("reportIntersectionEXT", 1, &E_GL_EXT_ray_tracing);
             symbolTable.setFunctionExtensions("ignoreIntersectionNV", 1, &E_GL_NV_ray_tracing);
-            symbolTable.setFunctionExtensions("ignoreIntersectionEXT", 1, &E_GL_EXT_ray_tracing);
             symbolTable.setFunctionExtensions("terminateRayNV", 1, &E_GL_NV_ray_tracing);
-            symbolTable.setFunctionExtensions("terminateRayEXT", 1, &E_GL_EXT_ray_tracing);
             symbolTable.setFunctionExtensions("executeCallableNV", 1, &E_GL_NV_ray_tracing);
             symbolTable.setFunctionExtensions("executeCallableEXT", 1, &E_GL_EXT_ray_tracing);
 
@@ -9239,10 +9314,10 @@
     case EShLangClosestHit:
     case EShLangMiss:
         if (profile != EEsProfile && version >= 460) {
-            symbolTable.relateToOperator("traceNV", EOpTrace);
-            symbolTable.relateToOperator("traceRayEXT", EOpTrace);
-            symbolTable.relateToOperator("executeCallableNV", EOpExecuteCallable);
-            symbolTable.relateToOperator("executeCallableEXT", EOpExecuteCallable);
+            symbolTable.relateToOperator("traceNV", EOpTraceNV);
+            symbolTable.relateToOperator("traceRayEXT", EOpTraceKHR);
+            symbolTable.relateToOperator("executeCallableNV", EOpExecuteCallableNV);
+            symbolTable.relateToOperator("executeCallableEXT", EOpExecuteCallableKHR);
         }
         break;
     case EShLangIntersect:
@@ -9253,16 +9328,14 @@
         break;
     case EShLangAnyHit:
         if (profile != EEsProfile && version >= 460) {
-            symbolTable.relateToOperator("ignoreIntersectionNV", EOpIgnoreIntersection);
-            symbolTable.relateToOperator("ignoreIntersectionEXT", EOpIgnoreIntersection);
-            symbolTable.relateToOperator("terminateRayNV", EOpTerminateRay);
-            symbolTable.relateToOperator("terminateRayEXT", EOpTerminateRay);
+            symbolTable.relateToOperator("ignoreIntersectionNV", EOpIgnoreIntersectionNV);
+            symbolTable.relateToOperator("terminateRayNV", EOpTerminateRayNV);
         }
         break;
     case EShLangCallable:
         if (profile != EEsProfile && version >= 460) {
-            symbolTable.relateToOperator("executeCallableNV", EOpExecuteCallable);
-            symbolTable.relateToOperator("executeCallableEXT", EOpExecuteCallable);
+            symbolTable.relateToOperator("executeCallableNV", EOpExecuteCallableNV);
+            symbolTable.relateToOperator("executeCallableEXT", EOpExecuteCallableKHR);
         }
         break;
     case EShLangMeshNV:
diff --git a/third_party/glslang/src/glslang/MachineIndependent/IntermTraverse.cpp b/third_party/glslang/src/glslang/MachineIndependent/IntermTraverse.cpp
index f46010b..553b1b5 100644
--- a/third_party/glslang/src/glslang/MachineIndependent/IntermTraverse.cpp
+++ b/third_party/glslang/src/glslang/MachineIndependent/IntermTraverse.cpp
@@ -71,6 +71,13 @@
     it->visitConstantUnion(this);
 }
 
+const TString& TIntermSymbol::getAccessName() const {
+    if (getBasicType() == EbtBlock)
+        return getType().getTypeName();
+    else
+        return getName();
+}
+
 //
 // Traverse a binary node.
 //
diff --git a/third_party/glslang/src/glslang/MachineIndependent/Intermediate.cpp b/third_party/glslang/src/glslang/MachineIndependent/Intermediate.cpp
index b8c220d..f6172a2 100644
--- a/third_party/glslang/src/glslang/MachineIndependent/Intermediate.cpp
+++ b/third_party/glslang/src/glslang/MachineIndependent/Intermediate.cpp
@@ -2298,6 +2298,10 @@
     case EbtReference:
         op = EOpConstructReference;
         break;
+
+    case EbtAccStruct:
+        op = EOpConstructAccStruct;
+        break;
 #endif
     default:
         break;
diff --git a/third_party/glslang/src/glslang/MachineIndependent/ParseContextBase.cpp b/third_party/glslang/src/glslang/MachineIndependent/ParseContextBase.cpp
index b464009..3efa27a 100644
--- a/third_party/glslang/src/glslang/MachineIndependent/ParseContextBase.cpp
+++ b/third_party/glslang/src/glslang/MachineIndependent/ParseContextBase.cpp
@@ -127,22 +127,6 @@
 {
     TIntermBinary* binaryNode = node->getAsBinaryNode();
 
-    if (binaryNode) {
-        switch(binaryNode->getOp()) {
-        case EOpIndexDirect:
-        case EOpIndexIndirect:     // fall through
-        case EOpIndexDirectStruct: // fall through
-        case EOpVectorSwizzle:
-        case EOpMatrixSwizzle:
-            return lValueErrorCheck(loc, op, binaryNode->getLeft());
-        default:
-            break;
-        }
-        error(loc, " l-value required", op, "", "");
-
-        return true;
-    }
-
     const char* symbol = nullptr;
     TIntermSymbol* symNode = node->getAsSymbolNode();
     if (symNode != nullptr)
@@ -203,15 +187,40 @@
     // Everything else is okay, no error.
     //
     if (message == nullptr)
+    {
+        if (binaryNode) {
+            switch (binaryNode->getOp()) {
+            case EOpIndexDirect:
+            case EOpIndexIndirect:     // fall through
+            case EOpIndexDirectStruct: // fall through
+            case EOpVectorSwizzle:
+            case EOpMatrixSwizzle:
+                return lValueErrorCheck(loc, op, binaryNode->getLeft());
+            default:
+                break;
+            }
+            error(loc, " l-value required", op, "", "");
+
+            return true;
+        }
         return false;
+    }
 
     //
     // If we get here, we have an error and a message.
     //
+    const TIntermTyped* leftMostTypeNode = TIntermediate::findLValueBase(node, true);
+
     if (symNode)
         error(loc, " l-value required", op, "\"%s\" (%s)", symbol, message);
     else
-        error(loc, " l-value required", op, "(%s)", message);
+        if (binaryNode && binaryNode->getAsOperator()->getOp() == EOpIndexDirectStruct)
+            if(IsAnonymous(leftMostTypeNode->getAsSymbolNode()->getName()))
+                error(loc, " l-value required", op, "\"%s\" (%s)", leftMostTypeNode->getAsSymbolNode()->getAccessName().c_str(), message);
+            else
+                error(loc, " l-value required", op, "\"%s\" (%s)", leftMostTypeNode->getAsSymbolNode()->getName().c_str(), message);
+        else
+            error(loc, " l-value required", op, "(%s)", message);
 
     return true;
 }
@@ -219,28 +228,41 @@
 // Test for and give an error if the node can't be read from.
 void TParseContextBase::rValueErrorCheck(const TSourceLoc& loc, const char* op, TIntermTyped* node)
 {
+    TIntermBinary* binaryNode = node->getAsBinaryNode();
+    const TIntermSymbol* symNode = node->getAsSymbolNode();
+
     if (! node)
         return;
 
-    TIntermBinary* binaryNode = node->getAsBinaryNode();
-    if (binaryNode) {
-        switch(binaryNode->getOp()) {
-        case EOpIndexDirect:
-        case EOpIndexIndirect:
-        case EOpIndexDirectStruct:
-        case EOpVectorSwizzle:
-        case EOpMatrixSwizzle:
-            rValueErrorCheck(loc, op, binaryNode->getLeft());
-        default:
-            break;
+    if (node->getQualifier().isWriteOnly()) {
+        const TIntermTyped* leftMostTypeNode = TIntermediate::findLValueBase(node, true);
+
+        if (symNode != nullptr)
+            error(loc, "can't read from writeonly object: ", op, symNode->getName().c_str());
+        else if (binaryNode &&
+                (binaryNode->getAsOperator()->getOp() == EOpIndexDirectStruct ||
+                 binaryNode->getAsOperator()->getOp() == EOpIndexDirect))
+            if(IsAnonymous(leftMostTypeNode->getAsSymbolNode()->getName()))
+                error(loc, "can't read from writeonly object: ", op, leftMostTypeNode->getAsSymbolNode()->getAccessName().c_str());
+            else
+                error(loc, "can't read from writeonly object: ", op, leftMostTypeNode->getAsSymbolNode()->getName().c_str());
+        else
+            error(loc, "can't read from writeonly object: ", op, "");
+
+    } else {
+        if (binaryNode) {
+            switch (binaryNode->getOp()) {
+            case EOpIndexDirect:
+            case EOpIndexIndirect:
+            case EOpIndexDirectStruct:
+            case EOpVectorSwizzle:
+            case EOpMatrixSwizzle:
+                rValueErrorCheck(loc, op, binaryNode->getLeft());
+            default:
+                break;
+            }
         }
-
-        return;
     }
-
-    TIntermSymbol* symNode = node->getAsSymbolNode();
-    if (symNode && symNode->getQualifier().isWriteOnly())
-        error(loc, "can't read from writeonly object: ", op, symNode->getName().c_str());
 }
 
 // Add 'symbol' to the list of deferred linkage symbols, which
diff --git a/third_party/glslang/src/glslang/MachineIndependent/ParseHelper.cpp b/third_party/glslang/src/glslang/MachineIndependent/ParseHelper.cpp
index b9b37fb..9c42a20 100644
--- a/third_party/glslang/src/glslang/MachineIndependent/ParseHelper.cpp
+++ b/third_party/glslang/src/glslang/MachineIndependent/ParseHelper.cpp
@@ -2076,14 +2076,32 @@
     }
 
 #ifndef GLSLANG_WEB
-    case EOpTrace:
+    case EOpTraceNV:
         if (!(*argp)[10]->getAsConstantUnion())
-            error(loc, "argument must be compile-time constant", "payload number", "");
+            error(loc, "argument must be compile-time constant", "payload number", "a");
         break;
-    case EOpExecuteCallable:
+    case EOpTraceKHR:
+        if (!(*argp)[10]->getAsConstantUnion())
+            error(loc, "argument must be compile-time constant", "payload number", "a");
+        else {
+            unsigned int location = (*argp)[10]->getAsConstantUnion()->getAsConstantUnion()->getConstArray()[0].getUConst();
+            if (intermediate.checkLocationRT(0, location) < 0)
+                error(loc, "with layout(location =", "no rayPayloadEXT/rayPayloadInEXT declared", "%d)", location);
+        }
+        break;
+    case EOpExecuteCallableNV:
         if (!(*argp)[1]->getAsConstantUnion())
             error(loc, "argument must be compile-time constant", "callable data number", "");
         break;
+    case EOpExecuteCallableKHR:
+        if (!(*argp)[1]->getAsConstantUnion())
+            error(loc, "argument must be compile-time constant", "callable data number", "");
+        else {
+            unsigned int location = (*argp)[1]->getAsConstantUnion()->getAsConstantUnion()->getConstArray()[0].getUConst();
+            if (intermediate.checkLocationRT(1, location) < 0)
+                error(loc, "with layout(location =", "no callableDataEXT/callableDataInEXT declared", "%d)", location);
+        }
+        break;
 
     case EOpRayQueryGetIntersectionType:
     case EOpRayQueryGetIntersectionT:
@@ -2121,9 +2139,15 @@
     {
         // Make sure the image types have the correct layout() format and correct argument types
         const TType& imageType = arg0->getType();
-        if (imageType.getSampler().type == EbtInt || imageType.getSampler().type == EbtUint) {
-            if (imageType.getQualifier().getFormat() != ElfR32i && imageType.getQualifier().getFormat() != ElfR32ui)
+        if (imageType.getSampler().type == EbtInt || imageType.getSampler().type == EbtUint ||
+            imageType.getSampler().type == EbtInt64 || imageType.getSampler().type == EbtUint64) {
+            if (imageType.getQualifier().getFormat() != ElfR32i && imageType.getQualifier().getFormat() != ElfR32ui &&
+                imageType.getQualifier().getFormat() != ElfR64i && imageType.getQualifier().getFormat() != ElfR64ui)
                 error(loc, "only supported on image with format r32i or r32ui", fnCandidate.getName().c_str(), "");
+            if (callNode.getType().getBasicType() == EbtInt64 && imageType.getQualifier().getFormat() != ElfR64i)
+                error(loc, "only supported on image with format r64i", fnCandidate.getName().c_str(), "");
+            else if (callNode.getType().getBasicType() == EbtUint64 && imageType.getQualifier().getFormat() != ElfR64ui)
+                error(loc, "only supported on image with format r64ui", fnCandidate.getName().c_str(), "");
         } else {
             bool isImageAtomicOnFloatAllowed = ((fnCandidate.getName().compare(0, 14, "imageAtomicAdd") == 0) ||
                 (fnCandidate.getName().compare(0, 15, "imageAtomicLoad") == 0) ||
@@ -3368,7 +3392,7 @@
 //
 void TParseContext::memberQualifierCheck(glslang::TPublicType& publicType)
 {
-    globalQualifierFixCheck(publicType.loc, publicType.qualifier);
+    globalQualifierFixCheck(publicType.loc, publicType.qualifier, true);
     checkNoShaderLayouts(publicType.loc, publicType.shaderQualifiers);
     if (publicType.qualifier.isNonUniform()) {
         error(publicType.loc, "not allowed on block or structure members", "nonuniformEXT", "");
@@ -3379,7 +3403,7 @@
 //
 // Check/fix just a full qualifier (no variables or types yet, but qualifier is complete) at global level.
 //
-void TParseContext::globalQualifierFixCheck(const TSourceLoc& loc, TQualifier& qualifier)
+void TParseContext::globalQualifierFixCheck(const TSourceLoc& loc, TQualifier& qualifier, bool isMemberCheck)
 {
     bool nonuniformOkay = false;
 
@@ -3404,6 +3428,16 @@
     case EvqTemporary:
         nonuniformOkay = true;
         break;
+    case EvqUniform:
+        // According to GLSL spec: The std430 qualifier is supported only for shader storage blocks; a shader using
+        // the std430 qualifier on a uniform block will fail to compile.
+        // Only check the global declaration: layout(std430) uniform;
+        if (blockName == nullptr &&
+            qualifier.layoutPacking == ElpStd430)
+        {
+            error(loc, "it is invalid to declare std430 qualifier on uniform", "", "");
+        }
+        break;
     default:
         break;
     }
@@ -3411,7 +3445,9 @@
     if (!nonuniformOkay && qualifier.isNonUniform())
         error(loc, "for non-parameter, can only apply to 'in' or no storage qualifier", "nonuniformEXT", "");
 
-    invariantCheck(loc, qualifier);
+    // Storage qualifier isn't ready for memberQualifierCheck, we should skip invariantCheck for it.
+    if (!isMemberCheck || structNestingLevel > 0)
+        invariantCheck(loc, qualifier);
 }
 
 //
@@ -3422,7 +3458,7 @@
     if (! symbolTable.atGlobalLevel())
         return;
 
-    if (!(publicType.userDef && publicType.userDef->isReference())) {
+    if (!(publicType.userDef && publicType.userDef->isReference()) && !parsingBuiltins) {
         if (qualifier.isMemoryQualifierImageAndSSBOOnly() && ! publicType.isImage() && publicType.qualifier.storage != EvqBuffer) {
             error(loc, "memory qualifiers cannot be used on this type", "", "");
         } else if (qualifier.isMemory() && (publicType.basicType != EbtSampler) && !publicType.qualifier.isUniformOrBuffer()) {
@@ -4083,6 +4119,9 @@
     if (isRuntimeLength(base))
         return;
 
+    if (base.getType().getQualifier().builtIn == EbvSampleMask)
+        return;
+
     // Check for last member of a bufferreference type, which is runtime sizeable
     // but doesn't support runtime length
     if (base.getType().getQualifier().storage == EvqBuffer) {
@@ -4634,14 +4673,14 @@
 
 void TParseContext::nestedBlockCheck(const TSourceLoc& loc)
 {
-    if (structNestingLevel > 0)
+    if (structNestingLevel > 0 || blockNestingLevel > 0)
         error(loc, "cannot nest a block definition inside a structure or block", "", "");
-    ++structNestingLevel;
+    ++blockNestingLevel;
 }
 
 void TParseContext::nestedStructCheck(const TSourceLoc& loc)
 {
-    if (structNestingLevel > 0)
+    if (structNestingLevel > 0 || blockNestingLevel > 0)
         error(loc, "cannot nest a structure definition inside a structure or block", "", "");
     ++structNestingLevel;
 }
@@ -6537,13 +6576,15 @@
             error(loc, "atomic_uint binding is too large", "binding", "");
             return;
         }
-
-        if(publicType.qualifier.hasOffset()) {
+        if (publicType.qualifier.hasOffset())
             atomicUintOffsets[publicType.qualifier.layoutBinding] = publicType.qualifier.layoutOffset;
-        }
         return;
     }
 
+    if (publicType.arraySizes) {
+        error(loc, "expect an array name", "", "");
+    }
+
     if (publicType.qualifier.hasLayout() && !publicType.qualifier.hasBufferReference())
         warn(loc, "useless application of layout qualifier", "layout", "");
 #endif
@@ -6634,6 +6675,22 @@
     if (type.getQualifier().storage == EvqShared && type.containsCoopMat())
         error(loc, "qualifier", "Cooperative matrix types must not be used in shared memory", "");
 
+    if (profile == EEsProfile) {
+        if (type.getQualifier().isPipeInput() && type.getBasicType() == EbtStruct) {
+            if (type.getQualifier().isArrayedIo(language)) {
+                TType perVertexType(type, 0);
+                if (perVertexType.containsArray() && perVertexType.containsBuiltIn() == false) {
+                    error(loc, "A per vertex structure containing an array is not allowed as input in ES", type.getTypeName().c_str(), "");
+                }
+            }
+            else if (type.containsArray() && type.containsBuiltIn() == false) {
+                error(loc, "A structure containing an array is not allowed as input in ES", type.getTypeName().c_str(), "");
+            }
+            if (type.containsStructure())
+                error(loc, "A structure containing an struct is not allowed as input in ES", type.getTypeName().c_str(), "");
+        }
+    }
+
     if (identifier != "gl_FragCoord" && (publicType.shaderQualifiers.originUpperLeft || publicType.shaderQualifiers.pixelCenterInteger))
         error(loc, "can only apply origin_upper_left and pixel_center_origin to gl_FragCoord", "layout qualifier", "");
     if (identifier != "gl_FragDepth" && publicType.shaderQualifiers.getDepth() != EldNone)
@@ -6956,6 +7013,15 @@
             error(loc, "wrong vector size (or rows in a matrix column):", "initializer list", type.getCompleteString().c_str());
             return nullptr;
         }
+        TBasicType destType = type.getBasicType();
+        for (int i = 0; i < type.getVectorSize(); ++i) {
+            TBasicType initType = initList->getSequence()[i]->getAsTyped()->getBasicType();
+            if (destType != initType && !intermediate.canImplicitlyPromote(initType, destType)) {
+                error(loc, "type mismatch in initializer list", "initializer list", type.getCompleteString().c_str());
+                return nullptr;
+            }
+
+        }
     } else {
         error(loc, "unexpected initializer-list type:", "initializer list", type.getCompleteString().c_str());
         return nullptr;
@@ -7412,6 +7478,19 @@
 
         return node;
 
+    case EOpConstructAccStruct:
+        if ((node->getType().isScalar() && node->getType().getBasicType() == EbtUint64)) {
+            // construct acceleration structure from uint64
+            requireExtensions(loc, 1, &E_GL_EXT_ray_tracing, "uint64_t conversion to acclerationStructureEXT");
+            return intermediate.addBuiltInFunctionCall(node->getLoc(), EOpConvUint64ToAccStruct, true, node,
+                type);
+        } else if (node->getType().isVector() && node->getType().getBasicType() == EbtUint && node->getVectorSize() == 2) {
+            // construct acceleration structure from uint64
+            requireExtensions(loc, 1, &E_GL_EXT_ray_tracing, "uvec2 conversion to accelerationStructureEXT");
+            return intermediate.addBuiltInFunctionCall(node->getLoc(), EOpConvUvec2ToAccStruct, true, node,
+                type);
+        } else
+            return nullptr;
 #endif // GLSLANG_WEB
 
     default:
@@ -7492,10 +7571,10 @@
         TType& memberType = *typeList[member].type;
         TQualifier& memberQualifier = memberType.getQualifier();
         const TSourceLoc& memberLoc = typeList[member].loc;
-        globalQualifierFixCheck(memberLoc, memberQualifier);
         if (memberQualifier.storage != EvqTemporary && memberQualifier.storage != EvqGlobal && memberQualifier.storage != currentBlockQualifier.storage)
             error(memberLoc, "member storage qualifier cannot contradict block storage qualifier", memberType.getFieldName().c_str(), "");
         memberQualifier.storage = currentBlockQualifier.storage;
+        globalQualifierFixCheck(memberLoc, memberQualifier);
 #ifndef GLSLANG_WEB
         inheritMemoryQualifiers(currentBlockQualifier, memberQualifier);
         if (currentBlockQualifier.perPrimitiveNV)
@@ -8193,7 +8272,7 @@
 
     bool pipeOut = qualifier.isPipeOutput();
     bool pipeIn = qualifier.isPipeInput();
-    if (version >= 300 || (!isEsProfile() && version >= 420)) {
+    if ((version >= 300 && isEsProfile()) || (!isEsProfile() && version >= 420)) {
         if (! pipeOut)
             error(loc, "can only apply to an output", "invariant", "");
     } else {
diff --git a/third_party/glslang/src/glslang/MachineIndependent/ParseHelper.h b/third_party/glslang/src/glslang/MachineIndependent/ParseHelper.h
index 0f09ada..fe2b6fb 100644
--- a/third_party/glslang/src/glslang/MachineIndependent/ParseHelper.h
+++ b/third_party/glslang/src/glslang/MachineIndependent/ParseHelper.h
@@ -83,7 +83,7 @@
           : TParseVersions(interm, version, profile, spvVersion, language, infoSink, forwardCompatible, messages),
             scopeMangler("::"),
             symbolTable(symbolTable),
-            statementNestingLevel(0), loopNestingLevel(0), structNestingLevel(0), controlFlowNestingLevel(0),
+            statementNestingLevel(0), loopNestingLevel(0), structNestingLevel(0), blockNestingLevel(0), controlFlowNestingLevel(0),
             currentFunctionType(nullptr),
             postEntryPointReturn(false),
             contextPragma(true, false),
@@ -178,7 +178,8 @@
     TSymbolTable& symbolTable;        // symbol table that goes with the current language, version, and profile
     int statementNestingLevel;        // 0 if outside all flow control or compound statements
     int loopNestingLevel;             // 0 if outside all loops
-    int structNestingLevel;           // 0 if outside blocks and structures
+    int structNestingLevel;           // 0 if outside structures
+    int blockNestingLevel;            // 0 if outside blocks
     int controlFlowNestingLevel;      // 0 if outside all flow control
     const TType* currentFunctionType; // the return type of the function that's currently being parsed
     bool functionReturnsValue;        // true if a non-void function has a return
@@ -365,7 +366,7 @@
     void accStructCheck(const TSourceLoc & loc, const TType & type, const TString & identifier);
     void transparentOpaqueCheck(const TSourceLoc&, const TType&, const TString& identifier);
     void memberQualifierCheck(glslang::TPublicType&);
-    void globalQualifierFixCheck(const TSourceLoc&, TQualifier&);
+    void globalQualifierFixCheck(const TSourceLoc&, TQualifier&, bool isMemberCheck = false);
     void globalQualifierTypeCheck(const TSourceLoc&, const TQualifier&, const TPublicType&);
     bool structQualifierErrorCheck(const TSourceLoc&, const TPublicType& pType);
     void mergeQualifiers(const TSourceLoc&, TQualifier& dst, const TQualifier& src, bool force);
diff --git a/third_party/glslang/src/glslang/MachineIndependent/Scan.cpp b/third_party/glslang/src/glslang/MachineIndependent/Scan.cpp
index bd3181a..78c8a36 100644
--- a/third_party/glslang/src/glslang/MachineIndependent/Scan.cpp
+++ b/third_party/glslang/src/glslang/MachineIndependent/Scan.cpp
@@ -365,6 +365,9 @@
     (*KeywordMap)["if"] =                      IF;
     (*KeywordMap)["else"] =                    ELSE;
     (*KeywordMap)["discard"] =                 DISCARD;
+    (*KeywordMap)["terminateInvocation"] =     TERMINATE_INVOCATION;
+    (*KeywordMap)["terminateRayEXT"] =         TERMINATE_RAY;
+    (*KeywordMap)["ignoreIntersectionEXT"] =   IGNORE_INTERSECTION;
     (*KeywordMap)["return"] =                  RETURN;
     (*KeywordMap)["void"] =                    VOID;
     (*KeywordMap)["bool"] =                    BOOL;
@@ -471,6 +474,28 @@
     (*KeywordMap)["image2DMSArray"] =          IMAGE2DMSARRAY;
     (*KeywordMap)["iimage2DMSArray"] =         IIMAGE2DMSARRAY;
     (*KeywordMap)["uimage2DMSArray"] =         UIMAGE2DMSARRAY;
+    (*KeywordMap)["i64image1D"] =              I64IMAGE1D;
+    (*KeywordMap)["u64image1D"] =              U64IMAGE1D;
+    (*KeywordMap)["i64image2D"] =              I64IMAGE2D;
+    (*KeywordMap)["u64image2D"] =              U64IMAGE2D;
+    (*KeywordMap)["i64image3D"] =              I64IMAGE3D;
+    (*KeywordMap)["u64image3D"] =              U64IMAGE3D;
+    (*KeywordMap)["i64image2DRect"] =          I64IMAGE2DRECT;
+    (*KeywordMap)["u64image2DRect"] =          U64IMAGE2DRECT;
+    (*KeywordMap)["i64imageCube"] =            I64IMAGECUBE;
+    (*KeywordMap)["u64imageCube"] =            U64IMAGECUBE;
+    (*KeywordMap)["i64imageBuffer"] =          I64IMAGEBUFFER;
+    (*KeywordMap)["u64imageBuffer"] =          U64IMAGEBUFFER;
+    (*KeywordMap)["i64image1DArray"] =         I64IMAGE1DARRAY;
+    (*KeywordMap)["u64image1DArray"] =         U64IMAGE1DARRAY;
+    (*KeywordMap)["i64image2DArray"] =         I64IMAGE2DARRAY;
+    (*KeywordMap)["u64image2DArray"] =         U64IMAGE2DARRAY;
+    (*KeywordMap)["i64imageCubeArray"] =       I64IMAGECUBEARRAY;
+    (*KeywordMap)["u64imageCubeArray"] =       U64IMAGECUBEARRAY;
+    (*KeywordMap)["i64image2DMS"] =            I64IMAGE2DMS;
+    (*KeywordMap)["u64image2DMS"] =            U64IMAGE2DMS;
+    (*KeywordMap)["i64image2DMSArray"] =       I64IMAGE2DMSARRAY;
+    (*KeywordMap)["u64image2DMSArray"] =       U64IMAGE2DMSARRAY;
     (*KeywordMap)["double"] =                  DOUBLE;
     (*KeywordMap)["dvec2"] =                   DVEC2;
     (*KeywordMap)["dvec3"] =                   DVEC3;
@@ -914,6 +939,17 @@
     case CASE:
         return keyword;
 
+    case TERMINATE_INVOCATION:
+        if (!parseContext.extensionTurnedOn(E_GL_EXT_terminate_invocation))
+            return identifierOrType();
+        return keyword;
+
+    case TERMINATE_RAY:
+    case IGNORE_INTERSECTION:
+        if (!parseContext.extensionTurnedOn(E_GL_EXT_ray_tracing))
+            return identifierOrType();
+        return keyword;
+
     case BUFFER:
         afterBuffer = true;
         if ((parseContext.isEsProfile() && parseContext.version < 310) ||
@@ -982,7 +1018,7 @@
         return keyword;
     case PACKED:
         if ((parseContext.isEsProfile() && parseContext.version < 300) ||
-            (!parseContext.isEsProfile() && parseContext.version < 330))
+            (!parseContext.isEsProfile() && parseContext.version < 140))
             return reservedWord();
         return identifierOrType();
 
@@ -1147,6 +1183,19 @@
         afterType = true;
         return firstGenerationImage(false);
 
+    case I64IMAGE1D:
+    case U64IMAGE1D:
+    case I64IMAGE1DARRAY:
+    case U64IMAGE1DARRAY:
+    case I64IMAGE2DRECT:
+    case U64IMAGE2DRECT:
+        afterType = true;
+        if (parseContext.symbolTable.atBuiltInLevel() ||
+            parseContext.extensionTurnedOn(E_GL_EXT_shader_image_int64)) {
+            return firstGenerationImage(false);
+        }
+        return identifierOrType();
+
     case IMAGEBUFFER:
     case IIMAGEBUFFER:
     case UIMAGEBUFFER:
@@ -1155,6 +1204,18 @@
             parseContext.extensionsTurnedOn(Num_AEP_texture_buffer, AEP_texture_buffer))
             return keyword;
         return firstGenerationImage(false);
+        
+    case I64IMAGEBUFFER:
+    case U64IMAGEBUFFER:
+        afterType = true;        
+        if (parseContext.symbolTable.atBuiltInLevel() ||
+            parseContext.extensionTurnedOn(E_GL_EXT_shader_image_int64)) {
+            if ((parseContext.isEsProfile() && parseContext.version >= 320) ||
+                parseContext.extensionsTurnedOn(Num_AEP_texture_buffer, AEP_texture_buffer))
+                return keyword;
+            return firstGenerationImage(false);
+        }
+        return identifierOrType();
 
     case IMAGE2D:
     case IIMAGE2D:
@@ -1171,6 +1232,20 @@
         afterType = true;
         return firstGenerationImage(true);
 
+    case I64IMAGE2D:
+    case U64IMAGE2D:
+    case I64IMAGE3D:
+    case U64IMAGE3D:
+    case I64IMAGECUBE:
+    case U64IMAGECUBE:
+    case I64IMAGE2DARRAY:
+    case U64IMAGE2DARRAY:
+        afterType = true;
+        if (parseContext.symbolTable.atBuiltInLevel() ||
+            parseContext.extensionTurnedOn(E_GL_EXT_shader_image_int64))
+            return firstGenerationImage(true);
+        return identifierOrType();
+        
     case IMAGECUBEARRAY:
     case IIMAGECUBEARRAY:
     case UIMAGECUBEARRAY:
@@ -1179,6 +1254,18 @@
             parseContext.extensionsTurnedOn(Num_AEP_texture_cube_map_array, AEP_texture_cube_map_array))
             return keyword;
         return secondGenerationImage();
+        
+    case I64IMAGECUBEARRAY:
+    case U64IMAGECUBEARRAY:
+        afterType = true;
+        if (parseContext.symbolTable.atBuiltInLevel() ||
+            parseContext.extensionTurnedOn(E_GL_EXT_shader_image_int64)) {
+            if ((parseContext.isEsProfile() && parseContext.version >= 320) ||
+                parseContext.extensionsTurnedOn(Num_AEP_texture_cube_map_array, AEP_texture_cube_map_array))
+                return keyword;
+            return secondGenerationImage();
+        }
+        return identifierOrType();
 
     case IMAGE2DMS:
     case IIMAGE2DMS:
@@ -1188,6 +1275,17 @@
     case UIMAGE2DMSARRAY:
         afterType = true;
         return secondGenerationImage();
+        
+    case I64IMAGE2DMS:
+    case U64IMAGE2DMS:
+    case I64IMAGE2DMSARRAY:
+    case U64IMAGE2DMSARRAY:
+        afterType = true;
+        if (parseContext.symbolTable.atBuiltInLevel() ||
+            parseContext.extensionTurnedOn(E_GL_EXT_shader_image_int64)) {
+            return secondGenerationImage();
+        }
+        return identifierOrType();
 
     case DOUBLE:
     case DVEC2:
diff --git a/third_party/glslang/src/glslang/MachineIndependent/SymbolTable.cpp b/third_party/glslang/src/glslang/MachineIndependent/SymbolTable.cpp
index 007f22c..f6291c3 100644
--- a/third_party/glslang/src/glslang/MachineIndependent/SymbolTable.cpp
+++ b/third_party/glslang/src/glslang/MachineIndependent/SymbolTable.cpp
@@ -85,6 +85,8 @@
 #endif
         case EbtInt:   mangledName += "i"; break;
         case EbtUint:  mangledName += "u"; break;
+        case EbtInt64:   mangledName += "i64"; break;
+        case EbtUint64:  mangledName += "u64"; break;
         default: break; // some compilers want this
         }
         if (sampler.isImageClass())
@@ -146,6 +148,8 @@
         if (typeName)
             mangledName += *typeName;
         for (unsigned int i = 0; i < structure->size(); ++i) {
+            if ((*structure)[i].type->getBasicType() == EbtVoid)
+                continue;
             mangledName += '-';
             (*structure)[i].type->buildMangledName(mangledName);
         }
diff --git a/third_party/glslang/src/glslang/MachineIndependent/SymbolTable.h b/third_party/glslang/src/glslang/MachineIndependent/SymbolTable.h
index ec4bc3c..db16c19 100644
--- a/third_party/glslang/src/glslang/MachineIndependent/SymbolTable.h
+++ b/third_party/glslang/src/glslang/MachineIndependent/SymbolTable.h
@@ -613,20 +613,24 @@
     //
 protected:
     static const int globalLevel = 3;
-    bool isSharedLevel(int level)  { return level <= 1; }              // exclude all per-compile levels
-    bool isBuiltInLevel(int level) { return level <= 2; }              // exclude user globals
-    bool isGlobalLevel(int level)  { return level <= globalLevel; }    // include user globals
+    static bool isSharedLevel(int level)  { return level <= 1; }            // exclude all per-compile levels
+    static bool isBuiltInLevel(int level) { return level <= 2; }            // exclude user globals
+    static bool isGlobalLevel(int level)  { return level <= globalLevel; }  // include user globals
 public:
     bool isEmpty() { return table.size() == 0; }
     bool atBuiltInLevel() { return isBuiltInLevel(currentLevel()); }
     bool atGlobalLevel()  { return isGlobalLevel(currentLevel()); }
-
+    static bool isBuiltInSymbol(int uniqueId) {
+        int level = uniqueId >> LevelFlagBitOffset;
+        return isBuiltInLevel(level);
+    }
     void setNoBuiltInRedeclarations() { noBuiltInRedeclarations = true; }
     void setSeparateNameSpaces() { separateNameSpaces = true; }
 
     void push()
     {
         table.push_back(new TSymbolTableLevel);
+        updateUniqueIdLevelFlag();
     }
 
     // Make a new symbol-table level to represent the scope introduced by a structure
@@ -639,6 +643,7 @@
     {
         assert(thisSymbol.getName().size() == 0);
         table.push_back(new TSymbolTableLevel);
+        updateUniqueIdLevelFlag();
         table.back()->setThisLevel();
         insert(thisSymbol);
     }
@@ -648,6 +653,7 @@
         table[currentLevel()]->getPreviousDefaultPrecisions(p);
         delete table.back();
         table.pop_back();
+        updateUniqueIdLevelFlag();
     }
 
     //
@@ -867,12 +873,20 @@
             table[level]->readOnly();
     }
 
+    // Add current level in the high-bits of unique id
+    void updateUniqueIdLevelFlag() {
+        // clamp level to avoid overflow
+        uint32_t level = currentLevel() > 7 ? 7 : currentLevel();
+        uniqueId &= ((1 << LevelFlagBitOffset) - 1);
+        uniqueId |= (level << LevelFlagBitOffset);
+    }
+
 protected:
     TSymbolTable(TSymbolTable&);
     TSymbolTable& operator=(TSymbolTableLevel&);
 
     int currentLevel() const { return static_cast<int>(table.size()) - 1; }
-
+    static const uint32_t LevelFlagBitOffset = 28;
     std::vector<TSymbolTableLevel*> table;
     int uniqueId;     // for unique identification in code generation
     bool noBuiltInRedeclarations;
diff --git a/third_party/glslang/src/glslang/MachineIndependent/Versions.cpp b/third_party/glslang/src/glslang/MachineIndependent/Versions.cpp
index 92d8d80..69b8863 100644
--- a/third_party/glslang/src/glslang/MachineIndependent/Versions.cpp
+++ b/third_party/glslang/src/glslang/MachineIndependent/Versions.cpp
@@ -328,6 +328,8 @@
     extensionBehavior[E_GL_EXT_blend_func_extended]         = EBhDisable;
     extensionBehavior[E_GL_EXT_shader_implicit_conversions] = EBhDisable;
     extensionBehavior[E_GL_EXT_fragment_shading_rate]       = EBhDisable;
+    extensionBehavior[E_GL_EXT_shader_image_int64]   = EBhDisable;
+    extensionBehavior[E_GL_EXT_terminate_invocation]        = EBhDisable;
 
     // OVR extensions
     extensionBehavior[E_GL_OVR_multiview]                = EBhDisable;
@@ -410,7 +412,7 @@
                 preamble += "#define GL_NV_shader_noperspective_interpolation 1\n";
             }
 
-    } else {
+    } else { // !isEsProfile()
         preamble =
             "#define GL_FRAGMENT_PRECISION_HIGH 1\n"
             "#define GL_ARB_texture_rectangle 1\n"
@@ -477,6 +479,7 @@
             "#define GL_KHR_shader_subgroup_clustered 1\n"
             "#define GL_KHR_shader_subgroup_quad 1\n"
 
+            "#define GL_EXT_shader_image_int64 1\n"
             "#define GL_EXT_shader_atomic_int64 1\n"
             "#define GL_EXT_shader_realtime_clock 1\n"
             "#define GL_EXT_ray_tracing 1\n"
@@ -561,6 +564,11 @@
             "#define GL_GOOGLE_include_directive 1\n"
             "#define GL_KHR_blend_equation_advanced 1\n"
             ;
+
+    // other general extensions
+    preamble +=
+            "#define GL_EXT_terminate_invocation 1\n"
+            ;
 #endif
 
     // #define VULKAN XXXX
diff --git a/third_party/glslang/src/glslang/MachineIndependent/Versions.h b/third_party/glslang/src/glslang/MachineIndependent/Versions.h
index 7c38de3..eb17c52 100644
--- a/third_party/glslang/src/glslang/MachineIndependent/Versions.h
+++ b/third_party/glslang/src/glslang/MachineIndependent/Versions.h
@@ -200,6 +200,7 @@
 const char* const E_GL_EXT_blend_func_extended              = "GL_EXT_blend_func_extended";
 const char* const E_GL_EXT_shader_implicit_conversions      = "GL_EXT_shader_implicit_conversions";
 const char* const E_GL_EXT_fragment_shading_rate            = "GL_EXT_fragment_shading_rate";
+const char* const E_GL_EXT_shader_image_int64               = "GL_EXT_shader_image_int64";
 
 // Arrays of extensions for the above viewportEXTs duplications
 
@@ -298,6 +299,7 @@
 const char* const E_GL_EXT_shader_subgroup_extended_types_int16   = "GL_EXT_shader_subgroup_extended_types_int16";
 const char* const E_GL_EXT_shader_subgroup_extended_types_int64   = "GL_EXT_shader_subgroup_extended_types_int64";
 const char* const E_GL_EXT_shader_subgroup_extended_types_float16 = "GL_EXT_shader_subgroup_extended_types_float16";
+const char* const E_GL_EXT_terminate_invocation = "GL_EXT_terminate_invocation";
 
 const char* const E_GL_EXT_shader_atomic_float = "GL_EXT_shader_atomic_float";
 
diff --git a/third_party/glslang/src/glslang/MachineIndependent/glslang.m4 b/third_party/glslang/src/glslang/MachineIndependent/glslang.m4
index 0b4b53f..8884b26 100644
--- a/third_party/glslang/src/glslang/MachineIndependent/glslang.m4
+++ b/third_party/glslang/src/glslang/MachineIndependent/glslang.m4
@@ -242,6 +242,18 @@
 %token <lex> F16IMAGECUBE F16IMAGE1DARRAY F16IMAGE2DARRAY F16IMAGECUBEARRAY
 %token <lex> F16IMAGEBUFFER F16IMAGE2DMS F16IMAGE2DMSARRAY
 
+%token <lex> I64IMAGE1D U64IMAGE1D
+%token <lex> I64IMAGE2D U64IMAGE2D
+%token <lex> I64IMAGE3D U64IMAGE3D
+%token <lex> I64IMAGE2DRECT U64IMAGE2DRECT
+%token <lex> I64IMAGECUBE U64IMAGECUBE
+%token <lex> I64IMAGEBUFFER U64IMAGEBUFFER
+%token <lex> I64IMAGE1DARRAY U64IMAGE1DARRAY
+%token <lex> I64IMAGE2DARRAY U64IMAGE2DARRAY
+%token <lex> I64IMAGECUBEARRAY U64IMAGECUBEARRAY
+%token <lex> I64IMAGE2DMS U64IMAGE2DMS
+%token <lex> I64IMAGE2DMSARRAY U64IMAGE2DMSARRAY
+
 // texture without sampler
 %token <lex> TEXTURECUBEARRAY ITEXTURECUBEARRAY UTEXTURECUBEARRAY
 %token <lex> TEXTURE1D ITEXTURE1D UTEXTURE1D
@@ -281,6 +293,8 @@
 %token <lex> CENTROID IN OUT INOUT
 %token <lex> STRUCT VOID WHILE
 %token <lex> BREAK CONTINUE DO ELSE FOR IF DISCARD RETURN SWITCH CASE DEFAULT
+%token <lex> TERMINATE_INVOCATION
+%token <lex> TERMINATE_RAY IGNORE_INTERSECTION
 %token <lex> UNIFORM SHARED BUFFER
 %token <lex> FLAT SMOOTH LAYOUT
 
@@ -905,7 +919,7 @@
 
 block_structure
     : type_qualifier IDENTIFIER LEFT_BRACE { parseContext.nestedBlockCheck($1.loc); } struct_declaration_list RIGHT_BRACE {
-        --parseContext.structNestingLevel;
+        --parseContext.blockNestingLevel;
         parseContext.blockName = $2.string;
         parseContext.globalQualifierFixCheck($1.loc, $1.qualifier);
         parseContext.checkNoShaderLayouts($1.loc, $1.shaderQualifiers);
@@ -3203,6 +3217,116 @@
         $$.basicType = EbtSampler;
         $$.sampler.setImage(EbtUint, Esd2D, true, false, true);
     }
+    | I64IMAGE1D {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, Esd1D);
+    }
+    | U64IMAGE1D {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, Esd1D);
+    }
+    | I64IMAGE2D {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, Esd2D);
+    }
+    | U64IMAGE2D {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, Esd2D);
+    }
+    | I64IMAGE3D {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, Esd3D);
+    }
+    | U64IMAGE3D {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, Esd3D);
+    }
+    | I64IMAGE2DRECT {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, EsdRect);
+    }
+    | U64IMAGE2DRECT {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, EsdRect);
+    }
+    | I64IMAGECUBE {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, EsdCube);
+    }
+    | U64IMAGECUBE {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, EsdCube);
+    }
+    | I64IMAGEBUFFER {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, EsdBuffer);
+    }
+    | U64IMAGEBUFFER {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, EsdBuffer);
+    }
+    | I64IMAGE1DARRAY {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, Esd1D, true);
+    }
+    | U64IMAGE1DARRAY {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, Esd1D, true);
+    }
+    | I64IMAGE2DARRAY {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, Esd2D, true);
+    }
+    | U64IMAGE2DARRAY {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, Esd2D, true);
+    }
+    | I64IMAGECUBEARRAY {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, EsdCube, true);
+    }
+    | U64IMAGECUBEARRAY {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, EsdCube, true);
+    }
+    | I64IMAGE2DMS {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, Esd2D, false, false, true);
+    }
+    | U64IMAGE2DMS {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, Esd2D, false, false, true);
+    }
+    | I64IMAGE2DMSARRAY {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, Esd2D, true, false, true);
+    }
+    | U64IMAGE2DMSARRAY {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, Esd2D, true, false, true);
+    }
     | SAMPLEREXTERNALOES {  // GL_OES_EGL_image_external
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtSampler;
@@ -3805,6 +3929,20 @@
         parseContext.requireStage($1.loc, EShLangFragment, "discard");
         $$ = parseContext.intermediate.addBranch(EOpKill, $1.loc);
     }
+    | TERMINATE_INVOCATION SEMICOLON {
+        parseContext.requireStage($1.loc, EShLangFragment, "terminateInvocation");
+        $$ = parseContext.intermediate.addBranch(EOpTerminateInvocation, $1.loc);
+    }
+GLSLANG_WEB_EXCLUDE_ON
+    | TERMINATE_RAY SEMICOLON {
+        parseContext.requireStage($1.loc, EShLangAnyHit, "terminateRayEXT");
+        $$ = parseContext.intermediate.addBranch(EOpTerminateRayKHR, $1.loc);
+    }
+    | IGNORE_INTERSECTION SEMICOLON {
+        parseContext.requireStage($1.loc, EShLangAnyHit, "ignoreIntersectionEXT");
+        $$ = parseContext.intermediate.addBranch(EOpIgnoreIntersectionKHR, $1.loc);
+    }
+GLSLANG_WEB_EXCLUDE_OFF
     ;
 
 // Grammar Note:  No 'goto'.  Gotos are not supported.
diff --git a/third_party/glslang/src/glslang/MachineIndependent/glslang.y b/third_party/glslang/src/glslang/MachineIndependent/glslang.y
index 23adcb0..2681d48 100644
--- a/third_party/glslang/src/glslang/MachineIndependent/glslang.y
+++ b/third_party/glslang/src/glslang/MachineIndependent/glslang.y
@@ -242,6 +242,18 @@
 %token <lex> F16IMAGECUBE F16IMAGE1DARRAY F16IMAGE2DARRAY F16IMAGECUBEARRAY
 %token <lex> F16IMAGEBUFFER F16IMAGE2DMS F16IMAGE2DMSARRAY
 
+%token <lex> I64IMAGE1D U64IMAGE1D
+%token <lex> I64IMAGE2D U64IMAGE2D
+%token <lex> I64IMAGE3D U64IMAGE3D
+%token <lex> I64IMAGE2DRECT U64IMAGE2DRECT
+%token <lex> I64IMAGECUBE U64IMAGECUBE
+%token <lex> I64IMAGEBUFFER U64IMAGEBUFFER
+%token <lex> I64IMAGE1DARRAY U64IMAGE1DARRAY
+%token <lex> I64IMAGE2DARRAY U64IMAGE2DARRAY
+%token <lex> I64IMAGECUBEARRAY U64IMAGECUBEARRAY
+%token <lex> I64IMAGE2DMS U64IMAGE2DMS
+%token <lex> I64IMAGE2DMSARRAY U64IMAGE2DMSARRAY
+
 // texture without sampler
 %token <lex> TEXTURECUBEARRAY ITEXTURECUBEARRAY UTEXTURECUBEARRAY
 %token <lex> TEXTURE1D ITEXTURE1D UTEXTURE1D
@@ -281,6 +293,8 @@
 %token <lex> CENTROID IN OUT INOUT
 %token <lex> STRUCT VOID WHILE
 %token <lex> BREAK CONTINUE DO ELSE FOR IF DISCARD RETURN SWITCH CASE DEFAULT
+%token <lex> TERMINATE_INVOCATION
+%token <lex> TERMINATE_RAY IGNORE_INTERSECTION
 %token <lex> UNIFORM SHARED BUFFER
 %token <lex> FLAT SMOOTH LAYOUT
 
@@ -905,7 +919,7 @@
 
 block_structure
     : type_qualifier IDENTIFIER LEFT_BRACE { parseContext.nestedBlockCheck($1.loc); } struct_declaration_list RIGHT_BRACE {
-        --parseContext.structNestingLevel;
+        --parseContext.blockNestingLevel;
         parseContext.blockName = $2.string;
         parseContext.globalQualifierFixCheck($1.loc, $1.qualifier);
         parseContext.checkNoShaderLayouts($1.loc, $1.shaderQualifiers);
@@ -3203,6 +3217,116 @@
         $$.basicType = EbtSampler;
         $$.sampler.setImage(EbtUint, Esd2D, true, false, true);
     }
+    | I64IMAGE1D {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, Esd1D);
+    }
+    | U64IMAGE1D {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, Esd1D);
+    }
+    | I64IMAGE2D {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, Esd2D);
+    }
+    | U64IMAGE2D {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, Esd2D);
+    }
+    | I64IMAGE3D {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, Esd3D);
+    }
+    | U64IMAGE3D {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, Esd3D);
+    }
+    | I64IMAGE2DRECT {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, EsdRect);
+    }
+    | U64IMAGE2DRECT {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, EsdRect);
+    }
+    | I64IMAGECUBE {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, EsdCube);
+    }
+    | U64IMAGECUBE {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, EsdCube);
+    }
+    | I64IMAGEBUFFER {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, EsdBuffer);
+    }
+    | U64IMAGEBUFFER {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, EsdBuffer);
+    }
+    | I64IMAGE1DARRAY {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, Esd1D, true);
+    }
+    | U64IMAGE1DARRAY {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, Esd1D, true);
+    }
+    | I64IMAGE2DARRAY {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, Esd2D, true);
+    }
+    | U64IMAGE2DARRAY {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, Esd2D, true);
+    }
+    | I64IMAGECUBEARRAY {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, EsdCube, true);
+    }
+    | U64IMAGECUBEARRAY {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, EsdCube, true);
+    }
+    | I64IMAGE2DMS {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, Esd2D, false, false, true);
+    }
+    | U64IMAGE2DMS {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, Esd2D, false, false, true);
+    }
+    | I64IMAGE2DMSARRAY {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, Esd2D, true, false, true);
+    }
+    | U64IMAGE2DMSARRAY {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, Esd2D, true, false, true);
+    }
     | SAMPLEREXTERNALOES {  // GL_OES_EGL_image_external
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtSampler;
@@ -3805,6 +3929,20 @@
         parseContext.requireStage($1.loc, EShLangFragment, "discard");
         $$ = parseContext.intermediate.addBranch(EOpKill, $1.loc);
     }
+    | TERMINATE_INVOCATION SEMICOLON {
+        parseContext.requireStage($1.loc, EShLangFragment, "terminateInvocation");
+        $$ = parseContext.intermediate.addBranch(EOpTerminateInvocation, $1.loc);
+    }
+
+    | TERMINATE_RAY SEMICOLON {
+        parseContext.requireStage($1.loc, EShLangAnyHit, "terminateRayEXT");
+        $$ = parseContext.intermediate.addBranch(EOpTerminateRayKHR, $1.loc);
+    }
+    | IGNORE_INTERSECTION SEMICOLON {
+        parseContext.requireStage($1.loc, EShLangAnyHit, "ignoreIntersectionEXT");
+        $$ = parseContext.intermediate.addBranch(EOpIgnoreIntersectionKHR, $1.loc);
+    }
+
     ;
 
 // Grammar Note:  No 'goto'.  Gotos are not supported.
diff --git a/third_party/glslang/src/glslang/MachineIndependent/glslang_tab.cpp b/third_party/glslang/src/glslang/MachineIndependent/glslang_tab.cpp
index ac35797..feecc98 100644
--- a/third_party/glslang/src/glslang/MachineIndependent/glslang_tab.cpp
+++ b/third_party/glslang/src/glslang/MachineIndependent/glslang_tab.cpp
@@ -1,8 +1,9 @@
-/* A Bison parser, made by GNU Bison 3.0.4.  */
+/* A Bison parser, made by GNU Bison 3.7.4.  */
 
 /* Bison implementation for Yacc-like parsers in C
 
-   Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
+   Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2020 Free Software Foundation,
+   Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -33,6 +34,10 @@
 /* C LALR(1) parser skeleton written by Richard Stallman, by
    simplifying the original so-called "semantic" parser.  */
 
+/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual,
+   especially those whose name start with YY_ or yy_.  They are
+   private implementation details that can be changed or removed.  */
+
 /* All symbols defined below should begin with yy or YY, to avoid
    infringing on user name space.  This should be done even for local
    variables, as they might otherwise be expanded by user macros.
@@ -40,11 +45,11 @@
    define necessary library symbols; they are noted "INFRINGES ON
    USER NAME SPACE" below.  */
 
-/* Identify Bison output.  */
-#define YYBISON 1
+/* Identify Bison output, and Bison version.  */
+#define YYBISON 30704
 
-/* Bison version.  */
-#define YYBISON_VERSION "3.0.4"
+/* Bison version string.  */
+#define YYBISON_VERSION "3.7.4"
 
 /* Skeleton name.  */
 #define YYSKELETON_NAME "yacc.c"
@@ -61,8 +66,8 @@
 
 
 
-/* Copy the first part of user declarations.  */
-#line 69 "MachineIndependent/glslang.y" /* yacc.c:339  */
+/* First part of user prologue.  */
+#line 69 "MachineIndependent/glslang.y"
 
 
 /* Based on:
@@ -88,518 +93,596 @@
 using namespace glslang;
 
 
-#line 92 "MachineIndependent/glslang_tab.cpp" /* yacc.c:339  */
+#line 97 "MachineIndependent/glslang_tab.cpp"
 
-# ifndef YY_NULLPTR
-#  if defined __cplusplus && 201103L <= __cplusplus
-#   define YY_NULLPTR nullptr
+# ifndef YY_CAST
+#  ifdef __cplusplus
+#   define YY_CAST(Type, Val) static_cast<Type> (Val)
+#   define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast<Type> (Val)
 #  else
-#   define YY_NULLPTR 0
+#   define YY_CAST(Type, Val) ((Type) (Val))
+#   define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val))
+#  endif
+# endif
+# ifndef YY_NULLPTR
+#  if defined __cplusplus
+#   if 201103L <= __cplusplus
+#    define YY_NULLPTR nullptr
+#   else
+#    define YY_NULLPTR 0
+#   endif
+#  else
+#   define YY_NULLPTR ((void*)0)
 #  endif
 # endif
 
-/* Enabling verbose error messages.  */
-#ifdef YYERROR_VERBOSE
-# undef YYERROR_VERBOSE
-# define YYERROR_VERBOSE 1
-#else
-# define YYERROR_VERBOSE 1
-#endif
-
-/* In a future release of Bison, this section will be replaced
-   by #include "glslang_tab.cpp.h".  */
-#ifndef YY_YY_MACHINEINDEPENDENT_GLSLANG_TAB_CPP_H_INCLUDED
-# define YY_YY_MACHINEINDEPENDENT_GLSLANG_TAB_CPP_H_INCLUDED
-/* Debug traces.  */
-#ifndef YYDEBUG
-# define YYDEBUG 1
-#endif
-#if YYDEBUG
-extern int yydebug;
-#endif
-
-/* Token type.  */
-#ifndef YYTOKENTYPE
-# define YYTOKENTYPE
-  enum yytokentype
-  {
-    CONST = 258,
-    BOOL = 259,
-    INT = 260,
-    UINT = 261,
-    FLOAT = 262,
-    BVEC2 = 263,
-    BVEC3 = 264,
-    BVEC4 = 265,
-    IVEC2 = 266,
-    IVEC3 = 267,
-    IVEC4 = 268,
-    UVEC2 = 269,
-    UVEC3 = 270,
-    UVEC4 = 271,
-    VEC2 = 272,
-    VEC3 = 273,
-    VEC4 = 274,
-    MAT2 = 275,
-    MAT3 = 276,
-    MAT4 = 277,
-    MAT2X2 = 278,
-    MAT2X3 = 279,
-    MAT2X4 = 280,
-    MAT3X2 = 281,
-    MAT3X3 = 282,
-    MAT3X4 = 283,
-    MAT4X2 = 284,
-    MAT4X3 = 285,
-    MAT4X4 = 286,
-    SAMPLER2D = 287,
-    SAMPLER3D = 288,
-    SAMPLERCUBE = 289,
-    SAMPLER2DSHADOW = 290,
-    SAMPLERCUBESHADOW = 291,
-    SAMPLER2DARRAY = 292,
-    SAMPLER2DARRAYSHADOW = 293,
-    ISAMPLER2D = 294,
-    ISAMPLER3D = 295,
-    ISAMPLERCUBE = 296,
-    ISAMPLER2DARRAY = 297,
-    USAMPLER2D = 298,
-    USAMPLER3D = 299,
-    USAMPLERCUBE = 300,
-    USAMPLER2DARRAY = 301,
-    SAMPLER = 302,
-    SAMPLERSHADOW = 303,
-    TEXTURE2D = 304,
-    TEXTURE3D = 305,
-    TEXTURECUBE = 306,
-    TEXTURE2DARRAY = 307,
-    ITEXTURE2D = 308,
-    ITEXTURE3D = 309,
-    ITEXTURECUBE = 310,
-    ITEXTURE2DARRAY = 311,
-    UTEXTURE2D = 312,
-    UTEXTURE3D = 313,
-    UTEXTURECUBE = 314,
-    UTEXTURE2DARRAY = 315,
-    ATTRIBUTE = 316,
-    VARYING = 317,
-    FLOAT16_T = 318,
-    FLOAT32_T = 319,
-    DOUBLE = 320,
-    FLOAT64_T = 321,
-    INT64_T = 322,
-    UINT64_T = 323,
-    INT32_T = 324,
-    UINT32_T = 325,
-    INT16_T = 326,
-    UINT16_T = 327,
-    INT8_T = 328,
-    UINT8_T = 329,
-    I64VEC2 = 330,
-    I64VEC3 = 331,
-    I64VEC4 = 332,
-    U64VEC2 = 333,
-    U64VEC3 = 334,
-    U64VEC4 = 335,
-    I32VEC2 = 336,
-    I32VEC3 = 337,
-    I32VEC4 = 338,
-    U32VEC2 = 339,
-    U32VEC3 = 340,
-    U32VEC4 = 341,
-    I16VEC2 = 342,
-    I16VEC3 = 343,
-    I16VEC4 = 344,
-    U16VEC2 = 345,
-    U16VEC3 = 346,
-    U16VEC4 = 347,
-    I8VEC2 = 348,
-    I8VEC3 = 349,
-    I8VEC4 = 350,
-    U8VEC2 = 351,
-    U8VEC3 = 352,
-    U8VEC4 = 353,
-    DVEC2 = 354,
-    DVEC3 = 355,
-    DVEC4 = 356,
-    DMAT2 = 357,
-    DMAT3 = 358,
-    DMAT4 = 359,
-    F16VEC2 = 360,
-    F16VEC3 = 361,
-    F16VEC4 = 362,
-    F16MAT2 = 363,
-    F16MAT3 = 364,
-    F16MAT4 = 365,
-    F32VEC2 = 366,
-    F32VEC3 = 367,
-    F32VEC4 = 368,
-    F32MAT2 = 369,
-    F32MAT3 = 370,
-    F32MAT4 = 371,
-    F64VEC2 = 372,
-    F64VEC3 = 373,
-    F64VEC4 = 374,
-    F64MAT2 = 375,
-    F64MAT3 = 376,
-    F64MAT4 = 377,
-    DMAT2X2 = 378,
-    DMAT2X3 = 379,
-    DMAT2X4 = 380,
-    DMAT3X2 = 381,
-    DMAT3X3 = 382,
-    DMAT3X4 = 383,
-    DMAT4X2 = 384,
-    DMAT4X3 = 385,
-    DMAT4X4 = 386,
-    F16MAT2X2 = 387,
-    F16MAT2X3 = 388,
-    F16MAT2X4 = 389,
-    F16MAT3X2 = 390,
-    F16MAT3X3 = 391,
-    F16MAT3X4 = 392,
-    F16MAT4X2 = 393,
-    F16MAT4X3 = 394,
-    F16MAT4X4 = 395,
-    F32MAT2X2 = 396,
-    F32MAT2X3 = 397,
-    F32MAT2X4 = 398,
-    F32MAT3X2 = 399,
-    F32MAT3X3 = 400,
-    F32MAT3X4 = 401,
-    F32MAT4X2 = 402,
-    F32MAT4X3 = 403,
-    F32MAT4X4 = 404,
-    F64MAT2X2 = 405,
-    F64MAT2X3 = 406,
-    F64MAT2X4 = 407,
-    F64MAT3X2 = 408,
-    F64MAT3X3 = 409,
-    F64MAT3X4 = 410,
-    F64MAT4X2 = 411,
-    F64MAT4X3 = 412,
-    F64MAT4X4 = 413,
-    ATOMIC_UINT = 414,
-    ACCSTRUCTNV = 415,
-    ACCSTRUCTEXT = 416,
-    RAYQUERYEXT = 417,
-    FCOOPMATNV = 418,
-    ICOOPMATNV = 419,
-    UCOOPMATNV = 420,
-    SAMPLERCUBEARRAY = 421,
-    SAMPLERCUBEARRAYSHADOW = 422,
-    ISAMPLERCUBEARRAY = 423,
-    USAMPLERCUBEARRAY = 424,
-    SAMPLER1D = 425,
-    SAMPLER1DARRAY = 426,
-    SAMPLER1DARRAYSHADOW = 427,
-    ISAMPLER1D = 428,
-    SAMPLER1DSHADOW = 429,
-    SAMPLER2DRECT = 430,
-    SAMPLER2DRECTSHADOW = 431,
-    ISAMPLER2DRECT = 432,
-    USAMPLER2DRECT = 433,
-    SAMPLERBUFFER = 434,
-    ISAMPLERBUFFER = 435,
-    USAMPLERBUFFER = 436,
-    SAMPLER2DMS = 437,
-    ISAMPLER2DMS = 438,
-    USAMPLER2DMS = 439,
-    SAMPLER2DMSARRAY = 440,
-    ISAMPLER2DMSARRAY = 441,
-    USAMPLER2DMSARRAY = 442,
-    SAMPLEREXTERNALOES = 443,
-    SAMPLEREXTERNAL2DY2YEXT = 444,
-    ISAMPLER1DARRAY = 445,
-    USAMPLER1D = 446,
-    USAMPLER1DARRAY = 447,
-    F16SAMPLER1D = 448,
-    F16SAMPLER2D = 449,
-    F16SAMPLER3D = 450,
-    F16SAMPLER2DRECT = 451,
-    F16SAMPLERCUBE = 452,
-    F16SAMPLER1DARRAY = 453,
-    F16SAMPLER2DARRAY = 454,
-    F16SAMPLERCUBEARRAY = 455,
-    F16SAMPLERBUFFER = 456,
-    F16SAMPLER2DMS = 457,
-    F16SAMPLER2DMSARRAY = 458,
-    F16SAMPLER1DSHADOW = 459,
-    F16SAMPLER2DSHADOW = 460,
-    F16SAMPLER1DARRAYSHADOW = 461,
-    F16SAMPLER2DARRAYSHADOW = 462,
-    F16SAMPLER2DRECTSHADOW = 463,
-    F16SAMPLERCUBESHADOW = 464,
-    F16SAMPLERCUBEARRAYSHADOW = 465,
-    IMAGE1D = 466,
-    IIMAGE1D = 467,
-    UIMAGE1D = 468,
-    IMAGE2D = 469,
-    IIMAGE2D = 470,
-    UIMAGE2D = 471,
-    IMAGE3D = 472,
-    IIMAGE3D = 473,
-    UIMAGE3D = 474,
-    IMAGE2DRECT = 475,
-    IIMAGE2DRECT = 476,
-    UIMAGE2DRECT = 477,
-    IMAGECUBE = 478,
-    IIMAGECUBE = 479,
-    UIMAGECUBE = 480,
-    IMAGEBUFFER = 481,
-    IIMAGEBUFFER = 482,
-    UIMAGEBUFFER = 483,
-    IMAGE1DARRAY = 484,
-    IIMAGE1DARRAY = 485,
-    UIMAGE1DARRAY = 486,
-    IMAGE2DARRAY = 487,
-    IIMAGE2DARRAY = 488,
-    UIMAGE2DARRAY = 489,
-    IMAGECUBEARRAY = 490,
-    IIMAGECUBEARRAY = 491,
-    UIMAGECUBEARRAY = 492,
-    IMAGE2DMS = 493,
-    IIMAGE2DMS = 494,
-    UIMAGE2DMS = 495,
-    IMAGE2DMSARRAY = 496,
-    IIMAGE2DMSARRAY = 497,
-    UIMAGE2DMSARRAY = 498,
-    F16IMAGE1D = 499,
-    F16IMAGE2D = 500,
-    F16IMAGE3D = 501,
-    F16IMAGE2DRECT = 502,
-    F16IMAGECUBE = 503,
-    F16IMAGE1DARRAY = 504,
-    F16IMAGE2DARRAY = 505,
-    F16IMAGECUBEARRAY = 506,
-    F16IMAGEBUFFER = 507,
-    F16IMAGE2DMS = 508,
-    F16IMAGE2DMSARRAY = 509,
-    TEXTURECUBEARRAY = 510,
-    ITEXTURECUBEARRAY = 511,
-    UTEXTURECUBEARRAY = 512,
-    TEXTURE1D = 513,
-    ITEXTURE1D = 514,
-    UTEXTURE1D = 515,
-    TEXTURE1DARRAY = 516,
-    ITEXTURE1DARRAY = 517,
-    UTEXTURE1DARRAY = 518,
-    TEXTURE2DRECT = 519,
-    ITEXTURE2DRECT = 520,
-    UTEXTURE2DRECT = 521,
-    TEXTUREBUFFER = 522,
-    ITEXTUREBUFFER = 523,
-    UTEXTUREBUFFER = 524,
-    TEXTURE2DMS = 525,
-    ITEXTURE2DMS = 526,
-    UTEXTURE2DMS = 527,
-    TEXTURE2DMSARRAY = 528,
-    ITEXTURE2DMSARRAY = 529,
-    UTEXTURE2DMSARRAY = 530,
-    F16TEXTURE1D = 531,
-    F16TEXTURE2D = 532,
-    F16TEXTURE3D = 533,
-    F16TEXTURE2DRECT = 534,
-    F16TEXTURECUBE = 535,
-    F16TEXTURE1DARRAY = 536,
-    F16TEXTURE2DARRAY = 537,
-    F16TEXTURECUBEARRAY = 538,
-    F16TEXTUREBUFFER = 539,
-    F16TEXTURE2DMS = 540,
-    F16TEXTURE2DMSARRAY = 541,
-    SUBPASSINPUT = 542,
-    SUBPASSINPUTMS = 543,
-    ISUBPASSINPUT = 544,
-    ISUBPASSINPUTMS = 545,
-    USUBPASSINPUT = 546,
-    USUBPASSINPUTMS = 547,
-    F16SUBPASSINPUT = 548,
-    F16SUBPASSINPUTMS = 549,
-    LEFT_OP = 550,
-    RIGHT_OP = 551,
-    INC_OP = 552,
-    DEC_OP = 553,
-    LE_OP = 554,
-    GE_OP = 555,
-    EQ_OP = 556,
-    NE_OP = 557,
-    AND_OP = 558,
-    OR_OP = 559,
-    XOR_OP = 560,
-    MUL_ASSIGN = 561,
-    DIV_ASSIGN = 562,
-    ADD_ASSIGN = 563,
-    MOD_ASSIGN = 564,
-    LEFT_ASSIGN = 565,
-    RIGHT_ASSIGN = 566,
-    AND_ASSIGN = 567,
-    XOR_ASSIGN = 568,
-    OR_ASSIGN = 569,
-    SUB_ASSIGN = 570,
-    STRING_LITERAL = 571,
-    LEFT_PAREN = 572,
-    RIGHT_PAREN = 573,
-    LEFT_BRACKET = 574,
-    RIGHT_BRACKET = 575,
-    LEFT_BRACE = 576,
-    RIGHT_BRACE = 577,
-    DOT = 578,
-    COMMA = 579,
-    COLON = 580,
-    EQUAL = 581,
-    SEMICOLON = 582,
-    BANG = 583,
-    DASH = 584,
-    TILDE = 585,
-    PLUS = 586,
-    STAR = 587,
-    SLASH = 588,
-    PERCENT = 589,
-    LEFT_ANGLE = 590,
-    RIGHT_ANGLE = 591,
-    VERTICAL_BAR = 592,
-    CARET = 593,
-    AMPERSAND = 594,
-    QUESTION = 595,
-    INVARIANT = 596,
-    HIGH_PRECISION = 597,
-    MEDIUM_PRECISION = 598,
-    LOW_PRECISION = 599,
-    PRECISION = 600,
-    PACKED = 601,
-    RESOURCE = 602,
-    SUPERP = 603,
-    FLOATCONSTANT = 604,
-    INTCONSTANT = 605,
-    UINTCONSTANT = 606,
-    BOOLCONSTANT = 607,
-    IDENTIFIER = 608,
-    TYPE_NAME = 609,
-    CENTROID = 610,
-    IN = 611,
-    OUT = 612,
-    INOUT = 613,
-    STRUCT = 614,
-    VOID = 615,
-    WHILE = 616,
-    BREAK = 617,
-    CONTINUE = 618,
-    DO = 619,
-    ELSE = 620,
-    FOR = 621,
-    IF = 622,
-    DISCARD = 623,
-    RETURN = 624,
-    SWITCH = 625,
-    CASE = 626,
-    DEFAULT = 627,
-    UNIFORM = 628,
-    SHARED = 629,
-    BUFFER = 630,
-    FLAT = 631,
-    SMOOTH = 632,
-    LAYOUT = 633,
-    DOUBLECONSTANT = 634,
-    INT16CONSTANT = 635,
-    UINT16CONSTANT = 636,
-    FLOAT16CONSTANT = 637,
-    INT32CONSTANT = 638,
-    UINT32CONSTANT = 639,
-    INT64CONSTANT = 640,
-    UINT64CONSTANT = 641,
-    SUBROUTINE = 642,
-    DEMOTE = 643,
-    PAYLOADNV = 644,
-    PAYLOADINNV = 645,
-    HITATTRNV = 646,
-    CALLDATANV = 647,
-    CALLDATAINNV = 648,
-    PAYLOADEXT = 649,
-    PAYLOADINEXT = 650,
-    HITATTREXT = 651,
-    CALLDATAEXT = 652,
-    CALLDATAINEXT = 653,
-    PATCH = 654,
-    SAMPLE = 655,
-    NONUNIFORM = 656,
-    COHERENT = 657,
-    VOLATILE = 658,
-    RESTRICT = 659,
-    READONLY = 660,
-    WRITEONLY = 661,
-    DEVICECOHERENT = 662,
-    QUEUEFAMILYCOHERENT = 663,
-    WORKGROUPCOHERENT = 664,
-    SUBGROUPCOHERENT = 665,
-    NONPRIVATE = 666,
-    SHADERCALLCOHERENT = 667,
-    NOPERSPECTIVE = 668,
-    EXPLICITINTERPAMD = 669,
-    PERVERTEXNV = 670,
-    PERPRIMITIVENV = 671,
-    PERVIEWNV = 672,
-    PERTASKNV = 673,
-    PRECISE = 674
-  };
-#endif
-
-/* Value type.  */
-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-
-union YYSTYPE
+#include "glslang_tab.cpp.h"
+/* Symbol kind.  */
+enum yysymbol_kind_t
 {
-#line 97 "MachineIndependent/glslang.y" /* yacc.c:355  */
-
-    struct {
-        glslang::TSourceLoc loc;
-        union {
-            glslang::TString *string;
-            int i;
-            unsigned int u;
-            long long i64;
-            unsigned long long u64;
-            bool b;
-            double d;
-        };
-        glslang::TSymbol* symbol;
-    } lex;
-    struct {
-        glslang::TSourceLoc loc;
-        glslang::TOperator op;
-        union {
-            TIntermNode* intermNode;
-            glslang::TIntermNodePair nodePair;
-            glslang::TIntermTyped* intermTypedNode;
-            glslang::TAttributes* attributes;
-        };
-        union {
-            glslang::TPublicType type;
-            glslang::TFunction* function;
-            glslang::TParameter param;
-            glslang::TTypeLoc typeLine;
-            glslang::TTypeList* typeList;
-            glslang::TArraySizes* arraySizes;
-            glslang::TIdentifierList* identifierList;
-        };
-        glslang::TArraySizes* typeParameters;
-    } interm;
-
-#line 588 "MachineIndependent/glslang_tab.cpp" /* yacc.c:355  */
+  YYSYMBOL_YYEMPTY = -2,
+  YYSYMBOL_YYEOF = 0,                      /* "end of file"  */
+  YYSYMBOL_YYerror = 1,                    /* error  */
+  YYSYMBOL_YYUNDEF = 2,                    /* "invalid token"  */
+  YYSYMBOL_CONST = 3,                      /* CONST  */
+  YYSYMBOL_BOOL = 4,                       /* BOOL  */
+  YYSYMBOL_INT = 5,                        /* INT  */
+  YYSYMBOL_UINT = 6,                       /* UINT  */
+  YYSYMBOL_FLOAT = 7,                      /* FLOAT  */
+  YYSYMBOL_BVEC2 = 8,                      /* BVEC2  */
+  YYSYMBOL_BVEC3 = 9,                      /* BVEC3  */
+  YYSYMBOL_BVEC4 = 10,                     /* BVEC4  */
+  YYSYMBOL_IVEC2 = 11,                     /* IVEC2  */
+  YYSYMBOL_IVEC3 = 12,                     /* IVEC3  */
+  YYSYMBOL_IVEC4 = 13,                     /* IVEC4  */
+  YYSYMBOL_UVEC2 = 14,                     /* UVEC2  */
+  YYSYMBOL_UVEC3 = 15,                     /* UVEC3  */
+  YYSYMBOL_UVEC4 = 16,                     /* UVEC4  */
+  YYSYMBOL_VEC2 = 17,                      /* VEC2  */
+  YYSYMBOL_VEC3 = 18,                      /* VEC3  */
+  YYSYMBOL_VEC4 = 19,                      /* VEC4  */
+  YYSYMBOL_MAT2 = 20,                      /* MAT2  */
+  YYSYMBOL_MAT3 = 21,                      /* MAT3  */
+  YYSYMBOL_MAT4 = 22,                      /* MAT4  */
+  YYSYMBOL_MAT2X2 = 23,                    /* MAT2X2  */
+  YYSYMBOL_MAT2X3 = 24,                    /* MAT2X3  */
+  YYSYMBOL_MAT2X4 = 25,                    /* MAT2X4  */
+  YYSYMBOL_MAT3X2 = 26,                    /* MAT3X2  */
+  YYSYMBOL_MAT3X3 = 27,                    /* MAT3X3  */
+  YYSYMBOL_MAT3X4 = 28,                    /* MAT3X4  */
+  YYSYMBOL_MAT4X2 = 29,                    /* MAT4X2  */
+  YYSYMBOL_MAT4X3 = 30,                    /* MAT4X3  */
+  YYSYMBOL_MAT4X4 = 31,                    /* MAT4X4  */
+  YYSYMBOL_SAMPLER2D = 32,                 /* SAMPLER2D  */
+  YYSYMBOL_SAMPLER3D = 33,                 /* SAMPLER3D  */
+  YYSYMBOL_SAMPLERCUBE = 34,               /* SAMPLERCUBE  */
+  YYSYMBOL_SAMPLER2DSHADOW = 35,           /* SAMPLER2DSHADOW  */
+  YYSYMBOL_SAMPLERCUBESHADOW = 36,         /* SAMPLERCUBESHADOW  */
+  YYSYMBOL_SAMPLER2DARRAY = 37,            /* SAMPLER2DARRAY  */
+  YYSYMBOL_SAMPLER2DARRAYSHADOW = 38,      /* SAMPLER2DARRAYSHADOW  */
+  YYSYMBOL_ISAMPLER2D = 39,                /* ISAMPLER2D  */
+  YYSYMBOL_ISAMPLER3D = 40,                /* ISAMPLER3D  */
+  YYSYMBOL_ISAMPLERCUBE = 41,              /* ISAMPLERCUBE  */
+  YYSYMBOL_ISAMPLER2DARRAY = 42,           /* ISAMPLER2DARRAY  */
+  YYSYMBOL_USAMPLER2D = 43,                /* USAMPLER2D  */
+  YYSYMBOL_USAMPLER3D = 44,                /* USAMPLER3D  */
+  YYSYMBOL_USAMPLERCUBE = 45,              /* USAMPLERCUBE  */
+  YYSYMBOL_USAMPLER2DARRAY = 46,           /* USAMPLER2DARRAY  */
+  YYSYMBOL_SAMPLER = 47,                   /* SAMPLER  */
+  YYSYMBOL_SAMPLERSHADOW = 48,             /* SAMPLERSHADOW  */
+  YYSYMBOL_TEXTURE2D = 49,                 /* TEXTURE2D  */
+  YYSYMBOL_TEXTURE3D = 50,                 /* TEXTURE3D  */
+  YYSYMBOL_TEXTURECUBE = 51,               /* TEXTURECUBE  */
+  YYSYMBOL_TEXTURE2DARRAY = 52,            /* TEXTURE2DARRAY  */
+  YYSYMBOL_ITEXTURE2D = 53,                /* ITEXTURE2D  */
+  YYSYMBOL_ITEXTURE3D = 54,                /* ITEXTURE3D  */
+  YYSYMBOL_ITEXTURECUBE = 55,              /* ITEXTURECUBE  */
+  YYSYMBOL_ITEXTURE2DARRAY = 56,           /* ITEXTURE2DARRAY  */
+  YYSYMBOL_UTEXTURE2D = 57,                /* UTEXTURE2D  */
+  YYSYMBOL_UTEXTURE3D = 58,                /* UTEXTURE3D  */
+  YYSYMBOL_UTEXTURECUBE = 59,              /* UTEXTURECUBE  */
+  YYSYMBOL_UTEXTURE2DARRAY = 60,           /* UTEXTURE2DARRAY  */
+  YYSYMBOL_ATTRIBUTE = 61,                 /* ATTRIBUTE  */
+  YYSYMBOL_VARYING = 62,                   /* VARYING  */
+  YYSYMBOL_FLOAT16_T = 63,                 /* FLOAT16_T  */
+  YYSYMBOL_FLOAT32_T = 64,                 /* FLOAT32_T  */
+  YYSYMBOL_DOUBLE = 65,                    /* DOUBLE  */
+  YYSYMBOL_FLOAT64_T = 66,                 /* FLOAT64_T  */
+  YYSYMBOL_INT64_T = 67,                   /* INT64_T  */
+  YYSYMBOL_UINT64_T = 68,                  /* UINT64_T  */
+  YYSYMBOL_INT32_T = 69,                   /* INT32_T  */
+  YYSYMBOL_UINT32_T = 70,                  /* UINT32_T  */
+  YYSYMBOL_INT16_T = 71,                   /* INT16_T  */
+  YYSYMBOL_UINT16_T = 72,                  /* UINT16_T  */
+  YYSYMBOL_INT8_T = 73,                    /* INT8_T  */
+  YYSYMBOL_UINT8_T = 74,                   /* UINT8_T  */
+  YYSYMBOL_I64VEC2 = 75,                   /* I64VEC2  */
+  YYSYMBOL_I64VEC3 = 76,                   /* I64VEC3  */
+  YYSYMBOL_I64VEC4 = 77,                   /* I64VEC4  */
+  YYSYMBOL_U64VEC2 = 78,                   /* U64VEC2  */
+  YYSYMBOL_U64VEC3 = 79,                   /* U64VEC3  */
+  YYSYMBOL_U64VEC4 = 80,                   /* U64VEC4  */
+  YYSYMBOL_I32VEC2 = 81,                   /* I32VEC2  */
+  YYSYMBOL_I32VEC3 = 82,                   /* I32VEC3  */
+  YYSYMBOL_I32VEC4 = 83,                   /* I32VEC4  */
+  YYSYMBOL_U32VEC2 = 84,                   /* U32VEC2  */
+  YYSYMBOL_U32VEC3 = 85,                   /* U32VEC3  */
+  YYSYMBOL_U32VEC4 = 86,                   /* U32VEC4  */
+  YYSYMBOL_I16VEC2 = 87,                   /* I16VEC2  */
+  YYSYMBOL_I16VEC3 = 88,                   /* I16VEC3  */
+  YYSYMBOL_I16VEC4 = 89,                   /* I16VEC4  */
+  YYSYMBOL_U16VEC2 = 90,                   /* U16VEC2  */
+  YYSYMBOL_U16VEC3 = 91,                   /* U16VEC3  */
+  YYSYMBOL_U16VEC4 = 92,                   /* U16VEC4  */
+  YYSYMBOL_I8VEC2 = 93,                    /* I8VEC2  */
+  YYSYMBOL_I8VEC3 = 94,                    /* I8VEC3  */
+  YYSYMBOL_I8VEC4 = 95,                    /* I8VEC4  */
+  YYSYMBOL_U8VEC2 = 96,                    /* U8VEC2  */
+  YYSYMBOL_U8VEC3 = 97,                    /* U8VEC3  */
+  YYSYMBOL_U8VEC4 = 98,                    /* U8VEC4  */
+  YYSYMBOL_DVEC2 = 99,                     /* DVEC2  */
+  YYSYMBOL_DVEC3 = 100,                    /* DVEC3  */
+  YYSYMBOL_DVEC4 = 101,                    /* DVEC4  */
+  YYSYMBOL_DMAT2 = 102,                    /* DMAT2  */
+  YYSYMBOL_DMAT3 = 103,                    /* DMAT3  */
+  YYSYMBOL_DMAT4 = 104,                    /* DMAT4  */
+  YYSYMBOL_F16VEC2 = 105,                  /* F16VEC2  */
+  YYSYMBOL_F16VEC3 = 106,                  /* F16VEC3  */
+  YYSYMBOL_F16VEC4 = 107,                  /* F16VEC4  */
+  YYSYMBOL_F16MAT2 = 108,                  /* F16MAT2  */
+  YYSYMBOL_F16MAT3 = 109,                  /* F16MAT3  */
+  YYSYMBOL_F16MAT4 = 110,                  /* F16MAT4  */
+  YYSYMBOL_F32VEC2 = 111,                  /* F32VEC2  */
+  YYSYMBOL_F32VEC3 = 112,                  /* F32VEC3  */
+  YYSYMBOL_F32VEC4 = 113,                  /* F32VEC4  */
+  YYSYMBOL_F32MAT2 = 114,                  /* F32MAT2  */
+  YYSYMBOL_F32MAT3 = 115,                  /* F32MAT3  */
+  YYSYMBOL_F32MAT4 = 116,                  /* F32MAT4  */
+  YYSYMBOL_F64VEC2 = 117,                  /* F64VEC2  */
+  YYSYMBOL_F64VEC3 = 118,                  /* F64VEC3  */
+  YYSYMBOL_F64VEC4 = 119,                  /* F64VEC4  */
+  YYSYMBOL_F64MAT2 = 120,                  /* F64MAT2  */
+  YYSYMBOL_F64MAT3 = 121,                  /* F64MAT3  */
+  YYSYMBOL_F64MAT4 = 122,                  /* F64MAT4  */
+  YYSYMBOL_DMAT2X2 = 123,                  /* DMAT2X2  */
+  YYSYMBOL_DMAT2X3 = 124,                  /* DMAT2X3  */
+  YYSYMBOL_DMAT2X4 = 125,                  /* DMAT2X4  */
+  YYSYMBOL_DMAT3X2 = 126,                  /* DMAT3X2  */
+  YYSYMBOL_DMAT3X3 = 127,                  /* DMAT3X3  */
+  YYSYMBOL_DMAT3X4 = 128,                  /* DMAT3X4  */
+  YYSYMBOL_DMAT4X2 = 129,                  /* DMAT4X2  */
+  YYSYMBOL_DMAT4X3 = 130,                  /* DMAT4X3  */
+  YYSYMBOL_DMAT4X4 = 131,                  /* DMAT4X4  */
+  YYSYMBOL_F16MAT2X2 = 132,                /* F16MAT2X2  */
+  YYSYMBOL_F16MAT2X3 = 133,                /* F16MAT2X3  */
+  YYSYMBOL_F16MAT2X4 = 134,                /* F16MAT2X4  */
+  YYSYMBOL_F16MAT3X2 = 135,                /* F16MAT3X2  */
+  YYSYMBOL_F16MAT3X3 = 136,                /* F16MAT3X3  */
+  YYSYMBOL_F16MAT3X4 = 137,                /* F16MAT3X4  */
+  YYSYMBOL_F16MAT4X2 = 138,                /* F16MAT4X2  */
+  YYSYMBOL_F16MAT4X3 = 139,                /* F16MAT4X3  */
+  YYSYMBOL_F16MAT4X4 = 140,                /* F16MAT4X4  */
+  YYSYMBOL_F32MAT2X2 = 141,                /* F32MAT2X2  */
+  YYSYMBOL_F32MAT2X3 = 142,                /* F32MAT2X3  */
+  YYSYMBOL_F32MAT2X4 = 143,                /* F32MAT2X4  */
+  YYSYMBOL_F32MAT3X2 = 144,                /* F32MAT3X2  */
+  YYSYMBOL_F32MAT3X3 = 145,                /* F32MAT3X3  */
+  YYSYMBOL_F32MAT3X4 = 146,                /* F32MAT3X4  */
+  YYSYMBOL_F32MAT4X2 = 147,                /* F32MAT4X2  */
+  YYSYMBOL_F32MAT4X3 = 148,                /* F32MAT4X3  */
+  YYSYMBOL_F32MAT4X4 = 149,                /* F32MAT4X4  */
+  YYSYMBOL_F64MAT2X2 = 150,                /* F64MAT2X2  */
+  YYSYMBOL_F64MAT2X3 = 151,                /* F64MAT2X3  */
+  YYSYMBOL_F64MAT2X4 = 152,                /* F64MAT2X4  */
+  YYSYMBOL_F64MAT3X2 = 153,                /* F64MAT3X2  */
+  YYSYMBOL_F64MAT3X3 = 154,                /* F64MAT3X3  */
+  YYSYMBOL_F64MAT3X4 = 155,                /* F64MAT3X4  */
+  YYSYMBOL_F64MAT4X2 = 156,                /* F64MAT4X2  */
+  YYSYMBOL_F64MAT4X3 = 157,                /* F64MAT4X3  */
+  YYSYMBOL_F64MAT4X4 = 158,                /* F64MAT4X4  */
+  YYSYMBOL_ATOMIC_UINT = 159,              /* ATOMIC_UINT  */
+  YYSYMBOL_ACCSTRUCTNV = 160,              /* ACCSTRUCTNV  */
+  YYSYMBOL_ACCSTRUCTEXT = 161,             /* ACCSTRUCTEXT  */
+  YYSYMBOL_RAYQUERYEXT = 162,              /* RAYQUERYEXT  */
+  YYSYMBOL_FCOOPMATNV = 163,               /* FCOOPMATNV  */
+  YYSYMBOL_ICOOPMATNV = 164,               /* ICOOPMATNV  */
+  YYSYMBOL_UCOOPMATNV = 165,               /* UCOOPMATNV  */
+  YYSYMBOL_SAMPLERCUBEARRAY = 166,         /* SAMPLERCUBEARRAY  */
+  YYSYMBOL_SAMPLERCUBEARRAYSHADOW = 167,   /* SAMPLERCUBEARRAYSHADOW  */
+  YYSYMBOL_ISAMPLERCUBEARRAY = 168,        /* ISAMPLERCUBEARRAY  */
+  YYSYMBOL_USAMPLERCUBEARRAY = 169,        /* USAMPLERCUBEARRAY  */
+  YYSYMBOL_SAMPLER1D = 170,                /* SAMPLER1D  */
+  YYSYMBOL_SAMPLER1DARRAY = 171,           /* SAMPLER1DARRAY  */
+  YYSYMBOL_SAMPLER1DARRAYSHADOW = 172,     /* SAMPLER1DARRAYSHADOW  */
+  YYSYMBOL_ISAMPLER1D = 173,               /* ISAMPLER1D  */
+  YYSYMBOL_SAMPLER1DSHADOW = 174,          /* SAMPLER1DSHADOW  */
+  YYSYMBOL_SAMPLER2DRECT = 175,            /* SAMPLER2DRECT  */
+  YYSYMBOL_SAMPLER2DRECTSHADOW = 176,      /* SAMPLER2DRECTSHADOW  */
+  YYSYMBOL_ISAMPLER2DRECT = 177,           /* ISAMPLER2DRECT  */
+  YYSYMBOL_USAMPLER2DRECT = 178,           /* USAMPLER2DRECT  */
+  YYSYMBOL_SAMPLERBUFFER = 179,            /* SAMPLERBUFFER  */
+  YYSYMBOL_ISAMPLERBUFFER = 180,           /* ISAMPLERBUFFER  */
+  YYSYMBOL_USAMPLERBUFFER = 181,           /* USAMPLERBUFFER  */
+  YYSYMBOL_SAMPLER2DMS = 182,              /* SAMPLER2DMS  */
+  YYSYMBOL_ISAMPLER2DMS = 183,             /* ISAMPLER2DMS  */
+  YYSYMBOL_USAMPLER2DMS = 184,             /* USAMPLER2DMS  */
+  YYSYMBOL_SAMPLER2DMSARRAY = 185,         /* SAMPLER2DMSARRAY  */
+  YYSYMBOL_ISAMPLER2DMSARRAY = 186,        /* ISAMPLER2DMSARRAY  */
+  YYSYMBOL_USAMPLER2DMSARRAY = 187,        /* USAMPLER2DMSARRAY  */
+  YYSYMBOL_SAMPLEREXTERNALOES = 188,       /* SAMPLEREXTERNALOES  */
+  YYSYMBOL_SAMPLEREXTERNAL2DY2YEXT = 189,  /* SAMPLEREXTERNAL2DY2YEXT  */
+  YYSYMBOL_ISAMPLER1DARRAY = 190,          /* ISAMPLER1DARRAY  */
+  YYSYMBOL_USAMPLER1D = 191,               /* USAMPLER1D  */
+  YYSYMBOL_USAMPLER1DARRAY = 192,          /* USAMPLER1DARRAY  */
+  YYSYMBOL_F16SAMPLER1D = 193,             /* F16SAMPLER1D  */
+  YYSYMBOL_F16SAMPLER2D = 194,             /* F16SAMPLER2D  */
+  YYSYMBOL_F16SAMPLER3D = 195,             /* F16SAMPLER3D  */
+  YYSYMBOL_F16SAMPLER2DRECT = 196,         /* F16SAMPLER2DRECT  */
+  YYSYMBOL_F16SAMPLERCUBE = 197,           /* F16SAMPLERCUBE  */
+  YYSYMBOL_F16SAMPLER1DARRAY = 198,        /* F16SAMPLER1DARRAY  */
+  YYSYMBOL_F16SAMPLER2DARRAY = 199,        /* F16SAMPLER2DARRAY  */
+  YYSYMBOL_F16SAMPLERCUBEARRAY = 200,      /* F16SAMPLERCUBEARRAY  */
+  YYSYMBOL_F16SAMPLERBUFFER = 201,         /* F16SAMPLERBUFFER  */
+  YYSYMBOL_F16SAMPLER2DMS = 202,           /* F16SAMPLER2DMS  */
+  YYSYMBOL_F16SAMPLER2DMSARRAY = 203,      /* F16SAMPLER2DMSARRAY  */
+  YYSYMBOL_F16SAMPLER1DSHADOW = 204,       /* F16SAMPLER1DSHADOW  */
+  YYSYMBOL_F16SAMPLER2DSHADOW = 205,       /* F16SAMPLER2DSHADOW  */
+  YYSYMBOL_F16SAMPLER1DARRAYSHADOW = 206,  /* F16SAMPLER1DARRAYSHADOW  */
+  YYSYMBOL_F16SAMPLER2DARRAYSHADOW = 207,  /* F16SAMPLER2DARRAYSHADOW  */
+  YYSYMBOL_F16SAMPLER2DRECTSHADOW = 208,   /* F16SAMPLER2DRECTSHADOW  */
+  YYSYMBOL_F16SAMPLERCUBESHADOW = 209,     /* F16SAMPLERCUBESHADOW  */
+  YYSYMBOL_F16SAMPLERCUBEARRAYSHADOW = 210, /* F16SAMPLERCUBEARRAYSHADOW  */
+  YYSYMBOL_IMAGE1D = 211,                  /* IMAGE1D  */
+  YYSYMBOL_IIMAGE1D = 212,                 /* IIMAGE1D  */
+  YYSYMBOL_UIMAGE1D = 213,                 /* UIMAGE1D  */
+  YYSYMBOL_IMAGE2D = 214,                  /* IMAGE2D  */
+  YYSYMBOL_IIMAGE2D = 215,                 /* IIMAGE2D  */
+  YYSYMBOL_UIMAGE2D = 216,                 /* UIMAGE2D  */
+  YYSYMBOL_IMAGE3D = 217,                  /* IMAGE3D  */
+  YYSYMBOL_IIMAGE3D = 218,                 /* IIMAGE3D  */
+  YYSYMBOL_UIMAGE3D = 219,                 /* UIMAGE3D  */
+  YYSYMBOL_IMAGE2DRECT = 220,              /* IMAGE2DRECT  */
+  YYSYMBOL_IIMAGE2DRECT = 221,             /* IIMAGE2DRECT  */
+  YYSYMBOL_UIMAGE2DRECT = 222,             /* UIMAGE2DRECT  */
+  YYSYMBOL_IMAGECUBE = 223,                /* IMAGECUBE  */
+  YYSYMBOL_IIMAGECUBE = 224,               /* IIMAGECUBE  */
+  YYSYMBOL_UIMAGECUBE = 225,               /* UIMAGECUBE  */
+  YYSYMBOL_IMAGEBUFFER = 226,              /* IMAGEBUFFER  */
+  YYSYMBOL_IIMAGEBUFFER = 227,             /* IIMAGEBUFFER  */
+  YYSYMBOL_UIMAGEBUFFER = 228,             /* UIMAGEBUFFER  */
+  YYSYMBOL_IMAGE1DARRAY = 229,             /* IMAGE1DARRAY  */
+  YYSYMBOL_IIMAGE1DARRAY = 230,            /* IIMAGE1DARRAY  */
+  YYSYMBOL_UIMAGE1DARRAY = 231,            /* UIMAGE1DARRAY  */
+  YYSYMBOL_IMAGE2DARRAY = 232,             /* IMAGE2DARRAY  */
+  YYSYMBOL_IIMAGE2DARRAY = 233,            /* IIMAGE2DARRAY  */
+  YYSYMBOL_UIMAGE2DARRAY = 234,            /* UIMAGE2DARRAY  */
+  YYSYMBOL_IMAGECUBEARRAY = 235,           /* IMAGECUBEARRAY  */
+  YYSYMBOL_IIMAGECUBEARRAY = 236,          /* IIMAGECUBEARRAY  */
+  YYSYMBOL_UIMAGECUBEARRAY = 237,          /* UIMAGECUBEARRAY  */
+  YYSYMBOL_IMAGE2DMS = 238,                /* IMAGE2DMS  */
+  YYSYMBOL_IIMAGE2DMS = 239,               /* IIMAGE2DMS  */
+  YYSYMBOL_UIMAGE2DMS = 240,               /* UIMAGE2DMS  */
+  YYSYMBOL_IMAGE2DMSARRAY = 241,           /* IMAGE2DMSARRAY  */
+  YYSYMBOL_IIMAGE2DMSARRAY = 242,          /* IIMAGE2DMSARRAY  */
+  YYSYMBOL_UIMAGE2DMSARRAY = 243,          /* UIMAGE2DMSARRAY  */
+  YYSYMBOL_F16IMAGE1D = 244,               /* F16IMAGE1D  */
+  YYSYMBOL_F16IMAGE2D = 245,               /* F16IMAGE2D  */
+  YYSYMBOL_F16IMAGE3D = 246,               /* F16IMAGE3D  */
+  YYSYMBOL_F16IMAGE2DRECT = 247,           /* F16IMAGE2DRECT  */
+  YYSYMBOL_F16IMAGECUBE = 248,             /* F16IMAGECUBE  */
+  YYSYMBOL_F16IMAGE1DARRAY = 249,          /* F16IMAGE1DARRAY  */
+  YYSYMBOL_F16IMAGE2DARRAY = 250,          /* F16IMAGE2DARRAY  */
+  YYSYMBOL_F16IMAGECUBEARRAY = 251,        /* F16IMAGECUBEARRAY  */
+  YYSYMBOL_F16IMAGEBUFFER = 252,           /* F16IMAGEBUFFER  */
+  YYSYMBOL_F16IMAGE2DMS = 253,             /* F16IMAGE2DMS  */
+  YYSYMBOL_F16IMAGE2DMSARRAY = 254,        /* F16IMAGE2DMSARRAY  */
+  YYSYMBOL_I64IMAGE1D = 255,               /* I64IMAGE1D  */
+  YYSYMBOL_U64IMAGE1D = 256,               /* U64IMAGE1D  */
+  YYSYMBOL_I64IMAGE2D = 257,               /* I64IMAGE2D  */
+  YYSYMBOL_U64IMAGE2D = 258,               /* U64IMAGE2D  */
+  YYSYMBOL_I64IMAGE3D = 259,               /* I64IMAGE3D  */
+  YYSYMBOL_U64IMAGE3D = 260,               /* U64IMAGE3D  */
+  YYSYMBOL_I64IMAGE2DRECT = 261,           /* I64IMAGE2DRECT  */
+  YYSYMBOL_U64IMAGE2DRECT = 262,           /* U64IMAGE2DRECT  */
+  YYSYMBOL_I64IMAGECUBE = 263,             /* I64IMAGECUBE  */
+  YYSYMBOL_U64IMAGECUBE = 264,             /* U64IMAGECUBE  */
+  YYSYMBOL_I64IMAGEBUFFER = 265,           /* I64IMAGEBUFFER  */
+  YYSYMBOL_U64IMAGEBUFFER = 266,           /* U64IMAGEBUFFER  */
+  YYSYMBOL_I64IMAGE1DARRAY = 267,          /* I64IMAGE1DARRAY  */
+  YYSYMBOL_U64IMAGE1DARRAY = 268,          /* U64IMAGE1DARRAY  */
+  YYSYMBOL_I64IMAGE2DARRAY = 269,          /* I64IMAGE2DARRAY  */
+  YYSYMBOL_U64IMAGE2DARRAY = 270,          /* U64IMAGE2DARRAY  */
+  YYSYMBOL_I64IMAGECUBEARRAY = 271,        /* I64IMAGECUBEARRAY  */
+  YYSYMBOL_U64IMAGECUBEARRAY = 272,        /* U64IMAGECUBEARRAY  */
+  YYSYMBOL_I64IMAGE2DMS = 273,             /* I64IMAGE2DMS  */
+  YYSYMBOL_U64IMAGE2DMS = 274,             /* U64IMAGE2DMS  */
+  YYSYMBOL_I64IMAGE2DMSARRAY = 275,        /* I64IMAGE2DMSARRAY  */
+  YYSYMBOL_U64IMAGE2DMSARRAY = 276,        /* U64IMAGE2DMSARRAY  */
+  YYSYMBOL_TEXTURECUBEARRAY = 277,         /* TEXTURECUBEARRAY  */
+  YYSYMBOL_ITEXTURECUBEARRAY = 278,        /* ITEXTURECUBEARRAY  */
+  YYSYMBOL_UTEXTURECUBEARRAY = 279,        /* UTEXTURECUBEARRAY  */
+  YYSYMBOL_TEXTURE1D = 280,                /* TEXTURE1D  */
+  YYSYMBOL_ITEXTURE1D = 281,               /* ITEXTURE1D  */
+  YYSYMBOL_UTEXTURE1D = 282,               /* UTEXTURE1D  */
+  YYSYMBOL_TEXTURE1DARRAY = 283,           /* TEXTURE1DARRAY  */
+  YYSYMBOL_ITEXTURE1DARRAY = 284,          /* ITEXTURE1DARRAY  */
+  YYSYMBOL_UTEXTURE1DARRAY = 285,          /* UTEXTURE1DARRAY  */
+  YYSYMBOL_TEXTURE2DRECT = 286,            /* TEXTURE2DRECT  */
+  YYSYMBOL_ITEXTURE2DRECT = 287,           /* ITEXTURE2DRECT  */
+  YYSYMBOL_UTEXTURE2DRECT = 288,           /* UTEXTURE2DRECT  */
+  YYSYMBOL_TEXTUREBUFFER = 289,            /* TEXTUREBUFFER  */
+  YYSYMBOL_ITEXTUREBUFFER = 290,           /* ITEXTUREBUFFER  */
+  YYSYMBOL_UTEXTUREBUFFER = 291,           /* UTEXTUREBUFFER  */
+  YYSYMBOL_TEXTURE2DMS = 292,              /* TEXTURE2DMS  */
+  YYSYMBOL_ITEXTURE2DMS = 293,             /* ITEXTURE2DMS  */
+  YYSYMBOL_UTEXTURE2DMS = 294,             /* UTEXTURE2DMS  */
+  YYSYMBOL_TEXTURE2DMSARRAY = 295,         /* TEXTURE2DMSARRAY  */
+  YYSYMBOL_ITEXTURE2DMSARRAY = 296,        /* ITEXTURE2DMSARRAY  */
+  YYSYMBOL_UTEXTURE2DMSARRAY = 297,        /* UTEXTURE2DMSARRAY  */
+  YYSYMBOL_F16TEXTURE1D = 298,             /* F16TEXTURE1D  */
+  YYSYMBOL_F16TEXTURE2D = 299,             /* F16TEXTURE2D  */
+  YYSYMBOL_F16TEXTURE3D = 300,             /* F16TEXTURE3D  */
+  YYSYMBOL_F16TEXTURE2DRECT = 301,         /* F16TEXTURE2DRECT  */
+  YYSYMBOL_F16TEXTURECUBE = 302,           /* F16TEXTURECUBE  */
+  YYSYMBOL_F16TEXTURE1DARRAY = 303,        /* F16TEXTURE1DARRAY  */
+  YYSYMBOL_F16TEXTURE2DARRAY = 304,        /* F16TEXTURE2DARRAY  */
+  YYSYMBOL_F16TEXTURECUBEARRAY = 305,      /* F16TEXTURECUBEARRAY  */
+  YYSYMBOL_F16TEXTUREBUFFER = 306,         /* F16TEXTUREBUFFER  */
+  YYSYMBOL_F16TEXTURE2DMS = 307,           /* F16TEXTURE2DMS  */
+  YYSYMBOL_F16TEXTURE2DMSARRAY = 308,      /* F16TEXTURE2DMSARRAY  */
+  YYSYMBOL_SUBPASSINPUT = 309,             /* SUBPASSINPUT  */
+  YYSYMBOL_SUBPASSINPUTMS = 310,           /* SUBPASSINPUTMS  */
+  YYSYMBOL_ISUBPASSINPUT = 311,            /* ISUBPASSINPUT  */
+  YYSYMBOL_ISUBPASSINPUTMS = 312,          /* ISUBPASSINPUTMS  */
+  YYSYMBOL_USUBPASSINPUT = 313,            /* USUBPASSINPUT  */
+  YYSYMBOL_USUBPASSINPUTMS = 314,          /* USUBPASSINPUTMS  */
+  YYSYMBOL_F16SUBPASSINPUT = 315,          /* F16SUBPASSINPUT  */
+  YYSYMBOL_F16SUBPASSINPUTMS = 316,        /* F16SUBPASSINPUTMS  */
+  YYSYMBOL_LEFT_OP = 317,                  /* LEFT_OP  */
+  YYSYMBOL_RIGHT_OP = 318,                 /* RIGHT_OP  */
+  YYSYMBOL_INC_OP = 319,                   /* INC_OP  */
+  YYSYMBOL_DEC_OP = 320,                   /* DEC_OP  */
+  YYSYMBOL_LE_OP = 321,                    /* LE_OP  */
+  YYSYMBOL_GE_OP = 322,                    /* GE_OP  */
+  YYSYMBOL_EQ_OP = 323,                    /* EQ_OP  */
+  YYSYMBOL_NE_OP = 324,                    /* NE_OP  */
+  YYSYMBOL_AND_OP = 325,                   /* AND_OP  */
+  YYSYMBOL_OR_OP = 326,                    /* OR_OP  */
+  YYSYMBOL_XOR_OP = 327,                   /* XOR_OP  */
+  YYSYMBOL_MUL_ASSIGN = 328,               /* MUL_ASSIGN  */
+  YYSYMBOL_DIV_ASSIGN = 329,               /* DIV_ASSIGN  */
+  YYSYMBOL_ADD_ASSIGN = 330,               /* ADD_ASSIGN  */
+  YYSYMBOL_MOD_ASSIGN = 331,               /* MOD_ASSIGN  */
+  YYSYMBOL_LEFT_ASSIGN = 332,              /* LEFT_ASSIGN  */
+  YYSYMBOL_RIGHT_ASSIGN = 333,             /* RIGHT_ASSIGN  */
+  YYSYMBOL_AND_ASSIGN = 334,               /* AND_ASSIGN  */
+  YYSYMBOL_XOR_ASSIGN = 335,               /* XOR_ASSIGN  */
+  YYSYMBOL_OR_ASSIGN = 336,                /* OR_ASSIGN  */
+  YYSYMBOL_SUB_ASSIGN = 337,               /* SUB_ASSIGN  */
+  YYSYMBOL_STRING_LITERAL = 338,           /* STRING_LITERAL  */
+  YYSYMBOL_LEFT_PAREN = 339,               /* LEFT_PAREN  */
+  YYSYMBOL_RIGHT_PAREN = 340,              /* RIGHT_PAREN  */
+  YYSYMBOL_LEFT_BRACKET = 341,             /* LEFT_BRACKET  */
+  YYSYMBOL_RIGHT_BRACKET = 342,            /* RIGHT_BRACKET  */
+  YYSYMBOL_LEFT_BRACE = 343,               /* LEFT_BRACE  */
+  YYSYMBOL_RIGHT_BRACE = 344,              /* RIGHT_BRACE  */
+  YYSYMBOL_DOT = 345,                      /* DOT  */
+  YYSYMBOL_COMMA = 346,                    /* COMMA  */
+  YYSYMBOL_COLON = 347,                    /* COLON  */
+  YYSYMBOL_EQUAL = 348,                    /* EQUAL  */
+  YYSYMBOL_SEMICOLON = 349,                /* SEMICOLON  */
+  YYSYMBOL_BANG = 350,                     /* BANG  */
+  YYSYMBOL_DASH = 351,                     /* DASH  */
+  YYSYMBOL_TILDE = 352,                    /* TILDE  */
+  YYSYMBOL_PLUS = 353,                     /* PLUS  */
+  YYSYMBOL_STAR = 354,                     /* STAR  */
+  YYSYMBOL_SLASH = 355,                    /* SLASH  */
+  YYSYMBOL_PERCENT = 356,                  /* PERCENT  */
+  YYSYMBOL_LEFT_ANGLE = 357,               /* LEFT_ANGLE  */
+  YYSYMBOL_RIGHT_ANGLE = 358,              /* RIGHT_ANGLE  */
+  YYSYMBOL_VERTICAL_BAR = 359,             /* VERTICAL_BAR  */
+  YYSYMBOL_CARET = 360,                    /* CARET  */
+  YYSYMBOL_AMPERSAND = 361,                /* AMPERSAND  */
+  YYSYMBOL_QUESTION = 362,                 /* QUESTION  */
+  YYSYMBOL_INVARIANT = 363,                /* INVARIANT  */
+  YYSYMBOL_HIGH_PRECISION = 364,           /* HIGH_PRECISION  */
+  YYSYMBOL_MEDIUM_PRECISION = 365,         /* MEDIUM_PRECISION  */
+  YYSYMBOL_LOW_PRECISION = 366,            /* LOW_PRECISION  */
+  YYSYMBOL_PRECISION = 367,                /* PRECISION  */
+  YYSYMBOL_PACKED = 368,                   /* PACKED  */
+  YYSYMBOL_RESOURCE = 369,                 /* RESOURCE  */
+  YYSYMBOL_SUPERP = 370,                   /* SUPERP  */
+  YYSYMBOL_FLOATCONSTANT = 371,            /* FLOATCONSTANT  */
+  YYSYMBOL_INTCONSTANT = 372,              /* INTCONSTANT  */
+  YYSYMBOL_UINTCONSTANT = 373,             /* UINTCONSTANT  */
+  YYSYMBOL_BOOLCONSTANT = 374,             /* BOOLCONSTANT  */
+  YYSYMBOL_IDENTIFIER = 375,               /* IDENTIFIER  */
+  YYSYMBOL_TYPE_NAME = 376,                /* TYPE_NAME  */
+  YYSYMBOL_CENTROID = 377,                 /* CENTROID  */
+  YYSYMBOL_IN = 378,                       /* IN  */
+  YYSYMBOL_OUT = 379,                      /* OUT  */
+  YYSYMBOL_INOUT = 380,                    /* INOUT  */
+  YYSYMBOL_STRUCT = 381,                   /* STRUCT  */
+  YYSYMBOL_VOID = 382,                     /* VOID  */
+  YYSYMBOL_WHILE = 383,                    /* WHILE  */
+  YYSYMBOL_BREAK = 384,                    /* BREAK  */
+  YYSYMBOL_CONTINUE = 385,                 /* CONTINUE  */
+  YYSYMBOL_DO = 386,                       /* DO  */
+  YYSYMBOL_ELSE = 387,                     /* ELSE  */
+  YYSYMBOL_FOR = 388,                      /* FOR  */
+  YYSYMBOL_IF = 389,                       /* IF  */
+  YYSYMBOL_DISCARD = 390,                  /* DISCARD  */
+  YYSYMBOL_RETURN = 391,                   /* RETURN  */
+  YYSYMBOL_SWITCH = 392,                   /* SWITCH  */
+  YYSYMBOL_CASE = 393,                     /* CASE  */
+  YYSYMBOL_DEFAULT = 394,                  /* DEFAULT  */
+  YYSYMBOL_TERMINATE_INVOCATION = 395,     /* TERMINATE_INVOCATION  */
+  YYSYMBOL_TERMINATE_RAY = 396,            /* TERMINATE_RAY  */
+  YYSYMBOL_IGNORE_INTERSECTION = 397,      /* IGNORE_INTERSECTION  */
+  YYSYMBOL_UNIFORM = 398,                  /* UNIFORM  */
+  YYSYMBOL_SHARED = 399,                   /* SHARED  */
+  YYSYMBOL_BUFFER = 400,                   /* BUFFER  */
+  YYSYMBOL_FLAT = 401,                     /* FLAT  */
+  YYSYMBOL_SMOOTH = 402,                   /* SMOOTH  */
+  YYSYMBOL_LAYOUT = 403,                   /* LAYOUT  */
+  YYSYMBOL_DOUBLECONSTANT = 404,           /* DOUBLECONSTANT  */
+  YYSYMBOL_INT16CONSTANT = 405,            /* INT16CONSTANT  */
+  YYSYMBOL_UINT16CONSTANT = 406,           /* UINT16CONSTANT  */
+  YYSYMBOL_FLOAT16CONSTANT = 407,          /* FLOAT16CONSTANT  */
+  YYSYMBOL_INT32CONSTANT = 408,            /* INT32CONSTANT  */
+  YYSYMBOL_UINT32CONSTANT = 409,           /* UINT32CONSTANT  */
+  YYSYMBOL_INT64CONSTANT = 410,            /* INT64CONSTANT  */
+  YYSYMBOL_UINT64CONSTANT = 411,           /* UINT64CONSTANT  */
+  YYSYMBOL_SUBROUTINE = 412,               /* SUBROUTINE  */
+  YYSYMBOL_DEMOTE = 413,                   /* DEMOTE  */
+  YYSYMBOL_PAYLOADNV = 414,                /* PAYLOADNV  */
+  YYSYMBOL_PAYLOADINNV = 415,              /* PAYLOADINNV  */
+  YYSYMBOL_HITATTRNV = 416,                /* HITATTRNV  */
+  YYSYMBOL_CALLDATANV = 417,               /* CALLDATANV  */
+  YYSYMBOL_CALLDATAINNV = 418,             /* CALLDATAINNV  */
+  YYSYMBOL_PAYLOADEXT = 419,               /* PAYLOADEXT  */
+  YYSYMBOL_PAYLOADINEXT = 420,             /* PAYLOADINEXT  */
+  YYSYMBOL_HITATTREXT = 421,               /* HITATTREXT  */
+  YYSYMBOL_CALLDATAEXT = 422,              /* CALLDATAEXT  */
+  YYSYMBOL_CALLDATAINEXT = 423,            /* CALLDATAINEXT  */
+  YYSYMBOL_PATCH = 424,                    /* PATCH  */
+  YYSYMBOL_SAMPLE = 425,                   /* SAMPLE  */
+  YYSYMBOL_NONUNIFORM = 426,               /* NONUNIFORM  */
+  YYSYMBOL_COHERENT = 427,                 /* COHERENT  */
+  YYSYMBOL_VOLATILE = 428,                 /* VOLATILE  */
+  YYSYMBOL_RESTRICT = 429,                 /* RESTRICT  */
+  YYSYMBOL_READONLY = 430,                 /* READONLY  */
+  YYSYMBOL_WRITEONLY = 431,                /* WRITEONLY  */
+  YYSYMBOL_DEVICECOHERENT = 432,           /* DEVICECOHERENT  */
+  YYSYMBOL_QUEUEFAMILYCOHERENT = 433,      /* QUEUEFAMILYCOHERENT  */
+  YYSYMBOL_WORKGROUPCOHERENT = 434,        /* WORKGROUPCOHERENT  */
+  YYSYMBOL_SUBGROUPCOHERENT = 435,         /* SUBGROUPCOHERENT  */
+  YYSYMBOL_NONPRIVATE = 436,               /* NONPRIVATE  */
+  YYSYMBOL_SHADERCALLCOHERENT = 437,       /* SHADERCALLCOHERENT  */
+  YYSYMBOL_NOPERSPECTIVE = 438,            /* NOPERSPECTIVE  */
+  YYSYMBOL_EXPLICITINTERPAMD = 439,        /* EXPLICITINTERPAMD  */
+  YYSYMBOL_PERVERTEXNV = 440,              /* PERVERTEXNV  */
+  YYSYMBOL_PERPRIMITIVENV = 441,           /* PERPRIMITIVENV  */
+  YYSYMBOL_PERVIEWNV = 442,                /* PERVIEWNV  */
+  YYSYMBOL_PERTASKNV = 443,                /* PERTASKNV  */
+  YYSYMBOL_PRECISE = 444,                  /* PRECISE  */
+  YYSYMBOL_YYACCEPT = 445,                 /* $accept  */
+  YYSYMBOL_variable_identifier = 446,      /* variable_identifier  */
+  YYSYMBOL_primary_expression = 447,       /* primary_expression  */
+  YYSYMBOL_postfix_expression = 448,       /* postfix_expression  */
+  YYSYMBOL_integer_expression = 449,       /* integer_expression  */
+  YYSYMBOL_function_call = 450,            /* function_call  */
+  YYSYMBOL_function_call_or_method = 451,  /* function_call_or_method  */
+  YYSYMBOL_function_call_generic = 452,    /* function_call_generic  */
+  YYSYMBOL_function_call_header_no_parameters = 453, /* function_call_header_no_parameters  */
+  YYSYMBOL_function_call_header_with_parameters = 454, /* function_call_header_with_parameters  */
+  YYSYMBOL_function_call_header = 455,     /* function_call_header  */
+  YYSYMBOL_function_identifier = 456,      /* function_identifier  */
+  YYSYMBOL_unary_expression = 457,         /* unary_expression  */
+  YYSYMBOL_unary_operator = 458,           /* unary_operator  */
+  YYSYMBOL_multiplicative_expression = 459, /* multiplicative_expression  */
+  YYSYMBOL_additive_expression = 460,      /* additive_expression  */
+  YYSYMBOL_shift_expression = 461,         /* shift_expression  */
+  YYSYMBOL_relational_expression = 462,    /* relational_expression  */
+  YYSYMBOL_equality_expression = 463,      /* equality_expression  */
+  YYSYMBOL_and_expression = 464,           /* and_expression  */
+  YYSYMBOL_exclusive_or_expression = 465,  /* exclusive_or_expression  */
+  YYSYMBOL_inclusive_or_expression = 466,  /* inclusive_or_expression  */
+  YYSYMBOL_logical_and_expression = 467,   /* logical_and_expression  */
+  YYSYMBOL_logical_xor_expression = 468,   /* logical_xor_expression  */
+  YYSYMBOL_logical_or_expression = 469,    /* logical_or_expression  */
+  YYSYMBOL_conditional_expression = 470,   /* conditional_expression  */
+  YYSYMBOL_471_1 = 471,                    /* $@1  */
+  YYSYMBOL_assignment_expression = 472,    /* assignment_expression  */
+  YYSYMBOL_assignment_operator = 473,      /* assignment_operator  */
+  YYSYMBOL_expression = 474,               /* expression  */
+  YYSYMBOL_constant_expression = 475,      /* constant_expression  */
+  YYSYMBOL_declaration = 476,              /* declaration  */
+  YYSYMBOL_block_structure = 477,          /* block_structure  */
+  YYSYMBOL_478_2 = 478,                    /* $@2  */
+  YYSYMBOL_identifier_list = 479,          /* identifier_list  */
+  YYSYMBOL_function_prototype = 480,       /* function_prototype  */
+  YYSYMBOL_function_declarator = 481,      /* function_declarator  */
+  YYSYMBOL_function_header_with_parameters = 482, /* function_header_with_parameters  */
+  YYSYMBOL_function_header = 483,          /* function_header  */
+  YYSYMBOL_parameter_declarator = 484,     /* parameter_declarator  */
+  YYSYMBOL_parameter_declaration = 485,    /* parameter_declaration  */
+  YYSYMBOL_parameter_type_specifier = 486, /* parameter_type_specifier  */
+  YYSYMBOL_init_declarator_list = 487,     /* init_declarator_list  */
+  YYSYMBOL_single_declaration = 488,       /* single_declaration  */
+  YYSYMBOL_fully_specified_type = 489,     /* fully_specified_type  */
+  YYSYMBOL_invariant_qualifier = 490,      /* invariant_qualifier  */
+  YYSYMBOL_interpolation_qualifier = 491,  /* interpolation_qualifier  */
+  YYSYMBOL_layout_qualifier = 492,         /* layout_qualifier  */
+  YYSYMBOL_layout_qualifier_id_list = 493, /* layout_qualifier_id_list  */
+  YYSYMBOL_layout_qualifier_id = 494,      /* layout_qualifier_id  */
+  YYSYMBOL_precise_qualifier = 495,        /* precise_qualifier  */
+  YYSYMBOL_type_qualifier = 496,           /* type_qualifier  */
+  YYSYMBOL_single_type_qualifier = 497,    /* single_type_qualifier  */
+  YYSYMBOL_storage_qualifier = 498,        /* storage_qualifier  */
+  YYSYMBOL_non_uniform_qualifier = 499,    /* non_uniform_qualifier  */
+  YYSYMBOL_type_name_list = 500,           /* type_name_list  */
+  YYSYMBOL_type_specifier = 501,           /* type_specifier  */
+  YYSYMBOL_array_specifier = 502,          /* array_specifier  */
+  YYSYMBOL_type_parameter_specifier_opt = 503, /* type_parameter_specifier_opt  */
+  YYSYMBOL_type_parameter_specifier = 504, /* type_parameter_specifier  */
+  YYSYMBOL_type_parameter_specifier_list = 505, /* type_parameter_specifier_list  */
+  YYSYMBOL_type_specifier_nonarray = 506,  /* type_specifier_nonarray  */
+  YYSYMBOL_precision_qualifier = 507,      /* precision_qualifier  */
+  YYSYMBOL_struct_specifier = 508,         /* struct_specifier  */
+  YYSYMBOL_509_3 = 509,                    /* $@3  */
+  YYSYMBOL_510_4 = 510,                    /* $@4  */
+  YYSYMBOL_struct_declaration_list = 511,  /* struct_declaration_list  */
+  YYSYMBOL_struct_declaration = 512,       /* struct_declaration  */
+  YYSYMBOL_struct_declarator_list = 513,   /* struct_declarator_list  */
+  YYSYMBOL_struct_declarator = 514,        /* struct_declarator  */
+  YYSYMBOL_initializer = 515,              /* initializer  */
+  YYSYMBOL_initializer_list = 516,         /* initializer_list  */
+  YYSYMBOL_declaration_statement = 517,    /* declaration_statement  */
+  YYSYMBOL_statement = 518,                /* statement  */
+  YYSYMBOL_simple_statement = 519,         /* simple_statement  */
+  YYSYMBOL_demote_statement = 520,         /* demote_statement  */
+  YYSYMBOL_compound_statement = 521,       /* compound_statement  */
+  YYSYMBOL_522_5 = 522,                    /* $@5  */
+  YYSYMBOL_523_6 = 523,                    /* $@6  */
+  YYSYMBOL_statement_no_new_scope = 524,   /* statement_no_new_scope  */
+  YYSYMBOL_statement_scoped = 525,         /* statement_scoped  */
+  YYSYMBOL_526_7 = 526,                    /* $@7  */
+  YYSYMBOL_527_8 = 527,                    /* $@8  */
+  YYSYMBOL_compound_statement_no_new_scope = 528, /* compound_statement_no_new_scope  */
+  YYSYMBOL_statement_list = 529,           /* statement_list  */
+  YYSYMBOL_expression_statement = 530,     /* expression_statement  */
+  YYSYMBOL_selection_statement = 531,      /* selection_statement  */
+  YYSYMBOL_selection_statement_nonattributed = 532, /* selection_statement_nonattributed  */
+  YYSYMBOL_selection_rest_statement = 533, /* selection_rest_statement  */
+  YYSYMBOL_condition = 534,                /* condition  */
+  YYSYMBOL_switch_statement = 535,         /* switch_statement  */
+  YYSYMBOL_switch_statement_nonattributed = 536, /* switch_statement_nonattributed  */
+  YYSYMBOL_537_9 = 537,                    /* $@9  */
+  YYSYMBOL_switch_statement_list = 538,    /* switch_statement_list  */
+  YYSYMBOL_case_label = 539,               /* case_label  */
+  YYSYMBOL_iteration_statement = 540,      /* iteration_statement  */
+  YYSYMBOL_iteration_statement_nonattributed = 541, /* iteration_statement_nonattributed  */
+  YYSYMBOL_542_10 = 542,                   /* $@10  */
+  YYSYMBOL_543_11 = 543,                   /* $@11  */
+  YYSYMBOL_544_12 = 544,                   /* $@12  */
+  YYSYMBOL_for_init_statement = 545,       /* for_init_statement  */
+  YYSYMBOL_conditionopt = 546,             /* conditionopt  */
+  YYSYMBOL_for_rest_statement = 547,       /* for_rest_statement  */
+  YYSYMBOL_jump_statement = 548,           /* jump_statement  */
+  YYSYMBOL_translation_unit = 549,         /* translation_unit  */
+  YYSYMBOL_external_declaration = 550,     /* external_declaration  */
+  YYSYMBOL_function_definition = 551,      /* function_definition  */
+  YYSYMBOL_552_13 = 552,                   /* $@13  */
+  YYSYMBOL_attribute = 553,                /* attribute  */
+  YYSYMBOL_attribute_list = 554,           /* attribute_list  */
+  YYSYMBOL_single_attribute = 555          /* single_attribute  */
 };
-
-typedef union YYSTYPE YYSTYPE;
-# define YYSTYPE_IS_TRIVIAL 1
-# define YYSTYPE_IS_DECLARED 1
-#endif
+typedef enum yysymbol_kind_t yysymbol_kind_t;
 
 
-
-int yyparse (glslang::TParseContext* pParseContext);
-
-#endif /* !YY_YY_MACHINEINDEPENDENT_GLSLANG_TAB_CPP_H_INCLUDED  */
-
-/* Copy the second part of user declarations.  */
-#line 133 "MachineIndependent/glslang.y" /* yacc.c:358  */
+/* Second part of user prologue.  */
+#line 133 "MachineIndependent/glslang.y"
 
 
 /* windows only pragma */
@@ -615,34 +698,82 @@
 extern int yylex(YYSTYPE*, TParseContext&);
 
 
-#line 619 "MachineIndependent/glslang_tab.cpp" /* yacc.c:358  */
+#line 702 "MachineIndependent/glslang_tab.cpp"
+
 
 #ifdef short
 # undef short
 #endif
 
-#ifdef YYTYPE_UINT8
-typedef YYTYPE_UINT8 yytype_uint8;
-#else
-typedef unsigned char yytype_uint8;
+/* On compilers that do not define __PTRDIFF_MAX__ etc., make sure
+   <limits.h> and (if available) <stdint.h> are included
+   so that the code can choose integer types of a good width.  */
+
+#ifndef __PTRDIFF_MAX__
+# include <limits.h> /* INFRINGES ON USER NAME SPACE */
+# if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__
+#  include <stdint.h> /* INFRINGES ON USER NAME SPACE */
+#  define YY_STDINT_H
+# endif
 #endif
 
-#ifdef YYTYPE_INT8
-typedef YYTYPE_INT8 yytype_int8;
+/* Narrow types that promote to a signed type and that can represent a
+   signed or unsigned integer of at least N bits.  In tables they can
+   save space and decrease cache pressure.  Promoting to a signed type
+   helps avoid bugs in integer arithmetic.  */
+
+#ifdef __INT_LEAST8_MAX__
+typedef __INT_LEAST8_TYPE__ yytype_int8;
+#elif defined YY_STDINT_H
+typedef int_least8_t yytype_int8;
 #else
 typedef signed char yytype_int8;
 #endif
 
-#ifdef YYTYPE_UINT16
-typedef YYTYPE_UINT16 yytype_uint16;
+#ifdef __INT_LEAST16_MAX__
+typedef __INT_LEAST16_TYPE__ yytype_int16;
+#elif defined YY_STDINT_H
+typedef int_least16_t yytype_int16;
 #else
-typedef unsigned short int yytype_uint16;
+typedef short yytype_int16;
 #endif
 
-#ifdef YYTYPE_INT16
-typedef YYTYPE_INT16 yytype_int16;
+#if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__
+typedef __UINT_LEAST8_TYPE__ yytype_uint8;
+#elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \
+       && UINT_LEAST8_MAX <= INT_MAX)
+typedef uint_least8_t yytype_uint8;
+#elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX
+typedef unsigned char yytype_uint8;
 #else
-typedef short int yytype_int16;
+typedef short yytype_uint8;
+#endif
+
+#if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__
+typedef __UINT_LEAST16_TYPE__ yytype_uint16;
+#elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \
+       && UINT_LEAST16_MAX <= INT_MAX)
+typedef uint_least16_t yytype_uint16;
+#elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX
+typedef unsigned short yytype_uint16;
+#else
+typedef int yytype_uint16;
+#endif
+
+#ifndef YYPTRDIFF_T
+# if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__
+#  define YYPTRDIFF_T __PTRDIFF_TYPE__
+#  define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__
+# elif defined PTRDIFF_MAX
+#  ifndef ptrdiff_t
+#   include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+#  endif
+#  define YYPTRDIFF_T ptrdiff_t
+#  define YYPTRDIFF_MAXIMUM PTRDIFF_MAX
+# else
+#  define YYPTRDIFF_T long
+#  define YYPTRDIFF_MAXIMUM LONG_MAX
+# endif
 #endif
 
 #ifndef YYSIZE_T
@@ -650,15 +781,28 @@
 #  define YYSIZE_T __SIZE_TYPE__
 # elif defined size_t
 #  define YYSIZE_T size_t
-# elif ! defined YYSIZE_T
+# elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__
 #  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
 #  define YYSIZE_T size_t
 # else
-#  define YYSIZE_T unsigned int
+#  define YYSIZE_T unsigned
 # endif
 #endif
 
-#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
+#define YYSIZE_MAXIMUM                                  \
+  YY_CAST (YYPTRDIFF_T,                                 \
+           (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1)  \
+            ? YYPTRDIFF_MAXIMUM                         \
+            : YY_CAST (YYSIZE_T, -1)))
+
+#define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X))
+
+
+/* Stored state numbers (used for stacks). */
+typedef yytype_int16 yy_state_t;
+
+/* State numbers in computations.  */
+typedef int yy_state_fast_t;
 
 #ifndef YY_
 # if defined YYENABLE_NLS && YYENABLE_NLS
@@ -672,30 +816,20 @@
 # endif
 #endif
 
-#ifndef YY_ATTRIBUTE
-# if (defined __GNUC__                                               \
-      && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__)))  \
-     || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C
-#  define YY_ATTRIBUTE(Spec) __attribute__(Spec)
+
+#ifndef YY_ATTRIBUTE_PURE
+# if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__)
+#  define YY_ATTRIBUTE_PURE __attribute__ ((__pure__))
 # else
-#  define YY_ATTRIBUTE(Spec) /* empty */
+#  define YY_ATTRIBUTE_PURE
 # endif
 #endif
 
-#ifndef YY_ATTRIBUTE_PURE
-# define YY_ATTRIBUTE_PURE   YY_ATTRIBUTE ((__pure__))
-#endif
-
 #ifndef YY_ATTRIBUTE_UNUSED
-# define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__))
-#endif
-
-#if !defined _Noreturn \
-     && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112)
-# if defined _MSC_VER && 1200 <= _MSC_VER
-#  define _Noreturn __declspec (noreturn)
+# if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__)
+#  define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__))
 # else
-#  define _Noreturn YY_ATTRIBUTE ((__noreturn__))
+#  define YY_ATTRIBUTE_UNUSED
 # endif
 #endif
 
@@ -706,13 +840,13 @@
 # define YYUSE(E) /* empty */
 #endif
 
-#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
+#if defined __GNUC__ && ! defined __ICC && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
 /* Suppress an incorrect diagnostic about yylval being uninitialized.  */
-# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
-    _Pragma ("GCC diagnostic push") \
-    _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN                            \
+    _Pragma ("GCC diagnostic push")                                     \
+    _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")              \
     _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
-# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END      \
     _Pragma ("GCC diagnostic pop")
 #else
 # define YY_INITIAL_VALUE(Value) Value
@@ -725,8 +859,22 @@
 # define YY_INITIAL_VALUE(Value) /* Nothing. */
 #endif
 
+#if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__
+# define YY_IGNORE_USELESS_CAST_BEGIN                          \
+    _Pragma ("GCC diagnostic push")                            \
+    _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"")
+# define YY_IGNORE_USELESS_CAST_END            \
+    _Pragma ("GCC diagnostic pop")
+#endif
+#ifndef YY_IGNORE_USELESS_CAST_BEGIN
+# define YY_IGNORE_USELESS_CAST_BEGIN
+# define YY_IGNORE_USELESS_CAST_END
+#endif
 
-#if ! defined yyoverflow || YYERROR_VERBOSE
+
+#define YY_ASSERT(E) ((void) (0 && (E)))
+
+#if 1
 
 /* The parser invokes alloca or malloc; define the necessary symbols.  */
 
@@ -791,8 +939,7 @@
 #   endif
 #  endif
 # endif
-#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
-
+#endif /* 1 */
 
 #if (! defined yyoverflow \
      && (! defined __cplusplus \
@@ -801,17 +948,17 @@
 /* A type that is properly aligned for any stack member.  */
 union yyalloc
 {
-  yytype_int16 yyss_alloc;
+  yy_state_t yyss_alloc;
   YYSTYPE yyvs_alloc;
 };
 
 /* The size of the maximum gap between one aligned stack and the next.  */
-# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
+# define YYSTACK_GAP_MAXIMUM (YYSIZEOF (union yyalloc) - 1)
 
 /* The size of an array large to enough to hold all stacks, each with
    N elements.  */
 # define YYSTACK_BYTES(N) \
-     ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
+     ((N) * (YYSIZEOF (yy_state_t) + YYSIZEOF (YYSTYPE)) \
       + YYSTACK_GAP_MAXIMUM)
 
 # define YYCOPY_NEEDED 1
@@ -824,11 +971,11 @@
 # define YYSTACK_RELOCATE(Stack_alloc, Stack)                           \
     do                                                                  \
       {                                                                 \
-        YYSIZE_T yynewbytes;                                            \
+        YYPTRDIFF_T yynewbytes;                                         \
         YYCOPY (&yyptr->Stack_alloc, Stack, yysize);                    \
         Stack = &yyptr->Stack_alloc;                                    \
-        yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
-        yyptr += yynewbytes / sizeof (*yyptr);                          \
+        yynewbytes = yystacksize * YYSIZEOF (*Stack) + YYSTACK_GAP_MAXIMUM; \
+        yyptr += yynewbytes / YYSIZEOF (*yyptr);                        \
       }                                                                 \
     while (0)
 
@@ -840,12 +987,12 @@
 # ifndef YYCOPY
 #  if defined __GNUC__ && 1 < __GNUC__
 #   define YYCOPY(Dst, Src, Count) \
-      __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src)))
+      __builtin_memcpy (Dst, Src, YY_CAST (YYSIZE_T, (Count)) * sizeof (*(Src)))
 #  else
 #   define YYCOPY(Dst, Src, Count)              \
       do                                        \
         {                                       \
-          YYSIZE_T yyi;                         \
+          YYPTRDIFF_T yyi;                      \
           for (yyi = 0; yyi < (Count); yyi++)   \
             (Dst)[yyi] = (Src)[yyi];            \
         }                                       \
@@ -855,30 +1002,33 @@
 #endif /* !YYCOPY_NEEDED */
 
 /* YYFINAL -- State number of the termination state.  */
-#define YYFINAL  394
+#define YYFINAL  416
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   9550
+#define YYLAST   10112
 
 /* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  420
+#define YYNTOKENS  445
 /* YYNNTS -- Number of nonterminals.  */
 #define YYNNTS  111
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  591
+#define YYNRULES  616
 /* YYNSTATES -- Number of states.  */
-#define YYNSTATES  736
+#define YYNSTATES  764
 
-/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
-   by yylex, with out-of-bounds checking.  */
-#define YYUNDEFTOK  2
-#define YYMAXUTOK   674
+/* YYMAXUTOK -- Last valid token kind.  */
+#define YYMAXUTOK   699
 
-#define YYTRANSLATE(YYX)                                                \
-  ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+
+/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM
+   as returned by yylex, with out-of-bounds checking.  */
+#define YYTRANSLATE(YYX)                                \
+  (0 <= (YYX) && (YYX) <= YYMAXUTOK                     \
+   ? YY_CAST (yysymbol_kind_t, yytranslate[YYX])        \
+   : YYSYMBOL_YYUNDEF)
 
 /* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
-   as returned by yylex, without out-of-bounds checking.  */
-static const yytype_uint16 yytranslate[] =
+   as returned by yylex.  */
+static const yytype_int16 yytranslate[] =
 {
        0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
@@ -947,120 +1097,131 @@
      385,   386,   387,   388,   389,   390,   391,   392,   393,   394,
      395,   396,   397,   398,   399,   400,   401,   402,   403,   404,
      405,   406,   407,   408,   409,   410,   411,   412,   413,   414,
-     415,   416,   417,   418,   419
+     415,   416,   417,   418,   419,   420,   421,   422,   423,   424,
+     425,   426,   427,   428,   429,   430,   431,   432,   433,   434,
+     435,   436,   437,   438,   439,   440,   441,   442,   443,   444
 };
 
 #if YYDEBUG
   /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
-static const yytype_uint16 yyrline[] =
+static const yytype_int16 yyrline[] =
 {
-       0,   357,   357,   363,   366,   371,   374,   377,   381,   385,
-     388,   392,   396,   400,   404,   408,   412,   418,   426,   429,
-     432,   435,   438,   443,   451,   458,   465,   471,   475,   482,
-     485,   491,   498,   508,   516,   521,   549,   558,   564,   568,
-     572,   592,   593,   594,   595,   601,   602,   607,   612,   621,
-     622,   627,   635,   636,   642,   651,   652,   657,   662,   667,
-     675,   676,   685,   697,   698,   707,   708,   717,   718,   727,
-     728,   736,   737,   745,   746,   754,   755,   755,   773,   774,
-     790,   794,   798,   802,   807,   811,   815,   819,   823,   827,
-     831,   838,   841,   852,   859,   864,   869,   876,   880,   884,
-     888,   893,   898,   907,   907,   918,   922,   929,   936,   939,
-     946,   954,   974,   997,  1012,  1037,  1048,  1058,  1068,  1078,
-    1087,  1090,  1094,  1098,  1103,  1111,  1118,  1123,  1128,  1133,
-    1142,  1152,  1179,  1188,  1195,  1203,  1210,  1217,  1225,  1235,
-    1242,  1253,  1259,  1262,  1269,  1273,  1277,  1286,  1296,  1299,
-    1310,  1313,  1316,  1320,  1324,  1329,  1333,  1340,  1344,  1349,
-    1355,  1361,  1368,  1373,  1381,  1387,  1399,  1413,  1419,  1424,
-    1432,  1440,  1448,  1456,  1464,  1472,  1480,  1488,  1495,  1502,
-    1506,  1511,  1516,  1521,  1526,  1531,  1536,  1540,  1544,  1548,
-    1552,  1558,  1569,  1576,  1579,  1588,  1593,  1603,  1608,  1616,
-    1620,  1630,  1633,  1639,  1645,  1652,  1662,  1666,  1670,  1674,
-    1679,  1683,  1688,  1693,  1698,  1703,  1708,  1713,  1718,  1723,
-    1728,  1734,  1740,  1746,  1751,  1756,  1761,  1766,  1771,  1776,
-    1781,  1786,  1791,  1796,  1801,  1807,  1814,  1819,  1824,  1829,
-    1834,  1839,  1844,  1849,  1854,  1859,  1864,  1869,  1877,  1885,
-    1893,  1899,  1905,  1911,  1917,  1923,  1929,  1935,  1941,  1947,
-    1953,  1959,  1965,  1971,  1977,  1983,  1989,  1995,  2001,  2007,
-    2013,  2019,  2025,  2031,  2037,  2043,  2049,  2055,  2061,  2067,
-    2073,  2079,  2085,  2091,  2099,  2107,  2115,  2123,  2131,  2139,
-    2147,  2155,  2163,  2171,  2179,  2187,  2193,  2199,  2205,  2211,
-    2217,  2223,  2229,  2235,  2241,  2247,  2253,  2259,  2265,  2271,
-    2277,  2283,  2289,  2295,  2301,  2307,  2313,  2319,  2325,  2331,
-    2337,  2343,  2349,  2355,  2361,  2367,  2373,  2379,  2385,  2391,
-    2397,  2403,  2407,  2411,  2415,  2420,  2426,  2431,  2436,  2441,
-    2446,  2451,  2456,  2462,  2467,  2472,  2477,  2482,  2487,  2493,
-    2499,  2505,  2511,  2517,  2523,  2529,  2535,  2541,  2547,  2553,
-    2559,  2565,  2571,  2576,  2581,  2586,  2591,  2596,  2601,  2607,
-    2612,  2617,  2622,  2627,  2632,  2637,  2642,  2648,  2653,  2658,
-    2663,  2668,  2673,  2678,  2683,  2688,  2693,  2698,  2703,  2708,
-    2713,  2718,  2724,  2729,  2734,  2740,  2746,  2751,  2756,  2761,
-    2767,  2772,  2777,  2782,  2788,  2793,  2798,  2803,  2809,  2814,
-    2819,  2824,  2830,  2836,  2842,  2848,  2853,  2859,  2865,  2871,
-    2876,  2881,  2886,  2891,  2896,  2902,  2907,  2912,  2917,  2923,
-    2928,  2933,  2938,  2944,  2949,  2954,  2959,  2965,  2970,  2975,
-    2980,  2986,  2991,  2996,  3001,  3007,  3012,  3017,  3022,  3028,
-    3033,  3038,  3043,  3049,  3054,  3059,  3064,  3070,  3075,  3080,
-    3085,  3091,  3096,  3101,  3106,  3112,  3117,  3122,  3127,  3133,
-    3138,  3143,  3148,  3154,  3159,  3164,  3169,  3175,  3180,  3185,
-    3190,  3196,  3201,  3206,  3212,  3218,  3224,  3230,  3237,  3244,
-    3250,  3256,  3262,  3268,  3274,  3280,  3287,  3292,  3308,  3313,
-    3318,  3326,  3326,  3337,  3337,  3347,  3350,  3363,  3385,  3412,
-    3416,  3422,  3427,  3438,  3442,  3448,  3459,  3462,  3469,  3473,
-    3474,  3480,  3481,  3482,  3483,  3484,  3485,  3486,  3488,  3494,
-    3503,  3504,  3508,  3504,  3520,  3521,  3525,  3525,  3532,  3532,
-    3546,  3549,  3557,  3565,  3576,  3577,  3581,  3585,  3592,  3599,
-    3603,  3611,  3615,  3628,  3632,  3639,  3639,  3659,  3662,  3668,
-    3680,  3692,  3696,  3703,  3703,  3718,  3718,  3734,  3734,  3755,
-    3758,  3764,  3767,  3773,  3777,  3784,  3789,  3794,  3801,  3804,
-    3813,  3817,  3826,  3829,  3833,  3842,  3842,  3884,  3890,  3893,
-    3898,  3901
+       0,   371,   371,   377,   380,   385,   388,   391,   395,   399,
+     402,   406,   410,   414,   418,   422,   426,   432,   440,   443,
+     446,   449,   452,   457,   465,   472,   479,   485,   489,   496,
+     499,   505,   512,   522,   530,   535,   563,   572,   578,   582,
+     586,   606,   607,   608,   609,   615,   616,   621,   626,   635,
+     636,   641,   649,   650,   656,   665,   666,   671,   676,   681,
+     689,   690,   699,   711,   712,   721,   722,   731,   732,   741,
+     742,   750,   751,   759,   760,   768,   769,   769,   787,   788,
+     804,   808,   812,   816,   821,   825,   829,   833,   837,   841,
+     845,   852,   855,   866,   873,   878,   883,   890,   894,   898,
+     902,   907,   912,   921,   921,   932,   936,   943,   950,   953,
+     960,   968,   988,  1011,  1026,  1051,  1062,  1072,  1082,  1092,
+    1101,  1104,  1108,  1112,  1117,  1125,  1132,  1137,  1142,  1147,
+    1156,  1166,  1193,  1202,  1209,  1217,  1224,  1231,  1239,  1249,
+    1256,  1267,  1273,  1276,  1283,  1287,  1291,  1300,  1310,  1313,
+    1324,  1327,  1330,  1334,  1338,  1343,  1347,  1354,  1358,  1363,
+    1369,  1375,  1382,  1387,  1395,  1401,  1413,  1427,  1433,  1438,
+    1446,  1454,  1462,  1470,  1478,  1486,  1494,  1502,  1509,  1516,
+    1520,  1525,  1530,  1535,  1540,  1545,  1550,  1554,  1558,  1562,
+    1566,  1572,  1583,  1590,  1593,  1602,  1607,  1617,  1622,  1630,
+    1634,  1644,  1647,  1653,  1659,  1666,  1676,  1680,  1684,  1688,
+    1693,  1697,  1702,  1707,  1712,  1717,  1722,  1727,  1732,  1737,
+    1742,  1748,  1754,  1760,  1765,  1770,  1775,  1780,  1785,  1790,
+    1795,  1800,  1805,  1810,  1815,  1821,  1828,  1833,  1838,  1843,
+    1848,  1853,  1858,  1863,  1868,  1873,  1878,  1883,  1891,  1899,
+    1907,  1913,  1919,  1925,  1931,  1937,  1943,  1949,  1955,  1961,
+    1967,  1973,  1979,  1985,  1991,  1997,  2003,  2009,  2015,  2021,
+    2027,  2033,  2039,  2045,  2051,  2057,  2063,  2069,  2075,  2081,
+    2087,  2093,  2099,  2105,  2113,  2121,  2129,  2137,  2145,  2153,
+    2161,  2169,  2177,  2185,  2193,  2201,  2207,  2213,  2219,  2225,
+    2231,  2237,  2243,  2249,  2255,  2261,  2267,  2273,  2279,  2285,
+    2291,  2297,  2303,  2309,  2315,  2321,  2327,  2333,  2339,  2345,
+    2351,  2357,  2363,  2369,  2375,  2381,  2387,  2393,  2399,  2405,
+    2411,  2417,  2421,  2425,  2429,  2434,  2440,  2445,  2450,  2455,
+    2460,  2465,  2470,  2476,  2481,  2486,  2491,  2496,  2501,  2507,
+    2513,  2519,  2525,  2531,  2537,  2543,  2549,  2555,  2561,  2567,
+    2573,  2579,  2585,  2590,  2595,  2600,  2605,  2610,  2615,  2621,
+    2626,  2631,  2636,  2641,  2646,  2651,  2656,  2662,  2667,  2672,
+    2677,  2682,  2687,  2692,  2697,  2702,  2707,  2712,  2717,  2722,
+    2727,  2732,  2738,  2743,  2748,  2754,  2760,  2765,  2770,  2775,
+    2781,  2786,  2791,  2796,  2802,  2807,  2812,  2817,  2823,  2828,
+    2833,  2838,  2844,  2850,  2856,  2862,  2867,  2873,  2879,  2885,
+    2890,  2895,  2900,  2905,  2910,  2916,  2921,  2926,  2931,  2937,
+    2942,  2947,  2952,  2958,  2963,  2968,  2973,  2979,  2984,  2989,
+    2994,  3000,  3005,  3010,  3015,  3021,  3026,  3031,  3036,  3042,
+    3047,  3052,  3057,  3063,  3068,  3073,  3078,  3084,  3089,  3094,
+    3099,  3105,  3110,  3115,  3120,  3126,  3131,  3136,  3141,  3147,
+    3152,  3157,  3162,  3168,  3173,  3178,  3183,  3189,  3194,  3199,
+    3204,  3210,  3215,  3220,  3225,  3230,  3235,  3240,  3245,  3250,
+    3255,  3260,  3265,  3270,  3275,  3280,  3285,  3290,  3295,  3300,
+    3305,  3310,  3315,  3320,  3325,  3330,  3336,  3342,  3348,  3354,
+    3361,  3368,  3374,  3380,  3386,  3392,  3398,  3404,  3411,  3416,
+    3432,  3437,  3442,  3450,  3450,  3461,  3461,  3471,  3474,  3487,
+    3509,  3536,  3540,  3546,  3551,  3562,  3566,  3572,  3583,  3586,
+    3593,  3597,  3598,  3604,  3605,  3606,  3607,  3608,  3609,  3610,
+    3612,  3618,  3627,  3628,  3632,  3628,  3644,  3645,  3649,  3649,
+    3656,  3656,  3670,  3673,  3681,  3689,  3700,  3701,  3705,  3709,
+    3716,  3723,  3727,  3735,  3739,  3752,  3756,  3763,  3763,  3783,
+    3786,  3792,  3804,  3816,  3820,  3827,  3827,  3842,  3842,  3858,
+    3858,  3879,  3882,  3888,  3891,  3897,  3901,  3908,  3913,  3918,
+    3925,  3928,  3932,  3937,  3941,  3951,  3955,  3964,  3967,  3971,
+    3980,  3980,  4022,  4028,  4031,  4036,  4039
 };
 #endif
 
-#if YYDEBUG || YYERROR_VERBOSE || 1
+/** Accessing symbol of state STATE.  */
+#define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State])
+
+#if 1
+/* The user-facing name of the symbol whose (internal) number is
+   YYSYMBOL.  No bounds checking.  */
+static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED;
+
 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
    First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
 static const char *const yytname[] =
 {
-  "$end", "error", "$undefined", "CONST", "BOOL", "INT", "UINT", "FLOAT",
-  "BVEC2", "BVEC3", "BVEC4", "IVEC2", "IVEC3", "IVEC4", "UVEC2", "UVEC3",
-  "UVEC4", "VEC2", "VEC3", "VEC4", "MAT2", "MAT3", "MAT4", "MAT2X2",
-  "MAT2X3", "MAT2X4", "MAT3X2", "MAT3X3", "MAT3X4", "MAT4X2", "MAT4X3",
-  "MAT4X4", "SAMPLER2D", "SAMPLER3D", "SAMPLERCUBE", "SAMPLER2DSHADOW",
-  "SAMPLERCUBESHADOW", "SAMPLER2DARRAY", "SAMPLER2DARRAYSHADOW",
-  "ISAMPLER2D", "ISAMPLER3D", "ISAMPLERCUBE", "ISAMPLER2DARRAY",
-  "USAMPLER2D", "USAMPLER3D", "USAMPLERCUBE", "USAMPLER2DARRAY", "SAMPLER",
-  "SAMPLERSHADOW", "TEXTURE2D", "TEXTURE3D", "TEXTURECUBE",
-  "TEXTURE2DARRAY", "ITEXTURE2D", "ITEXTURE3D", "ITEXTURECUBE",
-  "ITEXTURE2DARRAY", "UTEXTURE2D", "UTEXTURE3D", "UTEXTURECUBE",
-  "UTEXTURE2DARRAY", "ATTRIBUTE", "VARYING", "FLOAT16_T", "FLOAT32_T",
-  "DOUBLE", "FLOAT64_T", "INT64_T", "UINT64_T", "INT32_T", "UINT32_T",
-  "INT16_T", "UINT16_T", "INT8_T", "UINT8_T", "I64VEC2", "I64VEC3",
-  "I64VEC4", "U64VEC2", "U64VEC3", "U64VEC4", "I32VEC2", "I32VEC3",
-  "I32VEC4", "U32VEC2", "U32VEC3", "U32VEC4", "I16VEC2", "I16VEC3",
-  "I16VEC4", "U16VEC2", "U16VEC3", "U16VEC4", "I8VEC2", "I8VEC3", "I8VEC4",
-  "U8VEC2", "U8VEC3", "U8VEC4", "DVEC2", "DVEC3", "DVEC4", "DMAT2",
-  "DMAT3", "DMAT4", "F16VEC2", "F16VEC3", "F16VEC4", "F16MAT2", "F16MAT3",
-  "F16MAT4", "F32VEC2", "F32VEC3", "F32VEC4", "F32MAT2", "F32MAT3",
-  "F32MAT4", "F64VEC2", "F64VEC3", "F64VEC4", "F64MAT2", "F64MAT3",
-  "F64MAT4", "DMAT2X2", "DMAT2X3", "DMAT2X4", "DMAT3X2", "DMAT3X3",
-  "DMAT3X4", "DMAT4X2", "DMAT4X3", "DMAT4X4", "F16MAT2X2", "F16MAT2X3",
-  "F16MAT2X4", "F16MAT3X2", "F16MAT3X3", "F16MAT3X4", "F16MAT4X2",
-  "F16MAT4X3", "F16MAT4X4", "F32MAT2X2", "F32MAT2X3", "F32MAT2X4",
-  "F32MAT3X2", "F32MAT3X3", "F32MAT3X4", "F32MAT4X2", "F32MAT4X3",
-  "F32MAT4X4", "F64MAT2X2", "F64MAT2X3", "F64MAT2X4", "F64MAT3X2",
-  "F64MAT3X3", "F64MAT3X4", "F64MAT4X2", "F64MAT4X3", "F64MAT4X4",
-  "ATOMIC_UINT", "ACCSTRUCTNV", "ACCSTRUCTEXT", "RAYQUERYEXT",
-  "FCOOPMATNV", "ICOOPMATNV", "UCOOPMATNV", "SAMPLERCUBEARRAY",
-  "SAMPLERCUBEARRAYSHADOW", "ISAMPLERCUBEARRAY", "USAMPLERCUBEARRAY",
-  "SAMPLER1D", "SAMPLER1DARRAY", "SAMPLER1DARRAYSHADOW", "ISAMPLER1D",
-  "SAMPLER1DSHADOW", "SAMPLER2DRECT", "SAMPLER2DRECTSHADOW",
-  "ISAMPLER2DRECT", "USAMPLER2DRECT", "SAMPLERBUFFER", "ISAMPLERBUFFER",
-  "USAMPLERBUFFER", "SAMPLER2DMS", "ISAMPLER2DMS", "USAMPLER2DMS",
-  "SAMPLER2DMSARRAY", "ISAMPLER2DMSARRAY", "USAMPLER2DMSARRAY",
-  "SAMPLEREXTERNALOES", "SAMPLEREXTERNAL2DY2YEXT", "ISAMPLER1DARRAY",
-  "USAMPLER1D", "USAMPLER1DARRAY", "F16SAMPLER1D", "F16SAMPLER2D",
-  "F16SAMPLER3D", "F16SAMPLER2DRECT", "F16SAMPLERCUBE",
+  "\"end of file\"", "error", "\"invalid token\"", "CONST", "BOOL", "INT",
+  "UINT", "FLOAT", "BVEC2", "BVEC3", "BVEC4", "IVEC2", "IVEC3", "IVEC4",
+  "UVEC2", "UVEC3", "UVEC4", "VEC2", "VEC3", "VEC4", "MAT2", "MAT3",
+  "MAT4", "MAT2X2", "MAT2X3", "MAT2X4", "MAT3X2", "MAT3X3", "MAT3X4",
+  "MAT4X2", "MAT4X3", "MAT4X4", "SAMPLER2D", "SAMPLER3D", "SAMPLERCUBE",
+  "SAMPLER2DSHADOW", "SAMPLERCUBESHADOW", "SAMPLER2DARRAY",
+  "SAMPLER2DARRAYSHADOW", "ISAMPLER2D", "ISAMPLER3D", "ISAMPLERCUBE",
+  "ISAMPLER2DARRAY", "USAMPLER2D", "USAMPLER3D", "USAMPLERCUBE",
+  "USAMPLER2DARRAY", "SAMPLER", "SAMPLERSHADOW", "TEXTURE2D", "TEXTURE3D",
+  "TEXTURECUBE", "TEXTURE2DARRAY", "ITEXTURE2D", "ITEXTURE3D",
+  "ITEXTURECUBE", "ITEXTURE2DARRAY", "UTEXTURE2D", "UTEXTURE3D",
+  "UTEXTURECUBE", "UTEXTURE2DARRAY", "ATTRIBUTE", "VARYING", "FLOAT16_T",
+  "FLOAT32_T", "DOUBLE", "FLOAT64_T", "INT64_T", "UINT64_T", "INT32_T",
+  "UINT32_T", "INT16_T", "UINT16_T", "INT8_T", "UINT8_T", "I64VEC2",
+  "I64VEC3", "I64VEC4", "U64VEC2", "U64VEC3", "U64VEC4", "I32VEC2",
+  "I32VEC3", "I32VEC4", "U32VEC2", "U32VEC3", "U32VEC4", "I16VEC2",
+  "I16VEC3", "I16VEC4", "U16VEC2", "U16VEC3", "U16VEC4", "I8VEC2",
+  "I8VEC3", "I8VEC4", "U8VEC2", "U8VEC3", "U8VEC4", "DVEC2", "DVEC3",
+  "DVEC4", "DMAT2", "DMAT3", "DMAT4", "F16VEC2", "F16VEC3", "F16VEC4",
+  "F16MAT2", "F16MAT3", "F16MAT4", "F32VEC2", "F32VEC3", "F32VEC4",
+  "F32MAT2", "F32MAT3", "F32MAT4", "F64VEC2", "F64VEC3", "F64VEC4",
+  "F64MAT2", "F64MAT3", "F64MAT4", "DMAT2X2", "DMAT2X3", "DMAT2X4",
+  "DMAT3X2", "DMAT3X3", "DMAT3X4", "DMAT4X2", "DMAT4X3", "DMAT4X4",
+  "F16MAT2X2", "F16MAT2X3", "F16MAT2X4", "F16MAT3X2", "F16MAT3X3",
+  "F16MAT3X4", "F16MAT4X2", "F16MAT4X3", "F16MAT4X4", "F32MAT2X2",
+  "F32MAT2X3", "F32MAT2X4", "F32MAT3X2", "F32MAT3X3", "F32MAT3X4",
+  "F32MAT4X2", "F32MAT4X3", "F32MAT4X4", "F64MAT2X2", "F64MAT2X3",
+  "F64MAT2X4", "F64MAT3X2", "F64MAT3X3", "F64MAT3X4", "F64MAT4X2",
+  "F64MAT4X3", "F64MAT4X4", "ATOMIC_UINT", "ACCSTRUCTNV", "ACCSTRUCTEXT",
+  "RAYQUERYEXT", "FCOOPMATNV", "ICOOPMATNV", "UCOOPMATNV",
+  "SAMPLERCUBEARRAY", "SAMPLERCUBEARRAYSHADOW", "ISAMPLERCUBEARRAY",
+  "USAMPLERCUBEARRAY", "SAMPLER1D", "SAMPLER1DARRAY",
+  "SAMPLER1DARRAYSHADOW", "ISAMPLER1D", "SAMPLER1DSHADOW", "SAMPLER2DRECT",
+  "SAMPLER2DRECTSHADOW", "ISAMPLER2DRECT", "USAMPLER2DRECT",
+  "SAMPLERBUFFER", "ISAMPLERBUFFER", "USAMPLERBUFFER", "SAMPLER2DMS",
+  "ISAMPLER2DMS", "USAMPLER2DMS", "SAMPLER2DMSARRAY", "ISAMPLER2DMSARRAY",
+  "USAMPLER2DMSARRAY", "SAMPLEREXTERNALOES", "SAMPLEREXTERNAL2DY2YEXT",
+  "ISAMPLER1DARRAY", "USAMPLER1D", "USAMPLER1DARRAY", "F16SAMPLER1D",
+  "F16SAMPLER2D", "F16SAMPLER3D", "F16SAMPLER2DRECT", "F16SAMPLERCUBE",
   "F16SAMPLER1DARRAY", "F16SAMPLER2DARRAY", "F16SAMPLERCUBEARRAY",
   "F16SAMPLERBUFFER", "F16SAMPLER2DMS", "F16SAMPLER2DMSARRAY",
   "F16SAMPLER1DSHADOW", "F16SAMPLER2DSHADOW", "F16SAMPLER1DARRAYSHADOW",
@@ -1076,7 +1237,13 @@
   "F16IMAGE1D", "F16IMAGE2D", "F16IMAGE3D", "F16IMAGE2DRECT",
   "F16IMAGECUBE", "F16IMAGE1DARRAY", "F16IMAGE2DARRAY",
   "F16IMAGECUBEARRAY", "F16IMAGEBUFFER", "F16IMAGE2DMS",
-  "F16IMAGE2DMSARRAY", "TEXTURECUBEARRAY", "ITEXTURECUBEARRAY",
+  "F16IMAGE2DMSARRAY", "I64IMAGE1D", "U64IMAGE1D", "I64IMAGE2D",
+  "U64IMAGE2D", "I64IMAGE3D", "U64IMAGE3D", "I64IMAGE2DRECT",
+  "U64IMAGE2DRECT", "I64IMAGECUBE", "U64IMAGECUBE", "I64IMAGEBUFFER",
+  "U64IMAGEBUFFER", "I64IMAGE1DARRAY", "U64IMAGE1DARRAY",
+  "I64IMAGE2DARRAY", "U64IMAGE2DARRAY", "I64IMAGECUBEARRAY",
+  "U64IMAGECUBEARRAY", "I64IMAGE2DMS", "U64IMAGE2DMS", "I64IMAGE2DMSARRAY",
+  "U64IMAGE2DMSARRAY", "TEXTURECUBEARRAY", "ITEXTURECUBEARRAY",
   "UTEXTURECUBEARRAY", "TEXTURE1D", "ITEXTURE1D", "UTEXTURE1D",
   "TEXTURE1DARRAY", "ITEXTURE1DARRAY", "UTEXTURE1DARRAY", "TEXTURE2DRECT",
   "ITEXTURE2DRECT", "UTEXTURE2DRECT", "TEXTUREBUFFER", "ITEXTUREBUFFER",
@@ -1100,8 +1267,9 @@
   "FLOATCONSTANT", "INTCONSTANT", "UINTCONSTANT", "BOOLCONSTANT",
   "IDENTIFIER", "TYPE_NAME", "CENTROID", "IN", "OUT", "INOUT", "STRUCT",
   "VOID", "WHILE", "BREAK", "CONTINUE", "DO", "ELSE", "FOR", "IF",
-  "DISCARD", "RETURN", "SWITCH", "CASE", "DEFAULT", "UNIFORM", "SHARED",
-  "BUFFER", "FLAT", "SMOOTH", "LAYOUT", "DOUBLECONSTANT", "INT16CONSTANT",
+  "DISCARD", "RETURN", "SWITCH", "CASE", "DEFAULT", "TERMINATE_INVOCATION",
+  "TERMINATE_RAY", "IGNORE_INTERSECTION", "UNIFORM", "SHARED", "BUFFER",
+  "FLAT", "SMOOTH", "LAYOUT", "DOUBLECONSTANT", "INT16CONSTANT",
   "UINT16CONSTANT", "FLOAT16CONSTANT", "INT32CONSTANT", "UINT32CONSTANT",
   "INT64CONSTANT", "UINT64CONSTANT", "SUBROUTINE", "DEMOTE", "PAYLOADNV",
   "PAYLOADINNV", "HITATTRNV", "CALLDATANV", "CALLDATAINNV", "PAYLOADEXT",
@@ -1151,12 +1319,18 @@
   "function_definition", "$@13", "attribute", "attribute_list",
   "single_attribute", YY_NULLPTR
 };
+
+static const char *
+yysymbol_name (yysymbol_kind_t yysymbol)
+{
+  return yytname[yysymbol];
+}
 #endif
 
-# ifdef YYPRINT
+#ifdef YYPRINT
 /* YYTOKNUM[NUM] -- (External) token number corresponding to the
    (internal) symbol number NUM (which must be that of a token).  */
-static const yytype_uint16 yytoknum[] =
+static const yytype_int16 yytoknum[] =
 {
        0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
      265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
@@ -1199,104 +1373,110 @@
      635,   636,   637,   638,   639,   640,   641,   642,   643,   644,
      645,   646,   647,   648,   649,   650,   651,   652,   653,   654,
      655,   656,   657,   658,   659,   660,   661,   662,   663,   664,
-     665,   666,   667,   668,   669,   670,   671,   672,   673,   674
+     665,   666,   667,   668,   669,   670,   671,   672,   673,   674,
+     675,   676,   677,   678,   679,   680,   681,   682,   683,   684,
+     685,   686,   687,   688,   689,   690,   691,   692,   693,   694,
+     695,   696,   697,   698,   699
 };
-# endif
+#endif
 
-#define YYPACT_NINF -457
+#define YYPACT_NINF (-732)
 
-#define yypact_value_is_default(Yystate) \
-  (!!((Yystate) == (-457)))
+#define yypact_value_is_default(Yyn) \
+  ((Yyn) == YYPACT_NINF)
 
-#define YYTABLE_NINF -537
+#define YYTABLE_NINF (-559)
 
-#define yytable_value_is_error(Yytable_value) \
+#define yytable_value_is_error(Yyn) \
   0
 
   /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
      STATE-NUM.  */
 static const yytype_int16 yypact[] =
 {
-    4075,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,   132,  -457,
-    -457,  -457,  -457,  -457,    -1,  -457,  -457,  -457,  -457,  -457,
-    -457,  -301,  -298,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,    11,  -249,    17,    30,  6160,
-      20,  -457,    28,  -457,  -457,  -457,  -457,  4492,  -457,  -457,
-    -457,  -457,    50,  -457,  -457,   739,  -457,  -457,    16,  -457,
-      81,   -29,    69,  -457,  -313,  -457,   111,  -457,  6160,  -457,
-    -457,  -457,  6160,   103,   106,  -457,  -314,  -457,    72,  -457,
-    -457,  8566,   142,  -457,  -457,  -457,   136,  6160,  -457,   144,
-    -457,    53,  -457,  -457,    76,  6974,  -457,  -312,  1156,  -457,
-    -457,  -457,  -457,   142,  -309,  -457,  7372,  -308,  -457,   119,
-    -457,    65,  8566,  8566,  -457,  8566,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,    36,  -457,  -457,  -457,   171,
-      85,  8964,   173,  -457,  8566,  -457,  -457,  -323,   174,  -457,
-    6160,   139,  4909,  -457,  6160,  8566,  -457,   -29,  -457,   141,
-    -457,  -457,   145,    99,    35,    26,    71,   156,   159,   161,
-     196,   195,    23,   181,  7770,  -457,   183,   182,  -457,  -457,
-     186,   179,   180,  -457,   191,   192,   187,  8168,   193,  8566,
-     188,   189,   127,  -457,  -457,    96,  -457,  -249,   200,   201,
-    -457,  -457,  -457,  -457,  -457,  1573,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,   -24,   174,  7372,    13,  7372,
-    -457,  -457,  7372,  6160,  -457,   166,  -457,  -457,  -457,    86,
-    -457,  -457,  8566,   168,  -457,  -457,  8566,   205,  -457,  -457,
-    -457,  8566,  -457,   139,   142,   124,  -457,  -457,  -457,  5326,
-    -457,  -457,  -457,  -457,  8566,  8566,  8566,  8566,  8566,  8566,
-    8566,  8566,  8566,  8566,  8566,  8566,  8566,  8566,  8566,  8566,
-    8566,  8566,  8566,  -457,  -457,  -457,   206,   172,  -457,  1990,
-    -457,  -457,  -457,  1990,  -457,  8566,  -457,  -457,   130,  8566,
-     125,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  8566,  8566,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  7372,  -457,    94,  -457,  5743,  -457,  -457,
-     207,   204,  -457,  -457,  -457,   131,   174,   139,  -457,  -457,
-    -457,  -457,  -457,   145,   145,    99,    99,    35,    35,    35,
-      35,    26,    26,    71,   156,   159,   161,   196,   195,  8566,
-    -457,   212,    60,  -457,  1990,  3658,   169,  3241,    87,  -457,
-      89,  -457,  -457,  -457,  -457,  -457,  6576,  -457,  -457,  -457,
-    -457,   143,  8566,   211,   172,   210,   204,   184,  6160,   217,
-     219,  -457,  -457,  3658,   218,  -457,  -457,  -457,  8566,   220,
-    -457,  -457,  -457,   214,  2407,  8566,  -457,   216,   223,   185,
-     224,  2824,  -457,   225,  -457,  -457,  7372,  -457,  -457,  -457,
-      97,  8566,  2407,   218,  -457,  -457,  1990,  -457,   222,   204,
-    -457,  -457,  1990,   229,  -457,  -457
+    4303,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,
+    -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,
+    -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,
+    -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,
+    -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,
+    -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,
+    -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,
+    -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,
+    -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,
+    -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,
+    -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,
+    -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,
+    -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,
+    -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,
+    -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,
+    -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,
+    -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,
+    -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,
+    -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,
+    -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,
+    -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,
+    -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,
+    -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,
+    -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,
+    -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,
+    -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,
+    -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,
+    -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,
+    -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,
+    -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,
+    -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,
+    -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,
+     109,  -732,  -732,  -732,  -732,  -732,     1,  -732,  -732,  -732,
+    -732,  -732,  -732,  -324,  -261,  -732,  -732,  -732,  -732,  -732,
+    -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,
+    -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,
+    -732,  -732,  -732,  -732,  -732,  -732,  -732,    11,    44,    22,
+       7,  6513,  -332,  -732,   -10,  -732,  -732,  -732,  -732,  4745,
+    -732,  -732,  -732,  -732,    46,  -732,  -732,   767,  -732,  -732,
+      16,  -732,    69,    -5,    47,  -732,  -338,  -732,    91,  -732,
+    6513,  -732,  -732,  -732,  6513,    72,    80,  -732,    13,  -732,
+      74,  -732,  -732,  9069,   126,  -732,  -732,  -732,   127,  6513,
+    -732,   144,  -732,    17,  -732,  -732,    61,  7377,  -732,    10,
+    1209,  -732,  -732,  -732,  -732,   126,    25,  -732,  7800,    26,
+    -732,   119,  -732,    78,  9069,  9069,  -732,  9069,  -732,  -732,
+    -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,
+    -732,  -732,  -732,  -732,  -732,  -732,  -732,    36,  -732,  -732,
+    -732,   164,    65,  9492,   171,  -732,  9069,  -732,  -732,  -340,
+     173,  -732,  6513,   140,  5187,  -732,  6513,  9069,  -732,    -5,
+    -732,   141,  -732,  -732,   124,   130,   179,    27,   117,   156,
+     158,   160,   195,   194,    20,   181,  8223,  -732,   183,   182,
+    -732,  -732,   186,   178,   180,  -732,   189,   192,   184,  8646,
+     193,  9069,   187,   188,   190,   196,   197,   129,  -732,  -732,
+      89,  -732,    44,   199,   204,  -732,  -732,  -732,  -732,  -732,
+    1651,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,
+    -376,   173,  7800,    54,  7800,  -732,  -732,  7800,  6513,  -732,
+     161,  -732,  -732,  -732,    70,  -732,  -732,  9069,   169,  -732,
+    -732,  9069,   207,  -732,  -732,  -732,  9069,  -732,   140,   126,
+     103,  -732,  -732,  -732,  5629,  -732,  -732,  -732,  -732,  9069,
+    9069,  9069,  9069,  9069,  9069,  9069,  9069,  9069,  9069,  9069,
+    9069,  9069,  9069,  9069,  9069,  9069,  9069,  9069,  -732,  -732,
+    -732,   209,   177,  -732,  2093,  -732,  -732,  -732,  2093,  -732,
+    9069,  -732,  -732,   122,  9069,   152,  -732,  -732,  -732,  -732,
+    -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,
+    -732,  -732,  9069,  9069,  -732,  -732,  -732,  -732,  -732,  -732,
+    -732,  7800,  -732,   143,  -732,  6071,  -732,  -732,   211,   208,
+    -732,  -732,  -732,   123,   173,   140,  -732,  -732,  -732,  -732,
+    -732,   124,   124,   130,   130,   179,   179,   179,   179,    27,
+      27,   117,   156,   158,   160,   195,   194,  9069,  -732,   216,
+      87,  -732,  2093,  3861,   174,  3419,    75,  -732,    85,  -732,
+    -732,  -732,  -732,  -732,  6954,  -732,  -732,  -732,  -732,   154,
+    9069,   217,   177,   191,   208,   185,  6513,   221,   223,  -732,
+    -732,  3861,   220,  -732,  -732,  -732,  9069,   224,  -732,  -732,
+    -732,   218,  2535,  9069,  -732,   219,   225,   198,   226,  2977,
+    -732,   227,  -732,  -732,  7800,  -732,  -732,  -732,    86,  9069,
+    2535,   220,  -732,  -732,  2093,  -732,   222,   208,  -732,  -732,
+    2093,   228,  -732,  -732
 };
 
   /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
      Performed when YYTABLE does not specify something else to do.  Zero
      means the default is an error.  */
-static const yytype_uint16 yydefact[] =
+static const yytype_int16 yydefact[] =
 {
        0,   157,   210,   208,   209,   207,   214,   215,   216,   217,
      218,   219,   220,   221,   222,   211,   212,   213,   223,   224,
@@ -1314,98 +1494,101 @@
      298,   299,   300,   301,   302,   303,   304,   305,   306,   310,
      311,   312,   313,   314,   315,   316,   317,   318,   322,   323,
      324,   325,   326,   327,   328,   329,   330,   334,   331,   332,
-     333,   493,   494,   495,   346,   347,   370,   373,   335,   344,
+     333,   515,   516,   517,   346,   347,   370,   373,   335,   344,
      345,   361,   343,   392,   393,   396,   397,   398,   400,   401,
-     402,   404,   405,   406,   408,   409,   483,   484,   369,   371,
+     402,   404,   405,   406,   408,   409,   505,   506,   369,   371,
      372,   348,   349,   350,   394,   351,   355,   356,   359,   399,
      403,   407,   352,   353,   357,   358,   395,   354,   360,   439,
      441,   442,   443,   445,   446,   447,   449,   450,   451,   453,
      454,   455,   457,   458,   459,   461,   462,   463,   465,   466,
      467,   469,   470,   471,   473,   474,   475,   477,   478,   479,
      481,   482,   440,   444,   448,   452,   456,   464,   468,   472,
-     460,   476,   480,   374,   375,   376,   410,   419,   421,   415,
-     420,   422,   423,   425,   426,   427,   429,   430,   431,   433,
-     434,   435,   437,   438,   411,   412,   413,   424,   414,   416,
-     417,   418,   428,   432,   436,   485,   486,   489,   490,   491,
-     492,   487,   488,   584,   132,   498,   499,   500,     0,   497,
-     161,   159,   160,   158,     0,   206,   162,   163,   164,   134,
-     133,     0,   190,   171,   173,   169,   175,   177,   172,   174,
-     170,   176,   178,   167,   168,   192,   179,   186,   187,   188,
-     189,   180,   181,   182,   183,   184,   185,   135,   136,   137,
-     138,   139,   140,   147,   583,     0,   585,     0,   109,   108,
-       0,   120,   125,   154,   153,   151,   155,     0,   148,   150,
-     156,   130,   202,   152,   496,     0,   580,   582,     0,   503,
-       0,     0,     0,    97,     0,    94,     0,   107,     0,   116,
-     110,   118,     0,   119,     0,    95,   126,   100,     0,   149,
-     131,     0,   195,   201,     1,   581,     0,     0,   501,   144,
-     146,     0,   142,   193,     0,     0,    98,     0,     0,   586,
-     111,   115,   117,   113,   121,   112,     0,   127,   103,     0,
-     101,     0,     0,     0,     9,     0,    43,    42,    44,    41,
-       5,     6,     7,     8,     2,    16,    14,    15,    17,    10,
-      11,    12,    13,     3,    18,    37,    20,    25,    26,     0,
-       0,    30,     0,   204,     0,    36,    34,     0,   196,    96,
-       0,     0,     0,   505,     0,     0,   141,     0,   191,     0,
-     197,    45,    49,    52,    55,    60,    63,    65,    67,    69,
-      71,    73,    75,     0,     0,    99,     0,   531,   540,   544,
-       0,     0,     0,   565,     0,     0,     0,     0,     0,     0,
-       0,     0,    45,    78,    91,     0,   518,     0,   156,   130,
-     521,   542,   520,   528,   519,     0,   522,   523,   546,   524,
-     553,   525,   526,   561,   527,     0,   114,     0,   122,     0,
-     513,   129,     0,     0,   105,     0,   102,    38,    39,     0,
-      22,    23,     0,     0,    28,    27,     0,   206,    31,    33,
-      40,     0,   203,     0,   511,     0,   509,   504,   506,     0,
-      93,   145,   143,   194,     0,     0,     0,     0,     0,     0,
+     460,   476,   480,   483,   484,   485,   486,   487,   488,   489,
+     490,   491,   492,   493,   494,   495,   496,   497,   498,   499,
+     500,   501,   502,   503,   504,   374,   375,   376,   410,   419,
+     421,   415,   420,   422,   423,   425,   426,   427,   429,   430,
+     431,   433,   434,   435,   437,   438,   411,   412,   413,   424,
+     414,   416,   417,   418,   428,   432,   436,   507,   508,   511,
+     512,   513,   514,   509,   510,   609,   132,   520,   521,   522,
+       0,   519,   161,   159,   160,   158,     0,   206,   162,   163,
+     164,   134,   133,     0,   190,   171,   173,   169,   175,   177,
+     172,   174,   170,   176,   178,   167,   168,   192,   179,   186,
+     187,   188,   189,   180,   181,   182,   183,   184,   185,   135,
+     136,   137,   138,   139,   140,   147,   608,     0,   610,     0,
+     109,   108,     0,   120,   125,   154,   153,   151,   155,     0,
+     148,   150,   156,   130,   202,   152,   518,     0,   605,   607,
+       0,   525,     0,     0,     0,    97,     0,    94,     0,   107,
+       0,   116,   110,   118,     0,   119,     0,    95,   126,   100,
+       0,   149,   131,     0,   195,   201,     1,   606,     0,     0,
+     523,   144,   146,     0,   142,   193,     0,     0,    98,     0,
+       0,   611,   111,   115,   117,   113,   121,   112,     0,   127,
+     103,     0,   101,     0,     0,     0,     9,     0,    43,    42,
+      44,    41,     5,     6,     7,     8,     2,    16,    14,    15,
+      17,    10,    11,    12,    13,     3,    18,    37,    20,    25,
+      26,     0,     0,    30,     0,   204,     0,    36,    34,     0,
+     196,    96,     0,     0,     0,   527,     0,     0,   141,     0,
+     191,     0,   197,    45,    49,    52,    55,    60,    63,    65,
+      67,    69,    71,    73,    75,     0,     0,    99,     0,   553,
+     562,   566,     0,     0,     0,   587,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,    45,    78,    91,
+       0,   540,     0,   156,   130,   543,   564,   542,   550,   541,
+       0,   544,   545,   568,   546,   575,   547,   548,   583,   549,
+       0,   114,     0,   122,     0,   535,   129,     0,     0,   105,
+       0,   102,    38,    39,     0,    22,    23,     0,     0,    28,
+      27,     0,   206,    31,    33,    40,     0,   203,     0,   533,
+       0,   531,   526,   528,     0,    93,   145,   143,   194,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    76,   198,   199,     0,     0,   530,     0,
-     563,   576,   575,     0,   567,     0,   579,   577,     0,     0,
-       0,   560,   529,    81,    82,    84,    83,    86,    87,    88,
-      89,    90,    85,    80,     0,     0,   545,   541,   543,   547,
-     554,   562,   124,     0,   516,     0,   128,     0,   106,     4,
-       0,    24,    21,    32,   205,     0,   512,     0,   507,   502,
-      46,    47,    48,    51,    50,    53,    54,    58,    59,    56,
-      57,    61,    62,    64,    66,    68,    70,    72,    74,     0,
-     200,   590,     0,   588,   532,     0,     0,     0,     0,   578,
-       0,   559,    79,    92,   123,   514,     0,   104,    19,   508,
-     510,     0,     0,     0,     0,     0,   551,     0,     0,     0,
-       0,   570,   569,   572,   538,   555,   515,   517,     0,     0,
-     587,   589,   533,     0,     0,     0,   571,     0,     0,   550,
-       0,     0,   548,     0,    77,   591,     0,   535,   564,   534,
-       0,   573,     0,   538,   537,   539,   557,   552,     0,   574,
-     568,   549,   558,     0,   566,   556
+       0,     0,     0,     0,     0,     0,     0,     0,    76,   198,
+     199,     0,     0,   552,     0,   585,   598,   597,     0,   589,
+       0,   601,   599,     0,     0,     0,   582,   602,   603,   604,
+     551,    81,    82,    84,    83,    86,    87,    88,    89,    90,
+      85,    80,     0,     0,   567,   563,   565,   569,   576,   584,
+     124,     0,   538,     0,   128,     0,   106,     4,     0,    24,
+      21,    32,   205,     0,   534,     0,   529,   524,    46,    47,
+      48,    51,    50,    53,    54,    58,    59,    56,    57,    61,
+      62,    64,    66,    68,    70,    72,    74,     0,   200,   615,
+       0,   613,   554,     0,     0,     0,     0,   600,     0,   581,
+      79,    92,   123,   536,     0,   104,    19,   530,   532,     0,
+       0,     0,     0,     0,   573,     0,     0,     0,     0,   592,
+     591,   594,   560,   577,   537,   539,     0,     0,   612,   614,
+     555,     0,     0,     0,   593,     0,     0,   572,     0,     0,
+     570,     0,    77,   616,     0,   557,   586,   556,     0,   595,
+       0,   560,   559,   561,   579,   574,     0,   596,   590,   571,
+     580,     0,   588,   578
 };
 
   /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  8868,  -457,   -87,   -84,  -127,   -93,   -33,   -31,
-     -27,   -25,   -28,   -26,  -457,   -86,  -457,  -103,  -457,  -111,
-    -125,     2,  -457,  -457,  -457,     4,  -457,  -457,  -457,   176,
-     194,   178,  -457,  -457,  -337,  -457,  -457,  -457,  -457,    95,
-    -457,   -37,   -46,  -457,     9,  -457,     0,   -63,  -457,  -457,
-    -457,  -457,   263,  -457,  -457,  -457,  -456,  -140,    10,   -73,
-    -211,  -457,  -102,  -198,  -321,  -457,  -144,  -457,  -457,  -155,
-    -154,  -457,  -457,   198,  -274,   -97,  -457,    46,  -457,  -118,
-    -457,    51,  -457,  -457,  -457,  -457,    52,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,   213,  -457,  -457,  -457,  -457,
-    -105
+    -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,  -732,
+    -732,  -732,  9402,  -732,   -90,   -89,  -153,   -92,   -29,   -28,
+     -27,   -26,   -30,   -25,  -732,   -88,  -732,  -101,  -732,  -113,
+    -132,     2,  -732,  -732,  -732,     4,  -732,  -732,  -732,   200,
+     201,   202,  -732,  -732,  -343,  -732,  -732,  -732,  -732,    92,
+    -732,   -36,   -46,  -732,     9,  -732,     0,   -67,  -732,  -732,
+    -732,  -732,   263,  -732,  -732,  -732,  -481,  -142,     8,   -78,
+    -214,  -732,  -107,  -204,  -731,  -732,  -149,  -732,  -732,  -160,
+    -159,  -732,  -732,   212,  -269,  -104,  -732,    45,  -732,  -127,
+    -732,    48,  -732,  -732,  -732,  -732,    49,  -732,  -732,  -732,
+    -732,  -732,  -732,  -732,  -732,   210,  -732,  -732,  -732,  -732,
+    -116
 };
 
   /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
-      -1,   443,   444,   445,   630,   446,   447,   448,   449,   450,
-     451,   452,   502,   454,   472,   473,   474,   475,   476,   477,
-     478,   479,   480,   481,   482,   503,   659,   504,   614,   505,
-     561,   506,   345,   533,   421,   507,   347,   348,   349,   379,
-     380,   381,   350,   351,   352,   353,   354,   355,   401,   402,
-     356,   357,   358,   359,   455,   404,   456,   407,   392,   393,
-     457,   362,   363,   364,   464,   397,   462,   463,   555,   556,
-     531,   625,   510,   511,   512,   513,   514,   589,   685,   718,
-     709,   710,   711,   719,   515,   516,   517,   518,   712,   689,
-     519,   520,   713,   733,   521,   522,   523,   665,   593,   667,
-     693,   707,   708,   524,   365,   366,   367,   376,   525,   662,
-     663
+      -1,   465,   466,   467,   658,   468,   469,   470,   471,   472,
+     473,   474,   527,   476,   494,   495,   496,   497,   498,   499,
+     500,   501,   502,   503,   504,   528,   687,   529,   642,   530,
+     586,   531,   367,   558,   443,   532,   369,   370,   371,   401,
+     402,   403,   372,   373,   374,   375,   376,   377,   423,   424,
+     378,   379,   380,   381,   477,   426,   478,   429,   414,   415,
+     479,   384,   385,   386,   486,   419,   484,   485,   580,   581,
+     556,   653,   535,   536,   537,   538,   539,   614,   713,   746,
+     737,   738,   739,   747,   540,   541,   542,   543,   740,   717,
+     544,   545,   741,   761,   546,   547,   548,   693,   618,   695,
+     721,   735,   736,   549,   387,   388,   389,   398,   550,   690,
+     691
 };
 
   /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
@@ -1413,14 +1596,14 @@
      number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_int16 yytable[] =
 {
-     361,   551,   344,   415,   346,   405,   405,   484,   559,   360,
-     405,   484,   416,   552,   406,   485,   371,   527,   532,   372,
+     383,   745,   366,   427,   368,   584,   576,   512,   753,   382,
+     515,   428,   516,   517,   406,   393,   520,   407,   577,   745,
        2,     3,     4,     5,     6,     7,     8,     9,    10,    11,
       12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
       22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
       32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
       42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
-      52,    53,    54,    55,    56,    57,    58,   627,   375,    61,
+      52,    53,    54,    55,    56,    57,    58,   655,   394,    61,
       62,    63,    64,    65,    66,    67,    68,    69,    70,    71,
       72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
       82,    83,    84,    85,    86,    87,    88,    89,    90,    91,
@@ -1444,216 +1627,52 @@
      262,   263,   264,   265,   266,   267,   268,   269,   270,   271,
      272,   273,   274,   275,   276,   277,   278,   279,   280,   281,
      282,   283,   284,   285,   286,   287,   288,   289,   290,   291,
-     292,   389,   382,   530,   539,   664,   622,   618,   624,   483,
-     369,   626,   558,   417,   399,   571,   572,   582,   687,   458,
-     569,   570,   484,   540,   541,   377,   389,   490,   373,   623,
-     493,   382,   494,   495,   384,   400,   498,   385,   548,   383,
-     526,   528,   370,   -35,   378,   542,   687,   390,   360,   543,
-     460,   573,   574,   583,   374,   361,   360,   344,   396,   346,
-     299,   466,   575,   576,   360,   304,   305,   467,   383,   560,
-     683,   386,   383,   717,   684,   391,   598,   360,   600,   535,
-     725,   360,   536,   418,   468,   666,   419,   461,   586,   420,
-     469,   717,   398,   545,   629,   694,   360,   695,   509,   546,
-     615,   615,   674,   615,   389,   728,   675,   508,   676,   558,
-     615,   615,   403,   616,   530,   460,   530,   460,   567,   530,
-     568,   631,   408,   603,   604,   605,   606,   607,   608,   609,
-     610,   611,   612,   633,   647,   648,   649,   650,   637,   615,
-     671,   638,   732,   613,   615,   637,   413,   669,   679,   414,
-     553,   405,   461,   459,   461,   697,   618,   615,   698,   360,
-     465,   360,   534,   360,   295,   296,   297,   564,   565,   566,
-     643,   644,   651,   652,   668,   645,   646,   558,   670,   544,
-     549,   636,   554,   484,   563,   577,   460,   578,   579,   580,
-     581,   584,   587,   590,   588,   727,   591,   592,   594,   595,
-     599,   672,   673,   601,   596,   509,   602,   -36,   -34,   628,
-     530,   632,   460,   -29,   508,   661,   660,   678,   615,   682,
-     690,   700,   702,   461,   618,   704,   705,   703,   715,  -536,
-     716,   722,   360,   721,   653,   487,   726,   654,   681,   734,
-     723,   735,   655,   657,   686,   656,   658,   699,   411,   461,
-     412,   368,   562,   635,   680,   691,   724,   730,   360,   731,
-     692,   619,   410,   530,   409,   706,   620,   621,   395,   701,
-       0,     0,   686,     0,     0,     0,     0,     0,     0,   509,
-     460,     0,     0,   509,   720,   714,   560,     0,   508,     0,
-       0,     0,   508,     0,     0,     0,     0,     0,     0,     0,
-     729,     0,     0,   530,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   461,   688,     0,
-       0,     0,     0,     0,     0,     0,   360,     0,     0,     0,
-       0,     0,   389,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   688,     0,     0,     0,
-       0,     0,     0,     0,   509,   509,     0,   509,     0,     0,
-       0,     0,     0,   508,   508,     0,   508,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   390,     0,
-       0,     0,     0,   509,     0,     0,     0,   360,     0,     0,
-       0,     0,   508,     0,   509,     0,     0,     0,     0,     0,
-       0,   509,     0,   508,     0,     0,     0,     0,     0,     0,
-     508,     0,   509,     0,     0,     0,   509,     0,     0,     0,
-       0,   508,   509,     0,     0,   508,     0,     0,     0,   394,
-       0,   508,     1,     2,     3,     4,     5,     6,     7,     8,
-       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
-      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
-      39,    40,    41,    42,    43,    44,    45,    46,    47,    48,
-      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
-      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
-      69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
-      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
-      89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
-      99,   100,   101,   102,   103,   104,   105,   106,   107,   108,
-     109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
-     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
-     129,   130,   131,   132,   133,   134,   135,   136,   137,   138,
-     139,   140,   141,   142,   143,   144,   145,   146,   147,   148,
-     149,   150,   151,   152,   153,   154,   155,   156,   157,   158,
-     159,   160,   161,   162,   163,   164,   165,   166,   167,   168,
-     169,   170,   171,   172,   173,   174,   175,   176,   177,   178,
-     179,   180,   181,   182,   183,   184,   185,   186,   187,   188,
-     189,   190,   191,   192,   193,   194,   195,   196,   197,   198,
-     199,   200,   201,   202,   203,   204,   205,   206,   207,   208,
-     209,   210,   211,   212,   213,   214,   215,   216,   217,   218,
-     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
-     229,   230,   231,   232,   233,   234,   235,   236,   237,   238,
-     239,   240,   241,   242,   243,   244,   245,   246,   247,   248,
-     249,   250,   251,   252,   253,   254,   255,   256,   257,   258,
-     259,   260,   261,   262,   263,   264,   265,   266,   267,   268,
-     269,   270,   271,   272,   273,   274,   275,   276,   277,   278,
-     279,   280,   281,   282,   283,   284,   285,   286,   287,   288,
-     289,   290,   291,   292,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   293,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     294,   295,   296,   297,   298,     0,     0,     0,     0,     0,
-       0,     0,     0,   299,   300,   301,   302,   303,   304,   305,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   306,   307,   308,   309,   310,   311,     0,     0,
-       0,     0,     0,     0,     0,     0,   312,     0,   313,   314,
-     315,   316,   317,   318,   319,   320,   321,   322,   323,   324,
-     325,   326,   327,   328,   329,   330,   331,   332,   333,   334,
-     335,   336,   337,   338,   339,   340,   341,   342,   343,     1,
-       2,     3,     4,     5,     6,     7,     8,     9,    10,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
-      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
-      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
-      52,    53,    54,    55,    56,    57,    58,    59,    60,    61,
-      62,    63,    64,    65,    66,    67,    68,    69,    70,    71,
-      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
-      82,    83,    84,    85,    86,    87,    88,    89,    90,    91,
-      92,    93,    94,    95,    96,    97,    98,    99,   100,   101,
-     102,   103,   104,   105,   106,   107,   108,   109,   110,   111,
-     112,   113,   114,   115,   116,   117,   118,   119,   120,   121,
-     122,   123,   124,   125,   126,   127,   128,   129,   130,   131,
-     132,   133,   134,   135,   136,   137,   138,   139,   140,   141,
-     142,   143,   144,   145,   146,   147,   148,   149,   150,   151,
-     152,   153,   154,   155,   156,   157,   158,   159,   160,   161,
-     162,   163,   164,   165,   166,   167,   168,   169,   170,   171,
-     172,   173,   174,   175,   176,   177,   178,   179,   180,   181,
-     182,   183,   184,   185,   186,   187,   188,   189,   190,   191,
-     192,   193,   194,   195,   196,   197,   198,   199,   200,   201,
-     202,   203,   204,   205,   206,   207,   208,   209,   210,   211,
-     212,   213,   214,   215,   216,   217,   218,   219,   220,   221,
-     222,   223,   224,   225,   226,   227,   228,   229,   230,   231,
-     232,   233,   234,   235,   236,   237,   238,   239,   240,   241,
-     242,   243,   244,   245,   246,   247,   248,   249,   250,   251,
-     252,   253,   254,   255,   256,   257,   258,   259,   260,   261,
-     262,   263,   264,   265,   266,   267,   268,   269,   270,   271,
-     272,   273,   274,   275,   276,   277,   278,   279,   280,   281,
-     282,   283,   284,   285,   286,   287,   288,   289,   290,   291,
-     292,     0,     0,   422,   423,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   424,   425,     0,   486,     0,   487,   488,     0,
-       0,     0,     0,   489,   426,   427,   428,   429,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   294,   295,   296,
-     297,   298,     0,     0,     0,   430,   431,   432,   433,   434,
-     299,   300,   301,   302,   303,   304,   305,   490,   491,   492,
-     493,     0,   494,   495,   496,   497,   498,   499,   500,   306,
-     307,   308,   309,   310,   311,   435,   436,   437,   438,   439,
-     440,   441,   442,   312,   501,   313,   314,   315,   316,   317,
-     318,   319,   320,   321,   322,   323,   324,   325,   326,   327,
-     328,   329,   330,   331,   332,   333,   334,   335,   336,   337,
-     338,   339,   340,   341,   342,   343,     1,     2,     3,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
-      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
-      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
-      55,    56,    57,    58,    59,    60,    61,    62,    63,    64,
-      65,    66,    67,    68,    69,    70,    71,    72,    73,    74,
-      75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
-      85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
-      95,    96,    97,    98,    99,   100,   101,   102,   103,   104,
-     105,   106,   107,   108,   109,   110,   111,   112,   113,   114,
-     115,   116,   117,   118,   119,   120,   121,   122,   123,   124,
-     125,   126,   127,   128,   129,   130,   131,   132,   133,   134,
-     135,   136,   137,   138,   139,   140,   141,   142,   143,   144,
-     145,   146,   147,   148,   149,   150,   151,   152,   153,   154,
-     155,   156,   157,   158,   159,   160,   161,   162,   163,   164,
-     165,   166,   167,   168,   169,   170,   171,   172,   173,   174,
-     175,   176,   177,   178,   179,   180,   181,   182,   183,   184,
-     185,   186,   187,   188,   189,   190,   191,   192,   193,   194,
-     195,   196,   197,   198,   199,   200,   201,   202,   203,   204,
-     205,   206,   207,   208,   209,   210,   211,   212,   213,   214,
-     215,   216,   217,   218,   219,   220,   221,   222,   223,   224,
-     225,   226,   227,   228,   229,   230,   231,   232,   233,   234,
-     235,   236,   237,   238,   239,   240,   241,   242,   243,   244,
-     245,   246,   247,   248,   249,   250,   251,   252,   253,   254,
-     255,   256,   257,   258,   259,   260,   261,   262,   263,   264,
-     265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
-     275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
-     285,   286,   287,   288,   289,   290,   291,   292,     0,     0,
-     422,   423,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   424,
-     425,     0,   486,     0,   487,   617,     0,     0,     0,     0,
-     489,   426,   427,   428,   429,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   294,   295,   296,   297,   298,     0,
-       0,     0,   430,   431,   432,   433,   434,   299,   300,   301,
-     302,   303,   304,   305,   490,   491,   492,   493,     0,   494,
-     495,   496,   497,   498,   499,   500,   306,   307,   308,   309,
-     310,   311,   435,   436,   437,   438,   439,   440,   441,   442,
-     312,   501,   313,   314,   315,   316,   317,   318,   319,   320,
-     321,   322,   323,   324,   325,   326,   327,   328,   329,   330,
-     331,   332,   333,   334,   335,   336,   337,   338,   339,   340,
-     341,   342,   343,     1,     2,     3,     4,     5,     6,     7,
-       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
-      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
-      38,    39,    40,    41,    42,    43,    44,    45,    46,    47,
-      48,    49,    50,    51,    52,    53,    54,    55,    56,    57,
-      58,    59,    60,    61,    62,    63,    64,    65,    66,    67,
-      68,    69,    70,    71,    72,    73,    74,    75,    76,    77,
-      78,    79,    80,    81,    82,    83,    84,    85,    86,    87,
-      88,    89,    90,    91,    92,    93,    94,    95,    96,    97,
-      98,    99,   100,   101,   102,   103,   104,   105,   106,   107,
-     108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
-     118,   119,   120,   121,   122,   123,   124,   125,   126,   127,
-     128,   129,   130,   131,   132,   133,   134,   135,   136,   137,
-     138,   139,   140,   141,   142,   143,   144,   145,   146,   147,
-     148,   149,   150,   151,   152,   153,   154,   155,   156,   157,
-     158,   159,   160,   161,   162,   163,   164,   165,   166,   167,
-     168,   169,   170,   171,   172,   173,   174,   175,   176,   177,
-     178,   179,   180,   181,   182,   183,   184,   185,   186,   187,
-     188,   189,   190,   191,   192,   193,   194,   195,   196,   197,
-     198,   199,   200,   201,   202,   203,   204,   205,   206,   207,
-     208,   209,   210,   211,   212,   213,   214,   215,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,   234,   235,   236,   237,
-     238,   239,   240,   241,   242,   243,   244,   245,   246,   247,
-     248,   249,   250,   251,   252,   253,   254,   255,   256,   257,
-     258,   259,   260,   261,   262,   263,   264,   265,   266,   267,
-     268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
-     278,   279,   280,   281,   282,   283,   284,   285,   286,   287,
-     288,   289,   290,   291,   292,     0,     0,   422,   423,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   424,   425,     0,   486,
-       0,   487,     0,     0,     0,     0,     0,   489,   426,   427,
-     428,   429,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   294,   295,   296,   297,   298,     0,     0,     0,   430,
-     431,   432,   433,   434,   299,   300,   301,   302,   303,   304,
-     305,   490,   491,   492,   493,     0,   494,   495,   496,   497,
-     498,   499,   500,   306,   307,   308,   309,   310,   311,   435,
-     436,   437,   438,   439,   440,   441,   442,   312,   501,   313,
-     314,   315,   316,   317,   318,   319,   320,   321,   322,   323,
-     324,   325,   326,   327,   328,   329,   330,   331,   332,   333,
-     334,   335,   336,   337,   338,   339,   340,   341,   342,   343,
+     292,   293,   294,   295,   296,   297,   298,   299,   300,   301,
+     302,   303,   304,   305,   306,   307,   308,   309,   310,   311,
+     312,   313,   314,   411,   564,   404,   646,   555,   650,   505,
+     652,   439,   583,   654,   391,   692,   607,   480,   596,   597,
+     715,   506,   437,   400,   427,   565,   566,   488,   411,   507,
+     395,   438,   399,   489,   404,   408,   427,   506,   551,   553,
+     421,   405,   573,   552,   557,   -35,   392,   567,   715,   412,
+     382,   568,   608,   482,   598,   599,   396,   383,   382,   366,
+     418,   368,   321,   397,   422,   506,   382,   326,   327,   585,
+     405,   490,   651,   413,   405,   570,   623,   491,   625,   382,
+     657,   571,   420,   382,   694,   722,   643,   440,   611,   483,
+     441,   643,   425,   442,   560,   723,   756,   561,   382,   711,
+     534,   643,   643,   712,   430,   643,   411,   702,   644,   533,
+     600,   601,   583,   675,   676,   677,   678,   435,   482,   665,
+     482,   555,   666,   555,   659,   436,   555,   631,   632,   633,
+     634,   635,   636,   637,   638,   639,   640,   427,   643,   665,
+     661,   697,   707,   317,   318,   319,   481,   641,   589,   590,
+     591,   592,   578,   593,   483,   760,   483,   703,   646,   704,
+     725,   382,   487,   382,   559,   382,   594,   595,   643,   699,
+     643,   726,   671,   672,   569,   673,   674,   696,   679,   680,
+     574,   698,   664,   583,   506,   579,   588,   602,   603,   604,
+     605,   606,   482,   609,   612,   615,   613,   616,   619,   617,
+     755,   620,   624,   621,   626,   730,   656,   627,   -36,   628,
+     534,   700,   701,   -34,   660,   629,   630,   -29,   482,   533,
+     555,   688,   689,   706,   643,   710,   646,   718,   483,   728,
+     731,   732,   733,  -558,   743,   750,   744,   382,   749,   509,
+     754,   762,   763,   681,   709,   682,   685,   683,   727,   684,
+     714,   587,   686,   390,   483,   751,   663,   708,   719,   752,
+     758,   720,   759,   382,   734,   647,   729,   417,   648,   649,
+       0,   432,     0,   555,   433,     0,   434,     0,   714,     0,
+     431,     0,     0,     0,   534,     0,     0,     0,   534,   482,
+     748,     0,   585,   533,     0,   742,     0,   533,     0,     0,
+       0,     0,     0,     0,     0,     0,   757,     0,     0,     0,
+       0,     0,     0,   555,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   483,     0,   716,     0,     0,
+       0,     0,     0,     0,   382,     0,     0,     0,     0,     0,
+     411,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   716,     0,     0,     0,     0,
+       0,     0,   534,   534,     0,   534,     0,     0,     0,     0,
+       0,   533,   533,     0,   533,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   412,     0,     0,     0,
+       0,   534,     0,     0,     0,   382,     0,     0,     0,     0,
+     533,     0,   534,     0,     0,     0,     0,     0,     0,   534,
+       0,   533,     0,     0,     0,     0,     0,     0,   533,     0,
+     534,     0,     0,     0,   534,     0,     0,     0,     0,   533,
+     534,     0,     0,   533,     0,     0,     0,   416,     0,   533,
        1,     2,     3,     4,     5,     6,     7,     8,     9,    10,
       11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
       21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
@@ -1683,1021 +1702,22 @@
      261,   262,   263,   264,   265,   266,   267,   268,   269,   270,
      271,   272,   273,   274,   275,   276,   277,   278,   279,   280,
      281,   282,   283,   284,   285,   286,   287,   288,   289,   290,
-     291,   292,     0,     0,   422,   423,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   424,   425,     0,   486,     0,   408,     0,
-       0,     0,     0,     0,   489,   426,   427,   428,   429,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   294,   295,
-     296,   297,   298,     0,     0,     0,   430,   431,   432,   433,
-     434,   299,   300,   301,   302,   303,   304,   305,   490,   491,
-     492,   493,     0,   494,   495,   496,   497,   498,   499,   500,
-     306,   307,   308,   309,   310,   311,   435,   436,   437,   438,
-     439,   440,   441,   442,   312,   501,   313,   314,   315,   316,
-     317,   318,   319,   320,   321,   322,   323,   324,   325,   326,
-     327,   328,   329,   330,   331,   332,   333,   334,   335,   336,
-     337,   338,   339,   340,   341,   342,   343,     1,     2,     3,
-       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
-      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,    55,    56,    57,    58,    59,    60,    61,    62,    63,
-      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
-      74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
-      84,    85,    86,    87,    88,    89,    90,    91,    92,    93,
-      94,    95,    96,    97,    98,    99,   100,   101,   102,   103,
-     104,   105,   106,   107,   108,   109,   110,   111,   112,   113,
-     114,   115,   116,   117,   118,   119,   120,   121,   122,   123,
-     124,   125,   126,   127,   128,   129,   130,   131,   132,   133,
-     134,   135,   136,   137,   138,   139,   140,   141,   142,   143,
-     144,   145,   146,   147,   148,   149,   150,   151,   152,   153,
-     154,   155,   156,   157,   158,   159,   160,   161,   162,   163,
-     164,   165,   166,   167,   168,   169,   170,   171,   172,   173,
-     174,   175,   176,   177,   178,   179,   180,   181,   182,   183,
-     184,   185,   186,   187,   188,   189,   190,   191,   192,   193,
-     194,   195,   196,   197,   198,   199,   200,   201,   202,   203,
-     204,   205,   206,   207,   208,   209,   210,   211,   212,   213,
-     214,   215,   216,   217,   218,   219,   220,   221,   222,   223,
-     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
-     234,   235,   236,   237,   238,   239,   240,   241,   242,   243,
-     244,   245,   246,   247,   248,   249,   250,   251,   252,   253,
-     254,   255,   256,   257,   258,   259,   260,   261,   262,   263,
-     264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
-     274,   275,   276,   277,   278,   279,   280,   281,   282,   283,
-     284,   285,   286,   287,   288,   289,   290,   291,   292,     0,
-       0,   422,   423,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     424,   425,     0,   486,     0,     0,     0,     0,     0,     0,
-       0,   489,   426,   427,   428,   429,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   294,   295,   296,   297,   298,
-       0,     0,     0,   430,   431,   432,   433,   434,   299,   300,
-     301,   302,   303,   304,   305,   490,   491,   492,   493,     0,
-     494,   495,   496,   497,   498,   499,   500,   306,   307,   308,
-     309,   310,   311,   435,   436,   437,   438,   439,   440,   441,
-     442,   312,   501,   313,   314,   315,   316,   317,   318,   319,
-     320,   321,   322,   323,   324,   325,   326,   327,   328,   329,
-     330,   331,   332,   333,   334,   335,   336,   337,   338,   339,
-     340,   341,   342,   343,     1,     2,     3,     4,     5,     6,
-       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
-      37,    38,    39,    40,    41,    42,    43,    44,    45,    46,
-      47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
-      57,    58,    59,    60,    61,    62,    63,    64,    65,    66,
-      67,    68,    69,    70,    71,    72,    73,    74,    75,    76,
-      77,    78,    79,    80,    81,    82,    83,    84,    85,    86,
-      87,    88,    89,    90,    91,    92,    93,    94,    95,    96,
-      97,    98,    99,   100,   101,   102,   103,   104,   105,   106,
-     107,   108,   109,   110,   111,   112,   113,   114,   115,   116,
-     117,   118,   119,   120,   121,   122,   123,   124,   125,   126,
-     127,   128,   129,   130,   131,   132,   133,   134,   135,   136,
-     137,   138,   139,   140,   141,   142,   143,   144,   145,   146,
-     147,   148,   149,   150,   151,   152,   153,   154,   155,   156,
-     157,   158,   159,   160,   161,   162,   163,   164,   165,   166,
-     167,   168,   169,   170,   171,   172,   173,   174,   175,   176,
-     177,   178,   179,   180,   181,   182,   183,   184,   185,   186,
-     187,   188,   189,   190,   191,   192,   193,   194,   195,   196,
-     197,   198,   199,   200,   201,   202,   203,   204,   205,   206,
-     207,   208,   209,   210,   211,   212,   213,   214,   215,   216,
-     217,   218,   219,   220,   221,   222,   223,   224,   225,   226,
-     227,   228,   229,   230,   231,   232,   233,   234,   235,   236,
-     237,   238,   239,   240,   241,   242,   243,   244,   245,   246,
-     247,   248,   249,   250,   251,   252,   253,   254,   255,   256,
-     257,   258,   259,   260,   261,   262,   263,   264,   265,   266,
-     267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
-     277,   278,   279,   280,   281,   282,   283,   284,   285,   286,
-     287,   288,   289,   290,   291,   292,     0,     0,   422,   423,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   424,   425,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   489,   426,
-     427,   428,   429,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   294,   295,   296,   297,   298,     0,     0,     0,
-     430,   431,   432,   433,   434,   299,   300,   301,   302,   303,
-     304,   305,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   306,   307,   308,   309,   310,   311,
-     435,   436,   437,   438,   439,   440,   441,   442,   312,     0,
-     313,   314,   315,   316,   317,   318,   319,   320,   321,   322,
-     323,   324,   325,   326,   327,   328,   329,   330,   331,   332,
-     333,   334,   335,   336,   337,   338,   339,   340,   341,   342,
-     343,     1,     2,     3,     4,     5,     6,     7,     8,     9,
-      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,    25,    26,    27,    28,    29,
-      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
-      40,    41,    42,    43,    44,    45,    46,    47,    48,    49,
-      50,    51,    52,    53,    54,    55,    56,    57,    58,    59,
-      60,    61,    62,    63,    64,    65,    66,    67,    68,    69,
-      70,    71,    72,    73,    74,    75,    76,    77,    78,    79,
-      80,    81,    82,    83,    84,    85,    86,    87,    88,    89,
-      90,    91,    92,    93,    94,    95,    96,    97,    98,    99,
-     100,   101,   102,   103,   104,   105,   106,   107,   108,   109,
-     110,   111,   112,   113,   114,   115,   116,   117,   118,   119,
-     120,   121,   122,   123,   124,   125,   126,   127,   128,   129,
-     130,   131,   132,   133,   134,   135,   136,   137,   138,   139,
-     140,   141,   142,   143,   144,   145,   146,   147,   148,   149,
-     150,   151,   152,   153,   154,   155,   156,   157,   158,   159,
-     160,   161,   162,   163,   164,   165,   166,   167,   168,   169,
-     170,   171,   172,   173,   174,   175,   176,   177,   178,   179,
-     180,   181,   182,   183,   184,   185,   186,   187,   188,   189,
-     190,   191,   192,   193,   194,   195,   196,   197,   198,   199,
-     200,   201,   202,   203,   204,   205,   206,   207,   208,   209,
-     210,   211,   212,   213,   214,   215,   216,   217,   218,   219,
-     220,   221,   222,   223,   224,   225,   226,   227,   228,   229,
-     230,   231,   232,   233,   234,   235,   236,   237,   238,   239,
-     240,   241,   242,   243,   244,   245,   246,   247,   248,   249,
-     250,   251,   252,   253,   254,   255,   256,   257,   258,   259,
-     260,   261,   262,   263,   264,   265,   266,   267,   268,   269,
-     270,   271,   272,   273,   274,   275,   276,   277,   278,   279,
-     280,   281,   282,   283,   284,   285,   286,   287,   288,   289,
-     290,   291,   292,     0,     0,   422,   423,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   424,   425,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   426,   427,   428,   429,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   294,
-     295,   296,   297,     0,     0,     0,     0,   430,   431,   432,
-     433,   434,   299,   300,   301,   302,   303,   304,   305,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   306,   307,   308,   309,   310,   311,   435,   436,   437,
-     438,   439,   440,   441,   442,   312,     0,   313,   314,   315,
-     316,   317,   318,   319,   320,   321,   322,   323,   324,   325,
-     326,   327,   328,   329,   330,   331,   332,   333,   334,   335,
-     336,   337,   338,   339,   340,   341,   342,   343,     1,     2,
-       3,     4,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
-      33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
-      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
-      53,    54,    55,    56,    57,    58,    59,    60,    61,    62,
-      63,    64,    65,    66,    67,    68,    69,    70,    71,    72,
-      73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
-      83,    84,    85,    86,    87,    88,    89,    90,    91,    92,
-      93,    94,    95,    96,    97,    98,    99,   100,   101,   102,
-     103,   104,   105,   106,   107,   108,   109,   110,   111,   112,
-     113,   114,   115,   116,   117,   118,   119,   120,   121,   122,
-     123,   124,   125,   126,   127,   128,   129,   130,   131,   132,
-     133,   134,   135,   136,   137,   138,   139,   140,   141,   142,
-     143,   144,   145,   146,   147,   148,   149,   150,   151,   152,
-     153,   154,   155,   156,   157,   158,   159,   160,   161,   162,
-     163,   164,   165,   166,   167,   168,   169,   170,   171,   172,
-     173,   174,   175,   176,   177,   178,   179,   180,   181,   182,
-     183,   184,   185,   186,   187,   188,   189,   190,   191,   192,
-     193,   194,   195,   196,   197,   198,   199,   200,   201,   202,
-     203,   204,   205,   206,   207,   208,   209,   210,   211,   212,
-     213,   214,   215,   216,   217,   218,   219,   220,   221,   222,
-     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
-     233,   234,   235,   236,   237,   238,   239,   240,   241,   242,
-     243,   244,   245,   246,   247,   248,   249,   250,   251,   252,
-     253,   254,   255,   256,   257,   258,   259,   260,   261,   262,
-     263,   264,   265,   266,   267,   268,   269,   270,   271,   272,
-     273,   274,   275,   276,   277,   278,   279,   280,   281,   282,
-     283,   284,   285,   286,   287,   288,   289,   290,   291,   292,
+     291,   292,   293,   294,   295,   296,   297,   298,   299,   300,
+     301,   302,   303,   304,   305,   306,   307,   308,   309,   310,
+     311,   312,   313,   314,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   315,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   293,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   294,   295,   296,   297,
-     298,     0,     0,     0,     0,     0,     0,     0,     0,   299,
-     300,   301,   302,   303,   304,   305,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   306,   307,
-     308,   309,   310,   311,     0,     0,     0,     0,     0,     0,
-       0,     0,   312,     0,   313,   314,   315,   316,   317,   318,
-     319,   320,   321,   322,   323,   324,   325,   326,   327,   328,
-     329,   330,   331,   332,   333,   334,   335,   336,   337,   338,
-     339,   340,   341,   342,   343,     1,     2,     3,     4,     5,
-       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
-      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
-      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
-      56,    57,    58,    59,    60,    61,    62,    63,    64,    65,
-      66,    67,    68,    69,    70,    71,    72,    73,    74,    75,
-      76,    77,    78,    79,    80,    81,    82,    83,    84,    85,
-      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
-      96,    97,    98,    99,   100,   101,   102,   103,   104,   105,
-     106,   107,   108,   109,   110,   111,   112,   113,   114,   115,
-     116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
-     126,   127,   128,   129,   130,   131,   132,   133,   134,   135,
-     136,   137,   138,   139,   140,   141,   142,   143,   144,   145,
-     146,   147,   148,   149,   150,   151,   152,   153,   154,   155,
-     156,   157,   158,   159,   160,   161,   162,   163,   164,   165,
-     166,   167,   168,   169,   170,   171,   172,   173,   174,   175,
-     176,   177,   178,   179,   180,   181,   182,   183,   184,   185,
-     186,   187,   188,   189,   190,   191,   192,   193,   194,   195,
-     196,   197,   198,   199,   200,   201,   202,   203,   204,   205,
-     206,   207,   208,   209,   210,   211,   212,   213,   214,   215,
-     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,
-     226,   227,   228,   229,   230,   231,   232,   233,   234,   235,
-     236,   237,   238,   239,   240,   241,   242,   243,   244,   245,
-     246,   247,   248,   249,   250,   251,   252,   253,   254,   255,
-     256,   257,   258,   259,   260,   261,   262,   263,   264,   265,
-     266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
-     276,   277,   278,   279,   280,   281,   282,   283,   284,   285,
-     286,   287,   288,   289,   290,   291,   292,     0,     0,     0,
+     316,   317,   318,   319,   320,     0,     0,     0,     0,     0,
+       0,     0,     0,   321,   322,   323,   324,   325,   326,   327,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   387,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   294,   295,   296,   297,     0,     0,     0,
-       0,     0,     0,     0,     0,   388,   299,   300,   301,   302,
-     303,   304,   305,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   306,   307,   308,   309,   310,
-     311,     0,     0,     0,     0,     0,     0,     0,     0,   312,
-       0,   313,   314,   315,   316,   317,   318,   319,   320,   321,
-     322,   323,   324,   325,   326,   327,   328,   329,   330,   331,
-     332,   333,   334,   335,   336,   337,   338,   339,   340,   341,
-     342,   343,     1,     2,     3,     4,     5,     6,     7,     8,
-       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
-      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
-      39,    40,    41,    42,    43,    44,    45,    46,    47,    48,
-      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
-      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
-      69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
-      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
-      89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
-      99,   100,   101,   102,   103,   104,   105,   106,   107,   108,
-     109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
-     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
-     129,   130,   131,   132,   133,   134,   135,   136,   137,   138,
-     139,   140,   141,   142,   143,   144,   145,   146,   147,   148,
-     149,   150,   151,   152,   153,   154,   155,   156,   157,   158,
-     159,   160,   161,   162,   163,   164,   165,   166,   167,   168,
-     169,   170,   171,   172,   173,   174,   175,   176,   177,   178,
-     179,   180,   181,   182,   183,   184,   185,   186,   187,   188,
-     189,   190,   191,   192,   193,   194,   195,   196,   197,   198,
-     199,   200,   201,   202,   203,   204,   205,   206,   207,   208,
-     209,   210,   211,   212,   213,   214,   215,   216,   217,   218,
-     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
-     229,   230,   231,   232,   233,   234,   235,   236,   237,   238,
-     239,   240,   241,   242,   243,   244,   245,   246,   247,   248,
-     249,   250,   251,   252,   253,   254,   255,   256,   257,   258,
-     259,   260,   261,   262,   263,   264,   265,   266,   267,   268,
-     269,   270,   271,   272,   273,   274,   275,   276,   277,   278,
-     279,   280,   281,   282,   283,   284,   285,   286,   287,   288,
-     289,   290,   291,   292,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   557,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     294,   295,   296,   297,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   299,   300,   301,   302,   303,   304,   305,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   306,   307,   308,   309,   310,   311,     0,     0,
-       0,     0,     0,     0,     0,     0,   312,     0,   313,   314,
-     315,   316,   317,   318,   319,   320,   321,   322,   323,   324,
-     325,   326,   327,   328,   329,   330,   331,   332,   333,   334,
-     335,   336,   337,   338,   339,   340,   341,   342,   343,     1,
-       2,     3,     4,     5,     6,     7,     8,     9,    10,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
-      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
-      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
-      52,    53,    54,    55,    56,    57,    58,    59,    60,    61,
-      62,    63,    64,    65,    66,    67,    68,    69,    70,    71,
-      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
-      82,    83,    84,    85,    86,    87,    88,    89,    90,    91,
-      92,    93,    94,    95,    96,    97,    98,    99,   100,   101,
-     102,   103,   104,   105,   106,   107,   108,   109,   110,   111,
-     112,   113,   114,   115,   116,   117,   118,   119,   120,   121,
-     122,   123,   124,   125,   126,   127,   128,   129,   130,   131,
-     132,   133,   134,   135,   136,   137,   138,   139,   140,   141,
-     142,   143,   144,   145,   146,   147,   148,   149,   150,   151,
-     152,   153,   154,   155,   156,   157,   158,   159,   160,   161,
-     162,   163,   164,   165,   166,   167,   168,   169,   170,   171,
-     172,   173,   174,   175,   176,   177,   178,   179,   180,   181,
-     182,   183,   184,   185,   186,   187,   188,   189,   190,   191,
-     192,   193,   194,   195,   196,   197,   198,   199,   200,   201,
-     202,   203,   204,   205,   206,   207,   208,   209,   210,   211,
-     212,   213,   214,   215,   216,   217,   218,   219,   220,   221,
-     222,   223,   224,   225,   226,   227,   228,   229,   230,   231,
-     232,   233,   234,   235,   236,   237,   238,   239,   240,   241,
-     242,   243,   244,   245,   246,   247,   248,   249,   250,   251,
-     252,   253,   254,   255,   256,   257,   258,   259,   260,   261,
-     262,   263,   264,   265,   266,   267,   268,   269,   270,   271,
-     272,   273,   274,   275,   276,   277,   278,   279,   280,   281,
-     282,   283,   284,   285,   286,   287,   288,   289,   290,   291,
-     292,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   639,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   294,   295,   296,
-     297,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     299,   300,   301,   302,   303,   304,   305,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   306,
-     307,   308,   309,   310,   311,     0,     0,     0,     0,     0,
-       0,     0,     0,   312,     0,   313,   314,   315,   316,   317,
-     318,   319,   320,   321,   322,   323,   324,   325,   326,   327,
-     328,   329,   330,   331,   332,   333,   334,   335,   336,   337,
-     338,   339,   340,   341,   342,   343,     1,     2,     3,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
-      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
-      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
-      55,    56,    57,    58,    59,    60,    61,    62,    63,    64,
-      65,    66,    67,    68,    69,    70,    71,    72,    73,    74,
-      75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
-      85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
-      95,    96,    97,    98,    99,   100,   101,   102,   103,   104,
-     105,   106,   107,   108,   109,   110,   111,   112,   113,   114,
-     115,   116,   117,   118,   119,   120,   121,   122,   123,   124,
-     125,   126,   127,   128,   129,   130,   131,   132,   133,   134,
-     135,   136,   137,   138,   139,   140,   141,   142,   143,   144,
-     145,   146,   147,   148,   149,   150,   151,   152,   153,   154,
-     155,   156,   157,   158,   159,   160,   161,   162,   163,   164,
-     165,   166,   167,   168,   169,   170,   171,   172,   173,   174,
-     175,   176,   177,   178,   179,   180,   181,   182,   183,   184,
-     185,   186,   187,   188,   189,   190,   191,   192,   193,   194,
-     195,   196,   197,   198,   199,   200,   201,   202,   203,   204,
-     205,   206,   207,   208,   209,   210,   211,   212,   213,   214,
-     215,   216,   217,   218,   219,   220,   221,   222,   223,   224,
-     225,   226,   227,   228,   229,   230,   231,   232,   233,   234,
-     235,   236,   237,   238,   239,   240,   241,   242,   243,   244,
-     245,   246,   247,   248,   249,   250,   251,   252,   253,   254,
-     255,   256,   257,   258,   259,   260,   261,   262,   263,   264,
-     265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
-     275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
-     285,   286,   287,   288,   289,   290,   291,   292,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   677,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   294,   295,   296,   297,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   299,   300,   301,
-     302,   303,   304,   305,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   306,   307,   308,   309,
-     310,   311,     0,     0,     0,     0,     0,     0,     0,     0,
-     312,     0,   313,   314,   315,   316,   317,   318,   319,   320,
-     321,   322,   323,   324,   325,   326,   327,   328,   329,   330,
-     331,   332,   333,   334,   335,   336,   337,   338,   339,   340,
-     341,   342,   343,     1,     2,     3,     4,     5,     6,     7,
-       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
-      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
-      38,    39,    40,    41,    42,    43,    44,    45,    46,    47,
-      48,    49,    50,    51,    52,    53,    54,    55,    56,    57,
-      58,    59,    60,    61,    62,    63,    64,    65,    66,    67,
-      68,    69,    70,    71,    72,    73,    74,    75,    76,    77,
-      78,    79,    80,    81,    82,    83,    84,    85,    86,    87,
-      88,    89,    90,    91,    92,    93,    94,    95,    96,    97,
-      98,    99,   100,   101,   102,   103,   104,   105,   106,   107,
-     108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
-     118,   119,   120,   121,   122,   123,   124,   125,   126,   127,
-     128,   129,   130,   131,   132,   133,   134,   135,   136,   137,
-     138,   139,   140,   141,   142,   143,   144,   145,   146,   147,
-     148,   149,   150,   151,   152,   153,   154,   155,   156,   157,
-     158,   159,   160,   161,   162,   163,   164,   165,   166,   167,
-     168,   169,   170,   171,   172,   173,   174,   175,   176,   177,
-     178,   179,   180,   181,   182,   183,   184,   185,   186,   187,
-     188,   189,   190,   191,   192,   193,   194,   195,   196,   197,
-     198,   199,   200,   201,   202,   203,   204,   205,   206,   207,
-     208,   209,   210,   211,   212,   213,   214,   215,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,   234,   235,   236,   237,
-     238,   239,   240,   241,   242,   243,   244,   245,   246,   247,
-     248,   249,   250,   251,   252,   253,   254,   255,   256,   257,
-     258,   259,   260,   261,   262,   263,   264,   265,   266,   267,
-     268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
-     278,   279,   280,   281,   282,   283,   284,   285,   286,   287,
-     288,   289,   290,   291,   292,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   294,   295,   296,   297,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   299,   300,   301,   302,   303,   304,
-     305,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   306,   307,   308,   309,   310,   311,     0,
-       0,     0,     0,     0,     0,     0,     0,   312,     0,   313,
-     314,   315,   316,   317,   318,   319,   320,   321,   322,   323,
-     324,   325,   326,   327,   328,   329,   330,   331,   332,   333,
-     334,   335,   336,   337,   338,   339,   340,   341,   342,   343,
-       2,     3,     4,     5,     6,     7,     8,     9,    10,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
-      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
-      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
-      52,    53,    54,    55,    56,    57,    58,     0,     0,    61,
-      62,    63,    64,    65,    66,    67,    68,    69,    70,    71,
-      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
-      82,    83,    84,    85,    86,    87,    88,    89,    90,    91,
-      92,    93,    94,    95,    96,    97,    98,    99,   100,   101,
-     102,   103,   104,   105,   106,   107,   108,   109,   110,   111,
-     112,   113,   114,   115,   116,   117,   118,   119,   120,   121,
-     122,   123,   124,   125,   126,   127,   128,   129,   130,   131,
-     132,   133,   134,   135,   136,   137,   138,   139,   140,   141,
-     142,   143,   144,   145,   146,   147,   148,   149,   150,   151,
-     152,   153,   154,   155,   156,   157,   158,   159,   160,   161,
-     162,   163,   164,   165,   166,   167,   168,   169,   170,   171,
-     172,   173,   174,   175,   176,   177,   178,   179,   180,   181,
-     182,   183,   184,   185,   186,   187,   188,   189,   190,   191,
-     192,   193,   194,   195,   196,   197,   198,   199,   200,   201,
-     202,   203,   204,   205,   206,   207,   208,   209,   210,   211,
-     212,   213,   214,   215,   216,   217,   218,   219,   220,   221,
-     222,   223,   224,   225,   226,   227,   228,   229,   230,   231,
-     232,   233,   234,   235,   236,   237,   238,   239,   240,   241,
-     242,   243,   244,   245,   246,   247,   248,   249,   250,   251,
-     252,   253,   254,   255,   256,   257,   258,   259,   260,   261,
-     262,   263,   264,   265,   266,   267,   268,   269,   270,   271,
-     272,   273,   274,   275,   276,   277,   278,   279,   280,   281,
-     282,   283,   284,   285,   286,   287,   288,   289,   290,   291,
-     292,     0,     0,   422,   423,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   424,   425,     0,     0,     0,   529,   696,     0,
-       0,     0,     0,     0,   426,   427,   428,   429,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   430,   431,   432,   433,   434,
-     299,     0,     0,     0,     0,   304,   305,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   435,   436,   437,   438,   439,
-     440,   441,   442,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   325,     2,     3,
-       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
-      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,    55,    56,    57,    58,     0,     0,    61,    62,    63,
-      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
-      74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
-      84,    85,    86,    87,    88,    89,    90,    91,    92,    93,
-      94,    95,    96,    97,    98,    99,   100,   101,   102,   103,
-     104,   105,   106,   107,   108,   109,   110,   111,   112,   113,
-     114,   115,   116,   117,   118,   119,   120,   121,   122,   123,
-     124,   125,   126,   127,   128,   129,   130,   131,   132,   133,
-     134,   135,   136,   137,   138,   139,   140,   141,   142,   143,
-     144,   145,   146,   147,   148,   149,   150,   151,   152,   153,
-     154,   155,   156,   157,   158,   159,   160,   161,   162,   163,
-     164,   165,   166,   167,   168,   169,   170,   171,   172,   173,
-     174,   175,   176,   177,   178,   179,   180,   181,   182,   183,
-     184,   185,   186,   187,   188,   189,   190,   191,   192,   193,
-     194,   195,   196,   197,   198,   199,   200,   201,   202,   203,
-     204,   205,   206,   207,   208,   209,   210,   211,   212,   213,
-     214,   215,   216,   217,   218,   219,   220,   221,   222,   223,
-     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
-     234,   235,   236,   237,   238,   239,   240,   241,   242,   243,
-     244,   245,   246,   247,   248,   249,   250,   251,   252,   253,
-     254,   255,   256,   257,   258,   259,   260,   261,   262,   263,
-     264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
-     274,   275,   276,   277,   278,   279,   280,   281,   282,   283,
-     284,   285,   286,   287,   288,   289,   290,   291,   292,     0,
-       0,   422,   423,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     424,   425,     0,     0,   470,     0,     0,     0,     0,     0,
-       0,     0,   426,   427,   428,   429,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   430,   431,   432,   433,   434,   299,     0,
-       0,     0,     0,   304,   305,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   435,   436,   437,   438,   439,   440,   441,
-     442,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   325,     2,     3,     4,     5,
-       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
-      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
-      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
-      56,    57,    58,     0,     0,    61,    62,    63,    64,    65,
-      66,    67,    68,    69,    70,    71,    72,    73,    74,    75,
-      76,    77,    78,    79,    80,    81,    82,    83,    84,    85,
-      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
-      96,    97,    98,    99,   100,   101,   102,   103,   104,   105,
-     106,   107,   108,   109,   110,   111,   112,   113,   114,   115,
-     116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
-     126,   127,   128,   129,   130,   131,   132,   133,   134,   135,
-     136,   137,   138,   139,   140,   141,   142,   143,   144,   145,
-     146,   147,   148,   149,   150,   151,   152,   153,   154,   155,
-     156,   157,   158,   159,   160,   161,   162,   163,   164,   165,
-     166,   167,   168,   169,   170,   171,   172,   173,   174,   175,
-     176,   177,   178,   179,   180,   181,   182,   183,   184,   185,
-     186,   187,   188,   189,   190,   191,   192,   193,   194,   195,
-     196,   197,   198,   199,   200,   201,   202,   203,   204,   205,
-     206,   207,   208,   209,   210,   211,   212,   213,   214,   215,
-     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,
-     226,   227,   228,   229,   230,   231,   232,   233,   234,   235,
-     236,   237,   238,   239,   240,   241,   242,   243,   244,   245,
-     246,   247,   248,   249,   250,   251,   252,   253,   254,   255,
-     256,   257,   258,   259,   260,   261,   262,   263,   264,   265,
-     266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
-     276,   277,   278,   279,   280,   281,   282,   283,   284,   285,
-     286,   287,   288,   289,   290,   291,   292,     0,     0,   422,
-     423,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   424,   425,
-       0,     0,     0,   529,     0,     0,     0,     0,     0,     0,
-     426,   427,   428,   429,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   430,   431,   432,   433,   434,   299,     0,     0,     0,
-       0,   304,   305,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   435,   436,   437,   438,   439,   440,   441,   442,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   325,     2,     3,     4,     5,     6,     7,
-       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
-      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
-      38,    39,    40,    41,    42,    43,    44,    45,    46,    47,
-      48,    49,    50,    51,    52,    53,    54,    55,    56,    57,
-      58,     0,     0,    61,    62,    63,    64,    65,    66,    67,
-      68,    69,    70,    71,    72,    73,    74,    75,    76,    77,
-      78,    79,    80,    81,    82,    83,    84,    85,    86,    87,
-      88,    89,    90,    91,    92,    93,    94,    95,    96,    97,
-      98,    99,   100,   101,   102,   103,   104,   105,   106,   107,
-     108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
-     118,   119,   120,   121,   122,   123,   124,   125,   126,   127,
-     128,   129,   130,   131,   132,   133,   134,   135,   136,   137,
-     138,   139,   140,   141,   142,   143,   144,   145,   146,   147,
-     148,   149,   150,   151,   152,   153,   154,   155,   156,   157,
-     158,   159,   160,   161,   162,   163,   164,   165,   166,   167,
-     168,   169,   170,   171,   172,   173,   174,   175,   176,   177,
-     178,   179,   180,   181,   182,   183,   184,   185,   186,   187,
-     188,   189,   190,   191,   192,   193,   194,   195,   196,   197,
-     198,   199,   200,   201,   202,   203,   204,   205,   206,   207,
-     208,   209,   210,   211,   212,   213,   214,   215,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,   234,   235,   236,   237,
-     238,   239,   240,   241,   242,   243,   244,   245,   246,   247,
-     248,   249,   250,   251,   252,   253,   254,   255,   256,   257,
-     258,   259,   260,   261,   262,   263,   264,   265,   266,   267,
-     268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
-     278,   279,   280,   281,   282,   283,   284,   285,   286,   287,
-     288,   289,   290,   291,   292,     0,     0,   422,   423,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   424,   425,     0,     0,
-     585,     0,     0,     0,     0,     0,     0,     0,   426,   427,
-     428,   429,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   430,
-     431,   432,   433,   434,   299,     0,     0,     0,     0,   304,
-     305,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   435,
-     436,   437,   438,   439,   440,   441,   442,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   325,     2,     3,     4,     5,     6,     7,     8,     9,
-      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,    25,    26,    27,    28,    29,
-      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
-      40,    41,    42,    43,    44,    45,    46,    47,    48,    49,
-      50,    51,    52,    53,    54,    55,    56,    57,    58,     0,
-       0,    61,    62,    63,    64,    65,    66,    67,    68,    69,
-      70,    71,    72,    73,    74,    75,    76,    77,    78,    79,
-      80,    81,    82,    83,    84,    85,    86,    87,    88,    89,
-      90,    91,    92,    93,    94,    95,    96,    97,    98,    99,
-     100,   101,   102,   103,   104,   105,   106,   107,   108,   109,
-     110,   111,   112,   113,   114,   115,   116,   117,   118,   119,
-     120,   121,   122,   123,   124,   125,   126,   127,   128,   129,
-     130,   131,   132,   133,   134,   135,   136,   137,   138,   139,
-     140,   141,   142,   143,   144,   145,   146,   147,   148,   149,
-     150,   151,   152,   153,   154,   155,   156,   157,   158,   159,
-     160,   161,   162,   163,   164,   165,   166,   167,   168,   169,
-     170,   171,   172,   173,   174,   175,   176,   177,   178,   179,
-     180,   181,   182,   183,   184,   185,   186,   187,   188,   189,
-     190,   191,   192,   193,   194,   195,   196,   197,   198,   199,
-     200,   201,   202,   203,   204,   205,   206,   207,   208,   209,
-     210,   211,   212,   213,   214,   215,   216,   217,   218,   219,
-     220,   221,   222,   223,   224,   225,   226,   227,   228,   229,
-     230,   231,   232,   233,   234,   235,   236,   237,   238,   239,
-     240,   241,   242,   243,   244,   245,   246,   247,   248,   249,
-     250,   251,   252,   253,   254,   255,   256,   257,   258,   259,
-     260,   261,   262,   263,   264,   265,   266,   267,   268,   269,
-     270,   271,   272,   273,   274,   275,   276,   277,   278,   279,
-     280,   281,   282,   283,   284,   285,   286,   287,   288,   289,
-     290,   291,   292,     0,     0,   422,   423,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   424,   425,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   597,   426,   427,   428,   429,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   430,   431,   432,
-     433,   434,   299,     0,     0,     0,     0,   304,   305,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   435,   436,   437,
-     438,   439,   440,   441,   442,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   325,
-       2,     3,     4,     5,     6,     7,     8,     9,    10,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
-      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
-      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
-      52,    53,    54,    55,    56,    57,    58,     0,     0,    61,
-      62,    63,    64,    65,    66,    67,    68,    69,    70,    71,
-      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
-      82,    83,    84,    85,    86,    87,    88,    89,    90,    91,
-      92,    93,    94,    95,    96,    97,    98,    99,   100,   101,
-     102,   103,   104,   105,   106,   107,   108,   109,   110,   111,
-     112,   113,   114,   115,   116,   117,   118,   119,   120,   121,
-     122,   123,   124,   125,   126,   127,   128,   129,   130,   131,
-     132,   133,   134,   135,   136,   137,   138,   139,   140,   141,
-     142,   143,   144,   145,   146,   147,   148,   149,   150,   151,
-     152,   153,   154,   155,   156,   157,   158,   159,   160,   161,
-     162,   163,   164,   165,   166,   167,   168,   169,   170,   171,
-     172,   173,   174,   175,   176,   177,   178,   179,   180,   181,
-     182,   183,   184,   185,   186,   187,   188,   189,   190,   191,
-     192,   193,   194,   195,   196,   197,   198,   199,   200,   201,
-     202,   203,   204,   205,   206,   207,   208,   209,   210,   211,
-     212,   213,   214,   215,   216,   217,   218,   219,   220,   221,
-     222,   223,   224,   225,   226,   227,   228,   229,   230,   231,
-     232,   233,   234,   235,   236,   237,   238,   239,   240,   241,
-     242,   243,   244,   245,   246,   247,   248,   249,   250,   251,
-     252,   253,   254,   255,   256,   257,   258,   259,   260,   261,
-     262,   263,   264,   265,   266,   267,   268,   269,   270,   271,
-     272,   273,   274,   275,   276,   277,   278,   279,   280,   281,
-     282,   283,   284,   285,   286,   287,   288,   289,   290,   291,
-     292,     0,     0,   422,   423,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   424,   425,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   426,   427,   428,   429,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   430,   431,   432,   433,   434,
-     299,     0,     0,     0,     0,   304,   305,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   435,   436,   437,   438,   439,
-     440,   441,   442,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   325,     2,     3,
-       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
-      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,    55,    56,    57,    58,     0,     0,    61,    62,    63,
-      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
-      74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
-      84,    85,    86,    87,    88,    89,    90,    91,    92,    93,
-      94,    95,    96,    97,    98,    99,   100,   101,   102,   103,
-     104,   105,   106,   107,   108,   109,   110,   111,   112,   113,
-     114,   115,   116,   117,   118,   119,   120,   121,   122,   123,
-     124,   125,   126,   127,   128,   129,   130,   131,   132,   133,
-     134,   135,   136,   137,   138,   139,   140,   141,   142,   143,
-     144,   145,   146,   147,   148,   149,   150,   151,   152,   153,
-     154,   155,   156,   157,   158,   159,   160,   161,   162,   163,
-     164,   165,   166,   167,   168,   169,   170,   171,   172,   173,
-     174,   175,   176,   177,   178,   179,   180,   181,   182,   183,
-     184,   185,   186,   187,   188,   189,   190,   191,   192,   193,
-     194,   195,   196,   197,   198,   199,   200,   201,   202,   203,
-     204,   205,   206,   207,   208,   209,   210,   211,   212,   213,
-     214,   215,   216,   217,   218,   219,   220,   221,   222,   223,
-     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
-     234,   235,   236,   237,   238,   239,   240,   241,   242,   243,
-     244,   245,   246,   247,   248,   249,   250,   251,   252,   253,
-     254,   255,   256,   257,   258,   259,   260,   261,   262,   263,
-     264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
-     274,   275,   276,   277,   278,   279,   280,   281,   282,   283,
-     284,   285,   286,   287,   288,   289,   290,   291,   292,   453,
-       0,   422,   423,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   471,     0,     0,     0,     0,     0,     0,
-     424,   425,     0,     0,     0,     0,     0,     0,     0,     0,
-     537,   538,   426,   427,   428,   429,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   430,   431,   432,   433,   434,   299,     0,
-       0,     0,   550,   304,   547,     0,     0,     0,     0,     0,
-       0,     0,     0,   471,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   435,   436,   437,   438,   439,   440,   441,
-     442,     0,   471,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   325,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   634,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   640,   641,   642,   471,   471,   471,   471,   471,
-     471,   471,   471,   471,   471,   471,   471,   471,   471,   471,
-     471,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     471
-};
-
-static const yytype_int16 yycheck[] =
-{
-       0,   324,     0,   317,     0,   319,   319,   319,   464,     0,
-     319,   319,   326,   336,   327,   327,   317,   326,   326,   317,
-       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
-      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,    55,    56,    57,    58,    59,    60,   533,   327,    63,
-      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
-      74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
-      84,    85,    86,    87,    88,    89,    90,    91,    92,    93,
-      94,    95,    96,    97,    98,    99,   100,   101,   102,   103,
-     104,   105,   106,   107,   108,   109,   110,   111,   112,   113,
-     114,   115,   116,   117,   118,   119,   120,   121,   122,   123,
-     124,   125,   126,   127,   128,   129,   130,   131,   132,   133,
-     134,   135,   136,   137,   138,   139,   140,   141,   142,   143,
-     144,   145,   146,   147,   148,   149,   150,   151,   152,   153,
-     154,   155,   156,   157,   158,   159,   160,   161,   162,   163,
-     164,   165,   166,   167,   168,   169,   170,   171,   172,   173,
-     174,   175,   176,   177,   178,   179,   180,   181,   182,   183,
-     184,   185,   186,   187,   188,   189,   190,   191,   192,   193,
-     194,   195,   196,   197,   198,   199,   200,   201,   202,   203,
-     204,   205,   206,   207,   208,   209,   210,   211,   212,   213,
-     214,   215,   216,   217,   218,   219,   220,   221,   222,   223,
-     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
-     234,   235,   236,   237,   238,   239,   240,   241,   242,   243,
-     244,   245,   246,   247,   248,   249,   250,   251,   252,   253,
-     254,   255,   256,   257,   258,   259,   260,   261,   262,   263,
-     264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
-     274,   275,   276,   277,   278,   279,   280,   281,   282,   283,
-     284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
-     294,   357,   349,   416,   425,   589,   527,   515,   529,   405,
-     321,   532,   462,   386,   353,   299,   300,   304,   665,   392,
-     295,   296,   319,   297,   298,   318,   382,   361,   327,   326,
-     364,   378,   366,   367,   324,   374,   370,   327,   451,   349,
-     413,   414,   353,   317,   324,   319,   693,   357,   349,   323,
-     397,   335,   336,   340,   353,   365,   357,   365,   368,   365,
-     354,   318,   301,   302,   365,   359,   360,   324,   378,   465,
-     320,   353,   382,   704,   324,   335,   497,   378,   499,   324,
-     711,   382,   327,   321,   318,   593,   324,   397,   484,   327,
-     324,   722,   321,   318,   318,   318,   397,   318,   408,   324,
-     324,   324,   623,   324,   460,   318,   322,   408,   324,   559,
-     324,   324,   353,   327,   527,   462,   529,   464,   329,   532,
-     331,   542,   321,   306,   307,   308,   309,   310,   311,   312,
-     313,   314,   315,   546,   571,   572,   573,   574,   324,   324,
-     325,   327,   726,   326,   324,   324,   353,   327,   327,   353,
-     460,   319,   462,   327,   464,   676,   664,   324,   325,   460,
-     326,   462,   353,   464,   342,   343,   344,   332,   333,   334,
-     567,   568,   575,   576,   595,   569,   570,   627,   599,   318,
-     317,   554,   353,   319,   353,   339,   533,   338,   337,   303,
-     305,   320,   319,   317,   322,   716,   327,   327,   317,   317,
-     317,   614,   615,   325,   327,   515,   327,   317,   317,   353,
-     623,   353,   559,   318,   515,   353,   320,   320,   324,   317,
-     361,   320,   322,   533,   732,   318,   317,   353,   318,   321,
-     326,   318,   533,   327,   577,   321,   321,   578,   659,   327,
-     365,   322,   579,   581,   665,   580,   582,   682,   382,   559,
-     382,   298,   467,   553,   637,   667,   710,   722,   559,   723,
-     667,   525,   378,   676,   376,   693,   525,   525,   365,   684,
-      -1,    -1,   693,    -1,    -1,    -1,    -1,    -1,    -1,   589,
-     627,    -1,    -1,   593,   705,   698,   682,    -1,   589,    -1,
-      -1,    -1,   593,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     721,    -1,    -1,   716,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   627,   665,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   627,    -1,    -1,    -1,
-      -1,    -1,   688,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   693,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   664,   665,    -1,   667,    -1,    -1,
-      -1,    -1,    -1,   664,   665,    -1,   667,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   688,    -1,
-      -1,    -1,    -1,   693,    -1,    -1,    -1,   688,    -1,    -1,
-      -1,    -1,   693,    -1,   704,    -1,    -1,    -1,    -1,    -1,
-      -1,   711,    -1,   704,    -1,    -1,    -1,    -1,    -1,    -1,
-     711,    -1,   722,    -1,    -1,    -1,   726,    -1,    -1,    -1,
-      -1,   722,   732,    -1,    -1,   726,    -1,    -1,    -1,     0,
-      -1,   732,     3,     4,     5,     6,     7,     8,     9,    10,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
-      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
-      41,    42,    43,    44,    45,    46,    47,    48,    49,    50,
-      51,    52,    53,    54,    55,    56,    57,    58,    59,    60,
-      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
-      71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
-      81,    82,    83,    84,    85,    86,    87,    88,    89,    90,
-      91,    92,    93,    94,    95,    96,    97,    98,    99,   100,
-     101,   102,   103,   104,   105,   106,   107,   108,   109,   110,
-     111,   112,   113,   114,   115,   116,   117,   118,   119,   120,
-     121,   122,   123,   124,   125,   126,   127,   128,   129,   130,
-     131,   132,   133,   134,   135,   136,   137,   138,   139,   140,
-     141,   142,   143,   144,   145,   146,   147,   148,   149,   150,
-     151,   152,   153,   154,   155,   156,   157,   158,   159,   160,
-     161,   162,   163,   164,   165,   166,   167,   168,   169,   170,
-     171,   172,   173,   174,   175,   176,   177,   178,   179,   180,
-     181,   182,   183,   184,   185,   186,   187,   188,   189,   190,
-     191,   192,   193,   194,   195,   196,   197,   198,   199,   200,
-     201,   202,   203,   204,   205,   206,   207,   208,   209,   210,
-     211,   212,   213,   214,   215,   216,   217,   218,   219,   220,
-     221,   222,   223,   224,   225,   226,   227,   228,   229,   230,
-     231,   232,   233,   234,   235,   236,   237,   238,   239,   240,
-     241,   242,   243,   244,   245,   246,   247,   248,   249,   250,
-     251,   252,   253,   254,   255,   256,   257,   258,   259,   260,
-     261,   262,   263,   264,   265,   266,   267,   268,   269,   270,
-     271,   272,   273,   274,   275,   276,   277,   278,   279,   280,
-     281,   282,   283,   284,   285,   286,   287,   288,   289,   290,
-     291,   292,   293,   294,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   327,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     341,   342,   343,   344,   345,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   354,   355,   356,   357,   358,   359,   360,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   373,   374,   375,   376,   377,   378,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   387,    -1,   389,   390,
-     391,   392,   393,   394,   395,   396,   397,   398,   399,   400,
-     401,   402,   403,   404,   405,   406,   407,   408,   409,   410,
-     411,   412,   413,   414,   415,   416,   417,   418,   419,     3,
-       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
-      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,    55,    56,    57,    58,    59,    60,    61,    62,    63,
-      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
-      74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
-      84,    85,    86,    87,    88,    89,    90,    91,    92,    93,
-      94,    95,    96,    97,    98,    99,   100,   101,   102,   103,
-     104,   105,   106,   107,   108,   109,   110,   111,   112,   113,
-     114,   115,   116,   117,   118,   119,   120,   121,   122,   123,
-     124,   125,   126,   127,   128,   129,   130,   131,   132,   133,
-     134,   135,   136,   137,   138,   139,   140,   141,   142,   143,
-     144,   145,   146,   147,   148,   149,   150,   151,   152,   153,
-     154,   155,   156,   157,   158,   159,   160,   161,   162,   163,
-     164,   165,   166,   167,   168,   169,   170,   171,   172,   173,
-     174,   175,   176,   177,   178,   179,   180,   181,   182,   183,
-     184,   185,   186,   187,   188,   189,   190,   191,   192,   193,
-     194,   195,   196,   197,   198,   199,   200,   201,   202,   203,
-     204,   205,   206,   207,   208,   209,   210,   211,   212,   213,
-     214,   215,   216,   217,   218,   219,   220,   221,   222,   223,
-     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
-     234,   235,   236,   237,   238,   239,   240,   241,   242,   243,
-     244,   245,   246,   247,   248,   249,   250,   251,   252,   253,
-     254,   255,   256,   257,   258,   259,   260,   261,   262,   263,
-     264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
-     274,   275,   276,   277,   278,   279,   280,   281,   282,   283,
-     284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
-     294,    -1,    -1,   297,   298,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   316,   317,    -1,   319,    -1,   321,   322,    -1,
-      -1,    -1,    -1,   327,   328,   329,   330,   331,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   341,   342,   343,
-     344,   345,    -1,    -1,    -1,   349,   350,   351,   352,   353,
+       0,     0,     0,     0,     0,   328,   329,   330,   331,   332,
+     333,     0,     0,     0,     0,     0,     0,     0,     0,   334,
+       0,   335,   336,   337,   338,   339,   340,   341,   342,   343,
+     344,   345,   346,   347,   348,   349,   350,   351,   352,   353,
      354,   355,   356,   357,   358,   359,   360,   361,   362,   363,
-     364,    -1,   366,   367,   368,   369,   370,   371,   372,   373,
-     374,   375,   376,   377,   378,   379,   380,   381,   382,   383,
-     384,   385,   386,   387,   388,   389,   390,   391,   392,   393,
-     394,   395,   396,   397,   398,   399,   400,   401,   402,   403,
-     404,   405,   406,   407,   408,   409,   410,   411,   412,   413,
-     414,   415,   416,   417,   418,   419,     3,     4,     5,     6,
-       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
-      37,    38,    39,    40,    41,    42,    43,    44,    45,    46,
-      47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
-      57,    58,    59,    60,    61,    62,    63,    64,    65,    66,
-      67,    68,    69,    70,    71,    72,    73,    74,    75,    76,
-      77,    78,    79,    80,    81,    82,    83,    84,    85,    86,
-      87,    88,    89,    90,    91,    92,    93,    94,    95,    96,
-      97,    98,    99,   100,   101,   102,   103,   104,   105,   106,
-     107,   108,   109,   110,   111,   112,   113,   114,   115,   116,
-     117,   118,   119,   120,   121,   122,   123,   124,   125,   126,
-     127,   128,   129,   130,   131,   132,   133,   134,   135,   136,
-     137,   138,   139,   140,   141,   142,   143,   144,   145,   146,
-     147,   148,   149,   150,   151,   152,   153,   154,   155,   156,
-     157,   158,   159,   160,   161,   162,   163,   164,   165,   166,
-     167,   168,   169,   170,   171,   172,   173,   174,   175,   176,
-     177,   178,   179,   180,   181,   182,   183,   184,   185,   186,
-     187,   188,   189,   190,   191,   192,   193,   194,   195,   196,
-     197,   198,   199,   200,   201,   202,   203,   204,   205,   206,
-     207,   208,   209,   210,   211,   212,   213,   214,   215,   216,
-     217,   218,   219,   220,   221,   222,   223,   224,   225,   226,
-     227,   228,   229,   230,   231,   232,   233,   234,   235,   236,
-     237,   238,   239,   240,   241,   242,   243,   244,   245,   246,
-     247,   248,   249,   250,   251,   252,   253,   254,   255,   256,
-     257,   258,   259,   260,   261,   262,   263,   264,   265,   266,
-     267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
-     277,   278,   279,   280,   281,   282,   283,   284,   285,   286,
-     287,   288,   289,   290,   291,   292,   293,   294,    -1,    -1,
-     297,   298,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   316,
-     317,    -1,   319,    -1,   321,   322,    -1,    -1,    -1,    -1,
-     327,   328,   329,   330,   331,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   341,   342,   343,   344,   345,    -1,
-      -1,    -1,   349,   350,   351,   352,   353,   354,   355,   356,
-     357,   358,   359,   360,   361,   362,   363,   364,    -1,   366,
-     367,   368,   369,   370,   371,   372,   373,   374,   375,   376,
-     377,   378,   379,   380,   381,   382,   383,   384,   385,   386,
-     387,   388,   389,   390,   391,   392,   393,   394,   395,   396,
-     397,   398,   399,   400,   401,   402,   403,   404,   405,   406,
-     407,   408,   409,   410,   411,   412,   413,   414,   415,   416,
-     417,   418,   419,     3,     4,     5,     6,     7,     8,     9,
-      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,    25,    26,    27,    28,    29,
-      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
-      40,    41,    42,    43,    44,    45,    46,    47,    48,    49,
-      50,    51,    52,    53,    54,    55,    56,    57,    58,    59,
-      60,    61,    62,    63,    64,    65,    66,    67,    68,    69,
-      70,    71,    72,    73,    74,    75,    76,    77,    78,    79,
-      80,    81,    82,    83,    84,    85,    86,    87,    88,    89,
-      90,    91,    92,    93,    94,    95,    96,    97,    98,    99,
-     100,   101,   102,   103,   104,   105,   106,   107,   108,   109,
-     110,   111,   112,   113,   114,   115,   116,   117,   118,   119,
-     120,   121,   122,   123,   124,   125,   126,   127,   128,   129,
-     130,   131,   132,   133,   134,   135,   136,   137,   138,   139,
-     140,   141,   142,   143,   144,   145,   146,   147,   148,   149,
-     150,   151,   152,   153,   154,   155,   156,   157,   158,   159,
-     160,   161,   162,   163,   164,   165,   166,   167,   168,   169,
-     170,   171,   172,   173,   174,   175,   176,   177,   178,   179,
-     180,   181,   182,   183,   184,   185,   186,   187,   188,   189,
-     190,   191,   192,   193,   194,   195,   196,   197,   198,   199,
-     200,   201,   202,   203,   204,   205,   206,   207,   208,   209,
-     210,   211,   212,   213,   214,   215,   216,   217,   218,   219,
-     220,   221,   222,   223,   224,   225,   226,   227,   228,   229,
-     230,   231,   232,   233,   234,   235,   236,   237,   238,   239,
-     240,   241,   242,   243,   244,   245,   246,   247,   248,   249,
-     250,   251,   252,   253,   254,   255,   256,   257,   258,   259,
-     260,   261,   262,   263,   264,   265,   266,   267,   268,   269,
-     270,   271,   272,   273,   274,   275,   276,   277,   278,   279,
-     280,   281,   282,   283,   284,   285,   286,   287,   288,   289,
-     290,   291,   292,   293,   294,    -1,    -1,   297,   298,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   316,   317,    -1,   319,
-      -1,   321,    -1,    -1,    -1,    -1,    -1,   327,   328,   329,
-     330,   331,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   341,   342,   343,   344,   345,    -1,    -1,    -1,   349,
-     350,   351,   352,   353,   354,   355,   356,   357,   358,   359,
-     360,   361,   362,   363,   364,    -1,   366,   367,   368,   369,
-     370,   371,   372,   373,   374,   375,   376,   377,   378,   379,
-     380,   381,   382,   383,   384,   385,   386,   387,   388,   389,
-     390,   391,   392,   393,   394,   395,   396,   397,   398,   399,
-     400,   401,   402,   403,   404,   405,   406,   407,   408,   409,
-     410,   411,   412,   413,   414,   415,   416,   417,   418,   419,
-       3,     4,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
-      33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
-      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
-      53,    54,    55,    56,    57,    58,    59,    60,    61,    62,
-      63,    64,    65,    66,    67,    68,    69,    70,    71,    72,
-      73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
-      83,    84,    85,    86,    87,    88,    89,    90,    91,    92,
-      93,    94,    95,    96,    97,    98,    99,   100,   101,   102,
-     103,   104,   105,   106,   107,   108,   109,   110,   111,   112,
-     113,   114,   115,   116,   117,   118,   119,   120,   121,   122,
-     123,   124,   125,   126,   127,   128,   129,   130,   131,   132,
-     133,   134,   135,   136,   137,   138,   139,   140,   141,   142,
-     143,   144,   145,   146,   147,   148,   149,   150,   151,   152,
-     153,   154,   155,   156,   157,   158,   159,   160,   161,   162,
-     163,   164,   165,   166,   167,   168,   169,   170,   171,   172,
-     173,   174,   175,   176,   177,   178,   179,   180,   181,   182,
-     183,   184,   185,   186,   187,   188,   189,   190,   191,   192,
-     193,   194,   195,   196,   197,   198,   199,   200,   201,   202,
-     203,   204,   205,   206,   207,   208,   209,   210,   211,   212,
-     213,   214,   215,   216,   217,   218,   219,   220,   221,   222,
-     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
-     233,   234,   235,   236,   237,   238,   239,   240,   241,   242,
-     243,   244,   245,   246,   247,   248,   249,   250,   251,   252,
-     253,   254,   255,   256,   257,   258,   259,   260,   261,   262,
-     263,   264,   265,   266,   267,   268,   269,   270,   271,   272,
-     273,   274,   275,   276,   277,   278,   279,   280,   281,   282,
-     283,   284,   285,   286,   287,   288,   289,   290,   291,   292,
-     293,   294,    -1,    -1,   297,   298,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   316,   317,    -1,   319,    -1,   321,    -1,
-      -1,    -1,    -1,    -1,   327,   328,   329,   330,   331,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   341,   342,
-     343,   344,   345,    -1,    -1,    -1,   349,   350,   351,   352,
-     353,   354,   355,   356,   357,   358,   359,   360,   361,   362,
-     363,   364,    -1,   366,   367,   368,   369,   370,   371,   372,
-     373,   374,   375,   376,   377,   378,   379,   380,   381,   382,
-     383,   384,   385,   386,   387,   388,   389,   390,   391,   392,
-     393,   394,   395,   396,   397,   398,   399,   400,   401,   402,
-     403,   404,   405,   406,   407,   408,   409,   410,   411,   412,
-     413,   414,   415,   416,   417,   418,   419,     3,     4,     5,
-       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
-      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
-      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
-      56,    57,    58,    59,    60,    61,    62,    63,    64,    65,
-      66,    67,    68,    69,    70,    71,    72,    73,    74,    75,
-      76,    77,    78,    79,    80,    81,    82,    83,    84,    85,
-      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
-      96,    97,    98,    99,   100,   101,   102,   103,   104,   105,
-     106,   107,   108,   109,   110,   111,   112,   113,   114,   115,
-     116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
-     126,   127,   128,   129,   130,   131,   132,   133,   134,   135,
-     136,   137,   138,   139,   140,   141,   142,   143,   144,   145,
-     146,   147,   148,   149,   150,   151,   152,   153,   154,   155,
-     156,   157,   158,   159,   160,   161,   162,   163,   164,   165,
-     166,   167,   168,   169,   170,   171,   172,   173,   174,   175,
-     176,   177,   178,   179,   180,   181,   182,   183,   184,   185,
-     186,   187,   188,   189,   190,   191,   192,   193,   194,   195,
-     196,   197,   198,   199,   200,   201,   202,   203,   204,   205,
-     206,   207,   208,   209,   210,   211,   212,   213,   214,   215,
-     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,
-     226,   227,   228,   229,   230,   231,   232,   233,   234,   235,
-     236,   237,   238,   239,   240,   241,   242,   243,   244,   245,
-     246,   247,   248,   249,   250,   251,   252,   253,   254,   255,
-     256,   257,   258,   259,   260,   261,   262,   263,   264,   265,
-     266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
-     276,   277,   278,   279,   280,   281,   282,   283,   284,   285,
-     286,   287,   288,   289,   290,   291,   292,   293,   294,    -1,
-      -1,   297,   298,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     316,   317,    -1,   319,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   327,   328,   329,   330,   331,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   341,   342,   343,   344,   345,
-      -1,    -1,    -1,   349,   350,   351,   352,   353,   354,   355,
-     356,   357,   358,   359,   360,   361,   362,   363,   364,    -1,
-     366,   367,   368,   369,   370,   371,   372,   373,   374,   375,
-     376,   377,   378,   379,   380,   381,   382,   383,   384,   385,
-     386,   387,   388,   389,   390,   391,   392,   393,   394,   395,
-     396,   397,   398,   399,   400,   401,   402,   403,   404,   405,
-     406,   407,   408,   409,   410,   411,   412,   413,   414,   415,
-     416,   417,   418,   419,     3,     4,     5,     6,     7,     8,
+     364,   365,     1,     2,     3,     4,     5,     6,     7,     8,
        9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
       19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
       29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
@@ -2726,61 +1746,66 @@
      259,   260,   261,   262,   263,   264,   265,   266,   267,   268,
      269,   270,   271,   272,   273,   274,   275,   276,   277,   278,
      279,   280,   281,   282,   283,   284,   285,   286,   287,   288,
-     289,   290,   291,   292,   293,   294,    -1,    -1,   297,   298,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   316,   317,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   327,   328,
-     329,   330,   331,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   341,   342,   343,   344,   345,    -1,    -1,    -1,
-     349,   350,   351,   352,   353,   354,   355,   356,   357,   358,
-     359,   360,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   373,   374,   375,   376,   377,   378,
-     379,   380,   381,   382,   383,   384,   385,   386,   387,    -1,
-     389,   390,   391,   392,   393,   394,   395,   396,   397,   398,
-     399,   400,   401,   402,   403,   404,   405,   406,   407,   408,
-     409,   410,   411,   412,   413,   414,   415,   416,   417,   418,
-     419,     3,     4,     5,     6,     7,     8,     9,    10,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
-      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
-      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
-      52,    53,    54,    55,    56,    57,    58,    59,    60,    61,
-      62,    63,    64,    65,    66,    67,    68,    69,    70,    71,
-      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
-      82,    83,    84,    85,    86,    87,    88,    89,    90,    91,
-      92,    93,    94,    95,    96,    97,    98,    99,   100,   101,
-     102,   103,   104,   105,   106,   107,   108,   109,   110,   111,
-     112,   113,   114,   115,   116,   117,   118,   119,   120,   121,
-     122,   123,   124,   125,   126,   127,   128,   129,   130,   131,
-     132,   133,   134,   135,   136,   137,   138,   139,   140,   141,
-     142,   143,   144,   145,   146,   147,   148,   149,   150,   151,
-     152,   153,   154,   155,   156,   157,   158,   159,   160,   161,
-     162,   163,   164,   165,   166,   167,   168,   169,   170,   171,
-     172,   173,   174,   175,   176,   177,   178,   179,   180,   181,
-     182,   183,   184,   185,   186,   187,   188,   189,   190,   191,
-     192,   193,   194,   195,   196,   197,   198,   199,   200,   201,
-     202,   203,   204,   205,   206,   207,   208,   209,   210,   211,
-     212,   213,   214,   215,   216,   217,   218,   219,   220,   221,
-     222,   223,   224,   225,   226,   227,   228,   229,   230,   231,
-     232,   233,   234,   235,   236,   237,   238,   239,   240,   241,
-     242,   243,   244,   245,   246,   247,   248,   249,   250,   251,
-     252,   253,   254,   255,   256,   257,   258,   259,   260,   261,
-     262,   263,   264,   265,   266,   267,   268,   269,   270,   271,
-     272,   273,   274,   275,   276,   277,   278,   279,   280,   281,
-     282,   283,   284,   285,   286,   287,   288,   289,   290,   291,
-     292,   293,   294,    -1,    -1,   297,   298,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   316,   317,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   328,   329,   330,   331,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   341,
-     342,   343,   344,    -1,    -1,    -1,    -1,   349,   350,   351,
-     352,   353,   354,   355,   356,   357,   358,   359,   360,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   373,   374,   375,   376,   377,   378,   379,   380,   381,
-     382,   383,   384,   385,   386,   387,    -1,   389,   390,   391,
-     392,   393,   394,   395,   396,   397,   398,   399,   400,   401,
-     402,   403,   404,   405,   406,   407,   408,   409,   410,   411,
-     412,   413,   414,   415,   416,   417,   418,   419,     3,     4,
+     289,   290,   291,   292,   293,   294,   295,   296,   297,   298,
+     299,   300,   301,   302,   303,   304,   305,   306,   307,   308,
+     309,   310,   311,   312,   313,   314,     0,     0,   444,   445,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   446,   447,     0,
+     508,     0,   509,   510,     0,     0,     0,     0,   511,   448,
+     449,   450,   451,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   316,   317,   318,   319,   320,     0,     0,     0,
+     452,   453,   454,   455,   456,   321,   322,   323,   324,   325,
+     326,   327,   512,   513,   514,   515,     0,   516,   517,   518,
+     519,   520,   521,   522,   523,   524,   525,   328,   329,   330,
+     331,   332,   333,   457,   458,   459,   460,   461,   462,   463,
+     464,   334,   526,   335,   336,   337,   338,   339,   340,   341,
+     342,   343,   344,   345,   346,   347,   348,   349,   350,   351,
+     352,   353,   354,   355,   356,   357,   358,   359,   360,   361,
+     362,   363,   364,   365,     1,     2,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+      37,    38,    39,    40,    41,    42,    43,    44,    45,    46,
+      47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
+      57,    58,    59,    60,    61,    62,    63,    64,    65,    66,
+      67,    68,    69,    70,    71,    72,    73,    74,    75,    76,
+      77,    78,    79,    80,    81,    82,    83,    84,    85,    86,
+      87,    88,    89,    90,    91,    92,    93,    94,    95,    96,
+      97,    98,    99,   100,   101,   102,   103,   104,   105,   106,
+     107,   108,   109,   110,   111,   112,   113,   114,   115,   116,
+     117,   118,   119,   120,   121,   122,   123,   124,   125,   126,
+     127,   128,   129,   130,   131,   132,   133,   134,   135,   136,
+     137,   138,   139,   140,   141,   142,   143,   144,   145,   146,
+     147,   148,   149,   150,   151,   152,   153,   154,   155,   156,
+     157,   158,   159,   160,   161,   162,   163,   164,   165,   166,
+     167,   168,   169,   170,   171,   172,   173,   174,   175,   176,
+     177,   178,   179,   180,   181,   182,   183,   184,   185,   186,
+     187,   188,   189,   190,   191,   192,   193,   194,   195,   196,
+     197,   198,   199,   200,   201,   202,   203,   204,   205,   206,
+     207,   208,   209,   210,   211,   212,   213,   214,   215,   216,
+     217,   218,   219,   220,   221,   222,   223,   224,   225,   226,
+     227,   228,   229,   230,   231,   232,   233,   234,   235,   236,
+     237,   238,   239,   240,   241,   242,   243,   244,   245,   246,
+     247,   248,   249,   250,   251,   252,   253,   254,   255,   256,
+     257,   258,   259,   260,   261,   262,   263,   264,   265,   266,
+     267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
+     277,   278,   279,   280,   281,   282,   283,   284,   285,   286,
+     287,   288,   289,   290,   291,   292,   293,   294,   295,   296,
+     297,   298,   299,   300,   301,   302,   303,   304,   305,   306,
+     307,   308,   309,   310,   311,   312,   313,   314,     0,     0,
+     444,   445,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   446,
+     447,     0,   508,     0,   509,   645,     0,     0,     0,     0,
+     511,   448,   449,   450,   451,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   316,   317,   318,   319,   320,     0,
+       0,     0,   452,   453,   454,   455,   456,   321,   322,   323,
+     324,   325,   326,   327,   512,   513,   514,   515,     0,   516,
+     517,   518,   519,   520,   521,   522,   523,   524,   525,   328,
+     329,   330,   331,   332,   333,   457,   458,   459,   460,   461,
+     462,   463,   464,   334,   526,   335,   336,   337,   338,   339,
+     340,   341,   342,   343,   344,   345,   346,   347,   348,   349,
+     350,   351,   352,   353,   354,   355,   356,   357,   358,   359,
+     360,   361,   362,   363,   364,   365,     1,     2,     3,     4,
        5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
@@ -2810,61 +1835,66 @@
      265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
      275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
      285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   327,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   341,   342,   343,   344,
-     345,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   354,
-     355,   356,   357,   358,   359,   360,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   373,   374,
-     375,   376,   377,   378,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   387,    -1,   389,   390,   391,   392,   393,   394,
-     395,   396,   397,   398,   399,   400,   401,   402,   403,   404,
-     405,   406,   407,   408,   409,   410,   411,   412,   413,   414,
-     415,   416,   417,   418,   419,     3,     4,     5,     6,     7,
-       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
-      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
-      38,    39,    40,    41,    42,    43,    44,    45,    46,    47,
-      48,    49,    50,    51,    52,    53,    54,    55,    56,    57,
-      58,    59,    60,    61,    62,    63,    64,    65,    66,    67,
-      68,    69,    70,    71,    72,    73,    74,    75,    76,    77,
-      78,    79,    80,    81,    82,    83,    84,    85,    86,    87,
-      88,    89,    90,    91,    92,    93,    94,    95,    96,    97,
-      98,    99,   100,   101,   102,   103,   104,   105,   106,   107,
-     108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
-     118,   119,   120,   121,   122,   123,   124,   125,   126,   127,
-     128,   129,   130,   131,   132,   133,   134,   135,   136,   137,
-     138,   139,   140,   141,   142,   143,   144,   145,   146,   147,
-     148,   149,   150,   151,   152,   153,   154,   155,   156,   157,
-     158,   159,   160,   161,   162,   163,   164,   165,   166,   167,
-     168,   169,   170,   171,   172,   173,   174,   175,   176,   177,
-     178,   179,   180,   181,   182,   183,   184,   185,   186,   187,
-     188,   189,   190,   191,   192,   193,   194,   195,   196,   197,
-     198,   199,   200,   201,   202,   203,   204,   205,   206,   207,
-     208,   209,   210,   211,   212,   213,   214,   215,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,   234,   235,   236,   237,
-     238,   239,   240,   241,   242,   243,   244,   245,   246,   247,
-     248,   249,   250,   251,   252,   253,   254,   255,   256,   257,
-     258,   259,   260,   261,   262,   263,   264,   265,   266,   267,
-     268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
-     278,   279,   280,   281,   282,   283,   284,   285,   286,   287,
-     288,   289,   290,   291,   292,   293,   294,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   327,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   341,   342,   343,   344,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   353,   354,   355,   356,   357,
-     358,   359,   360,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   373,   374,   375,   376,   377,
-     378,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   387,
-      -1,   389,   390,   391,   392,   393,   394,   395,   396,   397,
-     398,   399,   400,   401,   402,   403,   404,   405,   406,   407,
-     408,   409,   410,   411,   412,   413,   414,   415,   416,   417,
-     418,   419,     3,     4,     5,     6,     7,     8,     9,    10,
+     295,   296,   297,   298,   299,   300,   301,   302,   303,   304,
+     305,   306,   307,   308,   309,   310,   311,   312,   313,   314,
+       0,     0,   444,   445,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   446,   447,     0,   508,     0,   509,     0,     0,     0,
+       0,     0,   511,   448,   449,   450,   451,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   316,   317,   318,   319,
+     320,     0,     0,     0,   452,   453,   454,   455,   456,   321,
+     322,   323,   324,   325,   326,   327,   512,   513,   514,   515,
+       0,   516,   517,   518,   519,   520,   521,   522,   523,   524,
+     525,   328,   329,   330,   331,   332,   333,   457,   458,   459,
+     460,   461,   462,   463,   464,   334,   526,   335,   336,   337,
+     338,   339,   340,   341,   342,   343,   344,   345,   346,   347,
+     348,   349,   350,   351,   352,   353,   354,   355,   356,   357,
+     358,   359,   360,   361,   362,   363,   364,   365,     1,     2,
+       3,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
+      33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
+      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
+      53,    54,    55,    56,    57,    58,    59,    60,    61,    62,
+      63,    64,    65,    66,    67,    68,    69,    70,    71,    72,
+      73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
+      83,    84,    85,    86,    87,    88,    89,    90,    91,    92,
+      93,    94,    95,    96,    97,    98,    99,   100,   101,   102,
+     103,   104,   105,   106,   107,   108,   109,   110,   111,   112,
+     113,   114,   115,   116,   117,   118,   119,   120,   121,   122,
+     123,   124,   125,   126,   127,   128,   129,   130,   131,   132,
+     133,   134,   135,   136,   137,   138,   139,   140,   141,   142,
+     143,   144,   145,   146,   147,   148,   149,   150,   151,   152,
+     153,   154,   155,   156,   157,   158,   159,   160,   161,   162,
+     163,   164,   165,   166,   167,   168,   169,   170,   171,   172,
+     173,   174,   175,   176,   177,   178,   179,   180,   181,   182,
+     183,   184,   185,   186,   187,   188,   189,   190,   191,   192,
+     193,   194,   195,   196,   197,   198,   199,   200,   201,   202,
+     203,   204,   205,   206,   207,   208,   209,   210,   211,   212,
+     213,   214,   215,   216,   217,   218,   219,   220,   221,   222,
+     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
+     233,   234,   235,   236,   237,   238,   239,   240,   241,   242,
+     243,   244,   245,   246,   247,   248,   249,   250,   251,   252,
+     253,   254,   255,   256,   257,   258,   259,   260,   261,   262,
+     263,   264,   265,   266,   267,   268,   269,   270,   271,   272,
+     273,   274,   275,   276,   277,   278,   279,   280,   281,   282,
+     283,   284,   285,   286,   287,   288,   289,   290,   291,   292,
+     293,   294,   295,   296,   297,   298,   299,   300,   301,   302,
+     303,   304,   305,   306,   307,   308,   309,   310,   311,   312,
+     313,   314,     0,     0,   444,   445,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   446,   447,     0,   508,     0,   430,     0,
+       0,     0,     0,     0,   511,   448,   449,   450,   451,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   316,   317,
+     318,   319,   320,     0,     0,     0,   452,   453,   454,   455,
+     456,   321,   322,   323,   324,   325,   326,   327,   512,   513,
+     514,   515,     0,   516,   517,   518,   519,   520,   521,   522,
+     523,   524,   525,   328,   329,   330,   331,   332,   333,   457,
+     458,   459,   460,   461,   462,   463,   464,   334,   526,   335,
+     336,   337,   338,   339,   340,   341,   342,   343,   344,   345,
+     346,   347,   348,   349,   350,   351,   352,   353,   354,   355,
+     356,   357,   358,   359,   360,   361,   362,   363,   364,   365,
+       1,     2,     3,     4,     5,     6,     7,     8,     9,    10,
       11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
       21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
       31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
@@ -2893,61 +1923,66 @@
      261,   262,   263,   264,   265,   266,   267,   268,   269,   270,
      271,   272,   273,   274,   275,   276,   277,   278,   279,   280,
      281,   282,   283,   284,   285,   286,   287,   288,   289,   290,
-     291,   292,   293,   294,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   322,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     341,   342,   343,   344,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   354,   355,   356,   357,   358,   359,   360,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   373,   374,   375,   376,   377,   378,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   387,    -1,   389,   390,
-     391,   392,   393,   394,   395,   396,   397,   398,   399,   400,
-     401,   402,   403,   404,   405,   406,   407,   408,   409,   410,
-     411,   412,   413,   414,   415,   416,   417,   418,   419,     3,
-       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
-      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,    55,    56,    57,    58,    59,    60,    61,    62,    63,
-      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
-      74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
-      84,    85,    86,    87,    88,    89,    90,    91,    92,    93,
-      94,    95,    96,    97,    98,    99,   100,   101,   102,   103,
-     104,   105,   106,   107,   108,   109,   110,   111,   112,   113,
-     114,   115,   116,   117,   118,   119,   120,   121,   122,   123,
-     124,   125,   126,   127,   128,   129,   130,   131,   132,   133,
-     134,   135,   136,   137,   138,   139,   140,   141,   142,   143,
-     144,   145,   146,   147,   148,   149,   150,   151,   152,   153,
-     154,   155,   156,   157,   158,   159,   160,   161,   162,   163,
-     164,   165,   166,   167,   168,   169,   170,   171,   172,   173,
-     174,   175,   176,   177,   178,   179,   180,   181,   182,   183,
-     184,   185,   186,   187,   188,   189,   190,   191,   192,   193,
-     194,   195,   196,   197,   198,   199,   200,   201,   202,   203,
-     204,   205,   206,   207,   208,   209,   210,   211,   212,   213,
-     214,   215,   216,   217,   218,   219,   220,   221,   222,   223,
-     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
-     234,   235,   236,   237,   238,   239,   240,   241,   242,   243,
-     244,   245,   246,   247,   248,   249,   250,   251,   252,   253,
-     254,   255,   256,   257,   258,   259,   260,   261,   262,   263,
-     264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
-     274,   275,   276,   277,   278,   279,   280,   281,   282,   283,
-     284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
-     294,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   322,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   341,   342,   343,
-     344,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     354,   355,   356,   357,   358,   359,   360,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   373,
-     374,   375,   376,   377,   378,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   387,    -1,   389,   390,   391,   392,   393,
-     394,   395,   396,   397,   398,   399,   400,   401,   402,   403,
-     404,   405,   406,   407,   408,   409,   410,   411,   412,   413,
-     414,   415,   416,   417,   418,   419,     3,     4,     5,     6,
+     291,   292,   293,   294,   295,   296,   297,   298,   299,   300,
+     301,   302,   303,   304,   305,   306,   307,   308,   309,   310,
+     311,   312,   313,   314,     0,     0,   444,   445,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   446,   447,     0,   508,     0,
+       0,     0,     0,     0,     0,     0,   511,   448,   449,   450,
+     451,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     316,   317,   318,   319,   320,     0,     0,     0,   452,   453,
+     454,   455,   456,   321,   322,   323,   324,   325,   326,   327,
+     512,   513,   514,   515,     0,   516,   517,   518,   519,   520,
+     521,   522,   523,   524,   525,   328,   329,   330,   331,   332,
+     333,   457,   458,   459,   460,   461,   462,   463,   464,   334,
+     526,   335,   336,   337,   338,   339,   340,   341,   342,   343,
+     344,   345,   346,   347,   348,   349,   350,   351,   352,   353,
+     354,   355,   356,   357,   358,   359,   360,   361,   362,   363,
+     364,   365,     1,     2,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
+      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+      39,    40,    41,    42,    43,    44,    45,    46,    47,    48,
+      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
+      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
+      69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
+      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
+      89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
+      99,   100,   101,   102,   103,   104,   105,   106,   107,   108,
+     109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
+     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
+     129,   130,   131,   132,   133,   134,   135,   136,   137,   138,
+     139,   140,   141,   142,   143,   144,   145,   146,   147,   148,
+     149,   150,   151,   152,   153,   154,   155,   156,   157,   158,
+     159,   160,   161,   162,   163,   164,   165,   166,   167,   168,
+     169,   170,   171,   172,   173,   174,   175,   176,   177,   178,
+     179,   180,   181,   182,   183,   184,   185,   186,   187,   188,
+     189,   190,   191,   192,   193,   194,   195,   196,   197,   198,
+     199,   200,   201,   202,   203,   204,   205,   206,   207,   208,
+     209,   210,   211,   212,   213,   214,   215,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,   234,   235,   236,   237,   238,
+     239,   240,   241,   242,   243,   244,   245,   246,   247,   248,
+     249,   250,   251,   252,   253,   254,   255,   256,   257,   258,
+     259,   260,   261,   262,   263,   264,   265,   266,   267,   268,
+     269,   270,   271,   272,   273,   274,   275,   276,   277,   278,
+     279,   280,   281,   282,   283,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   295,   296,   297,   298,
+     299,   300,   301,   302,   303,   304,   305,   306,   307,   308,
+     309,   310,   311,   312,   313,   314,     0,     0,   444,   445,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   446,   447,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   511,   448,
+     449,   450,   451,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   316,   317,   318,   319,   320,     0,     0,     0,
+     452,   453,   454,   455,   456,   321,   322,   323,   324,   325,
+     326,   327,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   328,   329,   330,
+     331,   332,   333,   457,   458,   459,   460,   461,   462,   463,
+     464,   334,     0,   335,   336,   337,   338,   339,   340,   341,
+     342,   343,   344,   345,   346,   347,   348,   349,   350,   351,
+     352,   353,   354,   355,   356,   357,   358,   359,   360,   361,
+     362,   363,   364,   365,     1,     2,     3,     4,     5,     6,
        7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
       17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
       27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
@@ -2976,67 +2011,293 @@
      257,   258,   259,   260,   261,   262,   263,   264,   265,   266,
      267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
      277,   278,   279,   280,   281,   282,   283,   284,   285,   286,
-     287,   288,   289,   290,   291,   292,   293,   294,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   322,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   341,   342,   343,   344,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   354,   355,   356,
-     357,   358,   359,   360,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   373,   374,   375,   376,
-     377,   378,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     387,    -1,   389,   390,   391,   392,   393,   394,   395,   396,
-     397,   398,   399,   400,   401,   402,   403,   404,   405,   406,
-     407,   408,   409,   410,   411,   412,   413,   414,   415,   416,
-     417,   418,   419,     3,     4,     5,     6,     7,     8,     9,
-      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,    25,    26,    27,    28,    29,
-      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
-      40,    41,    42,    43,    44,    45,    46,    47,    48,    49,
-      50,    51,    52,    53,    54,    55,    56,    57,    58,    59,
-      60,    61,    62,    63,    64,    65,    66,    67,    68,    69,
-      70,    71,    72,    73,    74,    75,    76,    77,    78,    79,
-      80,    81,    82,    83,    84,    85,    86,    87,    88,    89,
-      90,    91,    92,    93,    94,    95,    96,    97,    98,    99,
-     100,   101,   102,   103,   104,   105,   106,   107,   108,   109,
-     110,   111,   112,   113,   114,   115,   116,   117,   118,   119,
-     120,   121,   122,   123,   124,   125,   126,   127,   128,   129,
-     130,   131,   132,   133,   134,   135,   136,   137,   138,   139,
-     140,   141,   142,   143,   144,   145,   146,   147,   148,   149,
-     150,   151,   152,   153,   154,   155,   156,   157,   158,   159,
-     160,   161,   162,   163,   164,   165,   166,   167,   168,   169,
-     170,   171,   172,   173,   174,   175,   176,   177,   178,   179,
-     180,   181,   182,   183,   184,   185,   186,   187,   188,   189,
-     190,   191,   192,   193,   194,   195,   196,   197,   198,   199,
-     200,   201,   202,   203,   204,   205,   206,   207,   208,   209,
-     210,   211,   212,   213,   214,   215,   216,   217,   218,   219,
-     220,   221,   222,   223,   224,   225,   226,   227,   228,   229,
-     230,   231,   232,   233,   234,   235,   236,   237,   238,   239,
-     240,   241,   242,   243,   244,   245,   246,   247,   248,   249,
-     250,   251,   252,   253,   254,   255,   256,   257,   258,   259,
-     260,   261,   262,   263,   264,   265,   266,   267,   268,   269,
-     270,   271,   272,   273,   274,   275,   276,   277,   278,   279,
-     280,   281,   282,   283,   284,   285,   286,   287,   288,   289,
-     290,   291,   292,   293,   294,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   341,   342,   343,   344,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   354,   355,   356,   357,   358,   359,
-     360,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   373,   374,   375,   376,   377,   378,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   387,    -1,   389,
-     390,   391,   392,   393,   394,   395,   396,   397,   398,   399,
-     400,   401,   402,   403,   404,   405,   406,   407,   408,   409,
-     410,   411,   412,   413,   414,   415,   416,   417,   418,   419,
+     287,   288,   289,   290,   291,   292,   293,   294,   295,   296,
+     297,   298,   299,   300,   301,   302,   303,   304,   305,   306,
+     307,   308,   309,   310,   311,   312,   313,   314,     0,     0,
+     444,   445,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   446,
+     447,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   448,   449,   450,   451,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   316,   317,   318,   319,     0,     0,
+       0,     0,   452,   453,   454,   455,   456,   321,   322,   323,
+     324,   325,   326,   327,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   328,
+     329,   330,   331,   332,   333,   457,   458,   459,   460,   461,
+     462,   463,   464,   334,     0,   335,   336,   337,   338,   339,
+     340,   341,   342,   343,   344,   345,   346,   347,   348,   349,
+     350,   351,   352,   353,   354,   355,   356,   357,   358,   359,
+     360,   361,   362,   363,   364,   365,     1,     2,     3,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
+      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
+      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
+      55,    56,    57,    58,    59,    60,    61,    62,    63,    64,
+      65,    66,    67,    68,    69,    70,    71,    72,    73,    74,
+      75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
+      85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
+      95,    96,    97,    98,    99,   100,   101,   102,   103,   104,
+     105,   106,   107,   108,   109,   110,   111,   112,   113,   114,
+     115,   116,   117,   118,   119,   120,   121,   122,   123,   124,
+     125,   126,   127,   128,   129,   130,   131,   132,   133,   134,
+     135,   136,   137,   138,   139,   140,   141,   142,   143,   144,
+     145,   146,   147,   148,   149,   150,   151,   152,   153,   154,
+     155,   156,   157,   158,   159,   160,   161,   162,   163,   164,
+     165,   166,   167,   168,   169,   170,   171,   172,   173,   174,
+     175,   176,   177,   178,   179,   180,   181,   182,   183,   184,
+     185,   186,   187,   188,   189,   190,   191,   192,   193,   194,
+     195,   196,   197,   198,   199,   200,   201,   202,   203,   204,
+     205,   206,   207,   208,   209,   210,   211,   212,   213,   214,
+     215,   216,   217,   218,   219,   220,   221,   222,   223,   224,
+     225,   226,   227,   228,   229,   230,   231,   232,   233,   234,
+     235,   236,   237,   238,   239,   240,   241,   242,   243,   244,
+     245,   246,   247,   248,   249,   250,   251,   252,   253,   254,
+     255,   256,   257,   258,   259,   260,   261,   262,   263,   264,
+     265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
+     275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
+     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
+     295,   296,   297,   298,   299,   300,   301,   302,   303,   304,
+     305,   306,   307,   308,   309,   310,   311,   312,   313,   314,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   315,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   316,   317,   318,   319,
+     320,     0,     0,     0,     0,     0,     0,     0,     0,   321,
+     322,   323,   324,   325,   326,   327,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   328,   329,   330,   331,   332,   333,     0,     0,     0,
+       0,     0,     0,     0,     0,   334,     0,   335,   336,   337,
+     338,   339,   340,   341,   342,   343,   344,   345,   346,   347,
+     348,   349,   350,   351,   352,   353,   354,   355,   356,   357,
+     358,   359,   360,   361,   362,   363,   364,   365,     1,     2,
+       3,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
+      33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
+      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
+      53,    54,    55,    56,    57,    58,    59,    60,    61,    62,
+      63,    64,    65,    66,    67,    68,    69,    70,    71,    72,
+      73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
+      83,    84,    85,    86,    87,    88,    89,    90,    91,    92,
+      93,    94,    95,    96,    97,    98,    99,   100,   101,   102,
+     103,   104,   105,   106,   107,   108,   109,   110,   111,   112,
+     113,   114,   115,   116,   117,   118,   119,   120,   121,   122,
+     123,   124,   125,   126,   127,   128,   129,   130,   131,   132,
+     133,   134,   135,   136,   137,   138,   139,   140,   141,   142,
+     143,   144,   145,   146,   147,   148,   149,   150,   151,   152,
+     153,   154,   155,   156,   157,   158,   159,   160,   161,   162,
+     163,   164,   165,   166,   167,   168,   169,   170,   171,   172,
+     173,   174,   175,   176,   177,   178,   179,   180,   181,   182,
+     183,   184,   185,   186,   187,   188,   189,   190,   191,   192,
+     193,   194,   195,   196,   197,   198,   199,   200,   201,   202,
+     203,   204,   205,   206,   207,   208,   209,   210,   211,   212,
+     213,   214,   215,   216,   217,   218,   219,   220,   221,   222,
+     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
+     233,   234,   235,   236,   237,   238,   239,   240,   241,   242,
+     243,   244,   245,   246,   247,   248,   249,   250,   251,   252,
+     253,   254,   255,   256,   257,   258,   259,   260,   261,   262,
+     263,   264,   265,   266,   267,   268,   269,   270,   271,   272,
+     273,   274,   275,   276,   277,   278,   279,   280,   281,   282,
+     283,   284,   285,   286,   287,   288,   289,   290,   291,   292,
+     293,   294,   295,   296,   297,   298,   299,   300,   301,   302,
+     303,   304,   305,   306,   307,   308,   309,   310,   311,   312,
+     313,   314,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   409,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   316,   317,
+     318,   319,     0,     0,     0,     0,     0,     0,     0,     0,
+     410,   321,   322,   323,   324,   325,   326,   327,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   328,   329,   330,   331,   332,   333,     0,
+       0,     0,     0,     0,     0,     0,     0,   334,     0,   335,
+     336,   337,   338,   339,   340,   341,   342,   343,   344,   345,
+     346,   347,   348,   349,   350,   351,   352,   353,   354,   355,
+     356,   357,   358,   359,   360,   361,   362,   363,   364,   365,
+       1,     2,     3,     4,     5,     6,     7,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
+      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
+      41,    42,    43,    44,    45,    46,    47,    48,    49,    50,
+      51,    52,    53,    54,    55,    56,    57,    58,    59,    60,
+      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
+      71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
+      81,    82,    83,    84,    85,    86,    87,    88,    89,    90,
+      91,    92,    93,    94,    95,    96,    97,    98,    99,   100,
+     101,   102,   103,   104,   105,   106,   107,   108,   109,   110,
+     111,   112,   113,   114,   115,   116,   117,   118,   119,   120,
+     121,   122,   123,   124,   125,   126,   127,   128,   129,   130,
+     131,   132,   133,   134,   135,   136,   137,   138,   139,   140,
+     141,   142,   143,   144,   145,   146,   147,   148,   149,   150,
+     151,   152,   153,   154,   155,   156,   157,   158,   159,   160,
+     161,   162,   163,   164,   165,   166,   167,   168,   169,   170,
+     171,   172,   173,   174,   175,   176,   177,   178,   179,   180,
+     181,   182,   183,   184,   185,   186,   187,   188,   189,   190,
+     191,   192,   193,   194,   195,   196,   197,   198,   199,   200,
+     201,   202,   203,   204,   205,   206,   207,   208,   209,   210,
+     211,   212,   213,   214,   215,   216,   217,   218,   219,   220,
+     221,   222,   223,   224,   225,   226,   227,   228,   229,   230,
+     231,   232,   233,   234,   235,   236,   237,   238,   239,   240,
+     241,   242,   243,   244,   245,   246,   247,   248,   249,   250,
+     251,   252,   253,   254,   255,   256,   257,   258,   259,   260,
+     261,   262,   263,   264,   265,   266,   267,   268,   269,   270,
+     271,   272,   273,   274,   275,   276,   277,   278,   279,   280,
+     281,   282,   283,   284,   285,   286,   287,   288,   289,   290,
+     291,   292,   293,   294,   295,   296,   297,   298,   299,   300,
+     301,   302,   303,   304,   305,   306,   307,   308,   309,   310,
+     311,   312,   313,   314,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   582,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     316,   317,   318,   319,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   321,   322,   323,   324,   325,   326,   327,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   328,   329,   330,   331,   332,
+     333,     0,     0,     0,     0,     0,     0,     0,     0,   334,
+       0,   335,   336,   337,   338,   339,   340,   341,   342,   343,
+     344,   345,   346,   347,   348,   349,   350,   351,   352,   353,
+     354,   355,   356,   357,   358,   359,   360,   361,   362,   363,
+     364,   365,     1,     2,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
+      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+      39,    40,    41,    42,    43,    44,    45,    46,    47,    48,
+      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
+      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
+      69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
+      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
+      89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
+      99,   100,   101,   102,   103,   104,   105,   106,   107,   108,
+     109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
+     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
+     129,   130,   131,   132,   133,   134,   135,   136,   137,   138,
+     139,   140,   141,   142,   143,   144,   145,   146,   147,   148,
+     149,   150,   151,   152,   153,   154,   155,   156,   157,   158,
+     159,   160,   161,   162,   163,   164,   165,   166,   167,   168,
+     169,   170,   171,   172,   173,   174,   175,   176,   177,   178,
+     179,   180,   181,   182,   183,   184,   185,   186,   187,   188,
+     189,   190,   191,   192,   193,   194,   195,   196,   197,   198,
+     199,   200,   201,   202,   203,   204,   205,   206,   207,   208,
+     209,   210,   211,   212,   213,   214,   215,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,   234,   235,   236,   237,   238,
+     239,   240,   241,   242,   243,   244,   245,   246,   247,   248,
+     249,   250,   251,   252,   253,   254,   255,   256,   257,   258,
+     259,   260,   261,   262,   263,   264,   265,   266,   267,   268,
+     269,   270,   271,   272,   273,   274,   275,   276,   277,   278,
+     279,   280,   281,   282,   283,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   295,   296,   297,   298,
+     299,   300,   301,   302,   303,   304,   305,   306,   307,   308,
+     309,   310,   311,   312,   313,   314,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   667,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   316,   317,   318,   319,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   321,   322,   323,   324,   325,
+     326,   327,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   328,   329,   330,
+     331,   332,   333,     0,     0,     0,     0,     0,     0,     0,
+       0,   334,     0,   335,   336,   337,   338,   339,   340,   341,
+     342,   343,   344,   345,   346,   347,   348,   349,   350,   351,
+     352,   353,   354,   355,   356,   357,   358,   359,   360,   361,
+     362,   363,   364,   365,     1,     2,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+      37,    38,    39,    40,    41,    42,    43,    44,    45,    46,
+      47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
+      57,    58,    59,    60,    61,    62,    63,    64,    65,    66,
+      67,    68,    69,    70,    71,    72,    73,    74,    75,    76,
+      77,    78,    79,    80,    81,    82,    83,    84,    85,    86,
+      87,    88,    89,    90,    91,    92,    93,    94,    95,    96,
+      97,    98,    99,   100,   101,   102,   103,   104,   105,   106,
+     107,   108,   109,   110,   111,   112,   113,   114,   115,   116,
+     117,   118,   119,   120,   121,   122,   123,   124,   125,   126,
+     127,   128,   129,   130,   131,   132,   133,   134,   135,   136,
+     137,   138,   139,   140,   141,   142,   143,   144,   145,   146,
+     147,   148,   149,   150,   151,   152,   153,   154,   155,   156,
+     157,   158,   159,   160,   161,   162,   163,   164,   165,   166,
+     167,   168,   169,   170,   171,   172,   173,   174,   175,   176,
+     177,   178,   179,   180,   181,   182,   183,   184,   185,   186,
+     187,   188,   189,   190,   191,   192,   193,   194,   195,   196,
+     197,   198,   199,   200,   201,   202,   203,   204,   205,   206,
+     207,   208,   209,   210,   211,   212,   213,   214,   215,   216,
+     217,   218,   219,   220,   221,   222,   223,   224,   225,   226,
+     227,   228,   229,   230,   231,   232,   233,   234,   235,   236,
+     237,   238,   239,   240,   241,   242,   243,   244,   245,   246,
+     247,   248,   249,   250,   251,   252,   253,   254,   255,   256,
+     257,   258,   259,   260,   261,   262,   263,   264,   265,   266,
+     267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
+     277,   278,   279,   280,   281,   282,   283,   284,   285,   286,
+     287,   288,   289,   290,   291,   292,   293,   294,   295,   296,
+     297,   298,   299,   300,   301,   302,   303,   304,   305,   306,
+     307,   308,   309,   310,   311,   312,   313,   314,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   705,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   316,   317,   318,   319,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   321,   322,   323,
+     324,   325,   326,   327,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   328,
+     329,   330,   331,   332,   333,     0,     0,     0,     0,     0,
+       0,     0,     0,   334,     0,   335,   336,   337,   338,   339,
+     340,   341,   342,   343,   344,   345,   346,   347,   348,   349,
+     350,   351,   352,   353,   354,   355,   356,   357,   358,   359,
+     360,   361,   362,   363,   364,   365,     1,     2,     3,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
+      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
+      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
+      55,    56,    57,    58,    59,    60,    61,    62,    63,    64,
+      65,    66,    67,    68,    69,    70,    71,    72,    73,    74,
+      75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
+      85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
+      95,    96,    97,    98,    99,   100,   101,   102,   103,   104,
+     105,   106,   107,   108,   109,   110,   111,   112,   113,   114,
+     115,   116,   117,   118,   119,   120,   121,   122,   123,   124,
+     125,   126,   127,   128,   129,   130,   131,   132,   133,   134,
+     135,   136,   137,   138,   139,   140,   141,   142,   143,   144,
+     145,   146,   147,   148,   149,   150,   151,   152,   153,   154,
+     155,   156,   157,   158,   159,   160,   161,   162,   163,   164,
+     165,   166,   167,   168,   169,   170,   171,   172,   173,   174,
+     175,   176,   177,   178,   179,   180,   181,   182,   183,   184,
+     185,   186,   187,   188,   189,   190,   191,   192,   193,   194,
+     195,   196,   197,   198,   199,   200,   201,   202,   203,   204,
+     205,   206,   207,   208,   209,   210,   211,   212,   213,   214,
+     215,   216,   217,   218,   219,   220,   221,   222,   223,   224,
+     225,   226,   227,   228,   229,   230,   231,   232,   233,   234,
+     235,   236,   237,   238,   239,   240,   241,   242,   243,   244,
+     245,   246,   247,   248,   249,   250,   251,   252,   253,   254,
+     255,   256,   257,   258,   259,   260,   261,   262,   263,   264,
+     265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
+     275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
+     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
+     295,   296,   297,   298,   299,   300,   301,   302,   303,   304,
+     305,   306,   307,   308,   309,   310,   311,   312,   313,   314,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   316,   317,   318,   319,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   321,
+     322,   323,   324,   325,   326,   327,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   328,   329,   330,   331,   332,   333,     0,     0,     0,
+       0,     0,     0,     0,     0,   334,     0,   335,   336,   337,
+     338,   339,   340,   341,   342,   343,   344,   345,   346,   347,
+     348,   349,   350,   351,   352,   353,   354,   355,   356,   357,
+     358,   359,   360,   361,   362,   363,   364,   365,     2,     3,
        4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
       14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
       24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
       34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
       44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,    55,    56,    57,    58,    59,    60,    -1,    -1,    63,
+      54,    55,    56,    57,    58,     0,     0,    61,    62,    63,
       64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
       74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
       84,    85,    86,    87,    88,    89,    90,    91,    92,    93,
@@ -3060,17 +2321,993 @@
      264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
      274,   275,   276,   277,   278,   279,   280,   281,   282,   283,
      284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
-     294,    -1,    -1,   297,   298,    -1,    -1,    -1,    -1,    -1,
+     294,   295,   296,   297,   298,   299,   300,   301,   302,   303,
+     304,   305,   306,   307,   308,   309,   310,   311,   312,   313,
+     314,     0,     0,   444,   445,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   446,   447,     0,     0,     0,   554,   724,     0,
+       0,     0,     0,     0,   448,   449,   450,   451,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   452,   453,   454,   455,   456,
+     321,     0,     0,     0,     0,   326,   327,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   457,   458,
+     459,   460,   461,   462,   463,   464,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     347,     2,     3,     4,     5,     6,     7,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
+      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
+      41,    42,    43,    44,    45,    46,    47,    48,    49,    50,
+      51,    52,    53,    54,    55,    56,    57,    58,     0,     0,
+      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
+      71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
+      81,    82,    83,    84,    85,    86,    87,    88,    89,    90,
+      91,    92,    93,    94,    95,    96,    97,    98,    99,   100,
+     101,   102,   103,   104,   105,   106,   107,   108,   109,   110,
+     111,   112,   113,   114,   115,   116,   117,   118,   119,   120,
+     121,   122,   123,   124,   125,   126,   127,   128,   129,   130,
+     131,   132,   133,   134,   135,   136,   137,   138,   139,   140,
+     141,   142,   143,   144,   145,   146,   147,   148,   149,   150,
+     151,   152,   153,   154,   155,   156,   157,   158,   159,   160,
+     161,   162,   163,   164,   165,   166,   167,   168,   169,   170,
+     171,   172,   173,   174,   175,   176,   177,   178,   179,   180,
+     181,   182,   183,   184,   185,   186,   187,   188,   189,   190,
+     191,   192,   193,   194,   195,   196,   197,   198,   199,   200,
+     201,   202,   203,   204,   205,   206,   207,   208,   209,   210,
+     211,   212,   213,   214,   215,   216,   217,   218,   219,   220,
+     221,   222,   223,   224,   225,   226,   227,   228,   229,   230,
+     231,   232,   233,   234,   235,   236,   237,   238,   239,   240,
+     241,   242,   243,   244,   245,   246,   247,   248,   249,   250,
+     251,   252,   253,   254,   255,   256,   257,   258,   259,   260,
+     261,   262,   263,   264,   265,   266,   267,   268,   269,   270,
+     271,   272,   273,   274,   275,   276,   277,   278,   279,   280,
+     281,   282,   283,   284,   285,   286,   287,   288,   289,   290,
+     291,   292,   293,   294,   295,   296,   297,   298,   299,   300,
+     301,   302,   303,   304,   305,   306,   307,   308,   309,   310,
+     311,   312,   313,   314,     0,     0,   444,   445,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   446,   447,     0,     0,   492,
+       0,     0,     0,     0,     0,     0,     0,   448,   449,   450,
+     451,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   452,   453,
+     454,   455,   456,   321,     0,     0,     0,     0,   326,   327,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   457,   458,   459,   460,   461,   462,   463,   464,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   347,     2,     3,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
+      38,    39,    40,    41,    42,    43,    44,    45,    46,    47,
+      48,    49,    50,    51,    52,    53,    54,    55,    56,    57,
+      58,     0,     0,    61,    62,    63,    64,    65,    66,    67,
+      68,    69,    70,    71,    72,    73,    74,    75,    76,    77,
+      78,    79,    80,    81,    82,    83,    84,    85,    86,    87,
+      88,    89,    90,    91,    92,    93,    94,    95,    96,    97,
+      98,    99,   100,   101,   102,   103,   104,   105,   106,   107,
+     108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
+     118,   119,   120,   121,   122,   123,   124,   125,   126,   127,
+     128,   129,   130,   131,   132,   133,   134,   135,   136,   137,
+     138,   139,   140,   141,   142,   143,   144,   145,   146,   147,
+     148,   149,   150,   151,   152,   153,   154,   155,   156,   157,
+     158,   159,   160,   161,   162,   163,   164,   165,   166,   167,
+     168,   169,   170,   171,   172,   173,   174,   175,   176,   177,
+     178,   179,   180,   181,   182,   183,   184,   185,   186,   187,
+     188,   189,   190,   191,   192,   193,   194,   195,   196,   197,
+     198,   199,   200,   201,   202,   203,   204,   205,   206,   207,
+     208,   209,   210,   211,   212,   213,   214,   215,   216,   217,
+     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
+     228,   229,   230,   231,   232,   233,   234,   235,   236,   237,
+     238,   239,   240,   241,   242,   243,   244,   245,   246,   247,
+     248,   249,   250,   251,   252,   253,   254,   255,   256,   257,
+     258,   259,   260,   261,   262,   263,   264,   265,   266,   267,
+     268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
+     278,   279,   280,   281,   282,   283,   284,   285,   286,   287,
+     288,   289,   290,   291,   292,   293,   294,   295,   296,   297,
+     298,   299,   300,   301,   302,   303,   304,   305,   306,   307,
+     308,   309,   310,   311,   312,   313,   314,     0,     0,   444,
+     445,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   446,   447,
+       0,     0,     0,   554,     0,     0,     0,     0,     0,     0,
+     448,   449,   450,   451,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   452,   453,   454,   455,   456,   321,     0,     0,     0,
+       0,   326,   327,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   457,   458,   459,   460,   461,   462,
+     463,   464,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   347,     2,     3,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
+      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
+      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
+      55,    56,    57,    58,     0,     0,    61,    62,    63,    64,
+      65,    66,    67,    68,    69,    70,    71,    72,    73,    74,
+      75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
+      85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
+      95,    96,    97,    98,    99,   100,   101,   102,   103,   104,
+     105,   106,   107,   108,   109,   110,   111,   112,   113,   114,
+     115,   116,   117,   118,   119,   120,   121,   122,   123,   124,
+     125,   126,   127,   128,   129,   130,   131,   132,   133,   134,
+     135,   136,   137,   138,   139,   140,   141,   142,   143,   144,
+     145,   146,   147,   148,   149,   150,   151,   152,   153,   154,
+     155,   156,   157,   158,   159,   160,   161,   162,   163,   164,
+     165,   166,   167,   168,   169,   170,   171,   172,   173,   174,
+     175,   176,   177,   178,   179,   180,   181,   182,   183,   184,
+     185,   186,   187,   188,   189,   190,   191,   192,   193,   194,
+     195,   196,   197,   198,   199,   200,   201,   202,   203,   204,
+     205,   206,   207,   208,   209,   210,   211,   212,   213,   214,
+     215,   216,   217,   218,   219,   220,   221,   222,   223,   224,
+     225,   226,   227,   228,   229,   230,   231,   232,   233,   234,
+     235,   236,   237,   238,   239,   240,   241,   242,   243,   244,
+     245,   246,   247,   248,   249,   250,   251,   252,   253,   254,
+     255,   256,   257,   258,   259,   260,   261,   262,   263,   264,
+     265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
+     275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
+     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
+     295,   296,   297,   298,   299,   300,   301,   302,   303,   304,
+     305,   306,   307,   308,   309,   310,   311,   312,   313,   314,
+       0,     0,   444,   445,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   446,   447,     0,     0,   610,     0,     0,     0,     0,
+       0,     0,     0,   448,   449,   450,   451,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   452,   453,   454,   455,   456,   321,
+       0,     0,     0,     0,   326,   327,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   457,   458,   459,
+     460,   461,   462,   463,   464,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   347,
+       2,     3,     4,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
+      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
+      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
+      52,    53,    54,    55,    56,    57,    58,     0,     0,    61,
+      62,    63,    64,    65,    66,    67,    68,    69,    70,    71,
+      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
+      82,    83,    84,    85,    86,    87,    88,    89,    90,    91,
+      92,    93,    94,    95,    96,    97,    98,    99,   100,   101,
+     102,   103,   104,   105,   106,   107,   108,   109,   110,   111,
+     112,   113,   114,   115,   116,   117,   118,   119,   120,   121,
+     122,   123,   124,   125,   126,   127,   128,   129,   130,   131,
+     132,   133,   134,   135,   136,   137,   138,   139,   140,   141,
+     142,   143,   144,   145,   146,   147,   148,   149,   150,   151,
+     152,   153,   154,   155,   156,   157,   158,   159,   160,   161,
+     162,   163,   164,   165,   166,   167,   168,   169,   170,   171,
+     172,   173,   174,   175,   176,   177,   178,   179,   180,   181,
+     182,   183,   184,   185,   186,   187,   188,   189,   190,   191,
+     192,   193,   194,   195,   196,   197,   198,   199,   200,   201,
+     202,   203,   204,   205,   206,   207,   208,   209,   210,   211,
+     212,   213,   214,   215,   216,   217,   218,   219,   220,   221,
+     222,   223,   224,   225,   226,   227,   228,   229,   230,   231,
+     232,   233,   234,   235,   236,   237,   238,   239,   240,   241,
+     242,   243,   244,   245,   246,   247,   248,   249,   250,   251,
+     252,   253,   254,   255,   256,   257,   258,   259,   260,   261,
+     262,   263,   264,   265,   266,   267,   268,   269,   270,   271,
+     272,   273,   274,   275,   276,   277,   278,   279,   280,   281,
+     282,   283,   284,   285,   286,   287,   288,   289,   290,   291,
+     292,   293,   294,   295,   296,   297,   298,   299,   300,   301,
+     302,   303,   304,   305,   306,   307,   308,   309,   310,   311,
+     312,   313,   314,     0,     0,   444,   445,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   446,   447,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   622,   448,   449,   450,   451,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   452,   453,   454,
+     455,   456,   321,     0,     0,     0,     0,   326,   327,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     457,   458,   459,   460,   461,   462,   463,   464,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   347,     2,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
+      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+      39,    40,    41,    42,    43,    44,    45,    46,    47,    48,
+      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
+       0,     0,    61,    62,    63,    64,    65,    66,    67,    68,
+      69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
+      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
+      89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
+      99,   100,   101,   102,   103,   104,   105,   106,   107,   108,
+     109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
+     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
+     129,   130,   131,   132,   133,   134,   135,   136,   137,   138,
+     139,   140,   141,   142,   143,   144,   145,   146,   147,   148,
+     149,   150,   151,   152,   153,   154,   155,   156,   157,   158,
+     159,   160,   161,   162,   163,   164,   165,   166,   167,   168,
+     169,   170,   171,   172,   173,   174,   175,   176,   177,   178,
+     179,   180,   181,   182,   183,   184,   185,   186,   187,   188,
+     189,   190,   191,   192,   193,   194,   195,   196,   197,   198,
+     199,   200,   201,   202,   203,   204,   205,   206,   207,   208,
+     209,   210,   211,   212,   213,   214,   215,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,   234,   235,   236,   237,   238,
+     239,   240,   241,   242,   243,   244,   245,   246,   247,   248,
+     249,   250,   251,   252,   253,   254,   255,   256,   257,   258,
+     259,   260,   261,   262,   263,   264,   265,   266,   267,   268,
+     269,   270,   271,   272,   273,   274,   275,   276,   277,   278,
+     279,   280,   281,   282,   283,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   295,   296,   297,   298,
+     299,   300,   301,   302,   303,   304,   305,   306,   307,   308,
+     309,   310,   311,   312,   313,   314,     0,     0,   444,   445,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   446,   447,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   448,
+     449,   450,   451,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     452,   453,   454,   455,   456,   321,     0,     0,     0,     0,
+     326,   327,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   457,   458,   459,   460,   461,   462,   463,
+     464,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   347,     2,     3,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
+      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
+      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+      56,    57,    58,     0,     0,    61,    62,    63,    64,    65,
+      66,    67,    68,    69,    70,    71,    72,    73,    74,    75,
+      76,    77,    78,    79,    80,    81,    82,    83,    84,    85,
+      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
+      96,    97,    98,    99,   100,   101,   102,   103,   104,   105,
+     106,   107,   108,   109,   110,   111,   112,   113,   114,   115,
+     116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
+     126,   127,   128,   129,   130,   131,   132,   133,   134,   135,
+     136,   137,   138,   139,   140,   141,   142,   143,   144,   145,
+     146,   147,   148,   149,   150,   151,   152,   153,   154,   155,
+     156,   157,   158,   159,   160,   161,   162,   163,   164,   165,
+     166,   167,   168,   169,   170,   171,   172,   173,   174,   175,
+     176,   177,   178,   179,   180,   181,   182,   183,   184,   185,
+     186,   187,   188,   189,   190,   191,   192,   193,   194,   195,
+     196,   197,   198,   199,   200,   201,   202,   203,   204,   205,
+     206,   207,   208,   209,   210,   211,   212,   213,   214,   215,
+     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,
+     226,   227,   228,   229,   230,   231,   232,   233,   234,   235,
+     236,   237,   238,   239,   240,   241,   242,   243,   244,   245,
+     246,   247,   248,   249,   250,   251,   252,   253,   254,   255,
+     256,   257,   258,   259,   260,   261,   262,   263,   264,   265,
+     266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
+     276,   277,   278,   279,   280,   281,   282,   283,   284,   285,
+     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
+     296,   297,   298,   299,   300,   301,   302,   303,   304,   305,
+     306,   307,   308,   309,   310,   311,   312,   313,   314,     0,
+       0,   444,   445,     0,     0,   475,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   493,
+     446,   447,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   448,   449,   450,   451,   562,   563,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   452,   453,   454,   455,   456,   321,     0,
+       0,     0,     0,   326,   572,     0,     0,     0,   575,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   493,
+       0,     0,     0,     0,     0,     0,   457,   458,   459,   460,
+     461,   462,   463,   464,     0,     0,     0,     0,   493,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   347,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   662,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   668,   669,   670,   493,   493,   493,   493,   493,   493,
+     493,   493,   493,   493,   493,   493,   493,   493,   493,   493,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   493
+};
+
+static const yytype_int16 yycheck[] =
+{
+       0,   732,     0,   341,     0,   486,   346,   383,   739,     0,
+     386,   349,   388,   389,   346,   339,   392,   349,   358,   750,
+       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
+      34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
+      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
+      54,    55,    56,    57,    58,    59,    60,   558,   339,    63,
+      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
+      74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
+      84,    85,    86,    87,    88,    89,    90,    91,    92,    93,
+      94,    95,    96,    97,    98,    99,   100,   101,   102,   103,
+     104,   105,   106,   107,   108,   109,   110,   111,   112,   113,
+     114,   115,   116,   117,   118,   119,   120,   121,   122,   123,
+     124,   125,   126,   127,   128,   129,   130,   131,   132,   133,
+     134,   135,   136,   137,   138,   139,   140,   141,   142,   143,
+     144,   145,   146,   147,   148,   149,   150,   151,   152,   153,
+     154,   155,   156,   157,   158,   159,   160,   161,   162,   163,
+     164,   165,   166,   167,   168,   169,   170,   171,   172,   173,
+     174,   175,   176,   177,   178,   179,   180,   181,   182,   183,
+     184,   185,   186,   187,   188,   189,   190,   191,   192,   193,
+     194,   195,   196,   197,   198,   199,   200,   201,   202,   203,
+     204,   205,   206,   207,   208,   209,   210,   211,   212,   213,
+     214,   215,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+     234,   235,   236,   237,   238,   239,   240,   241,   242,   243,
+     244,   245,   246,   247,   248,   249,   250,   251,   252,   253,
+     254,   255,   256,   257,   258,   259,   260,   261,   262,   263,
+     264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
+     274,   275,   276,   277,   278,   279,   280,   281,   282,   283,
+     284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
+     294,   295,   296,   297,   298,   299,   300,   301,   302,   303,
+     304,   305,   306,   307,   308,   309,   310,   311,   312,   313,
+     314,   315,   316,   379,   447,   371,   540,   438,   552,   427,
+     554,   408,   484,   557,   343,   614,   326,   414,   321,   322,
+     693,   341,   339,   346,   341,   319,   320,   340,   404,   349,
+     349,   348,   340,   346,   400,   375,   341,   341,   435,   436,
+     375,   371,   473,   348,   348,   339,   375,   341,   721,   379,
+     371,   345,   362,   419,   357,   358,   375,   387,   379,   387,
+     390,   387,   376,   349,   399,   341,   387,   381,   382,   487,
+     400,   340,   348,   357,   404,   340,   519,   346,   521,   400,
+     340,   346,   343,   404,   618,   340,   346,   343,   506,   419,
+     346,   346,   375,   349,   346,   340,   340,   349,   419,   342,
+     430,   346,   346,   346,   343,   346,   482,   651,   349,   430,
+     323,   324,   584,   596,   597,   598,   599,   375,   484,   346,
+     486,   552,   349,   554,   567,   375,   557,   328,   329,   330,
+     331,   332,   333,   334,   335,   336,   337,   341,   346,   346,
+     571,   349,   349,   364,   365,   366,   349,   348,   354,   355,
+     356,   351,   482,   353,   484,   754,   486,   344,   692,   346,
+     704,   482,   348,   484,   375,   486,   317,   318,   346,   347,
+     346,   347,   592,   593,   340,   594,   595,   620,   600,   601,
+     339,   624,   579,   655,   341,   375,   375,   361,   360,   359,
+     325,   327,   558,   342,   341,   339,   344,   349,   339,   349,
+     744,   339,   339,   349,   347,   344,   375,   349,   339,   349,
+     540,   642,   643,   339,   375,   349,   349,   340,   584,   540,
+     651,   342,   375,   342,   346,   339,   760,   383,   558,   342,
+     375,   340,   339,   343,   340,   340,   348,   558,   349,   343,
+     343,   349,   344,   602,   687,   603,   606,   604,   710,   605,
+     693,   489,   607,   320,   584,   387,   578,   665,   695,   738,
+     750,   695,   751,   584,   721,   550,   712,   387,   550,   550,
+      -1,   400,    -1,   704,   404,    -1,   404,    -1,   721,    -1,
+     398,    -1,    -1,    -1,   614,    -1,    -1,    -1,   618,   655,
+     733,    -1,   710,   614,    -1,   726,    -1,   618,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   749,    -1,    -1,    -1,
+      -1,    -1,    -1,   744,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   655,    -1,   693,    -1,    -1,
+      -1,    -1,    -1,    -1,   655,    -1,    -1,    -1,    -1,    -1,
+     716,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   721,    -1,    -1,    -1,    -1,
+      -1,    -1,   692,   693,    -1,   695,    -1,    -1,    -1,    -1,
+      -1,   692,   693,    -1,   695,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   716,    -1,    -1,    -1,
+      -1,   721,    -1,    -1,    -1,   716,    -1,    -1,    -1,    -1,
+     721,    -1,   732,    -1,    -1,    -1,    -1,    -1,    -1,   739,
+      -1,   732,    -1,    -1,    -1,    -1,    -1,    -1,   739,    -1,
+     750,    -1,    -1,    -1,   754,    -1,    -1,    -1,    -1,   750,
+     760,    -1,    -1,   754,    -1,    -1,    -1,     0,    -1,   760,
+       3,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
+      33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
+      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
+      53,    54,    55,    56,    57,    58,    59,    60,    61,    62,
+      63,    64,    65,    66,    67,    68,    69,    70,    71,    72,
+      73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
+      83,    84,    85,    86,    87,    88,    89,    90,    91,    92,
+      93,    94,    95,    96,    97,    98,    99,   100,   101,   102,
+     103,   104,   105,   106,   107,   108,   109,   110,   111,   112,
+     113,   114,   115,   116,   117,   118,   119,   120,   121,   122,
+     123,   124,   125,   126,   127,   128,   129,   130,   131,   132,
+     133,   134,   135,   136,   137,   138,   139,   140,   141,   142,
+     143,   144,   145,   146,   147,   148,   149,   150,   151,   152,
+     153,   154,   155,   156,   157,   158,   159,   160,   161,   162,
+     163,   164,   165,   166,   167,   168,   169,   170,   171,   172,
+     173,   174,   175,   176,   177,   178,   179,   180,   181,   182,
+     183,   184,   185,   186,   187,   188,   189,   190,   191,   192,
+     193,   194,   195,   196,   197,   198,   199,   200,   201,   202,
+     203,   204,   205,   206,   207,   208,   209,   210,   211,   212,
+     213,   214,   215,   216,   217,   218,   219,   220,   221,   222,
+     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
+     233,   234,   235,   236,   237,   238,   239,   240,   241,   242,
+     243,   244,   245,   246,   247,   248,   249,   250,   251,   252,
+     253,   254,   255,   256,   257,   258,   259,   260,   261,   262,
+     263,   264,   265,   266,   267,   268,   269,   270,   271,   272,
+     273,   274,   275,   276,   277,   278,   279,   280,   281,   282,
+     283,   284,   285,   286,   287,   288,   289,   290,   291,   292,
+     293,   294,   295,   296,   297,   298,   299,   300,   301,   302,
+     303,   304,   305,   306,   307,   308,   309,   310,   311,   312,
+     313,   314,   315,   316,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   316,   317,    -1,    -1,    -1,   321,   322,    -1,
-      -1,    -1,    -1,    -1,   328,   329,   330,   331,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   349,   350,   351,   352,   353,
-     354,    -1,    -1,    -1,    -1,   359,   360,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   349,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   379,   380,   381,   382,   383,
-     384,   385,   386,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   401,     4,     5,
+     363,   364,   365,   366,   367,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   376,   377,   378,   379,   380,   381,   382,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   398,   399,   400,   401,   402,
+     403,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   412,
+      -1,   414,   415,   416,   417,   418,   419,   420,   421,   422,
+     423,   424,   425,   426,   427,   428,   429,   430,   431,   432,
+     433,   434,   435,   436,   437,   438,   439,   440,   441,   442,
+     443,   444,     3,     4,     5,     6,     7,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
+      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
+      41,    42,    43,    44,    45,    46,    47,    48,    49,    50,
+      51,    52,    53,    54,    55,    56,    57,    58,    59,    60,
+      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
+      71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
+      81,    82,    83,    84,    85,    86,    87,    88,    89,    90,
+      91,    92,    93,    94,    95,    96,    97,    98,    99,   100,
+     101,   102,   103,   104,   105,   106,   107,   108,   109,   110,
+     111,   112,   113,   114,   115,   116,   117,   118,   119,   120,
+     121,   122,   123,   124,   125,   126,   127,   128,   129,   130,
+     131,   132,   133,   134,   135,   136,   137,   138,   139,   140,
+     141,   142,   143,   144,   145,   146,   147,   148,   149,   150,
+     151,   152,   153,   154,   155,   156,   157,   158,   159,   160,
+     161,   162,   163,   164,   165,   166,   167,   168,   169,   170,
+     171,   172,   173,   174,   175,   176,   177,   178,   179,   180,
+     181,   182,   183,   184,   185,   186,   187,   188,   189,   190,
+     191,   192,   193,   194,   195,   196,   197,   198,   199,   200,
+     201,   202,   203,   204,   205,   206,   207,   208,   209,   210,
+     211,   212,   213,   214,   215,   216,   217,   218,   219,   220,
+     221,   222,   223,   224,   225,   226,   227,   228,   229,   230,
+     231,   232,   233,   234,   235,   236,   237,   238,   239,   240,
+     241,   242,   243,   244,   245,   246,   247,   248,   249,   250,
+     251,   252,   253,   254,   255,   256,   257,   258,   259,   260,
+     261,   262,   263,   264,   265,   266,   267,   268,   269,   270,
+     271,   272,   273,   274,   275,   276,   277,   278,   279,   280,
+     281,   282,   283,   284,   285,   286,   287,   288,   289,   290,
+     291,   292,   293,   294,   295,   296,   297,   298,   299,   300,
+     301,   302,   303,   304,   305,   306,   307,   308,   309,   310,
+     311,   312,   313,   314,   315,   316,    -1,    -1,   319,   320,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   338,   339,    -1,
+     341,    -1,   343,   344,    -1,    -1,    -1,    -1,   349,   350,
+     351,   352,   353,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   363,   364,   365,   366,   367,    -1,    -1,    -1,
+     371,   372,   373,   374,   375,   376,   377,   378,   379,   380,
+     381,   382,   383,   384,   385,   386,    -1,   388,   389,   390,
+     391,   392,   393,   394,   395,   396,   397,   398,   399,   400,
+     401,   402,   403,   404,   405,   406,   407,   408,   409,   410,
+     411,   412,   413,   414,   415,   416,   417,   418,   419,   420,
+     421,   422,   423,   424,   425,   426,   427,   428,   429,   430,
+     431,   432,   433,   434,   435,   436,   437,   438,   439,   440,
+     441,   442,   443,   444,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
+      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+      39,    40,    41,    42,    43,    44,    45,    46,    47,    48,
+      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
+      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
+      69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
+      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
+      89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
+      99,   100,   101,   102,   103,   104,   105,   106,   107,   108,
+     109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
+     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
+     129,   130,   131,   132,   133,   134,   135,   136,   137,   138,
+     139,   140,   141,   142,   143,   144,   145,   146,   147,   148,
+     149,   150,   151,   152,   153,   154,   155,   156,   157,   158,
+     159,   160,   161,   162,   163,   164,   165,   166,   167,   168,
+     169,   170,   171,   172,   173,   174,   175,   176,   177,   178,
+     179,   180,   181,   182,   183,   184,   185,   186,   187,   188,
+     189,   190,   191,   192,   193,   194,   195,   196,   197,   198,
+     199,   200,   201,   202,   203,   204,   205,   206,   207,   208,
+     209,   210,   211,   212,   213,   214,   215,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,   234,   235,   236,   237,   238,
+     239,   240,   241,   242,   243,   244,   245,   246,   247,   248,
+     249,   250,   251,   252,   253,   254,   255,   256,   257,   258,
+     259,   260,   261,   262,   263,   264,   265,   266,   267,   268,
+     269,   270,   271,   272,   273,   274,   275,   276,   277,   278,
+     279,   280,   281,   282,   283,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   295,   296,   297,   298,
+     299,   300,   301,   302,   303,   304,   305,   306,   307,   308,
+     309,   310,   311,   312,   313,   314,   315,   316,    -1,    -1,
+     319,   320,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   338,
+     339,    -1,   341,    -1,   343,   344,    -1,    -1,    -1,    -1,
+     349,   350,   351,   352,   353,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   363,   364,   365,   366,   367,    -1,
+      -1,    -1,   371,   372,   373,   374,   375,   376,   377,   378,
+     379,   380,   381,   382,   383,   384,   385,   386,    -1,   388,
+     389,   390,   391,   392,   393,   394,   395,   396,   397,   398,
+     399,   400,   401,   402,   403,   404,   405,   406,   407,   408,
+     409,   410,   411,   412,   413,   414,   415,   416,   417,   418,
+     419,   420,   421,   422,   423,   424,   425,   426,   427,   428,
+     429,   430,   431,   432,   433,   434,   435,   436,   437,   438,
+     439,   440,   441,   442,   443,   444,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+      37,    38,    39,    40,    41,    42,    43,    44,    45,    46,
+      47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
+      57,    58,    59,    60,    61,    62,    63,    64,    65,    66,
+      67,    68,    69,    70,    71,    72,    73,    74,    75,    76,
+      77,    78,    79,    80,    81,    82,    83,    84,    85,    86,
+      87,    88,    89,    90,    91,    92,    93,    94,    95,    96,
+      97,    98,    99,   100,   101,   102,   103,   104,   105,   106,
+     107,   108,   109,   110,   111,   112,   113,   114,   115,   116,
+     117,   118,   119,   120,   121,   122,   123,   124,   125,   126,
+     127,   128,   129,   130,   131,   132,   133,   134,   135,   136,
+     137,   138,   139,   140,   141,   142,   143,   144,   145,   146,
+     147,   148,   149,   150,   151,   152,   153,   154,   155,   156,
+     157,   158,   159,   160,   161,   162,   163,   164,   165,   166,
+     167,   168,   169,   170,   171,   172,   173,   174,   175,   176,
+     177,   178,   179,   180,   181,   182,   183,   184,   185,   186,
+     187,   188,   189,   190,   191,   192,   193,   194,   195,   196,
+     197,   198,   199,   200,   201,   202,   203,   204,   205,   206,
+     207,   208,   209,   210,   211,   212,   213,   214,   215,   216,
+     217,   218,   219,   220,   221,   222,   223,   224,   225,   226,
+     227,   228,   229,   230,   231,   232,   233,   234,   235,   236,
+     237,   238,   239,   240,   241,   242,   243,   244,   245,   246,
+     247,   248,   249,   250,   251,   252,   253,   254,   255,   256,
+     257,   258,   259,   260,   261,   262,   263,   264,   265,   266,
+     267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
+     277,   278,   279,   280,   281,   282,   283,   284,   285,   286,
+     287,   288,   289,   290,   291,   292,   293,   294,   295,   296,
+     297,   298,   299,   300,   301,   302,   303,   304,   305,   306,
+     307,   308,   309,   310,   311,   312,   313,   314,   315,   316,
+      -1,    -1,   319,   320,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   338,   339,    -1,   341,    -1,   343,    -1,    -1,    -1,
+      -1,    -1,   349,   350,   351,   352,   353,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   363,   364,   365,   366,
+     367,    -1,    -1,    -1,   371,   372,   373,   374,   375,   376,
+     377,   378,   379,   380,   381,   382,   383,   384,   385,   386,
+      -1,   388,   389,   390,   391,   392,   393,   394,   395,   396,
+     397,   398,   399,   400,   401,   402,   403,   404,   405,   406,
+     407,   408,   409,   410,   411,   412,   413,   414,   415,   416,
+     417,   418,   419,   420,   421,   422,   423,   424,   425,   426,
+     427,   428,   429,   430,   431,   432,   433,   434,   435,   436,
+     437,   438,   439,   440,   441,   442,   443,   444,     3,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
+      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
+      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
+      55,    56,    57,    58,    59,    60,    61,    62,    63,    64,
+      65,    66,    67,    68,    69,    70,    71,    72,    73,    74,
+      75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
+      85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
+      95,    96,    97,    98,    99,   100,   101,   102,   103,   104,
+     105,   106,   107,   108,   109,   110,   111,   112,   113,   114,
+     115,   116,   117,   118,   119,   120,   121,   122,   123,   124,
+     125,   126,   127,   128,   129,   130,   131,   132,   133,   134,
+     135,   136,   137,   138,   139,   140,   141,   142,   143,   144,
+     145,   146,   147,   148,   149,   150,   151,   152,   153,   154,
+     155,   156,   157,   158,   159,   160,   161,   162,   163,   164,
+     165,   166,   167,   168,   169,   170,   171,   172,   173,   174,
+     175,   176,   177,   178,   179,   180,   181,   182,   183,   184,
+     185,   186,   187,   188,   189,   190,   191,   192,   193,   194,
+     195,   196,   197,   198,   199,   200,   201,   202,   203,   204,
+     205,   206,   207,   208,   209,   210,   211,   212,   213,   214,
+     215,   216,   217,   218,   219,   220,   221,   222,   223,   224,
+     225,   226,   227,   228,   229,   230,   231,   232,   233,   234,
+     235,   236,   237,   238,   239,   240,   241,   242,   243,   244,
+     245,   246,   247,   248,   249,   250,   251,   252,   253,   254,
+     255,   256,   257,   258,   259,   260,   261,   262,   263,   264,
+     265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
+     275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
+     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
+     295,   296,   297,   298,   299,   300,   301,   302,   303,   304,
+     305,   306,   307,   308,   309,   310,   311,   312,   313,   314,
+     315,   316,    -1,    -1,   319,   320,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   338,   339,    -1,   341,    -1,   343,    -1,
+      -1,    -1,    -1,    -1,   349,   350,   351,   352,   353,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   363,   364,
+     365,   366,   367,    -1,    -1,    -1,   371,   372,   373,   374,
+     375,   376,   377,   378,   379,   380,   381,   382,   383,   384,
+     385,   386,    -1,   388,   389,   390,   391,   392,   393,   394,
+     395,   396,   397,   398,   399,   400,   401,   402,   403,   404,
+     405,   406,   407,   408,   409,   410,   411,   412,   413,   414,
+     415,   416,   417,   418,   419,   420,   421,   422,   423,   424,
+     425,   426,   427,   428,   429,   430,   431,   432,   433,   434,
+     435,   436,   437,   438,   439,   440,   441,   442,   443,   444,
+       3,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
+      33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
+      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
+      53,    54,    55,    56,    57,    58,    59,    60,    61,    62,
+      63,    64,    65,    66,    67,    68,    69,    70,    71,    72,
+      73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
+      83,    84,    85,    86,    87,    88,    89,    90,    91,    92,
+      93,    94,    95,    96,    97,    98,    99,   100,   101,   102,
+     103,   104,   105,   106,   107,   108,   109,   110,   111,   112,
+     113,   114,   115,   116,   117,   118,   119,   120,   121,   122,
+     123,   124,   125,   126,   127,   128,   129,   130,   131,   132,
+     133,   134,   135,   136,   137,   138,   139,   140,   141,   142,
+     143,   144,   145,   146,   147,   148,   149,   150,   151,   152,
+     153,   154,   155,   156,   157,   158,   159,   160,   161,   162,
+     163,   164,   165,   166,   167,   168,   169,   170,   171,   172,
+     173,   174,   175,   176,   177,   178,   179,   180,   181,   182,
+     183,   184,   185,   186,   187,   188,   189,   190,   191,   192,
+     193,   194,   195,   196,   197,   198,   199,   200,   201,   202,
+     203,   204,   205,   206,   207,   208,   209,   210,   211,   212,
+     213,   214,   215,   216,   217,   218,   219,   220,   221,   222,
+     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
+     233,   234,   235,   236,   237,   238,   239,   240,   241,   242,
+     243,   244,   245,   246,   247,   248,   249,   250,   251,   252,
+     253,   254,   255,   256,   257,   258,   259,   260,   261,   262,
+     263,   264,   265,   266,   267,   268,   269,   270,   271,   272,
+     273,   274,   275,   276,   277,   278,   279,   280,   281,   282,
+     283,   284,   285,   286,   287,   288,   289,   290,   291,   292,
+     293,   294,   295,   296,   297,   298,   299,   300,   301,   302,
+     303,   304,   305,   306,   307,   308,   309,   310,   311,   312,
+     313,   314,   315,   316,    -1,    -1,   319,   320,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   338,   339,    -1,   341,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   349,   350,   351,   352,
+     353,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     363,   364,   365,   366,   367,    -1,    -1,    -1,   371,   372,
+     373,   374,   375,   376,   377,   378,   379,   380,   381,   382,
+     383,   384,   385,   386,    -1,   388,   389,   390,   391,   392,
+     393,   394,   395,   396,   397,   398,   399,   400,   401,   402,
+     403,   404,   405,   406,   407,   408,   409,   410,   411,   412,
+     413,   414,   415,   416,   417,   418,   419,   420,   421,   422,
+     423,   424,   425,   426,   427,   428,   429,   430,   431,   432,
+     433,   434,   435,   436,   437,   438,   439,   440,   441,   442,
+     443,   444,     3,     4,     5,     6,     7,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
+      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
+      41,    42,    43,    44,    45,    46,    47,    48,    49,    50,
+      51,    52,    53,    54,    55,    56,    57,    58,    59,    60,
+      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
+      71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
+      81,    82,    83,    84,    85,    86,    87,    88,    89,    90,
+      91,    92,    93,    94,    95,    96,    97,    98,    99,   100,
+     101,   102,   103,   104,   105,   106,   107,   108,   109,   110,
+     111,   112,   113,   114,   115,   116,   117,   118,   119,   120,
+     121,   122,   123,   124,   125,   126,   127,   128,   129,   130,
+     131,   132,   133,   134,   135,   136,   137,   138,   139,   140,
+     141,   142,   143,   144,   145,   146,   147,   148,   149,   150,
+     151,   152,   153,   154,   155,   156,   157,   158,   159,   160,
+     161,   162,   163,   164,   165,   166,   167,   168,   169,   170,
+     171,   172,   173,   174,   175,   176,   177,   178,   179,   180,
+     181,   182,   183,   184,   185,   186,   187,   188,   189,   190,
+     191,   192,   193,   194,   195,   196,   197,   198,   199,   200,
+     201,   202,   203,   204,   205,   206,   207,   208,   209,   210,
+     211,   212,   213,   214,   215,   216,   217,   218,   219,   220,
+     221,   222,   223,   224,   225,   226,   227,   228,   229,   230,
+     231,   232,   233,   234,   235,   236,   237,   238,   239,   240,
+     241,   242,   243,   244,   245,   246,   247,   248,   249,   250,
+     251,   252,   253,   254,   255,   256,   257,   258,   259,   260,
+     261,   262,   263,   264,   265,   266,   267,   268,   269,   270,
+     271,   272,   273,   274,   275,   276,   277,   278,   279,   280,
+     281,   282,   283,   284,   285,   286,   287,   288,   289,   290,
+     291,   292,   293,   294,   295,   296,   297,   298,   299,   300,
+     301,   302,   303,   304,   305,   306,   307,   308,   309,   310,
+     311,   312,   313,   314,   315,   316,    -1,    -1,   319,   320,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   338,   339,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   349,   350,
+     351,   352,   353,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   363,   364,   365,   366,   367,    -1,    -1,    -1,
+     371,   372,   373,   374,   375,   376,   377,   378,   379,   380,
+     381,   382,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   398,   399,   400,
+     401,   402,   403,   404,   405,   406,   407,   408,   409,   410,
+     411,   412,    -1,   414,   415,   416,   417,   418,   419,   420,
+     421,   422,   423,   424,   425,   426,   427,   428,   429,   430,
+     431,   432,   433,   434,   435,   436,   437,   438,   439,   440,
+     441,   442,   443,   444,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
+      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+      39,    40,    41,    42,    43,    44,    45,    46,    47,    48,
+      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
+      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
+      69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
+      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
+      89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
+      99,   100,   101,   102,   103,   104,   105,   106,   107,   108,
+     109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
+     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
+     129,   130,   131,   132,   133,   134,   135,   136,   137,   138,
+     139,   140,   141,   142,   143,   144,   145,   146,   147,   148,
+     149,   150,   151,   152,   153,   154,   155,   156,   157,   158,
+     159,   160,   161,   162,   163,   164,   165,   166,   167,   168,
+     169,   170,   171,   172,   173,   174,   175,   176,   177,   178,
+     179,   180,   181,   182,   183,   184,   185,   186,   187,   188,
+     189,   190,   191,   192,   193,   194,   195,   196,   197,   198,
+     199,   200,   201,   202,   203,   204,   205,   206,   207,   208,
+     209,   210,   211,   212,   213,   214,   215,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,   234,   235,   236,   237,   238,
+     239,   240,   241,   242,   243,   244,   245,   246,   247,   248,
+     249,   250,   251,   252,   253,   254,   255,   256,   257,   258,
+     259,   260,   261,   262,   263,   264,   265,   266,   267,   268,
+     269,   270,   271,   272,   273,   274,   275,   276,   277,   278,
+     279,   280,   281,   282,   283,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   295,   296,   297,   298,
+     299,   300,   301,   302,   303,   304,   305,   306,   307,   308,
+     309,   310,   311,   312,   313,   314,   315,   316,    -1,    -1,
+     319,   320,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   338,
+     339,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   350,   351,   352,   353,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   363,   364,   365,   366,    -1,    -1,
+      -1,    -1,   371,   372,   373,   374,   375,   376,   377,   378,
+     379,   380,   381,   382,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   398,
+     399,   400,   401,   402,   403,   404,   405,   406,   407,   408,
+     409,   410,   411,   412,    -1,   414,   415,   416,   417,   418,
+     419,   420,   421,   422,   423,   424,   425,   426,   427,   428,
+     429,   430,   431,   432,   433,   434,   435,   436,   437,   438,
+     439,   440,   441,   442,   443,   444,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+      37,    38,    39,    40,    41,    42,    43,    44,    45,    46,
+      47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
+      57,    58,    59,    60,    61,    62,    63,    64,    65,    66,
+      67,    68,    69,    70,    71,    72,    73,    74,    75,    76,
+      77,    78,    79,    80,    81,    82,    83,    84,    85,    86,
+      87,    88,    89,    90,    91,    92,    93,    94,    95,    96,
+      97,    98,    99,   100,   101,   102,   103,   104,   105,   106,
+     107,   108,   109,   110,   111,   112,   113,   114,   115,   116,
+     117,   118,   119,   120,   121,   122,   123,   124,   125,   126,
+     127,   128,   129,   130,   131,   132,   133,   134,   135,   136,
+     137,   138,   139,   140,   141,   142,   143,   144,   145,   146,
+     147,   148,   149,   150,   151,   152,   153,   154,   155,   156,
+     157,   158,   159,   160,   161,   162,   163,   164,   165,   166,
+     167,   168,   169,   170,   171,   172,   173,   174,   175,   176,
+     177,   178,   179,   180,   181,   182,   183,   184,   185,   186,
+     187,   188,   189,   190,   191,   192,   193,   194,   195,   196,
+     197,   198,   199,   200,   201,   202,   203,   204,   205,   206,
+     207,   208,   209,   210,   211,   212,   213,   214,   215,   216,
+     217,   218,   219,   220,   221,   222,   223,   224,   225,   226,
+     227,   228,   229,   230,   231,   232,   233,   234,   235,   236,
+     237,   238,   239,   240,   241,   242,   243,   244,   245,   246,
+     247,   248,   249,   250,   251,   252,   253,   254,   255,   256,
+     257,   258,   259,   260,   261,   262,   263,   264,   265,   266,
+     267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
+     277,   278,   279,   280,   281,   282,   283,   284,   285,   286,
+     287,   288,   289,   290,   291,   292,   293,   294,   295,   296,
+     297,   298,   299,   300,   301,   302,   303,   304,   305,   306,
+     307,   308,   309,   310,   311,   312,   313,   314,   315,   316,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   349,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   363,   364,   365,   366,
+     367,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   376,
+     377,   378,   379,   380,   381,   382,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   398,   399,   400,   401,   402,   403,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   412,    -1,   414,   415,   416,
+     417,   418,   419,   420,   421,   422,   423,   424,   425,   426,
+     427,   428,   429,   430,   431,   432,   433,   434,   435,   436,
+     437,   438,   439,   440,   441,   442,   443,   444,     3,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
+      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
+      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
+      55,    56,    57,    58,    59,    60,    61,    62,    63,    64,
+      65,    66,    67,    68,    69,    70,    71,    72,    73,    74,
+      75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
+      85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
+      95,    96,    97,    98,    99,   100,   101,   102,   103,   104,
+     105,   106,   107,   108,   109,   110,   111,   112,   113,   114,
+     115,   116,   117,   118,   119,   120,   121,   122,   123,   124,
+     125,   126,   127,   128,   129,   130,   131,   132,   133,   134,
+     135,   136,   137,   138,   139,   140,   141,   142,   143,   144,
+     145,   146,   147,   148,   149,   150,   151,   152,   153,   154,
+     155,   156,   157,   158,   159,   160,   161,   162,   163,   164,
+     165,   166,   167,   168,   169,   170,   171,   172,   173,   174,
+     175,   176,   177,   178,   179,   180,   181,   182,   183,   184,
+     185,   186,   187,   188,   189,   190,   191,   192,   193,   194,
+     195,   196,   197,   198,   199,   200,   201,   202,   203,   204,
+     205,   206,   207,   208,   209,   210,   211,   212,   213,   214,
+     215,   216,   217,   218,   219,   220,   221,   222,   223,   224,
+     225,   226,   227,   228,   229,   230,   231,   232,   233,   234,
+     235,   236,   237,   238,   239,   240,   241,   242,   243,   244,
+     245,   246,   247,   248,   249,   250,   251,   252,   253,   254,
+     255,   256,   257,   258,   259,   260,   261,   262,   263,   264,
+     265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
+     275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
+     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
+     295,   296,   297,   298,   299,   300,   301,   302,   303,   304,
+     305,   306,   307,   308,   309,   310,   311,   312,   313,   314,
+     315,   316,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   349,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   363,   364,
+     365,   366,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     375,   376,   377,   378,   379,   380,   381,   382,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   398,   399,   400,   401,   402,   403,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   412,    -1,   414,
+     415,   416,   417,   418,   419,   420,   421,   422,   423,   424,
+     425,   426,   427,   428,   429,   430,   431,   432,   433,   434,
+     435,   436,   437,   438,   439,   440,   441,   442,   443,   444,
+       3,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
+      33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
+      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
+      53,    54,    55,    56,    57,    58,    59,    60,    61,    62,
+      63,    64,    65,    66,    67,    68,    69,    70,    71,    72,
+      73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
+      83,    84,    85,    86,    87,    88,    89,    90,    91,    92,
+      93,    94,    95,    96,    97,    98,    99,   100,   101,   102,
+     103,   104,   105,   106,   107,   108,   109,   110,   111,   112,
+     113,   114,   115,   116,   117,   118,   119,   120,   121,   122,
+     123,   124,   125,   126,   127,   128,   129,   130,   131,   132,
+     133,   134,   135,   136,   137,   138,   139,   140,   141,   142,
+     143,   144,   145,   146,   147,   148,   149,   150,   151,   152,
+     153,   154,   155,   156,   157,   158,   159,   160,   161,   162,
+     163,   164,   165,   166,   167,   168,   169,   170,   171,   172,
+     173,   174,   175,   176,   177,   178,   179,   180,   181,   182,
+     183,   184,   185,   186,   187,   188,   189,   190,   191,   192,
+     193,   194,   195,   196,   197,   198,   199,   200,   201,   202,
+     203,   204,   205,   206,   207,   208,   209,   210,   211,   212,
+     213,   214,   215,   216,   217,   218,   219,   220,   221,   222,
+     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
+     233,   234,   235,   236,   237,   238,   239,   240,   241,   242,
+     243,   244,   245,   246,   247,   248,   249,   250,   251,   252,
+     253,   254,   255,   256,   257,   258,   259,   260,   261,   262,
+     263,   264,   265,   266,   267,   268,   269,   270,   271,   272,
+     273,   274,   275,   276,   277,   278,   279,   280,   281,   282,
+     283,   284,   285,   286,   287,   288,   289,   290,   291,   292,
+     293,   294,   295,   296,   297,   298,   299,   300,   301,   302,
+     303,   304,   305,   306,   307,   308,   309,   310,   311,   312,
+     313,   314,   315,   316,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   344,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     363,   364,   365,   366,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   376,   377,   378,   379,   380,   381,   382,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   398,   399,   400,   401,   402,
+     403,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   412,
+      -1,   414,   415,   416,   417,   418,   419,   420,   421,   422,
+     423,   424,   425,   426,   427,   428,   429,   430,   431,   432,
+     433,   434,   435,   436,   437,   438,   439,   440,   441,   442,
+     443,   444,     3,     4,     5,     6,     7,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
+      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
+      41,    42,    43,    44,    45,    46,    47,    48,    49,    50,
+      51,    52,    53,    54,    55,    56,    57,    58,    59,    60,
+      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
+      71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
+      81,    82,    83,    84,    85,    86,    87,    88,    89,    90,
+      91,    92,    93,    94,    95,    96,    97,    98,    99,   100,
+     101,   102,   103,   104,   105,   106,   107,   108,   109,   110,
+     111,   112,   113,   114,   115,   116,   117,   118,   119,   120,
+     121,   122,   123,   124,   125,   126,   127,   128,   129,   130,
+     131,   132,   133,   134,   135,   136,   137,   138,   139,   140,
+     141,   142,   143,   144,   145,   146,   147,   148,   149,   150,
+     151,   152,   153,   154,   155,   156,   157,   158,   159,   160,
+     161,   162,   163,   164,   165,   166,   167,   168,   169,   170,
+     171,   172,   173,   174,   175,   176,   177,   178,   179,   180,
+     181,   182,   183,   184,   185,   186,   187,   188,   189,   190,
+     191,   192,   193,   194,   195,   196,   197,   198,   199,   200,
+     201,   202,   203,   204,   205,   206,   207,   208,   209,   210,
+     211,   212,   213,   214,   215,   216,   217,   218,   219,   220,
+     221,   222,   223,   224,   225,   226,   227,   228,   229,   230,
+     231,   232,   233,   234,   235,   236,   237,   238,   239,   240,
+     241,   242,   243,   244,   245,   246,   247,   248,   249,   250,
+     251,   252,   253,   254,   255,   256,   257,   258,   259,   260,
+     261,   262,   263,   264,   265,   266,   267,   268,   269,   270,
+     271,   272,   273,   274,   275,   276,   277,   278,   279,   280,
+     281,   282,   283,   284,   285,   286,   287,   288,   289,   290,
+     291,   292,   293,   294,   295,   296,   297,   298,   299,   300,
+     301,   302,   303,   304,   305,   306,   307,   308,   309,   310,
+     311,   312,   313,   314,   315,   316,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   344,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   363,   364,   365,   366,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   376,   377,   378,   379,   380,
+     381,   382,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   398,   399,   400,
+     401,   402,   403,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   412,    -1,   414,   415,   416,   417,   418,   419,   420,
+     421,   422,   423,   424,   425,   426,   427,   428,   429,   430,
+     431,   432,   433,   434,   435,   436,   437,   438,   439,   440,
+     441,   442,   443,   444,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
+      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+      39,    40,    41,    42,    43,    44,    45,    46,    47,    48,
+      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
+      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
+      69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
+      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
+      89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
+      99,   100,   101,   102,   103,   104,   105,   106,   107,   108,
+     109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
+     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
+     129,   130,   131,   132,   133,   134,   135,   136,   137,   138,
+     139,   140,   141,   142,   143,   144,   145,   146,   147,   148,
+     149,   150,   151,   152,   153,   154,   155,   156,   157,   158,
+     159,   160,   161,   162,   163,   164,   165,   166,   167,   168,
+     169,   170,   171,   172,   173,   174,   175,   176,   177,   178,
+     179,   180,   181,   182,   183,   184,   185,   186,   187,   188,
+     189,   190,   191,   192,   193,   194,   195,   196,   197,   198,
+     199,   200,   201,   202,   203,   204,   205,   206,   207,   208,
+     209,   210,   211,   212,   213,   214,   215,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,   234,   235,   236,   237,   238,
+     239,   240,   241,   242,   243,   244,   245,   246,   247,   248,
+     249,   250,   251,   252,   253,   254,   255,   256,   257,   258,
+     259,   260,   261,   262,   263,   264,   265,   266,   267,   268,
+     269,   270,   271,   272,   273,   274,   275,   276,   277,   278,
+     279,   280,   281,   282,   283,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   295,   296,   297,   298,
+     299,   300,   301,   302,   303,   304,   305,   306,   307,   308,
+     309,   310,   311,   312,   313,   314,   315,   316,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   344,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   363,   364,   365,   366,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   376,   377,   378,
+     379,   380,   381,   382,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   398,
+     399,   400,   401,   402,   403,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   412,    -1,   414,   415,   416,   417,   418,
+     419,   420,   421,   422,   423,   424,   425,   426,   427,   428,
+     429,   430,   431,   432,   433,   434,   435,   436,   437,   438,
+     439,   440,   441,   442,   443,   444,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+      37,    38,    39,    40,    41,    42,    43,    44,    45,    46,
+      47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
+      57,    58,    59,    60,    61,    62,    63,    64,    65,    66,
+      67,    68,    69,    70,    71,    72,    73,    74,    75,    76,
+      77,    78,    79,    80,    81,    82,    83,    84,    85,    86,
+      87,    88,    89,    90,    91,    92,    93,    94,    95,    96,
+      97,    98,    99,   100,   101,   102,   103,   104,   105,   106,
+     107,   108,   109,   110,   111,   112,   113,   114,   115,   116,
+     117,   118,   119,   120,   121,   122,   123,   124,   125,   126,
+     127,   128,   129,   130,   131,   132,   133,   134,   135,   136,
+     137,   138,   139,   140,   141,   142,   143,   144,   145,   146,
+     147,   148,   149,   150,   151,   152,   153,   154,   155,   156,
+     157,   158,   159,   160,   161,   162,   163,   164,   165,   166,
+     167,   168,   169,   170,   171,   172,   173,   174,   175,   176,
+     177,   178,   179,   180,   181,   182,   183,   184,   185,   186,
+     187,   188,   189,   190,   191,   192,   193,   194,   195,   196,
+     197,   198,   199,   200,   201,   202,   203,   204,   205,   206,
+     207,   208,   209,   210,   211,   212,   213,   214,   215,   216,
+     217,   218,   219,   220,   221,   222,   223,   224,   225,   226,
+     227,   228,   229,   230,   231,   232,   233,   234,   235,   236,
+     237,   238,   239,   240,   241,   242,   243,   244,   245,   246,
+     247,   248,   249,   250,   251,   252,   253,   254,   255,   256,
+     257,   258,   259,   260,   261,   262,   263,   264,   265,   266,
+     267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
+     277,   278,   279,   280,   281,   282,   283,   284,   285,   286,
+     287,   288,   289,   290,   291,   292,   293,   294,   295,   296,
+     297,   298,   299,   300,   301,   302,   303,   304,   305,   306,
+     307,   308,   309,   310,   311,   312,   313,   314,   315,   316,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   363,   364,   365,   366,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   376,
+     377,   378,   379,   380,   381,   382,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   398,   399,   400,   401,   402,   403,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   412,    -1,   414,   415,   416,
+     417,   418,   419,   420,   421,   422,   423,   424,   425,   426,
+     427,   428,   429,   430,   431,   432,   433,   434,   435,   436,
+     437,   438,   439,   440,   441,   442,   443,   444,     4,     5,
        6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
       16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
       26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
@@ -3099,58 +3336,63 @@
      256,   257,   258,   259,   260,   261,   262,   263,   264,   265,
      266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
      276,   277,   278,   279,   280,   281,   282,   283,   284,   285,
-     286,   287,   288,   289,   290,   291,   292,   293,   294,    -1,
-      -1,   297,   298,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
+     296,   297,   298,   299,   300,   301,   302,   303,   304,   305,
+     306,   307,   308,   309,   310,   311,   312,   313,   314,   315,
+     316,    -1,    -1,   319,   320,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     316,   317,    -1,    -1,   320,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   328,   329,   330,   331,    -1,    -1,    -1,    -1,
+      -1,    -1,   338,   339,    -1,    -1,    -1,   343,   344,    -1,
+      -1,    -1,    -1,    -1,   350,   351,   352,   353,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   349,   350,   351,   352,   353,   354,    -1,
-      -1,    -1,    -1,   359,   360,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   371,   372,   373,   374,   375,
+     376,    -1,    -1,    -1,    -1,   381,   382,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   379,   380,   381,   382,   383,   384,   385,
-     386,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   401,     4,     5,     6,     7,
-       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
-      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
-      38,    39,    40,    41,    42,    43,    44,    45,    46,    47,
-      48,    49,    50,    51,    52,    53,    54,    55,    56,    57,
-      58,    59,    60,    -1,    -1,    63,    64,    65,    66,    67,
-      68,    69,    70,    71,    72,    73,    74,    75,    76,    77,
-      78,    79,    80,    81,    82,    83,    84,    85,    86,    87,
-      88,    89,    90,    91,    92,    93,    94,    95,    96,    97,
-      98,    99,   100,   101,   102,   103,   104,   105,   106,   107,
-     108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
-     118,   119,   120,   121,   122,   123,   124,   125,   126,   127,
-     128,   129,   130,   131,   132,   133,   134,   135,   136,   137,
-     138,   139,   140,   141,   142,   143,   144,   145,   146,   147,
-     148,   149,   150,   151,   152,   153,   154,   155,   156,   157,
-     158,   159,   160,   161,   162,   163,   164,   165,   166,   167,
-     168,   169,   170,   171,   172,   173,   174,   175,   176,   177,
-     178,   179,   180,   181,   182,   183,   184,   185,   186,   187,
-     188,   189,   190,   191,   192,   193,   194,   195,   196,   197,
-     198,   199,   200,   201,   202,   203,   204,   205,   206,   207,
-     208,   209,   210,   211,   212,   213,   214,   215,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,   234,   235,   236,   237,
-     238,   239,   240,   241,   242,   243,   244,   245,   246,   247,
-     248,   249,   250,   251,   252,   253,   254,   255,   256,   257,
-     258,   259,   260,   261,   262,   263,   264,   265,   266,   267,
-     268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
-     278,   279,   280,   281,   282,   283,   284,   285,   286,   287,
-     288,   289,   290,   291,   292,   293,   294,    -1,    -1,   297,
-     298,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   316,   317,
-      -1,    -1,    -1,   321,    -1,    -1,    -1,    -1,    -1,    -1,
-     328,   329,   330,   331,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   404,   405,
+     406,   407,   408,   409,   410,   411,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   349,   350,   351,   352,   353,   354,    -1,    -1,    -1,
-      -1,   359,   360,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     426,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
+      33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
+      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
+      53,    54,    55,    56,    57,    58,    59,    60,    -1,    -1,
+      63,    64,    65,    66,    67,    68,    69,    70,    71,    72,
+      73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
+      83,    84,    85,    86,    87,    88,    89,    90,    91,    92,
+      93,    94,    95,    96,    97,    98,    99,   100,   101,   102,
+     103,   104,   105,   106,   107,   108,   109,   110,   111,   112,
+     113,   114,   115,   116,   117,   118,   119,   120,   121,   122,
+     123,   124,   125,   126,   127,   128,   129,   130,   131,   132,
+     133,   134,   135,   136,   137,   138,   139,   140,   141,   142,
+     143,   144,   145,   146,   147,   148,   149,   150,   151,   152,
+     153,   154,   155,   156,   157,   158,   159,   160,   161,   162,
+     163,   164,   165,   166,   167,   168,   169,   170,   171,   172,
+     173,   174,   175,   176,   177,   178,   179,   180,   181,   182,
+     183,   184,   185,   186,   187,   188,   189,   190,   191,   192,
+     193,   194,   195,   196,   197,   198,   199,   200,   201,   202,
+     203,   204,   205,   206,   207,   208,   209,   210,   211,   212,
+     213,   214,   215,   216,   217,   218,   219,   220,   221,   222,
+     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
+     233,   234,   235,   236,   237,   238,   239,   240,   241,   242,
+     243,   244,   245,   246,   247,   248,   249,   250,   251,   252,
+     253,   254,   255,   256,   257,   258,   259,   260,   261,   262,
+     263,   264,   265,   266,   267,   268,   269,   270,   271,   272,
+     273,   274,   275,   276,   277,   278,   279,   280,   281,   282,
+     283,   284,   285,   286,   287,   288,   289,   290,   291,   292,
+     293,   294,   295,   296,   297,   298,   299,   300,   301,   302,
+     303,   304,   305,   306,   307,   308,   309,   310,   311,   312,
+     313,   314,   315,   316,    -1,    -1,   319,   320,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   379,   380,   381,   382,   383,   384,   385,   386,    -1,
+      -1,    -1,    -1,    -1,    -1,   338,   339,    -1,    -1,   342,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   350,   351,   352,
+     353,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   371,   372,
+     373,   374,   375,   376,    -1,    -1,    -1,    -1,   381,   382,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   401,     4,     5,     6,     7,     8,     9,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   404,   405,   406,   407,   408,   409,   410,   411,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   426,     4,     5,     6,     7,     8,     9,
       10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
       20,    21,    22,    23,    24,    25,    26,    27,    28,    29,
       30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
@@ -3179,57 +3421,62 @@
      260,   261,   262,   263,   264,   265,   266,   267,   268,   269,
      270,   271,   272,   273,   274,   275,   276,   277,   278,   279,
      280,   281,   282,   283,   284,   285,   286,   287,   288,   289,
-     290,   291,   292,   293,   294,    -1,    -1,   297,   298,    -1,
+     290,   291,   292,   293,   294,   295,   296,   297,   298,   299,
+     300,   301,   302,   303,   304,   305,   306,   307,   308,   309,
+     310,   311,   312,   313,   314,   315,   316,    -1,    -1,   319,
+     320,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   338,   339,
+      -1,    -1,    -1,   343,    -1,    -1,    -1,    -1,    -1,    -1,
+     350,   351,   352,   353,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   316,   317,    -1,    -1,
-     320,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   328,   329,
-     330,   331,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   349,
-     350,   351,   352,   353,   354,    -1,    -1,    -1,    -1,   359,
-     360,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   379,
-     380,   381,   382,   383,   384,   385,   386,    -1,    -1,    -1,
+      -1,   371,   372,   373,   374,   375,   376,    -1,    -1,    -1,
+      -1,   381,   382,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   401,     4,     5,     6,     7,     8,     9,    10,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
-      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
-      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
-      52,    53,    54,    55,    56,    57,    58,    59,    60,    -1,
-      -1,    63,    64,    65,    66,    67,    68,    69,    70,    71,
-      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
-      82,    83,    84,    85,    86,    87,    88,    89,    90,    91,
-      92,    93,    94,    95,    96,    97,    98,    99,   100,   101,
-     102,   103,   104,   105,   106,   107,   108,   109,   110,   111,
-     112,   113,   114,   115,   116,   117,   118,   119,   120,   121,
-     122,   123,   124,   125,   126,   127,   128,   129,   130,   131,
-     132,   133,   134,   135,   136,   137,   138,   139,   140,   141,
-     142,   143,   144,   145,   146,   147,   148,   149,   150,   151,
-     152,   153,   154,   155,   156,   157,   158,   159,   160,   161,
-     162,   163,   164,   165,   166,   167,   168,   169,   170,   171,
-     172,   173,   174,   175,   176,   177,   178,   179,   180,   181,
-     182,   183,   184,   185,   186,   187,   188,   189,   190,   191,
-     192,   193,   194,   195,   196,   197,   198,   199,   200,   201,
-     202,   203,   204,   205,   206,   207,   208,   209,   210,   211,
-     212,   213,   214,   215,   216,   217,   218,   219,   220,   221,
-     222,   223,   224,   225,   226,   227,   228,   229,   230,   231,
-     232,   233,   234,   235,   236,   237,   238,   239,   240,   241,
-     242,   243,   244,   245,   246,   247,   248,   249,   250,   251,
-     252,   253,   254,   255,   256,   257,   258,   259,   260,   261,
-     262,   263,   264,   265,   266,   267,   268,   269,   270,   271,
-     272,   273,   274,   275,   276,   277,   278,   279,   280,   281,
-     282,   283,   284,   285,   286,   287,   288,   289,   290,   291,
-     292,   293,   294,    -1,    -1,   297,   298,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   404,   405,   406,   407,   408,   409,
+     410,   411,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   426,     4,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+      37,    38,    39,    40,    41,    42,    43,    44,    45,    46,
+      47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
+      57,    58,    59,    60,    -1,    -1,    63,    64,    65,    66,
+      67,    68,    69,    70,    71,    72,    73,    74,    75,    76,
+      77,    78,    79,    80,    81,    82,    83,    84,    85,    86,
+      87,    88,    89,    90,    91,    92,    93,    94,    95,    96,
+      97,    98,    99,   100,   101,   102,   103,   104,   105,   106,
+     107,   108,   109,   110,   111,   112,   113,   114,   115,   116,
+     117,   118,   119,   120,   121,   122,   123,   124,   125,   126,
+     127,   128,   129,   130,   131,   132,   133,   134,   135,   136,
+     137,   138,   139,   140,   141,   142,   143,   144,   145,   146,
+     147,   148,   149,   150,   151,   152,   153,   154,   155,   156,
+     157,   158,   159,   160,   161,   162,   163,   164,   165,   166,
+     167,   168,   169,   170,   171,   172,   173,   174,   175,   176,
+     177,   178,   179,   180,   181,   182,   183,   184,   185,   186,
+     187,   188,   189,   190,   191,   192,   193,   194,   195,   196,
+     197,   198,   199,   200,   201,   202,   203,   204,   205,   206,
+     207,   208,   209,   210,   211,   212,   213,   214,   215,   216,
+     217,   218,   219,   220,   221,   222,   223,   224,   225,   226,
+     227,   228,   229,   230,   231,   232,   233,   234,   235,   236,
+     237,   238,   239,   240,   241,   242,   243,   244,   245,   246,
+     247,   248,   249,   250,   251,   252,   253,   254,   255,   256,
+     257,   258,   259,   260,   261,   262,   263,   264,   265,   266,
+     267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
+     277,   278,   279,   280,   281,   282,   283,   284,   285,   286,
+     287,   288,   289,   290,   291,   292,   293,   294,   295,   296,
+     297,   298,   299,   300,   301,   302,   303,   304,   305,   306,
+     307,   308,   309,   310,   311,   312,   313,   314,   315,   316,
+      -1,    -1,   319,   320,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   316,   317,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   327,   328,   329,   330,   331,
+      -1,   338,   339,    -1,    -1,   342,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   350,   351,   352,   353,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   349,   350,   351,
-     352,   353,   354,    -1,    -1,    -1,    -1,   359,   360,    -1,
+      -1,    -1,    -1,    -1,   371,   372,   373,   374,   375,   376,
+      -1,    -1,    -1,    -1,   381,   382,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   379,   380,   381,
-     382,   383,   384,   385,   386,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   401,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   404,   405,   406,
+     407,   408,   409,   410,   411,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   426,
        4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
       14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
       24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
@@ -3259,66 +3506,113 @@
      264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
      274,   275,   276,   277,   278,   279,   280,   281,   282,   283,
      284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
-     294,    -1,    -1,   297,   298,    -1,    -1,    -1,    -1,    -1,
+     294,   295,   296,   297,   298,   299,   300,   301,   302,   303,
+     304,   305,   306,   307,   308,   309,   310,   311,   312,   313,
+     314,   315,   316,    -1,    -1,   319,   320,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   316,   317,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   328,   329,   330,   331,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   338,   339,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,   349,   350,   351,   352,   353,
-     354,    -1,    -1,    -1,    -1,   359,   360,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   379,   380,   381,   382,   383,
-     384,   385,   386,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   401,     4,     5,
-       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
-      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
-      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
-      56,    57,    58,    59,    60,    -1,    -1,    63,    64,    65,
-      66,    67,    68,    69,    70,    71,    72,    73,    74,    75,
-      76,    77,    78,    79,    80,    81,    82,    83,    84,    85,
-      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
-      96,    97,    98,    99,   100,   101,   102,   103,   104,   105,
-     106,   107,   108,   109,   110,   111,   112,   113,   114,   115,
-     116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
-     126,   127,   128,   129,   130,   131,   132,   133,   134,   135,
-     136,   137,   138,   139,   140,   141,   142,   143,   144,   145,
-     146,   147,   148,   149,   150,   151,   152,   153,   154,   155,
-     156,   157,   158,   159,   160,   161,   162,   163,   164,   165,
-     166,   167,   168,   169,   170,   171,   172,   173,   174,   175,
-     176,   177,   178,   179,   180,   181,   182,   183,   184,   185,
-     186,   187,   188,   189,   190,   191,   192,   193,   194,   195,
-     196,   197,   198,   199,   200,   201,   202,   203,   204,   205,
-     206,   207,   208,   209,   210,   211,   212,   213,   214,   215,
-     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,
-     226,   227,   228,   229,   230,   231,   232,   233,   234,   235,
-     236,   237,   238,   239,   240,   241,   242,   243,   244,   245,
-     246,   247,   248,   249,   250,   251,   252,   253,   254,   255,
-     256,   257,   258,   259,   260,   261,   262,   263,   264,   265,
-     266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
-     276,   277,   278,   279,   280,   281,   282,   283,   284,   285,
-     286,   287,   288,   289,   290,   291,   292,   293,   294,   391,
-      -1,   297,   298,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   405,    -1,    -1,    -1,    -1,    -1,    -1,
-     316,   317,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     422,   423,   328,   329,   330,   331,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   371,   372,   373,
+     374,   375,   376,    -1,    -1,    -1,    -1,   381,   382,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   349,   350,   351,   352,   353,   354,    -1,
-      -1,    -1,   454,   359,   360,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   465,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   379,   380,   381,   382,   383,   384,   385,
-     386,    -1,   484,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   401,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     404,   405,   406,   407,   408,   409,   410,   411,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   426,     4,     5,     6,     7,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
+      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
+      41,    42,    43,    44,    45,    46,    47,    48,    49,    50,
+      51,    52,    53,    54,    55,    56,    57,    58,    59,    60,
+      -1,    -1,    63,    64,    65,    66,    67,    68,    69,    70,
+      71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
+      81,    82,    83,    84,    85,    86,    87,    88,    89,    90,
+      91,    92,    93,    94,    95,    96,    97,    98,    99,   100,
+     101,   102,   103,   104,   105,   106,   107,   108,   109,   110,
+     111,   112,   113,   114,   115,   116,   117,   118,   119,   120,
+     121,   122,   123,   124,   125,   126,   127,   128,   129,   130,
+     131,   132,   133,   134,   135,   136,   137,   138,   139,   140,
+     141,   142,   143,   144,   145,   146,   147,   148,   149,   150,
+     151,   152,   153,   154,   155,   156,   157,   158,   159,   160,
+     161,   162,   163,   164,   165,   166,   167,   168,   169,   170,
+     171,   172,   173,   174,   175,   176,   177,   178,   179,   180,
+     181,   182,   183,   184,   185,   186,   187,   188,   189,   190,
+     191,   192,   193,   194,   195,   196,   197,   198,   199,   200,
+     201,   202,   203,   204,   205,   206,   207,   208,   209,   210,
+     211,   212,   213,   214,   215,   216,   217,   218,   219,   220,
+     221,   222,   223,   224,   225,   226,   227,   228,   229,   230,
+     231,   232,   233,   234,   235,   236,   237,   238,   239,   240,
+     241,   242,   243,   244,   245,   246,   247,   248,   249,   250,
+     251,   252,   253,   254,   255,   256,   257,   258,   259,   260,
+     261,   262,   263,   264,   265,   266,   267,   268,   269,   270,
+     271,   272,   273,   274,   275,   276,   277,   278,   279,   280,
+     281,   282,   283,   284,   285,   286,   287,   288,   289,   290,
+     291,   292,   293,   294,   295,   296,   297,   298,   299,   300,
+     301,   302,   303,   304,   305,   306,   307,   308,   309,   310,
+     311,   312,   313,   314,   315,   316,    -1,    -1,   319,   320,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   338,   339,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   350,
+     351,   352,   353,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     371,   372,   373,   374,   375,   376,    -1,    -1,    -1,    -1,
+     381,   382,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   404,   405,   406,   407,   408,   409,   410,
+     411,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   426,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
+      38,    39,    40,    41,    42,    43,    44,    45,    46,    47,
+      48,    49,    50,    51,    52,    53,    54,    55,    56,    57,
+      58,    59,    60,    -1,    -1,    63,    64,    65,    66,    67,
+      68,    69,    70,    71,    72,    73,    74,    75,    76,    77,
+      78,    79,    80,    81,    82,    83,    84,    85,    86,    87,
+      88,    89,    90,    91,    92,    93,    94,    95,    96,    97,
+      98,    99,   100,   101,   102,   103,   104,   105,   106,   107,
+     108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
+     118,   119,   120,   121,   122,   123,   124,   125,   126,   127,
+     128,   129,   130,   131,   132,   133,   134,   135,   136,   137,
+     138,   139,   140,   141,   142,   143,   144,   145,   146,   147,
+     148,   149,   150,   151,   152,   153,   154,   155,   156,   157,
+     158,   159,   160,   161,   162,   163,   164,   165,   166,   167,
+     168,   169,   170,   171,   172,   173,   174,   175,   176,   177,
+     178,   179,   180,   181,   182,   183,   184,   185,   186,   187,
+     188,   189,   190,   191,   192,   193,   194,   195,   196,   197,
+     198,   199,   200,   201,   202,   203,   204,   205,   206,   207,
+     208,   209,   210,   211,   212,   213,   214,   215,   216,   217,
+     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
+     228,   229,   230,   231,   232,   233,   234,   235,   236,   237,
+     238,   239,   240,   241,   242,   243,   244,   245,   246,   247,
+     248,   249,   250,   251,   252,   253,   254,   255,   256,   257,
+     258,   259,   260,   261,   262,   263,   264,   265,   266,   267,
+     268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
+     278,   279,   280,   281,   282,   283,   284,   285,   286,   287,
+     288,   289,   290,   291,   292,   293,   294,   295,   296,   297,
+     298,   299,   300,   301,   302,   303,   304,   305,   306,   307,
+     308,   309,   310,   311,   312,   313,   314,   315,   316,    -1,
+      -1,   319,   320,    -1,    -1,   413,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   427,
+     338,   339,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   350,   351,   352,   353,   444,   445,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   371,   372,   373,   374,   375,   376,    -1,
+      -1,    -1,    -1,   381,   382,    -1,    -1,    -1,   476,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   487,
+      -1,    -1,    -1,    -1,    -1,    -1,   404,   405,   406,   407,
+     408,   409,   410,   411,    -1,    -1,    -1,    -1,   506,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   426,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   551,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   564,   565,   566,   567,   568,   569,   570,   571,
-     572,   573,   574,   575,   576,   577,   578,   579,   580,   581,
-     582,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   576,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   589,   590,   591,   592,   593,   594,   595,   596,   597,
+     598,   599,   600,   601,   602,   603,   604,   605,   606,   607,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
@@ -3328,12 +3622,13 @@
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     682
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   710
 };
 
   /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
      symbol of state STATE-NUM.  */
-static const yytype_uint16 yystos[] =
+static const yytype_int16 yystos[] =
 {
        0,     3,     4,     5,     6,     7,     8,     9,    10,    11,
       12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
@@ -3364,120 +3659,125 @@
      262,   263,   264,   265,   266,   267,   268,   269,   270,   271,
      272,   273,   274,   275,   276,   277,   278,   279,   280,   281,
      282,   283,   284,   285,   286,   287,   288,   289,   290,   291,
-     292,   293,   294,   327,   341,   342,   343,   344,   345,   354,
-     355,   356,   357,   358,   359,   360,   373,   374,   375,   376,
-     377,   378,   387,   389,   390,   391,   392,   393,   394,   395,
-     396,   397,   398,   399,   400,   401,   402,   403,   404,   405,
-     406,   407,   408,   409,   410,   411,   412,   413,   414,   415,
-     416,   417,   418,   419,   451,   452,   455,   456,   457,   458,
-     462,   463,   464,   465,   466,   467,   470,   471,   472,   473,
-     474,   476,   481,   482,   483,   524,   525,   526,   482,   321,
-     353,   317,   317,   327,   353,   327,   527,   318,   324,   459,
-     460,   461,   471,   476,   324,   327,   353,   327,   353,   472,
-     476,   335,   478,   479,     0,   525,   476,   485,   321,   353,
-     374,   468,   469,   353,   475,   319,   327,   477,   321,   503,
-     460,   459,   461,   353,   353,   317,   326,   477,   321,   324,
-     327,   454,   297,   298,   316,   317,   328,   329,   330,   331,
-     349,   350,   351,   352,   353,   379,   380,   381,   382,   383,
-     384,   385,   386,   421,   422,   423,   425,   426,   427,   428,
-     429,   430,   431,   432,   433,   474,   476,   480,   477,   327,
-     471,   476,   486,   487,   484,   326,   318,   324,   318,   324,
-     320,   432,   434,   435,   436,   437,   438,   439,   440,   441,
-     442,   443,   444,   445,   319,   327,   319,   321,   322,   327,
-     361,   362,   363,   364,   366,   367,   368,   369,   370,   371,
-     372,   388,   432,   445,   447,   449,   451,   455,   474,   476,
-     492,   493,   494,   495,   496,   504,   505,   506,   507,   510,
-     511,   514,   515,   516,   523,   528,   477,   326,   477,   321,
-     447,   490,   326,   453,   353,   324,   327,   432,   432,   449,
-     297,   298,   319,   323,   318,   318,   324,   360,   447,   317,
-     432,   324,   336,   476,   353,   488,   489,   322,   487,   486,
-     445,   450,   469,   353,   332,   333,   334,   329,   331,   295,
-     296,   299,   300,   335,   336,   301,   302,   339,   338,   337,
-     303,   305,   304,   340,   320,   320,   445,   319,   322,   497,
-     317,   327,   327,   518,   317,   317,   327,   327,   449,   317,
-     449,   325,   327,   306,   307,   308,   309,   310,   311,   312,
-     313,   314,   315,   326,   448,   324,   327,   322,   493,   507,
-     511,   516,   490,   326,   490,   491,   490,   486,   353,   318,
-     424,   449,   353,   447,   432,   488,   477,   324,   327,   322,
-     432,   432,   432,   434,   434,   435,   435,   436,   436,   436,
-     436,   437,   437,   438,   439,   440,   441,   442,   443,   446,
-     320,   353,   529,   530,   504,   517,   493,   519,   449,   327,
-     449,   325,   447,   447,   490,   322,   324,   322,   320,   327,
-     489,   449,   317,   320,   324,   498,   449,   464,   471,   509,
-     361,   492,   505,   520,   318,   318,   322,   490,   325,   450,
-     320,   530,   322,   353,   318,   317,   509,   521,   522,   500,
-     501,   502,   508,   512,   447,   318,   326,   494,   499,   503,
-     449,   327,   318,   365,   496,   494,   321,   490,   318,   449,
-     499,   500,   504,   513,   327,   322
+     292,   293,   294,   295,   296,   297,   298,   299,   300,   301,
+     302,   303,   304,   305,   306,   307,   308,   309,   310,   311,
+     312,   313,   314,   315,   316,   349,   363,   364,   365,   366,
+     367,   376,   377,   378,   379,   380,   381,   382,   398,   399,
+     400,   401,   402,   403,   412,   414,   415,   416,   417,   418,
+     419,   420,   421,   422,   423,   424,   425,   426,   427,   428,
+     429,   430,   431,   432,   433,   434,   435,   436,   437,   438,
+     439,   440,   441,   442,   443,   444,   476,   477,   480,   481,
+     482,   483,   487,   488,   489,   490,   491,   492,   495,   496,
+     497,   498,   499,   501,   506,   507,   508,   549,   550,   551,
+     507,   343,   375,   339,   339,   349,   375,   349,   552,   340,
+     346,   484,   485,   486,   496,   501,   346,   349,   375,   349,
+     375,   497,   501,   357,   503,   504,     0,   550,   501,   510,
+     343,   375,   399,   493,   494,   375,   500,   341,   349,   502,
+     343,   528,   485,   484,   486,   375,   375,   339,   348,   502,
+     343,   346,   349,   479,   319,   320,   338,   339,   350,   351,
+     352,   353,   371,   372,   373,   374,   375,   404,   405,   406,
+     407,   408,   409,   410,   411,   446,   447,   448,   450,   451,
+     452,   453,   454,   455,   456,   457,   458,   499,   501,   505,
+     502,   349,   496,   501,   511,   512,   509,   348,   340,   346,
+     340,   346,   342,   457,   459,   460,   461,   462,   463,   464,
+     465,   466,   467,   468,   469,   470,   341,   349,   341,   343,
+     344,   349,   383,   384,   385,   386,   388,   389,   390,   391,
+     392,   393,   394,   395,   396,   397,   413,   457,   470,   472,
+     474,   476,   480,   499,   501,   517,   518,   519,   520,   521,
+     529,   530,   531,   532,   535,   536,   539,   540,   541,   548,
+     553,   502,   348,   502,   343,   472,   515,   348,   478,   375,
+     346,   349,   457,   457,   474,   319,   320,   341,   345,   340,
+     340,   346,   382,   472,   339,   457,   346,   358,   501,   375,
+     513,   514,   344,   512,   511,   470,   475,   494,   375,   354,
+     355,   356,   351,   353,   317,   318,   321,   322,   357,   358,
+     323,   324,   361,   360,   359,   325,   327,   326,   362,   342,
+     342,   470,   341,   344,   522,   339,   349,   349,   543,   339,
+     339,   349,   349,   474,   339,   474,   347,   349,   349,   349,
+     349,   328,   329,   330,   331,   332,   333,   334,   335,   336,
+     337,   348,   473,   346,   349,   344,   518,   532,   536,   541,
+     515,   348,   515,   516,   515,   511,   375,   340,   449,   474,
+     375,   472,   457,   513,   502,   346,   349,   344,   457,   457,
+     457,   459,   459,   460,   460,   461,   461,   461,   461,   462,
+     462,   463,   464,   465,   466,   467,   468,   471,   342,   375,
+     554,   555,   529,   542,   518,   544,   474,   349,   474,   347,
+     472,   472,   515,   344,   346,   344,   342,   349,   514,   474,
+     339,   342,   346,   523,   474,   489,   496,   534,   383,   517,
+     530,   545,   340,   340,   344,   515,   347,   475,   342,   555,
+     344,   375,   340,   339,   534,   546,   547,   525,   526,   527,
+     533,   537,   472,   340,   348,   519,   524,   528,   474,   349,
+     340,   387,   521,   519,   343,   515,   340,   474,   524,   525,
+     529,   538,   349,   344
 };
 
   /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
-static const yytype_uint16 yyr1[] =
+static const yytype_int16 yyr1[] =
 {
-       0,   420,   421,   422,   422,   422,   422,   422,   422,   422,
-     422,   422,   422,   422,   422,   422,   422,   422,   423,   423,
-     423,   423,   423,   423,   424,   425,   426,   427,   427,   428,
-     428,   429,   429,   430,   431,   431,   431,   432,   432,   432,
-     432,   433,   433,   433,   433,   434,   434,   434,   434,   435,
-     435,   435,   436,   436,   436,   437,   437,   437,   437,   437,
-     438,   438,   438,   439,   439,   440,   440,   441,   441,   442,
-     442,   443,   443,   444,   444,   445,   446,   445,   447,   447,
-     448,   448,   448,   448,   448,   448,   448,   448,   448,   448,
-     448,   449,   449,   450,   451,   451,   451,   451,   451,   451,
-     451,   451,   451,   453,   452,   454,   454,   455,   456,   456,
-     457,   457,   458,   459,   459,   460,   460,   460,   460,   461,
-     462,   462,   462,   462,   462,   463,   463,   463,   463,   463,
-     464,   464,   465,   466,   466,   466,   466,   466,   466,   466,
-     466,   467,   468,   468,   469,   469,   469,   470,   471,   471,
-     472,   472,   472,   472,   472,   472,   472,   473,   473,   473,
+       0,   445,   446,   447,   447,   447,   447,   447,   447,   447,
+     447,   447,   447,   447,   447,   447,   447,   447,   448,   448,
+     448,   448,   448,   448,   449,   450,   451,   452,   452,   453,
+     453,   454,   454,   455,   456,   456,   456,   457,   457,   457,
+     457,   458,   458,   458,   458,   459,   459,   459,   459,   460,
+     460,   460,   461,   461,   461,   462,   462,   462,   462,   462,
+     463,   463,   463,   464,   464,   465,   465,   466,   466,   467,
+     467,   468,   468,   469,   469,   470,   471,   470,   472,   472,
      473,   473,   473,   473,   473,   473,   473,   473,   473,   473,
-     473,   473,   473,   473,   473,   473,   473,   473,   473,   473,
-     473,   473,   473,   473,   473,   473,   473,   473,   473,   473,
-     473,   473,   474,   475,   475,   476,   476,   477,   477,   477,
-     477,   478,   478,   479,   480,   480,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   482,   482,
-     482,   484,   483,   485,   483,   486,   486,   487,   487,   488,
-     488,   489,   489,   490,   490,   490,   491,   491,   492,   493,
-     493,   494,   494,   494,   494,   494,   494,   494,   494,   495,
-     496,   497,   498,   496,   499,   499,   501,   500,   502,   500,
-     503,   503,   504,   504,   505,   505,   506,   506,   507,   508,
-     508,   509,   509,   510,   510,   512,   511,   513,   513,   514,
-     514,   515,   515,   517,   516,   518,   516,   519,   516,   520,
-     520,   521,   521,   522,   522,   523,   523,   523,   523,   523,
-     524,   524,   525,   525,   525,   527,   526,   528,   529,   529,
-     530,   530
+     473,   474,   474,   475,   476,   476,   476,   476,   476,   476,
+     476,   476,   476,   478,   477,   479,   479,   480,   481,   481,
+     482,   482,   483,   484,   484,   485,   485,   485,   485,   486,
+     487,   487,   487,   487,   487,   488,   488,   488,   488,   488,
+     489,   489,   490,   491,   491,   491,   491,   491,   491,   491,
+     491,   492,   493,   493,   494,   494,   494,   495,   496,   496,
+     497,   497,   497,   497,   497,   497,   497,   498,   498,   498,
+     498,   498,   498,   498,   498,   498,   498,   498,   498,   498,
+     498,   498,   498,   498,   498,   498,   498,   498,   498,   498,
+     498,   498,   498,   498,   498,   498,   498,   498,   498,   498,
+     498,   498,   499,   500,   500,   501,   501,   502,   502,   502,
+     502,   503,   503,   504,   505,   505,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     507,   507,   507,   509,   508,   510,   508,   511,   511,   512,
+     512,   513,   513,   514,   514,   515,   515,   515,   516,   516,
+     517,   518,   518,   519,   519,   519,   519,   519,   519,   519,
+     519,   520,   521,   522,   523,   521,   524,   524,   526,   525,
+     527,   525,   528,   528,   529,   529,   530,   530,   531,   531,
+     532,   533,   533,   534,   534,   535,   535,   537,   536,   538,
+     538,   539,   539,   540,   540,   542,   541,   543,   541,   544,
+     541,   545,   545,   546,   546,   547,   547,   548,   548,   548,
+     548,   548,   548,   548,   548,   549,   549,   550,   550,   550,
+     552,   551,   553,   554,   554,   555,   555
 };
 
   /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
-static const yytype_uint8 yyr2[] =
+static const yytype_int8 yyr2[] =
 {
        0,     2,     1,     1,     3,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     4,
@@ -3529,23 +3829,25 @@
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     0,     6,     0,     5,     1,     2,     3,     4,     1,
-       3,     1,     2,     1,     3,     4,     1,     3,     1,     1,
-       1,     1,     1,     1,     1,     1,     1,     1,     1,     2,
-       2,     0,     0,     5,     1,     1,     0,     2,     0,     2,
-       2,     3,     1,     2,     1,     2,     1,     2,     5,     3,
-       1,     1,     4,     1,     2,     0,     8,     0,     1,     3,
-       2,     1,     2,     0,     6,     0,     8,     0,     7,     1,
-       1,     1,     0,     2,     3,     2,     2,     2,     3,     2,
-       1,     2,     1,     1,     1,     0,     3,     5,     1,     3,
-       1,     4
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     0,     6,     0,     5,     1,     2,     3,
+       4,     1,     3,     1,     2,     1,     3,     4,     1,     3,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     2,     2,     0,     0,     5,     1,     1,     0,     2,
+       0,     2,     2,     3,     1,     2,     1,     2,     1,     2,
+       5,     3,     1,     1,     4,     1,     2,     0,     8,     0,
+       1,     3,     2,     1,     2,     0,     6,     0,     8,     0,
+       7,     1,     1,     1,     0,     2,     3,     2,     2,     2,
+       3,     2,     2,     2,     2,     1,     2,     1,     1,     1,
+       0,     3,     5,     1,     3,     1,     4
 };
 
 
+enum { YYENOMEM = -2 };
+
 #define yyerrok         (yyerrstatus = 0)
 #define yyclearin       (yychar = YYEMPTY)
-#define YYEMPTY         (-2)
-#define YYEOF           0
 
 #define YYACCEPT        goto yyacceptlab
 #define YYABORT         goto yyabortlab
@@ -3554,27 +3856,26 @@
 
 #define YYRECOVERING()  (!!yyerrstatus)
 
-#define YYBACKUP(Token, Value)                                  \
-do                                                              \
-  if (yychar == YYEMPTY)                                        \
-    {                                                           \
-      yychar = (Token);                                         \
-      yylval = (Value);                                         \
-      YYPOPSTACK (yylen);                                       \
-      yystate = *yyssp;                                         \
-      goto yybackup;                                            \
-    }                                                           \
-  else                                                          \
-    {                                                           \
-      yyerror (pParseContext, YY_("syntax error: cannot back up")); \
-      YYERROR;                                                  \
-    }                                                           \
-while (0)
+#define YYBACKUP(Token, Value)                                    \
+  do                                                              \
+    if (yychar == YYEMPTY)                                        \
+      {                                                           \
+        yychar = (Token);                                         \
+        yylval = (Value);                                         \
+        YYPOPSTACK (yylen);                                       \
+        yystate = *yyssp;                                         \
+        goto yybackup;                                            \
+      }                                                           \
+    else                                                          \
+      {                                                           \
+        yyerror (pParseContext, YY_("syntax error: cannot back up")); \
+        YYERROR;                                                  \
+      }                                                           \
+  while (0)
 
-/* Error token number */
-#define YYTERROR        1
-#define YYERRCODE       256
-
+/* Backward compatibility with an undocumented macro.
+   Use YYerror or YYUNDEF. */
+#define YYERRCODE YYUNDEF
 
 
 /* Enable debugging if requested.  */
@@ -3592,55 +3893,59 @@
 } while (0)
 
 /* This macro is provided for backward compatibility. */
-#ifndef YY_LOCATION_PRINT
-# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
-#endif
+# ifndef YY_LOCATION_PRINT
+#  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
+# endif
 
 
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)                    \
+# define YY_SYMBOL_PRINT(Title, Kind, Value, Location)                    \
 do {                                                                      \
   if (yydebug)                                                            \
     {                                                                     \
       YYFPRINTF (stderr, "%s ", Title);                                   \
       yy_symbol_print (stderr,                                            \
-                  Type, Value, pParseContext); \
+                  Kind, Value, pParseContext); \
       YYFPRINTF (stderr, "\n");                                           \
     }                                                                     \
 } while (0)
 
 
-/*----------------------------------------.
-| Print this symbol's value on YYOUTPUT.  |
-`----------------------------------------*/
+/*-----------------------------------.
+| Print this symbol's value on YYO.  |
+`-----------------------------------*/
 
 static void
-yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, glslang::TParseContext* pParseContext)
+yy_symbol_value_print (FILE *yyo,
+                       yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, glslang::TParseContext* pParseContext)
 {
-  FILE *yyo = yyoutput;
-  YYUSE (yyo);
+  FILE *yyoutput = yyo;
+  YYUSE (yyoutput);
   YYUSE (pParseContext);
   if (!yyvaluep)
     return;
 # ifdef YYPRINT
-  if (yytype < YYNTOKENS)
-    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+  if (yykind < YYNTOKENS)
+    YYPRINT (yyo, yytoknum[yykind], *yyvaluep);
 # endif
-  YYUSE (yytype);
+  YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+  YYUSE (yykind);
+  YY_IGNORE_MAYBE_UNINITIALIZED_END
 }
 
 
-/*--------------------------------.
-| Print this symbol on YYOUTPUT.  |
-`--------------------------------*/
+/*---------------------------.
+| Print this symbol on YYO.  |
+`---------------------------*/
 
 static void
-yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, glslang::TParseContext* pParseContext)
+yy_symbol_print (FILE *yyo,
+                 yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, glslang::TParseContext* pParseContext)
 {
-  YYFPRINTF (yyoutput, "%s %s (",
-             yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]);
+  YYFPRINTF (yyo, "%s %s (",
+             yykind < YYNTOKENS ? "token" : "nterm", yysymbol_name (yykind));
 
-  yy_symbol_value_print (yyoutput, yytype, yyvaluep, pParseContext);
-  YYFPRINTF (yyoutput, ")");
+  yy_symbol_value_print (yyo, yykind, yyvaluep, pParseContext);
+  YYFPRINTF (yyo, ")");
 }
 
 /*------------------------------------------------------------------.
@@ -3649,7 +3954,7 @@
 `------------------------------------------------------------------*/
 
 static void
-yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
+yy_stack_print (yy_state_t *yybottom, yy_state_t *yytop)
 {
   YYFPRINTF (stderr, "Stack now");
   for (; yybottom <= yytop; yybottom++)
@@ -3672,21 +3977,21 @@
 `------------------------------------------------*/
 
 static void
-yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, int yyrule, glslang::TParseContext* pParseContext)
+yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp,
+                 int yyrule, glslang::TParseContext* pParseContext)
 {
-  unsigned long int yylno = yyrline[yyrule];
+  int yylno = yyrline[yyrule];
   int yynrhs = yyr2[yyrule];
   int yyi;
-  YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
+  YYFPRINTF (stderr, "Reducing stack by rule %d (line %d):\n",
              yyrule - 1, yylno);
   /* The symbols being reduced.  */
   for (yyi = 0; yyi < yynrhs; yyi++)
     {
       YYFPRINTF (stderr, "   $%d = ", yyi + 1);
       yy_symbol_print (stderr,
-                       yystos[yyssp[yyi + 1 - yynrhs]],
-                       &(yyvsp[(yyi + 1) - (yynrhs)])
-                                              , pParseContext);
+                       YY_ACCESSING_SYMBOL (+yyssp[yyi + 1 - yynrhs]),
+                       &yyvsp[(yyi + 1) - (yynrhs)], pParseContext);
       YYFPRINTF (stderr, "\n");
     }
 }
@@ -3701,8 +4006,8 @@
    multiple parsers can coexist.  */
 int yydebug;
 #else /* !YYDEBUG */
-# define YYDPRINTF(Args)
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
+# define YYDPRINTF(Args) ((void) 0)
+# define YY_SYMBOL_PRINT(Title, Kind, Value, Location)
 # define YY_STACK_PRINT(Bottom, Top)
 # define YY_REDUCE_PRINT(Rule)
 #endif /* !YYDEBUG */
@@ -3725,28 +4030,76 @@
 #endif
 
 
-#if YYERROR_VERBOSE
+/* Context of a parse error.  */
+typedef struct
+{
+  yy_state_t *yyssp;
+  yysymbol_kind_t yytoken;
+} yypcontext_t;
 
-# ifndef yystrlen
-#  if defined __GLIBC__ && defined _STRING_H
-#   define yystrlen strlen
-#  else
+/* Put in YYARG at most YYARGN of the expected tokens given the
+   current YYCTX, and return the number of tokens stored in YYARG.  If
+   YYARG is null, return the number of expected tokens (guaranteed to
+   be less than YYNTOKENS).  Return YYENOMEM on memory exhaustion.
+   Return 0 if there are more than YYARGN expected tokens, yet fill
+   YYARG up to YYARGN. */
+static int
+yypcontext_expected_tokens (const yypcontext_t *yyctx,
+                            yysymbol_kind_t yyarg[], int yyargn)
+{
+  /* Actual size of YYARG. */
+  int yycount = 0;
+  int yyn = yypact[+*yyctx->yyssp];
+  if (!yypact_value_is_default (yyn))
+    {
+      /* Start YYX at -YYN if negative to avoid negative indexes in
+         YYCHECK.  In other words, skip the first -YYN actions for
+         this state because they are default actions.  */
+      int yyxbegin = yyn < 0 ? -yyn : 0;
+      /* Stay within bounds of both yycheck and yytname.  */
+      int yychecklim = YYLAST - yyn + 1;
+      int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+      int yyx;
+      for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+        if (yycheck[yyx + yyn] == yyx && yyx != YYSYMBOL_YYerror
+            && !yytable_value_is_error (yytable[yyx + yyn]))
+          {
+            if (!yyarg)
+              ++yycount;
+            else if (yycount == yyargn)
+              return 0;
+            else
+              yyarg[yycount++] = YY_CAST (yysymbol_kind_t, yyx);
+          }
+    }
+  if (yyarg && yycount == 0 && 0 < yyargn)
+    yyarg[0] = YYSYMBOL_YYEMPTY;
+  return yycount;
+}
+
+
+
+
+#ifndef yystrlen
+# if defined __GLIBC__ && defined _STRING_H
+#  define yystrlen(S) (YY_CAST (YYPTRDIFF_T, strlen (S)))
+# else
 /* Return the length of YYSTR.  */
-static YYSIZE_T
+static YYPTRDIFF_T
 yystrlen (const char *yystr)
 {
-  YYSIZE_T yylen;
+  YYPTRDIFF_T yylen;
   for (yylen = 0; yystr[yylen]; yylen++)
     continue;
   return yylen;
 }
-#  endif
 # endif
+#endif
 
-# ifndef yystpcpy
-#  if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
-#   define yystpcpy stpcpy
-#  else
+#ifndef yystpcpy
+# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
+#  define yystpcpy stpcpy
+# else
 /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
    YYDEST.  */
 static char *
@@ -3760,10 +4113,10 @@
 
   return yyd - 1;
 }
-#  endif
 # endif
+#endif
 
-# ifndef yytnamerr
+#ifndef yytnamerr
 /* Copy to YYRES the contents of YYSTR after stripping away unnecessary
    quotes and backslashes, so that it's suitable for yyerror.  The
    heuristic is that double-quoting is unnecessary unless the string
@@ -3771,14 +4124,13 @@
    backslash-backslash).  YYSTR is taken from yytname.  If YYRES is
    null, do not copy; instead, return the length of what the result
    would have been.  */
-static YYSIZE_T
+static YYPTRDIFF_T
 yytnamerr (char *yyres, const char *yystr)
 {
   if (*yystr == '"')
     {
-      YYSIZE_T yyn = 0;
+      YYPTRDIFF_T yyn = 0;
       char const *yyp = yystr;
-
       for (;;)
         switch (*++yyp)
           {
@@ -3789,7 +4141,10 @@
           case '\\':
             if (*++yyp != '\\')
               goto do_not_strip_quotes;
-            /* Fall through.  */
+            else
+              goto append;
+
+          append:
           default:
             if (yyres)
               yyres[yyn] = *yyp;
@@ -3804,36 +4159,20 @@
     do_not_strip_quotes: ;
     }
 
-  if (! yyres)
+  if (yyres)
+    return yystpcpy (yyres, yystr) - yyres;
+  else
     return yystrlen (yystr);
-
-  return yystpcpy (yyres, yystr) - yyres;
 }
-# endif
+#endif
 
-/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message
-   about the unexpected token YYTOKEN for the state stack whose top is
-   YYSSP.
 
-   Return 0 if *YYMSG was successfully written.  Return 1 if *YYMSG is
-   not large enough to hold the message.  In that case, also set
-   *YYMSG_ALLOC to the required number of bytes.  Return 2 if the
-   required number of bytes is too large to store.  */
 static int
-yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
-                yytype_int16 *yyssp, int yytoken)
+yy_syntax_error_arguments (const yypcontext_t *yyctx,
+                           yysymbol_kind_t yyarg[], int yyargn)
 {
-  YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]);
-  YYSIZE_T yysize = yysize0;
-  enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
-  /* Internationalized format string. */
-  const char *yyformat = YY_NULLPTR;
-  /* Arguments of yyformat. */
-  char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
-  /* Number of reported tokens (one for the "unexpected", one per
-     "expected"). */
+  /* Actual size of YYARG. */
   int yycount = 0;
-
   /* There are many possibilities here to consider:
      - If this state is a consistent state with a default action, then
        the only way this function was invoked is if the default action
@@ -3857,63 +4196,78 @@
        one exception: it will still contain any token that will not be
        accepted due to an error action in a later state.
   */
-  if (yytoken != YYEMPTY)
+  if (yyctx->yytoken != YYSYMBOL_YYEMPTY)
     {
-      int yyn = yypact[*yyssp];
-      yyarg[yycount++] = yytname[yytoken];
-      if (!yypact_value_is_default (yyn))
-        {
-          /* Start YYX at -YYN if negative to avoid negative indexes in
-             YYCHECK.  In other words, skip the first -YYN actions for
-             this state because they are default actions.  */
-          int yyxbegin = yyn < 0 ? -yyn : 0;
-          /* Stay within bounds of both yycheck and yytname.  */
-          int yychecklim = YYLAST - yyn + 1;
-          int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
-          int yyx;
-
-          for (yyx = yyxbegin; yyx < yyxend; ++yyx)
-            if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR
-                && !yytable_value_is_error (yytable[yyx + yyn]))
-              {
-                if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
-                  {
-                    yycount = 1;
-                    yysize = yysize0;
-                    break;
-                  }
-                yyarg[yycount++] = yytname[yyx];
-                {
-                  YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]);
-                  if (! (yysize <= yysize1
-                         && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
-                    return 2;
-                  yysize = yysize1;
-                }
-              }
-        }
+      int yyn;
+      if (yyarg)
+        yyarg[yycount] = yyctx->yytoken;
+      ++yycount;
+      yyn = yypcontext_expected_tokens (yyctx,
+                                        yyarg ? yyarg + 1 : yyarg, yyargn - 1);
+      if (yyn == YYENOMEM)
+        return YYENOMEM;
+      else
+        yycount += yyn;
     }
+  return yycount;
+}
+
+/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message
+   about the unexpected token YYTOKEN for the state stack whose top is
+   YYSSP.
+
+   Return 0 if *YYMSG was successfully written.  Return -1 if *YYMSG is
+   not large enough to hold the message.  In that case, also set
+   *YYMSG_ALLOC to the required number of bytes.  Return YYENOMEM if the
+   required number of bytes is too large to store.  */
+static int
+yysyntax_error (YYPTRDIFF_T *yymsg_alloc, char **yymsg,
+                const yypcontext_t *yyctx)
+{
+  enum { YYARGS_MAX = 5 };
+  /* Internationalized format string. */
+  const char *yyformat = YY_NULLPTR;
+  /* Arguments of yyformat: reported tokens (one for the "unexpected",
+     one per "expected"). */
+  yysymbol_kind_t yyarg[YYARGS_MAX];
+  /* Cumulated lengths of YYARG.  */
+  YYPTRDIFF_T yysize = 0;
+
+  /* Actual size of YYARG. */
+  int yycount = yy_syntax_error_arguments (yyctx, yyarg, YYARGS_MAX);
+  if (yycount == YYENOMEM)
+    return YYENOMEM;
 
   switch (yycount)
     {
-# define YYCASE_(N, S)                      \
+#define YYCASE_(N, S)                       \
       case N:                               \
         yyformat = S;                       \
-      break
+        break
+    default: /* Avoid compiler warnings. */
       YYCASE_(0, YY_("syntax error"));
       YYCASE_(1, YY_("syntax error, unexpected %s"));
       YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
       YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
       YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
       YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
-# undef YYCASE_
+#undef YYCASE_
     }
 
+  /* Compute error message size.  Don't count the "%s"s, but reserve
+     room for the terminator.  */
+  yysize = yystrlen (yyformat) - 2 * yycount + 1;
   {
-    YYSIZE_T yysize1 = yysize + yystrlen (yyformat);
-    if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
-      return 2;
-    yysize = yysize1;
+    int yyi;
+    for (yyi = 0; yyi < yycount; ++yyi)
+      {
+        YYPTRDIFF_T yysize1
+          = yysize + yytnamerr (YY_NULLPTR, yytname[yyarg[yyi]]);
+        if (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)
+          yysize = yysize1;
+        else
+          return YYENOMEM;
+      }
   }
 
   if (*yymsg_alloc < yysize)
@@ -3922,7 +4276,7 @@
       if (! (yysize <= *yymsg_alloc
              && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM))
         *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM;
-      return 1;
+      return -1;
     }
 
   /* Avoid sprintf, as that infringes on the user's name space.
@@ -3934,40 +4288,43 @@
     while ((*yyp = *yyformat) != '\0')
       if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount)
         {
-          yyp += yytnamerr (yyp, yyarg[yyi++]);
+          yyp += yytnamerr (yyp, yytname[yyarg[yyi++]]);
           yyformat += 2;
         }
       else
         {
-          yyp++;
-          yyformat++;
+          ++yyp;
+          ++yyformat;
         }
   }
   return 0;
 }
-#endif /* YYERROR_VERBOSE */
+
 
 /*-----------------------------------------------.
 | Release the memory associated to this symbol.  |
 `-----------------------------------------------*/
 
 static void
-yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, glslang::TParseContext* pParseContext)
+yydestruct (const char *yymsg,
+            yysymbol_kind_t yykind, YYSTYPE *yyvaluep, glslang::TParseContext* pParseContext)
 {
   YYUSE (yyvaluep);
   YYUSE (pParseContext);
   if (!yymsg)
     yymsg = "Deleting";
-  YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
+  YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp);
 
   YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
-  YYUSE (yytype);
+  YYUSE (yykind);
   YY_IGNORE_MAYBE_UNINITIALIZED_END
 }
 
 
 
 
+
+
 /*----------.
 | yyparse.  |
 `----------*/
@@ -3975,7 +4332,7 @@
 int
 yyparse (glslang::TParseContext* pParseContext)
 {
-/* The lookahead symbol.  */
+/* Lookahead token kind.  */
 int yychar;
 
 
@@ -3986,45 +4343,41 @@
 YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default);
 
     /* Number of syntax errors so far.  */
-    int yynerrs;
+    int yynerrs = 0;
 
-    int yystate;
+    yy_state_fast_t yystate = 0;
     /* Number of tokens to shift before error messages enabled.  */
-    int yyerrstatus;
+    int yyerrstatus = 0;
 
-    /* The stacks and their tools:
-       'yyss': related to states.
-       'yyvs': related to semantic values.
-
-       Refer to the stacks through separate pointers, to allow yyoverflow
+    /* Refer to the stacks through separate pointers, to allow yyoverflow
        to reallocate them elsewhere.  */
 
-    /* The state stack.  */
-    yytype_int16 yyssa[YYINITDEPTH];
-    yytype_int16 *yyss;
-    yytype_int16 *yyssp;
+    /* Their size.  */
+    YYPTRDIFF_T yystacksize = YYINITDEPTH;
 
-    /* The semantic value stack.  */
+    /* The state stack: array, bottom, top.  */
+    yy_state_t yyssa[YYINITDEPTH];
+    yy_state_t *yyss = yyssa;
+    yy_state_t *yyssp = yyss;
+
+    /* The semantic value stack: array, bottom, top.  */
     YYSTYPE yyvsa[YYINITDEPTH];
-    YYSTYPE *yyvs;
-    YYSTYPE *yyvsp;
-
-    YYSIZE_T yystacksize;
+    YYSTYPE *yyvs = yyvsa;
+    YYSTYPE *yyvsp = yyvs;
 
   int yyn;
+  /* The return value of yyparse.  */
   int yyresult;
-  /* Lookahead token as an internal (translated) token number.  */
-  int yytoken = 0;
+  /* Lookahead symbol kind.  */
+  yysymbol_kind_t yytoken = YYSYMBOL_YYEMPTY;
   /* The variables used to return semantic value and location from the
      action routines.  */
   YYSTYPE yyval;
 
-#if YYERROR_VERBOSE
   /* Buffer for error messages, and its allocated size.  */
   char yymsgbuf[128];
   char *yymsg = yymsgbuf;
-  YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
-#endif
+  YYPTRDIFF_T yymsg_alloc = sizeof yymsgbuf;
 
 #define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N))
 
@@ -4032,58 +4385,60 @@
      Keep to zero when no symbol should be popped.  */
   int yylen = 0;
 
-  yyssp = yyss = yyssa;
-  yyvsp = yyvs = yyvsa;
-  yystacksize = YYINITDEPTH;
-
   YYDPRINTF ((stderr, "Starting parse\n"));
 
-  yystate = 0;
-  yyerrstatus = 0;
-  yynerrs = 0;
   yychar = YYEMPTY; /* Cause a token to be read.  */
   goto yysetstate;
 
+
 /*------------------------------------------------------------.
-| yynewstate -- Push a new state, which is found in yystate.  |
+| yynewstate -- push a new state, which is found in yystate.  |
 `------------------------------------------------------------*/
- yynewstate:
+yynewstate:
   /* In all cases, when you get here, the value and location stacks
      have just been pushed.  So pushing a state here evens the stacks.  */
   yyssp++;
 
- yysetstate:
-  *yyssp = yystate;
+
+/*--------------------------------------------------------------------.
+| yysetstate -- set current state (the top of the stack) to yystate.  |
+`--------------------------------------------------------------------*/
+yysetstate:
+  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+  YY_ASSERT (0 <= yystate && yystate < YYNSTATES);
+  YY_IGNORE_USELESS_CAST_BEGIN
+  *yyssp = YY_CAST (yy_state_t, yystate);
+  YY_IGNORE_USELESS_CAST_END
+  YY_STACK_PRINT (yyss, yyssp);
 
   if (yyss + yystacksize - 1 <= yyssp)
+#if !defined yyoverflow && !defined YYSTACK_RELOCATE
+    goto yyexhaustedlab;
+#else
     {
       /* Get the current used size of the three stacks, in elements.  */
-      YYSIZE_T yysize = yyssp - yyss + 1;
+      YYPTRDIFF_T yysize = yyssp - yyss + 1;
 
-#ifdef yyoverflow
+# if defined yyoverflow
       {
         /* Give user a chance to reallocate the stack.  Use copies of
            these so that the &'s don't force the real ones into
            memory.  */
+        yy_state_t *yyss1 = yyss;
         YYSTYPE *yyvs1 = yyvs;
-        yytype_int16 *yyss1 = yyss;
 
         /* Each stack pointer address is followed by the size of the
            data in use in that stack, in bytes.  This used to be a
            conditional around just the two extra args, but that might
            be undefined if yyoverflow is a macro.  */
         yyoverflow (YY_("memory exhausted"),
-                    &yyss1, yysize * sizeof (*yyssp),
-                    &yyvs1, yysize * sizeof (*yyvsp),
+                    &yyss1, yysize * YYSIZEOF (*yyssp),
+                    &yyvs1, yysize * YYSIZEOF (*yyvsp),
                     &yystacksize);
-
         yyss = yyss1;
         yyvs = yyvs1;
       }
-#else /* no yyoverflow */
-# ifndef YYSTACK_RELOCATE
-      goto yyexhaustedlab;
-# else
+# else /* defined YYSTACK_RELOCATE */
       /* Extend the stack our own way.  */
       if (YYMAXDEPTH <= yystacksize)
         goto yyexhaustedlab;
@@ -4092,9 +4447,10 @@
         yystacksize = YYMAXDEPTH;
 
       {
-        yytype_int16 *yyss1 = yyss;
+        yy_state_t *yyss1 = yyss;
         union yyalloc *yyptr =
-          (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+          YY_CAST (union yyalloc *,
+                   YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize))));
         if (! yyptr)
           goto yyexhaustedlab;
         YYSTACK_RELOCATE (yyss_alloc, yyss);
@@ -4104,30 +4460,30 @@
           YYSTACK_FREE (yyss1);
       }
 # endif
-#endif /* no yyoverflow */
 
       yyssp = yyss + yysize - 1;
       yyvsp = yyvs + yysize - 1;
 
-      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
-                  (unsigned long int) yystacksize));
+      YY_IGNORE_USELESS_CAST_BEGIN
+      YYDPRINTF ((stderr, "Stack size increased to %ld\n",
+                  YY_CAST (long, yystacksize)));
+      YY_IGNORE_USELESS_CAST_END
 
       if (yyss + yystacksize - 1 <= yyssp)
         YYABORT;
     }
-
-  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+#endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */
 
   if (yystate == YYFINAL)
     YYACCEPT;
 
   goto yybackup;
 
+
 /*-----------.
 | yybackup.  |
 `-----------*/
 yybackup:
-
   /* Do appropriate processing given the current state.  Read a
      lookahead token if we need one and don't already have one.  */
 
@@ -4138,18 +4494,29 @@
 
   /* Not known => get a lookahead token if don't already have one.  */
 
-  /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol.  */
+  /* YYCHAR is either empty, or end-of-input, or a valid lookahead.  */
   if (yychar == YYEMPTY)
     {
-      YYDPRINTF ((stderr, "Reading a token: "));
+      YYDPRINTF ((stderr, "Reading a token\n"));
       yychar = yylex (&yylval, parseContext);
     }
 
   if (yychar <= YYEOF)
     {
-      yychar = yytoken = YYEOF;
+      yychar = YYEOF;
+      yytoken = YYSYMBOL_YYEOF;
       YYDPRINTF ((stderr, "Now at end of input.\n"));
     }
+  else if (yychar == YYerror)
+    {
+      /* The scanner already issued an error message, process directly
+         to error recovery.  But do not keep the error token as
+         lookahead, it is too special and may lead us to an endless
+         loop in error recovery. */
+      yychar = YYUNDEF;
+      yytoken = YYSYMBOL_YYerror;
+      goto yyerrlab1;
+    }
   else
     {
       yytoken = YYTRANSLATE (yychar);
@@ -4177,15 +4544,13 @@
 
   /* Shift the lookahead token.  */
   YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
-
-  /* Discard the shifted token.  */
-  yychar = YYEMPTY;
-
   yystate = yyn;
   YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
   *++yyvsp = yylval;
   YY_IGNORE_MAYBE_UNINITIALIZED_END
 
+  /* Discard the shifted token.  */
+  yychar = YYEMPTY;
   goto yynewstate;
 
 
@@ -4200,7 +4565,7 @@
 
 
 /*-----------------------------.
-| yyreduce -- Do a reduction.  |
+| yyreduce -- do a reduction.  |
 `-----------------------------*/
 yyreduce:
   /* yyn is the number of a rule to reduce with.  */
@@ -4220,304 +4585,304 @@
   YY_REDUCE_PRINT (yyn);
   switch (yyn)
     {
-        case 2:
-#line 357 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 2: /* variable_identifier: IDENTIFIER  */
+#line 371 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.intermTypedNode) = parseContext.handleVariable((yyvsp[0].lex).loc, (yyvsp[0].lex).symbol, (yyvsp[0].lex).string);
     }
-#line 4229 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4594 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 3:
-#line 363 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 3: /* primary_expression: variable_identifier  */
+#line 377 "MachineIndependent/glslang.y"
+                          {
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
     }
-#line 4237 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4602 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 4:
-#line 366 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 4: /* primary_expression: LEFT_PAREN expression RIGHT_PAREN  */
+#line 380 "MachineIndependent/glslang.y"
+                                        {
         (yyval.interm.intermTypedNode) = (yyvsp[-1].interm.intermTypedNode);
         if ((yyval.interm.intermTypedNode)->getAsConstantUnion())
             (yyval.interm.intermTypedNode)->getAsConstantUnion()->setExpression();
     }
-#line 4247 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4612 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 5:
-#line 371 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 5: /* primary_expression: FLOATCONSTANT  */
+#line 385 "MachineIndependent/glslang.y"
+                    {
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).d, EbtFloat, (yyvsp[0].lex).loc, true);
     }
-#line 4255 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4620 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 6:
-#line 374 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 6: /* primary_expression: INTCONSTANT  */
+#line 388 "MachineIndependent/glslang.y"
+                  {
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).i, (yyvsp[0].lex).loc, true);
     }
-#line 4263 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4628 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 7:
-#line 377 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 7: /* primary_expression: UINTCONSTANT  */
+#line 391 "MachineIndependent/glslang.y"
+                   {
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned literal");
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).u, (yyvsp[0].lex).loc, true);
     }
-#line 4272 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4637 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 8:
-#line 381 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 8: /* primary_expression: BOOLCONSTANT  */
+#line 395 "MachineIndependent/glslang.y"
+                   {
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).b, (yyvsp[0].lex).loc, true);
     }
-#line 4280 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4645 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 9:
-#line 385 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 9: /* primary_expression: STRING_LITERAL  */
+#line 399 "MachineIndependent/glslang.y"
+                     {
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).string, (yyvsp[0].lex).loc, true);
     }
-#line 4288 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4653 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 10:
-#line 388 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 10: /* primary_expression: INT32CONSTANT  */
+#line 402 "MachineIndependent/glslang.y"
+                    {
         parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed literal");
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).i, (yyvsp[0].lex).loc, true);
     }
-#line 4297 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4662 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 11:
-#line 392 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 11: /* primary_expression: UINT32CONSTANT  */
+#line 406 "MachineIndependent/glslang.y"
+                     {
         parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed literal");
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).u, (yyvsp[0].lex).loc, true);
     }
-#line 4306 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4671 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 12:
-#line 396 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 12: /* primary_expression: INT64CONSTANT  */
+#line 410 "MachineIndependent/glslang.y"
+                    {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer literal");
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).i64, (yyvsp[0].lex).loc, true);
     }
-#line 4315 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4680 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 13:
-#line 400 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 13: /* primary_expression: UINT64CONSTANT  */
+#line 414 "MachineIndependent/glslang.y"
+                     {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer literal");
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).u64, (yyvsp[0].lex).loc, true);
     }
-#line 4324 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4689 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 14:
-#line 404 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 14: /* primary_expression: INT16CONSTANT  */
+#line 418 "MachineIndependent/glslang.y"
+                    {
         parseContext.explicitInt16Check((yyvsp[0].lex).loc, "16-bit integer literal");
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((short)(yyvsp[0].lex).i, (yyvsp[0].lex).loc, true);
     }
-#line 4333 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4698 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 15:
-#line 408 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 15: /* primary_expression: UINT16CONSTANT  */
+#line 422 "MachineIndependent/glslang.y"
+                     {
         parseContext.explicitInt16Check((yyvsp[0].lex).loc, "16-bit unsigned integer literal");
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((unsigned short)(yyvsp[0].lex).u, (yyvsp[0].lex).loc, true);
     }
-#line 4342 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4707 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 16:
-#line 412 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 16: /* primary_expression: DOUBLECONSTANT  */
+#line 426 "MachineIndependent/glslang.y"
+                     {
         parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double literal");
         if (! parseContext.symbolTable.atBuiltInLevel())
             parseContext.doubleCheck((yyvsp[0].lex).loc, "double literal");
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).d, EbtDouble, (yyvsp[0].lex).loc, true);
     }
-#line 4353 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4718 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 17:
-#line 418 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 17: /* primary_expression: FLOAT16CONSTANT  */
+#line 432 "MachineIndependent/glslang.y"
+                      {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float literal");
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).d, EbtFloat16, (yyvsp[0].lex).loc, true);
     }
-#line 4362 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4727 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 18:
-#line 426 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 18: /* postfix_expression: primary_expression  */
+#line 440 "MachineIndependent/glslang.y"
+                         {
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
     }
-#line 4370 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4735 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 19:
-#line 429 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 19: /* postfix_expression: postfix_expression LEFT_BRACKET integer_expression RIGHT_BRACKET  */
+#line 443 "MachineIndependent/glslang.y"
+                                                                       {
         (yyval.interm.intermTypedNode) = parseContext.handleBracketDereference((yyvsp[-2].lex).loc, (yyvsp[-3].interm.intermTypedNode), (yyvsp[-1].interm.intermTypedNode));
     }
-#line 4378 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4743 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 20:
-#line 432 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 20: /* postfix_expression: function_call  */
+#line 446 "MachineIndependent/glslang.y"
+                    {
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
     }
-#line 4386 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4751 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 21:
-#line 435 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 21: /* postfix_expression: postfix_expression DOT IDENTIFIER  */
+#line 449 "MachineIndependent/glslang.y"
+                                        {
         (yyval.interm.intermTypedNode) = parseContext.handleDotDereference((yyvsp[0].lex).loc, (yyvsp[-2].interm.intermTypedNode), *(yyvsp[0].lex).string);
     }
-#line 4394 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4759 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 22:
-#line 438 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 22: /* postfix_expression: postfix_expression INC_OP  */
+#line 452 "MachineIndependent/glslang.y"
+                                {
         parseContext.variableCheck((yyvsp[-1].interm.intermTypedNode));
         parseContext.lValueErrorCheck((yyvsp[0].lex).loc, "++", (yyvsp[-1].interm.intermTypedNode));
         (yyval.interm.intermTypedNode) = parseContext.handleUnaryMath((yyvsp[0].lex).loc, "++", EOpPostIncrement, (yyvsp[-1].interm.intermTypedNode));
     }
-#line 4404 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4769 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 23:
-#line 443 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 23: /* postfix_expression: postfix_expression DEC_OP  */
+#line 457 "MachineIndependent/glslang.y"
+                                {
         parseContext.variableCheck((yyvsp[-1].interm.intermTypedNode));
         parseContext.lValueErrorCheck((yyvsp[0].lex).loc, "--", (yyvsp[-1].interm.intermTypedNode));
         (yyval.interm.intermTypedNode) = parseContext.handleUnaryMath((yyvsp[0].lex).loc, "--", EOpPostDecrement, (yyvsp[-1].interm.intermTypedNode));
     }
-#line 4414 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4779 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 24:
-#line 451 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 24: /* integer_expression: expression  */
+#line 465 "MachineIndependent/glslang.y"
+                 {
         parseContext.integerCheck((yyvsp[0].interm.intermTypedNode), "[]");
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
     }
-#line 4423 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4788 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 25:
-#line 458 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 25: /* function_call: function_call_or_method  */
+#line 472 "MachineIndependent/glslang.y"
+                              {
         (yyval.interm.intermTypedNode) = parseContext.handleFunctionCall((yyvsp[0].interm).loc, (yyvsp[0].interm).function, (yyvsp[0].interm).intermNode);
         delete (yyvsp[0].interm).function;
     }
-#line 4432 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4797 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 26:
-#line 465 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 26: /* function_call_or_method: function_call_generic  */
+#line 479 "MachineIndependent/glslang.y"
+                            {
         (yyval.interm) = (yyvsp[0].interm);
     }
-#line 4440 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4805 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 27:
-#line 471 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 27: /* function_call_generic: function_call_header_with_parameters RIGHT_PAREN  */
+#line 485 "MachineIndependent/glslang.y"
+                                                       {
         (yyval.interm) = (yyvsp[-1].interm);
         (yyval.interm).loc = (yyvsp[0].lex).loc;
     }
-#line 4449 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4814 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 28:
-#line 475 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 28: /* function_call_generic: function_call_header_no_parameters RIGHT_PAREN  */
+#line 489 "MachineIndependent/glslang.y"
+                                                     {
         (yyval.interm) = (yyvsp[-1].interm);
         (yyval.interm).loc = (yyvsp[0].lex).loc;
     }
-#line 4458 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4823 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 29:
-#line 482 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 29: /* function_call_header_no_parameters: function_call_header VOID  */
+#line 496 "MachineIndependent/glslang.y"
+                                {
         (yyval.interm) = (yyvsp[-1].interm);
     }
-#line 4466 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4831 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 30:
-#line 485 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 30: /* function_call_header_no_parameters: function_call_header  */
+#line 499 "MachineIndependent/glslang.y"
+                           {
         (yyval.interm) = (yyvsp[0].interm);
     }
-#line 4474 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4839 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 31:
-#line 491 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 31: /* function_call_header_with_parameters: function_call_header assignment_expression  */
+#line 505 "MachineIndependent/glslang.y"
+                                                 {
         TParameter param = { 0, new TType };
         param.type->shallowCopy((yyvsp[0].interm.intermTypedNode)->getType());
         (yyvsp[-1].interm).function->addParameter(param);
         (yyval.interm).function = (yyvsp[-1].interm).function;
         (yyval.interm).intermNode = (yyvsp[0].interm.intermTypedNode);
     }
-#line 4486 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4851 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 32:
-#line 498 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 32: /* function_call_header_with_parameters: function_call_header_with_parameters COMMA assignment_expression  */
+#line 512 "MachineIndependent/glslang.y"
+                                                                       {
         TParameter param = { 0, new TType };
         param.type->shallowCopy((yyvsp[0].interm.intermTypedNode)->getType());
         (yyvsp[-2].interm).function->addParameter(param);
         (yyval.interm).function = (yyvsp[-2].interm).function;
         (yyval.interm).intermNode = parseContext.intermediate.growAggregate((yyvsp[-2].interm).intermNode, (yyvsp[0].interm.intermTypedNode), (yyvsp[-1].lex).loc);
     }
-#line 4498 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4863 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 33:
-#line 508 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 33: /* function_call_header: function_identifier LEFT_PAREN  */
+#line 522 "MachineIndependent/glslang.y"
+                                     {
         (yyval.interm) = (yyvsp[-1].interm);
     }
-#line 4506 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4871 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 34:
-#line 516 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 34: /* function_identifier: type_specifier  */
+#line 530 "MachineIndependent/glslang.y"
+                     {
         // Constructor
         (yyval.interm).intermNode = 0;
         (yyval.interm).function = parseContext.handleConstructorCall((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type));
     }
-#line 4516 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4881 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 35:
-#line 521 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 35: /* function_identifier: postfix_expression  */
+#line 535 "MachineIndependent/glslang.y"
+                         {
         //
         // Should be a method or subroutine call, but we haven't recognized the arguments yet.
         //
@@ -4544,51 +4909,51 @@
             (yyval.interm).function = new TFunction(empty, TType(EbtVoid), EOpNull);
         }
     }
-#line 4548 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4913 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 36:
-#line 549 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 36: /* function_identifier: non_uniform_qualifier  */
+#line 563 "MachineIndependent/glslang.y"
+                            {
         // Constructor
         (yyval.interm).intermNode = 0;
         (yyval.interm).function = parseContext.handleConstructorCall((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type));
     }
-#line 4558 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4923 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 37:
-#line 558 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 37: /* unary_expression: postfix_expression  */
+#line 572 "MachineIndependent/glslang.y"
+                         {
         parseContext.variableCheck((yyvsp[0].interm.intermTypedNode));
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
         if (TIntermMethod* method = (yyvsp[0].interm.intermTypedNode)->getAsMethodNode())
             parseContext.error((yyvsp[0].interm.intermTypedNode)->getLoc(), "incomplete method syntax", method->getMethodName().c_str(), "");
     }
-#line 4569 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4934 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 38:
-#line 564 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 38: /* unary_expression: INC_OP unary_expression  */
+#line 578 "MachineIndependent/glslang.y"
+                              {
         parseContext.lValueErrorCheck((yyvsp[-1].lex).loc, "++", (yyvsp[0].interm.intermTypedNode));
         (yyval.interm.intermTypedNode) = parseContext.handleUnaryMath((yyvsp[-1].lex).loc, "++", EOpPreIncrement, (yyvsp[0].interm.intermTypedNode));
     }
-#line 4578 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4943 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 39:
-#line 568 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 39: /* unary_expression: DEC_OP unary_expression  */
+#line 582 "MachineIndependent/glslang.y"
+                              {
         parseContext.lValueErrorCheck((yyvsp[-1].lex).loc, "--", (yyvsp[0].interm.intermTypedNode));
         (yyval.interm.intermTypedNode) = parseContext.handleUnaryMath((yyvsp[-1].lex).loc, "--", EOpPreDecrement, (yyvsp[0].interm.intermTypedNode));
     }
-#line 4587 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4952 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 40:
-#line 572 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 40: /* unary_expression: unary_operator unary_expression  */
+#line 586 "MachineIndependent/glslang.y"
+                                      {
         if ((yyvsp[-1].interm).op != EOpNull) {
             char errorOp[2] = {0, 0};
             switch((yyvsp[-1].interm).op) {
@@ -4604,180 +4969,180 @@
                 (yyval.interm.intermTypedNode)->getAsConstantUnion()->setExpression();
         }
     }
-#line 4608 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4973 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 41:
-#line 592 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpNull; }
-#line 4614 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+  case 41: /* unary_operator: PLUS  */
+#line 606 "MachineIndependent/glslang.y"
+            { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpNull; }
+#line 4979 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 42:
-#line 593 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpNegative; }
-#line 4620 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+  case 42: /* unary_operator: DASH  */
+#line 607 "MachineIndependent/glslang.y"
+            { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpNegative; }
+#line 4985 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 43:
-#line 594 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpLogicalNot; }
-#line 4626 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+  case 43: /* unary_operator: BANG  */
+#line 608 "MachineIndependent/glslang.y"
+            { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpLogicalNot; }
+#line 4991 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 44:
-#line 595 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpBitwiseNot;
+  case 44: /* unary_operator: TILDE  */
+#line 609 "MachineIndependent/glslang.y"
+            { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpBitwiseNot;
               parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bitwise not"); }
-#line 4633 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4998 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 45:
-#line 601 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 4639 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+  case 45: /* multiplicative_expression: unary_expression  */
+#line 615 "MachineIndependent/glslang.y"
+                       { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
+#line 5004 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 46:
-#line 602 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 46: /* multiplicative_expression: multiplicative_expression STAR unary_expression  */
+#line 616 "MachineIndependent/glslang.y"
+                                                      {
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "*", EOpMul, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 4649 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5014 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 47:
-#line 607 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 47: /* multiplicative_expression: multiplicative_expression SLASH unary_expression  */
+#line 621 "MachineIndependent/glslang.y"
+                                                       {
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "/", EOpDiv, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 4659 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5024 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 48:
-#line 612 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 48: /* multiplicative_expression: multiplicative_expression PERCENT unary_expression  */
+#line 626 "MachineIndependent/glslang.y"
+                                                         {
         parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, "%");
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "%", EOpMod, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 4670 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5035 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 49:
-#line 621 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 4676 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+  case 49: /* additive_expression: multiplicative_expression  */
+#line 635 "MachineIndependent/glslang.y"
+                                { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
+#line 5041 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 50:
-#line 622 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 50: /* additive_expression: additive_expression PLUS multiplicative_expression  */
+#line 636 "MachineIndependent/glslang.y"
+                                                         {
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "+", EOpAdd, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 4686 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5051 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 51:
-#line 627 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 51: /* additive_expression: additive_expression DASH multiplicative_expression  */
+#line 641 "MachineIndependent/glslang.y"
+                                                         {
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "-", EOpSub, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 4696 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5061 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 52:
-#line 635 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 4702 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+  case 52: /* shift_expression: additive_expression  */
+#line 649 "MachineIndependent/glslang.y"
+                          { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
+#line 5067 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 53:
-#line 636 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 53: /* shift_expression: shift_expression LEFT_OP additive_expression  */
+#line 650 "MachineIndependent/glslang.y"
+                                                   {
         parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, "bit shift left");
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "<<", EOpLeftShift, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 4713 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5078 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 54:
-#line 642 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 54: /* shift_expression: shift_expression RIGHT_OP additive_expression  */
+#line 656 "MachineIndependent/glslang.y"
+                                                    {
         parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, "bit shift right");
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, ">>", EOpRightShift, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 4724 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5089 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 55:
-#line 651 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 4730 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+  case 55: /* relational_expression: shift_expression  */
+#line 665 "MachineIndependent/glslang.y"
+                       { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
+#line 5095 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 56:
-#line 652 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 56: /* relational_expression: relational_expression LEFT_ANGLE shift_expression  */
+#line 666 "MachineIndependent/glslang.y"
+                                                        {
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "<", EOpLessThan, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);
     }
-#line 4740 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5105 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 57:
-#line 657 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 57: /* relational_expression: relational_expression RIGHT_ANGLE shift_expression  */
+#line 671 "MachineIndependent/glslang.y"
+                                                          {
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, ">", EOpGreaterThan, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);
     }
-#line 4750 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5115 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 58:
-#line 662 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 58: /* relational_expression: relational_expression LE_OP shift_expression  */
+#line 676 "MachineIndependent/glslang.y"
+                                                    {
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "<=", EOpLessThanEqual, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);
     }
-#line 4760 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5125 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 59:
-#line 667 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 59: /* relational_expression: relational_expression GE_OP shift_expression  */
+#line 681 "MachineIndependent/glslang.y"
+                                                    {
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, ">=", EOpGreaterThanEqual, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);
     }
-#line 4770 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5135 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 60:
-#line 675 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 4776 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+  case 60: /* equality_expression: relational_expression  */
+#line 689 "MachineIndependent/glslang.y"
+                            { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
+#line 5141 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 61:
-#line 676 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 61: /* equality_expression: equality_expression EQ_OP relational_expression  */
+#line 690 "MachineIndependent/glslang.y"
+                                                       {
         parseContext.arrayObjectCheck((yyvsp[-1].lex).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "array comparison");
         parseContext.opaqueCheck((yyvsp[-1].lex).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "==");
         parseContext.specializationCheck((yyvsp[-1].lex).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "==");
@@ -4786,12 +5151,12 @@
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);
     }
-#line 4790 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5155 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 62:
-#line 685 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 62: /* equality_expression: equality_expression NE_OP relational_expression  */
+#line 699 "MachineIndependent/glslang.y"
+                                                      {
         parseContext.arrayObjectCheck((yyvsp[-1].lex).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "array comparison");
         parseContext.opaqueCheck((yyvsp[-1].lex).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "!=");
         parseContext.specializationCheck((yyvsp[-1].lex).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "!=");
@@ -4800,125 +5165,125 @@
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);
     }
-#line 4804 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5169 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 63:
-#line 697 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 4810 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+  case 63: /* and_expression: equality_expression  */
+#line 711 "MachineIndependent/glslang.y"
+                          { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
+#line 5175 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 64:
-#line 698 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 64: /* and_expression: and_expression AMPERSAND equality_expression  */
+#line 712 "MachineIndependent/glslang.y"
+                                                   {
         parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, "bitwise and");
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "&", EOpAnd, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 4821 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5186 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 65:
-#line 707 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 4827 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+  case 65: /* exclusive_or_expression: and_expression  */
+#line 721 "MachineIndependent/glslang.y"
+                     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
+#line 5192 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 66:
-#line 708 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 66: /* exclusive_or_expression: exclusive_or_expression CARET and_expression  */
+#line 722 "MachineIndependent/glslang.y"
+                                                   {
         parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, "bitwise exclusive or");
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "^", EOpExclusiveOr, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 4838 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5203 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 67:
-#line 717 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 4844 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+  case 67: /* inclusive_or_expression: exclusive_or_expression  */
+#line 731 "MachineIndependent/glslang.y"
+                              { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
+#line 5209 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 68:
-#line 718 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 68: /* inclusive_or_expression: inclusive_or_expression VERTICAL_BAR exclusive_or_expression  */
+#line 732 "MachineIndependent/glslang.y"
+                                                                   {
         parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, "bitwise inclusive or");
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "|", EOpInclusiveOr, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 4855 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5220 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 69:
-#line 727 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 4861 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+  case 69: /* logical_and_expression: inclusive_or_expression  */
+#line 741 "MachineIndependent/glslang.y"
+                              { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
+#line 5226 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 70:
-#line 728 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 70: /* logical_and_expression: logical_and_expression AND_OP inclusive_or_expression  */
+#line 742 "MachineIndependent/glslang.y"
+                                                            {
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "&&", EOpLogicalAnd, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);
     }
-#line 4871 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5236 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 71:
-#line 736 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 4877 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+  case 71: /* logical_xor_expression: logical_and_expression  */
+#line 750 "MachineIndependent/glslang.y"
+                             { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
+#line 5242 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 72:
-#line 737 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 72: /* logical_xor_expression: logical_xor_expression XOR_OP logical_and_expression  */
+#line 751 "MachineIndependent/glslang.y"
+                                                            {
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "^^", EOpLogicalXor, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);
     }
-#line 4887 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5252 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 73:
-#line 745 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 4893 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+  case 73: /* logical_or_expression: logical_xor_expression  */
+#line 759 "MachineIndependent/glslang.y"
+                             { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
+#line 5258 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 74:
-#line 746 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 74: /* logical_or_expression: logical_or_expression OR_OP logical_xor_expression  */
+#line 760 "MachineIndependent/glslang.y"
+                                                          {
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "||", EOpLogicalOr, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);
     }
-#line 4903 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5268 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 75:
-#line 754 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 4909 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+  case 75: /* conditional_expression: logical_or_expression  */
+#line 768 "MachineIndependent/glslang.y"
+                            { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
+#line 5274 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 76:
-#line 755 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 76: /* $@1: %empty  */
+#line 769 "MachineIndependent/glslang.y"
+                                     {
         ++parseContext.controlFlowNestingLevel;
     }
-#line 4917 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5282 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 77:
-#line 758 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 77: /* conditional_expression: logical_or_expression QUESTION $@1 expression COLON assignment_expression  */
+#line 772 "MachineIndependent/glslang.y"
+                                             {
         --parseContext.controlFlowNestingLevel;
         parseContext.boolCheck((yyvsp[-4].lex).loc, (yyvsp[-5].interm.intermTypedNode));
         parseContext.rValueErrorCheck((yyvsp[-4].lex).loc, "?", (yyvsp[-5].interm.intermTypedNode));
@@ -4930,18 +5295,18 @@
             (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
         }
     }
-#line 4934 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5299 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 78:
-#line 773 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 4940 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+  case 78: /* assignment_expression: conditional_expression  */
+#line 787 "MachineIndependent/glslang.y"
+                             { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
+#line 5305 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 79:
-#line 774 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 79: /* assignment_expression: unary_expression assignment_operator assignment_expression  */
+#line 788 "MachineIndependent/glslang.y"
+                                                                 {
         parseContext.arrayObjectCheck((yyvsp[-1].interm).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "array assignment");
         parseContext.opaqueCheck((yyvsp[-1].interm).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "=");
         parseContext.storage16BitAssignmentCheck((yyvsp[-1].interm).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "=");
@@ -4954,120 +5319,120 @@
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
         }
     }
-#line 4958 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5323 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 80:
-#line 790 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 80: /* assignment_operator: EQUAL  */
+#line 804 "MachineIndependent/glslang.y"
+            {
         (yyval.interm).loc = (yyvsp[0].lex).loc;
         (yyval.interm).op = EOpAssign;
     }
-#line 4967 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5332 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 81:
-#line 794 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 81: /* assignment_operator: MUL_ASSIGN  */
+#line 808 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm).loc = (yyvsp[0].lex).loc;
         (yyval.interm).op = EOpMulAssign;
     }
-#line 4976 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5341 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 82:
-#line 798 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 82: /* assignment_operator: DIV_ASSIGN  */
+#line 812 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm).loc = (yyvsp[0].lex).loc;
         (yyval.interm).op = EOpDivAssign;
     }
-#line 4985 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5350 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 83:
-#line 802 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 83: /* assignment_operator: MOD_ASSIGN  */
+#line 816 "MachineIndependent/glslang.y"
+                 {
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "%=");
         (yyval.interm).loc = (yyvsp[0].lex).loc;
         (yyval.interm).op = EOpModAssign;
     }
-#line 4995 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5360 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 84:
-#line 807 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 84: /* assignment_operator: ADD_ASSIGN  */
+#line 821 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm).loc = (yyvsp[0].lex).loc;
         (yyval.interm).op = EOpAddAssign;
     }
-#line 5004 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5369 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 85:
-#line 811 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 85: /* assignment_operator: SUB_ASSIGN  */
+#line 825 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm).loc = (yyvsp[0].lex).loc;
         (yyval.interm).op = EOpSubAssign;
     }
-#line 5013 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5378 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 86:
-#line 815 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 86: /* assignment_operator: LEFT_ASSIGN  */
+#line 829 "MachineIndependent/glslang.y"
+                  {
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bit-shift left assign");
         (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpLeftShiftAssign;
     }
-#line 5022 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5387 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 87:
-#line 819 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 87: /* assignment_operator: RIGHT_ASSIGN  */
+#line 833 "MachineIndependent/glslang.y"
+                   {
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bit-shift right assign");
         (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpRightShiftAssign;
     }
-#line 5031 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5396 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 88:
-#line 823 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 88: /* assignment_operator: AND_ASSIGN  */
+#line 837 "MachineIndependent/glslang.y"
+                 {
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bitwise-and assign");
         (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpAndAssign;
     }
-#line 5040 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5405 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 89:
-#line 827 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 89: /* assignment_operator: XOR_ASSIGN  */
+#line 841 "MachineIndependent/glslang.y"
+                 {
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bitwise-xor assign");
         (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpExclusiveOrAssign;
     }
-#line 5049 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5414 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 90:
-#line 831 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 90: /* assignment_operator: OR_ASSIGN  */
+#line 845 "MachineIndependent/glslang.y"
+                {
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bitwise-or assign");
         (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpInclusiveOrAssign;
     }
-#line 5058 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5423 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 91:
-#line 838 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 91: /* expression: assignment_expression  */
+#line 852 "MachineIndependent/glslang.y"
+                            {
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
     }
-#line 5066 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5431 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 92:
-#line 841 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 92: /* expression: expression COMMA assignment_expression  */
+#line 855 "MachineIndependent/glslang.y"
+                                             {
         parseContext.samplerConstructorLocationCheck((yyvsp[-1].lex).loc, ",", (yyvsp[0].interm.intermTypedNode));
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addComma((yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yyvsp[-1].lex).loc);
         if ((yyval.interm.intermTypedNode) == 0) {
@@ -5075,118 +5440,118 @@
             (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
         }
     }
-#line 5079 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5444 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 93:
-#line 852 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 93: /* constant_expression: conditional_expression  */
+#line 866 "MachineIndependent/glslang.y"
+                             {
         parseContext.constantValueCheck((yyvsp[0].interm.intermTypedNode), "");
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
     }
-#line 5088 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5453 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 94:
-#line 859 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 94: /* declaration: function_prototype SEMICOLON  */
+#line 873 "MachineIndependent/glslang.y"
+                                   {
         parseContext.handleFunctionDeclarator((yyvsp[-1].interm).loc, *(yyvsp[-1].interm).function, true /* prototype */);
         (yyval.interm.intermNode) = 0;
         // TODO: 4.0 functionality: subroutines: make the identifier a user type for this signature
     }
-#line 5098 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5463 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 95:
-#line 864 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 95: /* declaration: init_declarator_list SEMICOLON  */
+#line 878 "MachineIndependent/glslang.y"
+                                     {
         if ((yyvsp[-1].interm).intermNode && (yyvsp[-1].interm).intermNode->getAsAggregate())
             (yyvsp[-1].interm).intermNode->getAsAggregate()->setOperator(EOpSequence);
         (yyval.interm.intermNode) = (yyvsp[-1].interm).intermNode;
     }
-#line 5108 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5473 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 96:
-#line 869 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 96: /* declaration: PRECISION precision_qualifier type_specifier SEMICOLON  */
+#line 883 "MachineIndependent/glslang.y"
+                                                             {
         parseContext.profileRequires((yyvsp[-3].lex).loc, ENoProfile, 130, 0, "precision statement");
         // lazy setting of the previous scope's defaults, has effect only the first time it is called in a particular scope
         parseContext.symbolTable.setPreviousDefaultPrecisions(&parseContext.defaultPrecision[0]);
         parseContext.setDefaultPrecision((yyvsp[-3].lex).loc, (yyvsp[-1].interm.type), (yyvsp[-2].interm.type).qualifier.precision);
         (yyval.interm.intermNode) = 0;
     }
-#line 5120 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5485 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 97:
-#line 876 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 97: /* declaration: block_structure SEMICOLON  */
+#line 890 "MachineIndependent/glslang.y"
+                                {
         parseContext.declareBlock((yyvsp[-1].interm).loc, *(yyvsp[-1].interm).typeList);
         (yyval.interm.intermNode) = 0;
     }
-#line 5129 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5494 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 98:
-#line 880 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 98: /* declaration: block_structure IDENTIFIER SEMICOLON  */
+#line 894 "MachineIndependent/glslang.y"
+                                           {
         parseContext.declareBlock((yyvsp[-2].interm).loc, *(yyvsp[-2].interm).typeList, (yyvsp[-1].lex).string);
         (yyval.interm.intermNode) = 0;
     }
-#line 5138 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5503 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 99:
-#line 884 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 99: /* declaration: block_structure IDENTIFIER array_specifier SEMICOLON  */
+#line 898 "MachineIndependent/glslang.y"
+                                                           {
         parseContext.declareBlock((yyvsp[-3].interm).loc, *(yyvsp[-3].interm).typeList, (yyvsp[-2].lex).string, (yyvsp[-1].interm).arraySizes);
         (yyval.interm.intermNode) = 0;
     }
-#line 5147 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5512 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 100:
-#line 888 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 100: /* declaration: type_qualifier SEMICOLON  */
+#line 902 "MachineIndependent/glslang.y"
+                               {
         parseContext.globalQualifierFixCheck((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier);
         parseContext.updateStandaloneQualifierDefaults((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type));
         (yyval.interm.intermNode) = 0;
     }
-#line 5157 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5522 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 101:
-#line 893 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 101: /* declaration: type_qualifier IDENTIFIER SEMICOLON  */
+#line 907 "MachineIndependent/glslang.y"
+                                          {
         parseContext.checkNoShaderLayouts((yyvsp[-2].interm.type).loc, (yyvsp[-2].interm.type).shaderQualifiers);
         parseContext.addQualifierToExisting((yyvsp[-2].interm.type).loc, (yyvsp[-2].interm.type).qualifier, *(yyvsp[-1].lex).string);
         (yyval.interm.intermNode) = 0;
     }
-#line 5167 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5532 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 102:
-#line 898 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 102: /* declaration: type_qualifier IDENTIFIER identifier_list SEMICOLON  */
+#line 912 "MachineIndependent/glslang.y"
+                                                          {
         parseContext.checkNoShaderLayouts((yyvsp[-3].interm.type).loc, (yyvsp[-3].interm.type).shaderQualifiers);
         (yyvsp[-1].interm.identifierList)->push_back((yyvsp[-2].lex).string);
         parseContext.addQualifierToExisting((yyvsp[-3].interm.type).loc, (yyvsp[-3].interm.type).qualifier, *(yyvsp[-1].interm.identifierList));
         (yyval.interm.intermNode) = 0;
     }
-#line 5178 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5543 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 103:
-#line 907 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { parseContext.nestedBlockCheck((yyvsp[-2].interm.type).loc); }
-#line 5184 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+  case 103: /* $@2: %empty  */
+#line 921 "MachineIndependent/glslang.y"
+                                           { parseContext.nestedBlockCheck((yyvsp[-2].interm.type).loc); }
+#line 5549 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 104:
-#line 907 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-        --parseContext.structNestingLevel;
+  case 104: /* block_structure: type_qualifier IDENTIFIER LEFT_BRACE $@2 struct_declaration_list RIGHT_BRACE  */
+#line 921 "MachineIndependent/glslang.y"
+                                                                                                                          {
+        --parseContext.blockNestingLevel;
         parseContext.blockName = (yyvsp[-4].lex).string;
         parseContext.globalQualifierFixCheck((yyvsp[-5].interm.type).loc, (yyvsp[-5].interm.type).qualifier);
         parseContext.checkNoShaderLayouts((yyvsp[-5].interm.type).loc, (yyvsp[-5].interm.type).shaderQualifiers);
@@ -5194,55 +5559,55 @@
         (yyval.interm).loc = (yyvsp[-5].interm.type).loc;
         (yyval.interm).typeList = (yyvsp[-1].interm.typeList);
     }
-#line 5198 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5563 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 105:
-#line 918 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 105: /* identifier_list: COMMA IDENTIFIER  */
+#line 932 "MachineIndependent/glslang.y"
+                       {
         (yyval.interm.identifierList) = new TIdentifierList;
         (yyval.interm.identifierList)->push_back((yyvsp[0].lex).string);
     }
-#line 5207 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5572 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 106:
-#line 922 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 106: /* identifier_list: identifier_list COMMA IDENTIFIER  */
+#line 936 "MachineIndependent/glslang.y"
+                                       {
         (yyval.interm.identifierList) = (yyvsp[-2].interm.identifierList);
         (yyval.interm.identifierList)->push_back((yyvsp[0].lex).string);
     }
-#line 5216 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5581 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 107:
-#line 929 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 107: /* function_prototype: function_declarator RIGHT_PAREN  */
+#line 943 "MachineIndependent/glslang.y"
+                                       {
         (yyval.interm).function = (yyvsp[-1].interm.function);
         (yyval.interm).loc = (yyvsp[0].lex).loc;
     }
-#line 5225 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5590 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 108:
-#line 936 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 108: /* function_declarator: function_header  */
+#line 950 "MachineIndependent/glslang.y"
+                      {
         (yyval.interm.function) = (yyvsp[0].interm.function);
     }
-#line 5233 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5598 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 109:
-#line 939 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 109: /* function_declarator: function_header_with_parameters  */
+#line 953 "MachineIndependent/glslang.y"
+                                      {
         (yyval.interm.function) = (yyvsp[0].interm.function);
     }
-#line 5241 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5606 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 110:
-#line 946 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 110: /* function_header_with_parameters: function_header parameter_declaration  */
+#line 960 "MachineIndependent/glslang.y"
+                                            {
         // Add the parameter
         (yyval.interm.function) = (yyvsp[-1].interm.function);
         if ((yyvsp[0].interm).param.type->getBasicType() != EbtVoid)
@@ -5250,12 +5615,12 @@
         else
             delete (yyvsp[0].interm).param.type;
     }
-#line 5254 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5619 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 111:
-#line 954 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 111: /* function_header_with_parameters: function_header_with_parameters COMMA parameter_declaration  */
+#line 968 "MachineIndependent/glslang.y"
+                                                                  {
         //
         // Only first parameter of one-parameter functions can be void
         // The check for named parameters not being void is done in parameter_declarator
@@ -5272,12 +5637,12 @@
             (yyvsp[-2].interm.function)->addParameter((yyvsp[0].interm).param);
         }
     }
-#line 5276 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5641 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 112:
-#line 974 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 112: /* function_header: fully_specified_type IDENTIFIER LEFT_PAREN  */
+#line 988 "MachineIndependent/glslang.y"
+                                                 {
         if ((yyvsp[-2].interm.type).qualifier.storage != EvqGlobal && (yyvsp[-2].interm.type).qualifier.storage != EvqTemporary) {
             parseContext.error((yyvsp[-1].lex).loc, "no qualifiers allowed for function return",
                                GetStorageQualifierString((yyvsp[-2].interm.type).qualifier.storage), "");
@@ -5296,12 +5661,12 @@
         function = new TFunction((yyvsp[-1].lex).string, type);
         (yyval.interm.function) = function;
     }
-#line 5300 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5665 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 113:
-#line 997 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 113: /* parameter_declarator: type_specifier IDENTIFIER  */
+#line 1011 "MachineIndependent/glslang.y"
+                                {
         if ((yyvsp[-1].interm.type).arraySizes) {
             parseContext.profileRequires((yyvsp[-1].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type");
             parseContext.profileRequires((yyvsp[-1].interm.type).loc, EEsProfile, 300, 0, "arrayed type");
@@ -5316,12 +5681,12 @@
         (yyval.interm).loc = (yyvsp[0].lex).loc;
         (yyval.interm).param = param;
     }
-#line 5320 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5685 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 114:
-#line 1012 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 114: /* parameter_declarator: type_specifier IDENTIFIER array_specifier  */
+#line 1026 "MachineIndependent/glslang.y"
+                                                {
         if ((yyvsp[-2].interm.type).arraySizes) {
             parseContext.profileRequires((yyvsp[-2].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type");
             parseContext.profileRequires((yyvsp[-2].interm.type).loc, EEsProfile, 300, 0, "arrayed type");
@@ -5340,12 +5705,12 @@
         (yyval.interm).loc = (yyvsp[-1].lex).loc;
         (yyval.interm).param = param;
     }
-#line 5344 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5709 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 115:
-#line 1037 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 115: /* parameter_declaration: type_qualifier parameter_declarator  */
+#line 1051 "MachineIndependent/glslang.y"
+                                          {
         (yyval.interm) = (yyvsp[0].interm);
         if ((yyvsp[-1].interm.type).qualifier.precision != EpqNone)
             (yyval.interm).param.type->getQualifier().precision = (yyvsp[-1].interm.type).qualifier.precision;
@@ -5356,24 +5721,24 @@
         parseContext.paramCheckFix((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier, *(yyval.interm).param.type);
 
     }
-#line 5360 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5725 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 116:
-#line 1048 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 116: /* parameter_declaration: parameter_declarator  */
+#line 1062 "MachineIndependent/glslang.y"
+                           {
         (yyval.interm) = (yyvsp[0].interm);
 
         parseContext.parameterTypeCheck((yyvsp[0].interm).loc, EvqIn, *(yyvsp[0].interm).param.type);
         parseContext.paramCheckFixStorage((yyvsp[0].interm).loc, EvqTemporary, *(yyval.interm).param.type);
         parseContext.precisionQualifierCheck((yyval.interm).loc, (yyval.interm).param.type->getBasicType(), (yyval.interm).param.type->getQualifier());
     }
-#line 5372 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5737 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 117:
-#line 1058 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 117: /* parameter_declaration: type_qualifier parameter_type_specifier  */
+#line 1072 "MachineIndependent/glslang.y"
+                                              {
         (yyval.interm) = (yyvsp[0].interm);
         if ((yyvsp[-1].interm.type).qualifier.precision != EpqNone)
             (yyval.interm).param.type->getQualifier().precision = (yyvsp[-1].interm.type).qualifier.precision;
@@ -5383,133 +5748,133 @@
         parseContext.parameterTypeCheck((yyvsp[0].interm).loc, (yyvsp[-1].interm.type).qualifier.storage, *(yyval.interm).param.type);
         parseContext.paramCheckFix((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier, *(yyval.interm).param.type);
     }
-#line 5387 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5752 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 118:
-#line 1068 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 118: /* parameter_declaration: parameter_type_specifier  */
+#line 1082 "MachineIndependent/glslang.y"
+                               {
         (yyval.interm) = (yyvsp[0].interm);
 
         parseContext.parameterTypeCheck((yyvsp[0].interm).loc, EvqIn, *(yyvsp[0].interm).param.type);
         parseContext.paramCheckFixStorage((yyvsp[0].interm).loc, EvqTemporary, *(yyval.interm).param.type);
         parseContext.precisionQualifierCheck((yyval.interm).loc, (yyval.interm).param.type->getBasicType(), (yyval.interm).param.type->getQualifier());
     }
-#line 5399 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5764 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 119:
-#line 1078 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 119: /* parameter_type_specifier: type_specifier  */
+#line 1092 "MachineIndependent/glslang.y"
+                     {
         TParameter param = { 0, new TType((yyvsp[0].interm.type)) };
         (yyval.interm).param = param;
         if ((yyvsp[0].interm.type).arraySizes)
             parseContext.arraySizeRequiredCheck((yyvsp[0].interm.type).loc, *(yyvsp[0].interm.type).arraySizes);
     }
-#line 5410 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5775 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 120:
-#line 1087 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 120: /* init_declarator_list: single_declaration  */
+#line 1101 "MachineIndependent/glslang.y"
+                         {
         (yyval.interm) = (yyvsp[0].interm);
     }
-#line 5418 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5783 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 121:
-#line 1090 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 121: /* init_declarator_list: init_declarator_list COMMA IDENTIFIER  */
+#line 1104 "MachineIndependent/glslang.y"
+                                            {
         (yyval.interm) = (yyvsp[-2].interm);
         parseContext.declareVariable((yyvsp[0].lex).loc, *(yyvsp[0].lex).string, (yyvsp[-2].interm).type);
     }
-#line 5427 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5792 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 122:
-#line 1094 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 122: /* init_declarator_list: init_declarator_list COMMA IDENTIFIER array_specifier  */
+#line 1108 "MachineIndependent/glslang.y"
+                                                            {
         (yyval.interm) = (yyvsp[-3].interm);
         parseContext.declareVariable((yyvsp[-1].lex).loc, *(yyvsp[-1].lex).string, (yyvsp[-3].interm).type, (yyvsp[0].interm).arraySizes);
     }
-#line 5436 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5801 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 123:
-#line 1098 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 123: /* init_declarator_list: init_declarator_list COMMA IDENTIFIER array_specifier EQUAL initializer  */
+#line 1112 "MachineIndependent/glslang.y"
+                                                                              {
         (yyval.interm).type = (yyvsp[-5].interm).type;
         TIntermNode* initNode = parseContext.declareVariable((yyvsp[-3].lex).loc, *(yyvsp[-3].lex).string, (yyvsp[-5].interm).type, (yyvsp[-2].interm).arraySizes, (yyvsp[0].interm.intermTypedNode));
         (yyval.interm).intermNode = parseContext.intermediate.growAggregate((yyvsp[-5].interm).intermNode, initNode, (yyvsp[-1].lex).loc);
     }
-#line 5446 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5811 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 124:
-#line 1103 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 124: /* init_declarator_list: init_declarator_list COMMA IDENTIFIER EQUAL initializer  */
+#line 1117 "MachineIndependent/glslang.y"
+                                                              {
         (yyval.interm).type = (yyvsp[-4].interm).type;
         TIntermNode* initNode = parseContext.declareVariable((yyvsp[-2].lex).loc, *(yyvsp[-2].lex).string, (yyvsp[-4].interm).type, 0, (yyvsp[0].interm.intermTypedNode));
         (yyval.interm).intermNode = parseContext.intermediate.growAggregate((yyvsp[-4].interm).intermNode, initNode, (yyvsp[-1].lex).loc);
     }
-#line 5456 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5821 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 125:
-#line 1111 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 125: /* single_declaration: fully_specified_type  */
+#line 1125 "MachineIndependent/glslang.y"
+                           {
         (yyval.interm).type = (yyvsp[0].interm.type);
         (yyval.interm).intermNode = 0;
 
         parseContext.declareTypeDefaults((yyval.interm).loc, (yyval.interm).type);
 
     }
-#line 5468 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5833 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 126:
-#line 1118 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 126: /* single_declaration: fully_specified_type IDENTIFIER  */
+#line 1132 "MachineIndependent/glslang.y"
+                                      {
         (yyval.interm).type = (yyvsp[-1].interm.type);
         (yyval.interm).intermNode = 0;
         parseContext.declareVariable((yyvsp[0].lex).loc, *(yyvsp[0].lex).string, (yyvsp[-1].interm.type));
     }
-#line 5478 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5843 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 127:
-#line 1123 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 127: /* single_declaration: fully_specified_type IDENTIFIER array_specifier  */
+#line 1137 "MachineIndependent/glslang.y"
+                                                      {
         (yyval.interm).type = (yyvsp[-2].interm.type);
         (yyval.interm).intermNode = 0;
         parseContext.declareVariable((yyvsp[-1].lex).loc, *(yyvsp[-1].lex).string, (yyvsp[-2].interm.type), (yyvsp[0].interm).arraySizes);
     }
-#line 5488 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5853 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 128:
-#line 1128 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 128: /* single_declaration: fully_specified_type IDENTIFIER array_specifier EQUAL initializer  */
+#line 1142 "MachineIndependent/glslang.y"
+                                                                        {
         (yyval.interm).type = (yyvsp[-4].interm.type);
         TIntermNode* initNode = parseContext.declareVariable((yyvsp[-3].lex).loc, *(yyvsp[-3].lex).string, (yyvsp[-4].interm.type), (yyvsp[-2].interm).arraySizes, (yyvsp[0].interm.intermTypedNode));
         (yyval.interm).intermNode = parseContext.intermediate.growAggregate(0, initNode, (yyvsp[-1].lex).loc);
     }
-#line 5498 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5863 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 129:
-#line 1133 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 129: /* single_declaration: fully_specified_type IDENTIFIER EQUAL initializer  */
+#line 1147 "MachineIndependent/glslang.y"
+                                                        {
         (yyval.interm).type = (yyvsp[-3].interm.type);
         TIntermNode* initNode = parseContext.declareVariable((yyvsp[-2].lex).loc, *(yyvsp[-2].lex).string, (yyvsp[-3].interm.type), 0, (yyvsp[0].interm.intermTypedNode));
         (yyval.interm).intermNode = parseContext.intermediate.growAggregate(0, initNode, (yyvsp[-1].lex).loc);
     }
-#line 5508 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5873 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 130:
-#line 1142 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 130: /* fully_specified_type: type_specifier  */
+#line 1156 "MachineIndependent/glslang.y"
+                     {
         (yyval.interm.type) = (yyvsp[0].interm.type);
 
         parseContext.globalQualifierTypeCheck((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type).qualifier, (yyval.interm.type));
@@ -5519,12 +5884,12 @@
         }
         parseContext.precisionQualifierCheck((yyval.interm.type).loc, (yyval.interm.type).basicType, (yyval.interm.type).qualifier);
     }
-#line 5523 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5888 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 131:
-#line 1152 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 131: /* fully_specified_type: type_qualifier type_specifier  */
+#line 1166 "MachineIndependent/glslang.y"
+                                     {
         parseContext.globalQualifierFixCheck((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier);
         parseContext.globalQualifierTypeCheck((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier, (yyvsp[0].interm.type));
 
@@ -5548,71 +5913,71 @@
              (parseContext.language == EShLangFragment && (yyval.interm.type).qualifier.storage == EvqVaryingIn)))
             (yyval.interm.type).qualifier.smooth = true;
     }
-#line 5552 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5917 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 132:
-#line 1179 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 132: /* invariant_qualifier: INVARIANT  */
+#line 1193 "MachineIndependent/glslang.y"
+                {
         parseContext.globalCheck((yyvsp[0].lex).loc, "invariant");
         parseContext.profileRequires((yyval.interm.type).loc, ENoProfile, 120, 0, "invariant");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.invariant = true;
     }
-#line 5563 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5928 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 133:
-#line 1188 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 133: /* interpolation_qualifier: SMOOTH  */
+#line 1202 "MachineIndependent/glslang.y"
+             {
         parseContext.globalCheck((yyvsp[0].lex).loc, "smooth");
         parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "smooth");
         parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 300, 0, "smooth");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.smooth = true;
     }
-#line 5575 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5940 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 134:
-#line 1195 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 134: /* interpolation_qualifier: FLAT  */
+#line 1209 "MachineIndependent/glslang.y"
+           {
         parseContext.globalCheck((yyvsp[0].lex).loc, "flat");
         parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "flat");
         parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 300, 0, "flat");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.flat = true;
     }
-#line 5587 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5952 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 135:
-#line 1203 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 135: /* interpolation_qualifier: NOPERSPECTIVE  */
+#line 1217 "MachineIndependent/glslang.y"
+                    {
         parseContext.globalCheck((yyvsp[0].lex).loc, "noperspective");
         parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 0, E_GL_NV_shader_noperspective_interpolation, "noperspective");
         parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "noperspective");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.nopersp = true;
     }
-#line 5599 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5964 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 136:
-#line 1210 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 136: /* interpolation_qualifier: EXPLICITINTERPAMD  */
+#line 1224 "MachineIndependent/glslang.y"
+                        {
         parseContext.globalCheck((yyvsp[0].lex).loc, "__explicitInterpAMD");
         parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile, 450, E_GL_AMD_shader_explicit_vertex_parameter, "explicit interpolation");
         parseContext.profileRequires((yyvsp[0].lex).loc, ECompatibilityProfile, 450, E_GL_AMD_shader_explicit_vertex_parameter, "explicit interpolation");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.explicitInterp = true;
     }
-#line 5611 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5976 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 137:
-#line 1217 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 137: /* interpolation_qualifier: PERVERTEXNV  */
+#line 1231 "MachineIndependent/glslang.y"
+                  {
         parseContext.globalCheck((yyvsp[0].lex).loc, "pervertexNV");
         parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile, 0, E_GL_NV_fragment_shader_barycentric, "fragment shader barycentric");
         parseContext.profileRequires((yyvsp[0].lex).loc, ECompatibilityProfile, 0, E_GL_NV_fragment_shader_barycentric, "fragment shader barycentric");
@@ -5620,12 +5985,12 @@
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.pervertexNV = true;
     }
-#line 5624 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5989 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 138:
-#line 1225 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 138: /* interpolation_qualifier: PERPRIMITIVENV  */
+#line 1239 "MachineIndependent/glslang.y"
+                     {
         // No need for profile version or extension check. Shader stage already checks both.
         parseContext.globalCheck((yyvsp[0].lex).loc, "perprimitiveNV");
         parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangFragmentMask | EShLangMeshNVMask), "perprimitiveNV");
@@ -5635,109 +6000,109 @@
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.perPrimitiveNV = true;
     }
-#line 5639 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6004 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 139:
-#line 1235 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 139: /* interpolation_qualifier: PERVIEWNV  */
+#line 1249 "MachineIndependent/glslang.y"
+                {
         // No need for profile version or extension check. Shader stage already checks both.
         parseContext.globalCheck((yyvsp[0].lex).loc, "perviewNV");
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangMeshNV, "perviewNV");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.perViewNV = true;
     }
-#line 5651 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6016 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 140:
-#line 1242 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 140: /* interpolation_qualifier: PERTASKNV  */
+#line 1256 "MachineIndependent/glslang.y"
+                {
         // No need for profile version or extension check. Shader stage already checks both.
         parseContext.globalCheck((yyvsp[0].lex).loc, "taskNV");
         parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangTaskNVMask | EShLangMeshNVMask), "taskNV");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.perTaskNV = true;
     }
-#line 5663 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6028 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 141:
-#line 1253 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 141: /* layout_qualifier: LAYOUT LEFT_PAREN layout_qualifier_id_list RIGHT_PAREN  */
+#line 1267 "MachineIndependent/glslang.y"
+                                                             {
         (yyval.interm.type) = (yyvsp[-1].interm.type);
     }
-#line 5671 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6036 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 142:
-#line 1259 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 142: /* layout_qualifier_id_list: layout_qualifier_id  */
+#line 1273 "MachineIndependent/glslang.y"
+                          {
         (yyval.interm.type) = (yyvsp[0].interm.type);
     }
-#line 5679 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6044 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 143:
-#line 1262 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 143: /* layout_qualifier_id_list: layout_qualifier_id_list COMMA layout_qualifier_id  */
+#line 1276 "MachineIndependent/glslang.y"
+                                                         {
         (yyval.interm.type) = (yyvsp[-2].interm.type);
         (yyval.interm.type).shaderQualifiers.merge((yyvsp[0].interm.type).shaderQualifiers);
         parseContext.mergeObjectLayoutQualifiers((yyval.interm.type).qualifier, (yyvsp[0].interm.type).qualifier, false);
     }
-#line 5689 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6054 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 144:
-#line 1269 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 144: /* layout_qualifier_id: IDENTIFIER  */
+#line 1283 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         parseContext.setLayoutQualifier((yyvsp[0].lex).loc, (yyval.interm.type), *(yyvsp[0].lex).string);
     }
-#line 5698 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6063 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 145:
-#line 1273 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 145: /* layout_qualifier_id: IDENTIFIER EQUAL constant_expression  */
+#line 1287 "MachineIndependent/glslang.y"
+                                           {
         (yyval.interm.type).init((yyvsp[-2].lex).loc);
         parseContext.setLayoutQualifier((yyvsp[-2].lex).loc, (yyval.interm.type), *(yyvsp[-2].lex).string, (yyvsp[0].interm.intermTypedNode));
     }
-#line 5707 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6072 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 146:
-#line 1277 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { // because "shared" is both an identifier and a keyword
+  case 146: /* layout_qualifier_id: SHARED  */
+#line 1291 "MachineIndependent/glslang.y"
+             { // because "shared" is both an identifier and a keyword
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         TString strShared("shared");
         parseContext.setLayoutQualifier((yyvsp[0].lex).loc, (yyval.interm.type), strShared);
     }
-#line 5717 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6082 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 147:
-#line 1286 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 147: /* precise_qualifier: PRECISE  */
+#line 1300 "MachineIndependent/glslang.y"
+              {
         parseContext.profileRequires((yyval.interm.type).loc, ECoreProfile | ECompatibilityProfile, 400, E_GL_ARB_gpu_shader5, "precise");
         parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 320, Num_AEP_gpu_shader5, AEP_gpu_shader5, "precise");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.noContraction = true;
     }
-#line 5728 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6093 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 148:
-#line 1296 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 148: /* type_qualifier: single_type_qualifier  */
+#line 1310 "MachineIndependent/glslang.y"
+                            {
         (yyval.interm.type) = (yyvsp[0].interm.type);
     }
-#line 5736 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6101 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 149:
-#line 1299 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 149: /* type_qualifier: type_qualifier single_type_qualifier  */
+#line 1313 "MachineIndependent/glslang.y"
+                                           {
         (yyval.interm.type) = (yyvsp[-1].interm.type);
         if ((yyval.interm.type).basicType == EbtVoid)
             (yyval.interm.type).basicType = (yyvsp[0].interm.type).basicType;
@@ -5745,135 +6110,135 @@
         (yyval.interm.type).shaderQualifiers.merge((yyvsp[0].interm.type).shaderQualifiers);
         parseContext.mergeQualifiers((yyval.interm.type).loc, (yyval.interm.type).qualifier, (yyvsp[0].interm.type).qualifier, false);
     }
-#line 5749 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6114 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 150:
-#line 1310 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 150: /* single_type_qualifier: storage_qualifier  */
+#line 1324 "MachineIndependent/glslang.y"
+                        {
         (yyval.interm.type) = (yyvsp[0].interm.type);
     }
-#line 5757 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6122 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 151:
-#line 1313 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 151: /* single_type_qualifier: layout_qualifier  */
+#line 1327 "MachineIndependent/glslang.y"
+                       {
         (yyval.interm.type) = (yyvsp[0].interm.type);
     }
-#line 5765 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6130 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 152:
-#line 1316 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 152: /* single_type_qualifier: precision_qualifier  */
+#line 1330 "MachineIndependent/glslang.y"
+                          {
         parseContext.checkPrecisionQualifier((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type).qualifier.precision);
         (yyval.interm.type) = (yyvsp[0].interm.type);
     }
-#line 5774 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6139 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 153:
-#line 1320 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 153: /* single_type_qualifier: interpolation_qualifier  */
+#line 1334 "MachineIndependent/glslang.y"
+                              {
         // allow inheritance of storage qualifier from block declaration
         (yyval.interm.type) = (yyvsp[0].interm.type);
     }
-#line 5783 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6148 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 154:
-#line 1324 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 154: /* single_type_qualifier: invariant_qualifier  */
+#line 1338 "MachineIndependent/glslang.y"
+                          {
         // allow inheritance of storage qualifier from block declaration
         (yyval.interm.type) = (yyvsp[0].interm.type);
     }
-#line 5792 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6157 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 155:
-#line 1329 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 155: /* single_type_qualifier: precise_qualifier  */
+#line 1343 "MachineIndependent/glslang.y"
+                        {
         // allow inheritance of storage qualifier from block declaration
         (yyval.interm.type) = (yyvsp[0].interm.type);
     }
-#line 5801 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6166 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 156:
-#line 1333 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 156: /* single_type_qualifier: non_uniform_qualifier  */
+#line 1347 "MachineIndependent/glslang.y"
+                            {
         (yyval.interm.type) = (yyvsp[0].interm.type);
     }
-#line 5809 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6174 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 157:
-#line 1340 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 157: /* storage_qualifier: CONST  */
+#line 1354 "MachineIndependent/glslang.y"
+            {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqConst;  // will later turn into EvqConstReadOnly, if the initializer is not constant
     }
-#line 5818 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6183 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 158:
-#line 1344 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 158: /* storage_qualifier: INOUT  */
+#line 1358 "MachineIndependent/glslang.y"
+            {
         parseContext.globalCheck((yyvsp[0].lex).loc, "inout");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqInOut;
     }
-#line 5828 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6193 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 159:
-#line 1349 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 159: /* storage_qualifier: IN  */
+#line 1363 "MachineIndependent/glslang.y"
+         {
         parseContext.globalCheck((yyvsp[0].lex).loc, "in");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         // whether this is a parameter "in" or a pipeline "in" will get sorted out a bit later
         (yyval.interm.type).qualifier.storage = EvqIn;
     }
-#line 5839 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6204 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 160:
-#line 1355 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 160: /* storage_qualifier: OUT  */
+#line 1369 "MachineIndependent/glslang.y"
+          {
         parseContext.globalCheck((yyvsp[0].lex).loc, "out");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         // whether this is a parameter "out" or a pipeline "out" will get sorted out a bit later
         (yyval.interm.type).qualifier.storage = EvqOut;
     }
-#line 5850 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6215 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 161:
-#line 1361 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 161: /* storage_qualifier: CENTROID  */
+#line 1375 "MachineIndependent/glslang.y"
+               {
         parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 120, 0, "centroid");
         parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 300, 0, "centroid");
         parseContext.globalCheck((yyvsp[0].lex).loc, "centroid");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.centroid = true;
     }
-#line 5862 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6227 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 162:
-#line 1368 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 162: /* storage_qualifier: UNIFORM  */
+#line 1382 "MachineIndependent/glslang.y"
+              {
         parseContext.globalCheck((yyvsp[0].lex).loc, "uniform");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqUniform;
     }
-#line 5872 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6237 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 163:
-#line 1373 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 163: /* storage_qualifier: SHARED  */
+#line 1387 "MachineIndependent/glslang.y"
+             {
         parseContext.globalCheck((yyvsp[0].lex).loc, "shared");
         parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, 430, E_GL_ARB_compute_shader, "shared");
         parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 310, 0, "shared");
@@ -5881,22 +6246,22 @@
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqShared;
     }
-#line 5885 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6250 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 164:
-#line 1381 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 164: /* storage_qualifier: BUFFER  */
+#line 1395 "MachineIndependent/glslang.y"
+             {
         parseContext.globalCheck((yyvsp[0].lex).loc, "buffer");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqBuffer;
     }
-#line 5895 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6260 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 165:
-#line 1387 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 165: /* storage_qualifier: ATTRIBUTE  */
+#line 1401 "MachineIndependent/glslang.y"
+                {
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangVertex, "attribute");
         parseContext.checkDeprecated((yyvsp[0].lex).loc, ECoreProfile, 130, "attribute");
         parseContext.checkDeprecated((yyvsp[0].lex).loc, ENoProfile, 130, "attribute");
@@ -5908,12 +6273,12 @@
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqVaryingIn;
     }
-#line 5912 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6277 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 166:
-#line 1399 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 166: /* storage_qualifier: VARYING  */
+#line 1413 "MachineIndependent/glslang.y"
+              {
         parseContext.checkDeprecated((yyvsp[0].lex).loc, ENoProfile, 130, "varying");
         parseContext.checkDeprecated((yyvsp[0].lex).loc, ECoreProfile, 130, "varying");
         parseContext.requireNotRemoved((yyvsp[0].lex).loc, ECoreProfile, 420, "varying");
@@ -5927,33 +6292,33 @@
         else
             (yyval.interm.type).qualifier.storage = EvqVaryingIn;
     }
-#line 5931 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6296 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 167:
-#line 1413 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 167: /* storage_qualifier: PATCH  */
+#line 1427 "MachineIndependent/glslang.y"
+            {
         parseContext.globalCheck((yyvsp[0].lex).loc, "patch");
         parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangTessControlMask | EShLangTessEvaluationMask), "patch");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.patch = true;
     }
-#line 5942 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6307 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 168:
-#line 1419 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 168: /* storage_qualifier: SAMPLE  */
+#line 1433 "MachineIndependent/glslang.y"
+             {
         parseContext.globalCheck((yyvsp[0].lex).loc, "sample");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.sample = true;
     }
-#line 5952 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6317 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 169:
-#line 1424 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 169: /* storage_qualifier: HITATTRNV  */
+#line 1438 "MachineIndependent/glslang.y"
+                {
         parseContext.globalCheck((yyvsp[0].lex).loc, "hitAttributeNV");
         parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangIntersectMask | EShLangClosestHitMask
             | EShLangAnyHitMask), "hitAttributeNV");
@@ -5961,12 +6326,12 @@
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqHitAttr;
     }
-#line 5965 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6330 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 170:
-#line 1432 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 170: /* storage_qualifier: HITATTREXT  */
+#line 1446 "MachineIndependent/glslang.y"
+                 {
         parseContext.globalCheck((yyvsp[0].lex).loc, "hitAttributeEXT");
         parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangIntersectMask | EShLangClosestHitMask
             | EShLangAnyHitMask), "hitAttributeEXT");
@@ -5974,12 +6339,12 @@
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqHitAttr;
     }
-#line 5978 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6343 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 171:
-#line 1440 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 171: /* storage_qualifier: PAYLOADNV  */
+#line 1454 "MachineIndependent/glslang.y"
+                {
         parseContext.globalCheck((yyvsp[0].lex).loc, "rayPayloadNV");
         parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangRayGenMask | EShLangClosestHitMask |
             EShLangAnyHitMask | EShLangMissMask), "rayPayloadNV");
@@ -5987,12 +6352,12 @@
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqPayload;
     }
-#line 5991 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6356 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 172:
-#line 1448 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 172: /* storage_qualifier: PAYLOADEXT  */
+#line 1462 "MachineIndependent/glslang.y"
+                 {
         parseContext.globalCheck((yyvsp[0].lex).loc, "rayPayloadEXT");
         parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangRayGenMask | EShLangClosestHitMask |
             EShLangAnyHitMask | EShLangMissMask), "rayPayloadEXT");
@@ -6000,12 +6365,12 @@
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqPayload;
     }
-#line 6004 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6369 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 173:
-#line 1456 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 173: /* storage_qualifier: PAYLOADINNV  */
+#line 1470 "MachineIndependent/glslang.y"
+                  {
         parseContext.globalCheck((yyvsp[0].lex).loc, "rayPayloadInNV");
         parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangClosestHitMask |
             EShLangAnyHitMask | EShLangMissMask), "rayPayloadInNV");
@@ -6013,12 +6378,12 @@
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqPayloadIn;
     }
-#line 6017 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6382 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 174:
-#line 1464 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 174: /* storage_qualifier: PAYLOADINEXT  */
+#line 1478 "MachineIndependent/glslang.y"
+                   {
         parseContext.globalCheck((yyvsp[0].lex).loc, "rayPayloadInEXT");
         parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangClosestHitMask |
             EShLangAnyHitMask | EShLangMissMask), "rayPayloadInEXT");
@@ -6026,12 +6391,12 @@
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqPayloadIn;
     }
-#line 6030 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6395 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 175:
-#line 1472 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 175: /* storage_qualifier: CALLDATANV  */
+#line 1486 "MachineIndependent/glslang.y"
+                 {
         parseContext.globalCheck((yyvsp[0].lex).loc, "callableDataNV");
         parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangRayGenMask |
             EShLangClosestHitMask | EShLangMissMask | EShLangCallableMask), "callableDataNV");
@@ -6039,12 +6404,12 @@
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqCallableData;
     }
-#line 6043 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6408 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 176:
-#line 1480 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 176: /* storage_qualifier: CALLDATAEXT  */
+#line 1494 "MachineIndependent/glslang.y"
+                  {
         parseContext.globalCheck((yyvsp[0].lex).loc, "callableDataEXT");
         parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangRayGenMask |
             EShLangClosestHitMask | EShLangMissMask | EShLangCallableMask), "callableDataEXT");
@@ -6052,222 +6417,222 @@
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqCallableData;
     }
-#line 6056 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6421 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 177:
-#line 1488 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 177: /* storage_qualifier: CALLDATAINNV  */
+#line 1502 "MachineIndependent/glslang.y"
+                   {
         parseContext.globalCheck((yyvsp[0].lex).loc, "callableDataInNV");
         parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangCallableMask), "callableDataInNV");
         parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile, 460, E_GL_NV_ray_tracing, "callableDataInNV");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqCallableDataIn;
     }
-#line 6068 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6433 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 178:
-#line 1495 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 178: /* storage_qualifier: CALLDATAINEXT  */
+#line 1509 "MachineIndependent/glslang.y"
+                    {
         parseContext.globalCheck((yyvsp[0].lex).loc, "callableDataInEXT");
         parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangCallableMask), "callableDataInEXT");
         parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile, 460, E_GL_EXT_ray_tracing, "callableDataInEXT");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqCallableDataIn;
     }
-#line 6080 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6445 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 179:
-#line 1502 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 179: /* storage_qualifier: COHERENT  */
+#line 1516 "MachineIndependent/glslang.y"
+               {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.coherent = true;
     }
-#line 6089 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6454 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 180:
-#line 1506 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 180: /* storage_qualifier: DEVICECOHERENT  */
+#line 1520 "MachineIndependent/glslang.y"
+                     {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_KHR_memory_scope_semantics, "devicecoherent");
         (yyval.interm.type).qualifier.devicecoherent = true;
     }
-#line 6099 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6464 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 181:
-#line 1511 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 181: /* storage_qualifier: QUEUEFAMILYCOHERENT  */
+#line 1525 "MachineIndependent/glslang.y"
+                          {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_KHR_memory_scope_semantics, "queuefamilycoherent");
         (yyval.interm.type).qualifier.queuefamilycoherent = true;
     }
-#line 6109 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6474 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 182:
-#line 1516 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 182: /* storage_qualifier: WORKGROUPCOHERENT  */
+#line 1530 "MachineIndependent/glslang.y"
+                        {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_KHR_memory_scope_semantics, "workgroupcoherent");
         (yyval.interm.type).qualifier.workgroupcoherent = true;
     }
-#line 6119 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6484 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 183:
-#line 1521 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 183: /* storage_qualifier: SUBGROUPCOHERENT  */
+#line 1535 "MachineIndependent/glslang.y"
+                       {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_KHR_memory_scope_semantics, "subgroupcoherent");
         (yyval.interm.type).qualifier.subgroupcoherent = true;
     }
-#line 6129 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6494 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 184:
-#line 1526 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 184: /* storage_qualifier: NONPRIVATE  */
+#line 1540 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_KHR_memory_scope_semantics, "nonprivate");
         (yyval.interm.type).qualifier.nonprivate = true;
     }
-#line 6139 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6504 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 185:
-#line 1531 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 185: /* storage_qualifier: SHADERCALLCOHERENT  */
+#line 1545 "MachineIndependent/glslang.y"
+                         {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_EXT_ray_tracing, "shadercallcoherent");
         (yyval.interm.type).qualifier.shadercallcoherent = true;
     }
-#line 6149 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6514 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 186:
-#line 1536 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 186: /* storage_qualifier: VOLATILE  */
+#line 1550 "MachineIndependent/glslang.y"
+               {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.volatil = true;
     }
-#line 6158 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6523 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 187:
-#line 1540 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 187: /* storage_qualifier: RESTRICT  */
+#line 1554 "MachineIndependent/glslang.y"
+               {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.restrict = true;
     }
-#line 6167 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6532 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 188:
-#line 1544 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 188: /* storage_qualifier: READONLY  */
+#line 1558 "MachineIndependent/glslang.y"
+               {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.readonly = true;
     }
-#line 6176 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6541 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 189:
-#line 1548 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 189: /* storage_qualifier: WRITEONLY  */
+#line 1562 "MachineIndependent/glslang.y"
+                {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.writeonly = true;
     }
-#line 6185 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6550 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 190:
-#line 1552 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 190: /* storage_qualifier: SUBROUTINE  */
+#line 1566 "MachineIndependent/glslang.y"
+                 {
         parseContext.spvRemoved((yyvsp[0].lex).loc, "subroutine");
         parseContext.globalCheck((yyvsp[0].lex).loc, "subroutine");
         parseContext.unimplemented((yyvsp[0].lex).loc, "subroutine");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
     }
-#line 6196 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6561 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 191:
-#line 1558 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 191: /* storage_qualifier: SUBROUTINE LEFT_PAREN type_name_list RIGHT_PAREN  */
+#line 1572 "MachineIndependent/glslang.y"
+                                                       {
         parseContext.spvRemoved((yyvsp[-3].lex).loc, "subroutine");
         parseContext.globalCheck((yyvsp[-3].lex).loc, "subroutine");
         parseContext.unimplemented((yyvsp[-3].lex).loc, "subroutine");
         (yyval.interm.type).init((yyvsp[-3].lex).loc);
     }
-#line 6207 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6572 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 192:
-#line 1569 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 192: /* non_uniform_qualifier: NONUNIFORM  */
+#line 1583 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.nonUniform = true;
     }
-#line 6216 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6581 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 193:
-#line 1576 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 193: /* type_name_list: IDENTIFIER  */
+#line 1590 "MachineIndependent/glslang.y"
+                 {
         // TODO
     }
-#line 6224 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6589 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 194:
-#line 1579 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 194: /* type_name_list: type_name_list COMMA IDENTIFIER  */
+#line 1593 "MachineIndependent/glslang.y"
+                                      {
         // TODO: 4.0 semantics: subroutines
         // 1) make sure each identifier is a type declared earlier with SUBROUTINE
         // 2) save all of the identifiers for future comparison with the declared function
     }
-#line 6234 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6599 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 195:
-#line 1588 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 195: /* type_specifier: type_specifier_nonarray type_parameter_specifier_opt  */
+#line 1602 "MachineIndependent/glslang.y"
+                                                           {
         (yyval.interm.type) = (yyvsp[-1].interm.type);
         (yyval.interm.type).qualifier.precision = parseContext.getDefaultPrecision((yyval.interm.type));
         (yyval.interm.type).typeParameters = (yyvsp[0].interm.typeParameters);
     }
-#line 6244 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6609 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 196:
-#line 1593 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 196: /* type_specifier: type_specifier_nonarray type_parameter_specifier_opt array_specifier  */
+#line 1607 "MachineIndependent/glslang.y"
+                                                                           {
         parseContext.arrayOfArrayVersionCheck((yyvsp[0].interm).loc, (yyvsp[0].interm).arraySizes);
         (yyval.interm.type) = (yyvsp[-2].interm.type);
         (yyval.interm.type).qualifier.precision = parseContext.getDefaultPrecision((yyval.interm.type));
         (yyval.interm.type).typeParameters = (yyvsp[-1].interm.typeParameters);
         (yyval.interm.type).arraySizes = (yyvsp[0].interm).arraySizes;
     }
-#line 6256 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6621 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 197:
-#line 1603 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 197: /* array_specifier: LEFT_BRACKET RIGHT_BRACKET  */
+#line 1617 "MachineIndependent/glslang.y"
+                                 {
         (yyval.interm).loc = (yyvsp[-1].lex).loc;
         (yyval.interm).arraySizes = new TArraySizes;
         (yyval.interm).arraySizes->addInnerSize();
     }
-#line 6266 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6631 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 198:
-#line 1608 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 198: /* array_specifier: LEFT_BRACKET conditional_expression RIGHT_BRACKET  */
+#line 1622 "MachineIndependent/glslang.y"
+                                                        {
         (yyval.interm).loc = (yyvsp[-2].lex).loc;
         (yyval.interm).arraySizes = new TArraySizes;
 
@@ -6275,492 +6640,492 @@
         parseContext.arraySizeCheck((yyvsp[-1].interm.intermTypedNode)->getLoc(), (yyvsp[-1].interm.intermTypedNode), size, "array size");
         (yyval.interm).arraySizes->addInnerSize(size);
     }
-#line 6279 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6644 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 199:
-#line 1616 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 199: /* array_specifier: array_specifier LEFT_BRACKET RIGHT_BRACKET  */
+#line 1630 "MachineIndependent/glslang.y"
+                                                 {
         (yyval.interm) = (yyvsp[-2].interm);
         (yyval.interm).arraySizes->addInnerSize();
     }
-#line 6288 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6653 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 200:
-#line 1620 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 200: /* array_specifier: array_specifier LEFT_BRACKET conditional_expression RIGHT_BRACKET  */
+#line 1634 "MachineIndependent/glslang.y"
+                                                                        {
         (yyval.interm) = (yyvsp[-3].interm);
 
         TArraySize size;
         parseContext.arraySizeCheck((yyvsp[-1].interm.intermTypedNode)->getLoc(), (yyvsp[-1].interm.intermTypedNode), size, "array size");
         (yyval.interm).arraySizes->addInnerSize(size);
     }
-#line 6300 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6665 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 201:
-#line 1630 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 201: /* type_parameter_specifier_opt: type_parameter_specifier  */
+#line 1644 "MachineIndependent/glslang.y"
+                               {
         (yyval.interm.typeParameters) = (yyvsp[0].interm.typeParameters);
     }
-#line 6308 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6673 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 202:
-#line 1633 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 202: /* type_parameter_specifier_opt: %empty  */
+#line 1647 "MachineIndependent/glslang.y"
+                        {
         (yyval.interm.typeParameters) = 0;
     }
-#line 6316 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6681 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 203:
-#line 1639 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 203: /* type_parameter_specifier: LEFT_ANGLE type_parameter_specifier_list RIGHT_ANGLE  */
+#line 1653 "MachineIndependent/glslang.y"
+                                                           {
         (yyval.interm.typeParameters) = (yyvsp[-1].interm.typeParameters);
     }
-#line 6324 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6689 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 204:
-#line 1645 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 204: /* type_parameter_specifier_list: unary_expression  */
+#line 1659 "MachineIndependent/glslang.y"
+                       {
         (yyval.interm.typeParameters) = new TArraySizes;
 
         TArraySize size;
         parseContext.arraySizeCheck((yyvsp[0].interm.intermTypedNode)->getLoc(), (yyvsp[0].interm.intermTypedNode), size, "type parameter");
         (yyval.interm.typeParameters)->addInnerSize(size);
     }
-#line 6336 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6701 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 205:
-#line 1652 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 205: /* type_parameter_specifier_list: type_parameter_specifier_list COMMA unary_expression  */
+#line 1666 "MachineIndependent/glslang.y"
+                                                           {
         (yyval.interm.typeParameters) = (yyvsp[-2].interm.typeParameters);
 
         TArraySize size;
         parseContext.arraySizeCheck((yyvsp[0].interm.intermTypedNode)->getLoc(), (yyvsp[0].interm.intermTypedNode), size, "type parameter");
         (yyval.interm.typeParameters)->addInnerSize(size);
     }
-#line 6348 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6713 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 206:
-#line 1662 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 206: /* type_specifier_nonarray: VOID  */
+#line 1676 "MachineIndependent/glslang.y"
+           {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtVoid;
     }
-#line 6357 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6722 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 207:
-#line 1666 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 207: /* type_specifier_nonarray: FLOAT  */
+#line 1680 "MachineIndependent/glslang.y"
+            {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
     }
-#line 6366 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6731 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 208:
-#line 1670 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 208: /* type_specifier_nonarray: INT  */
+#line 1684 "MachineIndependent/glslang.y"
+          {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt;
     }
-#line 6375 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6740 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 209:
-#line 1674 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 209: /* type_specifier_nonarray: UINT  */
+#line 1688 "MachineIndependent/glslang.y"
+           {
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned integer");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint;
     }
-#line 6385 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6750 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 210:
-#line 1679 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 210: /* type_specifier_nonarray: BOOL  */
+#line 1693 "MachineIndependent/glslang.y"
+           {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtBool;
     }
-#line 6394 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6759 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 211:
-#line 1683 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 211: /* type_specifier_nonarray: VEC2  */
+#line 1697 "MachineIndependent/glslang.y"
+           {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setVector(2);
     }
-#line 6404 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6769 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 212:
-#line 1688 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 212: /* type_specifier_nonarray: VEC3  */
+#line 1702 "MachineIndependent/glslang.y"
+           {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setVector(3);
     }
-#line 6414 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6779 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 213:
-#line 1693 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 213: /* type_specifier_nonarray: VEC4  */
+#line 1707 "MachineIndependent/glslang.y"
+           {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setVector(4);
     }
-#line 6424 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6789 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 214:
-#line 1698 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 214: /* type_specifier_nonarray: BVEC2  */
+#line 1712 "MachineIndependent/glslang.y"
+            {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtBool;
         (yyval.interm.type).setVector(2);
     }
-#line 6434 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6799 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 215:
-#line 1703 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 215: /* type_specifier_nonarray: BVEC3  */
+#line 1717 "MachineIndependent/glslang.y"
+            {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtBool;
         (yyval.interm.type).setVector(3);
     }
-#line 6444 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6809 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 216:
-#line 1708 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 216: /* type_specifier_nonarray: BVEC4  */
+#line 1722 "MachineIndependent/glslang.y"
+            {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtBool;
         (yyval.interm.type).setVector(4);
     }
-#line 6454 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6819 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 217:
-#line 1713 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 217: /* type_specifier_nonarray: IVEC2  */
+#line 1727 "MachineIndependent/glslang.y"
+            {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt;
         (yyval.interm.type).setVector(2);
     }
-#line 6464 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6829 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 218:
-#line 1718 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 218: /* type_specifier_nonarray: IVEC3  */
+#line 1732 "MachineIndependent/glslang.y"
+            {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt;
         (yyval.interm.type).setVector(3);
     }
-#line 6474 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6839 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 219:
-#line 1723 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 219: /* type_specifier_nonarray: IVEC4  */
+#line 1737 "MachineIndependent/glslang.y"
+            {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt;
         (yyval.interm.type).setVector(4);
     }
-#line 6484 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6849 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 220:
-#line 1728 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 220: /* type_specifier_nonarray: UVEC2  */
+#line 1742 "MachineIndependent/glslang.y"
+            {
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned integer vector");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint;
         (yyval.interm.type).setVector(2);
     }
-#line 6495 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6860 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 221:
-#line 1734 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 221: /* type_specifier_nonarray: UVEC3  */
+#line 1748 "MachineIndependent/glslang.y"
+            {
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned integer vector");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint;
         (yyval.interm.type).setVector(3);
     }
-#line 6506 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6871 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 222:
-#line 1740 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 222: /* type_specifier_nonarray: UVEC4  */
+#line 1754 "MachineIndependent/glslang.y"
+            {
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned integer vector");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint;
         (yyval.interm.type).setVector(4);
     }
-#line 6517 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6882 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 223:
-#line 1746 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 223: /* type_specifier_nonarray: MAT2  */
+#line 1760 "MachineIndependent/glslang.y"
+           {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(2, 2);
     }
-#line 6527 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6892 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 224:
-#line 1751 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 224: /* type_specifier_nonarray: MAT3  */
+#line 1765 "MachineIndependent/glslang.y"
+           {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(3, 3);
     }
-#line 6537 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6902 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 225:
-#line 1756 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 225: /* type_specifier_nonarray: MAT4  */
+#line 1770 "MachineIndependent/glslang.y"
+           {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(4, 4);
     }
-#line 6547 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6912 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 226:
-#line 1761 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 226: /* type_specifier_nonarray: MAT2X2  */
+#line 1775 "MachineIndependent/glslang.y"
+             {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(2, 2);
     }
-#line 6557 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6922 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 227:
-#line 1766 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 227: /* type_specifier_nonarray: MAT2X3  */
+#line 1780 "MachineIndependent/glslang.y"
+             {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(2, 3);
     }
-#line 6567 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6932 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 228:
-#line 1771 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 228: /* type_specifier_nonarray: MAT2X4  */
+#line 1785 "MachineIndependent/glslang.y"
+             {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(2, 4);
     }
-#line 6577 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6942 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 229:
-#line 1776 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 229: /* type_specifier_nonarray: MAT3X2  */
+#line 1790 "MachineIndependent/glslang.y"
+             {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(3, 2);
     }
-#line 6587 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6952 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 230:
-#line 1781 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 230: /* type_specifier_nonarray: MAT3X3  */
+#line 1795 "MachineIndependent/glslang.y"
+             {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(3, 3);
     }
-#line 6597 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6962 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 231:
-#line 1786 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 231: /* type_specifier_nonarray: MAT3X4  */
+#line 1800 "MachineIndependent/glslang.y"
+             {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(3, 4);
     }
-#line 6607 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6972 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 232:
-#line 1791 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 232: /* type_specifier_nonarray: MAT4X2  */
+#line 1805 "MachineIndependent/glslang.y"
+             {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(4, 2);
     }
-#line 6617 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6982 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 233:
-#line 1796 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 233: /* type_specifier_nonarray: MAT4X3  */
+#line 1810 "MachineIndependent/glslang.y"
+             {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(4, 3);
     }
-#line 6627 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6992 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 234:
-#line 1801 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 234: /* type_specifier_nonarray: MAT4X4  */
+#line 1815 "MachineIndependent/glslang.y"
+             {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(4, 4);
     }
-#line 6637 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7002 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 235:
-#line 1807 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 235: /* type_specifier_nonarray: DOUBLE  */
+#line 1821 "MachineIndependent/glslang.y"
+             {
         parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double");
         if (! parseContext.symbolTable.atBuiltInLevel())
             parseContext.doubleCheck((yyvsp[0].lex).loc, "double");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
     }
-#line 6649 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7014 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 236:
-#line 1814 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 236: /* type_specifier_nonarray: FLOAT16_T  */
+#line 1828 "MachineIndependent/glslang.y"
+                {
         parseContext.float16ScalarVectorCheck((yyvsp[0].lex).loc, "float16_t", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
     }
-#line 6659 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7024 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 237:
-#line 1819 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 237: /* type_specifier_nonarray: FLOAT32_T  */
+#line 1833 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
     }
-#line 6669 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7034 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 238:
-#line 1824 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 238: /* type_specifier_nonarray: FLOAT64_T  */
+#line 1838 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
     }
-#line 6679 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7044 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 239:
-#line 1829 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 239: /* type_specifier_nonarray: INT8_T  */
+#line 1843 "MachineIndependent/glslang.y"
+             {
         parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit signed integer", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt8;
     }
-#line 6689 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7054 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 240:
-#line 1834 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 240: /* type_specifier_nonarray: UINT8_T  */
+#line 1848 "MachineIndependent/glslang.y"
+              {
         parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint8;
     }
-#line 6699 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7064 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 241:
-#line 1839 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 241: /* type_specifier_nonarray: INT16_T  */
+#line 1853 "MachineIndependent/glslang.y"
+              {
         parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit signed integer", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt16;
     }
-#line 6709 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7074 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 242:
-#line 1844 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 242: /* type_specifier_nonarray: UINT16_T  */
+#line 1858 "MachineIndependent/glslang.y"
+               {
         parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint16;
     }
-#line 6719 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7084 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 243:
-#line 1849 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 243: /* type_specifier_nonarray: INT32_T  */
+#line 1863 "MachineIndependent/glslang.y"
+              {
         parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed integer", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt;
     }
-#line 6729 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7094 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 244:
-#line 1854 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 244: /* type_specifier_nonarray: UINT32_T  */
+#line 1868 "MachineIndependent/glslang.y"
+               {
         parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint;
     }
-#line 6739 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7104 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 245:
-#line 1859 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 245: /* type_specifier_nonarray: INT64_T  */
+#line 1873 "MachineIndependent/glslang.y"
+              {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt64;
     }
-#line 6749 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7114 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 246:
-#line 1864 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 246: /* type_specifier_nonarray: UINT64_T  */
+#line 1878 "MachineIndependent/glslang.y"
+               {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint64;
     }
-#line 6759 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7124 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 247:
-#line 1869 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 247: /* type_specifier_nonarray: DVEC2  */
+#line 1883 "MachineIndependent/glslang.y"
+            {
         parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double vector");
         if (! parseContext.symbolTable.atBuiltInLevel())
             parseContext.doubleCheck((yyvsp[0].lex).loc, "double vector");
@@ -6768,12 +7133,12 @@
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setVector(2);
     }
-#line 6772 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7137 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 248:
-#line 1877 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 248: /* type_specifier_nonarray: DVEC3  */
+#line 1891 "MachineIndependent/glslang.y"
+            {
         parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double vector");
         if (! parseContext.symbolTable.atBuiltInLevel())
             parseContext.doubleCheck((yyvsp[0].lex).loc, "double vector");
@@ -6781,12 +7146,12 @@
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setVector(3);
     }
-#line 6785 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7150 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 249:
-#line 1885 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 249: /* type_specifier_nonarray: DVEC4  */
+#line 1899 "MachineIndependent/glslang.y"
+            {
         parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double vector");
         if (! parseContext.symbolTable.atBuiltInLevel())
             parseContext.doubleCheck((yyvsp[0].lex).loc, "double vector");
@@ -6794,375 +7159,375 @@
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setVector(4);
     }
-#line 6798 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7163 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 250:
-#line 1893 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 250: /* type_specifier_nonarray: F16VEC2  */
+#line 1907 "MachineIndependent/glslang.y"
+              {
         parseContext.float16ScalarVectorCheck((yyvsp[0].lex).loc, "half float vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setVector(2);
     }
-#line 6809 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7174 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 251:
-#line 1899 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 251: /* type_specifier_nonarray: F16VEC3  */
+#line 1913 "MachineIndependent/glslang.y"
+              {
         parseContext.float16ScalarVectorCheck((yyvsp[0].lex).loc, "half float vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setVector(3);
     }
-#line 6820 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7185 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 252:
-#line 1905 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 252: /* type_specifier_nonarray: F16VEC4  */
+#line 1919 "MachineIndependent/glslang.y"
+              {
         parseContext.float16ScalarVectorCheck((yyvsp[0].lex).loc, "half float vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setVector(4);
     }
-#line 6831 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7196 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 253:
-#line 1911 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 253: /* type_specifier_nonarray: F32VEC2  */
+#line 1925 "MachineIndependent/glslang.y"
+              {
         parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setVector(2);
     }
-#line 6842 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7207 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 254:
-#line 1917 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 254: /* type_specifier_nonarray: F32VEC3  */
+#line 1931 "MachineIndependent/glslang.y"
+              {
         parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setVector(3);
     }
-#line 6853 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7218 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 255:
-#line 1923 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 255: /* type_specifier_nonarray: F32VEC4  */
+#line 1937 "MachineIndependent/glslang.y"
+              {
         parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setVector(4);
     }
-#line 6864 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7229 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 256:
-#line 1929 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 256: /* type_specifier_nonarray: F64VEC2  */
+#line 1943 "MachineIndependent/glslang.y"
+              {
         parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setVector(2);
     }
-#line 6875 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7240 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 257:
-#line 1935 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 257: /* type_specifier_nonarray: F64VEC3  */
+#line 1949 "MachineIndependent/glslang.y"
+              {
         parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setVector(3);
     }
-#line 6886 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7251 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 258:
-#line 1941 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 258: /* type_specifier_nonarray: F64VEC4  */
+#line 1955 "MachineIndependent/glslang.y"
+              {
         parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setVector(4);
     }
-#line 6897 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7262 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 259:
-#line 1947 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 259: /* type_specifier_nonarray: I8VEC2  */
+#line 1961 "MachineIndependent/glslang.y"
+             {
         parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt8;
         (yyval.interm.type).setVector(2);
     }
-#line 6908 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7273 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 260:
-#line 1953 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 260: /* type_specifier_nonarray: I8VEC3  */
+#line 1967 "MachineIndependent/glslang.y"
+             {
         parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt8;
         (yyval.interm.type).setVector(3);
     }
-#line 6919 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7284 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 261:
-#line 1959 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 261: /* type_specifier_nonarray: I8VEC4  */
+#line 1973 "MachineIndependent/glslang.y"
+             {
         parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt8;
         (yyval.interm.type).setVector(4);
     }
-#line 6930 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7295 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 262:
-#line 1965 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 262: /* type_specifier_nonarray: I16VEC2  */
+#line 1979 "MachineIndependent/glslang.y"
+              {
         parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt16;
         (yyval.interm.type).setVector(2);
     }
-#line 6941 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7306 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 263:
-#line 1971 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 263: /* type_specifier_nonarray: I16VEC3  */
+#line 1985 "MachineIndependent/glslang.y"
+              {
         parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt16;
         (yyval.interm.type).setVector(3);
     }
-#line 6952 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7317 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 264:
-#line 1977 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 264: /* type_specifier_nonarray: I16VEC4  */
+#line 1991 "MachineIndependent/glslang.y"
+              {
         parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt16;
         (yyval.interm.type).setVector(4);
     }
-#line 6963 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7328 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 265:
-#line 1983 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 265: /* type_specifier_nonarray: I32VEC2  */
+#line 1997 "MachineIndependent/glslang.y"
+              {
         parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt;
         (yyval.interm.type).setVector(2);
     }
-#line 6974 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7339 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 266:
-#line 1989 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 266: /* type_specifier_nonarray: I32VEC3  */
+#line 2003 "MachineIndependent/glslang.y"
+              {
         parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt;
         (yyval.interm.type).setVector(3);
     }
-#line 6985 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7350 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 267:
-#line 1995 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 267: /* type_specifier_nonarray: I32VEC4  */
+#line 2009 "MachineIndependent/glslang.y"
+              {
         parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt;
         (yyval.interm.type).setVector(4);
     }
-#line 6996 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7361 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 268:
-#line 2001 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 268: /* type_specifier_nonarray: I64VEC2  */
+#line 2015 "MachineIndependent/glslang.y"
+              {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt64;
         (yyval.interm.type).setVector(2);
     }
-#line 7007 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7372 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 269:
-#line 2007 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 269: /* type_specifier_nonarray: I64VEC3  */
+#line 2021 "MachineIndependent/glslang.y"
+              {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt64;
         (yyval.interm.type).setVector(3);
     }
-#line 7018 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7383 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 270:
-#line 2013 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 270: /* type_specifier_nonarray: I64VEC4  */
+#line 2027 "MachineIndependent/glslang.y"
+              {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt64;
         (yyval.interm.type).setVector(4);
     }
-#line 7029 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7394 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 271:
-#line 2019 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 271: /* type_specifier_nonarray: U8VEC2  */
+#line 2033 "MachineIndependent/glslang.y"
+             {
         parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint8;
         (yyval.interm.type).setVector(2);
     }
-#line 7040 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7405 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 272:
-#line 2025 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 272: /* type_specifier_nonarray: U8VEC3  */
+#line 2039 "MachineIndependent/glslang.y"
+             {
         parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint8;
         (yyval.interm.type).setVector(3);
     }
-#line 7051 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7416 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 273:
-#line 2031 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 273: /* type_specifier_nonarray: U8VEC4  */
+#line 2045 "MachineIndependent/glslang.y"
+             {
         parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint8;
         (yyval.interm.type).setVector(4);
     }
-#line 7062 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7427 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 274:
-#line 2037 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 274: /* type_specifier_nonarray: U16VEC2  */
+#line 2051 "MachineIndependent/glslang.y"
+              {
         parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint16;
         (yyval.interm.type).setVector(2);
     }
-#line 7073 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7438 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 275:
-#line 2043 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 275: /* type_specifier_nonarray: U16VEC3  */
+#line 2057 "MachineIndependent/glslang.y"
+              {
         parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint16;
         (yyval.interm.type).setVector(3);
     }
-#line 7084 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7449 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 276:
-#line 2049 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 276: /* type_specifier_nonarray: U16VEC4  */
+#line 2063 "MachineIndependent/glslang.y"
+              {
         parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint16;
         (yyval.interm.type).setVector(4);
     }
-#line 7095 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7460 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 277:
-#line 2055 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 277: /* type_specifier_nonarray: U32VEC2  */
+#line 2069 "MachineIndependent/glslang.y"
+              {
         parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint;
         (yyval.interm.type).setVector(2);
     }
-#line 7106 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7471 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 278:
-#line 2061 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 278: /* type_specifier_nonarray: U32VEC3  */
+#line 2075 "MachineIndependent/glslang.y"
+              {
         parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint;
         (yyval.interm.type).setVector(3);
     }
-#line 7117 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7482 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 279:
-#line 2067 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 279: /* type_specifier_nonarray: U32VEC4  */
+#line 2081 "MachineIndependent/glslang.y"
+              {
         parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint;
         (yyval.interm.type).setVector(4);
     }
-#line 7128 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7493 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 280:
-#line 2073 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 280: /* type_specifier_nonarray: U64VEC2  */
+#line 2087 "MachineIndependent/glslang.y"
+              {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint64;
         (yyval.interm.type).setVector(2);
     }
-#line 7139 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7504 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 281:
-#line 2079 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 281: /* type_specifier_nonarray: U64VEC3  */
+#line 2093 "MachineIndependent/glslang.y"
+              {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint64;
         (yyval.interm.type).setVector(3);
     }
-#line 7150 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7515 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 282:
-#line 2085 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 282: /* type_specifier_nonarray: U64VEC4  */
+#line 2099 "MachineIndependent/glslang.y"
+              {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint64;
         (yyval.interm.type).setVector(4);
     }
-#line 7161 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7526 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 283:
-#line 2091 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 283: /* type_specifier_nonarray: DMAT2  */
+#line 2105 "MachineIndependent/glslang.y"
+            {
         parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix");
         if (! parseContext.symbolTable.atBuiltInLevel())
             parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
@@ -7170,12 +7535,12 @@
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(2, 2);
     }
-#line 7174 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7539 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 284:
-#line 2099 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 284: /* type_specifier_nonarray: DMAT3  */
+#line 2113 "MachineIndependent/glslang.y"
+            {
         parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix");
         if (! parseContext.symbolTable.atBuiltInLevel())
             parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
@@ -7183,12 +7548,12 @@
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(3, 3);
     }
-#line 7187 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7552 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 285:
-#line 2107 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 285: /* type_specifier_nonarray: DMAT4  */
+#line 2121 "MachineIndependent/glslang.y"
+            {
         parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix");
         if (! parseContext.symbolTable.atBuiltInLevel())
             parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
@@ -7196,12 +7561,12 @@
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(4, 4);
     }
-#line 7200 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7565 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 286:
-#line 2115 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 286: /* type_specifier_nonarray: DMAT2X2  */
+#line 2129 "MachineIndependent/glslang.y"
+              {
         parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix");
         if (! parseContext.symbolTable.atBuiltInLevel())
             parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
@@ -7209,12 +7574,12 @@
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(2, 2);
     }
-#line 7213 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7578 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 287:
-#line 2123 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 287: /* type_specifier_nonarray: DMAT2X3  */
+#line 2137 "MachineIndependent/glslang.y"
+              {
         parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix");
         if (! parseContext.symbolTable.atBuiltInLevel())
             parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
@@ -7222,12 +7587,12 @@
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(2, 3);
     }
-#line 7226 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7591 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 288:
-#line 2131 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 288: /* type_specifier_nonarray: DMAT2X4  */
+#line 2145 "MachineIndependent/glslang.y"
+              {
         parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix");
         if (! parseContext.symbolTable.atBuiltInLevel())
             parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
@@ -7235,12 +7600,12 @@
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(2, 4);
     }
-#line 7239 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7604 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 289:
-#line 2139 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 289: /* type_specifier_nonarray: DMAT3X2  */
+#line 2153 "MachineIndependent/glslang.y"
+              {
         parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix");
         if (! parseContext.symbolTable.atBuiltInLevel())
             parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
@@ -7248,12 +7613,12 @@
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(3, 2);
     }
-#line 7252 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7617 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 290:
-#line 2147 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 290: /* type_specifier_nonarray: DMAT3X3  */
+#line 2161 "MachineIndependent/glslang.y"
+              {
         parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix");
         if (! parseContext.symbolTable.atBuiltInLevel())
             parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
@@ -7261,12 +7626,12 @@
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(3, 3);
     }
-#line 7265 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7630 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 291:
-#line 2155 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 291: /* type_specifier_nonarray: DMAT3X4  */
+#line 2169 "MachineIndependent/glslang.y"
+              {
         parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix");
         if (! parseContext.symbolTable.atBuiltInLevel())
             parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
@@ -7274,12 +7639,12 @@
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(3, 4);
     }
-#line 7278 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7643 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 292:
-#line 2163 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 292: /* type_specifier_nonarray: DMAT4X2  */
+#line 2177 "MachineIndependent/glslang.y"
+              {
         parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix");
         if (! parseContext.symbolTable.atBuiltInLevel())
             parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
@@ -7287,12 +7652,12 @@
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(4, 2);
     }
-#line 7291 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7656 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 293:
-#line 2171 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 293: /* type_specifier_nonarray: DMAT4X3  */
+#line 2185 "MachineIndependent/glslang.y"
+              {
         parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix");
         if (! parseContext.symbolTable.atBuiltInLevel())
             parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
@@ -7300,12 +7665,12 @@
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(4, 3);
     }
-#line 7304 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7669 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 294:
-#line 2179 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 294: /* type_specifier_nonarray: DMAT4X4  */
+#line 2193 "MachineIndependent/glslang.y"
+              {
         parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix");
         if (! parseContext.symbolTable.atBuiltInLevel())
             parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
@@ -7313,2120 +7678,2340 @@
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(4, 4);
     }
-#line 7317 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7682 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 295:
-#line 2187 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 295: /* type_specifier_nonarray: F16MAT2  */
+#line 2201 "MachineIndependent/glslang.y"
+              {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(2, 2);
     }
-#line 7328 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7693 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 296:
-#line 2193 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 296: /* type_specifier_nonarray: F16MAT3  */
+#line 2207 "MachineIndependent/glslang.y"
+              {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(3, 3);
     }
-#line 7339 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7704 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 297:
-#line 2199 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 297: /* type_specifier_nonarray: F16MAT4  */
+#line 2213 "MachineIndependent/glslang.y"
+              {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(4, 4);
     }
-#line 7350 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7715 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 298:
-#line 2205 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 298: /* type_specifier_nonarray: F16MAT2X2  */
+#line 2219 "MachineIndependent/glslang.y"
+                {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(2, 2);
     }
-#line 7361 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7726 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 299:
-#line 2211 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 299: /* type_specifier_nonarray: F16MAT2X3  */
+#line 2225 "MachineIndependent/glslang.y"
+                {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(2, 3);
     }
-#line 7372 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7737 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 300:
-#line 2217 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 300: /* type_specifier_nonarray: F16MAT2X4  */
+#line 2231 "MachineIndependent/glslang.y"
+                {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(2, 4);
     }
-#line 7383 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7748 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 301:
-#line 2223 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 301: /* type_specifier_nonarray: F16MAT3X2  */
+#line 2237 "MachineIndependent/glslang.y"
+                {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(3, 2);
     }
-#line 7394 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7759 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 302:
-#line 2229 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 302: /* type_specifier_nonarray: F16MAT3X3  */
+#line 2243 "MachineIndependent/glslang.y"
+                {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(3, 3);
     }
-#line 7405 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7770 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 303:
-#line 2235 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 303: /* type_specifier_nonarray: F16MAT3X4  */
+#line 2249 "MachineIndependent/glslang.y"
+                {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(3, 4);
     }
-#line 7416 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7781 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 304:
-#line 2241 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 304: /* type_specifier_nonarray: F16MAT4X2  */
+#line 2255 "MachineIndependent/glslang.y"
+                {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(4, 2);
     }
-#line 7427 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7792 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 305:
-#line 2247 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 305: /* type_specifier_nonarray: F16MAT4X3  */
+#line 2261 "MachineIndependent/glslang.y"
+                {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(4, 3);
     }
-#line 7438 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7803 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 306:
-#line 2253 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 306: /* type_specifier_nonarray: F16MAT4X4  */
+#line 2267 "MachineIndependent/glslang.y"
+                {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(4, 4);
     }
-#line 7449 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7814 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 307:
-#line 2259 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 307: /* type_specifier_nonarray: F32MAT2  */
+#line 2273 "MachineIndependent/glslang.y"
+              {
         parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(2, 2);
     }
-#line 7460 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7825 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 308:
-#line 2265 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 308: /* type_specifier_nonarray: F32MAT3  */
+#line 2279 "MachineIndependent/glslang.y"
+              {
         parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(3, 3);
     }
-#line 7471 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7836 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 309:
-#line 2271 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 309: /* type_specifier_nonarray: F32MAT4  */
+#line 2285 "MachineIndependent/glslang.y"
+              {
         parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(4, 4);
     }
-#line 7482 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7847 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 310:
-#line 2277 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 310: /* type_specifier_nonarray: F32MAT2X2  */
+#line 2291 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(2, 2);
     }
-#line 7493 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7858 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 311:
-#line 2283 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 311: /* type_specifier_nonarray: F32MAT2X3  */
+#line 2297 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(2, 3);
     }
-#line 7504 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7869 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 312:
-#line 2289 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 312: /* type_specifier_nonarray: F32MAT2X4  */
+#line 2303 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(2, 4);
     }
-#line 7515 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7880 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 313:
-#line 2295 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 313: /* type_specifier_nonarray: F32MAT3X2  */
+#line 2309 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(3, 2);
     }
-#line 7526 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7891 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 314:
-#line 2301 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 314: /* type_specifier_nonarray: F32MAT3X3  */
+#line 2315 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(3, 3);
     }
-#line 7537 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7902 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 315:
-#line 2307 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 315: /* type_specifier_nonarray: F32MAT3X4  */
+#line 2321 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(3, 4);
     }
-#line 7548 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7913 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 316:
-#line 2313 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 316: /* type_specifier_nonarray: F32MAT4X2  */
+#line 2327 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(4, 2);
     }
-#line 7559 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7924 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 317:
-#line 2319 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 317: /* type_specifier_nonarray: F32MAT4X3  */
+#line 2333 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(4, 3);
     }
-#line 7570 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7935 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 318:
-#line 2325 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 318: /* type_specifier_nonarray: F32MAT4X4  */
+#line 2339 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(4, 4);
     }
-#line 7581 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7946 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 319:
-#line 2331 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 319: /* type_specifier_nonarray: F64MAT2  */
+#line 2345 "MachineIndependent/glslang.y"
+              {
         parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(2, 2);
     }
-#line 7592 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7957 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 320:
-#line 2337 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 320: /* type_specifier_nonarray: F64MAT3  */
+#line 2351 "MachineIndependent/glslang.y"
+              {
         parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(3, 3);
     }
-#line 7603 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7968 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 321:
-#line 2343 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 321: /* type_specifier_nonarray: F64MAT4  */
+#line 2357 "MachineIndependent/glslang.y"
+              {
         parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(4, 4);
     }
-#line 7614 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7979 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 322:
-#line 2349 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 322: /* type_specifier_nonarray: F64MAT2X2  */
+#line 2363 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(2, 2);
     }
-#line 7625 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7990 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 323:
-#line 2355 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 323: /* type_specifier_nonarray: F64MAT2X3  */
+#line 2369 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(2, 3);
     }
-#line 7636 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8001 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 324:
-#line 2361 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 324: /* type_specifier_nonarray: F64MAT2X4  */
+#line 2375 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(2, 4);
     }
-#line 7647 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8012 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 325:
-#line 2367 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 325: /* type_specifier_nonarray: F64MAT3X2  */
+#line 2381 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(3, 2);
     }
-#line 7658 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8023 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 326:
-#line 2373 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 326: /* type_specifier_nonarray: F64MAT3X3  */
+#line 2387 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(3, 3);
     }
-#line 7669 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8034 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 327:
-#line 2379 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 327: /* type_specifier_nonarray: F64MAT3X4  */
+#line 2393 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(3, 4);
     }
-#line 7680 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8045 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 328:
-#line 2385 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 328: /* type_specifier_nonarray: F64MAT4X2  */
+#line 2399 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(4, 2);
     }
-#line 7691 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8056 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 329:
-#line 2391 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 329: /* type_specifier_nonarray: F64MAT4X3  */
+#line 2405 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(4, 3);
     }
-#line 7702 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8067 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 330:
-#line 2397 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 330: /* type_specifier_nonarray: F64MAT4X4  */
+#line 2411 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(4, 4);
     }
-#line 7713 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8078 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 331:
-#line 2403 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 331: /* type_specifier_nonarray: ACCSTRUCTNV  */
+#line 2417 "MachineIndependent/glslang.y"
+                  {
        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
        (yyval.interm.type).basicType = EbtAccStruct;
     }
-#line 7722 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8087 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 332:
-#line 2407 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 332: /* type_specifier_nonarray: ACCSTRUCTEXT  */
+#line 2421 "MachineIndependent/glslang.y"
+                   {
        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
        (yyval.interm.type).basicType = EbtAccStruct;
     }
-#line 7731 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8096 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 333:
-#line 2411 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 333: /* type_specifier_nonarray: RAYQUERYEXT  */
+#line 2425 "MachineIndependent/glslang.y"
+                  {
        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
        (yyval.interm.type).basicType = EbtRayQuery;
     }
-#line 7740 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8105 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 334:
-#line 2415 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 334: /* type_specifier_nonarray: ATOMIC_UINT  */
+#line 2429 "MachineIndependent/glslang.y"
+                  {
         parseContext.vulkanRemoved((yyvsp[0].lex).loc, "atomic counter types");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtAtomicUint;
     }
-#line 7750 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8115 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 335:
-#line 2420 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 335: /* type_specifier_nonarray: SAMPLER1D  */
+#line 2434 "MachineIndependent/glslang.y"
+                {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd1D);
     }
-#line 7760 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8125 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 336:
-#line 2426 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 336: /* type_specifier_nonarray: SAMPLER2D  */
+#line 2440 "MachineIndependent/glslang.y"
+                {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd2D);
     }
-#line 7770 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8135 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 337:
-#line 2431 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 337: /* type_specifier_nonarray: SAMPLER3D  */
+#line 2445 "MachineIndependent/glslang.y"
+                {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd3D);
     }
-#line 7780 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8145 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 338:
-#line 2436 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 338: /* type_specifier_nonarray: SAMPLERCUBE  */
+#line 2450 "MachineIndependent/glslang.y"
+                  {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, EsdCube);
     }
-#line 7790 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8155 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 339:
-#line 2441 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 339: /* type_specifier_nonarray: SAMPLER2DSHADOW  */
+#line 2455 "MachineIndependent/glslang.y"
+                      {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd2D, false, true);
     }
-#line 7800 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8165 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 340:
-#line 2446 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 340: /* type_specifier_nonarray: SAMPLERCUBESHADOW  */
+#line 2460 "MachineIndependent/glslang.y"
+                        {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, EsdCube, false, true);
     }
-#line 7810 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8175 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 341:
-#line 2451 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 341: /* type_specifier_nonarray: SAMPLER2DARRAY  */
+#line 2465 "MachineIndependent/glslang.y"
+                     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd2D, true);
     }
-#line 7820 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8185 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 342:
-#line 2456 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 342: /* type_specifier_nonarray: SAMPLER2DARRAYSHADOW  */
+#line 2470 "MachineIndependent/glslang.y"
+                           {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd2D, true, true);
     }
-#line 7830 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8195 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 343:
-#line 2462 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 343: /* type_specifier_nonarray: SAMPLER1DSHADOW  */
+#line 2476 "MachineIndependent/glslang.y"
+                      {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd1D, false, true);
     }
-#line 7840 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8205 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 344:
-#line 2467 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 344: /* type_specifier_nonarray: SAMPLER1DARRAY  */
+#line 2481 "MachineIndependent/glslang.y"
+                     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd1D, true);
     }
-#line 7850 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8215 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 345:
-#line 2472 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 345: /* type_specifier_nonarray: SAMPLER1DARRAYSHADOW  */
+#line 2486 "MachineIndependent/glslang.y"
+                           {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd1D, true, true);
     }
-#line 7860 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8225 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 346:
-#line 2477 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 346: /* type_specifier_nonarray: SAMPLERCUBEARRAY  */
+#line 2491 "MachineIndependent/glslang.y"
+                       {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, EsdCube, true);
     }
-#line 7870 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8235 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 347:
-#line 2482 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 347: /* type_specifier_nonarray: SAMPLERCUBEARRAYSHADOW  */
+#line 2496 "MachineIndependent/glslang.y"
+                             {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, EsdCube, true, true);
     }
-#line 7880 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8245 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 348:
-#line 2487 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 348: /* type_specifier_nonarray: F16SAMPLER1D  */
+#line 2501 "MachineIndependent/glslang.y"
+                   {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat16, Esd1D);
     }
-#line 7891 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8256 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 349:
-#line 2493 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 349: /* type_specifier_nonarray: F16SAMPLER2D  */
+#line 2507 "MachineIndependent/glslang.y"
+                   {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat16, Esd2D);
     }
-#line 7902 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8267 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 350:
-#line 2499 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 350: /* type_specifier_nonarray: F16SAMPLER3D  */
+#line 2513 "MachineIndependent/glslang.y"
+                   {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat16, Esd3D);
     }
-#line 7913 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8278 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 351:
-#line 2505 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 351: /* type_specifier_nonarray: F16SAMPLERCUBE  */
+#line 2519 "MachineIndependent/glslang.y"
+                     {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat16, EsdCube);
     }
-#line 7924 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8289 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 352:
-#line 2511 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 352: /* type_specifier_nonarray: F16SAMPLER1DSHADOW  */
+#line 2525 "MachineIndependent/glslang.y"
+                         {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat16, Esd1D, false, true);
     }
-#line 7935 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8300 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 353:
-#line 2517 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 353: /* type_specifier_nonarray: F16SAMPLER2DSHADOW  */
+#line 2531 "MachineIndependent/glslang.y"
+                         {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, false, true);
     }
-#line 7946 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8311 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 354:
-#line 2523 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 354: /* type_specifier_nonarray: F16SAMPLERCUBESHADOW  */
+#line 2537 "MachineIndependent/glslang.y"
+                           {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat16, EsdCube, false, true);
     }
-#line 7957 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8322 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 355:
-#line 2529 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 355: /* type_specifier_nonarray: F16SAMPLER1DARRAY  */
+#line 2543 "MachineIndependent/glslang.y"
+                        {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat16, Esd1D, true);
     }
-#line 7968 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8333 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 356:
-#line 2535 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 356: /* type_specifier_nonarray: F16SAMPLER2DARRAY  */
+#line 2549 "MachineIndependent/glslang.y"
+                        {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, true);
     }
-#line 7979 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8344 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 357:
-#line 2541 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 357: /* type_specifier_nonarray: F16SAMPLER1DARRAYSHADOW  */
+#line 2555 "MachineIndependent/glslang.y"
+                              {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat16, Esd1D, true, true);
     }
-#line 7990 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8355 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 358:
-#line 2547 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 358: /* type_specifier_nonarray: F16SAMPLER2DARRAYSHADOW  */
+#line 2561 "MachineIndependent/glslang.y"
+                              {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, true, true);
     }
-#line 8001 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8366 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 359:
-#line 2553 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 359: /* type_specifier_nonarray: F16SAMPLERCUBEARRAY  */
+#line 2567 "MachineIndependent/glslang.y"
+                          {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat16, EsdCube, true);
     }
-#line 8012 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8377 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 360:
-#line 2559 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 360: /* type_specifier_nonarray: F16SAMPLERCUBEARRAYSHADOW  */
+#line 2573 "MachineIndependent/glslang.y"
+                                {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat16, EsdCube, true, true);
     }
-#line 8023 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8388 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 361:
-#line 2565 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 361: /* type_specifier_nonarray: ISAMPLER1D  */
+#line 2579 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, Esd1D);
     }
-#line 8033 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8398 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 362:
-#line 2571 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 362: /* type_specifier_nonarray: ISAMPLER2D  */
+#line 2585 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, Esd2D);
     }
-#line 8043 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8408 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 363:
-#line 2576 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 363: /* type_specifier_nonarray: ISAMPLER3D  */
+#line 2590 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, Esd3D);
     }
-#line 8053 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8418 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 364:
-#line 2581 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 364: /* type_specifier_nonarray: ISAMPLERCUBE  */
+#line 2595 "MachineIndependent/glslang.y"
+                   {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, EsdCube);
     }
-#line 8063 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8428 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 365:
-#line 2586 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 365: /* type_specifier_nonarray: ISAMPLER2DARRAY  */
+#line 2600 "MachineIndependent/glslang.y"
+                      {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, Esd2D, true);
     }
-#line 8073 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8438 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 366:
-#line 2591 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 366: /* type_specifier_nonarray: USAMPLER2D  */
+#line 2605 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, Esd2D);
     }
-#line 8083 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8448 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 367:
-#line 2596 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 367: /* type_specifier_nonarray: USAMPLER3D  */
+#line 2610 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, Esd3D);
     }
-#line 8093 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8458 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 368:
-#line 2601 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 368: /* type_specifier_nonarray: USAMPLERCUBE  */
+#line 2615 "MachineIndependent/glslang.y"
+                   {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, EsdCube);
     }
-#line 8103 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8468 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 369:
-#line 2607 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 369: /* type_specifier_nonarray: ISAMPLER1DARRAY  */
+#line 2621 "MachineIndependent/glslang.y"
+                      {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, Esd1D, true);
     }
-#line 8113 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8478 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 370:
-#line 2612 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 370: /* type_specifier_nonarray: ISAMPLERCUBEARRAY  */
+#line 2626 "MachineIndependent/glslang.y"
+                        {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, EsdCube, true);
     }
-#line 8123 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8488 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 371:
-#line 2617 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 371: /* type_specifier_nonarray: USAMPLER1D  */
+#line 2631 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, Esd1D);
     }
-#line 8133 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8498 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 372:
-#line 2622 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 372: /* type_specifier_nonarray: USAMPLER1DARRAY  */
+#line 2636 "MachineIndependent/glslang.y"
+                      {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, Esd1D, true);
     }
-#line 8143 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8508 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 373:
-#line 2627 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 373: /* type_specifier_nonarray: USAMPLERCUBEARRAY  */
+#line 2641 "MachineIndependent/glslang.y"
+                        {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, EsdCube, true);
     }
-#line 8153 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8518 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 374:
-#line 2632 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 374: /* type_specifier_nonarray: TEXTURECUBEARRAY  */
+#line 2646 "MachineIndependent/glslang.y"
+                       {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, EsdCube, true);
     }
-#line 8163 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8528 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 375:
-#line 2637 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 375: /* type_specifier_nonarray: ITEXTURECUBEARRAY  */
+#line 2651 "MachineIndependent/glslang.y"
+                        {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, EsdCube, true);
     }
-#line 8173 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8538 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 376:
-#line 2642 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 376: /* type_specifier_nonarray: UTEXTURECUBEARRAY  */
+#line 2656 "MachineIndependent/glslang.y"
+                        {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, EsdCube, true);
     }
-#line 8183 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8548 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 377:
-#line 2648 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 377: /* type_specifier_nonarray: USAMPLER2DARRAY  */
+#line 2662 "MachineIndependent/glslang.y"
+                      {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, Esd2D, true);
     }
-#line 8193 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8558 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 378:
-#line 2653 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 378: /* type_specifier_nonarray: TEXTURE2D  */
+#line 2667 "MachineIndependent/glslang.y"
+                {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, Esd2D);
     }
-#line 8203 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8568 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 379:
-#line 2658 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 379: /* type_specifier_nonarray: TEXTURE3D  */
+#line 2672 "MachineIndependent/glslang.y"
+                {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, Esd3D);
     }
-#line 8213 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8578 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 380:
-#line 2663 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 380: /* type_specifier_nonarray: TEXTURE2DARRAY  */
+#line 2677 "MachineIndependent/glslang.y"
+                     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, Esd2D, true);
     }
-#line 8223 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8588 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 381:
-#line 2668 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 381: /* type_specifier_nonarray: TEXTURECUBE  */
+#line 2682 "MachineIndependent/glslang.y"
+                  {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, EsdCube);
     }
-#line 8233 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8598 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 382:
-#line 2673 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 382: /* type_specifier_nonarray: ITEXTURE2D  */
+#line 2687 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, Esd2D);
     }
-#line 8243 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8608 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 383:
-#line 2678 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 383: /* type_specifier_nonarray: ITEXTURE3D  */
+#line 2692 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, Esd3D);
     }
-#line 8253 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8618 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 384:
-#line 2683 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 384: /* type_specifier_nonarray: ITEXTURECUBE  */
+#line 2697 "MachineIndependent/glslang.y"
+                   {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, EsdCube);
     }
-#line 8263 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8628 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 385:
-#line 2688 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 385: /* type_specifier_nonarray: ITEXTURE2DARRAY  */
+#line 2702 "MachineIndependent/glslang.y"
+                      {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, Esd2D, true);
     }
-#line 8273 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8638 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 386:
-#line 2693 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 386: /* type_specifier_nonarray: UTEXTURE2D  */
+#line 2707 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, Esd2D);
     }
-#line 8283 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8648 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 387:
-#line 2698 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 387: /* type_specifier_nonarray: UTEXTURE3D  */
+#line 2712 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, Esd3D);
     }
-#line 8293 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8658 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 388:
-#line 2703 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 388: /* type_specifier_nonarray: UTEXTURECUBE  */
+#line 2717 "MachineIndependent/glslang.y"
+                   {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, EsdCube);
     }
-#line 8303 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8668 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 389:
-#line 2708 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 389: /* type_specifier_nonarray: UTEXTURE2DARRAY  */
+#line 2722 "MachineIndependent/glslang.y"
+                      {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, Esd2D, true);
     }
-#line 8313 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8678 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 390:
-#line 2713 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 390: /* type_specifier_nonarray: SAMPLER  */
+#line 2727 "MachineIndependent/glslang.y"
+              {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setPureSampler(false);
     }
-#line 8323 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8688 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 391:
-#line 2718 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 391: /* type_specifier_nonarray: SAMPLERSHADOW  */
+#line 2732 "MachineIndependent/glslang.y"
+                    {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setPureSampler(true);
     }
-#line 8333 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8698 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 392:
-#line 2724 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 392: /* type_specifier_nonarray: SAMPLER2DRECT  */
+#line 2738 "MachineIndependent/glslang.y"
+                    {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, EsdRect);
     }
-#line 8343 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8708 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 393:
-#line 2729 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 393: /* type_specifier_nonarray: SAMPLER2DRECTSHADOW  */
+#line 2743 "MachineIndependent/glslang.y"
+                          {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, EsdRect, false, true);
     }
-#line 8353 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8718 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 394:
-#line 2734 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 394: /* type_specifier_nonarray: F16SAMPLER2DRECT  */
+#line 2748 "MachineIndependent/glslang.y"
+                       {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat16, EsdRect);
     }
-#line 8364 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8729 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 395:
-#line 2740 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 395: /* type_specifier_nonarray: F16SAMPLER2DRECTSHADOW  */
+#line 2754 "MachineIndependent/glslang.y"
+                             {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat16, EsdRect, false, true);
     }
-#line 8375 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8740 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 396:
-#line 2746 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 396: /* type_specifier_nonarray: ISAMPLER2DRECT  */
+#line 2760 "MachineIndependent/glslang.y"
+                     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, EsdRect);
     }
-#line 8385 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8750 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 397:
-#line 2751 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 397: /* type_specifier_nonarray: USAMPLER2DRECT  */
+#line 2765 "MachineIndependent/glslang.y"
+                     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, EsdRect);
     }
-#line 8395 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8760 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 398:
-#line 2756 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 398: /* type_specifier_nonarray: SAMPLERBUFFER  */
+#line 2770 "MachineIndependent/glslang.y"
+                    {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, EsdBuffer);
     }
-#line 8405 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8770 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 399:
-#line 2761 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 399: /* type_specifier_nonarray: F16SAMPLERBUFFER  */
+#line 2775 "MachineIndependent/glslang.y"
+                       {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat16, EsdBuffer);
     }
-#line 8416 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8781 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 400:
-#line 2767 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 400: /* type_specifier_nonarray: ISAMPLERBUFFER  */
+#line 2781 "MachineIndependent/glslang.y"
+                     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, EsdBuffer);
     }
-#line 8426 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8791 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 401:
-#line 2772 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 401: /* type_specifier_nonarray: USAMPLERBUFFER  */
+#line 2786 "MachineIndependent/glslang.y"
+                     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, EsdBuffer);
     }
-#line 8436 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8801 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 402:
-#line 2777 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 402: /* type_specifier_nonarray: SAMPLER2DMS  */
+#line 2791 "MachineIndependent/glslang.y"
+                  {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd2D, false, false, true);
     }
-#line 8446 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8811 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 403:
-#line 2782 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 403: /* type_specifier_nonarray: F16SAMPLER2DMS  */
+#line 2796 "MachineIndependent/glslang.y"
+                     {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, false, false, true);
     }
-#line 8457 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8822 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 404:
-#line 2788 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 404: /* type_specifier_nonarray: ISAMPLER2DMS  */
+#line 2802 "MachineIndependent/glslang.y"
+                   {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, Esd2D, false, false, true);
     }
-#line 8467 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8832 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 405:
-#line 2793 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 405: /* type_specifier_nonarray: USAMPLER2DMS  */
+#line 2807 "MachineIndependent/glslang.y"
+                   {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, Esd2D, false, false, true);
     }
-#line 8477 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8842 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 406:
-#line 2798 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 406: /* type_specifier_nonarray: SAMPLER2DMSARRAY  */
+#line 2812 "MachineIndependent/glslang.y"
+                       {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd2D, true, false, true);
     }
-#line 8487 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8852 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 407:
-#line 2803 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 407: /* type_specifier_nonarray: F16SAMPLER2DMSARRAY  */
+#line 2817 "MachineIndependent/glslang.y"
+                          {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, true, false, true);
     }
-#line 8498 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8863 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 408:
-#line 2809 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 408: /* type_specifier_nonarray: ISAMPLER2DMSARRAY  */
+#line 2823 "MachineIndependent/glslang.y"
+                        {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, Esd2D, true, false, true);
     }
-#line 8508 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8873 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 409:
-#line 2814 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 409: /* type_specifier_nonarray: USAMPLER2DMSARRAY  */
+#line 2828 "MachineIndependent/glslang.y"
+                        {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, Esd2D, true, false, true);
     }
-#line 8518 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8883 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 410:
-#line 2819 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 410: /* type_specifier_nonarray: TEXTURE1D  */
+#line 2833 "MachineIndependent/glslang.y"
+                {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, Esd1D);
     }
-#line 8528 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8893 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 411:
-#line 2824 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 411: /* type_specifier_nonarray: F16TEXTURE1D  */
+#line 2838 "MachineIndependent/glslang.y"
+                   {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd1D);
     }
-#line 8539 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8904 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 412:
-#line 2830 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 412: /* type_specifier_nonarray: F16TEXTURE2D  */
+#line 2844 "MachineIndependent/glslang.y"
+                   {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd2D);
     }
-#line 8550 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8915 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 413:
-#line 2836 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 413: /* type_specifier_nonarray: F16TEXTURE3D  */
+#line 2850 "MachineIndependent/glslang.y"
+                   {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd3D);
     }
-#line 8561 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8926 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 414:
-#line 2842 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 414: /* type_specifier_nonarray: F16TEXTURECUBE  */
+#line 2856 "MachineIndependent/glslang.y"
+                     {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat16, EsdCube);
     }
-#line 8572 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8937 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 415:
-#line 2848 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 415: /* type_specifier_nonarray: TEXTURE1DARRAY  */
+#line 2862 "MachineIndependent/glslang.y"
+                     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, Esd1D, true);
     }
-#line 8582 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8947 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 416:
-#line 2853 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 416: /* type_specifier_nonarray: F16TEXTURE1DARRAY  */
+#line 2867 "MachineIndependent/glslang.y"
+                        {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd1D, true);
     }
-#line 8593 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8958 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 417:
-#line 2859 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 417: /* type_specifier_nonarray: F16TEXTURE2DARRAY  */
+#line 2873 "MachineIndependent/glslang.y"
+                        {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd2D, true);
     }
-#line 8604 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8969 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 418:
-#line 2865 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 418: /* type_specifier_nonarray: F16TEXTURECUBEARRAY  */
+#line 2879 "MachineIndependent/glslang.y"
+                          {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat16, EsdCube, true);
     }
-#line 8615 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8980 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 419:
-#line 2871 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 419: /* type_specifier_nonarray: ITEXTURE1D  */
+#line 2885 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, Esd1D);
     }
-#line 8625 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8990 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 420:
-#line 2876 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 420: /* type_specifier_nonarray: ITEXTURE1DARRAY  */
+#line 2890 "MachineIndependent/glslang.y"
+                      {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, Esd1D, true);
     }
-#line 8635 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9000 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 421:
-#line 2881 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 421: /* type_specifier_nonarray: UTEXTURE1D  */
+#line 2895 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, Esd1D);
     }
-#line 8645 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9010 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 422:
-#line 2886 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 422: /* type_specifier_nonarray: UTEXTURE1DARRAY  */
+#line 2900 "MachineIndependent/glslang.y"
+                      {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, Esd1D, true);
     }
-#line 8655 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9020 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 423:
-#line 2891 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 423: /* type_specifier_nonarray: TEXTURE2DRECT  */
+#line 2905 "MachineIndependent/glslang.y"
+                    {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, EsdRect);
     }
-#line 8665 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9030 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 424:
-#line 2896 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 424: /* type_specifier_nonarray: F16TEXTURE2DRECT  */
+#line 2910 "MachineIndependent/glslang.y"
+                       {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat16, EsdRect);
     }
-#line 8676 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9041 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 425:
-#line 2902 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 425: /* type_specifier_nonarray: ITEXTURE2DRECT  */
+#line 2916 "MachineIndependent/glslang.y"
+                     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, EsdRect);
     }
-#line 8686 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9051 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 426:
-#line 2907 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 426: /* type_specifier_nonarray: UTEXTURE2DRECT  */
+#line 2921 "MachineIndependent/glslang.y"
+                     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, EsdRect);
     }
-#line 8696 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9061 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 427:
-#line 2912 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 427: /* type_specifier_nonarray: TEXTUREBUFFER  */
+#line 2926 "MachineIndependent/glslang.y"
+                    {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, EsdBuffer);
     }
-#line 8706 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9071 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 428:
-#line 2917 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 428: /* type_specifier_nonarray: F16TEXTUREBUFFER  */
+#line 2931 "MachineIndependent/glslang.y"
+                       {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat16, EsdBuffer);
     }
-#line 8717 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9082 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 429:
-#line 2923 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 429: /* type_specifier_nonarray: ITEXTUREBUFFER  */
+#line 2937 "MachineIndependent/glslang.y"
+                     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, EsdBuffer);
     }
-#line 8727 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9092 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 430:
-#line 2928 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 430: /* type_specifier_nonarray: UTEXTUREBUFFER  */
+#line 2942 "MachineIndependent/glslang.y"
+                     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, EsdBuffer);
     }
-#line 8737 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9102 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 431:
-#line 2933 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 431: /* type_specifier_nonarray: TEXTURE2DMS  */
+#line 2947 "MachineIndependent/glslang.y"
+                  {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, Esd2D, false, false, true);
     }
-#line 8747 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9112 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 432:
-#line 2938 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 432: /* type_specifier_nonarray: F16TEXTURE2DMS  */
+#line 2952 "MachineIndependent/glslang.y"
+                     {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd2D, false, false, true);
     }
-#line 8758 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9123 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 433:
-#line 2944 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 433: /* type_specifier_nonarray: ITEXTURE2DMS  */
+#line 2958 "MachineIndependent/glslang.y"
+                   {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, Esd2D, false, false, true);
     }
-#line 8768 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9133 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 434:
-#line 2949 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 434: /* type_specifier_nonarray: UTEXTURE2DMS  */
+#line 2963 "MachineIndependent/glslang.y"
+                   {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, Esd2D, false, false, true);
     }
-#line 8778 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9143 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 435:
-#line 2954 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 435: /* type_specifier_nonarray: TEXTURE2DMSARRAY  */
+#line 2968 "MachineIndependent/glslang.y"
+                       {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, Esd2D, true, false, true);
     }
-#line 8788 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9153 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 436:
-#line 2959 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 436: /* type_specifier_nonarray: F16TEXTURE2DMSARRAY  */
+#line 2973 "MachineIndependent/glslang.y"
+                          {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd2D, true, false, true);
     }
-#line 8799 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9164 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 437:
-#line 2965 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 437: /* type_specifier_nonarray: ITEXTURE2DMSARRAY  */
+#line 2979 "MachineIndependent/glslang.y"
+                        {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, Esd2D, true, false, true);
     }
-#line 8809 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9174 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 438:
-#line 2970 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 438: /* type_specifier_nonarray: UTEXTURE2DMSARRAY  */
+#line 2984 "MachineIndependent/glslang.y"
+                        {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, Esd2D, true, false, true);
     }
-#line 8819 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9184 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 439:
-#line 2975 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 439: /* type_specifier_nonarray: IMAGE1D  */
+#line 2989 "MachineIndependent/glslang.y"
+              {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, Esd1D);
     }
-#line 8829 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9194 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 440:
-#line 2980 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 440: /* type_specifier_nonarray: F16IMAGE1D  */
+#line 2994 "MachineIndependent/glslang.y"
+                 {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat16, Esd1D);
     }
-#line 8840 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9205 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 441:
-#line 2986 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 441: /* type_specifier_nonarray: IIMAGE1D  */
+#line 3000 "MachineIndependent/glslang.y"
+               {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, Esd1D);
     }
-#line 8850 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9215 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 442:
-#line 2991 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 442: /* type_specifier_nonarray: UIMAGE1D  */
+#line 3005 "MachineIndependent/glslang.y"
+               {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, Esd1D);
     }
-#line 8860 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9225 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 443:
-#line 2996 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 443: /* type_specifier_nonarray: IMAGE2D  */
+#line 3010 "MachineIndependent/glslang.y"
+              {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, Esd2D);
     }
-#line 8870 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9235 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 444:
-#line 3001 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 444: /* type_specifier_nonarray: F16IMAGE2D  */
+#line 3015 "MachineIndependent/glslang.y"
+                 {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat16, Esd2D);
     }
-#line 8881 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9246 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 445:
-#line 3007 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 445: /* type_specifier_nonarray: IIMAGE2D  */
+#line 3021 "MachineIndependent/glslang.y"
+               {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, Esd2D);
     }
-#line 8891 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9256 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 446:
-#line 3012 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 446: /* type_specifier_nonarray: UIMAGE2D  */
+#line 3026 "MachineIndependent/glslang.y"
+               {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, Esd2D);
     }
-#line 8901 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9266 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 447:
-#line 3017 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 447: /* type_specifier_nonarray: IMAGE3D  */
+#line 3031 "MachineIndependent/glslang.y"
+              {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, Esd3D);
     }
-#line 8911 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9276 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 448:
-#line 3022 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 448: /* type_specifier_nonarray: F16IMAGE3D  */
+#line 3036 "MachineIndependent/glslang.y"
+                 {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat16, Esd3D);
     }
-#line 8922 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9287 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 449:
-#line 3028 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 449: /* type_specifier_nonarray: IIMAGE3D  */
+#line 3042 "MachineIndependent/glslang.y"
+               {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, Esd3D);
     }
-#line 8932 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9297 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 450:
-#line 3033 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 450: /* type_specifier_nonarray: UIMAGE3D  */
+#line 3047 "MachineIndependent/glslang.y"
+               {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, Esd3D);
     }
-#line 8942 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9307 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 451:
-#line 3038 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 451: /* type_specifier_nonarray: IMAGE2DRECT  */
+#line 3052 "MachineIndependent/glslang.y"
+                  {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, EsdRect);
     }
-#line 8952 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9317 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 452:
-#line 3043 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 452: /* type_specifier_nonarray: F16IMAGE2DRECT  */
+#line 3057 "MachineIndependent/glslang.y"
+                     {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat16, EsdRect);
     }
-#line 8963 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9328 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 453:
-#line 3049 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 453: /* type_specifier_nonarray: IIMAGE2DRECT  */
+#line 3063 "MachineIndependent/glslang.y"
+                   {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, EsdRect);
     }
-#line 8973 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9338 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 454:
-#line 3054 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 454: /* type_specifier_nonarray: UIMAGE2DRECT  */
+#line 3068 "MachineIndependent/glslang.y"
+                   {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, EsdRect);
     }
-#line 8983 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9348 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 455:
-#line 3059 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 455: /* type_specifier_nonarray: IMAGECUBE  */
+#line 3073 "MachineIndependent/glslang.y"
+                {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, EsdCube);
     }
-#line 8993 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9358 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 456:
-#line 3064 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 456: /* type_specifier_nonarray: F16IMAGECUBE  */
+#line 3078 "MachineIndependent/glslang.y"
+                   {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat16, EsdCube);
     }
-#line 9004 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9369 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 457:
-#line 3070 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 457: /* type_specifier_nonarray: IIMAGECUBE  */
+#line 3084 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, EsdCube);
     }
-#line 9014 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9379 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 458:
-#line 3075 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 458: /* type_specifier_nonarray: UIMAGECUBE  */
+#line 3089 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, EsdCube);
     }
-#line 9024 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9389 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 459:
-#line 3080 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 459: /* type_specifier_nonarray: IMAGEBUFFER  */
+#line 3094 "MachineIndependent/glslang.y"
+                  {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, EsdBuffer);
     }
-#line 9034 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9399 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 460:
-#line 3085 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 460: /* type_specifier_nonarray: F16IMAGEBUFFER  */
+#line 3099 "MachineIndependent/glslang.y"
+                     {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat16, EsdBuffer);
     }
-#line 9045 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9410 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 461:
-#line 3091 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 461: /* type_specifier_nonarray: IIMAGEBUFFER  */
+#line 3105 "MachineIndependent/glslang.y"
+                   {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, EsdBuffer);
     }
-#line 9055 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9420 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 462:
-#line 3096 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 462: /* type_specifier_nonarray: UIMAGEBUFFER  */
+#line 3110 "MachineIndependent/glslang.y"
+                   {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, EsdBuffer);
     }
-#line 9065 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9430 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 463:
-#line 3101 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 463: /* type_specifier_nonarray: IMAGE1DARRAY  */
+#line 3115 "MachineIndependent/glslang.y"
+                   {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, Esd1D, true);
     }
-#line 9075 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9440 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 464:
-#line 3106 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 464: /* type_specifier_nonarray: F16IMAGE1DARRAY  */
+#line 3120 "MachineIndependent/glslang.y"
+                      {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat16, Esd1D, true);
     }
-#line 9086 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9451 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 465:
-#line 3112 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 465: /* type_specifier_nonarray: IIMAGE1DARRAY  */
+#line 3126 "MachineIndependent/glslang.y"
+                    {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, Esd1D, true);
     }
-#line 9096 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9461 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 466:
-#line 3117 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 466: /* type_specifier_nonarray: UIMAGE1DARRAY  */
+#line 3131 "MachineIndependent/glslang.y"
+                    {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, Esd1D, true);
     }
-#line 9106 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9471 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 467:
-#line 3122 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 467: /* type_specifier_nonarray: IMAGE2DARRAY  */
+#line 3136 "MachineIndependent/glslang.y"
+                   {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, Esd2D, true);
     }
-#line 9116 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9481 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 468:
-#line 3127 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 468: /* type_specifier_nonarray: F16IMAGE2DARRAY  */
+#line 3141 "MachineIndependent/glslang.y"
+                      {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat16, Esd2D, true);
     }
-#line 9127 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9492 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 469:
-#line 3133 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 469: /* type_specifier_nonarray: IIMAGE2DARRAY  */
+#line 3147 "MachineIndependent/glslang.y"
+                    {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, Esd2D, true);
     }
-#line 9137 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9502 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 470:
-#line 3138 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 470: /* type_specifier_nonarray: UIMAGE2DARRAY  */
+#line 3152 "MachineIndependent/glslang.y"
+                    {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, Esd2D, true);
     }
-#line 9147 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9512 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 471:
-#line 3143 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 471: /* type_specifier_nonarray: IMAGECUBEARRAY  */
+#line 3157 "MachineIndependent/glslang.y"
+                     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, EsdCube, true);
     }
-#line 9157 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9522 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 472:
-#line 3148 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 472: /* type_specifier_nonarray: F16IMAGECUBEARRAY  */
+#line 3162 "MachineIndependent/glslang.y"
+                        {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat16, EsdCube, true);
     }
-#line 9168 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9533 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 473:
-#line 3154 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 473: /* type_specifier_nonarray: IIMAGECUBEARRAY  */
+#line 3168 "MachineIndependent/glslang.y"
+                      {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, EsdCube, true);
     }
-#line 9178 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9543 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 474:
-#line 3159 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 474: /* type_specifier_nonarray: UIMAGECUBEARRAY  */
+#line 3173 "MachineIndependent/glslang.y"
+                      {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, EsdCube, true);
     }
-#line 9188 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9553 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 475:
-#line 3164 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 475: /* type_specifier_nonarray: IMAGE2DMS  */
+#line 3178 "MachineIndependent/glslang.y"
+                {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, Esd2D, false, false, true);
     }
-#line 9198 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9563 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 476:
-#line 3169 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 476: /* type_specifier_nonarray: F16IMAGE2DMS  */
+#line 3183 "MachineIndependent/glslang.y"
+                   {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat16, Esd2D, false, false, true);
     }
-#line 9209 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9574 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 477:
-#line 3175 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 477: /* type_specifier_nonarray: IIMAGE2DMS  */
+#line 3189 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, Esd2D, false, false, true);
     }
-#line 9219 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9584 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 478:
-#line 3180 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 478: /* type_specifier_nonarray: UIMAGE2DMS  */
+#line 3194 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, Esd2D, false, false, true);
     }
-#line 9229 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9594 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 479:
-#line 3185 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 479: /* type_specifier_nonarray: IMAGE2DMSARRAY  */
+#line 3199 "MachineIndependent/glslang.y"
+                     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, Esd2D, true, false, true);
     }
-#line 9239 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9604 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 480:
-#line 3190 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 480: /* type_specifier_nonarray: F16IMAGE2DMSARRAY  */
+#line 3204 "MachineIndependent/glslang.y"
+                        {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat16, Esd2D, true, false, true);
     }
-#line 9250 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9615 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 481:
-#line 3196 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 481: /* type_specifier_nonarray: IIMAGE2DMSARRAY  */
+#line 3210 "MachineIndependent/glslang.y"
+                      {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, Esd2D, true, false, true);
     }
-#line 9260 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9625 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 482:
-#line 3201 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 482: /* type_specifier_nonarray: UIMAGE2DMSARRAY  */
+#line 3215 "MachineIndependent/glslang.y"
+                      {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, Esd2D, true, false, true);
     }
-#line 9270 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9635 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 483:
-#line 3206 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {  // GL_OES_EGL_image_external
+  case 483: /* type_specifier_nonarray: I64IMAGE1D  */
+#line 3220 "MachineIndependent/glslang.y"
+                 {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtInt64, Esd1D);
+    }
+#line 9645 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 484: /* type_specifier_nonarray: U64IMAGE1D  */
+#line 3225 "MachineIndependent/glslang.y"
+                 {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtUint64, Esd1D);
+    }
+#line 9655 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 485: /* type_specifier_nonarray: I64IMAGE2D  */
+#line 3230 "MachineIndependent/glslang.y"
+                 {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtInt64, Esd2D);
+    }
+#line 9665 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 486: /* type_specifier_nonarray: U64IMAGE2D  */
+#line 3235 "MachineIndependent/glslang.y"
+                 {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtUint64, Esd2D);
+    }
+#line 9675 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 487: /* type_specifier_nonarray: I64IMAGE3D  */
+#line 3240 "MachineIndependent/glslang.y"
+                 {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtInt64, Esd3D);
+    }
+#line 9685 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 488: /* type_specifier_nonarray: U64IMAGE3D  */
+#line 3245 "MachineIndependent/glslang.y"
+                 {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtUint64, Esd3D);
+    }
+#line 9695 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 489: /* type_specifier_nonarray: I64IMAGE2DRECT  */
+#line 3250 "MachineIndependent/glslang.y"
+                     {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtInt64, EsdRect);
+    }
+#line 9705 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 490: /* type_specifier_nonarray: U64IMAGE2DRECT  */
+#line 3255 "MachineIndependent/glslang.y"
+                     {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtUint64, EsdRect);
+    }
+#line 9715 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 491: /* type_specifier_nonarray: I64IMAGECUBE  */
+#line 3260 "MachineIndependent/glslang.y"
+                   {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtInt64, EsdCube);
+    }
+#line 9725 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 492: /* type_specifier_nonarray: U64IMAGECUBE  */
+#line 3265 "MachineIndependent/glslang.y"
+                   {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtUint64, EsdCube);
+    }
+#line 9735 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 493: /* type_specifier_nonarray: I64IMAGEBUFFER  */
+#line 3270 "MachineIndependent/glslang.y"
+                     {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtInt64, EsdBuffer);
+    }
+#line 9745 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 494: /* type_specifier_nonarray: U64IMAGEBUFFER  */
+#line 3275 "MachineIndependent/glslang.y"
+                     {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtUint64, EsdBuffer);
+    }
+#line 9755 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 495: /* type_specifier_nonarray: I64IMAGE1DARRAY  */
+#line 3280 "MachineIndependent/glslang.y"
+                      {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtInt64, Esd1D, true);
+    }
+#line 9765 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 496: /* type_specifier_nonarray: U64IMAGE1DARRAY  */
+#line 3285 "MachineIndependent/glslang.y"
+                      {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtUint64, Esd1D, true);
+    }
+#line 9775 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 497: /* type_specifier_nonarray: I64IMAGE2DARRAY  */
+#line 3290 "MachineIndependent/glslang.y"
+                      {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtInt64, Esd2D, true);
+    }
+#line 9785 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 498: /* type_specifier_nonarray: U64IMAGE2DARRAY  */
+#line 3295 "MachineIndependent/glslang.y"
+                      {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtUint64, Esd2D, true);
+    }
+#line 9795 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 499: /* type_specifier_nonarray: I64IMAGECUBEARRAY  */
+#line 3300 "MachineIndependent/glslang.y"
+                        {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtInt64, EsdCube, true);
+    }
+#line 9805 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 500: /* type_specifier_nonarray: U64IMAGECUBEARRAY  */
+#line 3305 "MachineIndependent/glslang.y"
+                        {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtUint64, EsdCube, true);
+    }
+#line 9815 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 501: /* type_specifier_nonarray: I64IMAGE2DMS  */
+#line 3310 "MachineIndependent/glslang.y"
+                   {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtInt64, Esd2D, false, false, true);
+    }
+#line 9825 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 502: /* type_specifier_nonarray: U64IMAGE2DMS  */
+#line 3315 "MachineIndependent/glslang.y"
+                   {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtUint64, Esd2D, false, false, true);
+    }
+#line 9835 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 503: /* type_specifier_nonarray: I64IMAGE2DMSARRAY  */
+#line 3320 "MachineIndependent/glslang.y"
+                        {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtInt64, Esd2D, true, false, true);
+    }
+#line 9845 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 504: /* type_specifier_nonarray: U64IMAGE2DMSARRAY  */
+#line 3325 "MachineIndependent/glslang.y"
+                        {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtUint64, Esd2D, true, false, true);
+    }
+#line 9855 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 505: /* type_specifier_nonarray: SAMPLEREXTERNALOES  */
+#line 3330 "MachineIndependent/glslang.y"
+                         {  // GL_OES_EGL_image_external
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd2D);
         (yyval.interm.type).sampler.external = true;
     }
-#line 9281 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9866 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 484:
-#line 3212 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { // GL_EXT_YUV_target
+  case 506: /* type_specifier_nonarray: SAMPLEREXTERNAL2DY2YEXT  */
+#line 3336 "MachineIndependent/glslang.y"
+                              { // GL_EXT_YUV_target
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd2D);
         (yyval.interm.type).sampler.yuv = true;
     }
-#line 9292 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9877 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 485:
-#line 3218 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 507: /* type_specifier_nonarray: SUBPASSINPUT  */
+#line 3342 "MachineIndependent/glslang.y"
+                   {
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setSubpass(EbtFloat);
     }
-#line 9303 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9888 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 486:
-#line 3224 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 508: /* type_specifier_nonarray: SUBPASSINPUTMS  */
+#line 3348 "MachineIndependent/glslang.y"
+                     {
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setSubpass(EbtFloat, true);
     }
-#line 9314 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9899 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 487:
-#line 3230 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 509: /* type_specifier_nonarray: F16SUBPASSINPUT  */
+#line 3354 "MachineIndependent/glslang.y"
+                      {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float subpass input", parseContext.symbolTable.atBuiltInLevel());
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setSubpass(EbtFloat16);
     }
-#line 9326 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9911 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 488:
-#line 3237 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 510: /* type_specifier_nonarray: F16SUBPASSINPUTMS  */
+#line 3361 "MachineIndependent/glslang.y"
+                        {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float subpass input", parseContext.symbolTable.atBuiltInLevel());
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setSubpass(EbtFloat16, true);
     }
-#line 9338 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9923 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 489:
-#line 3244 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 511: /* type_specifier_nonarray: ISUBPASSINPUT  */
+#line 3368 "MachineIndependent/glslang.y"
+                    {
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setSubpass(EbtInt);
     }
-#line 9349 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9934 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 490:
-#line 3250 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 512: /* type_specifier_nonarray: ISUBPASSINPUTMS  */
+#line 3374 "MachineIndependent/glslang.y"
+                      {
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setSubpass(EbtInt, true);
     }
-#line 9360 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9945 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 491:
-#line 3256 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 513: /* type_specifier_nonarray: USUBPASSINPUT  */
+#line 3380 "MachineIndependent/glslang.y"
+                    {
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setSubpass(EbtUint);
     }
-#line 9371 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9956 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 492:
-#line 3262 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 514: /* type_specifier_nonarray: USUBPASSINPUTMS  */
+#line 3386 "MachineIndependent/glslang.y"
+                      {
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setSubpass(EbtUint, true);
     }
-#line 9382 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9967 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 493:
-#line 3268 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 515: /* type_specifier_nonarray: FCOOPMATNV  */
+#line 3392 "MachineIndependent/glslang.y"
+                 {
         parseContext.fcoopmatCheck((yyvsp[0].lex).loc, "fcoopmatNV", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).coopmat = true;
     }
-#line 9393 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9978 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 494:
-#line 3274 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 516: /* type_specifier_nonarray: ICOOPMATNV  */
+#line 3398 "MachineIndependent/glslang.y"
+                 {
         parseContext.intcoopmatCheck((yyvsp[0].lex).loc, "icoopmatNV", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt;
         (yyval.interm.type).coopmat = true;
     }
-#line 9404 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9989 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 495:
-#line 3280 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 517: /* type_specifier_nonarray: UCOOPMATNV  */
+#line 3404 "MachineIndependent/glslang.y"
+                 {
         parseContext.intcoopmatCheck((yyvsp[0].lex).loc, "ucoopmatNV", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint;
         (yyval.interm.type).coopmat = true;
     }
-#line 9415 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10000 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 496:
-#line 3287 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 518: /* type_specifier_nonarray: struct_specifier  */
+#line 3411 "MachineIndependent/glslang.y"
+                       {
         (yyval.interm.type) = (yyvsp[0].interm.type);
         (yyval.interm.type).qualifier.storage = parseContext.symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
         parseContext.structTypeCheck((yyval.interm.type).loc, (yyval.interm.type));
     }
-#line 9425 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10010 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 497:
-#line 3292 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 519: /* type_specifier_nonarray: TYPE_NAME  */
+#line 3416 "MachineIndependent/glslang.y"
+                {
         //
         // This is for user defined type names.  The lexical phase looked up the
         // type.
@@ -9439,48 +10024,48 @@
         } else
             parseContext.error((yyvsp[0].lex).loc, "expected type name", (yyvsp[0].lex).string->c_str(), "");
     }
-#line 9443 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10028 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 498:
-#line 3308 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 520: /* precision_qualifier: HIGH_PRECISION  */
+#line 3432 "MachineIndependent/glslang.y"
+                     {
         parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "highp precision qualifier");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         parseContext.handlePrecisionQualifier((yyvsp[0].lex).loc, (yyval.interm.type).qualifier, EpqHigh);
     }
-#line 9453 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10038 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 499:
-#line 3313 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 521: /* precision_qualifier: MEDIUM_PRECISION  */
+#line 3437 "MachineIndependent/glslang.y"
+                       {
         parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "mediump precision qualifier");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         parseContext.handlePrecisionQualifier((yyvsp[0].lex).loc, (yyval.interm.type).qualifier, EpqMedium);
     }
-#line 9463 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10048 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 500:
-#line 3318 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 522: /* precision_qualifier: LOW_PRECISION  */
+#line 3442 "MachineIndependent/glslang.y"
+                    {
         parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "lowp precision qualifier");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         parseContext.handlePrecisionQualifier((yyvsp[0].lex).loc, (yyval.interm.type).qualifier, EpqLow);
     }
-#line 9473 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10058 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 501:
-#line 3326 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { parseContext.nestedStructCheck((yyvsp[-2].lex).loc); }
-#line 9479 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+  case 523: /* $@3: %empty  */
+#line 3450 "MachineIndependent/glslang.y"
+                                   { parseContext.nestedStructCheck((yyvsp[-2].lex).loc); }
+#line 10064 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 502:
-#line 3326 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 524: /* struct_specifier: STRUCT IDENTIFIER LEFT_BRACE $@3 struct_declaration_list RIGHT_BRACE  */
+#line 3450 "MachineIndependent/glslang.y"
+                                                                                                                   {
         TType* structure = new TType((yyvsp[-1].interm.typeList), *(yyvsp[-4].lex).string);
         parseContext.structArrayCheck((yyvsp[-4].lex).loc, *structure);
         TVariable* userTypeDef = new TVariable((yyvsp[-4].lex).string, *structure, true);
@@ -9491,38 +10076,38 @@
         (yyval.interm.type).userDef = structure;
         --parseContext.structNestingLevel;
     }
-#line 9495 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10080 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 503:
-#line 3337 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { parseContext.nestedStructCheck((yyvsp[-1].lex).loc); }
-#line 9501 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+  case 525: /* $@4: %empty  */
+#line 3461 "MachineIndependent/glslang.y"
+                        { parseContext.nestedStructCheck((yyvsp[-1].lex).loc); }
+#line 10086 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 504:
-#line 3337 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 526: /* struct_specifier: STRUCT LEFT_BRACE $@4 struct_declaration_list RIGHT_BRACE  */
+#line 3461 "MachineIndependent/glslang.y"
+                                                                                                        {
         TType* structure = new TType((yyvsp[-1].interm.typeList), TString(""));
         (yyval.interm.type).init((yyvsp[-4].lex).loc);
         (yyval.interm.type).basicType = EbtStruct;
         (yyval.interm.type).userDef = structure;
         --parseContext.structNestingLevel;
     }
-#line 9513 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10098 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 505:
-#line 3347 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 527: /* struct_declaration_list: struct_declaration  */
+#line 3471 "MachineIndependent/glslang.y"
+                         {
         (yyval.interm.typeList) = (yyvsp[0].interm.typeList);
     }
-#line 9521 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10106 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 506:
-#line 3350 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 528: /* struct_declaration_list: struct_declaration_list struct_declaration  */
+#line 3474 "MachineIndependent/glslang.y"
+                                                 {
         (yyval.interm.typeList) = (yyvsp[-1].interm.typeList);
         for (unsigned int i = 0; i < (yyvsp[0].interm.typeList)->size(); ++i) {
             for (unsigned int j = 0; j < (yyval.interm.typeList)->size(); ++j) {
@@ -9532,12 +10117,12 @@
             (yyval.interm.typeList)->push_back((*(yyvsp[0].interm.typeList))[i]);
         }
     }
-#line 9536 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10121 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 507:
-#line 3363 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 529: /* struct_declaration: type_specifier struct_declarator_list SEMICOLON  */
+#line 3487 "MachineIndependent/glslang.y"
+                                                      {
         if ((yyvsp[-2].interm.type).arraySizes) {
             parseContext.profileRequires((yyvsp[-2].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type");
             parseContext.profileRequires((yyvsp[-2].interm.type).loc, EEsProfile, 300, 0, "arrayed type");
@@ -9559,12 +10144,12 @@
             (*(yyval.interm.typeList))[i].type->shallowCopy(type);
         }
     }
-#line 9563 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10148 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 508:
-#line 3385 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 530: /* struct_declaration: type_qualifier type_specifier struct_declarator_list SEMICOLON  */
+#line 3509 "MachineIndependent/glslang.y"
+                                                                     {
         if ((yyvsp[-2].interm.type).arraySizes) {
             parseContext.profileRequires((yyvsp[-2].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type");
             parseContext.profileRequires((yyvsp[-2].interm.type).loc, EEsProfile, 300, 0, "arrayed type");
@@ -9588,39 +10173,39 @@
             (*(yyval.interm.typeList))[i].type->shallowCopy(type);
         }
     }
-#line 9592 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10177 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 509:
-#line 3412 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 531: /* struct_declarator_list: struct_declarator  */
+#line 3536 "MachineIndependent/glslang.y"
+                        {
         (yyval.interm.typeList) = new TTypeList;
         (yyval.interm.typeList)->push_back((yyvsp[0].interm.typeLine));
     }
-#line 9601 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10186 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 510:
-#line 3416 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 532: /* struct_declarator_list: struct_declarator_list COMMA struct_declarator  */
+#line 3540 "MachineIndependent/glslang.y"
+                                                     {
         (yyval.interm.typeList)->push_back((yyvsp[0].interm.typeLine));
     }
-#line 9609 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10194 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 511:
-#line 3422 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 533: /* struct_declarator: IDENTIFIER  */
+#line 3546 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.typeLine).type = new TType(EbtVoid);
         (yyval.interm.typeLine).loc = (yyvsp[0].lex).loc;
         (yyval.interm.typeLine).type->setFieldName(*(yyvsp[0].lex).string);
     }
-#line 9619 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10204 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 512:
-#line 3427 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 534: /* struct_declarator: IDENTIFIER array_specifier  */
+#line 3551 "MachineIndependent/glslang.y"
+                                 {
         parseContext.arrayOfArrayVersionCheck((yyvsp[-1].lex).loc, (yyvsp[0].interm).arraySizes);
 
         (yyval.interm.typeLine).type = new TType(EbtVoid);
@@ -9628,236 +10213,236 @@
         (yyval.interm.typeLine).type->setFieldName(*(yyvsp[-1].lex).string);
         (yyval.interm.typeLine).type->transferArraySizes((yyvsp[0].interm).arraySizes);
     }
-#line 9632 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10217 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 513:
-#line 3438 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 535: /* initializer: assignment_expression  */
+#line 3562 "MachineIndependent/glslang.y"
+                            {
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
     }
-#line 9640 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10225 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 514:
-#line 3442 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 536: /* initializer: LEFT_BRACE initializer_list RIGHT_BRACE  */
+#line 3566 "MachineIndependent/glslang.y"
+                                              {
         const char* initFeature = "{ } style initializers";
         parseContext.requireProfile((yyvsp[-2].lex).loc, ~EEsProfile, initFeature);
         parseContext.profileRequires((yyvsp[-2].lex).loc, ~EEsProfile, 420, E_GL_ARB_shading_language_420pack, initFeature);
         (yyval.interm.intermTypedNode) = (yyvsp[-1].interm.intermTypedNode);
     }
-#line 9651 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10236 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 515:
-#line 3448 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 537: /* initializer: LEFT_BRACE initializer_list COMMA RIGHT_BRACE  */
+#line 3572 "MachineIndependent/glslang.y"
+                                                    {
         const char* initFeature = "{ } style initializers";
         parseContext.requireProfile((yyvsp[-3].lex).loc, ~EEsProfile, initFeature);
         parseContext.profileRequires((yyvsp[-3].lex).loc, ~EEsProfile, 420, E_GL_ARB_shading_language_420pack, initFeature);
         (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 9662 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10247 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 516:
-#line 3459 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 538: /* initializer_list: initializer  */
+#line 3583 "MachineIndependent/glslang.y"
+                  {
         (yyval.interm.intermTypedNode) = parseContext.intermediate.growAggregate(0, (yyvsp[0].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)->getLoc());
     }
-#line 9670 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10255 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 517:
-#line 3462 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 539: /* initializer_list: initializer_list COMMA initializer  */
+#line 3586 "MachineIndependent/glslang.y"
+                                         {
         (yyval.interm.intermTypedNode) = parseContext.intermediate.growAggregate((yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
     }
-#line 9678 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10263 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 518:
-#line 3469 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 9684 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+  case 540: /* declaration_statement: declaration  */
+#line 3593 "MachineIndependent/glslang.y"
+                  { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+#line 10269 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 519:
-#line 3473 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 9690 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+  case 541: /* statement: compound_statement  */
+#line 3597 "MachineIndependent/glslang.y"
+                          { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+#line 10275 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 520:
-#line 3474 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 9696 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+  case 542: /* statement: simple_statement  */
+#line 3598 "MachineIndependent/glslang.y"
+                          { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+#line 10281 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 521:
-#line 3480 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 9702 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+  case 543: /* simple_statement: declaration_statement  */
+#line 3604 "MachineIndependent/glslang.y"
+                            { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+#line 10287 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 522:
-#line 3481 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 9708 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+  case 544: /* simple_statement: expression_statement  */
+#line 3605 "MachineIndependent/glslang.y"
+                            { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+#line 10293 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 523:
-#line 3482 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 9714 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+  case 545: /* simple_statement: selection_statement  */
+#line 3606 "MachineIndependent/glslang.y"
+                            { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+#line 10299 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 524:
-#line 3483 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 9720 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+  case 546: /* simple_statement: switch_statement  */
+#line 3607 "MachineIndependent/glslang.y"
+                            { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+#line 10305 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 525:
-#line 3484 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 9726 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+  case 547: /* simple_statement: case_label  */
+#line 3608 "MachineIndependent/glslang.y"
+                            { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+#line 10311 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 526:
-#line 3485 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 9732 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+  case 548: /* simple_statement: iteration_statement  */
+#line 3609 "MachineIndependent/glslang.y"
+                            { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+#line 10317 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 527:
-#line 3486 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 9738 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+  case 549: /* simple_statement: jump_statement  */
+#line 3610 "MachineIndependent/glslang.y"
+                            { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+#line 10323 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 528:
-#line 3488 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 9744 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+  case 550: /* simple_statement: demote_statement  */
+#line 3612 "MachineIndependent/glslang.y"
+                            { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+#line 10329 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 529:
-#line 3494 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 551: /* demote_statement: DEMOTE SEMICOLON  */
+#line 3618 "MachineIndependent/glslang.y"
+                       {
         parseContext.requireStage((yyvsp[-1].lex).loc, EShLangFragment, "demote");
         parseContext.requireExtensions((yyvsp[-1].lex).loc, 1, &E_GL_EXT_demote_to_helper_invocation, "demote");
         (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpDemote, (yyvsp[-1].lex).loc);
     }
-#line 9754 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10339 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 530:
-#line 3503 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermNode) = 0; }
-#line 9760 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+  case 552: /* compound_statement: LEFT_BRACE RIGHT_BRACE  */
+#line 3627 "MachineIndependent/glslang.y"
+                             { (yyval.interm.intermNode) = 0; }
+#line 10345 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 531:
-#line 3504 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 553: /* $@5: %empty  */
+#line 3628 "MachineIndependent/glslang.y"
+                 {
         parseContext.symbolTable.push();
         ++parseContext.statementNestingLevel;
     }
-#line 9769 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10354 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 532:
-#line 3508 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 554: /* $@6: %empty  */
+#line 3632 "MachineIndependent/glslang.y"
+                     {
         parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]);
         --parseContext.statementNestingLevel;
     }
-#line 9778 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10363 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 533:
-#line 3512 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 555: /* compound_statement: LEFT_BRACE $@5 statement_list $@6 RIGHT_BRACE  */
+#line 3636 "MachineIndependent/glslang.y"
+                  {
         if ((yyvsp[-2].interm.intermNode) && (yyvsp[-2].interm.intermNode)->getAsAggregate())
             (yyvsp[-2].interm.intermNode)->getAsAggregate()->setOperator(EOpSequence);
         (yyval.interm.intermNode) = (yyvsp[-2].interm.intermNode);
     }
-#line 9788 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10373 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 534:
-#line 3520 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 9794 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+  case 556: /* statement_no_new_scope: compound_statement_no_new_scope  */
+#line 3644 "MachineIndependent/glslang.y"
+                                      { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+#line 10379 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 535:
-#line 3521 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 9800 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+  case 557: /* statement_no_new_scope: simple_statement  */
+#line 3645 "MachineIndependent/glslang.y"
+                                      { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+#line 10385 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 536:
-#line 3525 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 558: /* $@7: %empty  */
+#line 3649 "MachineIndependent/glslang.y"
+      {
         ++parseContext.controlFlowNestingLevel;
     }
-#line 9808 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10393 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 537:
-#line 3528 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 559: /* statement_scoped: $@7 compound_statement  */
+#line 3652 "MachineIndependent/glslang.y"
+                          {
         --parseContext.controlFlowNestingLevel;
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 9817 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10402 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 538:
-#line 3532 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 560: /* $@8: %empty  */
+#line 3656 "MachineIndependent/glslang.y"
+      {
         parseContext.symbolTable.push();
         ++parseContext.statementNestingLevel;
         ++parseContext.controlFlowNestingLevel;
     }
-#line 9827 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10412 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 539:
-#line 3537 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 561: /* statement_scoped: $@8 simple_statement  */
+#line 3661 "MachineIndependent/glslang.y"
+                       {
         parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]);
         --parseContext.statementNestingLevel;
         --parseContext.controlFlowNestingLevel;
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 9838 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10423 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 540:
-#line 3546 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 562: /* compound_statement_no_new_scope: LEFT_BRACE RIGHT_BRACE  */
+#line 3670 "MachineIndependent/glslang.y"
+                             {
         (yyval.interm.intermNode) = 0;
     }
-#line 9846 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10431 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 541:
-#line 3549 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 563: /* compound_statement_no_new_scope: LEFT_BRACE statement_list RIGHT_BRACE  */
+#line 3673 "MachineIndependent/glslang.y"
+                                            {
         if ((yyvsp[-1].interm.intermNode) && (yyvsp[-1].interm.intermNode)->getAsAggregate())
             (yyvsp[-1].interm.intermNode)->getAsAggregate()->setOperator(EOpSequence);
         (yyval.interm.intermNode) = (yyvsp[-1].interm.intermNode);
     }
-#line 9856 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10441 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 542:
-#line 3557 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 564: /* statement_list: statement  */
+#line 3681 "MachineIndependent/glslang.y"
+                {
         (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate((yyvsp[0].interm.intermNode));
         if ((yyvsp[0].interm.intermNode) && (yyvsp[0].interm.intermNode)->getAsBranchNode() && ((yyvsp[0].interm.intermNode)->getAsBranchNode()->getFlowOp() == EOpCase ||
                                             (yyvsp[0].interm.intermNode)->getAsBranchNode()->getFlowOp() == EOpDefault)) {
@@ -9865,12 +10450,12 @@
             (yyval.interm.intermNode) = 0;  // start a fresh subsequence for what's after this case
         }
     }
-#line 9869 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10454 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 543:
-#line 3565 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 565: /* statement_list: statement_list statement  */
+#line 3689 "MachineIndependent/glslang.y"
+                               {
         if ((yyvsp[0].interm.intermNode) && (yyvsp[0].interm.intermNode)->getAsBranchNode() && ((yyvsp[0].interm.intermNode)->getAsBranchNode()->getFlowOp() == EOpCase ||
                                             (yyvsp[0].interm.intermNode)->getAsBranchNode()->getFlowOp() == EOpDefault)) {
             parseContext.wrapupSwitchSubsequence((yyvsp[-1].interm.intermNode) ? (yyvsp[-1].interm.intermNode)->getAsAggregate() : 0, (yyvsp[0].interm.intermNode));
@@ -9878,77 +10463,77 @@
         } else
             (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-1].interm.intermNode), (yyvsp[0].interm.intermNode));
     }
-#line 9882 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10467 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 544:
-#line 3576 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermNode) = 0; }
-#line 9888 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+  case 566: /* expression_statement: SEMICOLON  */
+#line 3700 "MachineIndependent/glslang.y"
+                 { (yyval.interm.intermNode) = 0; }
+#line 10473 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 545:
-#line 3577 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermNode) = static_cast<TIntermNode*>((yyvsp[-1].interm.intermTypedNode)); }
-#line 9894 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+  case 567: /* expression_statement: expression SEMICOLON  */
+#line 3701 "MachineIndependent/glslang.y"
+                            { (yyval.interm.intermNode) = static_cast<TIntermNode*>((yyvsp[-1].interm.intermTypedNode)); }
+#line 10479 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 546:
-#line 3581 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 568: /* selection_statement: selection_statement_nonattributed  */
+#line 3705 "MachineIndependent/glslang.y"
+                                        {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 9902 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10487 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 547:
-#line 3585 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 569: /* selection_statement: attribute selection_statement_nonattributed  */
+#line 3709 "MachineIndependent/glslang.y"
+                                                  {
         parseContext.handleSelectionAttributes(*(yyvsp[-1].interm.attributes), (yyvsp[0].interm.intermNode));
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 9911 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10496 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 548:
-#line 3592 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 570: /* selection_statement_nonattributed: IF LEFT_PAREN expression RIGHT_PAREN selection_rest_statement  */
+#line 3716 "MachineIndependent/glslang.y"
+                                                                    {
         parseContext.boolCheck((yyvsp[-4].lex).loc, (yyvsp[-2].interm.intermTypedNode));
         (yyval.interm.intermNode) = parseContext.intermediate.addSelection((yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.nodePair), (yyvsp[-4].lex).loc);
     }
-#line 9920 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10505 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 549:
-#line 3599 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 571: /* selection_rest_statement: statement_scoped ELSE statement_scoped  */
+#line 3723 "MachineIndependent/glslang.y"
+                                             {
         (yyval.interm.nodePair).node1 = (yyvsp[-2].interm.intermNode);
         (yyval.interm.nodePair).node2 = (yyvsp[0].interm.intermNode);
     }
-#line 9929 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10514 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 550:
-#line 3603 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 572: /* selection_rest_statement: statement_scoped  */
+#line 3727 "MachineIndependent/glslang.y"
+                       {
         (yyval.interm.nodePair).node1 = (yyvsp[0].interm.intermNode);
         (yyval.interm.nodePair).node2 = 0;
     }
-#line 9938 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10523 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 551:
-#line 3611 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 573: /* condition: expression  */
+#line 3735 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
         parseContext.boolCheck((yyvsp[0].interm.intermTypedNode)->getLoc(), (yyvsp[0].interm.intermTypedNode));
     }
-#line 9947 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10532 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 552:
-#line 3615 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 574: /* condition: fully_specified_type IDENTIFIER EQUAL initializer  */
+#line 3739 "MachineIndependent/glslang.y"
+                                                        {
         parseContext.boolCheck((yyvsp[-2].lex).loc, (yyvsp[-3].interm.type));
 
         TType type((yyvsp[-3].interm.type));
@@ -9958,29 +10543,29 @@
         else
             (yyval.interm.intermTypedNode) = 0;
     }
-#line 9962 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10547 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 553:
-#line 3628 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 575: /* switch_statement: switch_statement_nonattributed  */
+#line 3752 "MachineIndependent/glslang.y"
+                                     {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 9970 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10555 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 554:
-#line 3632 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 576: /* switch_statement: attribute switch_statement_nonattributed  */
+#line 3756 "MachineIndependent/glslang.y"
+                                               {
         parseContext.handleSwitchAttributes(*(yyvsp[-1].interm.attributes), (yyvsp[0].interm.intermNode));
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 9979 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10564 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 555:
-#line 3639 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 577: /* $@9: %empty  */
+#line 3763 "MachineIndependent/glslang.y"
+                                               {
         // start new switch sequence on the switch stack
         ++parseContext.controlFlowNestingLevel;
         ++parseContext.statementNestingLevel;
@@ -9988,12 +10573,12 @@
         parseContext.switchLevel.push_back(parseContext.statementNestingLevel);
         parseContext.symbolTable.push();
     }
-#line 9992 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10577 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 556:
-#line 3647 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 578: /* switch_statement_nonattributed: SWITCH LEFT_PAREN expression RIGHT_PAREN $@9 LEFT_BRACE switch_statement_list RIGHT_BRACE  */
+#line 3771 "MachineIndependent/glslang.y"
+                                                 {
         (yyval.interm.intermNode) = parseContext.addSwitch((yyvsp[-7].lex).loc, (yyvsp[-5].interm.intermTypedNode), (yyvsp[-1].interm.intermNode) ? (yyvsp[-1].interm.intermNode)->getAsAggregate() : 0);
         delete parseContext.switchSequenceStack.back();
         parseContext.switchSequenceStack.pop_back();
@@ -10002,28 +10587,28 @@
         --parseContext.statementNestingLevel;
         --parseContext.controlFlowNestingLevel;
     }
-#line 10006 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10591 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 557:
-#line 3659 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 579: /* switch_statement_list: %empty  */
+#line 3783 "MachineIndependent/glslang.y"
+                    {
         (yyval.interm.intermNode) = 0;
     }
-#line 10014 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10599 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 558:
-#line 3662 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 580: /* switch_statement_list: statement_list  */
+#line 3786 "MachineIndependent/glslang.y"
+                     {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 10022 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10607 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 559:
-#line 3668 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 581: /* case_label: CASE expression COLON  */
+#line 3792 "MachineIndependent/glslang.y"
+                            {
         (yyval.interm.intermNode) = 0;
         if (parseContext.switchLevel.size() == 0)
             parseContext.error((yyvsp[-2].lex).loc, "cannot appear outside switch statement", "case", "");
@@ -10035,12 +10620,12 @@
             (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpCase, (yyvsp[-1].interm.intermTypedNode), (yyvsp[-2].lex).loc);
         }
     }
-#line 10039 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10624 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 560:
-#line 3680 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 582: /* case_label: DEFAULT COLON  */
+#line 3804 "MachineIndependent/glslang.y"
+                    {
         (yyval.interm.intermNode) = 0;
         if (parseContext.switchLevel.size() == 0)
             parseContext.error((yyvsp[-1].lex).loc, "cannot appear outside switch statement", "default", "");
@@ -10049,29 +10634,29 @@
         else
             (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpDefault, (yyvsp[-1].lex).loc);
     }
-#line 10053 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10638 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 561:
-#line 3692 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 583: /* iteration_statement: iteration_statement_nonattributed  */
+#line 3816 "MachineIndependent/glslang.y"
+                                        {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 10061 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10646 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 562:
-#line 3696 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 584: /* iteration_statement: attribute iteration_statement_nonattributed  */
+#line 3820 "MachineIndependent/glslang.y"
+                                                  {
         parseContext.handleLoopAttributes(*(yyvsp[-1].interm.attributes), (yyvsp[0].interm.intermNode));
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 10070 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10655 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 563:
-#line 3703 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 585: /* $@10: %empty  */
+#line 3827 "MachineIndependent/glslang.y"
+                       {
         if (! parseContext.limits.whileLoops)
             parseContext.error((yyvsp[-1].lex).loc, "while loops not available", "limitation", "");
         parseContext.symbolTable.push();
@@ -10079,34 +10664,34 @@
         ++parseContext.statementNestingLevel;
         ++parseContext.controlFlowNestingLevel;
     }
-#line 10083 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10668 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 564:
-#line 3711 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 586: /* iteration_statement_nonattributed: WHILE LEFT_PAREN $@10 condition RIGHT_PAREN statement_no_new_scope  */
+#line 3835 "MachineIndependent/glslang.y"
+                                                   {
         parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]);
         (yyval.interm.intermNode) = parseContext.intermediate.addLoop((yyvsp[0].interm.intermNode), (yyvsp[-2].interm.intermTypedNode), 0, true, (yyvsp[-5].lex).loc);
         --parseContext.loopNestingLevel;
         --parseContext.statementNestingLevel;
         --parseContext.controlFlowNestingLevel;
     }
-#line 10095 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10680 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 565:
-#line 3718 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 587: /* $@11: %empty  */
+#line 3842 "MachineIndependent/glslang.y"
+         {
         ++parseContext.loopNestingLevel;
         ++parseContext.statementNestingLevel;
         ++parseContext.controlFlowNestingLevel;
     }
-#line 10105 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10690 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 566:
-#line 3723 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 588: /* iteration_statement_nonattributed: DO $@11 statement WHILE LEFT_PAREN expression RIGHT_PAREN SEMICOLON  */
+#line 3847 "MachineIndependent/glslang.y"
+                                                                  {
         if (! parseContext.limits.whileLoops)
             parseContext.error((yyvsp[-7].lex).loc, "do-while loops not available", "limitation", "");
 
@@ -10117,23 +10702,23 @@
         --parseContext.statementNestingLevel;
         --parseContext.controlFlowNestingLevel;
     }
-#line 10121 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10706 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 567:
-#line 3734 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 589: /* $@12: %empty  */
+#line 3858 "MachineIndependent/glslang.y"
+                     {
         parseContext.symbolTable.push();
         ++parseContext.loopNestingLevel;
         ++parseContext.statementNestingLevel;
         ++parseContext.controlFlowNestingLevel;
     }
-#line 10132 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10717 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 568:
-#line 3740 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 590: /* iteration_statement_nonattributed: FOR LEFT_PAREN $@12 for_init_statement for_rest_statement RIGHT_PAREN statement_no_new_scope  */
+#line 3864 "MachineIndependent/glslang.y"
+                                                                               {
         parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]);
         (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate((yyvsp[-3].interm.intermNode), (yyvsp[-5].lex).loc);
         TIntermLoop* forLoop = parseContext.intermediate.addLoop((yyvsp[0].interm.intermNode), reinterpret_cast<TIntermTyped*>((yyvsp[-2].interm.nodePair).node1), reinterpret_cast<TIntermTyped*>((yyvsp[-2].interm.nodePair).node2), true, (yyvsp[-6].lex).loc);
@@ -10145,157 +10730,184 @@
         --parseContext.statementNestingLevel;
         --parseContext.controlFlowNestingLevel;
     }
-#line 10149 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10734 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 569:
-#line 3755 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 591: /* for_init_statement: expression_statement  */
+#line 3879 "MachineIndependent/glslang.y"
+                           {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 10157 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10742 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 570:
-#line 3758 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 592: /* for_init_statement: declaration_statement  */
+#line 3882 "MachineIndependent/glslang.y"
+                            {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 10165 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10750 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 571:
-#line 3764 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 593: /* conditionopt: condition  */
+#line 3888 "MachineIndependent/glslang.y"
+                {
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
     }
-#line 10173 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10758 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 572:
-#line 3767 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 594: /* conditionopt: %empty  */
+#line 3891 "MachineIndependent/glslang.y"
+                        {
         (yyval.interm.intermTypedNode) = 0;
     }
-#line 10181 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10766 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 573:
-#line 3773 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 595: /* for_rest_statement: conditionopt SEMICOLON  */
+#line 3897 "MachineIndependent/glslang.y"
+                             {
         (yyval.interm.nodePair).node1 = (yyvsp[-1].interm.intermTypedNode);
         (yyval.interm.nodePair).node2 = 0;
     }
-#line 10190 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10775 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 574:
-#line 3777 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 596: /* for_rest_statement: conditionopt SEMICOLON expression  */
+#line 3901 "MachineIndependent/glslang.y"
+                                         {
         (yyval.interm.nodePair).node1 = (yyvsp[-2].interm.intermTypedNode);
         (yyval.interm.nodePair).node2 = (yyvsp[0].interm.intermTypedNode);
     }
-#line 10199 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10784 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 575:
-#line 3784 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 597: /* jump_statement: CONTINUE SEMICOLON  */
+#line 3908 "MachineIndependent/glslang.y"
+                         {
         if (parseContext.loopNestingLevel <= 0)
             parseContext.error((yyvsp[-1].lex).loc, "continue statement only allowed in loops", "", "");
         (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpContinue, (yyvsp[-1].lex).loc);
     }
-#line 10209 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10794 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 576:
-#line 3789 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 598: /* jump_statement: BREAK SEMICOLON  */
+#line 3913 "MachineIndependent/glslang.y"
+                      {
         if (parseContext.loopNestingLevel + parseContext.switchSequenceStack.size() <= 0)
             parseContext.error((yyvsp[-1].lex).loc, "break statement only allowed in switch and loops", "", "");
         (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpBreak, (yyvsp[-1].lex).loc);
     }
-#line 10219 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10804 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 577:
-#line 3794 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 599: /* jump_statement: RETURN SEMICOLON  */
+#line 3918 "MachineIndependent/glslang.y"
+                       {
         (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpReturn, (yyvsp[-1].lex).loc);
         if (parseContext.currentFunctionType->getBasicType() != EbtVoid)
             parseContext.error((yyvsp[-1].lex).loc, "non-void function must return a value", "return", "");
         if (parseContext.inMain)
             parseContext.postEntryPointReturn = true;
     }
-#line 10231 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10816 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 578:
-#line 3801 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 600: /* jump_statement: RETURN expression SEMICOLON  */
+#line 3925 "MachineIndependent/glslang.y"
+                                  {
         (yyval.interm.intermNode) = parseContext.handleReturnValue((yyvsp[-2].lex).loc, (yyvsp[-1].interm.intermTypedNode));
     }
-#line 10239 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10824 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 579:
-#line 3804 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 601: /* jump_statement: DISCARD SEMICOLON  */
+#line 3928 "MachineIndependent/glslang.y"
+                        {
         parseContext.requireStage((yyvsp[-1].lex).loc, EShLangFragment, "discard");
         (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpKill, (yyvsp[-1].lex).loc);
     }
-#line 10248 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10833 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 580:
-#line 3813 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 602: /* jump_statement: TERMINATE_INVOCATION SEMICOLON  */
+#line 3932 "MachineIndependent/glslang.y"
+                                     {
+        parseContext.requireStage((yyvsp[-1].lex).loc, EShLangFragment, "terminateInvocation");
+        (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpTerminateInvocation, (yyvsp[-1].lex).loc);
+    }
+#line 10842 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 603: /* jump_statement: TERMINATE_RAY SEMICOLON  */
+#line 3937 "MachineIndependent/glslang.y"
+                              {
+        parseContext.requireStage((yyvsp[-1].lex).loc, EShLangAnyHit, "terminateRayEXT");
+        (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpTerminateRayKHR, (yyvsp[-1].lex).loc);
+    }
+#line 10851 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 604: /* jump_statement: IGNORE_INTERSECTION SEMICOLON  */
+#line 3941 "MachineIndependent/glslang.y"
+                                    {
+        parseContext.requireStage((yyvsp[-1].lex).loc, EShLangAnyHit, "ignoreIntersectionEXT");
+        (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpIgnoreIntersectionKHR, (yyvsp[-1].lex).loc);
+    }
+#line 10860 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 605: /* translation_unit: external_declaration  */
+#line 3951 "MachineIndependent/glslang.y"
+                           {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
         parseContext.intermediate.setTreeRoot((yyval.interm.intermNode));
     }
-#line 10257 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10869 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 581:
-#line 3817 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 606: /* translation_unit: translation_unit external_declaration  */
+#line 3955 "MachineIndependent/glslang.y"
+                                            {
         if ((yyvsp[0].interm.intermNode) != nullptr) {
             (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-1].interm.intermNode), (yyvsp[0].interm.intermNode));
             parseContext.intermediate.setTreeRoot((yyval.interm.intermNode));
         }
     }
-#line 10268 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10880 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 582:
-#line 3826 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 607: /* external_declaration: function_definition  */
+#line 3964 "MachineIndependent/glslang.y"
+                          {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 10276 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10888 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 583:
-#line 3829 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 608: /* external_declaration: declaration  */
+#line 3967 "MachineIndependent/glslang.y"
+                  {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 10284 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10896 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 584:
-#line 3833 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 609: /* external_declaration: SEMICOLON  */
+#line 3971 "MachineIndependent/glslang.y"
+                {
         parseContext.requireProfile((yyvsp[0].lex).loc, ~EEsProfile, "extraneous semicolon");
         parseContext.profileRequires((yyvsp[0].lex).loc, ~EEsProfile, 460, nullptr, "extraneous semicolon");
         (yyval.interm.intermNode) = nullptr;
     }
-#line 10294 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10906 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 585:
-#line 3842 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 610: /* $@13: %empty  */
+#line 3980 "MachineIndependent/glslang.y"
+                         {
         (yyvsp[0].interm).function = parseContext.handleFunctionDeclarator((yyvsp[0].interm).loc, *(yyvsp[0].interm).function, false /* not prototype */);
         (yyvsp[0].interm).intermNode = parseContext.handleFunctionDefinition((yyvsp[0].interm).loc, *(yyvsp[0].interm).function);
 
@@ -10307,12 +10919,12 @@
             ++parseContext.statementNestingLevel;
         }
     }
-#line 10311 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10923 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 586:
-#line 3854 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 611: /* function_definition: function_prototype $@13 compound_statement_no_new_scope  */
+#line 3992 "MachineIndependent/glslang.y"
+                                    {
         //   May be best done as post process phase on intermediate code
         if (parseContext.currentFunctionType->getBasicType() != EbtVoid && ! parseContext.functionReturnsValue)
             parseContext.error((yyvsp[-2].interm).loc, "function does not return a value:", "", (yyvsp[-2].interm).function->getName().c_str());
@@ -10338,52 +10950,53 @@
             --parseContext.statementNestingLevel;
         }
     }
-#line 10342 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10954 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 587:
-#line 3884 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 612: /* attribute: LEFT_BRACKET LEFT_BRACKET attribute_list RIGHT_BRACKET RIGHT_BRACKET  */
+#line 4022 "MachineIndependent/glslang.y"
+                                                                           {
         (yyval.interm.attributes) = (yyvsp[-2].interm.attributes);
         parseContext.requireExtensions((yyvsp[-4].lex).loc, 1, &E_GL_EXT_control_flow_attributes, "attribute");
     }
-#line 10351 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10963 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 588:
-#line 3890 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 613: /* attribute_list: single_attribute  */
+#line 4028 "MachineIndependent/glslang.y"
+                       {
         (yyval.interm.attributes) = (yyvsp[0].interm.attributes);
     }
-#line 10359 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10971 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 589:
-#line 3893 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 614: /* attribute_list: attribute_list COMMA single_attribute  */
+#line 4031 "MachineIndependent/glslang.y"
+                                            {
         (yyval.interm.attributes) = parseContext.mergeAttributes((yyvsp[-2].interm.attributes), (yyvsp[0].interm.attributes));
     }
-#line 10367 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10979 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 590:
-#line 3898 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 615: /* single_attribute: IDENTIFIER  */
+#line 4036 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.attributes) = parseContext.makeAttributes(*(yyvsp[0].lex).string);
     }
-#line 10375 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10987 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 591:
-#line 3901 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
+  case 616: /* single_attribute: IDENTIFIER LEFT_PAREN constant_expression RIGHT_PAREN  */
+#line 4039 "MachineIndependent/glslang.y"
+                                                            {
         (yyval.interm.attributes) = parseContext.makeAttributes(*(yyvsp[-3].lex).string, (yyvsp[-1].interm.intermTypedNode));
     }
-#line 10383 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10995 "MachineIndependent/glslang_tab.cpp"
     break;
 
 
-#line 10387 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10999 "MachineIndependent/glslang_tab.cpp"
+
       default: break;
     }
   /* User semantic actions sometimes alter yychar, and that requires
@@ -10397,25 +11010,23 @@
      case of YYERROR or YYBACKUP, subsequent parser actions might lead
      to an incorrect destructor call or verbose syntax error message
      before the lookahead is translated.  */
-  YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
+  YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc);
 
   YYPOPSTACK (yylen);
   yylen = 0;
-  YY_STACK_PRINT (yyss, yyssp);
 
   *++yyvsp = yyval;
 
   /* Now 'shift' the result of the reduction.  Determine what state
      that goes to, based on the state we popped back to and the rule
      number reduced by.  */
-
-  yyn = yyr1[yyn];
-
-  yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
-  if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
-    yystate = yytable[yystate];
-  else
-    yystate = yydefgoto[yyn - YYNTOKENS];
+  {
+    const int yylhs = yyr1[yyn] - YYNTOKENS;
+    const int yyi = yypgoto[yylhs] + *yyssp;
+    yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp
+               ? yytable[yyi]
+               : yydefgoto[yylhs]);
+  }
 
   goto yynewstate;
 
@@ -10426,50 +11037,44 @@
 yyerrlab:
   /* Make sure we have latest lookahead translation.  See comments at
      user semantic actions for why this is necessary.  */
-  yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar);
-
+  yytoken = yychar == YYEMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar);
   /* If not already recovering from an error, report this error.  */
   if (!yyerrstatus)
     {
       ++yynerrs;
-#if ! YYERROR_VERBOSE
-      yyerror (pParseContext, YY_("syntax error"));
-#else
-# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \
-                                        yyssp, yytoken)
       {
+        yypcontext_t yyctx
+          = {yyssp, yytoken};
         char const *yymsgp = YY_("syntax error");
         int yysyntax_error_status;
-        yysyntax_error_status = YYSYNTAX_ERROR;
+        yysyntax_error_status = yysyntax_error (&yymsg_alloc, &yymsg, &yyctx);
         if (yysyntax_error_status == 0)
           yymsgp = yymsg;
-        else if (yysyntax_error_status == 1)
+        else if (yysyntax_error_status == -1)
           {
             if (yymsg != yymsgbuf)
               YYSTACK_FREE (yymsg);
-            yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc);
-            if (!yymsg)
+            yymsg = YY_CAST (char *,
+                             YYSTACK_ALLOC (YY_CAST (YYSIZE_T, yymsg_alloc)));
+            if (yymsg)
               {
-                yymsg = yymsgbuf;
-                yymsg_alloc = sizeof yymsgbuf;
-                yysyntax_error_status = 2;
+                yysyntax_error_status
+                  = yysyntax_error (&yymsg_alloc, &yymsg, &yyctx);
+                yymsgp = yymsg;
               }
             else
               {
-                yysyntax_error_status = YYSYNTAX_ERROR;
-                yymsgp = yymsg;
+                yymsg = yymsgbuf;
+                yymsg_alloc = sizeof yymsgbuf;
+                yysyntax_error_status = YYENOMEM;
               }
           }
         yyerror (pParseContext, yymsgp);
-        if (yysyntax_error_status == 2)
+        if (yysyntax_error_status == YYENOMEM)
           goto yyexhaustedlab;
       }
-# undef YYSYNTAX_ERROR
-#endif
     }
 
-
-
   if (yyerrstatus == 3)
     {
       /* If just tried and failed to reuse lookahead token after an
@@ -10498,12 +11103,10 @@
 | yyerrorlab -- error raised explicitly by YYERROR.  |
 `---------------------------------------------------*/
 yyerrorlab:
-
-  /* Pacify compilers like GCC when the user code never invokes
-     YYERROR and the label yyerrorlab therefore never appears in user
-     code.  */
-  if (/*CONSTCOND*/ 0)
-     goto yyerrorlab;
+  /* Pacify compilers when the user code never invokes YYERROR and the
+     label yyerrorlab therefore never appears in user code.  */
+  if (0)
+    YYERROR;
 
   /* Do not reclaim the symbols of the rule whose action triggered
      this YYERROR.  */
@@ -10520,13 +11123,14 @@
 yyerrlab1:
   yyerrstatus = 3;      /* Each real token shifted decrements this.  */
 
+  /* Pop stack until we find a state that shifts the error token.  */
   for (;;)
     {
       yyn = yypact[yystate];
       if (!yypact_value_is_default (yyn))
         {
-          yyn += YYTERROR;
-          if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+          yyn += YYSYMBOL_YYerror;
+          if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYSYMBOL_YYerror)
             {
               yyn = yytable[yyn];
               if (0 < yyn)
@@ -10540,7 +11144,7 @@
 
 
       yydestruct ("Error: popping",
-                  yystos[yystate], yyvsp, pParseContext);
+                  YY_ACCESSING_SYMBOL (yystate), yyvsp, pParseContext);
       YYPOPSTACK (1);
       yystate = *yyssp;
       YY_STACK_PRINT (yyss, yyssp);
@@ -10552,7 +11156,7 @@
 
 
   /* Shift the error token.  */
-  YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
+  YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp);
 
   yystate = yyn;
   goto yynewstate;
@@ -10565,6 +11169,7 @@
   yyresult = 0;
   goto yyreturn;
 
+
 /*-----------------------------------.
 | yyabortlab -- YYABORT comes here.  |
 `-----------------------------------*/
@@ -10572,16 +11177,21 @@
   yyresult = 1;
   goto yyreturn;
 
-#if !defined yyoverflow || YYERROR_VERBOSE
+
+#if 1
 /*-------------------------------------------------.
 | yyexhaustedlab -- memory exhaustion comes here.  |
 `-------------------------------------------------*/
 yyexhaustedlab:
   yyerror (pParseContext, YY_("memory exhausted"));
   yyresult = 2;
-  /* Fall through.  */
+  goto yyreturn;
 #endif
 
+
+/*-------------------------------------------------------.
+| yyreturn -- parsing is finished, clean up and return.  |
+`-------------------------------------------------------*/
 yyreturn:
   if (yychar != YYEMPTY)
     {
@@ -10598,18 +11208,17 @@
   while (yyssp != yyss)
     {
       yydestruct ("Cleanup: popping",
-                  yystos[*yyssp], yyvsp, pParseContext);
+                  YY_ACCESSING_SYMBOL (+*yyssp), yyvsp, pParseContext);
       YYPOPSTACK (1);
     }
 #ifndef yyoverflow
   if (yyss != yyssa)
     YYSTACK_FREE (yyss);
 #endif
-#if YYERROR_VERBOSE
   if (yymsg != yymsgbuf)
     YYSTACK_FREE (yymsg);
-#endif
   return yyresult;
 }
-#line 3906 "MachineIndependent/glslang.y" /* yacc.c:1906  */
+
+#line 4044 "MachineIndependent/glslang.y"
 
diff --git a/third_party/glslang/src/glslang/MachineIndependent/glslang_tab.cpp.h b/third_party/glslang/src/glslang/MachineIndependent/glslang_tab.cpp.h
index 78b72a2..d6bc00d 100644
--- a/third_party/glslang/src/glslang/MachineIndependent/glslang_tab.cpp.h
+++ b/third_party/glslang/src/glslang/MachineIndependent/glslang_tab.cpp.h
@@ -1,8 +1,9 @@
-/* A Bison parser, made by GNU Bison 3.0.4.  */
+/* A Bison parser, made by GNU Bison 3.7.4.  */
 
 /* Bison interface for Yacc-like parsers in C
 
-   Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
+   Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2020 Free Software Foundation,
+   Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -30,6 +31,10 @@
    This special exception was added by the Free Software Foundation in
    version 2.2 of Bison.  */
 
+/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual,
+   especially those whose name start with YY_ or yy_.  They are
+   private implementation details that can be changed or removed.  */
+
 #ifndef YY_YY_MACHINEINDEPENDENT_GLSLANG_TAB_CPP_H_INCLUDED
 # define YY_YY_MACHINEINDEPENDENT_GLSLANG_TAB_CPP_H_INCLUDED
 /* Debug traces.  */
@@ -40,437 +45,466 @@
 extern int yydebug;
 #endif
 
-/* Token type.  */
+/* Token kinds.  */
 #ifndef YYTOKENTYPE
 # define YYTOKENTYPE
   enum yytokentype
   {
-    CONST = 258,
-    BOOL = 259,
-    INT = 260,
-    UINT = 261,
-    FLOAT = 262,
-    BVEC2 = 263,
-    BVEC3 = 264,
-    BVEC4 = 265,
-    IVEC2 = 266,
-    IVEC3 = 267,
-    IVEC4 = 268,
-    UVEC2 = 269,
-    UVEC3 = 270,
-    UVEC4 = 271,
-    VEC2 = 272,
-    VEC3 = 273,
-    VEC4 = 274,
-    MAT2 = 275,
-    MAT3 = 276,
-    MAT4 = 277,
-    MAT2X2 = 278,
-    MAT2X3 = 279,
-    MAT2X4 = 280,
-    MAT3X2 = 281,
-    MAT3X3 = 282,
-    MAT3X4 = 283,
-    MAT4X2 = 284,
-    MAT4X3 = 285,
-    MAT4X4 = 286,
-    SAMPLER2D = 287,
-    SAMPLER3D = 288,
-    SAMPLERCUBE = 289,
-    SAMPLER2DSHADOW = 290,
-    SAMPLERCUBESHADOW = 291,
-    SAMPLER2DARRAY = 292,
-    SAMPLER2DARRAYSHADOW = 293,
-    ISAMPLER2D = 294,
-    ISAMPLER3D = 295,
-    ISAMPLERCUBE = 296,
-    ISAMPLER2DARRAY = 297,
-    USAMPLER2D = 298,
-    USAMPLER3D = 299,
-    USAMPLERCUBE = 300,
-    USAMPLER2DARRAY = 301,
-    SAMPLER = 302,
-    SAMPLERSHADOW = 303,
-    TEXTURE2D = 304,
-    TEXTURE3D = 305,
-    TEXTURECUBE = 306,
-    TEXTURE2DARRAY = 307,
-    ITEXTURE2D = 308,
-    ITEXTURE3D = 309,
-    ITEXTURECUBE = 310,
-    ITEXTURE2DARRAY = 311,
-    UTEXTURE2D = 312,
-    UTEXTURE3D = 313,
-    UTEXTURECUBE = 314,
-    UTEXTURE2DARRAY = 315,
-    ATTRIBUTE = 316,
-    VARYING = 317,
-    FLOAT16_T = 318,
-    FLOAT32_T = 319,
-    DOUBLE = 320,
-    FLOAT64_T = 321,
-    INT64_T = 322,
-    UINT64_T = 323,
-    INT32_T = 324,
-    UINT32_T = 325,
-    INT16_T = 326,
-    UINT16_T = 327,
-    INT8_T = 328,
-    UINT8_T = 329,
-    I64VEC2 = 330,
-    I64VEC3 = 331,
-    I64VEC4 = 332,
-    U64VEC2 = 333,
-    U64VEC3 = 334,
-    U64VEC4 = 335,
-    I32VEC2 = 336,
-    I32VEC3 = 337,
-    I32VEC4 = 338,
-    U32VEC2 = 339,
-    U32VEC3 = 340,
-    U32VEC4 = 341,
-    I16VEC2 = 342,
-    I16VEC3 = 343,
-    I16VEC4 = 344,
-    U16VEC2 = 345,
-    U16VEC3 = 346,
-    U16VEC4 = 347,
-    I8VEC2 = 348,
-    I8VEC3 = 349,
-    I8VEC4 = 350,
-    U8VEC2 = 351,
-    U8VEC3 = 352,
-    U8VEC4 = 353,
-    DVEC2 = 354,
-    DVEC3 = 355,
-    DVEC4 = 356,
-    DMAT2 = 357,
-    DMAT3 = 358,
-    DMAT4 = 359,
-    F16VEC2 = 360,
-    F16VEC3 = 361,
-    F16VEC4 = 362,
-    F16MAT2 = 363,
-    F16MAT3 = 364,
-    F16MAT4 = 365,
-    F32VEC2 = 366,
-    F32VEC3 = 367,
-    F32VEC4 = 368,
-    F32MAT2 = 369,
-    F32MAT3 = 370,
-    F32MAT4 = 371,
-    F64VEC2 = 372,
-    F64VEC3 = 373,
-    F64VEC4 = 374,
-    F64MAT2 = 375,
-    F64MAT3 = 376,
-    F64MAT4 = 377,
-    DMAT2X2 = 378,
-    DMAT2X3 = 379,
-    DMAT2X4 = 380,
-    DMAT3X2 = 381,
-    DMAT3X3 = 382,
-    DMAT3X4 = 383,
-    DMAT4X2 = 384,
-    DMAT4X3 = 385,
-    DMAT4X4 = 386,
-    F16MAT2X2 = 387,
-    F16MAT2X3 = 388,
-    F16MAT2X4 = 389,
-    F16MAT3X2 = 390,
-    F16MAT3X3 = 391,
-    F16MAT3X4 = 392,
-    F16MAT4X2 = 393,
-    F16MAT4X3 = 394,
-    F16MAT4X4 = 395,
-    F32MAT2X2 = 396,
-    F32MAT2X3 = 397,
-    F32MAT2X4 = 398,
-    F32MAT3X2 = 399,
-    F32MAT3X3 = 400,
-    F32MAT3X4 = 401,
-    F32MAT4X2 = 402,
-    F32MAT4X3 = 403,
-    F32MAT4X4 = 404,
-    F64MAT2X2 = 405,
-    F64MAT2X3 = 406,
-    F64MAT2X4 = 407,
-    F64MAT3X2 = 408,
-    F64MAT3X3 = 409,
-    F64MAT3X4 = 410,
-    F64MAT4X2 = 411,
-    F64MAT4X3 = 412,
-    F64MAT4X4 = 413,
-    ATOMIC_UINT = 414,
-    ACCSTRUCTNV = 415,
-    ACCSTRUCTEXT = 416,
-    RAYQUERYEXT = 417,
-    FCOOPMATNV = 418,
-    ICOOPMATNV = 419,
-    UCOOPMATNV = 420,
-    SAMPLERCUBEARRAY = 421,
-    SAMPLERCUBEARRAYSHADOW = 422,
-    ISAMPLERCUBEARRAY = 423,
-    USAMPLERCUBEARRAY = 424,
-    SAMPLER1D = 425,
-    SAMPLER1DARRAY = 426,
-    SAMPLER1DARRAYSHADOW = 427,
-    ISAMPLER1D = 428,
-    SAMPLER1DSHADOW = 429,
-    SAMPLER2DRECT = 430,
-    SAMPLER2DRECTSHADOW = 431,
-    ISAMPLER2DRECT = 432,
-    USAMPLER2DRECT = 433,
-    SAMPLERBUFFER = 434,
-    ISAMPLERBUFFER = 435,
-    USAMPLERBUFFER = 436,
-    SAMPLER2DMS = 437,
-    ISAMPLER2DMS = 438,
-    USAMPLER2DMS = 439,
-    SAMPLER2DMSARRAY = 440,
-    ISAMPLER2DMSARRAY = 441,
-    USAMPLER2DMSARRAY = 442,
-    SAMPLEREXTERNALOES = 443,
-    SAMPLEREXTERNAL2DY2YEXT = 444,
-    ISAMPLER1DARRAY = 445,
-    USAMPLER1D = 446,
-    USAMPLER1DARRAY = 447,
-    F16SAMPLER1D = 448,
-    F16SAMPLER2D = 449,
-    F16SAMPLER3D = 450,
-    F16SAMPLER2DRECT = 451,
-    F16SAMPLERCUBE = 452,
-    F16SAMPLER1DARRAY = 453,
-    F16SAMPLER2DARRAY = 454,
-    F16SAMPLERCUBEARRAY = 455,
-    F16SAMPLERBUFFER = 456,
-    F16SAMPLER2DMS = 457,
-    F16SAMPLER2DMSARRAY = 458,
-    F16SAMPLER1DSHADOW = 459,
-    F16SAMPLER2DSHADOW = 460,
-    F16SAMPLER1DARRAYSHADOW = 461,
-    F16SAMPLER2DARRAYSHADOW = 462,
-    F16SAMPLER2DRECTSHADOW = 463,
-    F16SAMPLERCUBESHADOW = 464,
-    F16SAMPLERCUBEARRAYSHADOW = 465,
-    IMAGE1D = 466,
-    IIMAGE1D = 467,
-    UIMAGE1D = 468,
-    IMAGE2D = 469,
-    IIMAGE2D = 470,
-    UIMAGE2D = 471,
-    IMAGE3D = 472,
-    IIMAGE3D = 473,
-    UIMAGE3D = 474,
-    IMAGE2DRECT = 475,
-    IIMAGE2DRECT = 476,
-    UIMAGE2DRECT = 477,
-    IMAGECUBE = 478,
-    IIMAGECUBE = 479,
-    UIMAGECUBE = 480,
-    IMAGEBUFFER = 481,
-    IIMAGEBUFFER = 482,
-    UIMAGEBUFFER = 483,
-    IMAGE1DARRAY = 484,
-    IIMAGE1DARRAY = 485,
-    UIMAGE1DARRAY = 486,
-    IMAGE2DARRAY = 487,
-    IIMAGE2DARRAY = 488,
-    UIMAGE2DARRAY = 489,
-    IMAGECUBEARRAY = 490,
-    IIMAGECUBEARRAY = 491,
-    UIMAGECUBEARRAY = 492,
-    IMAGE2DMS = 493,
-    IIMAGE2DMS = 494,
-    UIMAGE2DMS = 495,
-    IMAGE2DMSARRAY = 496,
-    IIMAGE2DMSARRAY = 497,
-    UIMAGE2DMSARRAY = 498,
-    F16IMAGE1D = 499,
-    F16IMAGE2D = 500,
-    F16IMAGE3D = 501,
-    F16IMAGE2DRECT = 502,
-    F16IMAGECUBE = 503,
-    F16IMAGE1DARRAY = 504,
-    F16IMAGE2DARRAY = 505,
-    F16IMAGECUBEARRAY = 506,
-    F16IMAGEBUFFER = 507,
-    F16IMAGE2DMS = 508,
-    F16IMAGE2DMSARRAY = 509,
-    TEXTURECUBEARRAY = 510,
-    ITEXTURECUBEARRAY = 511,
-    UTEXTURECUBEARRAY = 512,
-    TEXTURE1D = 513,
-    ITEXTURE1D = 514,
-    UTEXTURE1D = 515,
-    TEXTURE1DARRAY = 516,
-    ITEXTURE1DARRAY = 517,
-    UTEXTURE1DARRAY = 518,
-    TEXTURE2DRECT = 519,
-    ITEXTURE2DRECT = 520,
-    UTEXTURE2DRECT = 521,
-    TEXTUREBUFFER = 522,
-    ITEXTUREBUFFER = 523,
-    UTEXTUREBUFFER = 524,
-    TEXTURE2DMS = 525,
-    ITEXTURE2DMS = 526,
-    UTEXTURE2DMS = 527,
-    TEXTURE2DMSARRAY = 528,
-    ITEXTURE2DMSARRAY = 529,
-    UTEXTURE2DMSARRAY = 530,
-    F16TEXTURE1D = 531,
-    F16TEXTURE2D = 532,
-    F16TEXTURE3D = 533,
-    F16TEXTURE2DRECT = 534,
-    F16TEXTURECUBE = 535,
-    F16TEXTURE1DARRAY = 536,
-    F16TEXTURE2DARRAY = 537,
-    F16TEXTURECUBEARRAY = 538,
-    F16TEXTUREBUFFER = 539,
-    F16TEXTURE2DMS = 540,
-    F16TEXTURE2DMSARRAY = 541,
-    SUBPASSINPUT = 542,
-    SUBPASSINPUTMS = 543,
-    ISUBPASSINPUT = 544,
-    ISUBPASSINPUTMS = 545,
-    USUBPASSINPUT = 546,
-    USUBPASSINPUTMS = 547,
-    F16SUBPASSINPUT = 548,
-    F16SUBPASSINPUTMS = 549,
-    LEFT_OP = 550,
-    RIGHT_OP = 551,
-    INC_OP = 552,
-    DEC_OP = 553,
-    LE_OP = 554,
-    GE_OP = 555,
-    EQ_OP = 556,
-    NE_OP = 557,
-    AND_OP = 558,
-    OR_OP = 559,
-    XOR_OP = 560,
-    MUL_ASSIGN = 561,
-    DIV_ASSIGN = 562,
-    ADD_ASSIGN = 563,
-    MOD_ASSIGN = 564,
-    LEFT_ASSIGN = 565,
-    RIGHT_ASSIGN = 566,
-    AND_ASSIGN = 567,
-    XOR_ASSIGN = 568,
-    OR_ASSIGN = 569,
-    SUB_ASSIGN = 570,
-    STRING_LITERAL = 571,
-    LEFT_PAREN = 572,
-    RIGHT_PAREN = 573,
-    LEFT_BRACKET = 574,
-    RIGHT_BRACKET = 575,
-    LEFT_BRACE = 576,
-    RIGHT_BRACE = 577,
-    DOT = 578,
-    COMMA = 579,
-    COLON = 580,
-    EQUAL = 581,
-    SEMICOLON = 582,
-    BANG = 583,
-    DASH = 584,
-    TILDE = 585,
-    PLUS = 586,
-    STAR = 587,
-    SLASH = 588,
-    PERCENT = 589,
-    LEFT_ANGLE = 590,
-    RIGHT_ANGLE = 591,
-    VERTICAL_BAR = 592,
-    CARET = 593,
-    AMPERSAND = 594,
-    QUESTION = 595,
-    INVARIANT = 596,
-    HIGH_PRECISION = 597,
-    MEDIUM_PRECISION = 598,
-    LOW_PRECISION = 599,
-    PRECISION = 600,
-    PACKED = 601,
-    RESOURCE = 602,
-    SUPERP = 603,
-    FLOATCONSTANT = 604,
-    INTCONSTANT = 605,
-    UINTCONSTANT = 606,
-    BOOLCONSTANT = 607,
-    IDENTIFIER = 608,
-    TYPE_NAME = 609,
-    CENTROID = 610,
-    IN = 611,
-    OUT = 612,
-    INOUT = 613,
-    STRUCT = 614,
-    VOID = 615,
-    WHILE = 616,
-    BREAK = 617,
-    CONTINUE = 618,
-    DO = 619,
-    ELSE = 620,
-    FOR = 621,
-    IF = 622,
-    DISCARD = 623,
-    RETURN = 624,
-    SWITCH = 625,
-    CASE = 626,
-    DEFAULT = 627,
-    UNIFORM = 628,
-    SHARED = 629,
-    BUFFER = 630,
-    FLAT = 631,
-    SMOOTH = 632,
-    LAYOUT = 633,
-    DOUBLECONSTANT = 634,
-    INT16CONSTANT = 635,
-    UINT16CONSTANT = 636,
-    FLOAT16CONSTANT = 637,
-    INT32CONSTANT = 638,
-    UINT32CONSTANT = 639,
-    INT64CONSTANT = 640,
-    UINT64CONSTANT = 641,
-    SUBROUTINE = 642,
-    DEMOTE = 643,
-    PAYLOADNV = 644,
-    PAYLOADINNV = 645,
-    HITATTRNV = 646,
-    CALLDATANV = 647,
-    CALLDATAINNV = 648,
-    PAYLOADEXT = 649,
-    PAYLOADINEXT = 650,
-    HITATTREXT = 651,
-    CALLDATAEXT = 652,
-    CALLDATAINEXT = 653,
-    PATCH = 654,
-    SAMPLE = 655,
-    NONUNIFORM = 656,
-    COHERENT = 657,
-    VOLATILE = 658,
-    RESTRICT = 659,
-    READONLY = 660,
-    WRITEONLY = 661,
-    DEVICECOHERENT = 662,
-    QUEUEFAMILYCOHERENT = 663,
-    WORKGROUPCOHERENT = 664,
-    SUBGROUPCOHERENT = 665,
-    NONPRIVATE = 666,
-    SHADERCALLCOHERENT = 667,
-    NOPERSPECTIVE = 668,
-    EXPLICITINTERPAMD = 669,
-    PERVERTEXNV = 670,
-    PERPRIMITIVENV = 671,
-    PERVIEWNV = 672,
-    PERTASKNV = 673,
-    PRECISE = 674
+    YYEMPTY = -2,
+    YYEOF = 0,                     /* "end of file"  */
+    YYerror = 256,                 /* error  */
+    YYUNDEF = 257,                 /* "invalid token"  */
+    CONST = 258,                   /* CONST  */
+    BOOL = 259,                    /* BOOL  */
+    INT = 260,                     /* INT  */
+    UINT = 261,                    /* UINT  */
+    FLOAT = 262,                   /* FLOAT  */
+    BVEC2 = 263,                   /* BVEC2  */
+    BVEC3 = 264,                   /* BVEC3  */
+    BVEC4 = 265,                   /* BVEC4  */
+    IVEC2 = 266,                   /* IVEC2  */
+    IVEC3 = 267,                   /* IVEC3  */
+    IVEC4 = 268,                   /* IVEC4  */
+    UVEC2 = 269,                   /* UVEC2  */
+    UVEC3 = 270,                   /* UVEC3  */
+    UVEC4 = 271,                   /* UVEC4  */
+    VEC2 = 272,                    /* VEC2  */
+    VEC3 = 273,                    /* VEC3  */
+    VEC4 = 274,                    /* VEC4  */
+    MAT2 = 275,                    /* MAT2  */
+    MAT3 = 276,                    /* MAT3  */
+    MAT4 = 277,                    /* MAT4  */
+    MAT2X2 = 278,                  /* MAT2X2  */
+    MAT2X3 = 279,                  /* MAT2X3  */
+    MAT2X4 = 280,                  /* MAT2X4  */
+    MAT3X2 = 281,                  /* MAT3X2  */
+    MAT3X3 = 282,                  /* MAT3X3  */
+    MAT3X4 = 283,                  /* MAT3X4  */
+    MAT4X2 = 284,                  /* MAT4X2  */
+    MAT4X3 = 285,                  /* MAT4X3  */
+    MAT4X4 = 286,                  /* MAT4X4  */
+    SAMPLER2D = 287,               /* SAMPLER2D  */
+    SAMPLER3D = 288,               /* SAMPLER3D  */
+    SAMPLERCUBE = 289,             /* SAMPLERCUBE  */
+    SAMPLER2DSHADOW = 290,         /* SAMPLER2DSHADOW  */
+    SAMPLERCUBESHADOW = 291,       /* SAMPLERCUBESHADOW  */
+    SAMPLER2DARRAY = 292,          /* SAMPLER2DARRAY  */
+    SAMPLER2DARRAYSHADOW = 293,    /* SAMPLER2DARRAYSHADOW  */
+    ISAMPLER2D = 294,              /* ISAMPLER2D  */
+    ISAMPLER3D = 295,              /* ISAMPLER3D  */
+    ISAMPLERCUBE = 296,            /* ISAMPLERCUBE  */
+    ISAMPLER2DARRAY = 297,         /* ISAMPLER2DARRAY  */
+    USAMPLER2D = 298,              /* USAMPLER2D  */
+    USAMPLER3D = 299,              /* USAMPLER3D  */
+    USAMPLERCUBE = 300,            /* USAMPLERCUBE  */
+    USAMPLER2DARRAY = 301,         /* USAMPLER2DARRAY  */
+    SAMPLER = 302,                 /* SAMPLER  */
+    SAMPLERSHADOW = 303,           /* SAMPLERSHADOW  */
+    TEXTURE2D = 304,               /* TEXTURE2D  */
+    TEXTURE3D = 305,               /* TEXTURE3D  */
+    TEXTURECUBE = 306,             /* TEXTURECUBE  */
+    TEXTURE2DARRAY = 307,          /* TEXTURE2DARRAY  */
+    ITEXTURE2D = 308,              /* ITEXTURE2D  */
+    ITEXTURE3D = 309,              /* ITEXTURE3D  */
+    ITEXTURECUBE = 310,            /* ITEXTURECUBE  */
+    ITEXTURE2DARRAY = 311,         /* ITEXTURE2DARRAY  */
+    UTEXTURE2D = 312,              /* UTEXTURE2D  */
+    UTEXTURE3D = 313,              /* UTEXTURE3D  */
+    UTEXTURECUBE = 314,            /* UTEXTURECUBE  */
+    UTEXTURE2DARRAY = 315,         /* UTEXTURE2DARRAY  */
+    ATTRIBUTE = 316,               /* ATTRIBUTE  */
+    VARYING = 317,                 /* VARYING  */
+    FLOAT16_T = 318,               /* FLOAT16_T  */
+    FLOAT32_T = 319,               /* FLOAT32_T  */
+    DOUBLE = 320,                  /* DOUBLE  */
+    FLOAT64_T = 321,               /* FLOAT64_T  */
+    INT64_T = 322,                 /* INT64_T  */
+    UINT64_T = 323,                /* UINT64_T  */
+    INT32_T = 324,                 /* INT32_T  */
+    UINT32_T = 325,                /* UINT32_T  */
+    INT16_T = 326,                 /* INT16_T  */
+    UINT16_T = 327,                /* UINT16_T  */
+    INT8_T = 328,                  /* INT8_T  */
+    UINT8_T = 329,                 /* UINT8_T  */
+    I64VEC2 = 330,                 /* I64VEC2  */
+    I64VEC3 = 331,                 /* I64VEC3  */
+    I64VEC4 = 332,                 /* I64VEC4  */
+    U64VEC2 = 333,                 /* U64VEC2  */
+    U64VEC3 = 334,                 /* U64VEC3  */
+    U64VEC4 = 335,                 /* U64VEC4  */
+    I32VEC2 = 336,                 /* I32VEC2  */
+    I32VEC3 = 337,                 /* I32VEC3  */
+    I32VEC4 = 338,                 /* I32VEC4  */
+    U32VEC2 = 339,                 /* U32VEC2  */
+    U32VEC3 = 340,                 /* U32VEC3  */
+    U32VEC4 = 341,                 /* U32VEC4  */
+    I16VEC2 = 342,                 /* I16VEC2  */
+    I16VEC3 = 343,                 /* I16VEC3  */
+    I16VEC4 = 344,                 /* I16VEC4  */
+    U16VEC2 = 345,                 /* U16VEC2  */
+    U16VEC3 = 346,                 /* U16VEC3  */
+    U16VEC4 = 347,                 /* U16VEC4  */
+    I8VEC2 = 348,                  /* I8VEC2  */
+    I8VEC3 = 349,                  /* I8VEC3  */
+    I8VEC4 = 350,                  /* I8VEC4  */
+    U8VEC2 = 351,                  /* U8VEC2  */
+    U8VEC3 = 352,                  /* U8VEC3  */
+    U8VEC4 = 353,                  /* U8VEC4  */
+    DVEC2 = 354,                   /* DVEC2  */
+    DVEC3 = 355,                   /* DVEC3  */
+    DVEC4 = 356,                   /* DVEC4  */
+    DMAT2 = 357,                   /* DMAT2  */
+    DMAT3 = 358,                   /* DMAT3  */
+    DMAT4 = 359,                   /* DMAT4  */
+    F16VEC2 = 360,                 /* F16VEC2  */
+    F16VEC3 = 361,                 /* F16VEC3  */
+    F16VEC4 = 362,                 /* F16VEC4  */
+    F16MAT2 = 363,                 /* F16MAT2  */
+    F16MAT3 = 364,                 /* F16MAT3  */
+    F16MAT4 = 365,                 /* F16MAT4  */
+    F32VEC2 = 366,                 /* F32VEC2  */
+    F32VEC3 = 367,                 /* F32VEC3  */
+    F32VEC4 = 368,                 /* F32VEC4  */
+    F32MAT2 = 369,                 /* F32MAT2  */
+    F32MAT3 = 370,                 /* F32MAT3  */
+    F32MAT4 = 371,                 /* F32MAT4  */
+    F64VEC2 = 372,                 /* F64VEC2  */
+    F64VEC3 = 373,                 /* F64VEC3  */
+    F64VEC4 = 374,                 /* F64VEC4  */
+    F64MAT2 = 375,                 /* F64MAT2  */
+    F64MAT3 = 376,                 /* F64MAT3  */
+    F64MAT4 = 377,                 /* F64MAT4  */
+    DMAT2X2 = 378,                 /* DMAT2X2  */
+    DMAT2X3 = 379,                 /* DMAT2X3  */
+    DMAT2X4 = 380,                 /* DMAT2X4  */
+    DMAT3X2 = 381,                 /* DMAT3X2  */
+    DMAT3X3 = 382,                 /* DMAT3X3  */
+    DMAT3X4 = 383,                 /* DMAT3X4  */
+    DMAT4X2 = 384,                 /* DMAT4X2  */
+    DMAT4X3 = 385,                 /* DMAT4X3  */
+    DMAT4X4 = 386,                 /* DMAT4X4  */
+    F16MAT2X2 = 387,               /* F16MAT2X2  */
+    F16MAT2X3 = 388,               /* F16MAT2X3  */
+    F16MAT2X4 = 389,               /* F16MAT2X4  */
+    F16MAT3X2 = 390,               /* F16MAT3X2  */
+    F16MAT3X3 = 391,               /* F16MAT3X3  */
+    F16MAT3X4 = 392,               /* F16MAT3X4  */
+    F16MAT4X2 = 393,               /* F16MAT4X2  */
+    F16MAT4X3 = 394,               /* F16MAT4X3  */
+    F16MAT4X4 = 395,               /* F16MAT4X4  */
+    F32MAT2X2 = 396,               /* F32MAT2X2  */
+    F32MAT2X3 = 397,               /* F32MAT2X3  */
+    F32MAT2X4 = 398,               /* F32MAT2X4  */
+    F32MAT3X2 = 399,               /* F32MAT3X2  */
+    F32MAT3X3 = 400,               /* F32MAT3X3  */
+    F32MAT3X4 = 401,               /* F32MAT3X4  */
+    F32MAT4X2 = 402,               /* F32MAT4X2  */
+    F32MAT4X3 = 403,               /* F32MAT4X3  */
+    F32MAT4X4 = 404,               /* F32MAT4X4  */
+    F64MAT2X2 = 405,               /* F64MAT2X2  */
+    F64MAT2X3 = 406,               /* F64MAT2X3  */
+    F64MAT2X4 = 407,               /* F64MAT2X4  */
+    F64MAT3X2 = 408,               /* F64MAT3X2  */
+    F64MAT3X3 = 409,               /* F64MAT3X3  */
+    F64MAT3X4 = 410,               /* F64MAT3X4  */
+    F64MAT4X2 = 411,               /* F64MAT4X2  */
+    F64MAT4X3 = 412,               /* F64MAT4X3  */
+    F64MAT4X4 = 413,               /* F64MAT4X4  */
+    ATOMIC_UINT = 414,             /* ATOMIC_UINT  */
+    ACCSTRUCTNV = 415,             /* ACCSTRUCTNV  */
+    ACCSTRUCTEXT = 416,            /* ACCSTRUCTEXT  */
+    RAYQUERYEXT = 417,             /* RAYQUERYEXT  */
+    FCOOPMATNV = 418,              /* FCOOPMATNV  */
+    ICOOPMATNV = 419,              /* ICOOPMATNV  */
+    UCOOPMATNV = 420,              /* UCOOPMATNV  */
+    SAMPLERCUBEARRAY = 421,        /* SAMPLERCUBEARRAY  */
+    SAMPLERCUBEARRAYSHADOW = 422,  /* SAMPLERCUBEARRAYSHADOW  */
+    ISAMPLERCUBEARRAY = 423,       /* ISAMPLERCUBEARRAY  */
+    USAMPLERCUBEARRAY = 424,       /* USAMPLERCUBEARRAY  */
+    SAMPLER1D = 425,               /* SAMPLER1D  */
+    SAMPLER1DARRAY = 426,          /* SAMPLER1DARRAY  */
+    SAMPLER1DARRAYSHADOW = 427,    /* SAMPLER1DARRAYSHADOW  */
+    ISAMPLER1D = 428,              /* ISAMPLER1D  */
+    SAMPLER1DSHADOW = 429,         /* SAMPLER1DSHADOW  */
+    SAMPLER2DRECT = 430,           /* SAMPLER2DRECT  */
+    SAMPLER2DRECTSHADOW = 431,     /* SAMPLER2DRECTSHADOW  */
+    ISAMPLER2DRECT = 432,          /* ISAMPLER2DRECT  */
+    USAMPLER2DRECT = 433,          /* USAMPLER2DRECT  */
+    SAMPLERBUFFER = 434,           /* SAMPLERBUFFER  */
+    ISAMPLERBUFFER = 435,          /* ISAMPLERBUFFER  */
+    USAMPLERBUFFER = 436,          /* USAMPLERBUFFER  */
+    SAMPLER2DMS = 437,             /* SAMPLER2DMS  */
+    ISAMPLER2DMS = 438,            /* ISAMPLER2DMS  */
+    USAMPLER2DMS = 439,            /* USAMPLER2DMS  */
+    SAMPLER2DMSARRAY = 440,        /* SAMPLER2DMSARRAY  */
+    ISAMPLER2DMSARRAY = 441,       /* ISAMPLER2DMSARRAY  */
+    USAMPLER2DMSARRAY = 442,       /* USAMPLER2DMSARRAY  */
+    SAMPLEREXTERNALOES = 443,      /* SAMPLEREXTERNALOES  */
+    SAMPLEREXTERNAL2DY2YEXT = 444, /* SAMPLEREXTERNAL2DY2YEXT  */
+    ISAMPLER1DARRAY = 445,         /* ISAMPLER1DARRAY  */
+    USAMPLER1D = 446,              /* USAMPLER1D  */
+    USAMPLER1DARRAY = 447,         /* USAMPLER1DARRAY  */
+    F16SAMPLER1D = 448,            /* F16SAMPLER1D  */
+    F16SAMPLER2D = 449,            /* F16SAMPLER2D  */
+    F16SAMPLER3D = 450,            /* F16SAMPLER3D  */
+    F16SAMPLER2DRECT = 451,        /* F16SAMPLER2DRECT  */
+    F16SAMPLERCUBE = 452,          /* F16SAMPLERCUBE  */
+    F16SAMPLER1DARRAY = 453,       /* F16SAMPLER1DARRAY  */
+    F16SAMPLER2DARRAY = 454,       /* F16SAMPLER2DARRAY  */
+    F16SAMPLERCUBEARRAY = 455,     /* F16SAMPLERCUBEARRAY  */
+    F16SAMPLERBUFFER = 456,        /* F16SAMPLERBUFFER  */
+    F16SAMPLER2DMS = 457,          /* F16SAMPLER2DMS  */
+    F16SAMPLER2DMSARRAY = 458,     /* F16SAMPLER2DMSARRAY  */
+    F16SAMPLER1DSHADOW = 459,      /* F16SAMPLER1DSHADOW  */
+    F16SAMPLER2DSHADOW = 460,      /* F16SAMPLER2DSHADOW  */
+    F16SAMPLER1DARRAYSHADOW = 461, /* F16SAMPLER1DARRAYSHADOW  */
+    F16SAMPLER2DARRAYSHADOW = 462, /* F16SAMPLER2DARRAYSHADOW  */
+    F16SAMPLER2DRECTSHADOW = 463,  /* F16SAMPLER2DRECTSHADOW  */
+    F16SAMPLERCUBESHADOW = 464,    /* F16SAMPLERCUBESHADOW  */
+    F16SAMPLERCUBEARRAYSHADOW = 465, /* F16SAMPLERCUBEARRAYSHADOW  */
+    IMAGE1D = 466,                 /* IMAGE1D  */
+    IIMAGE1D = 467,                /* IIMAGE1D  */
+    UIMAGE1D = 468,                /* UIMAGE1D  */
+    IMAGE2D = 469,                 /* IMAGE2D  */
+    IIMAGE2D = 470,                /* IIMAGE2D  */
+    UIMAGE2D = 471,                /* UIMAGE2D  */
+    IMAGE3D = 472,                 /* IMAGE3D  */
+    IIMAGE3D = 473,                /* IIMAGE3D  */
+    UIMAGE3D = 474,                /* UIMAGE3D  */
+    IMAGE2DRECT = 475,             /* IMAGE2DRECT  */
+    IIMAGE2DRECT = 476,            /* IIMAGE2DRECT  */
+    UIMAGE2DRECT = 477,            /* UIMAGE2DRECT  */
+    IMAGECUBE = 478,               /* IMAGECUBE  */
+    IIMAGECUBE = 479,              /* IIMAGECUBE  */
+    UIMAGECUBE = 480,              /* UIMAGECUBE  */
+    IMAGEBUFFER = 481,             /* IMAGEBUFFER  */
+    IIMAGEBUFFER = 482,            /* IIMAGEBUFFER  */
+    UIMAGEBUFFER = 483,            /* UIMAGEBUFFER  */
+    IMAGE1DARRAY = 484,            /* IMAGE1DARRAY  */
+    IIMAGE1DARRAY = 485,           /* IIMAGE1DARRAY  */
+    UIMAGE1DARRAY = 486,           /* UIMAGE1DARRAY  */
+    IMAGE2DARRAY = 487,            /* IMAGE2DARRAY  */
+    IIMAGE2DARRAY = 488,           /* IIMAGE2DARRAY  */
+    UIMAGE2DARRAY = 489,           /* UIMAGE2DARRAY  */
+    IMAGECUBEARRAY = 490,          /* IMAGECUBEARRAY  */
+    IIMAGECUBEARRAY = 491,         /* IIMAGECUBEARRAY  */
+    UIMAGECUBEARRAY = 492,         /* UIMAGECUBEARRAY  */
+    IMAGE2DMS = 493,               /* IMAGE2DMS  */
+    IIMAGE2DMS = 494,              /* IIMAGE2DMS  */
+    UIMAGE2DMS = 495,              /* UIMAGE2DMS  */
+    IMAGE2DMSARRAY = 496,          /* IMAGE2DMSARRAY  */
+    IIMAGE2DMSARRAY = 497,         /* IIMAGE2DMSARRAY  */
+    UIMAGE2DMSARRAY = 498,         /* UIMAGE2DMSARRAY  */
+    F16IMAGE1D = 499,              /* F16IMAGE1D  */
+    F16IMAGE2D = 500,              /* F16IMAGE2D  */
+    F16IMAGE3D = 501,              /* F16IMAGE3D  */
+    F16IMAGE2DRECT = 502,          /* F16IMAGE2DRECT  */
+    F16IMAGECUBE = 503,            /* F16IMAGECUBE  */
+    F16IMAGE1DARRAY = 504,         /* F16IMAGE1DARRAY  */
+    F16IMAGE2DARRAY = 505,         /* F16IMAGE2DARRAY  */
+    F16IMAGECUBEARRAY = 506,       /* F16IMAGECUBEARRAY  */
+    F16IMAGEBUFFER = 507,          /* F16IMAGEBUFFER  */
+    F16IMAGE2DMS = 508,            /* F16IMAGE2DMS  */
+    F16IMAGE2DMSARRAY = 509,       /* F16IMAGE2DMSARRAY  */
+    I64IMAGE1D = 510,              /* I64IMAGE1D  */
+    U64IMAGE1D = 511,              /* U64IMAGE1D  */
+    I64IMAGE2D = 512,              /* I64IMAGE2D  */
+    U64IMAGE2D = 513,              /* U64IMAGE2D  */
+    I64IMAGE3D = 514,              /* I64IMAGE3D  */
+    U64IMAGE3D = 515,              /* U64IMAGE3D  */
+    I64IMAGE2DRECT = 516,          /* I64IMAGE2DRECT  */
+    U64IMAGE2DRECT = 517,          /* U64IMAGE2DRECT  */
+    I64IMAGECUBE = 518,            /* I64IMAGECUBE  */
+    U64IMAGECUBE = 519,            /* U64IMAGECUBE  */
+    I64IMAGEBUFFER = 520,          /* I64IMAGEBUFFER  */
+    U64IMAGEBUFFER = 521,          /* U64IMAGEBUFFER  */
+    I64IMAGE1DARRAY = 522,         /* I64IMAGE1DARRAY  */
+    U64IMAGE1DARRAY = 523,         /* U64IMAGE1DARRAY  */
+    I64IMAGE2DARRAY = 524,         /* I64IMAGE2DARRAY  */
+    U64IMAGE2DARRAY = 525,         /* U64IMAGE2DARRAY  */
+    I64IMAGECUBEARRAY = 526,       /* I64IMAGECUBEARRAY  */
+    U64IMAGECUBEARRAY = 527,       /* U64IMAGECUBEARRAY  */
+    I64IMAGE2DMS = 528,            /* I64IMAGE2DMS  */
+    U64IMAGE2DMS = 529,            /* U64IMAGE2DMS  */
+    I64IMAGE2DMSARRAY = 530,       /* I64IMAGE2DMSARRAY  */
+    U64IMAGE2DMSARRAY = 531,       /* U64IMAGE2DMSARRAY  */
+    TEXTURECUBEARRAY = 532,        /* TEXTURECUBEARRAY  */
+    ITEXTURECUBEARRAY = 533,       /* ITEXTURECUBEARRAY  */
+    UTEXTURECUBEARRAY = 534,       /* UTEXTURECUBEARRAY  */
+    TEXTURE1D = 535,               /* TEXTURE1D  */
+    ITEXTURE1D = 536,              /* ITEXTURE1D  */
+    UTEXTURE1D = 537,              /* UTEXTURE1D  */
+    TEXTURE1DARRAY = 538,          /* TEXTURE1DARRAY  */
+    ITEXTURE1DARRAY = 539,         /* ITEXTURE1DARRAY  */
+    UTEXTURE1DARRAY = 540,         /* UTEXTURE1DARRAY  */
+    TEXTURE2DRECT = 541,           /* TEXTURE2DRECT  */
+    ITEXTURE2DRECT = 542,          /* ITEXTURE2DRECT  */
+    UTEXTURE2DRECT = 543,          /* UTEXTURE2DRECT  */
+    TEXTUREBUFFER = 544,           /* TEXTUREBUFFER  */
+    ITEXTUREBUFFER = 545,          /* ITEXTUREBUFFER  */
+    UTEXTUREBUFFER = 546,          /* UTEXTUREBUFFER  */
+    TEXTURE2DMS = 547,             /* TEXTURE2DMS  */
+    ITEXTURE2DMS = 548,            /* ITEXTURE2DMS  */
+    UTEXTURE2DMS = 549,            /* UTEXTURE2DMS  */
+    TEXTURE2DMSARRAY = 550,        /* TEXTURE2DMSARRAY  */
+    ITEXTURE2DMSARRAY = 551,       /* ITEXTURE2DMSARRAY  */
+    UTEXTURE2DMSARRAY = 552,       /* UTEXTURE2DMSARRAY  */
+    F16TEXTURE1D = 553,            /* F16TEXTURE1D  */
+    F16TEXTURE2D = 554,            /* F16TEXTURE2D  */
+    F16TEXTURE3D = 555,            /* F16TEXTURE3D  */
+    F16TEXTURE2DRECT = 556,        /* F16TEXTURE2DRECT  */
+    F16TEXTURECUBE = 557,          /* F16TEXTURECUBE  */
+    F16TEXTURE1DARRAY = 558,       /* F16TEXTURE1DARRAY  */
+    F16TEXTURE2DARRAY = 559,       /* F16TEXTURE2DARRAY  */
+    F16TEXTURECUBEARRAY = 560,     /* F16TEXTURECUBEARRAY  */
+    F16TEXTUREBUFFER = 561,        /* F16TEXTUREBUFFER  */
+    F16TEXTURE2DMS = 562,          /* F16TEXTURE2DMS  */
+    F16TEXTURE2DMSARRAY = 563,     /* F16TEXTURE2DMSARRAY  */
+    SUBPASSINPUT = 564,            /* SUBPASSINPUT  */
+    SUBPASSINPUTMS = 565,          /* SUBPASSINPUTMS  */
+    ISUBPASSINPUT = 566,           /* ISUBPASSINPUT  */
+    ISUBPASSINPUTMS = 567,         /* ISUBPASSINPUTMS  */
+    USUBPASSINPUT = 568,           /* USUBPASSINPUT  */
+    USUBPASSINPUTMS = 569,         /* USUBPASSINPUTMS  */
+    F16SUBPASSINPUT = 570,         /* F16SUBPASSINPUT  */
+    F16SUBPASSINPUTMS = 571,       /* F16SUBPASSINPUTMS  */
+    LEFT_OP = 572,                 /* LEFT_OP  */
+    RIGHT_OP = 573,                /* RIGHT_OP  */
+    INC_OP = 574,                  /* INC_OP  */
+    DEC_OP = 575,                  /* DEC_OP  */
+    LE_OP = 576,                   /* LE_OP  */
+    GE_OP = 577,                   /* GE_OP  */
+    EQ_OP = 578,                   /* EQ_OP  */
+    NE_OP = 579,                   /* NE_OP  */
+    AND_OP = 580,                  /* AND_OP  */
+    OR_OP = 581,                   /* OR_OP  */
+    XOR_OP = 582,                  /* XOR_OP  */
+    MUL_ASSIGN = 583,              /* MUL_ASSIGN  */
+    DIV_ASSIGN = 584,              /* DIV_ASSIGN  */
+    ADD_ASSIGN = 585,              /* ADD_ASSIGN  */
+    MOD_ASSIGN = 586,              /* MOD_ASSIGN  */
+    LEFT_ASSIGN = 587,             /* LEFT_ASSIGN  */
+    RIGHT_ASSIGN = 588,            /* RIGHT_ASSIGN  */
+    AND_ASSIGN = 589,              /* AND_ASSIGN  */
+    XOR_ASSIGN = 590,              /* XOR_ASSIGN  */
+    OR_ASSIGN = 591,               /* OR_ASSIGN  */
+    SUB_ASSIGN = 592,              /* SUB_ASSIGN  */
+    STRING_LITERAL = 593,          /* STRING_LITERAL  */
+    LEFT_PAREN = 594,              /* LEFT_PAREN  */
+    RIGHT_PAREN = 595,             /* RIGHT_PAREN  */
+    LEFT_BRACKET = 596,            /* LEFT_BRACKET  */
+    RIGHT_BRACKET = 597,           /* RIGHT_BRACKET  */
+    LEFT_BRACE = 598,              /* LEFT_BRACE  */
+    RIGHT_BRACE = 599,             /* RIGHT_BRACE  */
+    DOT = 600,                     /* DOT  */
+    COMMA = 601,                   /* COMMA  */
+    COLON = 602,                   /* COLON  */
+    EQUAL = 603,                   /* EQUAL  */
+    SEMICOLON = 604,               /* SEMICOLON  */
+    BANG = 605,                    /* BANG  */
+    DASH = 606,                    /* DASH  */
+    TILDE = 607,                   /* TILDE  */
+    PLUS = 608,                    /* PLUS  */
+    STAR = 609,                    /* STAR  */
+    SLASH = 610,                   /* SLASH  */
+    PERCENT = 611,                 /* PERCENT  */
+    LEFT_ANGLE = 612,              /* LEFT_ANGLE  */
+    RIGHT_ANGLE = 613,             /* RIGHT_ANGLE  */
+    VERTICAL_BAR = 614,            /* VERTICAL_BAR  */
+    CARET = 615,                   /* CARET  */
+    AMPERSAND = 616,               /* AMPERSAND  */
+    QUESTION = 617,                /* QUESTION  */
+    INVARIANT = 618,               /* INVARIANT  */
+    HIGH_PRECISION = 619,          /* HIGH_PRECISION  */
+    MEDIUM_PRECISION = 620,        /* MEDIUM_PRECISION  */
+    LOW_PRECISION = 621,           /* LOW_PRECISION  */
+    PRECISION = 622,               /* PRECISION  */
+    PACKED = 623,                  /* PACKED  */
+    RESOURCE = 624,                /* RESOURCE  */
+    SUPERP = 625,                  /* SUPERP  */
+    FLOATCONSTANT = 626,           /* FLOATCONSTANT  */
+    INTCONSTANT = 627,             /* INTCONSTANT  */
+    UINTCONSTANT = 628,            /* UINTCONSTANT  */
+    BOOLCONSTANT = 629,            /* BOOLCONSTANT  */
+    IDENTIFIER = 630,              /* IDENTIFIER  */
+    TYPE_NAME = 631,               /* TYPE_NAME  */
+    CENTROID = 632,                /* CENTROID  */
+    IN = 633,                      /* IN  */
+    OUT = 634,                     /* OUT  */
+    INOUT = 635,                   /* INOUT  */
+    STRUCT = 636,                  /* STRUCT  */
+    VOID = 637,                    /* VOID  */
+    WHILE = 638,                   /* WHILE  */
+    BREAK = 639,                   /* BREAK  */
+    CONTINUE = 640,                /* CONTINUE  */
+    DO = 641,                      /* DO  */
+    ELSE = 642,                    /* ELSE  */
+    FOR = 643,                     /* FOR  */
+    IF = 644,                      /* IF  */
+    DISCARD = 645,                 /* DISCARD  */
+    RETURN = 646,                  /* RETURN  */
+    SWITCH = 647,                  /* SWITCH  */
+    CASE = 648,                    /* CASE  */
+    DEFAULT = 649,                 /* DEFAULT  */
+    TERMINATE_INVOCATION = 650,    /* TERMINATE_INVOCATION  */
+    TERMINATE_RAY = 651,           /* TERMINATE_RAY  */
+    IGNORE_INTERSECTION = 652,     /* IGNORE_INTERSECTION  */
+    UNIFORM = 653,                 /* UNIFORM  */
+    SHARED = 654,                  /* SHARED  */
+    BUFFER = 655,                  /* BUFFER  */
+    FLAT = 656,                    /* FLAT  */
+    SMOOTH = 657,                  /* SMOOTH  */
+    LAYOUT = 658,                  /* LAYOUT  */
+    DOUBLECONSTANT = 659,          /* DOUBLECONSTANT  */
+    INT16CONSTANT = 660,           /* INT16CONSTANT  */
+    UINT16CONSTANT = 661,          /* UINT16CONSTANT  */
+    FLOAT16CONSTANT = 662,         /* FLOAT16CONSTANT  */
+    INT32CONSTANT = 663,           /* INT32CONSTANT  */
+    UINT32CONSTANT = 664,          /* UINT32CONSTANT  */
+    INT64CONSTANT = 665,           /* INT64CONSTANT  */
+    UINT64CONSTANT = 666,          /* UINT64CONSTANT  */
+    SUBROUTINE = 667,              /* SUBROUTINE  */
+    DEMOTE = 668,                  /* DEMOTE  */
+    PAYLOADNV = 669,               /* PAYLOADNV  */
+    PAYLOADINNV = 670,             /* PAYLOADINNV  */
+    HITATTRNV = 671,               /* HITATTRNV  */
+    CALLDATANV = 672,              /* CALLDATANV  */
+    CALLDATAINNV = 673,            /* CALLDATAINNV  */
+    PAYLOADEXT = 674,              /* PAYLOADEXT  */
+    PAYLOADINEXT = 675,            /* PAYLOADINEXT  */
+    HITATTREXT = 676,              /* HITATTREXT  */
+    CALLDATAEXT = 677,             /* CALLDATAEXT  */
+    CALLDATAINEXT = 678,           /* CALLDATAINEXT  */
+    PATCH = 679,                   /* PATCH  */
+    SAMPLE = 680,                  /* SAMPLE  */
+    NONUNIFORM = 681,              /* NONUNIFORM  */
+    COHERENT = 682,                /* COHERENT  */
+    VOLATILE = 683,                /* VOLATILE  */
+    RESTRICT = 684,                /* RESTRICT  */
+    READONLY = 685,                /* READONLY  */
+    WRITEONLY = 686,               /* WRITEONLY  */
+    DEVICECOHERENT = 687,          /* DEVICECOHERENT  */
+    QUEUEFAMILYCOHERENT = 688,     /* QUEUEFAMILYCOHERENT  */
+    WORKGROUPCOHERENT = 689,       /* WORKGROUPCOHERENT  */
+    SUBGROUPCOHERENT = 690,        /* SUBGROUPCOHERENT  */
+    NONPRIVATE = 691,              /* NONPRIVATE  */
+    SHADERCALLCOHERENT = 692,      /* SHADERCALLCOHERENT  */
+    NOPERSPECTIVE = 693,           /* NOPERSPECTIVE  */
+    EXPLICITINTERPAMD = 694,       /* EXPLICITINTERPAMD  */
+    PERVERTEXNV = 695,             /* PERVERTEXNV  */
+    PERPRIMITIVENV = 696,          /* PERPRIMITIVENV  */
+    PERVIEWNV = 697,               /* PERVIEWNV  */
+    PERTASKNV = 698,               /* PERTASKNV  */
+    PRECISE = 699                  /* PRECISE  */
   };
+  typedef enum yytokentype yytoken_kind_t;
 #endif
 
 /* Value type.  */
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-
 union YYSTYPE
 {
-#line 97 "MachineIndependent/glslang.y" /* yacc.c:1909  */
+#line 97 "MachineIndependent/glslang.y"
 
     struct {
         glslang::TSourceLoc loc;
@@ -506,9 +540,9 @@
         glslang::TArraySizes* typeParameters;
     } interm;
 
-#line 510 "MachineIndependent/glslang_tab.cpp.h" /* yacc.c:1909  */
-};
+#line 544 "MachineIndependent/glslang_tab.cpp.h"
 
+};
 typedef union YYSTYPE YYSTYPE;
 # define YYSTYPE_IS_TRIVIAL 1
 # define YYSTYPE_IS_DECLARED 1
diff --git a/third_party/glslang/src/glslang/MachineIndependent/intermOut.cpp b/third_party/glslang/src/glslang/MachineIndependent/intermOut.cpp
index 0239e99..5ce3e47 100644
--- a/third_party/glslang/src/glslang/MachineIndependent/intermOut.cpp
+++ b/third_party/glslang/src/glslang/MachineIndependent/intermOut.cpp
@@ -438,6 +438,9 @@
     case EOpConvUint64ToPtr:  out.debug << "Convert uint64_t to pointer";   break;
     case EOpConvPtrToUint64:  out.debug << "Convert pointer to uint64_t";   break;
 
+    case EOpConvUint64ToAccStruct: out.debug << "Convert uint64_t to acceleration structure"; break;
+    case EOpConvUvec2ToAccStruct:  out.debug << "Convert uvec2 to acceleration strucuture "; break;
+
     case EOpRadians:        out.debug << "radians";              break;
     case EOpDegrees:        out.debug << "degrees";              break;
     case EOpSin:            out.debug << "sine";                 break;
@@ -829,6 +832,7 @@
     case EOpConstructTextureSampler: out.debug << "Construct combined texture-sampler"; break;
     case EOpConstructReference:  out.debug << "Construct reference";  break;
     case EOpConstructCooperativeMatrix:  out.debug << "Construct cooperative matrix";  break;
+    case EOpConstructAccStruct: out.debug << "Construct acceleration structure"; break;
 
     case EOpLessThan:         out.debug << "Compare Less Than";             break;
     case EOpGreaterThan:      out.debug << "Compare Greater Than";          break;
@@ -1079,11 +1083,15 @@
     case EOpSubpassLoad:   out.debug << "subpassLoad";   break;
     case EOpSubpassLoadMS: out.debug << "subpassLoadMS"; break;
 
-    case EOpTrace:                            out.debug << "traceNV"; break;
+    case EOpTraceNV:                          out.debug << "traceNV"; break;
+    case EOpTraceKHR:                         out.debug << "traceRayKHR"; break;
     case EOpReportIntersection:               out.debug << "reportIntersectionNV"; break;
-    case EOpIgnoreIntersection:               out.debug << "ignoreIntersectionNV"; break;
-    case EOpTerminateRay:                     out.debug << "terminateRayNV"; break;
-    case EOpExecuteCallable:                  out.debug << "executeCallableNV"; break;
+    case EOpIgnoreIntersectionNV:             out.debug << "ignoreIntersectionNV"; break;
+    case EOpIgnoreIntersectionKHR:            out.debug << "ignoreIntersectionKHR"; break;
+    case EOpTerminateRayNV:                   out.debug << "terminateRayNV"; break;
+    case EOpTerminateRayKHR:                  out.debug << "terminateRayKHR"; break;
+    case EOpExecuteCallableNV:                out.debug << "executeCallableNV"; break;
+    case EOpExecuteCallableKHR:               out.debug << "executeCallableKHR"; break;
     case EOpWritePackedPrimitiveIndices4x8NV: out.debug << "writePackedPrimitiveIndices4x8NV"; break;
 
     case EOpRayQueryInitialize:                                            out.debug << "rayQueryInitializeEXT"; break;
@@ -1409,14 +1417,17 @@
     OutputTreeText(out, node, depth);
 
     switch (node->getFlowOp()) {
-    case EOpKill:      out.debug << "Branch: Kill";           break;
-    case EOpBreak:     out.debug << "Branch: Break";          break;
-    case EOpContinue:  out.debug << "Branch: Continue";       break;
-    case EOpReturn:    out.debug << "Branch: Return";         break;
-    case EOpCase:      out.debug << "case: ";                 break;
-    case EOpDemote:    out.debug << "Demote";                 break;
-    case EOpDefault:   out.debug << "default: ";              break;
-    default:               out.debug << "Branch: Unknown Branch"; break;
+    case EOpKill:                   out.debug << "Branch: Kill";                  break;
+    case EOpTerminateInvocation:    out.debug << "Branch: TerminateInvocation";   break;
+    case EOpIgnoreIntersectionKHR:  out.debug << "Branch: IgnoreIntersectionKHR"; break;
+    case EOpTerminateRayKHR:        out.debug << "Branch: TerminateRayKHR";       break;
+    case EOpBreak:                  out.debug << "Branch: Break";                 break;
+    case EOpContinue:               out.debug << "Branch: Continue";              break;
+    case EOpReturn:                 out.debug << "Branch: Return";                break;
+    case EOpCase:                   out.debug << "case: ";                        break;
+    case EOpDemote:                 out.debug << "Demote";                        break;
+    case EOpDefault:                out.debug << "default: ";                     break;
+    default:                        out.debug << "Branch: Unknown Branch";        break;
     }
 
     if (node->getExpression()) {
diff --git a/third_party/glslang/src/glslang/MachineIndependent/iomapper.cpp b/third_party/glslang/src/glslang/MachineIndependent/iomapper.cpp
index 905cf65..c42e74f 100644
--- a/third_party/glslang/src/glslang/MachineIndependent/iomapper.cpp
+++ b/third_party/glslang/src/glslang/MachineIndependent/iomapper.cpp
@@ -37,9 +37,11 @@
 
 #include "../Include/Common.h"
 #include "../Include/InfoSink.h"
+#include "../Include/Types.h"
 
 #include "gl_types.h"
 #include "iomapper.h"
+#include "SymbolTable.h"
 
 //
 // Map IO bindings.
@@ -82,17 +84,17 @@
         // If a global is being visited, then we should also traverse it incase it's evaluation
         // ends up visiting inputs we want to tag as live
         else if (base->getQualifier().storage == EvqGlobal)
-            addGlobalReference(base->getName());
+            addGlobalReference(base->getAccessName());
 
         if (target) {
             TVarEntryInfo ent = {base->getId(), base, ! traverseAll};
             ent.stage = intermediate.getStage();
             TVarLiveMap::iterator at = target->find(
-                ent.symbol->getName()); // std::lower_bound(target->begin(), target->end(), ent, TVarEntryInfo::TOrderById());
+                ent.symbol->getAccessName()); // std::lower_bound(target->begin(), target->end(), ent, TVarEntryInfo::TOrderById());
             if (at != target->end() && at->second.id == ent.id)
                 at->second.live = at->second.live || ! traverseAll; // update live state
             else
-                (*target)[ent.symbol->getName()] = ent;
+                (*target)[ent.symbol->getAccessName()] = ent;
         }
     }
 
@@ -125,7 +127,8 @@
             return;
 
         TVarEntryInfo ent = { base->getId() };
-        TVarLiveMap::const_iterator at = source->find(base->getName());
+        // Fix a defect, when block has no instance name, we need to find its block name
+        TVarLiveMap::const_iterator at = source->find(base->getAccessName());
         if (at == source->end())
             return;
 
@@ -181,7 +184,7 @@
 
     inline void operator()(std::pair<const TString, TVarEntryInfo>& entKey)
     {
-        resolver.notifyInOut(stage, entKey.second);
+        resolver.notifyInOut(entKey.second.stage, entKey.second);
     }
 
 private:
@@ -189,12 +192,13 @@
 };
 
 struct TResolverUniformAdaptor {
-    TResolverUniformAdaptor(EShLanguage s, TIoMapResolver& r, TInfoSink& i, bool& e)
+    TResolverUniformAdaptor(EShLanguage s, TIoMapResolver& r, TVarLiveMap* uniform[EShLangCount], TInfoSink& i, bool& e)
       : stage(s)
       , resolver(r)
       , infoSink(i)
       , error(e)
     {
+        memcpy(uniformVarMap, uniform, EShLangCount * (sizeof(TVarLiveMap*)));
     }
 
     inline void operator()(std::pair<const TString, TVarEntryInfo>& entKey) {
@@ -206,9 +210,9 @@
         ent.newIndex = -1;
         const bool isValid = resolver.validateBinding(stage, ent);
         if (isValid) {
-            resolver.resolveBinding(stage, ent);
-            resolver.resolveSet(stage, ent);
-            resolver.resolveUniformLocation(stage, ent);
+            resolver.resolveBinding(ent.stage, ent);
+            resolver.resolveSet(ent.stage, ent);
+            resolver.resolveUniformLocation(ent.stage, ent);
 
             if (ent.newBinding != -1) {
                 if (ent.newBinding >= int(TQualifier::layoutBindingEnd)) {
@@ -217,6 +221,17 @@
                     infoSink.info.message(EPrefixInternalError, err.c_str());
                     error = true;
                 }
+
+                if (ent.symbol->getQualifier().hasBinding()) {
+                    for (uint32_t idx = EShLangVertex; idx < EShLangCount; ++idx) {
+                        if (idx == ent.stage || uniformVarMap[idx] == nullptr)
+                            continue;
+                        auto entKey2 = uniformVarMap[idx]->find(entKey.first);
+                        if (entKey2 != uniformVarMap[idx]->end()) {
+                            entKey2->second.newBinding = ent.newBinding;
+                        }
+                    }
+                }
             }
             if (ent.newSet != -1) {
                 if (ent.newSet >= int(TQualifier::layoutSetEnd)) {
@@ -225,6 +240,16 @@
                     infoSink.info.message(EPrefixInternalError, err.c_str());
                     error = true;
                 }
+                if (ent.symbol->getQualifier().hasSet()) {
+                    for (uint32_t idx = EShLangVertex; idx < EShLangCount; ++idx) {
+                        if ((idx == stage) || (uniformVarMap[idx] == nullptr))
+                            continue;
+                        auto entKey2 = uniformVarMap[idx]->find(entKey.first);
+                        if (entKey2 != uniformVarMap[idx]->end()) {
+                            entKey2->second.newSet = ent.newSet;
+                        }
+                    }
+                }
             }
         } else {
             TString errorMsg = "Invalid binding: " + entKey.first;
@@ -239,7 +264,7 @@
     TIoMapResolver& resolver;
     TInfoSink&      infoSink;
     bool&           error;
-
+    TVarLiveMap*    uniformVarMap[EShLangCount];
 private:
     TResolverUniformAdaptor& operator=(TResolverUniformAdaptor&) = delete;
 };
@@ -261,7 +286,7 @@
         ent.newBinding = -1;
         ent.newSet = -1;
         ent.newIndex = -1;
-        const bool isValid = resolver.validateInOut(stage, ent);
+        const bool isValid = resolver.validateInOut(ent.stage, ent);
         if (isValid) {
             resolver.resolveInOutLocation(stage, ent);
             resolver.resolveInOutComponent(stage, ent);
@@ -296,17 +321,116 @@
 struct TSymbolValidater
 {
     TSymbolValidater(TIoMapResolver& r, TInfoSink& i, TVarLiveMap* in[EShLangCount], TVarLiveMap* out[EShLangCount],
-                     TVarLiveMap* uniform[EShLangCount], bool& hadError)
+                     TVarLiveMap* uniform[EShLangCount], bool& hadError, EProfile profile, int version)
         : preStage(EShLangCount)
         , currentStage(EShLangCount)
         , nextStage(EShLangCount)
         , resolver(r)
         , infoSink(i)
         , hadError(hadError)
+        , profile(profile)
+        , version(version)
     {
         memcpy(inVarMaps, in, EShLangCount * (sizeof(TVarLiveMap*)));
         memcpy(outVarMaps, out, EShLangCount * (sizeof(TVarLiveMap*)));
         memcpy(uniformVarMap, uniform, EShLangCount * (sizeof(TVarLiveMap*)));
+
+        std::map<TString, TString> anonymousMemberMap;
+        std::vector<TRange> usedUniformLocation;
+        std::vector<TString> usedUniformName;
+        usedUniformLocation.clear();
+        usedUniformName.clear();
+        for (int i = 0; i < EShLangCount; i++) {
+            if (uniformVarMap[i]) {
+                for (auto uniformVar : *uniformVarMap[i])
+                {
+                    TIntermSymbol* pSymbol = uniformVar.second.symbol;
+                    TQualifier qualifier = uniformVar.second.symbol->getQualifier();
+                    TString symbolName = pSymbol->getAccessName();
+
+                    // All the uniform needs multi-stage location check (block/default)
+                    int uniformLocation = qualifier.layoutLocation;
+
+                    if (uniformLocation != TQualifier::layoutLocationEnd) {
+                        // Total size of current uniform, could be block, struct or other types.
+                        int size = TIntermediate::computeTypeUniformLocationSize(pSymbol->getType());
+
+                        TRange locationRange(uniformLocation, uniformLocation + size - 1);
+
+                        // Combine location and component ranges
+                        int overlapLocation = -1;
+                        bool diffLocation = false;
+
+                        // Check for collisions, except for vertex inputs on desktop targeting OpenGL
+                        overlapLocation = checkLocationOverlap(locationRange, usedUniformLocation, symbolName, usedUniformName, diffLocation);
+
+                        // Overlap locations of uniforms, regardless of components (multi stages)
+                        if (overlapLocation == -1) {
+                            usedUniformLocation.push_back(locationRange);
+                            usedUniformName.push_back(symbolName);
+                        }
+                        else if (overlapLocation >= 0) {
+                            if (diffLocation == true) {
+                                TString err = ("Uniform location should be equal for same uniforms: " +std::to_string(overlapLocation)).c_str();
+                                infoSink.info.message(EPrefixInternalError, err.c_str());
+                                hadError = true;
+                                break;
+                            }
+                            else {
+                                TString err = ("Uniform location overlaps across stages: " + std::to_string(overlapLocation)).c_str();
+                                infoSink.info.message(EPrefixInternalError, err.c_str());
+                                hadError = true;
+                                break;
+                            }
+                        }
+                    }
+
+                    if ((uniformVar.second.symbol->getBasicType() == EbtBlock) &&
+                        IsAnonymous(uniformVar.second.symbol->getName()))
+                    {
+                        auto blockType = uniformVar.second.symbol->getType().getStruct();
+                        for (size_t memberIdx = 0; memberIdx < blockType->size(); ++memberIdx) {
+                            auto memberName = (*blockType)[memberIdx].type->getFieldName();
+                            if (anonymousMemberMap.find(memberName) != anonymousMemberMap.end())
+                            {
+                                if (anonymousMemberMap[memberName] != uniformVar.second.symbol->getType().getTypeName())
+                                {
+                                    TString err = "Invalid block member name: " + memberName;
+                                    infoSink.info.message(EPrefixInternalError, err.c_str());
+                                    hadError = true;
+                                    break;
+                                }
+                            }
+                            else
+                            {
+                                anonymousMemberMap[memberName] = uniformVar.second.symbol->getType().getTypeName();
+                            }
+                        }
+                    }
+                    if (hadError)
+                        break;
+                }
+            }
+        }
+    }
+
+    // In case we need to new an intermediate, which costs too much
+    int checkLocationOverlap(const TRange& locationRange, std::vector<TRange>& usedUniformLocation, const TString symbolName, std::vector<TString>& usedUniformName, bool& diffLocation)
+    {
+        for (size_t r = 0; r < usedUniformLocation.size(); ++r) {
+            if (usedUniformName[r] == symbolName) {
+                diffLocation = true;
+                return (usedUniformLocation[r].start == locationRange.start &&
+                        usedUniformLocation[r].last == locationRange.last)
+                       ? -2 : std::max(locationRange.start, usedUniformLocation[r].start);
+            }
+            if (locationRange.overlap(usedUniformLocation[r])) {
+                // there is a collision; pick one
+                return std::max(locationRange.start, usedUniformLocation[r].start);
+            }
+        }
+
+        return -1; // no collision
     }
 
     inline void operator()(std::pair<const TString, TVarEntryInfo>& entKey) {
@@ -339,11 +463,24 @@
             // validate stage in;
             if (preStage == EShLangCount)
                 return;
-            if (name == "gl_PerVertex")
+            if (TSymbolTable::isBuiltInSymbol(base->getId()))
                 return;
             if (outVarMaps[preStage] != nullptr) {
                 auto ent2 = outVarMaps[preStage]->find(name);
+                uint32_t location = base->getType().getQualifier().layoutLocation;
+                if (ent2 == outVarMaps[preStage]->end() &&
+                    location != glslang::TQualifier::layoutLocationEnd) {
+                    for (auto var = outVarMaps[preStage]->begin(); var != ent2; var++) {
+                        if (var->second.symbol->getType().getQualifier().layoutLocation == location) {
+                            ent2 = var;
+                            break;
+                        }
+                    }
+                }
                 if (ent2 != outVarMaps[preStage]->end()) {
+                    auto& type1 = base->getType();
+                    auto& type2 = ent2->second.symbol->getType();
+                    hadError = hadError || typeCheck(&type1, &type2, name.c_str(), false);
                     if (ent2->second.symbol->getType().getQualifier().isArrayedIo(preStage)) {
                         TType subType(ent2->second.symbol->getType(), 0);
                         subType.appendMangledName(mangleName2);
@@ -351,23 +488,49 @@
                     else {
                         ent2->second.symbol->getType().appendMangledName(mangleName2);
                     }
-                    if (mangleName1 == mangleName2)
+
+                    if (mangleName1 == mangleName2) {
+                        // For ES 3.0 only, other versions have no such restrictions
+                        // According to ES 3.0 spec: The type and presence of the interpolation qualifiers and
+                        // storage qualifiers  of variables with the same name declared in all linked shaders must
+                        // match, otherwise the link command will fail.
+                        if (profile == EEsProfile && version == 300) {
+                            // Don't need to check smooth qualifier, as it uses the default interpolation mode
+                            if (ent1.stage == EShLangFragment && type1.isBuiltIn() == false) {
+                                if (type1.getQualifier().flat != type2.getQualifier().flat ||
+                                    type1.getQualifier().nopersp != type2.getQualifier().nopersp) {
+                                    TString err = "Interpolation qualifier mismatch : " + entKey.first;
+                                    infoSink.info.message(EPrefixInternalError, err.c_str());
+                                    hadError = true;
+                                }
+                            }
+                        }
                         return;
+                    }
                     else {
                         TString err = "Invalid In/Out variable type : " + entKey.first;
                         infoSink.info.message(EPrefixInternalError, err.c_str());
                         hadError = true;
                     }
                 }
+                else if (!base->getType().isBuiltIn()) {
+                    // According to spec: A link error is generated if any statically referenced input variable
+                    // or block does not have a matching output
+                    if (profile == EEsProfile && ent1.live) {
+                        hadError = true;
+                        TString errorStr = name + ": not been declare as a output variable in pre shader stage.";
+                        infoSink.info.message(EPrefixError, errorStr.c_str());
+                    }
+                }
                 return;
             }
         } else if (base->getQualifier().storage == EvqVaryingOut) {
             // validate stage out;
             if (nextStage == EShLangCount)
                 return;
-            if (name == "gl_PerVertex")
+            if (TSymbolTable::isBuiltInSymbol(base->getId()))
                 return;
-            if (outVarMaps[nextStage] != nullptr) {
+            if (inVarMaps[nextStage] != nullptr) {
                 auto ent2 = inVarMaps[nextStage]->find(name);
                 if (ent2 != inVarMaps[nextStage]->end()) {
                     if (ent2->second.symbol->getType().getQualifier().isArrayedIo(nextStage)) {
@@ -400,11 +563,50 @@
                             hadError = true;
                         }
                         mangleName2.clear();
+
+                        // validate instance name of blocks
+                        if (hadError == false &&
+                            base->getType().getBasicType() == EbtBlock &&
+                            IsAnonymous(base->getName()) != IsAnonymous(ent2->second.symbol->getName())) {
+                            TString err = "Matched uniform block names must also either all be lacking "
+                                          "an instance name or all having an instance name: " + entKey.first;
+                            infoSink.info.message(EPrefixInternalError, err.c_str());
+                            hadError = true;
+                        }
+
+                        // validate uniform block member qualifier and member names
+                        auto& type1 = base->getType();
+                        auto& type2 = ent2->second.symbol->getType();
+                        if (hadError == false && base->getType().getBasicType() == EbtBlock) {
+                            hadError = hadError || typeCheck(&type1, &type2, name.c_str(), true);
+                        }
+                        else {
+                            hadError = hadError || typeCheck(&type1, &type2, name.c_str(), false);
+                        }
+                    }
+                    else if (base->getBasicType() == EbtBlock)
+                    {
+                        if (IsAnonymous(base->getName()))
+                        {
+                            // The name of anonymous block member can't same with default uniform variable.
+                            auto blockType1 = base->getType().getStruct();
+                            for (size_t memberIdx = 0; memberIdx < blockType1->size(); ++memberIdx) {
+                                auto memberName = (*blockType1)[memberIdx].type->getFieldName();
+                                if (uniformVarMap[i]->find(memberName) != uniformVarMap[i]->end())
+                                {
+                                    TString err = "Invalid Uniform variable name : " + memberName;
+                                    infoSink.info.message(EPrefixInternalError, err.c_str());
+                                    hadError = true;
+                                    break;
+                                }
+                            }
+                        }
                     }
                 }
             }
         }
     }
+
     TVarLiveMap *inVarMaps[EShLangCount], *outVarMaps[EShLangCount], *uniformVarMap[EShLangCount];
     // Use for mark pre stage, to get more interface symbol information.
     EShLanguage preStage, currentStage, nextStage;
@@ -412,9 +614,118 @@
     TIoMapResolver& resolver;
     TInfoSink& infoSink;
     bool& hadError;
+    EProfile profile;
+    int version;
 
 private:
     TSymbolValidater& operator=(TSymbolValidater&) = delete;
+
+    bool qualifierCheck(const TType* const type1, const TType* const type2, const std::string& name, bool isBlock)
+    {
+        bool hasError = false;
+        const TQualifier& qualifier1 = type1->getQualifier();
+        const TQualifier& qualifier2 = type2->getQualifier();
+
+        if (((isBlock == false) &&
+            (type1->getQualifier().storage == EvqUniform && type2->getQualifier().storage == EvqUniform)) ||
+            (type1->getQualifier().storage == EvqGlobal && type2->getQualifier().storage == EvqGlobal)) {
+            if (qualifier1.precision != qualifier2.precision) {
+                hasError = true;
+                std::string errorStr = name + ": have precision conflict cross stage.";
+                infoSink.info.message(EPrefixError, errorStr.c_str());
+            }
+            if (qualifier1.hasFormat() && qualifier2.hasFormat()) {
+                if (qualifier1.layoutFormat != qualifier2.layoutFormat) {
+                    hasError = true;
+                    std::string errorStr = name + ": have layout format conflict cross stage.";
+                    infoSink.info.message(EPrefixError, errorStr.c_str());
+                }
+
+            }
+        }
+
+        if (isBlock == true) {
+            if (qualifier1.layoutPacking != qualifier2.layoutPacking) {
+                hasError = true;
+                std::string errorStr = name + ": have layoutPacking conflict cross stage.";
+                infoSink.info.message(EPrefixError, errorStr.c_str());
+            }
+            if (qualifier1.layoutMatrix != qualifier2.layoutMatrix) {
+                hasError = true;
+                std::string errorStr = name + ": have layoutMatrix conflict cross stage.";
+                infoSink.info.message(EPrefixError, errorStr.c_str());
+            }
+            if (qualifier1.layoutOffset != qualifier2.layoutOffset) {
+                hasError = true;
+                std::string errorStr = name + ": have layoutOffset conflict cross stage.";
+                infoSink.info.message(EPrefixError, errorStr.c_str());
+            }
+            if (qualifier1.layoutAlign != qualifier2.layoutAlign) {
+                hasError = true;
+                std::string errorStr = name + ": have layoutAlign conflict cross stage.";
+                infoSink.info.message(EPrefixError, errorStr.c_str());
+            }
+        }
+
+        return hasError;
+    }
+
+    bool typeCheck(const TType* const type1, const TType* const type2, const std::string& name, bool isBlock)
+    {
+        bool hasError = false;
+        if (!(type1->isStruct() && type2->isStruct())) {
+            hasError = hasError || qualifierCheck(type1, type2, name, isBlock);
+        }
+        else {
+            if (type1->getBasicType() == EbtBlock && type2->getBasicType() == EbtBlock)
+                isBlock = true;
+            const TTypeList* typeList1 = type1->getStruct();
+            const TTypeList* typeList2 = type2->getStruct();
+
+            std::string newName = name;
+            size_t memberCount = typeList1->size();
+            size_t index2 = 0;
+            for (size_t index = 0; index < memberCount; index++, index2++) {
+                // Skip inactive member
+                if (typeList1->at(index).type->getBasicType() == EbtVoid)
+                    continue;
+                while (index2 < typeList2->size() && typeList2->at(index2).type->getBasicType() == EbtVoid) {
+                    ++index2;
+                }
+
+                // TypeList1 has more members in list
+                if (index2 == typeList2->size()) {
+                    std::string errorStr = name + ": struct mismatch.";
+                    infoSink.info.message(EPrefixError, errorStr.c_str());
+                    hasError = true;
+                    break;
+                }
+
+                if (typeList1->at(index).type->getFieldName() != typeList2->at(index2).type->getFieldName()) {
+                    std::string errorStr = name + ": member name mismatch.";
+                    infoSink.info.message(EPrefixError, errorStr.c_str());
+                    hasError = true;
+                }
+                else {
+                    newName = typeList1->at(index).type->getFieldName().c_str();
+                }
+                hasError = hasError || typeCheck(typeList1->at(index).type, typeList2->at(index2).type, newName, isBlock);
+            }
+
+            while (index2 < typeList2->size())
+            {
+                // TypeList2 has more members
+                if (typeList2->at(index2).type->getBasicType() != EbtVoid) {
+                    std::string errorStr = name + ": struct mismatch.";
+                    infoSink.info.message(EPrefixError, errorStr.c_str());
+                    hasError = true;
+                    break;
+                }
+                ++index2;
+            }
+        }
+        return hasError;
+    }
 };
 
 struct TSlotCollector {
@@ -500,7 +811,7 @@
 
 int TDefaultIoResolverBase::resolveUniformLocation(EShLanguage /*stage*/, TVarEntryInfo& ent) {
     const TType& type = ent.symbol->getType();
-    const char* name = ent.symbol->getName().c_str();
+    const char* name =  ent.symbol->getAccessName().c_str();
     // kick out of not doing this
     if (! doAutoLocationMapping()) {
         return ent.newLocation = -1;
@@ -609,7 +920,7 @@
 
 int TDefaultGlslIoResolver::resolveInOutLocation(EShLanguage stage, TVarEntryInfo& ent) {
     const TType& type = ent.symbol->getType();
-    const TString& name = getAccessName(ent.symbol);
+    const TString& name = ent.symbol->getAccessName();
     if (currentStage != stage) {
         preStage = currentStage;
         currentStage = stage;
@@ -693,7 +1004,7 @@
 
 int TDefaultGlslIoResolver::resolveUniformLocation(EShLanguage /*stage*/, TVarEntryInfo& ent) {
     const TType& type = ent.symbol->getType();
-    const TString& name = getAccessName(ent.symbol);
+    const TString& name = ent.symbol->getAccessName();
     // kick out of not doing this
     if (! doAutoLocationMapping()) {
         return ent.newLocation = -1;
@@ -764,7 +1075,7 @@
 
 int TDefaultGlslIoResolver::resolveBinding(EShLanguage /*stage*/, TVarEntryInfo& ent) {
     const TType& type = ent.symbol->getType();
-    const TString& name = getAccessName(ent.symbol);
+    const TString& name = ent.symbol->getAccessName();
     // On OpenGL arrays of opaque types take a separate binding for each element
     int numBindings = intermediate.getSpv().openGl != 0 && type.isSizedArray() ? type.getCumulativeArraySize() : 1;
     TResourceType resource = getResourceType(type);
@@ -839,7 +1150,7 @@
 
 void TDefaultGlslIoResolver::reserverStorageSlot(TVarEntryInfo& ent, TInfoSink& infoSink) {
     const TType& type = ent.symbol->getType();
-    const TString& name = getAccessName(ent.symbol);
+    const TString& name = ent.symbol->getAccessName();
     TStorageQualifier storage = type.getQualifier().storage;
     EShLanguage stage(EShLangCount);
     switch (storage) {
@@ -899,7 +1210,7 @@
 
 void TDefaultGlslIoResolver::reserverResourceSlot(TVarEntryInfo& ent, TInfoSink& infoSink) {
     const TType& type = ent.symbol->getType();
-    const TString& name = getAccessName(ent.symbol);
+    const TString& name = ent.symbol->getAccessName();
     int resource = getResourceType(type);
     if (type.getQualifier().hasBinding()) {
         TVarSlotMap& varSlotMap = resourceSlotMap[resource];
@@ -922,13 +1233,6 @@
     }
 }
 
-const TString& TDefaultGlslIoResolver::getAccessName(const TIntermSymbol* symbol)
-{
-    return symbol->getBasicType() == EbtBlock ?
-        symbol->getType().getTypeName() :
-        symbol->getName();
-}
-
 //TDefaultGlslIoResolver end
 
 /*
@@ -1117,25 +1421,23 @@
     }
 
     // sort entries by priority. see TVarEntryInfo::TOrderByPriority for info.
-    std::for_each(inVarMap.begin(), inVarMap.end(),
-                  [&inVector](TVarLivePair p) { inVector.push_back(p); });
+    for (auto& var : inVarMap) { inVector.push_back(var); }
     std::sort(inVector.begin(), inVector.end(), [](const TVarLivePair& p1, const TVarLivePair& p2) -> bool {
         return TVarEntryInfo::TOrderByPriority()(p1.second, p2.second);
     });
-    std::for_each(outVarMap.begin(), outVarMap.end(),
-                  [&outVector](TVarLivePair p) { outVector.push_back(p); });
+    for (auto& var : outVarMap) { outVector.push_back(var); }
     std::sort(outVector.begin(), outVector.end(), [](const TVarLivePair& p1, const TVarLivePair& p2) -> bool {
         return TVarEntryInfo::TOrderByPriority()(p1.second, p2.second);
     });
-    std::for_each(uniformVarMap.begin(), uniformVarMap.end(),
-                  [&uniformVector](TVarLivePair p) { uniformVector.push_back(p); });
+    for (auto& var : uniformVarMap) { uniformVector.push_back(var); }
     std::sort(uniformVector.begin(), uniformVector.end(), [](const TVarLivePair& p1, const TVarLivePair& p2) -> bool {
         return TVarEntryInfo::TOrderByPriority()(p1.second, p2.second);
     });
     bool hadError = false;
+    TVarLiveMap* dummyUniformVarMap[EShLangCount] = {};
     TNotifyInOutAdaptor inOutNotify(stage, *resolver);
     TNotifyUniformAdaptor uniformNotify(stage, *resolver);
-    TResolverUniformAdaptor uniformResolve(stage, *resolver, infoSink, hadError);
+    TResolverUniformAdaptor uniformResolve(stage, *resolver, dummyUniformVarMap, infoSink, hadError);
     TResolverInOutAdaptor inOutResolve(stage, *resolver, infoSink, hadError);
     resolver->beginNotifications(stage);
     std::for_each(inVector.begin(), inVector.end(), inOutNotify);
@@ -1143,22 +1445,22 @@
     std::for_each(uniformVector.begin(), uniformVector.end(), uniformNotify);
     resolver->endNotifications(stage);
     resolver->beginResolve(stage);
-    std::for_each(inVector.begin(), inVector.end(), inOutResolve);
+    for (auto& var : inVector) { inOutResolve(var); }
     std::for_each(inVector.begin(), inVector.end(), [&inVarMap](TVarLivePair p) {
-        auto at = inVarMap.find(p.second.symbol->getName());
-        if (at != inVarMap.end())
+        auto at = inVarMap.find(p.second.symbol->getAccessName());
+        if (at != inVarMap.end() && p.second.id == at->second.id)
             at->second = p.second;
     });
-    std::for_each(outVector.begin(), outVector.end(), inOutResolve);
+    for (auto& var : outVector) { inOutResolve(var); }
     std::for_each(outVector.begin(), outVector.end(), [&outVarMap](TVarLivePair p) {
-        auto at = outVarMap.find(p.second.symbol->getName());
-        if (at != outVarMap.end())
+        auto at = outVarMap.find(p.second.symbol->getAccessName());
+        if (at != outVarMap.end() && p.second.id == at->second.id)
             at->second = p.second;
     });
     std::for_each(uniformVector.begin(), uniformVector.end(), uniformResolve);
     std::for_each(uniformVector.begin(), uniformVector.end(), [&uniformVarMap](TVarLivePair p) {
-        auto at = uniformVarMap.find(p.second.symbol->getName());
-        if (at != uniformVarMap.end())
+        auto at = uniformVarMap.find(p.second.symbol->getAccessName());
+        if (at != uniformVarMap.end() && p.second.id == at->second.id)
             at->second = p.second;
     });
     resolver->endResolve(stage);
@@ -1174,9 +1476,14 @@
 //
 // Returns false if the input is too malformed to do this.
 bool TGlslIoMapper::addStage(EShLanguage stage, TIntermediate& intermediate, TInfoSink& infoSink, TIoMapResolver* resolver) {
+    bool somethingToDo = !intermediate.getResourceSetBinding().empty() ||
+        intermediate.getAutoMapBindings() ||
+        intermediate.getAutoMapLocations();
 
-    bool somethingToDo = ! intermediate.getResourceSetBinding().empty() || intermediate.getAutoMapBindings() ||
-                         intermediate.getAutoMapLocations();
+    // Profile and version are use for symbol validate.
+    profile = intermediate.getProfile();
+    version = intermediate.getVersion();
+
     // Restrict the stricter condition to further check 'somethingToDo' only if 'somethingToDo' has not been set, reduce
     // unnecessary or insignificant for-loop operation after 'somethingToDo' have been true.
     for (int res = 0; (res < EResCount && !somethingToDo); ++res) {
@@ -1236,31 +1543,30 @@
     resolver->endResolve(EShLangCount);
     if (!hadError) {
         //Resolve uniform location, ubo/ssbo/opaque bindings across stages
-        TResolverUniformAdaptor uniformResolve(EShLangCount, *resolver, infoSink, hadError);
+        TResolverUniformAdaptor uniformResolve(EShLangCount, *resolver, uniformVarMap, infoSink, hadError);
         TResolverInOutAdaptor inOutResolve(EShLangCount, *resolver, infoSink, hadError);
-        TSymbolValidater symbolValidater(*resolver, infoSink, inVarMaps, outVarMaps, uniformVarMap, hadError);
+        TSymbolValidater symbolValidater(*resolver, infoSink, inVarMaps,
+                                         outVarMaps, uniformVarMap, hadError, profile, version);
         TVarLiveVector uniformVector;
         resolver->beginResolve(EShLangCount);
         for (int stage = EShLangVertex; stage < EShLangCount; stage++) {
             if (inVarMaps[stage] != nullptr) {
                 inOutResolve.setStage(EShLanguage(stage));
-                std::for_each(inVarMaps[stage]->begin(), inVarMaps[stage]->end(), symbolValidater);
-                std::for_each(inVarMaps[stage]->begin(), inVarMaps[stage]->end(), inOutResolve);
-                std::for_each(outVarMaps[stage]->begin(), outVarMaps[stage]->end(), symbolValidater);
-                std::for_each(outVarMaps[stage]->begin(), outVarMaps[stage]->end(), inOutResolve);
+                for (auto& var : *(inVarMaps[stage])) { symbolValidater(var); }
+                for (auto& var : *(inVarMaps[stage])) { inOutResolve(var); }
+                for (auto& var : *(outVarMaps[stage])) { symbolValidater(var); }
+                for (auto& var : *(outVarMaps[stage])) { inOutResolve(var); }
             }
             if (uniformVarMap[stage] != nullptr) {
                 uniformResolve.setStage(EShLanguage(stage));
-                // sort entries by priority. see TVarEntryInfo::TOrderByPriority for info.
-                std::for_each(uniformVarMap[stage]->begin(), uniformVarMap[stage]->end(),
-                              [&uniformVector](TVarLivePair p) { uniformVector.push_back(p); });
+                for (auto& var : *(uniformVarMap[stage])) { uniformVector.push_back(var); }
             }
         }
         std::sort(uniformVector.begin(), uniformVector.end(), [](const TVarLivePair& p1, const TVarLivePair& p2) -> bool {
             return TVarEntryInfo::TOrderByPriority()(p1.second, p2.second);
         });
-        std::for_each(uniformVector.begin(), uniformVector.end(), symbolValidater);
-        std::for_each(uniformVector.begin(), uniformVector.end(), uniformResolve);
+        for (auto& var : uniformVector) { symbolValidater(var); }
+        for (auto& var : uniformVector) { uniformResolve(var); }
         std::sort(uniformVector.begin(), uniformVector.end(), [](const TVarLivePair& p1, const TVarLivePair& p2) -> bool {
             return TVarEntryInfo::TOrderByPriority()(p1.second, p2.second);
         });
@@ -1269,14 +1575,18 @@
             if (intermediates[stage] != nullptr) {
                 // traverse each stage, set new location to each input/output and unifom symbol, set new binding to
                 // ubo, ssbo and opaque symbols
-                TVarLiveMap** pUniformVarMap = uniformVarMap;
+                TVarLiveMap** pUniformVarMap = uniformResolve.uniformVarMap;
                 std::for_each(uniformVector.begin(), uniformVector.end(), [pUniformVarMap, stage](TVarLivePair p) {
-                    auto at = pUniformVarMap[stage]->find(p.second.symbol->getName());
-                    if (at != pUniformVarMap[stage]->end())
+                    auto at = pUniformVarMap[stage]->find(p.second.symbol->getAccessName());
+                    if (at != pUniformVarMap[stage]->end() && at->second.id == p.second.id){
+                        int resolvedBinding = at->second.newBinding;
                         at->second = p.second;
+                        if (resolvedBinding > 0)
+                            at->second.newBinding = resolvedBinding;
+                    }
                 });
                 TVarSetTraverser iter_iomap(*intermediates[stage], *inVarMaps[stage], *outVarMaps[stage],
-                                            *uniformVarMap[stage]);
+                                            *uniformResolve.uniformVarMap[stage]);
                 intermediates[stage]->getTreeRoot()->traverse(&iter_iomap);
             }
         }
diff --git a/third_party/glslang/src/glslang/MachineIndependent/iomapper.h b/third_party/glslang/src/glslang/MachineIndependent/iomapper.h
index 6741327..7934c4a 100644
--- a/third_party/glslang/src/glslang/MachineIndependent/iomapper.h
+++ b/third_party/glslang/src/glslang/MachineIndependent/iomapper.h
@@ -203,7 +203,6 @@
     void endCollect(EShLanguage) override;
     void reserverStorageSlot(TVarEntryInfo& ent, TInfoSink& infoSink) override;
     void reserverResourceSlot(TVarEntryInfo& ent, TInfoSink& infoSink) override;
-    const TString& getAccessName(const TIntermSymbol*);
     // in/out symbol and uniform symbol are stored in the same resourceSlotMap, the storage key is used to identify each type of symbol.
     // We use stage and storage qualifier to construct a storage key. it can help us identify the same storage resource used in different stage.
     // if a resource is a program resource and we don't need know it usage stage, we can use same stage to build storage key.
@@ -263,10 +262,12 @@
 class TGlslIoMapper : public TIoMapper {
 public:
     TGlslIoMapper() {
-        memset(inVarMaps,     0, sizeof(TVarLiveMap*)   * EShLangCount);
-        memset(outVarMaps,    0, sizeof(TVarLiveMap*)   * EShLangCount);
-        memset(uniformVarMap, 0, sizeof(TVarLiveMap*)   * EShLangCount);
-        memset(intermediates, 0, sizeof(TIntermediate*) * EShLangCount);
+        memset(inVarMaps,     0, sizeof(TVarLiveMap*)   * (EShLangCount + 1));
+        memset(outVarMaps,    0, sizeof(TVarLiveMap*)   * (EShLangCount + 1));
+        memset(uniformVarMap, 0, sizeof(TVarLiveMap*)   * (EShLangCount + 1));
+        memset(intermediates, 0, sizeof(TIntermediate*) * (EShLangCount + 1));
+        profile = ENoProfile;
+        version = 0;
     }
     virtual ~TGlslIoMapper() {
         for (size_t stage = 0; stage < EShLangCount; stage++) {
@@ -293,6 +294,8 @@
                 *uniformVarMap[EShLangCount];
     TIntermediate* intermediates[EShLangCount];
     bool hadError = false;
+    EProfile profile;
+    int version;
 };
 
 } // end namespace glslang
diff --git a/third_party/glslang/src/glslang/MachineIndependent/linkValidate.cpp b/third_party/glslang/src/glslang/MachineIndependent/linkValidate.cpp
index 1796fed..4e84adb 100644
--- a/third_party/glslang/src/glslang/MachineIndependent/linkValidate.cpp
+++ b/third_party/glslang/src/glslang/MachineIndependent/linkValidate.cpp
@@ -196,12 +196,14 @@
     MERGE_TRUE(pointMode);
 
     for (int i = 0; i < 3; ++i) {
-        if (!localSizeNotDefault[i] && unit.localSizeNotDefault[i]) {
-            localSize[i] = unit.localSize[i];
-            localSizeNotDefault[i] = true;
+        if (unit.localSizeNotDefault[i]) {
+            if (!localSizeNotDefault[i]) {
+                localSize[i] = unit.localSize[i];
+                localSizeNotDefault[i] = true;
+            }
+            else if (localSize[i] != unit.localSize[i])
+                error(infoSink, "Contradictory local size");
         }
-        else if (localSize[i] != unit.localSize[i])
-            error(infoSink, "Contradictory local size");
 
         if (localSizeSpecId[i] == TQualifier::layoutNotSet)
             localSizeSpecId[i] = unit.localSizeSpecId[i];
@@ -1055,8 +1057,8 @@
     return found;
 }
 
-// Accumulate locations used for inputs, outputs, and uniforms, and check for collisions
-// as the accumulation is done.
+// Accumulate locations used for inputs, outputs, and uniforms, payload and callable data
+// and check for collisions as the accumulation is done.
 //
 // Returns < 0 if no collision, >= 0 if collision and the value returned is a colliding value.
 //
@@ -1068,6 +1070,7 @@
     typeCollision = false;
 
     int set;
+    int setRT;
     if (qualifier.isPipeInput())
         set = 0;
     else if (qualifier.isPipeOutput())
@@ -1076,11 +1079,17 @@
         set = 2;
     else if (qualifier.storage == EvqBuffer)
         set = 3;
+    else if (qualifier.isAnyPayload())
+        setRT = 0;
+    else if (qualifier.isAnyCallable())
+        setRT = 1;
     else
         return -1;
 
     int size;
-    if (qualifier.isUniformOrBuffer() || qualifier.isTaskMemory()) {
+    if (qualifier.isAnyPayload() || qualifier.isAnyCallable()) {
+        size = 1;
+    } else if (qualifier.isUniformOrBuffer() || qualifier.isTaskMemory()) {
         if (type.isSizedArray())
             size = type.getCumulativeArraySize();
         else
@@ -1108,10 +1117,17 @@
     // (A vertex shader input will show using only one location, even for a dvec3/4.)
     //
     // So, for the case of dvec3, we need two independent ioRanges.
-
+    //
+    // For raytracing IO (payloads and callabledata) each declaration occupies a single
+    // slot irrespective of type.
     int collision = -1; // no collision
 #ifndef GLSLANG_WEB
-    if (size == 2 && type.getBasicType() == EbtDouble && type.getVectorSize() == 3 &&
+    if (qualifier.isAnyPayload() || qualifier.isAnyCallable()) {
+        TRange range(qualifier.layoutLocation, qualifier.layoutLocation);
+        collision = checkLocationRT(setRT, qualifier.layoutLocation);
+        if (collision < 0)
+            usedIoRT[setRT].push_back(range);
+    } else if (size == 2 && type.getBasicType() == EbtDouble && type.getVectorSize() == 3 &&
         (qualifier.isPipeInput() || qualifier.isPipeOutput())) {
         // Dealing with dvec3 in/out split across two locations.
         // Need two io-ranges.
@@ -1187,6 +1203,16 @@
     return -1; // no collision
 }
 
+int TIntermediate::checkLocationRT(int set, int location) {
+    TRange range(location, location);
+    for (size_t r = 0; r < usedIoRT[set].size(); ++r) {
+        if (range.overlap(usedIoRT[set][r])) {
+            return range.start;
+        }
+    }
+    return -1; // no collision
+}
+
 // Accumulate bindings and offsets, and check for collisions
 // as the accumulation is done.
 //
diff --git a/third_party/glslang/src/glslang/MachineIndependent/localintermediate.h b/third_party/glslang/src/glslang/MachineIndependent/localintermediate.h
index f874701..f8d8e80 100644
--- a/third_party/glslang/src/glslang/MachineIndependent/localintermediate.h
+++ b/third_party/glslang/src/glslang/MachineIndependent/localintermediate.h
@@ -416,6 +416,9 @@
     EShLanguage getStage() const { return language; }
     void addRequestedExtension(const char* extension) { requestedExtensions.insert(extension); }
     const std::set<std::string>& getRequestedExtensions() const { return requestedExtensions; }
+    bool isRayTracingStage() const {
+        return language >= EShLangRayGen && language <= EShLangCallableNV;
+    }
 
     void setTreeRoot(TIntermNode* r) { treeRoot = r; }
     TIntermNode* getTreeRoot() const { return treeRoot; }
@@ -531,6 +534,7 @@
     // Linkage related
     void addSymbolLinkageNodes(TIntermAggregate*& linkage, EShLanguage, TSymbolTable&);
     void addSymbolLinkageNode(TIntermAggregate*& linkage, const TSymbol&);
+    TIntermAggregate* findLinkerObjects() const;
 
     void setUseStorageBuffer() { useStorageBuffer = true; }
     bool usingStorageBuffer() const { return useStorageBuffer; }
@@ -866,6 +870,7 @@
 
     int addUsedLocation(const TQualifier&, const TType&, bool& typeCollision);
     int checkLocationRange(int set, const TIoRange& range, const TType&, bool& typeCollision);
+    int checkLocationRT(int set, int location);
     int addUsedOffsets(int binding, int offset, int numOffsets);
     bool addUsedConstantId(int id);
     static int computeTypeLocationSize(const TType&, EShLanguage);
@@ -941,7 +946,6 @@
     void checkCallGraphCycles(TInfoSink&);
     void checkCallGraphBodies(TInfoSink&, bool keepUncalled);
     void inOutLocationCheck(TInfoSink&);
-    TIntermAggregate* findLinkerObjects() const;
     bool userOutputUsed() const;
     bool isSpecializationOperation(const TIntermOperator&) const;
     bool isNonuniformPropagating(TOperator) const;
@@ -1050,6 +1054,8 @@
     std::unordered_set<int> usedConstantId; // specialization constant ids used
     std::vector<TOffsetRange> usedAtomics;  // sets of bindings used by atomic counters
     std::vector<TIoRange> usedIo[4];        // sets of used locations, one for each of in, out, uniform, and buffers
+    std::vector<TRange> usedIoRT[2];        // sets of used location, one for rayPayload/rayPayloadIN and other
+                                            // for callableData/callableDataIn
     // set of names of statically read/written I/O that might need extra checking
     std::set<TString> ioAccessed;
     // source code of shader, useful as part of debug information
diff --git a/third_party/glslang/src/glslang/MachineIndependent/preprocessor/Pp.cpp b/third_party/glslang/src/glslang/MachineIndependent/preprocessor/Pp.cpp
index a0a626f..aa1e0d7 100644
--- a/third_party/glslang/src/glslang/MachineIndependent/preprocessor/Pp.cpp
+++ b/third_party/glslang/src/glslang/MachineIndependent/preprocessor/Pp.cpp
@@ -455,6 +455,7 @@
                 token = scanToken(ppToken);
             }
         } else {
+            token = tokenPaste(token, *ppToken);
             token = evalToToken(token, shortCircuit, res, err, ppToken);
             return eval(token, precedence, shortCircuit, res, err, ppToken);
         }
diff --git a/third_party/glslang/src/glslang/MachineIndependent/reflection.cpp b/third_party/glslang/src/glslang/MachineIndependent/reflection.cpp
index 0aabf37..7295002 100644
--- a/third_party/glslang/src/glslang/MachineIndependent/reflection.cpp
+++ b/third_party/glslang/src/glslang/MachineIndependent/reflection.cpp
@@ -658,14 +658,17 @@
 
                 blocks.back().numMembers = countAggregateMembers(type);
 
-                EShLanguageMask& stages = blocks.back().stages;
-                stages = static_cast<EShLanguageMask>(stages | 1 << intermediate.getStage());
+                if (updateStageMasks) {
+                    EShLanguageMask& stages = blocks.back().stages;
+                    stages = static_cast<EShLanguageMask>(stages | 1 << intermediate.getStage());
+                }
             }
             else {
                 blockIndex = it->second;
-
-                EShLanguageMask& stages = blocks[blockIndex].stages;
-                stages = static_cast<EShLanguageMask>(stages | 1 << intermediate.getStage());
+                if (updateStageMasks) {
+                    EShLanguageMask& stages = blocks[blockIndex].stages;
+                    stages = static_cast<EShLanguageMask>(stages | 1 << intermediate.getStage());
+                }
             }
         }
 
diff --git a/third_party/glslang/src/gtests/AST.FromFile.cpp b/third_party/glslang/src/gtests/AST.FromFile.cpp
index a8e4da4..dc7fea3 100644
--- a/third_party/glslang/src/gtests/AST.FromFile.cpp
+++ b/third_party/glslang/src/gtests/AST.FromFile.cpp
@@ -278,6 +278,8 @@
         "glsl.es320.subgroupShuffleRelative.comp",
         "glsl.es320.subgroupQuad.comp",
         "glsl.es320.subgroupVote.comp",
+        "terminate.frag",
+        "terminate.vert",
     })),
     FileNameAsCustomTestSuffix
 );
diff --git a/third_party/glslang/src/gtests/CMakeLists.txt b/third_party/glslang/src/gtests/CMakeLists.txt
index 6c48d9c..0617ff8 100644
--- a/third_party/glslang/src/gtests/CMakeLists.txt
+++ b/third_party/glslang/src/gtests/CMakeLists.txt
@@ -83,6 +83,12 @@
                                    ${gmock_SOURCE_DIR}/include
                                    ${gtest_SOURCE_DIR}/include)
 
+        if(ENABLE_OPT)
+            target_include_directories(glslangtests
+                PRIVATE ${spirv-tools_SOURCE_DIR}/include
+            )
+        endif(ENABLE_OPT)
+
         set(LIBRARIES
             glslang OSDependent OGLCompiler glslang
             SPIRV glslang-default-resource-limits)
diff --git a/third_party/glslang/src/gtests/Spv.FromFile.cpp b/third_party/glslang/src/gtests/Spv.FromFile.cpp
index c078156..a393ccc 100644
--- a/third_party/glslang/src/gtests/Spv.FromFile.cpp
+++ b/third_party/glslang/src/gtests/Spv.FromFile.cpp
@@ -240,6 +240,7 @@
         "rayQuery-allOps.comp",
         "rayQuery-allOps.frag",
         "rayQuery-initialization.Error.comp",
+        "rayQuery-global.rgen",
         "spv.set.vert",
         "spv.double.comp",
         "spv.100ops.frag",
@@ -352,6 +353,7 @@
         "spv.int64.frag",
         "spv.intcoopmat.comp",
         "spv.intOps.vert",
+        "spv.layer.tese",
         "spv.layoutNested.vert",
         "spv.length.frag",
         "spv.localAggregates.frag",
@@ -411,6 +413,7 @@
         "spv.texture.vert",
         "spv.textureBuffer.vert",
         "spv.image.frag",
+        "spv.imageAtomic64.frag",
         "spv.types.frag",
         "spv.uint.frag",
         "spv.uniformArray.frag",
@@ -435,8 +438,10 @@
         "spv.specConstant.int16.comp",
         "spv.specConstant.int8.comp",
         "spv.storageBuffer.vert",
+        "spv.terminate.frag",
         "spv.precise.tese",
         "spv.precise.tesc",
+        "spv.viewportindex.tese",
         "spv.volatileAtomic.comp",
         "spv.vulkan100.subgroupArithmetic.comp",
         "spv.vulkan100.subgroupPartitioned.comp",
@@ -553,6 +558,7 @@
         "spv.ext.AnyHitShader.rahit",
         "spv.ext.AnyHitShader_Errors.rahit",
         "spv.ext.ClosestHitShader.rchit",
+        "spv.ext.ClosestHitShader_Subgroup.rchit",
         "spv.ext.ClosestHitShader_Errors.rchit",
         "spv.ext.IntersectShader.rint",
         "spv.ext.IntersectShader_Errors.rint",
@@ -563,9 +569,16 @@
         "spv.ext.RayCallable_Errors.rcall",
         "spv.ext.RayConstants.rgen",
         "spv.ext.RayGenShader.rgen",
+        "spv.ext.RayGenShader_Errors.rgen",
         "spv.ext.RayGenShader11.rgen",
         "spv.ext.RayGenShaderArray.rgen",
+        "spv.ext.RayGenSBTlayout.rgen",
+        "spv.ext.RayGenSBTlayout140.rgen",
+        "spv.ext.RayGenSBTlayout430.rgen",
+        "spv.ext.RayGenSBTlayoutscalar.rgen",
         "spv.ext.World3x4.rahit",
+        "spv.ext.AccelDecl.frag",
+        "spv.ext.RayQueryDecl.frag",
     })),
     FileNameAsCustomTestSuffix
 );
diff --git a/third_party/glslang/src/known_good.json b/third_party/glslang/src/known_good.json
index 1ee683d..65d4376 100644
--- a/third_party/glslang/src/known_good.json
+++ b/third_party/glslang/src/known_good.json
@@ -5,14 +5,14 @@
       "site" : "github",
       "subrepo" : "KhronosGroup/SPIRV-Tools",
       "subdir" : "External/spirv-tools",
-      "commit" : "a1d38174b1f7d2651c718ae661886d606cb50a32"
+      "commit" : "b27b1afd12d05bf238ac7368bb49de73cd620a8e"
     },
     {
       "name" : "spirv-tools/external/spirv-headers",
       "site" : "github",
       "subrepo" : "KhronosGroup/SPIRV-Headers",
       "subdir" : "External/spirv-tools/external/spirv-headers",
-      "commit" : "05836bdba63e7debce9fa9feaed42f20cd43af9d"
+      "commit" : "f027d53ded7e230e008d37c8b47ede7cd308e19d"
     }
   ]
 }
diff --git a/third_party/zlib/BUILD.gn b/third_party/zlib/BUILD.gn
index 34d8c0a..d64cb38 100644
--- a/third_party/zlib/BUILD.gn
+++ b/third_party/zlib/BUILD.gn
@@ -428,12 +428,17 @@
       "contrib/tests/infcover.h",
       "contrib/tests/run_all_unittests.cc",
       "contrib/tests/utils_unittest.cc",
-      "google/compression_utils_portable.cc",
-      "google/compression_utils_portable.h",
+      "google/compression_utils_unittest.cc",
+      "google/zip_reader_unittest.cc",
+      "google/zip_unittest.cc",
     ]
 
+    data = [ "google/test/data/" ]
+
     deps = [
       ":zlib",
+      "google:compression_utils",
+      "google:zip",
       "//base/test:test_support",
       "//testing/gtest",
     ]
diff --git a/third_party/zlib/DIR_METADATA b/third_party/zlib/DIR_METADATA
new file mode 100644
index 0000000..d366dc7
--- /dev/null
+++ b/third_party/zlib/DIR_METADATA
@@ -0,0 +1,3 @@
+monorail: {
+  component: "Internals"
+}
diff --git a/third_party/zlib/google/BUILD.gn b/third_party/zlib/google/BUILD.gn
index a49b8c8..c29e892 100644
--- a/third_party/zlib/google/BUILD.gn
+++ b/third_party/zlib/google/BUILD.gn
@@ -28,10 +28,10 @@
       "compression_utils.h",
     ]
     deps = [
-      ":compression_utils_portable",
       "//base",
       "//third_party/zlib",
     ]
+    public_deps = [ ":compression_utils_portable" ]
   }
 }
 
diff --git a/third_party/zlib/google/zip_reader.cc b/third_party/zlib/google/zip_reader.cc
index 8b4bb4a..96e9ff0 100644
--- a/third_party/zlib/google/zip_reader.cc
+++ b/third_party/zlib/google/zip_reader.cc
@@ -10,10 +10,9 @@
 #include "base/files/file.h"
 #include "base/logging.h"
 #include "base/macros.h"
-#include "base/single_thread_task_runner.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/threading/thread_task_runner_handle.h"
+#include "base/threading/sequenced_task_runner_handle.h"
 #include "build/build_config.h"
 #include "third_party/zlib/google/zip_internal.h"
 
@@ -296,11 +295,11 @@
   // If this is a directory, just create it and return.
   if (current_entry_info()->is_directory()) {
     if (base::CreateDirectory(output_file_path)) {
-      base::ThreadTaskRunnerHandle::Get()->PostTask(
+      base::SequencedTaskRunnerHandle::Get()->PostTask(
           FROM_HERE, std::move(success_callback));
     } else {
       DVLOG(1) << "Unzip failed: unable to create directory.";
-      base::ThreadTaskRunnerHandle::Get()->PostTask(
+      base::SequencedTaskRunnerHandle::Get()->PostTask(
           FROM_HERE, std::move(failure_callback));
     }
     return;
@@ -308,16 +307,16 @@
 
   if (unzOpenCurrentFile(zip_file_) != UNZ_OK) {
     DVLOG(1) << "Unzip failed: unable to open current zip entry.";
-    base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                                  std::move(failure_callback));
+    base::SequencedTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE, std::move(failure_callback));
     return;
   }
 
   base::FilePath output_dir_path = output_file_path.DirName();
   if (!base::CreateDirectory(output_dir_path)) {
     DVLOG(1) << "Unzip failed: unable to create containing directory.";
-    base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                                  std::move(failure_callback));
+    base::SequencedTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE, std::move(failure_callback));
     return;
   }
 
@@ -327,12 +326,12 @@
   if (!output_file.IsValid()) {
     DVLOG(1) << "Unzip failed: unable to create platform file at "
              << output_file_path.value();
-    base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                                  std::move(failure_callback));
+    base::SequencedTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE, std::move(failure_callback));
     return;
   }
 
-  base::ThreadTaskRunnerHandle::Get()->PostTask(
+  base::SequencedTaskRunnerHandle::Get()->PostTask(
       FROM_HERE,
       base::BindOnce(&ZipReader::ExtractChunk, weak_ptr_factory_.GetWeakPtr(),
                      Passed(std::move(output_file)),
@@ -434,7 +433,7 @@
 
     progress_callback.Run(current_progress);
 
-    base::ThreadTaskRunnerHandle::Get()->PostTask(
+    base::SequencedTaskRunnerHandle::Get()->PostTask(
         FROM_HERE,
         base::BindOnce(&ZipReader::ExtractChunk, weak_ptr_factory_.GetWeakPtr(),
                        Passed(std::move(output_file)),
diff --git a/util/BUILD.gn b/util/BUILD.gn
index a95218e..e1bc0ad 100644
--- a/util/BUILD.gn
+++ b/util/BUILD.gn
@@ -184,11 +184,11 @@
       ]
     }
 
-    if (is_mac) {
-      frameworks = [
-        "AppKit.framework",
-        "QuartzCore.framework",
-      ]
+    if (is_mac || is_ios) {
+      frameworks = [ "QuartzCore.framework" ]
+      if (is_mac) {
+        frameworks += [ "AppKit.framework" ]
+      }
     }
 
     if (is_android) {
@@ -221,7 +221,7 @@
 
       public_deps += [ ":angle_util_loader" ]
 
-      if (is_mac && !is_component_build) {
+      if ((is_ios || is_mac) && !is_component_build) {
         ldflags = [
           "-install_name",
           "@rpath/libangle_util.dylib",
diff --git a/util/EGLWindow.cpp b/util/EGLWindow.cpp
index 2c198ce..e112aad 100644
--- a/util/EGLWindow.cpp
+++ b/util/EGLWindow.cpp
@@ -243,30 +243,29 @@
         enabledFeatureOverrides.push_back("force_buffer_gpu_storage_mtl");
     }
 
+    const bool hasFeatureControlANGLE =
+        strstr(extensionString, "EGL_ANGLE_feature_control") != nullptr;
+
+    if (!hasFeatureControlANGLE &&
+        (!enabledFeatureOverrides.empty() || !disabledFeatureOverrides.empty()))
+    {
+        fprintf(stderr, "Missing EGL_ANGLE_feature_control.\n");
+        destroyGL();
+        return false;
+    }
+
     if (!disabledFeatureOverrides.empty())
     {
-        if (strstr(extensionString, "EGL_ANGLE_feature_control") == nullptr)
-        {
-            fprintf(stderr, "Missing EGL_ANGLE_feature_control.\n");
-            destroyGL();
-            return false;
-        }
-
         disabledFeatureOverrides.push_back(nullptr);
 
         displayAttributes.push_back(EGL_FEATURE_OVERRIDES_DISABLED_ANGLE);
         displayAttributes.push_back(reinterpret_cast<EGLAttrib>(disabledFeatureOverrides.data()));
     }
 
-    if (!enabledFeatureOverrides.empty())
+    if (hasFeatureControlANGLE)
     {
-        if (strstr(extensionString, "EGL_ANGLE_feature_control") == nullptr)
-        {
-            fprintf(stderr, "Missing EGL_ANGLE_feature_control.\n");
-            destroyGL();
-            return false;
-        }
-
+        // Always enable exposeNonConformantExtensionsAndVersions in ANGLE tests.
+        enabledFeatureOverrides.push_back("exposeNonConformantExtensionsAndVersions");
         enabledFeatureOverrides.push_back(nullptr);
 
         displayAttributes.push_back(EGL_FEATURE_OVERRIDES_ENABLED_ANGLE);
diff --git a/util/gles_loader_autogen.cpp b/util/gles_loader_autogen.cpp
index 445a374..668ae64 100644
--- a/util/gles_loader_autogen.cpp
+++ b/util/gles_loader_autogen.cpp
@@ -537,6 +537,8 @@
     l_glGetProgramResourceLocationIndexEXT;
 ANGLE_UTIL_EXPORT PFNGLBUFFERSTORAGEEXTPROC l_glBufferStorageEXT;
 ANGLE_UTIL_EXPORT PFNGLCOPYIMAGESUBDATAEXTPROC l_glCopyImageSubDataEXT;
+ANGLE_UTIL_EXPORT PFNGLGETOBJECTLABELEXTPROC l_glGetObjectLabelEXT;
+ANGLE_UTIL_EXPORT PFNGLLABELOBJECTEXTPROC l_glLabelObjectEXT;
 ANGLE_UTIL_EXPORT PFNGLINSERTEVENTMARKEREXTPROC l_glInsertEventMarkerEXT;
 ANGLE_UTIL_EXPORT PFNGLPOPGROUPMARKEREXTPROC l_glPopGroupMarkerEXT;
 ANGLE_UTIL_EXPORT PFNGLPUSHGROUPMARKEREXTPROC l_glPushGroupMarkerEXT;
@@ -1398,6 +1400,8 @@
     l_glGetProgramResourceLocationIndexEXTContextANGLE;
 ANGLE_UTIL_EXPORT PFNGLBUFFERSTORAGEEXTCONTEXTANGLEPROC l_glBufferStorageEXTContextANGLE;
 ANGLE_UTIL_EXPORT PFNGLCOPYIMAGESUBDATAEXTCONTEXTANGLEPROC l_glCopyImageSubDataEXTContextANGLE;
+ANGLE_UTIL_EXPORT PFNGLGETOBJECTLABELEXTCONTEXTANGLEPROC l_glGetObjectLabelEXTContextANGLE;
+ANGLE_UTIL_EXPORT PFNGLLABELOBJECTEXTCONTEXTANGLEPROC l_glLabelObjectEXTContextANGLE;
 ANGLE_UTIL_EXPORT PFNGLINSERTEVENTMARKEREXTCONTEXTANGLEPROC l_glInsertEventMarkerEXTContextANGLE;
 ANGLE_UTIL_EXPORT PFNGLPOPGROUPMARKEREXTCONTEXTANGLEPROC l_glPopGroupMarkerEXTContextANGLE;
 ANGLE_UTIL_EXPORT PFNGLPUSHGROUPMARKEREXTCONTEXTANGLEPROC l_glPushGroupMarkerEXTContextANGLE;
@@ -2499,6 +2503,9 @@
         reinterpret_cast<PFNGLBUFFERSTORAGEEXTPROC>(loadProc("glBufferStorageEXT"));
     l_glCopyImageSubDataEXT =
         reinterpret_cast<PFNGLCOPYIMAGESUBDATAEXTPROC>(loadProc("glCopyImageSubDataEXT"));
+    l_glGetObjectLabelEXT =
+        reinterpret_cast<PFNGLGETOBJECTLABELEXTPROC>(loadProc("glGetObjectLabelEXT"));
+    l_glLabelObjectEXT = reinterpret_cast<PFNGLLABELOBJECTEXTPROC>(loadProc("glLabelObjectEXT"));
     l_glInsertEventMarkerEXT =
         reinterpret_cast<PFNGLINSERTEVENTMARKEREXTPROC>(loadProc("glInsertEventMarkerEXT"));
     l_glPopGroupMarkerEXT =
@@ -4089,6 +4096,10 @@
     l_glCopyImageSubDataEXTContextANGLE =
         reinterpret_cast<PFNGLCOPYIMAGESUBDATAEXTCONTEXTANGLEPROC>(
             loadProc("glCopyImageSubDataEXTContextANGLE"));
+    l_glGetObjectLabelEXTContextANGLE = reinterpret_cast<PFNGLGETOBJECTLABELEXTCONTEXTANGLEPROC>(
+        loadProc("glGetObjectLabelEXTContextANGLE"));
+    l_glLabelObjectEXTContextANGLE = reinterpret_cast<PFNGLLABELOBJECTEXTCONTEXTANGLEPROC>(
+        loadProc("glLabelObjectEXTContextANGLE"));
     l_glInsertEventMarkerEXTContextANGLE =
         reinterpret_cast<PFNGLINSERTEVENTMARKEREXTCONTEXTANGLEPROC>(
             loadProc("glInsertEventMarkerEXTContextANGLE"));
diff --git a/util/gles_loader_autogen.h b/util/gles_loader_autogen.h
index 2f5160d..170756a 100644
--- a/util/gles_loader_autogen.h
+++ b/util/gles_loader_autogen.h
@@ -531,6 +531,8 @@
 #define glGetProgramResourceLocationIndexEXT l_glGetProgramResourceLocationIndexEXT
 #define glBufferStorageEXT l_glBufferStorageEXT
 #define glCopyImageSubDataEXT l_glCopyImageSubDataEXT
+#define glGetObjectLabelEXT l_glGetObjectLabelEXT
+#define glLabelObjectEXT l_glLabelObjectEXT
 #define glInsertEventMarkerEXT l_glInsertEventMarkerEXT
 #define glPopGroupMarkerEXT l_glPopGroupMarkerEXT
 #define glPushGroupMarkerEXT l_glPushGroupMarkerEXT
@@ -1285,6 +1287,8 @@
     l_glGetProgramResourceLocationIndexEXTContextANGLE
 #define glBufferStorageEXTContextANGLE l_glBufferStorageEXTContextANGLE
 #define glCopyImageSubDataEXTContextANGLE l_glCopyImageSubDataEXTContextANGLE
+#define glGetObjectLabelEXTContextANGLE l_glGetObjectLabelEXTContextANGLE
+#define glLabelObjectEXTContextANGLE l_glLabelObjectEXTContextANGLE
 #define glInsertEventMarkerEXTContextANGLE l_glInsertEventMarkerEXTContextANGLE
 #define glPopGroupMarkerEXTContextANGLE l_glPopGroupMarkerEXTContextANGLE
 #define glPushGroupMarkerEXTContextANGLE l_glPushGroupMarkerEXTContextANGLE
@@ -2046,6 +2050,8 @@
     l_glGetProgramResourceLocationIndexEXT;
 ANGLE_UTIL_EXPORT extern PFNGLBUFFERSTORAGEEXTPROC l_glBufferStorageEXT;
 ANGLE_UTIL_EXPORT extern PFNGLCOPYIMAGESUBDATAEXTPROC l_glCopyImageSubDataEXT;
+ANGLE_UTIL_EXPORT extern PFNGLGETOBJECTLABELEXTPROC l_glGetObjectLabelEXT;
+ANGLE_UTIL_EXPORT extern PFNGLLABELOBJECTEXTPROC l_glLabelObjectEXT;
 ANGLE_UTIL_EXPORT extern PFNGLINSERTEVENTMARKEREXTPROC l_glInsertEventMarkerEXT;
 ANGLE_UTIL_EXPORT extern PFNGLPOPGROUPMARKEREXTPROC l_glPopGroupMarkerEXT;
 ANGLE_UTIL_EXPORT extern PFNGLPUSHGROUPMARKEREXTPROC l_glPushGroupMarkerEXT;
@@ -2967,6 +2973,8 @@
 ANGLE_UTIL_EXPORT extern PFNGLBUFFERSTORAGEEXTCONTEXTANGLEPROC l_glBufferStorageEXTContextANGLE;
 ANGLE_UTIL_EXPORT extern PFNGLCOPYIMAGESUBDATAEXTCONTEXTANGLEPROC
     l_glCopyImageSubDataEXTContextANGLE;
+ANGLE_UTIL_EXPORT extern PFNGLGETOBJECTLABELEXTCONTEXTANGLEPROC l_glGetObjectLabelEXTContextANGLE;
+ANGLE_UTIL_EXPORT extern PFNGLLABELOBJECTEXTCONTEXTANGLEPROC l_glLabelObjectEXTContextANGLE;
 ANGLE_UTIL_EXPORT extern PFNGLINSERTEVENTMARKEREXTCONTEXTANGLEPROC
     l_glInsertEventMarkerEXTContextANGLE;
 ANGLE_UTIL_EXPORT extern PFNGLPOPGROUPMARKEREXTCONTEXTANGLEPROC l_glPopGroupMarkerEXTContextANGLE;
diff --git a/util/shader_utils.cpp b/util/shader_utils.cpp
index 179f8fd..006ef54 100644
--- a/util/shader_utils.cpp
+++ b/util/shader_utils.cpp
@@ -705,7 +705,7 @@
 
 void main()
 {
-    my_FragColor = vec4(v_position.x, v_position.y, 0.0, 1.0);
+    my_FragColor = vec4(v_position.xy * 0.5 + vec2(0.5), 0.0, 1.0);
 })";
 }